📄 usbcore.c
字号:
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:
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;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -