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) {
173 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
174 case REQUEST_TO_DEVICE
:
175 EP0Data
.pData
= (uint8_t *)&USB_DeviceStatus
;
177 case REQUEST_TO_INTERFACE
:
178 if ((USB_Configuration
!= 0) && (SetupPacket
.wIndex
.WB
.L
< USB_NumInterfaces
)) {
179 *((uint16_t __attribute__((packed
)) *)EP0Buf
) = 0;
180 EP0Data
.pData
= EP0Buf
;
185 case REQUEST_TO_ENDPOINT
:
186 n
= SetupPacket
.wIndex
.WB
.L
& 0x8F;
187 m
= (n
& 0x80) ? ((1 << 16) << (n
& 0x0F)) : (1 << n
);
188 if (((USB_Configuration
!= 0) || ((n
& 0x0F) == 0)) && (USB_EndPointMask
& m
)) {
189 *((uint16_t __attribute__((packed
)) *)EP0Buf
) = (USB_EndPointHalt
& m
) ? 1 : 0;
190 EP0Data
.pData
= EP0Buf
;
203 * Set/Clear Feature USB Request
204 * Parameters: sc: 0 - Clear, 1 - Set
205 * (global SetupPacket)
206 * Return Value: TRUE - Success, FALSE - Error
209 static inline uint32_t USB_ReqSetClrFeature (uint32_t sc
) {
212 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
213 case REQUEST_TO_DEVICE
:
214 if (SetupPacket
.wValue
.W
== USB_FEATURE_REMOTE_WAKEUP
) {
217 USB_DeviceStatus
|= USB_GETSTATUS_REMOTE_WAKEUP
;
219 USB_WakeUpCfg(FALSE
);
220 USB_DeviceStatus
&= ~USB_GETSTATUS_REMOTE_WAKEUP
;
226 case REQUEST_TO_INTERFACE
:
228 case REQUEST_TO_ENDPOINT
:
229 n
= SetupPacket
.wIndex
.WB
.L
& 0x8F;
230 m
= (n
& 0x80) ? ((1 << 16) << (n
& 0x0F)) : (1 << n
);
231 if ((USB_Configuration
!= 0) && ((n
& 0x0F) != 0) && (USB_EndPointMask
& m
)) {
232 if (SetupPacket
.wValue
.W
== USB_FEATURE_ENDPOINT_STALL
) {
235 USB_EndPointHalt
|= m
;
237 if ((USB_EndPointStall
& m
) != 0) {
242 if ((n
== MSC_EP_IN
) && ((USB_EndPointHalt
& m
) != 0)) {
243 /* Compliance Test: rewrite CSW after unstall */
244 if (CSW
.dSignature
== MSC_CSW_Signature
) {
245 USB_WriteEP(MSC_EP_IN
, (uint8_t *)&CSW
, sizeof(CSW
));
249 USB_EndPointHalt
&= ~m
;
266 * Set Address USB Request
267 * Parameters: None (global SetupPacket)
268 * Return Value: TRUE - Success, FALSE - Error
271 static inline uint32_t USB_ReqSetAddress (void) {
273 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
274 case REQUEST_TO_DEVICE
:
275 USB_DeviceAddress
= 0x80 | SetupPacket
.wValue
.WB
.L
;
285 * Get Descriptor USB Request
286 * Parameters: None (global SetupPacket)
287 * Return Value: TRUE - Success, FALSE - Error
290 static inline uint32_t USB_ReqGetDescriptor (void) {
294 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
295 case REQUEST_TO_DEVICE
:
296 switch (SetupPacket
.wValue
.WB
.H
) {
297 case USB_DEVICE_DESCRIPTOR_TYPE
:
298 EP0Data
.pData
= (uint8_t *)USB_DeviceDescriptor
;
299 len
= USB_DEVICE_DESC_SIZE
;
301 case USB_CONFIGURATION_DESCRIPTOR_TYPE
:
302 pD
= (uint8_t *)USB_ConfigDescriptor
;
303 for (n
= 0; n
!= SetupPacket
.wValue
.WB
.L
; n
++) {
304 if (((USB_CONFIGURATION_DESCRIPTOR
*)pD
)->bLength
!= 0) {
305 pD
+= ((USB_CONFIGURATION_DESCRIPTOR
*)pD
)->wTotalLength
;
308 if (((USB_CONFIGURATION_DESCRIPTOR
*)pD
)->bLength
== 0) {
312 len
= ((USB_CONFIGURATION_DESCRIPTOR
*)pD
)->wTotalLength
;
314 case USB_STRING_DESCRIPTOR_TYPE
:
315 pD
= (uint8_t *)USB_StringDescriptor
;
316 for (n
= 0; n
!= SetupPacket
.wValue
.WB
.L
; n
++) {
317 if (((USB_STRING_DESCRIPTOR
*)pD
)->bLength
!= 0) {
318 pD
+= ((USB_STRING_DESCRIPTOR
*)pD
)->bLength
;
321 if (((USB_STRING_DESCRIPTOR
*)pD
)->bLength
== 0) {
325 len
= ((USB_STRING_DESCRIPTOR
*)EP0Data
.pData
)->bLength
;
331 case REQUEST_TO_INTERFACE
:
332 switch (SetupPacket
.wValue
.WB
.H
) {
334 case HID_HID_DESCRIPTOR_TYPE
:
335 if (SetupPacket
.wIndex
.WB
.L
!= USB_HID_IF_NUM
) {
336 return (FALSE
); /* Only Single HID Interface is supported */
338 EP0Data
.pData
= (uint8_t *)USB_ConfigDescriptor
+ HID_DESC_OFFSET
;
341 case HID_REPORT_DESCRIPTOR_TYPE
:
342 if (SetupPacket
.wIndex
.WB
.L
!= USB_HID_IF_NUM
) {
343 return (FALSE
); /* Only Single HID Interface is supported */
345 EP0Data
.pData
= (uint8_t *)HID_ReportDescriptor
;
346 len
= HID_ReportDescSize
;
348 case HID_PHYSICAL_DESCRIPTOR_TYPE
:
349 return (FALSE
); /* HID Physical Descriptor is not supported */
359 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
;
379 //EP0Data.pData = &USB_Configuration;
388 * Set Configuration USB Request
389 * Parameters: None (global SetupPacket)
390 * Return Value: TRUE - Success, FALSE - Error
393 static inline uint32_t USB_ReqSetConfiguration (void) {
394 USB_COMMON_DESCRIPTOR
*pD
;
398 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
399 case REQUEST_TO_DEVICE
:
401 if (SetupPacket
.wValue
.WB
.L
) {
402 pD
= (USB_COMMON_DESCRIPTOR
*)USB_ConfigDescriptor
;
403 while (pD
->bLength
) {
404 switch (pD
->bDescriptorType
) {
405 case USB_CONFIGURATION_DESCRIPTOR_TYPE
:
406 if (((USB_CONFIGURATION_DESCRIPTOR
*)pD
)->bConfigurationValue
== SetupPacket
.wValue
.WB
.L
) {
407 USB_Configuration
= SetupPacket
.wValue
.WB
.L
;
408 USB_NumInterfaces
= ((USB_CONFIGURATION_DESCRIPTOR
*)pD
)->bNumInterfaces
;
409 for (n
= 0; n
< USB_IF_NUM
; n
++) {
410 USB_AltSetting
[n
] = 0;
412 for (n
= 1; n
< 16; n
++) {
413 if (USB_EndPointMask
& (1 << n
)) {
416 if (USB_EndPointMask
& ((1 << 16) << n
)) {
417 USB_DisableEP(n
| 0x80);
420 USB_EndPointMask
= 0x00010001;
421 USB_EndPointHalt
= 0x00000000;
422 USB_EndPointStall
= 0x00000000;
424 if (((USB_CONFIGURATION_DESCRIPTOR
*)pD
)->bmAttributes
& USB_CONFIG_POWERED_MASK
) {
425 USB_DeviceStatus
|= USB_GETSTATUS_SELF_POWERED
;
427 USB_DeviceStatus
&= ~USB_GETSTATUS_SELF_POWERED
;
430 UsbAddPtr((void **)&pD
, ((USB_CONFIGURATION_DESCRIPTOR
*)pD
)->wTotalLength
);
434 case USB_INTERFACE_DESCRIPTOR_TYPE
:
435 alt
= ((USB_INTERFACE_DESCRIPTOR
*)pD
)->bAlternateSetting
;
437 case USB_ENDPOINT_DESCRIPTOR_TYPE
:
439 n
= ((USB_ENDPOINT_DESCRIPTOR
*)pD
)->bEndpointAddress
& 0x8F;
440 m
= (n
& 0x80) ? ((1 << 16) << (n
& 0x0F)) : (1 << n
);
441 USB_EndPointMask
|= m
;
442 USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR
*)pD
);
448 UsbAddPtr((void **)&pD
, pD
->bLength
);
452 USB_Configuration
= 0;
453 for (n
= 1; n
< 16; n
++) {
454 if (USB_EndPointMask
& (1 << n
)) {
457 if (USB_EndPointMask
& ((1 << 16) << n
)) {
458 USB_DisableEP(n
| 0x80);
461 USB_EndPointMask
= 0x00010001;
462 USB_EndPointHalt
= 0x00000000;
463 USB_EndPointStall
= 0x00000000;
464 USB_Configure(FALSE
);
467 if (USB_Configuration
!= SetupPacket
.wValue
.WB
.L
) {
479 * Get Interface USB Request
480 * Parameters: None (global SetupPacket)
481 * Return Value: TRUE - Success, FALSE - Error
484 static inline uint32_t USB_ReqGetInterface (void) {
486 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
487 case REQUEST_TO_INTERFACE
:
488 if ((USB_Configuration
!= 0) && (SetupPacket
.wIndex
.WB
.L
< USB_NumInterfaces
)) {
489 EP0Data
.pData
= USB_AltSetting
+ SetupPacket
.wIndex
.WB
.L
;
502 * Set Interface USB Request
503 * Parameters: None (global SetupPacket)
504 * Return Value: TRUE - Success, FALSE - Error
507 static inline uint32_t USB_ReqSetInterface (void) {
508 USB_COMMON_DESCRIPTOR
*pD
;
509 uint32_t ifn
= 0, alt
= 0, old
= 0, msk
= 0;
513 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
514 case REQUEST_TO_INTERFACE
:
515 if (USB_Configuration
== 0) return (FALSE
);
517 pD
= (USB_COMMON_DESCRIPTOR
*)USB_ConfigDescriptor
;
518 while (pD
->bLength
) {
519 switch (pD
->bDescriptorType
) {
520 case USB_CONFIGURATION_DESCRIPTOR_TYPE
:
521 if (((USB_CONFIGURATION_DESCRIPTOR
*)pD
)->bConfigurationValue
!= USB_Configuration
) {
522 UsbAddPtr((void **)&pD
, ((USB_CONFIGURATION_DESCRIPTOR
*)pD
)->wTotalLength
);
526 case USB_INTERFACE_DESCRIPTOR_TYPE
:
527 ifn
= ((USB_INTERFACE_DESCRIPTOR
*)pD
)->bInterfaceNumber
;
528 alt
= ((USB_INTERFACE_DESCRIPTOR
*)pD
)->bAlternateSetting
;
530 if ((ifn
== SetupPacket
.wIndex
.WB
.L
) && (alt
== SetupPacket
.wValue
.WB
.L
)) {
532 old
= USB_AltSetting
[ifn
];
533 USB_AltSetting
[ifn
] = (uint8_t)alt
;
536 case USB_ENDPOINT_DESCRIPTOR_TYPE
:
537 if (ifn
== SetupPacket
.wIndex
.WB
.L
) {
538 n
= ((USB_ENDPOINT_DESCRIPTOR
*)pD
)->bEndpointAddress
& 0x8F;
539 m
= (n
& 0x80) ? ((1 << 16) << (n
& 0x0F)) : (1 << n
);
540 if (alt
== SetupPacket
.wValue
.WB
.L
) {
541 USB_EndPointMask
|= m
;
542 USB_EndPointHalt
&= ~m
;
543 USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR
*)pD
);
548 else if ((alt
== old
) && ((msk
& m
) == 0)) {
549 USB_EndPointMask
&= ~m
;
550 USB_EndPointHalt
&= ~m
;
556 UsbAddPtr((void **)&pD
, pD
->bLength
);
568 * USB Endpoint 0 Event Callback
573 void USB_EndPoint0 (uint32_t event
) {
578 USB_DirCtrlEP(SetupPacket
.bmRequestType
.BM
.Dir
);
579 EP0Data
.Count
= SetupPacket
.wLength
; /* Number of bytes to transfer */
580 switch (SetupPacket
.bmRequestType
.BM
.Type
) {
582 case REQUEST_STANDARD
:
583 switch (SetupPacket
.bRequest
) {
584 case USB_REQUEST_GET_STATUS
:
585 if (!USB_ReqGetStatus()) {
591 case USB_REQUEST_CLEAR_FEATURE
:
592 if (!USB_ReqSetClrFeature(0)) {
596 #if USB_FEATURE_EVENT
601 case USB_REQUEST_SET_FEATURE
:
602 if (!USB_ReqSetClrFeature(1)) {
606 #if USB_FEATURE_EVENT
611 case USB_REQUEST_SET_ADDRESS
:
612 if (!USB_ReqSetAddress()) {
618 case USB_REQUEST_GET_DESCRIPTOR
:
619 if (!USB_ReqGetDescriptor()) {
625 case USB_REQUEST_SET_DESCRIPTOR
:
626 /*stall_o:*/ USB_SetStallEP(0x00); /* not supported */
630 case USB_REQUEST_GET_CONFIGURATION
:
631 if (!USB_ReqGetConfiguration()) {
637 case USB_REQUEST_SET_CONFIGURATION
:
638 if (!USB_ReqSetConfiguration()) {
642 #if USB_CONFIGURE_EVENT
643 USB_Configure_Event();
647 case USB_REQUEST_GET_INTERFACE
:
648 if (!USB_ReqGetInterface()) {
654 case USB_REQUEST_SET_INTERFACE
:
655 if (!USB_ReqSetInterface()) {
659 #if USB_INTERFACE_EVENT
660 USB_Interface_Event();
667 break; /* end case REQUEST_STANDARD */
671 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
673 case REQUEST_TO_DEVICE
:
674 goto stall_i
; /* not supported */
676 case REQUEST_TO_INTERFACE
:
678 if (SetupPacket
.wIndex
.WB
.L
== USB_HID_IF_NUM
) { /* IF number correct? */
679 switch (SetupPacket
.bRequest
) {
680 case HID_REQUEST_GET_REPORT
:
681 if (HID_GetReport()) {
682 EP0Data
.pData
= EP0Buf
; /* point to data to be sent */
683 USB_DataInStage(); /* send requested data */
687 case HID_REQUEST_SET_REPORT
:
688 EP0Data
.pData
= EP0Buf
; /* data to be received */
690 case HID_REQUEST_GET_IDLE
:
692 EP0Data
.pData
= EP0Buf
; /* point to data to be sent */
693 USB_DataInStage(); /* send requested data */
697 case HID_REQUEST_SET_IDLE
:
699 USB_StatusInStage(); /* send Acknowledge */
703 case HID_REQUEST_GET_PROTOCOL
:
704 if (HID_GetProtocol()) {
705 EP0Data
.pData
= EP0Buf
; /* point to data to be sent */
706 USB_DataInStage(); /* send requested data */
710 case HID_REQUEST_SET_PROTOCOL
:
711 if (HID_SetProtocol()) {
712 USB_StatusInStage(); /* send Acknowledge */
720 if (SetupPacket
.wIndex
.WB
.L
== USB_MSC_IF_NUM
) { /* IF number correct? */
721 switch (SetupPacket
.bRequest
) {
722 case MSC_REQUEST_RESET
:
723 if ((SetupPacket
.wValue
.W
== 0) && /* RESET with invalid parameters -> STALL */
724 (SetupPacket
.wLength
== 0)) {
731 case MSC_REQUEST_GET_MAX_LUN
:
732 if ((SetupPacket
.wValue
.W
== 0) && /* GET_MAX_LUN with invalid parameters -> STALL */
733 (SetupPacket
.wLength
== 1)) {
734 if (MSC_GetMaxLUN()) {
735 EP0Data
.pData
= EP0Buf
;
745 if ((SetupPacket
.wIndex
.WB
.L
== USB_ADC_CIF_NUM
) || /* IF number correct? */
746 (SetupPacket
.wIndex
.WB
.L
== USB_ADC_SIF1_NUM
) ||
747 (SetupPacket
.wIndex
.WB
.L
== USB_ADC_SIF2_NUM
)) {
748 switch (SetupPacket
.bRequest
) {
749 case AUDIO_REQUEST_GET_CUR
:
750 case AUDIO_REQUEST_GET_MIN
:
751 case AUDIO_REQUEST_GET_MAX
:
752 case AUDIO_REQUEST_GET_RES
:
753 if (ADC_IF_GetRequest()) {
754 EP0Data
.pData
= EP0Buf
; /* point to data to be sent */
755 USB_DataInStage(); /* send requested data */
759 case AUDIO_REQUEST_SET_CUR
:
760 // case AUDIO_REQUEST_SET_MIN:
761 // case AUDIO_REQUEST_SET_MAX:
762 // case AUDIO_REQUEST_SET_RES:
763 EP0Data
.pData
= EP0Buf
; /* data to be received */
767 #endif /* USB_AUDIO */
769 if ((SetupPacket
.wIndex
.WB
.L
== USB_CDC_CIF_NUM
) || /* IF number correct? */
770 (SetupPacket
.wIndex
.WB
.L
== USB_CDC_DIF_NUM
)) {
771 switch (SetupPacket
.bRequest
) {
772 case CDC_SEND_ENCAPSULATED_COMMAND
:
773 EP0Data
.pData
= EP0Buf
; /* data to be received, see USB_EVT_OUT */
775 case CDC_GET_ENCAPSULATED_RESPONSE
:
776 if (CDC_GetEncapsulatedResponse()) {
777 EP0Data
.pData
= EP0Buf
; /* point to data to be sent */
778 USB_DataInStage(); /* send requested data */
782 case CDC_SET_COMM_FEATURE
:
783 EP0Data
.pData
= EP0Buf
; /* data to be received, see USB_EVT_OUT */
785 case CDC_GET_COMM_FEATURE
:
786 if (CDC_GetCommFeature(SetupPacket
.wValue
.W
)) {
787 EP0Data
.pData
= EP0Buf
; /* point to data to be sent */
788 USB_DataInStage(); /* send requested data */
792 case CDC_CLEAR_COMM_FEATURE
:
793 if (CDC_ClearCommFeature(SetupPacket
.wValue
.W
)) {
794 USB_StatusInStage(); /* send Acknowledge */
798 case CDC_SET_LINE_CODING
:
799 EP0Data
.pData
= EP0Buf
; /* data to be received, see USB_EVT_OUT */
801 case CDC_GET_LINE_CODING
:
802 if (CDC_GetLineCoding()) {
803 EP0Data
.pData
= EP0Buf
; /* point to data to be sent */
804 USB_DataInStage(); /* send requested data */
808 case CDC_SET_CONTROL_LINE_STATE
:
809 if (CDC_SetControlLineState(SetupPacket
.wValue
.W
)) {
810 USB_StatusInStage(); /* send Acknowledge */
815 if (CDC_SendBreak(SetupPacket
.wValue
.W
)) {
816 USB_StatusInStage(); /* send Acknowledge */
823 goto stall_i
; /* not supported */
824 /* end case REQUEST_TO_INTERFACE */
826 case REQUEST_TO_ENDPOINT
:
828 switch (SetupPacket
.bRequest
) {
829 case AUDIO_REQUEST_GET_CUR
:
830 case AUDIO_REQUEST_GET_MIN
:
831 case AUDIO_REQUEST_GET_MAX
:
832 case AUDIO_REQUEST_GET_RES
:
833 if (ADC_EP_GetRequest()) {
834 EP0Data
.pData
= EP0Buf
; /* point to data to be sent */
835 USB_DataInStage(); /* send requested data */
839 case AUDIO_REQUEST_SET_CUR
:
840 // case AUDIO_REQUEST_SET_MIN:
841 // case AUDIO_REQUEST_SET_MAX:
842 // case AUDIO_REQUEST_SET_RES:
843 EP0Data
.pData
= EP0Buf
; /* data to be received */
846 #endif /* USB_AUDIO */
848 /* end case REQUEST_TO_ENDPOINT */
853 setup_class_ok
: /* request finished successfully */
854 break; /* end case REQUEST_CLASS */
855 #endif /* USB_CLASS */
859 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
861 case REQUEST_TO_DEVICE
:
862 if (!USB_ReqVendorDev(TRUE
)) {
863 goto stall_i
; /* not supported */
867 case REQUEST_TO_INTERFACE
:
868 if (!USB_ReqVendorIF(TRUE
)) {
869 goto stall_i
; /* not supported */
873 case REQUEST_TO_ENDPOINT
:
874 if (!USB_ReqVendorEP(TRUE
)) {
875 goto stall_i
; /* not supported */
883 if (SetupPacket
.wLength
) {
884 if (SetupPacket
.bmRequestType
.BM
.Dir
== REQUEST_DEVICE_TO_HOST
) {
891 break; /* end case REQUEST_VENDOR */
892 #endif /* USB_VENDOR */
895 stall_i
: USB_SetStallEP(0x80);
899 break; /* end case USB_EVT_SETUP */
902 if (SetupPacket
.bmRequestType
.BM
.Dir
== REQUEST_HOST_TO_DEVICE
) {
903 if (EP0Data
.Count
) { /* still data to receive ? */
904 USB_DataOutStage(); /* receive data */
905 if (EP0Data
.Count
== 0) { /* data complete ? */
906 switch (SetupPacket
.bmRequestType
.BM
.Type
) {
908 case REQUEST_STANDARD
:
909 goto stall_i
; /* not supported */
913 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
914 case REQUEST_TO_DEVICE
:
915 goto stall_i
; /* not supported */
917 case REQUEST_TO_INTERFACE
:
919 if (SetupPacket
.wIndex
.WB
.L
== USB_HID_IF_NUM
) { /* IF number correct? */
920 switch (SetupPacket
.bRequest
) {
921 case HID_REQUEST_SET_REPORT
:
922 if (HID_SetReport()) {
923 USB_StatusInStage(); /* send Acknowledge */
931 if ((SetupPacket
.wIndex
.WB
.L
== USB_ADC_CIF_NUM
) || /* IF number correct? */
932 (SetupPacket
.wIndex
.WB
.L
== USB_ADC_SIF1_NUM
) ||
933 (SetupPacket
.wIndex
.WB
.L
== USB_ADC_SIF2_NUM
)) {
934 switch (SetupPacket
.bRequest
) {
935 case AUDIO_REQUEST_SET_CUR
:
936 // case AUDIO_REQUEST_SET_MIN:
937 // case AUDIO_REQUEST_SET_MAX:
938 // case AUDIO_REQUEST_SET_RES:
939 if (ADC_IF_SetRequest()) {
940 USB_StatusInStage(); /* send Acknowledge */
946 #endif /* USB_AUDIO */
948 if ((SetupPacket
.wIndex
.WB
.L
== USB_CDC_CIF_NUM
) || /* IF number correct? */
949 (SetupPacket
.wIndex
.WB
.L
== USB_CDC_DIF_NUM
)) {
950 switch (SetupPacket
.bRequest
) {
951 case CDC_SEND_ENCAPSULATED_COMMAND
:
952 if (CDC_SendEncapsulatedCommand()) {
953 USB_StatusInStage(); /* send Acknowledge */
957 case CDC_SET_COMM_FEATURE
:
958 if (CDC_SetCommFeature(SetupPacket
.wValue
.W
)) {
959 USB_StatusInStage(); /* send Acknowledge */
963 case CDC_SET_LINE_CODING
:
964 if (CDC_SetLineCoding()) {
965 USB_StatusInStage(); /* send Acknowledge */
973 /* end case REQUEST_TO_INTERFACE */
975 case REQUEST_TO_ENDPOINT
:
977 switch (SetupPacket
.bRequest
) {
978 case AUDIO_REQUEST_SET_CUR
:
979 // case AUDIO_REQUEST_SET_MIN:
980 // case AUDIO_REQUEST_SET_MAX:
981 // case AUDIO_REQUEST_SET_RES:
982 if (ADC_EP_SetRequest()) {
983 USB_StatusInStage(); /* send Acknowledge */
988 #endif /* USB_AUDIO */
990 /* end case REQUEST_TO_ENDPOINT */
995 out_class_ok
: /* request finished successfully */
996 break; /* end case REQUEST_CLASS */
997 #endif /* USB_CLASS */
1000 case REQUEST_VENDOR
:
1001 switch (SetupPacket
.bmRequestType
.BM
.Recipient
) {
1003 case REQUEST_TO_DEVICE
:
1004 if (!USB_ReqVendorDev(FALSE
)) {
1005 goto stall_i
; /* not supported */
1009 case REQUEST_TO_INTERFACE
:
1010 if (!USB_ReqVendorIF(FALSE
)) {
1011 goto stall_i
; /* not supported */
1015 case REQUEST_TO_ENDPOINT
:
1016 if (!USB_ReqVendorEP(FALSE
)) {
1017 goto stall_i
; /* not supported */
1025 USB_StatusInStage();
1027 break; /* end case REQUEST_VENDOR */
1028 #endif /* USB_VENDOR */
1036 USB_StatusOutStage(); /* receive Acknowledge */
1038 break; /* end case USB_EVT_OUT */
1041 if (SetupPacket
.bmRequestType
.BM
.Dir
== REQUEST_DEVICE_TO_HOST
) {
1042 USB_DataInStage(); /* send data */
1044 if (USB_DeviceAddress
& 0x80) {
1045 USB_DeviceAddress
&= 0x7F;
1046 USB_SetAddress(USB_DeviceAddress
);
1049 break; /* end case USB_EVT_IN */
1051 case USB_EVT_OUT_STALL
:
1052 USB_ClrStallEP(0x00);
1055 case USB_EVT_IN_STALL
:
1056 USB_ClrStallEP(0x80);