void recvChunk(void) { uint32_t chunk; // reset timer g_recvTimerStart = LPC_TIMER1->TC; if (g_recvOffset>=g_recvLen) { g_recvComplete = 1; return; } if (g_recvLen-g_recvOffset>=USB_MAX_CHUNK) chunk = USB_MAX_CHUNK; else chunk = g_recvLen-g_recvOffset; USB_ReadReqEP(USB_BULK_OUT_EP, (uint8_t *)g_recvData + g_recvOffset, chunk); g_recvOffset += chunk; }
void USB_EndPoint0 (uint32_t event) { switch (event) { case USB_EVT_SETUP: USB_SetupStage(); USB_DirCtrlEP(SetupPacket.bmRequestType.BM.Dir); EP0Data.Count = SetupPacket.wLength; /* Number of bytes to transfer */ switch (SetupPacket.bmRequestType.BM.Type) { case REQUEST_STANDARD: switch (SetupPacket.bRequest) { case USB_REQUEST_GET_STATUS: if (!USB_ReqGetStatus()) { goto stall_i; } USB_DataInStage(); break; case USB_REQUEST_CLEAR_FEATURE: if (!USB_ReqSetClrFeature(0)) { goto stall_i; } USB_StatusInStage(); #if USB_FEATURE_EVENT USB_Feature_Event(); #endif break; case USB_REQUEST_SET_FEATURE: if (!USB_ReqSetClrFeature(1)) { goto stall_i; } USB_StatusInStage(); #if USB_FEATURE_EVENT USB_Feature_Event(); #endif break; case USB_REQUEST_SET_ADDRESS: if (!USB_ReqSetAddress()) { goto stall_i; } USB_StatusInStage(); break; case USB_REQUEST_GET_DESCRIPTOR: if (!USB_ReqGetDescriptor()) { goto stall_i; } USB_DataInStage(); break; case USB_REQUEST_SET_DESCRIPTOR: /*stall_o:*/ USB_SetStallEP(0x00); /* not supported */ EP0Data.Count = 0; break; case USB_REQUEST_GET_CONFIGURATION: if (!USB_ReqGetConfiguration()) { goto stall_i; } USB_DataInStage(); break; case USB_REQUEST_SET_CONFIGURATION: if (!USB_ReqSetConfiguration()) { goto stall_i; } USB_StatusInStage(); #if USB_CONFIGURE_EVENT USB_Configure_Event(); #endif break; case USB_REQUEST_GET_INTERFACE: if (!USB_ReqGetInterface()) { goto stall_i; } USB_DataInStage(); break; case USB_REQUEST_SET_INTERFACE: if (!USB_ReqSetInterface()) { goto stall_i; } USB_StatusInStage(); #if USB_INTERFACE_EVENT USB_Interface_Event(); #endif break; default: goto stall_i; } break; /* end case REQUEST_STANDARD */ #if USB_CLASS case REQUEST_CLASS: switch (SetupPacket.bmRequestType.BM.Recipient) { case REQUEST_TO_DEVICE: goto stall_i; /* not supported */ case REQUEST_TO_INTERFACE: #if USB_HID if (SetupPacket.wIndex.WB.L == USB_HID_IF_NUM) { /* IF number correct? */ switch (SetupPacket.bRequest) { case HID_REQUEST_GET_REPORT: if (HID_GetReport()) { EP0Data.pData = EP0Buf; /* point to data to be sent */ USB_DataInStage(); /* send requested data */ goto setup_class_ok; } break; case HID_REQUEST_SET_REPORT: EP0Data.pData = EP0Buf; /* data to be received */ goto setup_class_ok; case HID_REQUEST_GET_IDLE: if (HID_GetIdle()) { EP0Data.pData = EP0Buf; /* point to data to be sent */ USB_DataInStage(); /* send requested data */ goto setup_class_ok; } break; case HID_REQUEST_SET_IDLE: if (HID_SetIdle()) { USB_StatusInStage(); /* send Acknowledge */ goto setup_class_ok; } break; case HID_REQUEST_GET_PROTOCOL: if (HID_GetProtocol()) { EP0Data.pData = EP0Buf; /* point to data to be sent */ USB_DataInStage(); /* send requested data */ goto setup_class_ok; } break; case HID_REQUEST_SET_PROTOCOL: if (HID_SetProtocol()) { USB_StatusInStage(); /* send Acknowledge */ goto setup_class_ok; } break; } } #endif /* USB_HID */ #if USB_MSC if (SetupPacket.wIndex.WB.L == USB_MSC_IF_NUM) { /* IF number correct? */ switch (SetupPacket.bRequest) { case MSC_REQUEST_RESET: if ((SetupPacket.wValue.W == 0) && /* RESET with invalid parameters -> STALL */ (SetupPacket.wLength == 0)) { if (MSC_Reset()) { USB_StatusInStage(); goto setup_class_ok; } } break; case MSC_REQUEST_GET_MAX_LUN: if ((SetupPacket.wValue.W == 0) && /* GET_MAX_LUN with invalid parameters -> STALL */ (SetupPacket.wLength == 1)) { if (MSC_GetMaxLUN()) { EP0Data.pData = EP0Buf; USB_DataInStage(); goto setup_class_ok; } } break; } } #endif /* USB_MSC */ #if USB_AUDIO if ((SetupPacket.wIndex.WB.L == USB_ADC_CIF_NUM) || /* IF number correct? */ (SetupPacket.wIndex.WB.L == USB_ADC_SIF1_NUM) || (SetupPacket.wIndex.WB.L == USB_ADC_SIF2_NUM)) { switch (SetupPacket.bRequest) { case AUDIO_REQUEST_GET_CUR: case AUDIO_REQUEST_GET_MIN: case AUDIO_REQUEST_GET_MAX: case AUDIO_REQUEST_GET_RES: if (ADC_IF_GetRequest()) { EP0Data.pData = EP0Buf; /* point to data to be sent */ USB_DataInStage(); /* send requested data */ goto setup_class_ok; } break; case AUDIO_REQUEST_SET_CUR: // case AUDIO_REQUEST_SET_MIN: // case AUDIO_REQUEST_SET_MAX: // case AUDIO_REQUEST_SET_RES: EP0Data.pData = EP0Buf; /* data to be received */ goto setup_class_ok; } } #endif /* USB_AUDIO */ #if USB_CDC if ((SetupPacket.wIndex.WB.L == USB_CDC_CIF_NUM) || /* IF number correct? */ (SetupPacket.wIndex.WB.L == USB_CDC_DIF_NUM)) { switch (SetupPacket.bRequest) { case CDC_SEND_ENCAPSULATED_COMMAND: EP0Data.pData = EP0Buf; /* data to be received, see USB_EVT_OUT */ goto setup_class_ok; case CDC_GET_ENCAPSULATED_RESPONSE: if (CDC_GetEncapsulatedResponse()) { EP0Data.pData = EP0Buf; /* point to data to be sent */ USB_DataInStage(); /* send requested data */ goto setup_class_ok; } break; case CDC_SET_COMM_FEATURE: EP0Data.pData = EP0Buf; /* data to be received, see USB_EVT_OUT */ goto setup_class_ok; case CDC_GET_COMM_FEATURE: if (CDC_GetCommFeature(SetupPacket.wValue.W)) { EP0Data.pData = EP0Buf; /* point to data to be sent */ USB_DataInStage(); /* send requested data */ goto setup_class_ok; } break; case CDC_CLEAR_COMM_FEATURE: if (CDC_ClearCommFeature(SetupPacket.wValue.W)) { USB_StatusInStage(); /* send Acknowledge */ goto setup_class_ok; } break; case CDC_SET_LINE_CODING: EP0Data.pData = EP0Buf; /* data to be received, see USB_EVT_OUT */ goto setup_class_ok; case CDC_GET_LINE_CODING: if (CDC_GetLineCoding()) { EP0Data.pData = EP0Buf; /* point to data to be sent */ USB_DataInStage(); /* send requested data */ goto setup_class_ok; } break; case CDC_SET_CONTROL_LINE_STATE: if (CDC_SetControlLineState(SetupPacket.wValue.W)) { USB_StatusInStage(); /* send Acknowledge */ goto setup_class_ok; } break; case CDC_SEND_BREAK: if (CDC_SendBreak(SetupPacket.wValue.W)) { USB_StatusInStage(); /* send Acknowledge */ goto setup_class_ok; } break; } } #endif /* USB_CDC */ goto stall_i; /* not supported */ /* end case REQUEST_TO_INTERFACE */ case REQUEST_TO_ENDPOINT: #if USB_AUDIO switch (SetupPacket.bRequest) { case AUDIO_REQUEST_GET_CUR: case AUDIO_REQUEST_GET_MIN: case AUDIO_REQUEST_GET_MAX: case AUDIO_REQUEST_GET_RES: if (ADC_EP_GetRequest()) { EP0Data.pData = EP0Buf; /* point to data to be sent */ USB_DataInStage(); /* send requested data */ goto setup_class_ok; } break; case AUDIO_REQUEST_SET_CUR: // case AUDIO_REQUEST_SET_MIN: // case AUDIO_REQUEST_SET_MAX: // case AUDIO_REQUEST_SET_RES: EP0Data.pData = EP0Buf; /* data to be received */ goto setup_class_ok; } #endif /* USB_AUDIO */ goto stall_i; /* end case REQUEST_TO_ENDPOINT */ default: goto stall_i; } setup_class_ok: /* request finished successfully */ break; /* end case REQUEST_CLASS */ #endif /* USB_CLASS */ #if USB_VENDOR case REQUEST_VENDOR: switch (SetupPacket.bmRequestType.BM.Recipient) { case REQUEST_TO_DEVICE: if (!USB_ReqVendorDev(TRUE)) { goto stall_i; /* not supported */ } break; case REQUEST_TO_INTERFACE: if (!USB_ReqVendorIF(TRUE)) { goto stall_i; /* not supported */ } break; case REQUEST_TO_ENDPOINT: if (!USB_ReqVendorEP(TRUE)) { goto stall_i; /* not supported */ } break; default: goto stall_i; } if (SetupPacket.wLength) { if (SetupPacket.bmRequestType.BM.Dir == REQUEST_DEVICE_TO_HOST) { USB_DataInStage(); } } else { USB_StatusInStage(); } break; /* end case REQUEST_VENDOR */ #endif /* USB_VENDOR */ default: stall_i: USB_SetStallEP(0x80); EP0Data.Count = 0; break; } break; /* end case USB_EVT_SETUP */ case USB_EVT_OUT_NAK: if (SetupPacket.bmRequestType.BM.Dir == 0) { USB_ReadReqEP(0x00, EP0Data.pData, EP0Data.Count); } else { /* might be zero length pkt */ USB_ReadReqEP(0x00, EP0Data.pData, 0); } break; case USB_EVT_OUT: if (SetupPacket.bmRequestType.BM.Dir == REQUEST_HOST_TO_DEVICE) { if (EP0Data.Count) { /* still data to receive ? */ USB_DataOutStage(); /* receive data */ if (EP0Data.Count == 0) { /* data complete ? */ switch (SetupPacket.bmRequestType.BM.Type) { case REQUEST_STANDARD: goto stall_i; /* not supported */ #if (USB_CLASS) case REQUEST_CLASS: switch (SetupPacket.bmRequestType.BM.Recipient) { case REQUEST_TO_DEVICE: goto stall_i; /* not supported */ case REQUEST_TO_INTERFACE: #if USB_HID if (SetupPacket.wIndex.WB.L == USB_HID_IF_NUM) { /* IF number correct? */ switch (SetupPacket.bRequest) { case HID_REQUEST_SET_REPORT: if (HID_SetReport()) { USB_StatusInStage(); /* send Acknowledge */ goto out_class_ok; } break; } } #endif /* USB_HID */ #if USB_AUDIO if ((SetupPacket.wIndex.WB.L == USB_ADC_CIF_NUM) || /* IF number correct? */ (SetupPacket.wIndex.WB.L == USB_ADC_SIF1_NUM) || (SetupPacket.wIndex.WB.L == USB_ADC_SIF2_NUM)) { switch (SetupPacket.bRequest) { case AUDIO_REQUEST_SET_CUR: // case AUDIO_REQUEST_SET_MIN: // case AUDIO_REQUEST_SET_MAX: // case AUDIO_REQUEST_SET_RES: if (ADC_IF_SetRequest()) { USB_StatusInStage(); /* send Acknowledge */ goto out_class_ok; } break; } } #endif /* USB_AUDIO */ #if USB_CDC if ((SetupPacket.wIndex.WB.L == USB_CDC_CIF_NUM) || /* IF number correct? */ (SetupPacket.wIndex.WB.L == USB_CDC_DIF_NUM)) { switch (SetupPacket.bRequest) { case CDC_SEND_ENCAPSULATED_COMMAND: if (CDC_SendEncapsulatedCommand()) { USB_StatusInStage(); /* send Acknowledge */ goto out_class_ok; } break; case CDC_SET_COMM_FEATURE: if (CDC_SetCommFeature(SetupPacket.wValue.W)) { USB_StatusInStage(); /* send Acknowledge */ goto out_class_ok; } break; case CDC_SET_LINE_CODING: if (CDC_SetLineCoding()) { USB_StatusInStage(); /* send Acknowledge */ goto out_class_ok; } break; } } #endif /* USB_CDC */ goto stall_i; /* end case REQUEST_TO_INTERFACE */ case REQUEST_TO_ENDPOINT: #if USB_AUDIO switch (SetupPacket.bRequest) { case AUDIO_REQUEST_SET_CUR: // case AUDIO_REQUEST_SET_MIN: // case AUDIO_REQUEST_SET_MAX: // case AUDIO_REQUEST_SET_RES: if (ADC_EP_SetRequest()) { USB_StatusInStage(); /* send Acknowledge */ goto out_class_ok; } break; } #endif /* USB_AUDIO */ goto stall_i; /* end case REQUEST_TO_ENDPOINT */ default: goto stall_i; } out_class_ok: /* request finished successfully */ break; /* end case REQUEST_CLASS */ #endif /* USB_CLASS */ #if USB_VENDOR case REQUEST_VENDOR: switch (SetupPacket.bmRequestType.BM.Recipient) { case REQUEST_TO_DEVICE: if (!USB_ReqVendorDev(FALSE)) { goto stall_i; /* not supported */ } break; case REQUEST_TO_INTERFACE: if (!USB_ReqVendorIF(FALSE)) { goto stall_i; /* not supported */ } break; case REQUEST_TO_ENDPOINT: if (!USB_ReqVendorEP(FALSE)) { goto stall_i; /* not supported */ } break; default: goto stall_i; } USB_StatusInStage(); break; /* end case REQUEST_VENDOR */ #endif /* USB_VENDOR */ default: goto stall_i; } } } } else { USB_StatusOutStage(); /* receive Acknowledge */ } break; /* end case USB_EVT_OUT */ case USB_EVT_IN : if (SetupPacket.bmRequestType.BM.Dir == REQUEST_DEVICE_TO_HOST) { USB_DataInStage(); /* send data */ } else { if (USB_DeviceAddress & 0x80) { USB_DeviceAddress &= 0x7F; USB_SetAddress(USB_DeviceAddress); } } break; /* end case USB_EVT_IN */ case USB_EVT_OUT_STALL: USB_ClrStallEP(0x00); break; case USB_EVT_IN_STALL: USB_ClrStallEP(0x80); break; } }
void CDC_BulkOutNak(void) { USB_ReadReqEP(CDC_DEP_OUT, &BulkBufOut[0], 64); }