/** * @brief This function makes USB host to recognize the device * * @param None * * @return None * * @details Enable WAKEUP, FLDET, USB and BUS interrupts. Disable software-disconnect function after 100ms delay with SysTick timer. */ void USBD_Start(void) { //CLK_SysTickDelay(100000); /* Disable software-disconnect function */ USBD_CLR_SE0(); /* Clear USB-related interrupts before enable interrupt */ USBD_CLR_INT_FLAG(USBD_INT_BUS | USBD_INT_USB | USBD_INT_FLDET | USBD_INT_WAKEUP); /* Enable USB-related interrupts. */ USBD_ENABLE_INT(USBD_INT_BUS | USBD_INT_USB | USBD_INT_FLDET | USBD_INT_WAKEUP); }
/*--------------------------------------------------------------------------*/ 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); } } }
//========================================================================= //----- (00005D24) -------------------------------------------------------- __myevic__ void DevicesOnOff( int off ) { if ( off ) { TIMER_DisableInt( TIMER0 ); TIMER_DisableInt( TIMER1 ); TIMER_DisableInt( TIMER2 ); if ( !gFlags.light_sleep ) { TIMER_DisableInt( TIMER3 ); } EADC_Close( EADC ); SetADCState( 1, 0 ); SetADCState( 2, 0 ); SetADCState( 14, 0 ); if ( ISVTCDUAL || ISCUBOID || ISCUBO200 || ISRX200S || ISRX23 || ISRX300 ) { SetADCState( 3, 0 ); SetADCState( 13, 0 ); if ( ISCUBO200 || ISRX200S || ISRX23 || ISRX300 ) { SetADCState( 15, 0 ); } PD7 = 0; BBC_Configure( BBC_PWMCH_CHARGER, 0 ); PD7 = 0; if ( ISCUBOID || ISCUBO200 || ISRX200S || ISRX23 ) { PF2 = 0; } } PC1 = 0; PC0 = 0; BBC_Configure( BBC_PWMCH_BUCK, 0 ); if ( !ISVTCDUAL ) PC3 = 0; PC2 = 0; BBC_Configure( BBC_PWMCH_BOOST, 0 ); if ( ISCUBO200 || ISRX200S || ISRX23 ) { PF1 = 0; } else if ( ISRX300 ) { PD1 = 0; } else { PB7 = 0; } GPIO_DisableInt( PD, 0 ); PD0 = 0; GPIO_SetMode( PD, GPIO_PIN_PIN0_Msk, GPIO_MODE_OUTPUT ); if ( ISRX300 ) { PF5 = 0; PF6 = 0; PA3 = 0; PA2 = 0; } if ( ISVTCDUAL ) { GPIO_DisableInt( PD, 1 ); PD1 = 0; GPIO_SetMode( PD, GPIO_PIN_PIN1_Msk, GPIO_MODE_OUTPUT ); } else if ( !ISCUBOID && !ISCUBO200 && !ISRX200S && !ISRX23 && !ISRX300 ) { GPIO_DisableInt( PD, 7 ); PD7 = 0; GPIO_SetMode( PD, GPIO_PIN_PIN7_Msk, GPIO_MODE_OUTPUT ); } SYS->GPE_MFPH &= ~(SYS_GPE_MFPH_PE11MFP_Msk|SYS_GPE_MFPH_PE12MFP_Msk|SYS_GPE_MFPH_PE13MFP_Msk); SYS->GPE_MFPH |= (SYS_GPE_MFPH_PE11MFP_GPIO|SYS_GPE_MFPH_PE12MFP_GPIO|SYS_GPE_MFPH_PE13MFP_GPIO); PE11 = 0; GPIO_SetMode( PE, GPIO_PIN_PIN11_Msk, GPIO_MODE_OUTPUT ); PE12 = 0; GPIO_SetMode( PE, GPIO_PIN_PIN12_Msk, GPIO_MODE_OUTPUT ); PE13 = 0; GPIO_SetMode( PE, GPIO_PIN_PIN13_Msk, GPIO_MODE_OUTPUT ); PE10 = 0; GPIO_EnableInt( PE, 0, GPIO_INT_BOTH_EDGE ); GPIO_EnableInt( PD, 2, GPIO_INT_BOTH_EDGE ); GPIO_EnableInt( PD, 3, GPIO_INT_BOTH_EDGE ); if ( ISVTCDUAL ) { PA3 = 0; PC3 = 0; PF2 = 0; PA2 = 0; } else if ( ISCUBOID || ISCUBO200 || ISRX200S || ISRX23 || ISRX300 ) { PF0 = 0; } SYS_UnlockReg(); SYS->USBPHY &= ~SYS_USBPHY_LDO33EN_Msk; SYS->IVSCTL &= ~(SYS_IVSCTL_VBATUGEN_Msk|SYS_IVSCTL_VTEMPEN_Msk); SYS_DisableBOD(); SYS->VREFCTL = 0; SYS_LockReg(); USBD_CLR_INT_FLAG( USBD_INTSTS_WAKEUP|USBD_INTSTS_FLDET|USBD_INTSTS_BUS|USBD_INTSTS_USB ); USBD_ENABLE_INT( USBD_INT_WAKEUP ); } else { USBD_CLR_INT_FLAG( USBD_INTSTS_WAKEUP ); SYS_UnlockReg(); SYS->USBPHY |= SYS_USBPHY_LDO33EN_Msk; SYS->IVSCTL |= SYS_IVSCTL_VBATUGEN_Msk; if ( ISRX300 ) { SYS->IVSCTL |= SYS_IVSCTL_VTEMPEN_Msk; } SYS->VREFCTL = SYS_VREFCTL_VREF_2_56V; SYS_EnableBOD( SYS_BODCTL_BOD_RST_EN, SYS_BODCTL_BODVL_2_2V ); SYS_LockReg(); GPIO_DisableInt( PE, 0 ); GPIO_DisableInt( PD, 2 ); GPIO_DisableInt( PD, 3 ); if ( ISCUBOID || ISCUBO200 || ISRX200S || ISRX23 ) { PF2 = 1; } SYS->GPE_MFPH &= ~(SYS_GPE_MFPH_PE11MFP_Msk|SYS_GPE_MFPH_PE12MFP_Msk|SYS_GPE_MFPH_PE13MFP_Msk); SYS->GPE_MFPH |= (SYS_GPE_MFPH_PE11MFP_SPI0_MOSI0|SYS_GPE_MFPH_PE12MFP_SPI0_SS|SYS_GPE_MFPH_PE13MFP_SPI0_CLK); GPIO_SetMode( PD, GPIO_PIN_PIN0_Msk, GPIO_MODE_INPUT ); GPIO_EnableInt( PD, 0, GPIO_INT_FALLING ); if ( ISVTCDUAL ) { GPIO_SetMode( PD, GPIO_PIN_PIN1_Msk, GPIO_MODE_INPUT ); GPIO_EnableInt( PD, 1, GPIO_INT_RISING ); GPIO_ENABLE_DEBOUNCE( PD, GPIO_PIN_PIN1_Msk ); } else if ( !ISCUBOID && !ISCUBO200 && !ISRX200S && !ISRX23 && !ISRX300 ) { GPIO_SetMode( PD, GPIO_PIN_PIN7_Msk, GPIO_MODE_INPUT ); GPIO_EnableInt( PD, 7, GPIO_INT_RISING ); GPIO_ENABLE_DEBOUNCE( PD, GPIO_PIN_PIN7_Msk ); } if ( ISCUBO200 || ISRX200S || ISRX23 ) { PF1 = 1; } else if ( ISRX300 ) { PD1 = 1; } else { PB7 = 1; } SetADCState( 1, 1 ); SetADCState( 2, 1 ); SetADCState( 14, 1 ); if ( ISVTCDUAL || ISCUBOID || ISCUBO200 || ISRX200S || ISRX23 || ISRX300 ) { SetADCState( 3, 1 ); SetADCState( 13, 1 ); if ( ISCUBO200 || ISRX200S || ISRX23 || ISRX300 ) { SetADCState( 15, 1 ); } } TIMER_EnableInt( TIMER0 ); TIMER_EnableInt( TIMER1 ); TIMER_EnableInt( TIMER2 ); TIMER_EnableInt( TIMER3 ); } }
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(); } } }
/** * 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); }