bool USER_USB_CALLBACK_EVENT_HANDLER(USB_EVENT event, void *pdata, uint16_t size) { switch( (int) event ) { case EVENT_TRANSFER: break; case EVENT_SOF: /* We are using the SOF as a timer to time the LED indicator. Call * the LED update function here. */ APP_LEDUpdateUSBStatus(); APP_DeviceHIDDigitizerSOFHandler(); break; case EVENT_SUSPEND: /* Update the LED status for the suspend event. */ APP_LEDUpdateUSBStatus(); break; case EVENT_RESUME: /* Update the LED status for the resume event. */ APP_LEDUpdateUSBStatus(); break; case EVENT_CONFIGURED: /* When the device is configured, we can (re)initialize the * demo code. */ APP_DeviceHIDDigitizerInitialize(); break; case EVENT_SET_DESCRIPTOR: break; case EVENT_EP0_REQUEST: /* We have received a non-standard USB request. The HID driver * needs to check to see if the request was for it. */ USBCheckHIDRequest(); break; case EVENT_BUS_ERROR: break; case EVENT_TRANSFER_TERMINATED: break; default: break; } return true; }
int main(void) { SYSTEM_Initialize(SYSTEM_STATE_USB_START); LED_Initialize(); APP_KeyboardConfigure(); #ifdef WITH_HOS HosCheckDFU(BOOT_FLAGS_VALUE & BOOT_WITH_APP); if (!isUSBMode() || !isBusPowered()) { HosMainLoop(); } for (uint16_t i = 0; i < HOS_STARTUP_DELAY; ++i) { if (HosSleep(HOS_TYPE_DEFAULT)) { break; } __delay_ms(4); } #endif USBDeviceInit(); USBDeviceAttach(); for (;;) { #ifdef WITH_HOS if (!isBusPowered() || !isUSBMode()) { Reset(); Nop(); Nop(); // NOT REACHED HERE } #endif SYSTEM_Tasks(); #if defined(USB_POLLING) /* Check bus status and service USB interrupts. Interrupt or polling * method. If using polling, must call this function periodically. * This function will take care of processing and responding to SETUP * transactions (such as during the enumeration process when you first * plug in). USB hosts require that USB devices should accept and * process SETUP packets in a timely fashion. Therefore, when using * polling, this function should be called regularly (such as once every * 1.8ms or faster** [see inline code comments in usb_device.c for * explanation when "or faster" applies]) In most cases, the * USBDeviceTasks() function does not take very long to execute * (ex: <100 instruction cycles) before it returns. */ USBDeviceTasks(); #endif APP_LEDUpdateUSBStatus(); /* If the USB device isn't configured yet, we can't really do anything * else since we don't have a host to talk to. So jump back to the * top of the while loop. */ if (USBGetDeviceState() < CONFIGURED_STATE) { /* Jump back to the top of the while loop. */ continue; } /* If we are currently suspended, then we need to see if we need to * issue a remote wakeup. In either case, we shouldn't process any * keyboard commands since we aren't currently communicating to the host * thus just continue back to the start of the while loop. */ if (USBIsDeviceSuspended()) { //Check if we should assert a remote wakeup request to the USB host, //when the user presses the pushbutton. if (BUTTON_IsPressed()) { USBCBSendResume(); //Does nothing unless we are in USB suspend with remote wakeup armed. } /* Jump back to the top of the while loop. */ continue; } if (USBIsBusSuspended()) { /* Jump back to the top of the while loop. */ continue; } /* Run the keyboard tasks. */ APP_KeyboardTasks(); }//end while }//end main
/******************************************************************* * Function: bool USER_USB_CALLBACK_EVENT_HANDLER( * USB_EVENT event, void *pdata, uint16_t size) * * PreCondition: None * * Input: USB_EVENT event - the type of event * void *pdata - pointer to the event data * uint16_t size - size of the event data * * Output: None * * Side Effects: None * * Overview: This function is called from the USB stack to * notify a user application that a USB event * occured. This callback is in interrupt context * when the USB_INTERRUPT option is selected. * * Note: None *******************************************************************/ bool USER_USB_CALLBACK_EVENT_HANDLER(USB_EVENT event, void *pdata, uint16_t size) { switch( (int) event ) { case EVENT_TRANSFER: break; case EVENT_SOF: /* We are using the SOF as a timer to time the LED indicator. Call * the LED update function here. */ APP_LEDUpdateUSBStatus(); break; case EVENT_SUSPEND: /* Update the LED status for the suspend event. */ APP_LEDUpdateUSBStatus(); //Call the hardware platform specific handler for suspend events for //possible further action (like optionally going reconfiguring the application //for lower power states and going to sleep during the suspend event). This //would normally be done in USB compliant bus powered applications, although //no further processing is needed for purely self powered applications that //don't consume power from the host. SYSTEM_Initialize(SYSTEM_STATE_USB_SUSPEND); break; case EVENT_RESUME: /* Update the LED status for the resume event. */ APP_LEDUpdateUSBStatus(); //Call the hardware platform specific resume from suspend handler (ex: to //restore I/O pins to higher power states if they were changed during the //preceding SYSTEM_Initialize(SYSTEM_STATE_USB_SUSPEND) call at the start //of the suspend condition. SYSTEM_Initialize(SYSTEM_STATE_USB_RESUME); break; case EVENT_CONFIGURED: /* When the device is configured, we can (re)initialize the * demo code. */ APP_DeviceCDCBasicDemoInitialize(); break; case EVENT_SET_DESCRIPTOR: break; case EVENT_EP0_REQUEST: /* We have received a non-standard USB request. The HID driver * needs to check to see if the request was for it. */ USBCheckCDCRequest(); break; case EVENT_BUS_ERROR: break; case EVENT_TRANSFER_TERMINATED: break; default: break; } return true; }