__weak BOOL USBD_EndPoint0_Setup_CDC_ReqToIF (void) { if ((USBD_SetupPacket.wIndexL == usbd_cdc_acm_cif_num) || /* IF number correct? */ (USBD_SetupPacket.wIndexL == usbd_cdc_acm_dif_num)) { switch (USBD_SetupPacket.bRequest) { case CDC_SEND_ENCAPSULATED_COMMAND: USBD_EP0Data.pData = USBD_EP0Buf; /* data to be received, see USBD_EVT_OUT */ return (__TRUE); case CDC_GET_ENCAPSULATED_RESPONSE: if (USBD_CDC_ACM_GetEncapsulatedResponse()) { USBD_EP0Data.pData = USBD_EP0Buf; /* point to data to be sent */ USBD_DataInStage(); /* send requested data */ return (__TRUE); } break; case CDC_SET_COMM_FEATURE: USBD_EP0Data.pData = USBD_EP0Buf; /* data to be received, see USBD_EVT_OUT */ return (__TRUE); case CDC_GET_COMM_FEATURE: if (USBD_CDC_ACM_GetCommFeature(USBD_SetupPacket.wValue)) { USBD_EP0Data.pData = USBD_EP0Buf; /* point to data to be sent */ USBD_DataInStage(); /* send requested data */ return (__TRUE); } break; case CDC_CLEAR_COMM_FEATURE: if (USBD_CDC_ACM_ClearCommFeature(USBD_SetupPacket.wValue)) { USBD_StatusInStage(); /* send Acknowledge */ return (__TRUE); } break; case CDC_SET_LINE_CODING: USBD_EP0Data.pData = USBD_EP0Buf; /* data to be received, see USBD_EVT_OUT */ return (__TRUE); case CDC_GET_LINE_CODING: if (USBD_CDC_ACM_GetLineCoding()) { USBD_EP0Data.pData = USBD_EP0Buf; /* point to data to be sent */ USBD_DataInStage(); /* send requested data */ return (__TRUE); } break; case CDC_SET_CONTROL_LINE_STATE: if (USBD_CDC_ACM_SetControlLineState(USBD_SetupPacket.wValue)) { USBD_StatusInStage(); /* send Acknowledge */ return (__TRUE); } break; case CDC_SEND_BREAK: if (USBD_CDC_ACM_SendBreak(USBD_SetupPacket.wValue)) { USBD_StatusInStage(); /* send Acknowledge */ return (__TRUE); } break; } } return (__FALSE); }
__weak BOOL USBD_EndPoint0_Setup_HID_ReqToIF (void) { if (USBD_SetupPacket.wIndexL == usbd_hid_if_num) { /* IF number correct? */ switch (USBD_SetupPacket.bRequest) { case HID_REQUEST_GET_REPORT: if (USBD_HID_GetReport()) { if (USBD_SetupPacket.wValueH == HID_REPORT_INPUT) { USBD_EP0Data.pData = &USBD_HID_InReport[1]; /* point to data to be sent (skip ReportID) */ } else if (USBD_SetupPacket.wValueH == HID_REPORT_FEATURE) { USBD_EP0Data.pData = &USBD_HID_FeatReport[1]; /* point to data to be sent (skip ReportID) */ } USBD_DataInStage(); /* send requested data */ return (__TRUE); } break; case HID_REQUEST_SET_REPORT: if (USBD_SetupPacket.wValueH == HID_REPORT_OUTPUT) { USBD_EP0Data.pData = &USBD_HID_OutReport[1]; /* out data to be received (skip ReportID) */ } else if (USBD_SetupPacket.wValueH == HID_REPORT_FEATURE) { USBD_EP0Data.pData = &USBD_HID_FeatReport[1]; /* out data to be received (skip ReportID) */ } return (__TRUE); case HID_REQUEST_GET_IDLE: if (USBD_HID_GetIdle()) { USBD_EP0Data.pData = USBD_EP0Buf; /* point to data to be sent */ USBD_DataInStage(); /* send requested data */ return (__TRUE); } break; case HID_REQUEST_SET_IDLE: if (USBD_HID_SetIdle()) { USBD_StatusInStage(); /* send Acknowledge */ return (__TRUE); } break; case HID_REQUEST_GET_PROTOCOL: if (USBD_HID_GetProtocol()) { USBD_EP0Data.pData = USBD_EP0Buf; /* point to data to be sent */ USBD_DataInStage(); /* send requested data */ return (__TRUE); } break; case HID_REQUEST_SET_PROTOCOL: if (USBD_HID_SetProtocol()) { USBD_StatusInStage(); /* send Acknowledge */ return (__TRUE); } break; } } return (__FALSE); }
void USBD_EndPoint0 (U32 event) { if (event & USBD_EVT_SETUP) { USBD_SetupStage(); USBD_DirCtrlEP(USBD_SetupPacket.bmRequestType.Dir); USBD_EP0Data.Count = USBD_SetupPacket.wLength; /* Number of bytes to transfer */ switch (USBD_SetupPacket.bmRequestType.Type) { case REQUEST_STANDARD: switch (USBD_SetupPacket.bRequest) { case USB_REQUEST_GET_STATUS: if (!USBD_ReqGetStatus()) { goto stall; } USBD_DataInStage(); break; case USB_REQUEST_CLEAR_FEATURE: if (!USBD_ReqSetClrFeature(0)) { goto stall; } USBD_StatusInStage(); #ifdef __RTX if (__rtx) { if (USBD_RTX_CoreTask) { usbd_os_evt_set(USBD_EVT_CLR_FEATURE, USBD_RTX_CoreTask); } } else { #endif if (USBD_P_Feature_Event) { USBD_P_Feature_Event(); } #ifdef __RTX } #endif break; case USB_REQUEST_SET_FEATURE: if (!USBD_ReqSetClrFeature(1)) { goto stall; } USBD_StatusInStage(); #ifdef __RTX if (__rtx) { if (USBD_RTX_CoreTask) { usbd_os_evt_set(USBD_EVT_SET_FEATURE, USBD_RTX_CoreTask); } } else { #endif if (USBD_P_Feature_Event) { USBD_P_Feature_Event(); } #ifdef __RTX } #endif break; case USB_REQUEST_SET_ADDRESS: if (!USBD_ReqSetAddress()) { goto stall; } USBD_SetAddress(USBD_DeviceAddress & 0x7F, 1); USBD_StatusInStage(); break; case USB_REQUEST_GET_DESCRIPTOR: if (!USBD_ReqGetDescriptor()) { goto stall; } USBD_DataInStage(); break; case USB_REQUEST_SET_DESCRIPTOR: goto stall; case USB_REQUEST_GET_CONFIGURATION: if (!USBD_ReqGetConfiguration()) { goto stall; } USBD_DataInStage(); break; case USB_REQUEST_SET_CONFIGURATION: if (!USBD_ReqSetConfiguration()) { goto stall; } USBD_StatusInStage(); #ifdef __RTX if (__rtx) { if (USBD_RTX_CoreTask) { usbd_os_evt_set(USBD_EVT_SET_CFG, USBD_RTX_CoreTask); } } else { #endif if (USBD_P_Configure_Event) { USBD_P_Configure_Event(); } #ifdef __RTX } #endif break; case USB_REQUEST_GET_INTERFACE: if (!USBD_ReqGetInterface()) { goto stall; } USBD_DataInStage(); break; case USB_REQUEST_SET_INTERFACE: if (!USBD_ReqSetInterface()) { goto stall; } USBD_StatusInStage(); #ifdef __RTX if (__rtx) { if (USBD_RTX_CoreTask) { usbd_os_evt_set(USBD_EVT_SET_IF, USBD_RTX_CoreTask); } } else { #endif if (USBD_P_Interface_Event) { USBD_P_Interface_Event(); } #ifdef __RTX } #endif break; default: goto stall; } break; /* end case REQUEST_STANDARD */ case REQUEST_CLASS: switch (USBD_SetupPacket.bmRequestType.Recipient) { case REQUEST_TO_DEVICE: goto stall; /* not supported */ case REQUEST_TO_INTERFACE: if (USBD_EndPoint0_Setup_HID_ReqToIF()) goto setup_class_ok; if (USBD_EndPoint0_Setup_MSC_ReqToIF()) goto setup_class_ok; if (USBD_EndPoint0_Setup_CDC_ReqToIF()) goto setup_class_ok; goto stall; /* not supported */ /* end case REQUEST_TO_INTERFACE */ case REQUEST_TO_ENDPOINT: goto stall; /* end case REQUEST_TO_ENDPOINT */ default: goto stall; } setup_class_ok: /* request finished successfully */ break; /* end case REQUEST_CLASS */ default: stall: if ((USBD_SetupPacket.bmRequestType.Dir == REQUEST_HOST_TO_DEVICE) && (USBD_SetupPacket.wLength != 0)) { USBD_SetStallEP(0x00); } else { USBD_SetStallEP(0x80); } USBD_EP0Data.Count = 0; break; } } if (event & USBD_EVT_OUT) { if (USBD_SetupPacket.bmRequestType.Dir == REQUEST_HOST_TO_DEVICE) { if (USBD_EP0Data.Count) { /* still data to receive ? */ USBD_DataOutStage(); /* receive data */ if (USBD_EP0Data.Count == 0) { /* data complete ? */ switch (USBD_SetupPacket.bmRequestType.Type) { case REQUEST_STANDARD: goto stall_i; /* not supported */ case REQUEST_CLASS: switch (USBD_SetupPacket.bmRequestType.Recipient) { case REQUEST_TO_DEVICE: goto stall_i; /* not supported */ case REQUEST_TO_INTERFACE: if (USBD_EndPoint0_Out_HID_ReqToIF()) goto out_class_ok; if (USBD_EndPoint0_Out_CDC_ReqToIF()) goto out_class_ok; goto stall_i; /* end case REQUEST_TO_INTERFACE */ case REQUEST_TO_ENDPOINT: goto stall_i; /* end case REQUEST_TO_ENDPOINT */ default: goto stall_i; } out_class_ok: /* request finished successfully */ break; /* end case REQUEST_CLASS */ default: stall_i: USBD_SetStallEP(0x80); USBD_EP0Data.Count = 0; break; } } } } else { USBD_StatusOutStage(); /* receive Acknowledge */ } } /* end USBD_EVT_OUT */ if (event & USBD_EVT_IN) { if (USBD_SetupPacket.bmRequestType.Dir == REQUEST_DEVICE_TO_HOST) { if (USBD_EP0Data.Count || USBD_ZLP) USBD_DataInStage(); /* send data */ } else { if (USBD_DeviceAddress & 0x80) { USBD_DeviceAddress &= 0x7F; USBD_SetAddress(USBD_DeviceAddress, 0); } } } /* end USBD_EVT_IN */ if (event & USBD_EVT_OUT_STALL) { USBD_ClrStallEP(0x00); } if (event & USBD_EVT_IN_STALL) { USBD_ClrStallEP(0x80); } }