Ejemplo n.º 1
0
static BOOL hid_device_read(BYTE deviceAddress, void *data)
{
    // call usb host layer
    USBTasks();

    // Was device detached?
    // Or, was report descriptor parsed with error.?
    if(!USBHostHIDDeviceDetect(deviceAddress)){
        App_State[deviceAddress] = DEVICE_NOT_CONNECTED;
    }

    switch(App_State[deviceAddress]){
        case DEVICE_NOT_CONNECTED:
            USBTasks();
            /* True if report descriptor is parsed with no error */
            if(USBHostHIDDeviceDetect(deviceAddress)){
                App_State[deviceAddress] = DEVICE_CONNECTED;
            }
            break;

        case DEVICE_CONNECTED:
            App_State[deviceAddress] = READY_TO_TX_RX_REPORT;
            break;

        case READY_TO_TX_RX_REPORT:
            if(USBHostHIDDeviceDetect(deviceAddress)){
                App_State[deviceAddress] = GET_INPUT_REPORT;
            }else{
                App_State[deviceAddress] = DEVICE_NOT_CONNECTED;
            }
            break;

        case GET_INPUT_REPORT:
            if(!USBHostHIDRead(deviceAddress, Appl_raw_report_buffer[deviceAddress].Report_ID,0,
                    Appl_raw_report_buffer[deviceAddress].ReportSize, Appl_raw_report_buffer[deviceAddress].ReportData)){
                App_State[deviceAddress] = INPUT_REPORT_PENDING;
            }
            break;

        case INPUT_REPORT_PENDING:
            if(USBHostHIDTransferIsComplete(deviceAddress, &ErrorDriver[deviceAddress],&NumOfBytesRcvd[deviceAddress])){
                if(ErrorDriver[deviceAddress] ||(NumOfBytesRcvd[deviceAddress] != Appl_raw_report_buffer[deviceAddress].ReportSize )){
                    ErrorCounter[deviceAddress]++ ;
                    if(MAX_ERROR_COUNTER <= ErrorDriver[deviceAddress]){
                        App_State[deviceAddress] = ERROR_REPORTED;
                    }else{
                        App_State[deviceAddress] = READY_TO_TX_RX_REPORT;
                    }
                }else{
                    ErrorCounter[deviceAddress] = 0;
                    ReportBufferUpdated[deviceAddress] = TRUE;
                    App_State[deviceAddress] = READY_TO_TX_RX_REPORT;

                    App_ProcessInputReport(deviceAddress, data);
                    App_PrepareOutputReport(deviceAddress);
                    return TRUE;
                }
            }
            break;

        case SEND_OUTPUT_REPORT: /* Will be done while implementing Keyboard */
            if(!USBHostHIDWrite(deviceAddress, Appl_LED_Indicator[deviceAddress].reportID, Appl_LED_Indicator[deviceAddress].interfaceNum, Appl_LED_Indicator[deviceAddress].reportLength,
                    (BYTE*)&Appl_led_report_buffer[deviceAddress])){
                App_State[deviceAddress] = OUTPUT_REPORT_PENDING;
            }
            break;

        case OUTPUT_REPORT_PENDING:
            if(USBHostHIDTransferIsComplete(deviceAddress, &ErrorDriver[deviceAddress],&NumOfBytesRcvd[deviceAddress])){
                if(ErrorDriver[deviceAddress]){
                    ErrorCounter[deviceAddress]++ ;
                    if(MAX_ERROR_COUNTER <= ErrorDriver[deviceAddress]){
                        App_State[deviceAddress] = ERROR_REPORTED;
                    }
                }else{
                    ErrorCounter[deviceAddress] = 0;
                    App_State[deviceAddress] = READY_TO_TX_RX_REPORT;
                }
            }
            break;

        case ERROR_REPORTED:	// forever error loop
            break;

        default:
            break;
    }

    // ReportData isn't ready!
    return FALSE;
}
Ejemplo n.º 2
0
//******************************************************************************
//******************************************************************************
// Main
//******************************************************************************
//******************************************************************************
int main (void)
{
	BYTE i;
	DWORD temp;

	int  value;

	value = SYSTEMConfigWaitStatesAndPB( GetSystemClock() );

	mJTAGPortEnable(DEBUG_JTAGPORT_OFF);

	// Enable the cache for the best performance
	CheKseg0CacheOn();

	value = OSCCON;
	while (!(value & 0x00000020))
	{
		value = OSCCON;    // Wait for PLL lock to stabilize
	}

	InitKeyboardDriver();

	INTEnableSystemMultiVectoredInt();

	// Init status LED
	mPORTCSetBits(BIT_0);
	mPORTCSetPinsDigitalOut(BIT_0);

	//DBINIT();

	// Initialize USB layers
	USBInitialize(0);

	while (1)
	{
		USBTasks();
		App_Detect_Device();
		switch (App_State_Keyboard)
		{
			case DEVICE_NOT_CONNECTED:
				mPORTCSetBits(BIT_0);
				USBTasks();
				if (DisplayDeatachOnce == FALSE)
				{
					DBPRINTF("Device Detached\n");
					DisplayDeatachOnce = TRUE;
				}
				if (USBHostHID_ApiDeviceDetect()) /* True if report descriptor is parsed with no error */
				{
					DBPRINTF("Device Attached\n");
					App_State_Keyboard = DEVICE_CONNECTED;
					DisplayConnectOnce = FALSE;
				}
				break;
			case DEVICE_CONNECTED:
				mPORTCClearBits(BIT_0);
				App_State_Keyboard = READY_TO_TX_RX_REPORT;
				if (DisplayConnectOnce == FALSE)
				{
					DisplayConnectOnce = TRUE;
					DisplayDeatachOnce = FALSE;
				}
				InitializeTimer(); // start 10ms timer to schedule input reports

				break;
			case READY_TO_TX_RX_REPORT:
				if (!USBHostHID_ApiDeviceDetect())
				{
					App_State_Keyboard = DEVICE_NOT_CONNECTED;
					//                                DisplayOnce = FALSE;
				}
				break;
			case GET_INPUT_REPORT:
				if (USBHostHID_ApiGetReport(Appl_raw_report_buffer.Report_ID, Appl_ModifierKeysDetails.interfaceNum,
																		Appl_raw_report_buffer.ReportSize, Appl_raw_report_buffer.ReportData))
				{
					/* Host may be busy/error -- keep trying */
				}
				else
				{
					App_State_Keyboard = INPUT_REPORT_PENDING;
				}
				USBTasks();
				break;
			case INPUT_REPORT_PENDING:
				if (USBHostHID_ApiTransferIsComplete(&ErrorDriver, &NumOfBytesRcvd))
				{
					if (ErrorDriver || (NumOfBytesRcvd !=     Appl_raw_report_buffer.ReportSize ))
					{
						ErrorCounter++ ;
						if (MAX_ERROR_COUNTER <= ErrorDriver)
							App_State_Keyboard = ERROR_REPORTED;
						else
							App_State_Keyboard = READY_TO_TX_RX_REPORT;
					}
					else
					{
						ErrorCounter = 0;
						ReportBufferUpdated = TRUE;
						App_State_Keyboard = READY_TO_TX_RX_REPORT;

						if (DisplayConnectOnce == TRUE)
						{
							for (i = 0; i < Appl_raw_report_buffer.ReportSize; i++)
							{
								if (Appl_raw_report_buffer.ReportData[i] != 0)
								{
									//LCDClear();
									//LCDL1Home();
									DisplayConnectOnce = FALSE;
								}
							}
						}

						App_ProcessInputReport();
						App_PrepareOutputReport();
					}
				}
				break;

			case SEND_OUTPUT_REPORT: /* Will be done while implementing Keyboard */
				if (USBHostHID_ApiSendReport(Appl_LED_Indicator.reportID, Appl_LED_Indicator.interfaceNum, Appl_LED_Indicator.reportLength,
																		(BYTE*) & Appl_led_report_buffer))
				{
					/* Host may be busy/error -- keep trying */
				}
				else
				{
					App_State_Keyboard = OUTPUT_REPORT_PENDING;
				}
				USBTasks();

				break;
			case OUTPUT_REPORT_PENDING:
				if (USBHostHID_ApiTransferIsComplete(&ErrorDriver, &NumOfBytesRcvd))
				{
					if (ErrorDriver)
					{
						ErrorCounter++ ;
						if (MAX_ERROR_COUNTER <= ErrorDriver)
							App_State_Keyboard = ERROR_REPORTED;

						//                                App_State_Keyboard = READY_TO_TX_RX_REPORT;
					}
					else
					{
						ErrorCounter = 0;
						App_State_Keyboard = READY_TO_TX_RX_REPORT;
					}
				}
				break;

			case ERROR_REPORTED:
				break;
			default:
				break;
		}
	}
}
Ejemplo n.º 3
0
void hidTask (void)
{
    BYTE i;
    int deviceValue = 0;
    USBTasks();
    App_Detect_Device();
    switch (App_State_Mouse_Keyboard) {
        case DEVICE_NOT_CONNECTED:
            connectedDevice = DEVICE_NOT_CONNECTED_OR_NOT_SUPPORTED;
            USBTasks();
            if (DisplayDeatachOnce == FALSE) {
                DisplayDeatachOnce = TRUE;
            }
            if (USBHostHID_ApiDeviceDetect()) {
                DisplayConnectOnce = FALSE;
                deviceValue = USBHID_ReportDecriptor_Difference();
                if (deviceValue == USB_HID_MOUSE) {
                    App_State_Mouse_Keyboard = MOUSE_DEVICE_CONNECTED;
                } else if (deviceValue == USB_HID_KEYBOARD) {
                    App_State_Mouse_Keyboard = KEYBOARD_DEVICE_CONNECTED;
                }

            }

            break;
        case MOUSE_DEVICE_CONNECTED:
            UART2PrintString("\r\n");
            UART2PrintString(UHP_MOUSE_CONNECTED);
            UART2PrintString("\r\n");
            connectedDevice = DEVICE_MOUSE;
            App_State_Mouse_Keyboard = MOUSE_READY_TO_TX_RX_REPORT;
            if (DisplayConnectOnce == FALSE) {
                DisplayConnectOnce = TRUE;
                DisplayDeatachOnce = FALSE;
            }

            break;

        case KEYBOARD_DEVICE_CONNECTED:
            UART2PrintString("\r\n");
            UART2PrintString(UHP_KEYBOARD_CONNECTED);
            UART2PrintString("\r\n");
            connectedDevice = DEVICE_KEYBOARD;
            App_State_Mouse_Keyboard = KEYBOARD_READY_TO_TX_RX_REPORT;
            if (DisplayConnectOnce == FALSE) {
                DisplayConnectOnce = TRUE;
                DisplayDeatachOnce = FALSE;
            }

            InitializeTimer();

            break;
        case MOUSE_READY_TO_TX_RX_REPORT:
            if (!USBHostHID_ApiDeviceDetect()) {
                App_State_Mouse_Keyboard = DEVICE_NOT_CONNECTED;
            } else {
                App_State_Mouse_Keyboard = MOUSE_GET_INPUT_REPORT;
            }

            break;
        case KEYBOARD_READY_TO_TX_RX_REPORT:
            if (!USBHostHID_ApiDeviceDetect()) {
                App_State_Mouse_Keyboard = DEVICE_NOT_CONNECTED;
            }


            break;
        case MOUSE_GET_INPUT_REPORT:
            if (USBHostHID_ApiGetReport(Appl_raw_report_buffer.Report_ID, 0,
                    Appl_raw_report_buffer.ReportSize, Appl_raw_report_buffer.ReportData)) {
                // Host may be busy/error -- keep trying
            } else {
                App_State_Mouse_Keyboard = MOUSE_INPUT_REPORT_PENDING;
            }
            USBTasks();
            break;
        case KEYBOARD_GET_INPUT_REPORT:
            if (USBHostHID_ApiGetReport(Appl_raw_report_buffer.Report_ID, Appl_ModifierKeysDetails.interfaceNum,
                    Appl_raw_report_buffer.ReportSize, Appl_raw_report_buffer.ReportData)) {
                /* Host may be busy/error -- keep trying */
            } else {
                App_State_Mouse_Keyboard = KEYBOARD_INPUT_REPORT_PENDING;
            }
            USBTasks();
            break;
        case MOUSE_INPUT_REPORT_PENDING:
            if (USBHostHID_ApiTransferIsComplete(&ErrorDriver, &NumOfBytesRcvd)) {
                if (ErrorDriver || (NumOfBytesRcvd != Appl_raw_report_buffer.ReportSize)) {
                    ErrorCounter++;
                    if (MAX_ERROR_COUNTER <= ErrorDriver)
                        App_State_Mouse_Keyboard = ERROR_REPORTED;
                    else
                        App_State_Mouse_Keyboard = MOUSE_READY_TO_TX_RX_REPORT;
                } else {
                    ErrorCounter = 0;
                    ReportBufferUpdated = TRUE;
                    App_State_Mouse_Keyboard = MOUSE_READY_TO_TX_RX_REPORT;

                    if (DisplayConnectOnce == TRUE) {
                        for (i = 0; i < Appl_raw_report_buffer.ReportSize; i++) {
                            if (Appl_raw_report_buffer.ReportData[i] != 0) {
                                DisplayConnectOnce = FALSE;
                            }
                        }
                    }

                    App_ProcessInputReport_Mouse();
                }
            }

            break;
        case KEYBOARD_INPUT_REPORT_PENDING:
            if (USBHostHID_ApiTransferIsComplete(&ErrorDriver, &NumOfBytesRcvd)) {
                if (ErrorDriver || (NumOfBytesRcvd != Appl_raw_report_buffer.ReportSize)) {
                    ErrorCounter++;
                    if (MAX_ERROR_COUNTER <= ErrorDriver) {
                        App_State_Mouse_Keyboard = ERROR_REPORTED;
                    } else {
                        App_State_Mouse_Keyboard = KEYBOARD_READY_TO_TX_RX_REPORT;
                    }
                } else {
                    ErrorCounter = 0;
                    ReportBufferUpdated = TRUE;
                    App_State_Mouse_Keyboard = KEYBOARD_READY_TO_TX_RX_REPORT;

                    if (DisplayConnectOnce == TRUE) {
                        for (i = 0; i < Appl_raw_report_buffer.ReportSize; i++) {
                            if (Appl_raw_report_buffer.ReportData[i] != 0) {
                                DisplayConnectOnce = FALSE;
                            }
                        }
                    }

                    App_ProcessInputReport_Keyboard();
                    App_PrepareOutputReport();
                }
            }
            break;
        case SEND_OUTPUT_REPORT: /* Will be done while implementing Keyboard */
            if (USBHostHID_ApiSendReport(Appl_LED_Indicator.reportID, Appl_LED_Indicator.interfaceNum, Appl_LED_Indicator.reportLength,
                    (BYTE*) & Appl_led_report_buffer)) {
                /* Host may be busy/error -- keep trying */
            } else {
                App_State_Mouse_Keyboard = OUTPUT_REPORT_PENDING;
            }
            USBTasks();

            break;
        case OUTPUT_REPORT_PENDING:
            if (USBHostHID_ApiTransferIsComplete(&ErrorDriver, &NumOfBytesRcvd)) {
                if (ErrorDriver) {
                    ErrorCounter++;
                    if (MAX_ERROR_COUNTER <= ErrorDriver)
                        App_State_Mouse_Keyboard = ERROR_REPORTED;
                } else {
                    ErrorCounter = 0;
                    App_State_Mouse_Keyboard = KEYBOARD_READY_TO_TX_RX_REPORT;
                }
            }
            break;
        case ERROR_REPORTED:
            break;
        default:
            break;

    }
}
Ejemplo n.º 4
0
/*********************************************************************
 * Function: void APP_HostHIDPICkitTasks(void);
 *
 * Overview: Keeps the demo running.
 *
 * PreCondition: The demo should have been initialized via
 *   the APP_HostHIDPICkitInitialize()
 *
 * Input: None
 *
 * Output: None
 *
 ********************************************************************/
void APP_HostHIDPICkitTasks() {
    uint8_t error;
    uint8_t count;

    
    
    if (!USBHostHID_ApiDeviceDetect()) {
        if (pickit.state != WAITING_FOR_DEVICE) {
            pickit.state = DEVICE_NOT_CONNECTED;
            
#ifdef DEBUG_MODE
            UART2PrintString("APP: PICkit Disconnected!\n");
#endif
            pickit.inUse = false;

            if (pickit.buffer != NULL) {
                free(pickit.buffer);
                pickit.buffer = NULL;
            }
        }
    }
       
    switch (pickit.state) {
        case DEVICE_NOT_CONNECTED:
            //PRINT_ClearScreen();
#ifdef DEBUG_MODE
            UART2PrintString("APP: Attach PICkit\n");
#endif            
            pickit.state = WAITING_FOR_DEVICE;
            IEC1bits.U2RXIE= 0;  //?timijk disable RXIE
            LED_Off(LED_USB_HOST_HID_PICKIT_DEVICE_READY);
            break;

        case WAITING_FOR_DEVICE:
            if (USBHostHID_ApiDeviceDetect()) /* True if report descriptor is parsed with no error */ {
                
                SYSTEM_Initialize(SYSTEM_STATE_USB_HOST_HID_PICKIT);
                
                LED_On(LED_USB_HOST_HID_PICKIT_DEVICE_READY);
                      
                pickit.state = DEVICE_CONNECTED;
                                                    
            }
            break;

        case DEVICE_CONNECTED:
            if( isCmdQueEmpty()) break;
            
            if(getCmdQueSize()==1)
            {   //if the size of commands is 1, it means read from USB device
                pickit.state = GET_INPUT_REPORT;
                
                incCmdBufferRdIdx();
            }
            else
            {
                pickit.state = SEND_OUTPUT_REPORT;                
            }
            break;

        case GET_INPUT_REPORT:
                       
            if (USBHostHID_ApiGetReport(pickit.details.reportID,
                    pickit.details.interfaceNum,
                    pickit.size,
                    (uint8_t *)rspBuffer //pickit.buffer
                    )
                    ) {
                /* Host may be busy/error -- keep trying */
            } else {
                pickit.state = INPUT_REPORT_PENDING;
            }
            break;

        case INPUT_REPORT_PENDING:
            if (USBHostHID_ApiTransferIsComplete(&error, &count)) {
                if (error || (count == 0)) {
                   pickit.state = GET_INPUT_REPORT; // retry           
                } else {
                    
                    pickit.state = DEVICE_CONNECTED;

                    App_ProcessInputReport();
                }
            }
            break;

        case SEND_OUTPUT_REPORT:      
            //TMR4=0;   //?timijk performance test::start timer
            App_PrepareOutputReport();
            if (USBHostHID_ApiSendReport(pickit.details.reportID,
                    pickit.details.interfaceNum,
                    pickit.size,
                    pickit.buffer )) {
                /* Host may be busy/error -- keep trying */
            } else {
                
                pickit.state = OUTPUT_REPORT_PENDING;
                //retry_count=0;
            }
            break;

        case OUTPUT_REPORT_PENDING:
            //timijk 2016.01.13 Issue
            if (USBHostHID_ApiTransferIsComplete(&error, &count)) {
                //signal the transaction is complete 
                U2TXREG = TMR4>>8;
                pickit.state = DEVICE_CONNECTED;
                //LATBbits.LATB4=0;
            }
            break;

        case ERROR_REPORTED:
            break;

        default:
            break;

    }