/*--------------------------------------------------------------------------*/ 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); }
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) { __IO uint32_t IrqStL, IrqSt; IrqStL = USBD->GINTSTS & USBD->GINTEN; /* get interrupt status */ if (!IrqStL) return; /* USB interrupt */ if (IrqStL & USBD_GINTSTS_USBIF_Msk) { IrqSt = USBD->BUSINTSTS & USBD->BUSINTEN; if (IrqSt & USBD_BUSINTSTS_SOFIF_Msk) USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_SOFIF_Msk); if (IrqSt & USBD_BUSINTSTS_RSTIF_Msk) { USBD_SwReset(); g_u8MscStart = 0; g_u8BulkState = BULK_NORMAL; USBD_ResetDMA(); USBD->EPARSPCTL = USBD_EPRSPCTL_FLUSH_Msk; USBD->EPBRSPCTL = USBD_EPRSPCTL_FLUSH_Msk; UBSD_ENABLE_CEP_INT(USBD_CEPINTEN_SETUPPKIEN_Msk); USBD_SET_ADDR(0); UBSD_ENABLE_BUS_INT(USBD_BUSINTEN_RSTIEN_Msk|USBD_BUSINTEN_RESUMEIEN_Msk|USBD_BUSINTEN_SUSPENDIEN_Msk); USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_RSTIF_Msk); USBD_CLR_CEP_INT_FLAG(0x1ffc); } if (IrqSt & USBD_BUSINTSTS_RESUMEIF_Msk) { UBSD_ENABLE_BUS_INT(USBD_BUSINTEN_RSTIEN_Msk|USBD_BUSINTEN_SUSPENDIEN_Msk); USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_RESUMEIF_Msk); } if (IrqSt & USBD_BUSINTSTS_SUSPENDIF_Msk) { UBSD_ENABLE_BUS_INT(USBD_BUSINTEN_RSTIEN_Msk | USBD_BUSINTEN_RESUMEIEN_Msk); USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_SUSPENDIF_Msk); } if (IrqSt & USBD_BUSINTSTS_HISPDIF_Msk) { UBSD_ENABLE_CEP_INT(USBD_CEPINTEN_SETUPPKIEN_Msk); USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_HISPDIF_Msk); } if (IrqSt & USBD_BUSINTSTS_DMADONEIF_Msk) { g_usbd_DmaDone = 1; USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_DMADONEIF_Msk); if (!(USBD->DMACTL & USBD_DMACTL_DMARD_Msk)) { // if (g_u8BulkState == BULK_OUT) // g_u8BulkState = BULK_CBW; UBSD_ENABLE_EP_INT(EPB, USBD_EPINTEN_RXPKIEN_Msk); } if (USBD->DMACTL & USBD_DMACTL_DMARD_Msk) { if (g_usbd_ShortPacket == 1) { USBD->EPARSPCTL = USB_EP_RSPCTL_SHORTTXEN; // packet end g_usbd_ShortPacket = 0; } } } if (IrqSt & USBD_BUSINTSTS_PHYCLKVLDIF_Msk) USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_PHYCLKVLDIF_Msk); if (IrqSt & USBD_BUSINTSTS_VBUSDETIF_Msk) { if (USBD_IS_ATTACHED()) { /* USB Plug In */ USBD_ENABLE_USB(); } else { /* USB Un-plug */ USBD_DISABLE_USB(); } USBD_CLR_BUS_INT_FLAG(USBD_BUSINTSTS_VBUSDETIF_Msk); } } if (IrqStL & USBD_GINTSTS_CEPIF_Msk) { IrqSt = USBD->CEPINTSTS & USBD->CEPINTEN; if (IrqSt & USBD_CEPINTSTS_SETUPTKIF_Msk) { USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_SETUPTKIF_Msk); return; } if (IrqSt & USBD_CEPINTSTS_SETUPPKIF_Msk) { USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_SETUPPKIF_Msk); USBD_ProcessSetupPacket(); return; } if (IrqSt & USBD_CEPINTSTS_OUTTKIF_Msk) { USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_OUTTKIF_Msk); UBSD_ENABLE_CEP_INT(USBD_CEPINTEN_STSDONEIEN_Msk); return; } if (IrqSt & USBD_CEPINTSTS_INTKIF_Msk) { USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_INTKIF_Msk); if (!(IrqSt & USBD_CEPINTSTS_STSDONEIF_Msk)) { USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_TXPKIF_Msk); UBSD_ENABLE_CEP_INT(USBD_CEPINTEN_TXPKIEN_Msk); USBD_CtrlIn(); } else { USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_TXPKIF_Msk); UBSD_ENABLE_CEP_INT(USBD_CEPINTEN_TXPKIEN_Msk|USBD_CEPINTEN_STSDONEIEN_Msk); } return; } if (IrqSt & USBD_CEPINTSTS_PINGIF_Msk) { USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_PINGIF_Msk); return; } if (IrqSt & USBD_CEPINTSTS_TXPKIF_Msk) { USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_STSDONEIF_Msk); USBD_SET_CEP_STATE(USB_CEPCTL_NAKCLR); if (g_usbd_CtrlInSize) { USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_INTKIF_Msk); UBSD_ENABLE_CEP_INT(USBD_CEPINTEN_INTKIEN_Msk); } else { USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_STSDONEIF_Msk); UBSD_ENABLE_CEP_INT(USBD_CEPINTEN_SETUPPKIEN_Msk|USBD_CEPINTEN_STSDONEIEN_Msk); } USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_TXPKIF_Msk); return; } if (IrqSt & USBD_CEPINTSTS_RXPKIF_Msk) { USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_RXPKIF_Msk); USBD_SET_CEP_STATE(USB_CEPCTL_NAKCLR); UBSD_ENABLE_CEP_INT(USBD_CEPINTEN_SETUPPKIEN_Msk|USBD_CEPINTEN_STSDONEIEN_Msk); return; } if (IrqSt & USBD_CEPINTSTS_NAKIF_Msk) { USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_NAKIF_Msk); return; } if (IrqSt & USBD_CEPINTSTS_STALLIF_Msk) { USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_STALLIF_Msk); return; } if (IrqSt & USBD_CEPINTSTS_ERRIF_Msk) { USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_ERRIF_Msk); return; } if (IrqSt & USBD_CEPINTSTS_STSDONEIF_Msk) { USBD_UpdateDeviceState(); USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_STSDONEIF_Msk); UBSD_ENABLE_CEP_INT(USBD_CEPINTEN_SETUPPKIEN_Msk); return; } if (IrqSt & USBD_CEPINTSTS_BUFFULLIF_Msk) { USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_BUFFULLIF_Msk); return; } if (IrqSt & USBD_CEPINTSTS_BUFEMPTYIF_Msk) { USBD_CLR_CEP_INT_FLAG(USBD_CEPINTSTS_BUFEMPTYIF_Msk); return; } } /* bulk in */ if (IrqStL & USBD_GINTSTS_EPAIF_Msk) { IrqSt = USBD->EPAINTSTS & USBD->EPAINTEN; UBSD_ENABLE_EP_INT(EPA, 0); USBD_CLR_EP_INT_FLAG(EPA, IrqSt); } /* bulk out */ if (IrqStL & USBD_GINTSTS_EPBIF_Msk) { IrqSt = USBD->EPBINTSTS & USBD->EPBINTEN; if (IrqSt & USBD_EPINTSTS_SHORTRXIF_Msk) g_u8MscOutShortPacket = 0; UBSD_ENABLE_EP_INT(EPB, 0); USBD_CLR_EP_INT_FLAG(EPB, IrqSt); } if (IrqStL & USBD_GINTSTS_EPCIF_Msk) { IrqSt = USBD->EPCINTSTS & USBD->EPCINTEN; USBD_CLR_EP_INT_FLAG(EPC, IrqSt); } if (IrqStL & USBD_GINTSTS_EPDIF_Msk) { IrqSt = USBD->EPDINTSTS & USBD->EPDINTEN; USBD_CLR_EP_INT_FLAG(EPD, IrqSt); } if (IrqStL & USBD_GINTSTS_EPEIF_Msk) { IrqSt = USBD->EPEINTSTS & USBD->EPEINTEN; USBD_CLR_EP_INT_FLAG(EPE, IrqSt); } if (IrqStL & USBD_GINTSTS_EPFIF_Msk) { IrqSt = USBD->EPFINTSTS & USBD->EPFINTEN; USBD_CLR_EP_INT_FLAG(EPF, IrqSt); } if (IrqStL & USBD_GINTSTS_EPGIF_Msk) { IrqSt = USBD->EPGINTSTS & USBD->EPGINTEN; USBD_CLR_EP_INT_FLAG(EPG, IrqSt); } if (IrqStL & USBD_GINTSTS_EPHIF_Msk) { IrqSt = USBD->EPHINTSTS & USBD->EPHINTEN; USBD_CLR_EP_INT_FLAG(EPH, IrqSt); } if (IrqStL & USBD_GINTSTS_EPIIF_Msk) { IrqSt = USBD->EPIINTSTS & USBD->EPIINTEN; USBD_CLR_EP_INT_FLAG(EPI, IrqSt); } if (IrqStL & USBD_GINTSTS_EPJIF_Msk) { IrqSt = USBD->EPJINTSTS & USBD->EPJINTEN; USBD_CLR_EP_INT_FLAG(EPJ, IrqSt); } if (IrqStL & USBD_GINTSTS_EPKIF_Msk) { IrqSt = USBD->EPKINTSTS & USBD->EPKINTEN; USBD_CLR_EP_INT_FLAG(EPK, IrqSt); } if (IrqStL & USBD_GINTSTS_EPLIF_Msk) { IrqSt = USBD->EPLINTSTS & USBD->EPLINTEN; USBD_CLR_EP_INT_FLAG(EPL, IrqSt); } }