void USBD_IRQHandler(void) { uint32_t u32IntSts = USBD_GET_INT_FLAG(); uint32_t u32State = USBD_GET_BUS_STATE(); //------------------------------------------------------------------ if (u32IntSts & USBD_INTSTS_FLDET) { // Floating detect USBD_CLR_INT_FLAG(USBD_INTSTS_FLDET); if (USBD_IS_ATTACHED()) { /* USB Plug In */ USBD_ENABLE_USB(); } else { /* USB Un-plug */ USBD_DISABLE_USB(); } } //------------------------------------------------------------------ if (u32IntSts & USBD_INTSTS_BUS) { /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_BUS); if (u32State & USBD_STATE_USBRST) { /* Bus reset */ USBD_ENABLE_USB(); USBD_SwReset(); } if (u32State & USBD_STATE_SUSPEND) { /* Enable USB but disable PHY */ USBD_DISABLE_PHY(); } if (u32State & USBD_STATE_RESUME) { /* Enable USB and enable PHY */ USBD_ENABLE_USB(); } } //------------------------------------------------------------------ if(u32IntSts & USBD_INTSTS_WAKEUP) { /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_WAKEUP); } if (u32IntSts & USBD_INTSTS_USB) { extern uint8_t g_usbd_SetupPacket[]; // USB event if (u32IntSts & USBD_INTSTS_SETUP) { // Setup packet /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_SETUP); /* Clear the data IN/OUT ready flag of control end-points */ USBD_STOP_TRANSACTION(EP0); USBD_STOP_TRANSACTION(EP1); USBD_ProcessSetupPacket(); } // EP events if (u32IntSts & USBD_INTSTS_EP0) { /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_EP0); // control IN USBD_CtrlIn(); } if (u32IntSts & USBD_INTSTS_EP1) { /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_EP1); // control OUT USBD_CtrlOut(); if(g_usbd_SetupPacket[1] == SET_LINE_CODE) { if(g_usbd_SetupPacket[4] == 0) /* VCOM-1 */ VCOM_LineCoding(0); /* Apply UART settings */ } } if (u32IntSts & USBD_INTSTS_EP2) { /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_EP2); // Bulk IN EP2_Handler(); } if (u32IntSts & USBD_INTSTS_EP3) { /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_EP3); // Bulk OUT EP3_Handler(); } if (u32IntSts & USBD_INTSTS_EP4) { /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_EP4); } if (u32IntSts & USBD_INTSTS_EP5) { /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_EP5); // Interrupt IN EP5_Handler(); } } }
/*--------------------------------------------------------------------------*/ void USBD_IRQHandler(void) { uint32_t u32IntSts = USBD_GET_INT_FLAG(); uint32_t u32State = USBD_GET_BUS_STATE(); //------------------------------------------------------------------ if (u32IntSts & USBD_INTSTS_FLDET) { // Floating detect USBD_CLR_INT_FLAG(USBD_INTSTS_FLDET); if (USBD_IS_ATTACHED()) { /* USB Plug In */ USBD_ENABLE_USB(); } else { /* USB Un-plug */ USBD_DISABLE_USB(); } } //------------------------------------------------------------------ if (u32IntSts & USBD_INTSTS_BUS) { /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_BUS); if (u32State & USBD_STATE_USBRST) { /* Bus reset */ USBD_ENABLE_USB(); USBD_SwReset(); } if (u32State & USBD_STATE_SUSPEND) { /* Enable USB but disable PHY */ USBD_DISABLE_PHY(); } if (u32State & USBD_STATE_RESUME) { /* Enable USB and enable PHY */ USBD_ENABLE_USB(); } } //------------------------------------------------------------------ if(u32IntSts & USBD_INTSTS_WAKEUP) { /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_WAKEUP); } if (u32IntSts & USBD_INTSTS_USB) { // USB event if (u32IntSts & USBD_INTSTS_SETUP) { // Setup packet /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_SETUP); /* Clear the data IN/OUT ready flag of control end-points */ USBD_STOP_TRANSACTION(EP0); USBD_STOP_TRANSACTION(EP1); USBD_ProcessSetupPacket(); } // EP events if (u32IntSts & USBD_INTSTS_EP0) { /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_EP0); // control IN USBD_CtrlIn(); } if (u32IntSts & USBD_INTSTS_EP1) { /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_EP1); // control OUT USBD_CtrlOut(); } if (u32IntSts & USBD_INTSTS_EP2) { /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_EP2); } if (u32IntSts & USBD_INTSTS_EP3) { /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_EP3); // Bulk Out -> receive printer data PTR_Data_Receive(); } if (u32IntSts & USBD_INTSTS_EP4) { /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_EP4); } if (u32IntSts & USBD_INTSTS_EP5) { /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_EP5); // Interrupt IN EP5_Handler(); } if (u32IntSts & USBD_INTSTS_EP6) { /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_EP6); // Interrupt OUT EP6_Handler(); } if (u32IntSts & USBD_INTSTS_EP7) { /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_EP7); } } }
/** * USB virtual COM interrupt handler. * This is an internal function. */ static void USB_VirtualCOM_IRQHandler() { uint32_t intSts, busState; intSts = USBD_GET_INT_FLAG(); busState = USBD_GET_BUS_STATE(); if(intSts & USBD_INTSTS_FLDET) { if(USBD_IS_ATTACHED()) { // USB plugged in USBD_ENABLE_USB(); } else { // USB unplugged USBD_DISABLE_USB(); } } else if(intSts & USBD_INTSTS_BUS) { if(busState & USBD_STATE_USBRST) { // Bus reset USBD_ENABLE_USB(); USBD_SwReset(); } else if(busState & USBD_STATE_SUSPEND) { // Suspend: USB enabled, PHY disabled USBD_DISABLE_PHY(); } else if(busState & USBD_STATE_RESUME) { // Resume: USB enabled, PHY enabled USBD_ENABLE_USB(); } } else if(intSts & USBD_INTSTS_USB) { if(intSts & USBD_INTSTS_SETUP) { // Clear IN/OUT data ready flag for control endpoints USBD_STOP_TRANSACTION(USB_VCOM_CTRL_IN_EP); USBD_STOP_TRANSACTION(USB_VCOM_CTRL_OUT_EP); // Handle setup packet USBD_ProcessSetupPacket(); } else if(intSts & USB_VCOM_CTRL_IN_INTSTS) { // Handle control IN USBD_CtrlIn(); } else if(intSts & USB_VCOM_CTRL_OUT_INTSTS) { // Handle control OUT USBD_CtrlOut(); } else if(intSts & USB_VCOM_BULK_IN_INTSTS) { // Handle bulk IN USB_VirtualCOM_HandleBulkIn(); } else if(intSts & USB_VCOM_BULK_OUT_INTSTS) { // Handle bulk OUT USB_VirtualCOM_HandleBulkOut(); } } // Clear flag USBD_CLR_INT_FLAG(intSts); }