UINT8 CDC_InterfaceReq_Handler(void) { UINT8 u8State=uSETUP; switch(Setup_Pkt->bRequest) { case GET_INTERFACE: EP_IN_Transfer(EP0,&gu8Interface,1); break; case GET_LINE_CODING: EP_IN_Transfer(EP0,(UINT8*)&LineCoding,7); break; case SET_LINE_CODING: u8CDCState=SET_LINE_CODING; u8State=uDATA; break; case SET_CONTROL_LINE_STATE: u8CDCState=SET_CONTROL_LINE_STATE; u8State=uSETUP; break; case LOADER_MODE: Buffer_Init(CDC_OUT_Data,CDC_BUFFER_SIZE); FLAG_SET(LOADER,gu8USB_Flags); CDC_OUT_Data[0]=0xFF; break; } return(u8State); }
void USB_Endpoint_Setup_Handler(void) { UINT16 u16Status; switch(Setup_Pkt->bRequest) { case GET_STATUS: if(FLAG_CHK(Setup_Pkt->wIndex_h,gu8HALT_EP)) u16Status=0x0100; else u16Status=0x0000; EP_IN_Transfer(EP0,(UINT8*)&u16Status,2); break; case CLEAR_FEATURE: FLAG_CLR(Setup_Pkt->wIndex_h,gu8HALT_EP); EP_IN_Transfer(EP0,0,0); break; case SET_FEATURE: FLAG_SET(Setup_Pkt->wIndex_h,gu8HALT_EP); EP_IN_Transfer(EP0,0,0); break; default: break; } }
/*! * @brief 当前接口请求为CDC类请求 的 中断复位函数 * @note 在 USB_Setup_Handler 中断里调用 * @since v5.0 */ uint8 CDC_InterfaceReq_Handler(void) { uint8 u8State = uSETUP; switch(Setup_Pkt->bRequest) { case GET_INTERFACE: EP_IN_Transfer(EP0, &gu8Interface, 1); break; case GET_LINE_CODING: EP_IN_Transfer(EP0, (uint8 *)&com_cfg, 7); break; case SET_LINE_CODING: u8CDCState = SET_LINE_CODING; u8State = uDATA; break; case SET_CONTROL_LINE_STATE: u8CDCState = SET_CONTROL_LINE_STATE; u8State = uSETUP; break; case LOADER_MODE: FLAG_SET(LOADER, gu8USB_Flags); CDC_OUT_Data[0] = 0xFF; break; default: break; } return(u8State); }
void CDC_Engine(void) { //uint16 u8RecData; /* control Stage */ switch(u8CDCState) { case WAITING_FOR_ENUMERATION: /* 等待 USB 枚举 */ while(gu8USB_State != uENUMERATED) { (void)u8CDCState; }; u8CDCState = 0; break; case SET_LINE_CODING: if(FLAG_CHK(EP0, gu8USB_Flags)) { FLAG_CLR(EP0, gu8USB_Flags); (void)EP_OUT_Transfer(EP0, (uint8 *)&com_cfg); EP_IN_Transfer(EP0, 0, 0); } break; case SET_CONTROL_LINE_STATE: EP_IN_Transfer(EP0, 0, 0); break; } }
void CDC_Engine(void) { //UINT16 u8RecData; /* control Stage */ switch(u8CDCState) { case WAITING_FOR_ENUMERATION: /* Wait for USB Enumeration */ //while(gu8USB_State!=uENUMERATED) { (void)u8CDCState; //__RESET_WATCHDOG(); //USB_FLAGS=USB_ISTAT; //USB_ERROR_FLAGS=USB_ERRSTAT; }; //u8CDCState=0; break; case SET_LINE_CODING: if(FLAG_CHK(EP0,gu8USB_Flags)) { FLAG_CLR(EP0,gu8USB_Flags); (void)EP_OUT_Transfer(EP0,(UINT8*)&LineCoding); EP_IN_Transfer(EP0,0,0); //vfnSCI1Init(); } break; case SET_CONTROL_LINE_STATE: EP_IN_Transfer(EP0,0,0); break; } /* Data stage */ /* if(FLAG_CHK(EP_OUT,gu8USB_Flags)) { u8RecData=USB_EP_OUT_SizeCheck(EP_OUT); // Check how many bytes from the PC usbEP_Reset(EP_OUT); usbSIE_CONTROL(EP_OUT); FLAG_CLR(EP_OUT,gu8USB_Flags); EP_IN_Transfer(EP2,CDC_OUTPointer,2); u8RecData=0; } */ }
void USB_EP0_IN_Handler(void) { if(gu8USB_State==uADDRESS) { USB0_ADDR = Setup_Pkt->wValue_l; gu8USB_State=uREADY; FLAG_SET(fIN,gu8USBClearFlags); } EP_IN_Transfer(0,0,0); }
void USB_StdReq_Handler(void) { switch(Setup_Pkt->bRequest) { case mSET_ADDRESS: EP_IN_Transfer(EP0,0,0); gu8USB_State=uADDRESS; break; case mGET_DESC: switch(Setup_Pkt->wValue_h) { case mDEVICE: EP_IN_Transfer(EP0,(uint8*)Device_Descriptor,sizeof(Device_Descriptor)); break; case mCONFIGURATION: EP_IN_Transfer(EP0,(uint8*)Configuration_Descriptor,sizeof(Configuration_Descriptor)); break; case mSTRING: EP_IN_Transfer(EP0,(uint8*)String_Table[Setup_Pkt->wValue_l],String_Table[Setup_Pkt->wValue_l][0]); gu8USB_State=uENUMERATED; break; default: USB_EP0_Stall(); break; } break; case mSET_CONFIG: gu8Dummy=Setup_Pkt->wValue_h+Setup_Pkt->wValue_l; if(Setup_Pkt->wValue_h+Setup_Pkt->wValue_l) { USB_Set_Interface(); EP_IN_Transfer(EP0,0,0); gu8USB_State=uENUMERATED; } break; case mGET_CONFIG: EP_IN_Transfer(EP0,(uint8*)&gu8Dummy,1); break; case mGET_STATUS: gu8Status=0; EP_IN_Transfer(EP0,(uint8*)&gu8Status,2); break; default: USB_EP0_Stall(); break; } }
void usb_service(void) { // If data transfer arrives if(FLAG_CHK(EP_OUT,gu8USB_Flags)) { (void)USB_EP_OUT_SizeCheck(EP_OUT); usbEP_Reset(EP_OUT); usbSIE_CONTROL(EP_OUT); FLAG_CLR(EP_OUT,gu8USB_Flags); // Send it back to the PC EP_IN_Transfer(EP2,CDC_OUTPointer,1); } if (!ti_print) { ti_print = 300; sprintf((char *)gu8USB_Buffer,"\rtsi %%= %03i ", AbsolutePercentegePosition); EP_IN_Transfer(EP2,gu8USB_Buffer,15); } }
void CDC_Engine(void) { //uint16 u8RecData; /** re-init CDC class if a VBUS HIGH event was detected */ if (FLAG_CHK(VBUS_HIGH_EVENT,gu8ISR_Flags)) { FLAG_SET(USB_CTL_USBENSOFEN_MASK,USB0_CTL); u8CDCState = WAITING_FOR_ENUMERATION; enum_msg = TRUE; CDC_Init(); FLAG_CLR(VBUS_HIGH_EVENT,gu8ISR_Flags); } /* control Stage */ switch(u8CDCState) { case WAITING_FOR_ENUMERATION: /* Wait for USB Enumeration */ while(gu8USB_State!=uENUMERATED) { (void)u8CDCState; }; if (enum_msg) { printf ("\nUSB Enumerated, check your COM ports "); enum_msg = FALSE; } u8CDCState=0; break; case SET_LINE_CODING: if(FLAG_CHK(EP0,gu8USB_Flags)) { FLAG_CLR(EP0,gu8USB_Flags); (void)EP_OUT_Transfer(EP0,(uint8*)&LineCoding); EP_IN_Transfer(EP0,0,0); //vfnSCI1Init(); } break; case SET_CONTROL_LINE_STATE: EP_IN_Transfer(EP0,0,0); break; } /* Data stage */ /* if(FLAG_CHK(EP_OUT,gu8USB_Flags)) { u8RecData=USB_EP_OUT_SizeCheck(EP_OUT); // Check how many bytes from the PC usbEP_Reset(EP_OUT); usbSIE_CONTROL(EP_OUT); FLAG_CLR(EP_OUT,gu8USB_Flags); EP_IN_Transfer(EP2,CDC_OUTPointer,2); u8RecData=0; } */ }