1 /*----------------------------------------------------------------------------
3 *----------------------------------------------------------------------------
5 * Purpose: USB Core Module
7 *----------------------------------------------------------------------------
8 * This software is supplied "AS IS" without any warranties, express,
9 * implied or statutory, including but not limited to the implied
10 * warranties of fitness for purpose, satisfactory quality and
11 * noninfringement. Keil extends you a royalty-free right to reproduce
12 * and distribute executable files created using this software for use
13 * on NXP Semiconductors LPC microcontroller devices only. Nothing else
14 * gives you the right to use this software.
16 * Copyright (c) 2009 Keil - An ARM Company. All rights reserved.
17 *----------------------------------------------------------------------------
19 * V1.20 Added vendor specific requests
20 * Changed string descriptor handling
22 * V1.00 Initial Version
23 *----------------------------------------------------------------------------*/
24 #include "projectconfig.h"
62 uint16_t USB_DeviceStatus
;
63 uint8_t USB_DeviceAddress
;
64 volatile uint8_t USB_Configuration
;
65 uint32_t USB_EndPointMask
;
66 uint32_t USB_EndPointHalt
;
67 uint32_t USB_EndPointStall
; /* EP must stay stalled */
68 uint8_t USB_NumInterfaces
;
69 uint8_t USB_AltSetting
[USB_IF_NUM
];
71 uint8_t EP0Buf
[USB_MAX_PACKET0
];
76 USB_SETUP_PACKET SetupPacket
;
85 void USB_ResetCore (void) {
87 USB_DeviceStatus
= USB_POWER
;
88 USB_DeviceAddress
= 0;
89 USB_Configuration
= 0;
90 USB_EndPointMask
= 0x00010001;
91 USB_EndPointHalt
= 0x00000000;
92 USB_EndPointStall
= 0x00000000;
97 * USB Request - Setup Stage
98 * Parameters: None (global SetupPacket)
102 void USB_SetupStage (void) {
103 USB_ReadEP(0x00, (uint8_t *)&SetupPacket
);
108 * USB Request - Data In Stage
109 * Parameters: None (global EP0Data)
113 void USB_DataInStage (void) {
116 if (EP0Data
.Count
> USB_MAX_PACKET0
) {
117 cnt
= USB_MAX_PACKET0
;
121 cnt
= USB_WriteEP(0x80, EP0Data
.pData
, cnt
);
122 EP0Data
.pData
+= cnt
;
123 EP0Data
.Count
-= cnt
;
128 * USB Request - Data Out Stage
129 * Parameters: None (global EP0Data)
133 void USB_DataOutStage (void) {
136 cnt
= USB_ReadEP(0x00, EP0Data
.pData
);
137 EP0Data
.pData
+= cnt
;
138 EP0Data
.Count
-= cnt
;
143 * USB Request - Status In Stage
148 void USB_StatusInStage (void) {
149 USB_WriteEP(0x80, NULL
, 0);
154 * USB Request - Status Out Stage
159 void USB_StatusOutStage (void) {
160 USB_ReadEP(0x00, EP0Buf
);
165 * Get Status USB Request
166 * Parameters: None (global SetupPacket)
167 * Return Value: TRUE - Success, FALSE - Error
170 static inline uint32_t USB_ReqGetStatus (void) {
172 uint16_t* ep0
= (uint16_t __attribute__((packed
)) *)EP0Buf
;
174 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
175 case REQUEST_TO_DEVICE
:
176 EP0Data
.pData
= (uint8_t *)&USB_DeviceStatus
;
178 case REQUEST_TO_INTERFACE
:
179 if ((USB_Configuration
!= 0) && (SetupPacket
.wIndex
.WB
.L
< USB_NumInterfaces
)) {
181 EP0Data
.pData
= EP0Buf
;
186 case REQUEST_TO_ENDPOINT
:
187 n
= SetupPacket
.wIndex
.WB
.L
& 0x8F;
188 m
= (n
& 0x80) ? ((1 << 16) << (n
& 0x0F)) : (1 << n
);
189 if (((USB_Configuration
!= 0) || ((n
& 0x0F) == 0)) && (USB_EndPointMask
& m
)) {
190 *ep0
= (USB_EndPointHalt
& m
) ? 1 : 0;
191 EP0Data
.pData
= EP0Buf
;
204 * Set/Clear Feature USB Request
205 * Parameters: sc: 0 - Clear, 1 - Set
206 * (global SetupPacket)
207 * Return Value: TRUE - Success, FALSE - Error
210 static inline uint32_t USB_ReqSetClrFeature (uint32_t sc
) {
213 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
214 case REQUEST_TO_DEVICE
:
215 if (SetupPacket
.wValue
.W
== USB_FEATURE_REMOTE_WAKEUP
) {
218 USB_DeviceStatus
|= USB_GETSTATUS_REMOTE_WAKEUP
;
220 USB_WakeUpCfg(FALSE
);
221 USB_DeviceStatus
&= ~USB_GETSTATUS_REMOTE_WAKEUP
;
227 case REQUEST_TO_INTERFACE
:
229 case REQUEST_TO_ENDPOINT
:
230 n
= SetupPacket
.wIndex
.WB
.L
& 0x8F;
231 m
= (n
& 0x80) ? ((1 << 16) << (n
& 0x0F)) : (1 << n
);
232 if ((USB_Configuration
!= 0) && ((n
& 0x0F) != 0) && (USB_EndPointMask
& m
)) {
233 if (SetupPacket
.wValue
.W
== USB_FEATURE_ENDPOINT_STALL
) {
236 USB_EndPointHalt
|= m
;
238 if ((USB_EndPointStall
& m
) != 0) {
243 if ((n
== MSC_EP_IN
) && ((USB_EndPointHalt
& m
) != 0)) {
244 /* Compliance Test: rewrite CSW after unstall */
245 if (CSW
.dSignature
== MSC_CSW_Signature
) {
246 USB_WriteEP(MSC_EP_IN
, (uint8_t *)&CSW
, sizeof(CSW
));
250 USB_EndPointHalt
&= ~m
;
267 * Set Address USB Request
268 * Parameters: None (global SetupPacket)
269 * Return Value: TRUE - Success, FALSE - Error
272 static inline uint32_t USB_ReqSetAddress (void) {
274 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
275 case REQUEST_TO_DEVICE
:
276 USB_DeviceAddress
= 0x80 | SetupPacket
.wValue
.WB
.L
;
286 * Get Descriptor USB Request
287 * Parameters: None (global SetupPacket)
288 * Return Value: TRUE - Success, FALSE - Error
291 static inline uint32_t USB_ReqGetDescriptor (void) {
295 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
296 case REQUEST_TO_DEVICE
:
297 switch (SetupPacket
.wValue
.WB
.H
) {
298 case USB_DEVICE_DESCRIPTOR_TYPE
:
299 EP0Data
.pData
= (uint8_t *)USB_DeviceDescriptor
;
300 len
= USB_DEVICE_DESC_SIZE
;
302 case USB_CONFIGURATION_DESCRIPTOR_TYPE
:
303 pD
= (uint8_t *)USB_ConfigDescriptor
;
304 for (n
= 0; n
!= SetupPacket
.wValue
.WB
.L
; n
++) {
305 if (((USB_CONFIGURATION_DESCRIPTOR
*)pD
)->bLength
!= 0) {
306 pD
+= ((USB_CONFIGURATION_DESCRIPTOR
*)pD
)->wTotalLength
;
309 if (((USB_CONFIGURATION_DESCRIPTOR
*)pD
)->bLength
== 0) {
313 len
= ((USB_CONFIGURATION_DESCRIPTOR
*)pD
)->wTotalLength
;
315 case USB_STRING_DESCRIPTOR_TYPE
:
316 pD
= (uint8_t *)USB_StringDescriptor
;
317 for (n
= 0; n
!= SetupPacket
.wValue
.WB
.L
; n
++) {
318 if (((USB_STRING_DESCRIPTOR
*)pD
)->bLength
!= 0) {
319 pD
+= ((USB_STRING_DESCRIPTOR
*)pD
)->bLength
;
322 if (((USB_STRING_DESCRIPTOR
*)pD
)->bLength
== 0) {
326 len
= ((USB_STRING_DESCRIPTOR
*)EP0Data
.pData
)->bLength
;
332 case REQUEST_TO_INTERFACE
:
333 switch (SetupPacket
.wValue
.WB
.H
) {
335 case HID_HID_DESCRIPTOR_TYPE
:
336 if (SetupPacket
.wIndex
.WB
.L
!= USB_HID_IF_NUM
) {
337 return (FALSE
); /* Only Single HID Interface is supported */
339 EP0Data
.pData
= (uint8_t *)USB_ConfigDescriptor
+ HID_DESC_OFFSET
;
342 case HID_REPORT_DESCRIPTOR_TYPE
:
343 if (SetupPacket
.wIndex
.WB
.L
!= USB_HID_IF_NUM
) {
344 return (FALSE
); /* Only Single HID Interface is supported */
346 EP0Data
.pData
= (uint8_t *)HID_ReportDescriptor
;
347 len
= HID_ReportDescSize
;
349 case HID_PHYSICAL_DESCRIPTOR_TYPE
:
350 return (FALSE
); /* HID Physical Descriptor is not supported */
360 if (EP0Data
.Count
> len
) {
368 * Get Configuration USB Request
369 * Parameters: None (global SetupPacket)
370 * Return Value: TRUE - Success, FALSE - Error
373 static inline uint32_t USB_ReqGetConfiguration (void) {
375 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
376 case REQUEST_TO_DEVICE
:
377 // Added cast to avoid warnings due to USB_Configuration being volatile (KTownsend)
378 EP0Data
.pData
= (uint8_t *)&USB_Configuration
;
387 * Set Configuration USB Request
388 * Parameters: None (global SetupPacket)
389 * Return Value: TRUE - Success, FALSE - Error
392 static inline uint32_t USB_ReqSetConfiguration (void) {
393 USB_COMMON_DESCRIPTOR
*pD
;
397 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
398 case REQUEST_TO_DEVICE
:
400 if (SetupPacket
.wValue
.WB
.L
) {
401 pD
= (USB_COMMON_DESCRIPTOR
*)USB_ConfigDescriptor
;
402 while (pD
->bLength
) {
403 switch (pD
->bDescriptorType
) {
404 case USB_CONFIGURATION_DESCRIPTOR_TYPE
:
405 if (((USB_CONFIGURATION_DESCRIPTOR
*)pD
)->bConfigurationValue
== SetupPacket
.wValue
.WB
.L
) {
406 USB_Configuration
= SetupPacket
.wValue
.WB
.L
;
407 USB_NumInterfaces
= ((USB_CONFIGURATION_DESCRIPTOR
*)pD
)->bNumInterfaces
;
408 for (n
= 0; n
< USB_IF_NUM
; n
++) {
409 USB_AltSetting
[n
] = 0;
411 for (n
= 1; n
< 16; n
++) {
412 if (USB_EndPointMask
& (1 << n
)) {
415 if (USB_EndPointMask
& ((1 << 16) << n
)) {
416 USB_DisableEP(n
| 0x80);
419 USB_EndPointMask
= 0x00010001;
420 USB_EndPointHalt
= 0x00000000;
421 USB_EndPointStall
= 0x00000000;
423 if (((USB_CONFIGURATION_DESCRIPTOR
*)pD
)->bmAttributes
& USB_CONFIG_POWERED_MASK
) {
424 USB_DeviceStatus
|= USB_GETSTATUS_SELF_POWERED
;
426 USB_DeviceStatus
&= ~USB_GETSTATUS_SELF_POWERED
;
429 UsbAddPtr((void **)&pD
, ((USB_CONFIGURATION_DESCRIPTOR
*)pD
)->wTotalLength
);
433 case USB_INTERFACE_DESCRIPTOR_TYPE
:
434 alt
= ((USB_INTERFACE_DESCRIPTOR
*)pD
)->bAlternateSetting
;
436 case USB_ENDPOINT_DESCRIPTOR_TYPE
:
438 n
= ((USB_ENDPOINT_DESCRIPTOR
*)pD
)->bEndpointAddress
& 0x8F;
439 m
= (n
& 0x80) ? ((1 << 16) << (n
& 0x0F)) : (1 << n
);
440 USB_EndPointMask
|= m
;
441 USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR
*)pD
);
447 UsbAddPtr((void **)&pD
, pD
->bLength
);
451 USB_Configuration
= 0;
452 for (n
= 1; n
< 16; n
++) {
453 if (USB_EndPointMask
& (1 << n
)) {
456 if (USB_EndPointMask
& ((1 << 16) << n
)) {
457 USB_DisableEP(n
| 0x80);
460 USB_EndPointMask
= 0x00010001;
461 USB_EndPointHalt
= 0x00000000;
462 USB_EndPointStall
= 0x00000000;
463 USB_Configure(FALSE
);
466 if (USB_Configuration
!= SetupPacket
.wValue
.WB
.L
) {
478 * Get Interface USB Request
479 * Parameters: None (global SetupPacket)
480 * Return Value: TRUE - Success, FALSE - Error
483 static inline uint32_t USB_ReqGetInterface (void) {
485 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
486 case REQUEST_TO_INTERFACE
:
487 if ((USB_Configuration
!= 0) && (SetupPacket
.wIndex
.WB
.L
< USB_NumInterfaces
)) {
488 EP0Data
.pData
= USB_AltSetting
+ SetupPacket
.wIndex
.WB
.L
;
501 * Set Interface USB Request
502 * Parameters: None (global SetupPacket)
503 * Return Value: TRUE - Success, FALSE - Error
506 static inline uint32_t USB_ReqSetInterface (void) {
507 USB_COMMON_DESCRIPTOR
*pD
;
508 uint32_t ifn
= 0, alt
= 0, old
= 0, msk
= 0;
512 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
513 case REQUEST_TO_INTERFACE
:
514 if (USB_Configuration
== 0) return (FALSE
);
516 pD
= (USB_COMMON_DESCRIPTOR
*)USB_ConfigDescriptor
;
517 while (pD
->bLength
) {
518 switch (pD
->bDescriptorType
) {
519 case USB_CONFIGURATION_DESCRIPTOR_TYPE
:
520 if (((USB_CONFIGURATION_DESCRIPTOR
*)pD
)->bConfigurationValue
!= USB_Configuration
) {
521 UsbAddPtr((void **)&pD
, ((USB_CONFIGURATION_DESCRIPTOR
*)pD
)->wTotalLength
);
525 case USB_INTERFACE_DESCRIPTOR_TYPE
:
526 ifn
= ((USB_INTERFACE_DESCRIPTOR
*)pD
)->bInterfaceNumber
;
527 alt
= ((USB_INTERFACE_DESCRIPTOR
*)pD
)->bAlternateSetting
;
529 if ((ifn
== SetupPacket
.wIndex
.WB
.L
) && (alt
== SetupPacket
.wValue
.WB
.L
)) {
531 old
= USB_AltSetting
[ifn
];
532 USB_AltSetting
[ifn
] = (uint8_t)alt
;
535 case USB_ENDPOINT_DESCRIPTOR_TYPE
:
536 if (ifn
== SetupPacket
.wIndex
.WB
.L
) {
537 n
= ((USB_ENDPOINT_DESCRIPTOR
*)pD
)->bEndpointAddress
& 0x8F;
538 m
= (n
& 0x80) ? ((1 << 16) << (n
& 0x0F)) : (1 << n
);
539 if (alt
== SetupPacket
.wValue
.WB
.L
) {
540 USB_EndPointMask
|= m
;
541 USB_EndPointHalt
&= ~m
;
542 USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR
*)pD
);
547 else if ((alt
== old
) && ((msk
& m
) == 0)) {
548 USB_EndPointMask
&= ~m
;
549 USB_EndPointHalt
&= ~m
;
555 UsbAddPtr((void **)&pD
, pD
->bLength
);
566 * USB Endpoint 0 Event Callback
571 void USB_EndPoint0 (uint32_t event
) {
576 USB_DirCtrlEP(SetupPacket
.bmRequestType
.BM
.Dir
);
577 EP0Data
.Count
= SetupPacket
.wLength
; /* Number of bytes to transfer */
578 switch (SetupPacket
.bmRequestType
.BM
.Type
) {
580 case REQUEST_STANDARD
:
581 switch (SetupPacket
.bRequest
) {
582 case USB_REQUEST_GET_STATUS
:
583 if (!USB_ReqGetStatus()) {
589 case USB_REQUEST_CLEAR_FEATURE
:
590 if (!USB_ReqSetClrFeature(0)) {
594 #if USB_FEATURE_EVENT
599 case USB_REQUEST_SET_FEATURE
:
600 if (!USB_ReqSetClrFeature(1)) {
604 #if USB_FEATURE_EVENT
609 case USB_REQUEST_SET_ADDRESS
:
610 if (!USB_ReqSetAddress()) {
616 case USB_REQUEST_GET_DESCRIPTOR
:
617 if (!USB_ReqGetDescriptor()) {
623 case USB_REQUEST_SET_DESCRIPTOR
:
624 /*stall_o:*/ USB_SetStallEP(0x00); /* not supported */
628 case USB_REQUEST_GET_CONFIGURATION
:
629 if (!USB_ReqGetConfiguration()) {
635 case USB_REQUEST_SET_CONFIGURATION
:
636 if (!USB_ReqSetConfiguration()) {
640 #if USB_CONFIGURE_EVENT
641 USB_Configure_Event();
645 case USB_REQUEST_GET_INTERFACE
:
646 if (!USB_ReqGetInterface()) {
652 case USB_REQUEST_SET_INTERFACE
:
653 if (!USB_ReqSetInterface()) {
657 #if USB_INTERFACE_EVENT
658 USB_Interface_Event();
665 break; /* end case REQUEST_STANDARD */
669 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
671 case REQUEST_TO_DEVICE
:
672 goto stall_i
; /* not supported */
674 case REQUEST_TO_INTERFACE
:
676 if (SetupPacket
.wIndex
.WB
.L
== USB_HID_IF_NUM
) { /* IF number correct? */
677 switch (SetupPacket
.bRequest
) {
678 case HID_REQUEST_GET_REPORT
:
679 if (HID_GetReport()) {
680 EP0Data
.pData
= EP0Buf
; /* point to data to be sent */
681 USB_DataInStage(); /* send requested data */
685 case HID_REQUEST_SET_REPORT
:
686 EP0Data
.pData
= EP0Buf
; /* data to be received */
688 case HID_REQUEST_GET_IDLE
:
690 EP0Data
.pData
= EP0Buf
; /* point to data to be sent */
691 USB_DataInStage(); /* send requested data */
695 case HID_REQUEST_SET_IDLE
:
697 USB_StatusInStage(); /* send Acknowledge */
701 case HID_REQUEST_GET_PROTOCOL
:
702 if (HID_GetProtocol()) {
703 EP0Data
.pData
= EP0Buf
; /* point to data to be sent */
704 USB_DataInStage(); /* send requested data */
708 case HID_REQUEST_SET_PROTOCOL
:
709 if (HID_SetProtocol()) {
710 USB_StatusInStage(); /* send Acknowledge */
718 if (SetupPacket
.wIndex
.WB
.L
== USB_MSC_IF_NUM
) { /* IF number correct? */
719 switch (SetupPacket
.bRequest
) {
720 case MSC_REQUEST_RESET
:
721 if ((SetupPacket
.wValue
.W
== 0) && /* RESET with invalid parameters -> STALL */
722 (SetupPacket
.wLength
== 0)) {
729 case MSC_REQUEST_GET_MAX_LUN
:
730 if ((SetupPacket
.wValue
.W
== 0) && /* GET_MAX_LUN with invalid parameters -> STALL */
731 (SetupPacket
.wLength
== 1)) {
732 if (MSC_GetMaxLUN()) {
733 EP0Data
.pData
= EP0Buf
;
743 if ((SetupPacket
.wIndex
.WB
.L
== USB_ADC_CIF_NUM
) || /* IF number correct? */
744 (SetupPacket
.wIndex
.WB
.L
== USB_ADC_SIF1_NUM
) ||
745 (SetupPacket
.wIndex
.WB
.L
== USB_ADC_SIF2_NUM
)) {
746 switch (SetupPacket
.bRequest
) {
747 case AUDIO_REQUEST_GET_CUR
:
748 case AUDIO_REQUEST_GET_MIN
:
749 case AUDIO_REQUEST_GET_MAX
:
750 case AUDIO_REQUEST_GET_RES
:
751 if (ADC_IF_GetRequest()) {
752 EP0Data
.pData
= EP0Buf
; /* point to data to be sent */
753 USB_DataInStage(); /* send requested data */
757 case AUDIO_REQUEST_SET_CUR
:
758 // case AUDIO_REQUEST_SET_MIN:
759 // case AUDIO_REQUEST_SET_MAX:
760 // case AUDIO_REQUEST_SET_RES:
761 EP0Data
.pData
= EP0Buf
; /* data to be received */
765 #endif /* USB_AUDIO */
767 if ((SetupPacket
.wIndex
.WB
.L
== USB_CDC_CIF_NUM
) || /* IF number correct? */
768 (SetupPacket
.wIndex
.WB
.L
== USB_CDC_DIF_NUM
)) {
769 switch (SetupPacket
.bRequest
) {
770 case CDC_SEND_ENCAPSULATED_COMMAND
:
771 EP0Data
.pData
= EP0Buf
; /* data to be received, see USB_EVT_OUT */
773 case CDC_GET_ENCAPSULATED_RESPONSE
:
774 if (CDC_GetEncapsulatedResponse()) {
775 EP0Data
.pData
= EP0Buf
; /* point to data to be sent */
776 USB_DataInStage(); /* send requested data */
780 case CDC_SET_COMM_FEATURE
:
781 EP0Data
.pData
= EP0Buf
; /* data to be received, see USB_EVT_OUT */
783 case CDC_GET_COMM_FEATURE
:
784 if (CDC_GetCommFeature(SetupPacket
.wValue
.W
)) {
785 EP0Data
.pData
= EP0Buf
; /* point to data to be sent */
786 USB_DataInStage(); /* send requested data */
790 case CDC_CLEAR_COMM_FEATURE
:
791 if (CDC_ClearCommFeature(SetupPacket
.wValue
.W
)) {
792 USB_StatusInStage(); /* send Acknowledge */
796 case CDC_SET_LINE_CODING
:
797 EP0Data
.pData
= EP0Buf
; /* data to be received, see USB_EVT_OUT */
799 case CDC_GET_LINE_CODING
:
800 if (CDC_GetLineCoding()) {
801 EP0Data
.pData
= EP0Buf
; /* point to data to be sent */
802 USB_DataInStage(); /* send requested data */
806 case CDC_SET_CONTROL_LINE_STATE
:
807 if (CDC_SetControlLineState(SetupPacket
.wValue
.W
)) {
808 USB_StatusInStage(); /* send Acknowledge */
813 if (CDC_SendBreak(SetupPacket
.wValue
.W
)) {
814 USB_StatusInStage(); /* send Acknowledge */
821 goto stall_i
; /* not supported */
822 /* end case REQUEST_TO_INTERFACE */
824 case REQUEST_TO_ENDPOINT
:
826 switch (SetupPacket
.bRequest
) {
827 case AUDIO_REQUEST_GET_CUR
:
828 case AUDIO_REQUEST_GET_MIN
:
829 case AUDIO_REQUEST_GET_MAX
:
830 case AUDIO_REQUEST_GET_RES
:
831 if (ADC_EP_GetRequest()) {
832 EP0Data
.pData
= EP0Buf
; /* point to data to be sent */
833 USB_DataInStage(); /* send requested data */
837 case AUDIO_REQUEST_SET_CUR
:
838 // case AUDIO_REQUEST_SET_MIN:
839 // case AUDIO_REQUEST_SET_MAX:
840 // case AUDIO_REQUEST_SET_RES:
841 EP0Data
.pData
= EP0Buf
; /* data to be received */
844 #endif /* USB_AUDIO */
846 /* end case REQUEST_TO_ENDPOINT */
851 setup_class_ok
: /* request finished successfully */
852 break; /* end case REQUEST_CLASS */
853 #endif /* USB_CLASS */
857 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
859 case REQUEST_TO_DEVICE
:
860 if (!USB_ReqVendorDev(TRUE
)) {
861 goto stall_i
; /* not supported */
865 case REQUEST_TO_INTERFACE
:
866 if (!USB_ReqVendorIF(TRUE
)) {
867 goto stall_i
; /* not supported */
871 case REQUEST_TO_ENDPOINT
:
872 if (!USB_ReqVendorEP(TRUE
)) {
873 goto stall_i
; /* not supported */
881 if (SetupPacket
.wLength
) {
882 if (SetupPacket
.bmRequestType
.BM
.Dir
== REQUEST_DEVICE_TO_HOST
) {
889 break; /* end case REQUEST_VENDOR */
890 #endif /* USB_VENDOR */
893 stall_i
: USB_SetStallEP(0x80);
897 break; /* end case USB_EVT_SETUP */
900 if (SetupPacket
.bmRequestType
.BM
.Dir
== REQUEST_HOST_TO_DEVICE
) {
901 if (EP0Data
.Count
) { /* still data to receive ? */
902 USB_DataOutStage(); /* receive data */
903 if (EP0Data
.Count
== 0) { /* data complete ? */
904 switch (SetupPacket
.bmRequestType
.BM
.Type
) {
906 case REQUEST_STANDARD
:
907 goto stall_i
; /* not supported */
911 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
912 case REQUEST_TO_DEVICE
:
913 goto stall_i
; /* not supported */
915 case REQUEST_TO_INTERFACE
:
917 if (SetupPacket
.wIndex
.WB
.L
== USB_HID_IF_NUM
) { /* IF number correct? */
918 switch (SetupPacket
.bRequest
) {
919 case HID_REQUEST_SET_REPORT
:
920 if (HID_SetReport()) {
921 USB_StatusInStage(); /* send Acknowledge */
929 if ((SetupPacket
.wIndex
.WB
.L
== USB_ADC_CIF_NUM
) || /* IF number correct? */
930 (SetupPacket
.wIndex
.WB
.L
== USB_ADC_SIF1_NUM
) ||
931 (SetupPacket
.wIndex
.WB
.L
== USB_ADC_SIF2_NUM
)) {
932 switch (SetupPacket
.bRequest
) {
933 case AUDIO_REQUEST_SET_CUR
:
934 // case AUDIO_REQUEST_SET_MIN:
935 // case AUDIO_REQUEST_SET_MAX:
936 // case AUDIO_REQUEST_SET_RES:
937 if (ADC_IF_SetRequest()) {
938 USB_StatusInStage(); /* send Acknowledge */
944 #endif /* USB_AUDIO */
946 if ((SetupPacket
.wIndex
.WB
.L
== USB_CDC_CIF_NUM
) || /* IF number correct? */
947 (SetupPacket
.wIndex
.WB
.L
== USB_CDC_DIF_NUM
)) {
948 switch (SetupPacket
.bRequest
) {
949 case CDC_SEND_ENCAPSULATED_COMMAND
:
950 if (CDC_SendEncapsulatedCommand()) {
951 USB_StatusInStage(); /* send Acknowledge */
955 case CDC_SET_COMM_FEATURE
:
956 if (CDC_SetCommFeature(SetupPacket
.wValue
.W
)) {
957 USB_StatusInStage(); /* send Acknowledge */
961 case CDC_SET_LINE_CODING
:
962 if (CDC_SetLineCoding()) {
963 USB_StatusInStage(); /* send Acknowledge */
971 /* end case REQUEST_TO_INTERFACE */
973 case REQUEST_TO_ENDPOINT
:
975 switch (SetupPacket
.bRequest
) {
976 case AUDIO_REQUEST_SET_CUR
:
977 // case AUDIO_REQUEST_SET_MIN:
978 // case AUDIO_REQUEST_SET_MAX:
979 // case AUDIO_REQUEST_SET_RES:
980 if (ADC_EP_SetRequest()) {
981 USB_StatusInStage(); /* send Acknowledge */
986 #endif /* USB_AUDIO */
988 /* end case REQUEST_TO_ENDPOINT */
993 out_class_ok
: /* request finished successfully */
994 break; /* end case REQUEST_CLASS */
995 #endif /* USB_CLASS */
999 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
1001 case REQUEST_TO_DEVICE
:
1002 if (!USB_ReqVendorDev(FALSE
)) {
1003 goto stall_i
; /* not supported */
1007 case REQUEST_TO_INTERFACE
:
1008 if (!USB_ReqVendorIF(FALSE
)) {
1009 goto stall_i
; /* not supported */
1013 case REQUEST_TO_ENDPOINT
:
1014 if (!USB_ReqVendorEP(FALSE
)) {
1015 goto stall_i
; /* not supported */
1023 USB_StatusInStage();
1025 break; /* end case REQUEST_VENDOR */
1026 #endif /* USB_VENDOR */
1034 USB_StatusOutStage(); /* receive Acknowledge */
1036 break; /* end case USB_EVT_OUT */
1039 if (SetupPacket
.bmRequestType
.BM
.Dir
== REQUEST_DEVICE_TO_HOST
) {
1040 USB_DataInStage(); /* send data */
1042 if (USB_DeviceAddress
& 0x80) {
1043 USB_DeviceAddress
&= 0x7F;
1044 USB_SetAddress(USB_DeviceAddress
);
1047 break; /* end case USB_EVT_IN */
1049 case USB_EVT_OUT_STALL
:
1050 USB_ClrStallEP(0x00);
1053 case USB_EVT_IN_STALL
:
1054 USB_ClrStallEP(0x80);