These are the examples provided for [[/users/frank26080115/libraries/LPC1700CMSIS_Lib/]] Note, the entire "program" is not compilable!
USBDEV/USBCDC/usbcore.c@0:bf7b9fba3924, 2011-03-20 (annotated)
- Committer:
- frank26080115
- Date:
- Sun Mar 20 05:38:56 2011 +0000
- Revision:
- 0:bf7b9fba3924
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
frank26080115 | 0:bf7b9fba3924 | 1 | /*---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 2 | * U S B - K e r n e l |
frank26080115 | 0:bf7b9fba3924 | 3 | *---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 4 | * Name: usbcore.c |
frank26080115 | 0:bf7b9fba3924 | 5 | * Purpose: USB Core Module |
frank26080115 | 0:bf7b9fba3924 | 6 | * Version: V1.20 |
frank26080115 | 0:bf7b9fba3924 | 7 | *---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 8 | * This software is supplied "AS IS" without any warranties, express, |
frank26080115 | 0:bf7b9fba3924 | 9 | * implied or statutory, including but not limited to the implied |
frank26080115 | 0:bf7b9fba3924 | 10 | * warranties of fitness for purpose, satisfactory quality and |
frank26080115 | 0:bf7b9fba3924 | 11 | * noninfringement. Keil extends you a royalty-free right to reproduce |
frank26080115 | 0:bf7b9fba3924 | 12 | * and distribute executable files created using this software for use |
frank26080115 | 0:bf7b9fba3924 | 13 | * on NXP Semiconductors LPC family microcontroller devices only. Nothing |
frank26080115 | 0:bf7b9fba3924 | 14 | * else gives you the right to use this software. |
frank26080115 | 0:bf7b9fba3924 | 15 | * |
frank26080115 | 0:bf7b9fba3924 | 16 | * Copyright (c) 2009 Keil - An ARM Company. All rights reserved. |
frank26080115 | 0:bf7b9fba3924 | 17 | *---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 18 | * History: |
frank26080115 | 0:bf7b9fba3924 | 19 | * V1.20 Added vendor specific requests |
frank26080115 | 0:bf7b9fba3924 | 20 | * Changed string descriptor handling |
frank26080115 | 0:bf7b9fba3924 | 21 | * Reworked Endpoint0 |
frank26080115 | 0:bf7b9fba3924 | 22 | * V1.00 Initial Version |
frank26080115 | 0:bf7b9fba3924 | 23 | *----------------------------------------------------------------------------*/ |
frank26080115 | 0:bf7b9fba3924 | 24 | #include "lpc_types.h" |
frank26080115 | 0:bf7b9fba3924 | 25 | |
frank26080115 | 0:bf7b9fba3924 | 26 | #include "usb.h" |
frank26080115 | 0:bf7b9fba3924 | 27 | #include "usbcfg.h" |
frank26080115 | 0:bf7b9fba3924 | 28 | #include "usbhw.h" |
frank26080115 | 0:bf7b9fba3924 | 29 | #include "usbcore.h" |
frank26080115 | 0:bf7b9fba3924 | 30 | #include "usbdesc.h" |
frank26080115 | 0:bf7b9fba3924 | 31 | #include "usbuser.h" |
frank26080115 | 0:bf7b9fba3924 | 32 | |
frank26080115 | 0:bf7b9fba3924 | 33 | #if (USB_CLASS) |
frank26080115 | 0:bf7b9fba3924 | 34 | |
frank26080115 | 0:bf7b9fba3924 | 35 | #if (USB_AUDIO) |
frank26080115 | 0:bf7b9fba3924 | 36 | #include "audio.h" |
frank26080115 | 0:bf7b9fba3924 | 37 | #include "adcuser.h" |
frank26080115 | 0:bf7b9fba3924 | 38 | #endif |
frank26080115 | 0:bf7b9fba3924 | 39 | |
frank26080115 | 0:bf7b9fba3924 | 40 | #if (USB_HID) |
frank26080115 | 0:bf7b9fba3924 | 41 | #include "hid.h" |
frank26080115 | 0:bf7b9fba3924 | 42 | #include "hiduser.h" |
frank26080115 | 0:bf7b9fba3924 | 43 | #endif |
frank26080115 | 0:bf7b9fba3924 | 44 | |
frank26080115 | 0:bf7b9fba3924 | 45 | #if (USB_MSC) |
frank26080115 | 0:bf7b9fba3924 | 46 | #include "msc.h" |
frank26080115 | 0:bf7b9fba3924 | 47 | #include "mscuser.h" |
frank26080115 | 0:bf7b9fba3924 | 48 | extern MSC_CSW CSW; |
frank26080115 | 0:bf7b9fba3924 | 49 | #endif |
frank26080115 | 0:bf7b9fba3924 | 50 | |
frank26080115 | 0:bf7b9fba3924 | 51 | #if (USB_CDC) |
frank26080115 | 0:bf7b9fba3924 | 52 | #include "cdc.h" |
frank26080115 | 0:bf7b9fba3924 | 53 | #include "cdcuser.h" |
frank26080115 | 0:bf7b9fba3924 | 54 | #endif |
frank26080115 | 0:bf7b9fba3924 | 55 | |
frank26080115 | 0:bf7b9fba3924 | 56 | #endif |
frank26080115 | 0:bf7b9fba3924 | 57 | |
frank26080115 | 0:bf7b9fba3924 | 58 | #if (USB_VENDOR) |
frank26080115 | 0:bf7b9fba3924 | 59 | #include "vendor.h" |
frank26080115 | 0:bf7b9fba3924 | 60 | #endif |
frank26080115 | 0:bf7b9fba3924 | 61 | |
frank26080115 | 0:bf7b9fba3924 | 62 | #if defined ( __CC_ARM ) |
frank26080115 | 0:bf7b9fba3924 | 63 | #pragma diag_suppress 111,1441 |
frank26080115 | 0:bf7b9fba3924 | 64 | #endif |
frank26080115 | 0:bf7b9fba3924 | 65 | |
frank26080115 | 0:bf7b9fba3924 | 66 | #if defined ( __GNUC__ ) |
frank26080115 | 0:bf7b9fba3924 | 67 | #define __packed __attribute__((__packed__)) |
frank26080115 | 0:bf7b9fba3924 | 68 | #endif |
frank26080115 | 0:bf7b9fba3924 | 69 | |
frank26080115 | 0:bf7b9fba3924 | 70 | uint16_t USB_DeviceStatus; |
frank26080115 | 0:bf7b9fba3924 | 71 | uint8_t USB_DeviceAddress; |
frank26080115 | 0:bf7b9fba3924 | 72 | uint8_t USB_Configuration; |
frank26080115 | 0:bf7b9fba3924 | 73 | uint32_t USB_EndPointMask; |
frank26080115 | 0:bf7b9fba3924 | 74 | uint32_t USB_EndPointHalt; |
frank26080115 | 0:bf7b9fba3924 | 75 | uint32_t USB_EndPointStall; /* EP must stay stalled */ |
frank26080115 | 0:bf7b9fba3924 | 76 | uint8_t USB_NumInterfaces; |
frank26080115 | 0:bf7b9fba3924 | 77 | uint8_t USB_AltSetting[USB_IF_NUM]; |
frank26080115 | 0:bf7b9fba3924 | 78 | |
frank26080115 | 0:bf7b9fba3924 | 79 | uint8_t EP0Buf[USB_MAX_PACKET0]; |
frank26080115 | 0:bf7b9fba3924 | 80 | |
frank26080115 | 0:bf7b9fba3924 | 81 | |
frank26080115 | 0:bf7b9fba3924 | 82 | USB_EP_DATA EP0Data; |
frank26080115 | 0:bf7b9fba3924 | 83 | |
frank26080115 | 0:bf7b9fba3924 | 84 | USB_SETUP_PACKET SetupPacket; |
frank26080115 | 0:bf7b9fba3924 | 85 | |
frank26080115 | 0:bf7b9fba3924 | 86 | |
frank26080115 | 0:bf7b9fba3924 | 87 | /* |
frank26080115 | 0:bf7b9fba3924 | 88 | * Reset USB Core |
frank26080115 | 0:bf7b9fba3924 | 89 | * Parameters: None |
frank26080115 | 0:bf7b9fba3924 | 90 | * Return Value: None |
frank26080115 | 0:bf7b9fba3924 | 91 | */ |
frank26080115 | 0:bf7b9fba3924 | 92 | |
frank26080115 | 0:bf7b9fba3924 | 93 | void USB_ResetCore (void) { |
frank26080115 | 0:bf7b9fba3924 | 94 | |
frank26080115 | 0:bf7b9fba3924 | 95 | USB_DeviceStatus = USB_POWER; |
frank26080115 | 0:bf7b9fba3924 | 96 | USB_DeviceAddress = 0; |
frank26080115 | 0:bf7b9fba3924 | 97 | USB_Configuration = 0; |
frank26080115 | 0:bf7b9fba3924 | 98 | USB_EndPointMask = 0x00010001; |
frank26080115 | 0:bf7b9fba3924 | 99 | USB_EndPointHalt = 0x00000000; |
frank26080115 | 0:bf7b9fba3924 | 100 | USB_EndPointStall = 0x00000000; |
frank26080115 | 0:bf7b9fba3924 | 101 | } |
frank26080115 | 0:bf7b9fba3924 | 102 | |
frank26080115 | 0:bf7b9fba3924 | 103 | |
frank26080115 | 0:bf7b9fba3924 | 104 | /* |
frank26080115 | 0:bf7b9fba3924 | 105 | * USB Request - Setup Stage |
frank26080115 | 0:bf7b9fba3924 | 106 | * Parameters: None (global SetupPacket) |
frank26080115 | 0:bf7b9fba3924 | 107 | * Return Value: None |
frank26080115 | 0:bf7b9fba3924 | 108 | */ |
frank26080115 | 0:bf7b9fba3924 | 109 | |
frank26080115 | 0:bf7b9fba3924 | 110 | void USB_SetupStage (void) { |
frank26080115 | 0:bf7b9fba3924 | 111 | USB_ReadEP(0x00, (uint8_t *)&SetupPacket); |
frank26080115 | 0:bf7b9fba3924 | 112 | } |
frank26080115 | 0:bf7b9fba3924 | 113 | |
frank26080115 | 0:bf7b9fba3924 | 114 | |
frank26080115 | 0:bf7b9fba3924 | 115 | /* |
frank26080115 | 0:bf7b9fba3924 | 116 | * USB Request - Data In Stage |
frank26080115 | 0:bf7b9fba3924 | 117 | * Parameters: None (global EP0Data) |
frank26080115 | 0:bf7b9fba3924 | 118 | * Return Value: None |
frank26080115 | 0:bf7b9fba3924 | 119 | */ |
frank26080115 | 0:bf7b9fba3924 | 120 | |
frank26080115 | 0:bf7b9fba3924 | 121 | void USB_DataInStage (void) { |
frank26080115 | 0:bf7b9fba3924 | 122 | uint32_t cnt; |
frank26080115 | 0:bf7b9fba3924 | 123 | |
frank26080115 | 0:bf7b9fba3924 | 124 | if (EP0Data.Count > USB_MAX_PACKET0) { |
frank26080115 | 0:bf7b9fba3924 | 125 | cnt = USB_MAX_PACKET0; |
frank26080115 | 0:bf7b9fba3924 | 126 | } else { |
frank26080115 | 0:bf7b9fba3924 | 127 | cnt = EP0Data.Count; |
frank26080115 | 0:bf7b9fba3924 | 128 | } |
frank26080115 | 0:bf7b9fba3924 | 129 | cnt = USB_WriteEP(0x80, EP0Data.pData, cnt); |
frank26080115 | 0:bf7b9fba3924 | 130 | EP0Data.pData += cnt; |
frank26080115 | 0:bf7b9fba3924 | 131 | EP0Data.Count -= cnt; |
frank26080115 | 0:bf7b9fba3924 | 132 | } |
frank26080115 | 0:bf7b9fba3924 | 133 | |
frank26080115 | 0:bf7b9fba3924 | 134 | |
frank26080115 | 0:bf7b9fba3924 | 135 | /* |
frank26080115 | 0:bf7b9fba3924 | 136 | * USB Request - Data Out Stage |
frank26080115 | 0:bf7b9fba3924 | 137 | * Parameters: None (global EP0Data) |
frank26080115 | 0:bf7b9fba3924 | 138 | * Return Value: None |
frank26080115 | 0:bf7b9fba3924 | 139 | */ |
frank26080115 | 0:bf7b9fba3924 | 140 | |
frank26080115 | 0:bf7b9fba3924 | 141 | void USB_DataOutStage (void) { |
frank26080115 | 0:bf7b9fba3924 | 142 | uint32_t cnt; |
frank26080115 | 0:bf7b9fba3924 | 143 | |
frank26080115 | 0:bf7b9fba3924 | 144 | cnt = USB_ReadEP(0x00, EP0Data.pData); |
frank26080115 | 0:bf7b9fba3924 | 145 | EP0Data.pData += cnt; |
frank26080115 | 0:bf7b9fba3924 | 146 | EP0Data.Count -= cnt; |
frank26080115 | 0:bf7b9fba3924 | 147 | } |
frank26080115 | 0:bf7b9fba3924 | 148 | |
frank26080115 | 0:bf7b9fba3924 | 149 | |
frank26080115 | 0:bf7b9fba3924 | 150 | /* |
frank26080115 | 0:bf7b9fba3924 | 151 | * USB Request - Status In Stage |
frank26080115 | 0:bf7b9fba3924 | 152 | * Parameters: None |
frank26080115 | 0:bf7b9fba3924 | 153 | * Return Value: None |
frank26080115 | 0:bf7b9fba3924 | 154 | */ |
frank26080115 | 0:bf7b9fba3924 | 155 | |
frank26080115 | 0:bf7b9fba3924 | 156 | void USB_StatusInStage (void) { |
frank26080115 | 0:bf7b9fba3924 | 157 | USB_WriteEP(0x80, NULL, 0); |
frank26080115 | 0:bf7b9fba3924 | 158 | } |
frank26080115 | 0:bf7b9fba3924 | 159 | |
frank26080115 | 0:bf7b9fba3924 | 160 | |
frank26080115 | 0:bf7b9fba3924 | 161 | /* |
frank26080115 | 0:bf7b9fba3924 | 162 | * USB Request - Status Out Stage |
frank26080115 | 0:bf7b9fba3924 | 163 | * Parameters: None |
frank26080115 | 0:bf7b9fba3924 | 164 | * Return Value: None |
frank26080115 | 0:bf7b9fba3924 | 165 | */ |
frank26080115 | 0:bf7b9fba3924 | 166 | |
frank26080115 | 0:bf7b9fba3924 | 167 | void USB_StatusOutStage (void) { |
frank26080115 | 0:bf7b9fba3924 | 168 | USB_ReadEP(0x00, EP0Buf); |
frank26080115 | 0:bf7b9fba3924 | 169 | } |
frank26080115 | 0:bf7b9fba3924 | 170 | |
frank26080115 | 0:bf7b9fba3924 | 171 | |
frank26080115 | 0:bf7b9fba3924 | 172 | /* |
frank26080115 | 0:bf7b9fba3924 | 173 | * Get Status USB Request |
frank26080115 | 0:bf7b9fba3924 | 174 | * Parameters: None (global SetupPacket) |
frank26080115 | 0:bf7b9fba3924 | 175 | * Return Value: TRUE - Success, FALSE - Error |
frank26080115 | 0:bf7b9fba3924 | 176 | */ |
frank26080115 | 0:bf7b9fba3924 | 177 | |
frank26080115 | 0:bf7b9fba3924 | 178 | #if defined ( __IAR_SYSTEMS_ICC__ ) |
frank26080115 | 0:bf7b9fba3924 | 179 | inline uint32_t USB_ReqGetStatus (void) { |
frank26080115 | 0:bf7b9fba3924 | 180 | #else |
frank26080115 | 0:bf7b9fba3924 | 181 | __inline uint32_t USB_ReqGetStatus (void) { |
frank26080115 | 0:bf7b9fba3924 | 182 | #endif |
frank26080115 | 0:bf7b9fba3924 | 183 | uint32_t n, m; |
frank26080115 | 0:bf7b9fba3924 | 184 | |
frank26080115 | 0:bf7b9fba3924 | 185 | switch (SetupPacket.bmRequestType.BM.Recipient) { |
frank26080115 | 0:bf7b9fba3924 | 186 | case REQUEST_TO_DEVICE: |
frank26080115 | 0:bf7b9fba3924 | 187 | EP0Data.pData = (uint8_t *)&USB_DeviceStatus; |
frank26080115 | 0:bf7b9fba3924 | 188 | break; |
frank26080115 | 0:bf7b9fba3924 | 189 | case REQUEST_TO_INTERFACE: |
frank26080115 | 0:bf7b9fba3924 | 190 | if ((USB_Configuration != 0) && (SetupPacket.wIndex.WB.L < USB_NumInterfaces)) { |
frank26080115 | 0:bf7b9fba3924 | 191 | *((__packed uint16_t *)EP0Buf) = 0; |
frank26080115 | 0:bf7b9fba3924 | 192 | *((uint16_t *)EP0Buf) = 0; |
frank26080115 | 0:bf7b9fba3924 | 193 | EP0Data.pData = EP0Buf; |
frank26080115 | 0:bf7b9fba3924 | 194 | } else { |
frank26080115 | 0:bf7b9fba3924 | 195 | return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 196 | } |
frank26080115 | 0:bf7b9fba3924 | 197 | break; |
frank26080115 | 0:bf7b9fba3924 | 198 | case REQUEST_TO_ENDPOINT: |
frank26080115 | 0:bf7b9fba3924 | 199 | n = SetupPacket.wIndex.WB.L & 0x8F; |
frank26080115 | 0:bf7b9fba3924 | 200 | m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n); |
frank26080115 | 0:bf7b9fba3924 | 201 | if (((USB_Configuration != 0) || ((n & 0x0F) == 0)) && (USB_EndPointMask & m)) { |
frank26080115 | 0:bf7b9fba3924 | 202 | *((__packed uint16_t *)EP0Buf) = (USB_EndPointHalt & m) ? 1 : 0; |
frank26080115 | 0:bf7b9fba3924 | 203 | *((uint16_t *)EP0Buf) = (USB_EndPointHalt & m) ? 1 : 0; |
frank26080115 | 0:bf7b9fba3924 | 204 | EP0Data.pData = EP0Buf; |
frank26080115 | 0:bf7b9fba3924 | 205 | } else { |
frank26080115 | 0:bf7b9fba3924 | 206 | return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 207 | } |
frank26080115 | 0:bf7b9fba3924 | 208 | break; |
frank26080115 | 0:bf7b9fba3924 | 209 | default: |
frank26080115 | 0:bf7b9fba3924 | 210 | return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 211 | } |
frank26080115 | 0:bf7b9fba3924 | 212 | return (TRUE); |
frank26080115 | 0:bf7b9fba3924 | 213 | } |
frank26080115 | 0:bf7b9fba3924 | 214 | |
frank26080115 | 0:bf7b9fba3924 | 215 | |
frank26080115 | 0:bf7b9fba3924 | 216 | /* |
frank26080115 | 0:bf7b9fba3924 | 217 | * Set/Clear Feature USB Request |
frank26080115 | 0:bf7b9fba3924 | 218 | * Parameters: sc: 0 - Clear, 1 - Set |
frank26080115 | 0:bf7b9fba3924 | 219 | * (global SetupPacket) |
frank26080115 | 0:bf7b9fba3924 | 220 | * Return Value: TRUE - Success, FALSE - Error |
frank26080115 | 0:bf7b9fba3924 | 221 | */ |
frank26080115 | 0:bf7b9fba3924 | 222 | |
frank26080115 | 0:bf7b9fba3924 | 223 | #if defined ( __IAR_SYSTEMS_ICC__ ) |
frank26080115 | 0:bf7b9fba3924 | 224 | inline uint32_t USB_ReqSetClrFeature (uint32_t sc) { |
frank26080115 | 0:bf7b9fba3924 | 225 | #else |
frank26080115 | 0:bf7b9fba3924 | 226 | __inline uint32_t USB_ReqSetClrFeature (uint32_t sc) { |
frank26080115 | 0:bf7b9fba3924 | 227 | #endif |
frank26080115 | 0:bf7b9fba3924 | 228 | uint32_t n, m; |
frank26080115 | 0:bf7b9fba3924 | 229 | |
frank26080115 | 0:bf7b9fba3924 | 230 | switch (SetupPacket.bmRequestType.BM.Recipient) { |
frank26080115 | 0:bf7b9fba3924 | 231 | case REQUEST_TO_DEVICE: |
frank26080115 | 0:bf7b9fba3924 | 232 | if (SetupPacket.wValue.W == USB_FEATURE_REMOTE_WAKEUP) { |
frank26080115 | 0:bf7b9fba3924 | 233 | if (sc) { |
frank26080115 | 0:bf7b9fba3924 | 234 | USB_WakeUpCfg(TRUE); |
frank26080115 | 0:bf7b9fba3924 | 235 | USB_DeviceStatus |= USB_GETSTATUS_REMOTE_WAKEUP; |
frank26080115 | 0:bf7b9fba3924 | 236 | } else { |
frank26080115 | 0:bf7b9fba3924 | 237 | USB_WakeUpCfg(FALSE); |
frank26080115 | 0:bf7b9fba3924 | 238 | USB_DeviceStatus &= ~USB_GETSTATUS_REMOTE_WAKEUP; |
frank26080115 | 0:bf7b9fba3924 | 239 | } |
frank26080115 | 0:bf7b9fba3924 | 240 | } else { |
frank26080115 | 0:bf7b9fba3924 | 241 | return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 242 | } |
frank26080115 | 0:bf7b9fba3924 | 243 | break; |
frank26080115 | 0:bf7b9fba3924 | 244 | case REQUEST_TO_INTERFACE: |
frank26080115 | 0:bf7b9fba3924 | 245 | return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 246 | case REQUEST_TO_ENDPOINT: |
frank26080115 | 0:bf7b9fba3924 | 247 | n = SetupPacket.wIndex.WB.L & 0x8F; |
frank26080115 | 0:bf7b9fba3924 | 248 | m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n); |
frank26080115 | 0:bf7b9fba3924 | 249 | if ((USB_Configuration != 0) && ((n & 0x0F) != 0) && (USB_EndPointMask & m)) { |
frank26080115 | 0:bf7b9fba3924 | 250 | if (SetupPacket.wValue.W == USB_FEATURE_ENDPOINT_STALL) { |
frank26080115 | 0:bf7b9fba3924 | 251 | if (sc) { |
frank26080115 | 0:bf7b9fba3924 | 252 | USB_SetStallEP(n); |
frank26080115 | 0:bf7b9fba3924 | 253 | USB_EndPointHalt |= m; |
frank26080115 | 0:bf7b9fba3924 | 254 | } else { |
frank26080115 | 0:bf7b9fba3924 | 255 | if ((USB_EndPointStall & m) != 0) { |
frank26080115 | 0:bf7b9fba3924 | 256 | return (TRUE); |
frank26080115 | 0:bf7b9fba3924 | 257 | } |
frank26080115 | 0:bf7b9fba3924 | 258 | USB_ClrStallEP(n); |
frank26080115 | 0:bf7b9fba3924 | 259 | #if (USB_MSC) |
frank26080115 | 0:bf7b9fba3924 | 260 | if ((n == MSC_EP_IN) && ((USB_EndPointHalt & m) != 0)) { |
frank26080115 | 0:bf7b9fba3924 | 261 | /* Compliance Test: rewrite CSW after unstall */ |
frank26080115 | 0:bf7b9fba3924 | 262 | if (CSW.dSignature == MSC_CSW_Signature) { |
frank26080115 | 0:bf7b9fba3924 | 263 | USB_WriteEP(MSC_EP_IN, (uint8_t *)&CSW, sizeof(CSW)); |
frank26080115 | 0:bf7b9fba3924 | 264 | } |
frank26080115 | 0:bf7b9fba3924 | 265 | } |
frank26080115 | 0:bf7b9fba3924 | 266 | #endif |
frank26080115 | 0:bf7b9fba3924 | 267 | USB_EndPointHalt &= ~m; |
frank26080115 | 0:bf7b9fba3924 | 268 | } |
frank26080115 | 0:bf7b9fba3924 | 269 | } else { |
frank26080115 | 0:bf7b9fba3924 | 270 | return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 271 | } |
frank26080115 | 0:bf7b9fba3924 | 272 | } else { |
frank26080115 | 0:bf7b9fba3924 | 273 | return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 274 | } |
frank26080115 | 0:bf7b9fba3924 | 275 | break; |
frank26080115 | 0:bf7b9fba3924 | 276 | default: |
frank26080115 | 0:bf7b9fba3924 | 277 | return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 278 | } |
frank26080115 | 0:bf7b9fba3924 | 279 | return (TRUE); |
frank26080115 | 0:bf7b9fba3924 | 280 | } |
frank26080115 | 0:bf7b9fba3924 | 281 | |
frank26080115 | 0:bf7b9fba3924 | 282 | |
frank26080115 | 0:bf7b9fba3924 | 283 | /* |
frank26080115 | 0:bf7b9fba3924 | 284 | * Set Address USB Request |
frank26080115 | 0:bf7b9fba3924 | 285 | * Parameters: None (global SetupPacket) |
frank26080115 | 0:bf7b9fba3924 | 286 | * Return Value: TRUE - Success, FALSE - Error |
frank26080115 | 0:bf7b9fba3924 | 287 | */ |
frank26080115 | 0:bf7b9fba3924 | 288 | |
frank26080115 | 0:bf7b9fba3924 | 289 | #if defined ( __IAR_SYSTEMS_ICC__ ) |
frank26080115 | 0:bf7b9fba3924 | 290 | inline uint32_t USB_ReqSetAddress (void) { |
frank26080115 | 0:bf7b9fba3924 | 291 | #else |
frank26080115 | 0:bf7b9fba3924 | 292 | __inline uint32_t USB_ReqSetAddress (void) { |
frank26080115 | 0:bf7b9fba3924 | 293 | #endif |
frank26080115 | 0:bf7b9fba3924 | 294 | switch (SetupPacket.bmRequestType.BM.Recipient) { |
frank26080115 | 0:bf7b9fba3924 | 295 | case REQUEST_TO_DEVICE: |
frank26080115 | 0:bf7b9fba3924 | 296 | USB_DeviceAddress = 0x80 | SetupPacket.wValue.WB.L; |
frank26080115 | 0:bf7b9fba3924 | 297 | break; |
frank26080115 | 0:bf7b9fba3924 | 298 | default: |
frank26080115 | 0:bf7b9fba3924 | 299 | return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 300 | } |
frank26080115 | 0:bf7b9fba3924 | 301 | return (TRUE); |
frank26080115 | 0:bf7b9fba3924 | 302 | } |
frank26080115 | 0:bf7b9fba3924 | 303 | |
frank26080115 | 0:bf7b9fba3924 | 304 | |
frank26080115 | 0:bf7b9fba3924 | 305 | /* |
frank26080115 | 0:bf7b9fba3924 | 306 | * Get Descriptor USB Request |
frank26080115 | 0:bf7b9fba3924 | 307 | * Parameters: None (global SetupPacket) |
frank26080115 | 0:bf7b9fba3924 | 308 | * Return Value: TRUE - Success, FALSE - Error |
frank26080115 | 0:bf7b9fba3924 | 309 | */ |
frank26080115 | 0:bf7b9fba3924 | 310 | |
frank26080115 | 0:bf7b9fba3924 | 311 | #if defined ( __IAR_SYSTEMS_ICC__ ) |
frank26080115 | 0:bf7b9fba3924 | 312 | inline uint32_t USB_ReqGetDescriptor (void) { |
frank26080115 | 0:bf7b9fba3924 | 313 | #else |
frank26080115 | 0:bf7b9fba3924 | 314 | __inline uint32_t USB_ReqGetDescriptor (void) { |
frank26080115 | 0:bf7b9fba3924 | 315 | #endif |
frank26080115 | 0:bf7b9fba3924 | 316 | uint8_t *pD; |
frank26080115 | 0:bf7b9fba3924 | 317 | uint32_t len, n; |
frank26080115 | 0:bf7b9fba3924 | 318 | |
frank26080115 | 0:bf7b9fba3924 | 319 | switch (SetupPacket.bmRequestType.BM.Recipient) { |
frank26080115 | 0:bf7b9fba3924 | 320 | case REQUEST_TO_DEVICE: |
frank26080115 | 0:bf7b9fba3924 | 321 | switch (SetupPacket.wValue.WB.H) { |
frank26080115 | 0:bf7b9fba3924 | 322 | case USB_DEVICE_DESCRIPTOR_TYPE: |
frank26080115 | 0:bf7b9fba3924 | 323 | EP0Data.pData = (uint8_t *)USB_DeviceDescriptor; |
frank26080115 | 0:bf7b9fba3924 | 324 | len = USB_DEVICE_DESC_SIZE; |
frank26080115 | 0:bf7b9fba3924 | 325 | break; |
frank26080115 | 0:bf7b9fba3924 | 326 | case USB_CONFIGURATION_DESCRIPTOR_TYPE: |
frank26080115 | 0:bf7b9fba3924 | 327 | pD = (uint8_t *)USB_ConfigDescriptor; |
frank26080115 | 0:bf7b9fba3924 | 328 | for (n = 0; n != SetupPacket.wValue.WB.L; n++) { |
frank26080115 | 0:bf7b9fba3924 | 329 | if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bLength != 0) { |
frank26080115 | 0:bf7b9fba3924 | 330 | pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength; |
frank26080115 | 0:bf7b9fba3924 | 331 | } |
frank26080115 | 0:bf7b9fba3924 | 332 | } |
frank26080115 | 0:bf7b9fba3924 | 333 | if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bLength == 0) { |
frank26080115 | 0:bf7b9fba3924 | 334 | return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 335 | } |
frank26080115 | 0:bf7b9fba3924 | 336 | EP0Data.pData = pD; |
frank26080115 | 0:bf7b9fba3924 | 337 | len = ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength; |
frank26080115 | 0:bf7b9fba3924 | 338 | break; |
frank26080115 | 0:bf7b9fba3924 | 339 | case USB_STRING_DESCRIPTOR_TYPE: |
frank26080115 | 0:bf7b9fba3924 | 340 | pD = (uint8_t *)USB_StringDescriptor; |
frank26080115 | 0:bf7b9fba3924 | 341 | for (n = 0; n != SetupPacket.wValue.WB.L; n++) { |
frank26080115 | 0:bf7b9fba3924 | 342 | if (((USB_STRING_DESCRIPTOR *)pD)->bLength != 0) { |
frank26080115 | 0:bf7b9fba3924 | 343 | pD += ((USB_STRING_DESCRIPTOR *)pD)->bLength; |
frank26080115 | 0:bf7b9fba3924 | 344 | } |
frank26080115 | 0:bf7b9fba3924 | 345 | } |
frank26080115 | 0:bf7b9fba3924 | 346 | if (((USB_STRING_DESCRIPTOR *)pD)->bLength == 0) { |
frank26080115 | 0:bf7b9fba3924 | 347 | return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 348 | } |
frank26080115 | 0:bf7b9fba3924 | 349 | EP0Data.pData = pD; |
frank26080115 | 0:bf7b9fba3924 | 350 | len = ((USB_STRING_DESCRIPTOR *)EP0Data.pData)->bLength; |
frank26080115 | 0:bf7b9fba3924 | 351 | break; |
frank26080115 | 0:bf7b9fba3924 | 352 | default: |
frank26080115 | 0:bf7b9fba3924 | 353 | return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 354 | } |
frank26080115 | 0:bf7b9fba3924 | 355 | break; |
frank26080115 | 0:bf7b9fba3924 | 356 | case REQUEST_TO_INTERFACE: |
frank26080115 | 0:bf7b9fba3924 | 357 | switch (SetupPacket.wValue.WB.H) { |
frank26080115 | 0:bf7b9fba3924 | 358 | #if USB_HID |
frank26080115 | 0:bf7b9fba3924 | 359 | case HID_HID_DESCRIPTOR_TYPE: |
frank26080115 | 0:bf7b9fba3924 | 360 | if (SetupPacket.wIndex.WB.L != USB_HID_IF_NUM) { |
frank26080115 | 0:bf7b9fba3924 | 361 | return (FALSE); /* Only Single HID Interface is supported */ |
frank26080115 | 0:bf7b9fba3924 | 362 | } |
frank26080115 | 0:bf7b9fba3924 | 363 | EP0Data.pData = (uint8_t *)USB_ConfigDescriptor + HID_DESC_OFFSET; |
frank26080115 | 0:bf7b9fba3924 | 364 | len = HID_DESC_SIZE; |
frank26080115 | 0:bf7b9fba3924 | 365 | break; |
frank26080115 | 0:bf7b9fba3924 | 366 | case HID_REPORT_DESCRIPTOR_TYPE: |
frank26080115 | 0:bf7b9fba3924 | 367 | if (SetupPacket.wIndex.WB.L != USB_HID_IF_NUM) { |
frank26080115 | 0:bf7b9fba3924 | 368 | return (FALSE); /* Only Single HID Interface is supported */ |
frank26080115 | 0:bf7b9fba3924 | 369 | } |
frank26080115 | 0:bf7b9fba3924 | 370 | EP0Data.pData = (uint8_t *)HID_ReportDescriptor; |
frank26080115 | 0:bf7b9fba3924 | 371 | len = HID_ReportDescSize; |
frank26080115 | 0:bf7b9fba3924 | 372 | break; |
frank26080115 | 0:bf7b9fba3924 | 373 | case HID_PHYSICAL_DESCRIPTOR_TYPE: |
frank26080115 | 0:bf7b9fba3924 | 374 | return (FALSE); /* HID Physical Descriptor is not supported */ |
frank26080115 | 0:bf7b9fba3924 | 375 | #endif |
frank26080115 | 0:bf7b9fba3924 | 376 | default: |
frank26080115 | 0:bf7b9fba3924 | 377 | return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 378 | } |
frank26080115 | 0:bf7b9fba3924 | 379 | // break; |
frank26080115 | 0:bf7b9fba3924 | 380 | default: |
frank26080115 | 0:bf7b9fba3924 | 381 | return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 382 | } |
frank26080115 | 0:bf7b9fba3924 | 383 | |
frank26080115 | 0:bf7b9fba3924 | 384 | if (EP0Data.Count > len) { |
frank26080115 | 0:bf7b9fba3924 | 385 | EP0Data.Count = len; |
frank26080115 | 0:bf7b9fba3924 | 386 | } |
frank26080115 | 0:bf7b9fba3924 | 387 | |
frank26080115 | 0:bf7b9fba3924 | 388 | return (TRUE); |
frank26080115 | 0:bf7b9fba3924 | 389 | } |
frank26080115 | 0:bf7b9fba3924 | 390 | |
frank26080115 | 0:bf7b9fba3924 | 391 | |
frank26080115 | 0:bf7b9fba3924 | 392 | /* |
frank26080115 | 0:bf7b9fba3924 | 393 | * Get Configuration USB Request |
frank26080115 | 0:bf7b9fba3924 | 394 | * Parameters: None (global SetupPacket) |
frank26080115 | 0:bf7b9fba3924 | 395 | * Return Value: TRUE - Success, FALSE - Error |
frank26080115 | 0:bf7b9fba3924 | 396 | */ |
frank26080115 | 0:bf7b9fba3924 | 397 | |
frank26080115 | 0:bf7b9fba3924 | 398 | #if defined ( __IAR_SYSTEMS_ICC__ ) |
frank26080115 | 0:bf7b9fba3924 | 399 | inline uint32_t USB_ReqGetConfiguration (void) { |
frank26080115 | 0:bf7b9fba3924 | 400 | #else |
frank26080115 | 0:bf7b9fba3924 | 401 | __inline uint32_t USB_ReqGetConfiguration (void) { |
frank26080115 | 0:bf7b9fba3924 | 402 | #endif |
frank26080115 | 0:bf7b9fba3924 | 403 | switch (SetupPacket.bmRequestType.BM.Recipient) { |
frank26080115 | 0:bf7b9fba3924 | 404 | case REQUEST_TO_DEVICE: |
frank26080115 | 0:bf7b9fba3924 | 405 | EP0Data.pData = &USB_Configuration; |
frank26080115 | 0:bf7b9fba3924 | 406 | break; |
frank26080115 | 0:bf7b9fba3924 | 407 | default: |
frank26080115 | 0:bf7b9fba3924 | 408 | return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 409 | } |
frank26080115 | 0:bf7b9fba3924 | 410 | return (TRUE); |
frank26080115 | 0:bf7b9fba3924 | 411 | } |
frank26080115 | 0:bf7b9fba3924 | 412 | |
frank26080115 | 0:bf7b9fba3924 | 413 | |
frank26080115 | 0:bf7b9fba3924 | 414 | /* |
frank26080115 | 0:bf7b9fba3924 | 415 | * Set Configuration USB Request |
frank26080115 | 0:bf7b9fba3924 | 416 | * Parameters: None (global SetupPacket) |
frank26080115 | 0:bf7b9fba3924 | 417 | * Return Value: TRUE - Success, FALSE - Error |
frank26080115 | 0:bf7b9fba3924 | 418 | */ |
frank26080115 | 0:bf7b9fba3924 | 419 | |
frank26080115 | 0:bf7b9fba3924 | 420 | #if defined ( __IAR_SYSTEMS_ICC__ ) |
frank26080115 | 0:bf7b9fba3924 | 421 | inline uint32_t USB_ReqSetConfiguration (void) { |
frank26080115 | 0:bf7b9fba3924 | 422 | #else |
frank26080115 | 0:bf7b9fba3924 | 423 | __inline uint32_t USB_ReqSetConfiguration (void) { |
frank26080115 | 0:bf7b9fba3924 | 424 | #endif |
frank26080115 | 0:bf7b9fba3924 | 425 | USB_COMMON_DESCRIPTOR *pD; |
frank26080115 | 0:bf7b9fba3924 | 426 | uint32_t alt = 0; |
frank26080115 | 0:bf7b9fba3924 | 427 | uint32_t n, m; |
frank26080115 | 0:bf7b9fba3924 | 428 | uint32_t tmp; |
frank26080115 | 0:bf7b9fba3924 | 429 | |
frank26080115 | 0:bf7b9fba3924 | 430 | switch (SetupPacket.bmRequestType.BM.Recipient) { |
frank26080115 | 0:bf7b9fba3924 | 431 | case REQUEST_TO_DEVICE: |
frank26080115 | 0:bf7b9fba3924 | 432 | |
frank26080115 | 0:bf7b9fba3924 | 433 | if (SetupPacket.wValue.WB.L) { |
frank26080115 | 0:bf7b9fba3924 | 434 | pD = (USB_COMMON_DESCRIPTOR *)USB_ConfigDescriptor; |
frank26080115 | 0:bf7b9fba3924 | 435 | while (pD->bLength) { |
frank26080115 | 0:bf7b9fba3924 | 436 | switch (pD->bDescriptorType) { |
frank26080115 | 0:bf7b9fba3924 | 437 | case USB_CONFIGURATION_DESCRIPTOR_TYPE: |
frank26080115 | 0:bf7b9fba3924 | 438 | if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bConfigurationValue == SetupPacket.wValue.WB.L) { |
frank26080115 | 0:bf7b9fba3924 | 439 | USB_Configuration = SetupPacket.wValue.WB.L; |
frank26080115 | 0:bf7b9fba3924 | 440 | USB_NumInterfaces = ((USB_CONFIGURATION_DESCRIPTOR *)pD)->bNumInterfaces; |
frank26080115 | 0:bf7b9fba3924 | 441 | for (n = 0; n < USB_IF_NUM; n++) { |
frank26080115 | 0:bf7b9fba3924 | 442 | USB_AltSetting[n] = 0; |
frank26080115 | 0:bf7b9fba3924 | 443 | } |
frank26080115 | 0:bf7b9fba3924 | 444 | for (n = 1; n < 16; n++) { |
frank26080115 | 0:bf7b9fba3924 | 445 | if (USB_EndPointMask & (1 << n)) { |
frank26080115 | 0:bf7b9fba3924 | 446 | USB_DisableEP(n); |
frank26080115 | 0:bf7b9fba3924 | 447 | } |
frank26080115 | 0:bf7b9fba3924 | 448 | if (USB_EndPointMask & ((1 << 16) << n)) { |
frank26080115 | 0:bf7b9fba3924 | 449 | USB_DisableEP(n | 0x80); |
frank26080115 | 0:bf7b9fba3924 | 450 | } |
frank26080115 | 0:bf7b9fba3924 | 451 | } |
frank26080115 | 0:bf7b9fba3924 | 452 | USB_EndPointMask = 0x00010001; |
frank26080115 | 0:bf7b9fba3924 | 453 | USB_EndPointHalt = 0x00000000; |
frank26080115 | 0:bf7b9fba3924 | 454 | USB_EndPointStall= 0x00000000; |
frank26080115 | 0:bf7b9fba3924 | 455 | USB_Configure(TRUE); |
frank26080115 | 0:bf7b9fba3924 | 456 | if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bmAttributes & USB_CONFIG_POWERED_MASK) { |
frank26080115 | 0:bf7b9fba3924 | 457 | USB_DeviceStatus |= USB_GETSTATUS_SELF_POWERED; |
frank26080115 | 0:bf7b9fba3924 | 458 | } else { |
frank26080115 | 0:bf7b9fba3924 | 459 | USB_DeviceStatus &= ~USB_GETSTATUS_SELF_POWERED; |
frank26080115 | 0:bf7b9fba3924 | 460 | } |
frank26080115 | 0:bf7b9fba3924 | 461 | } else { |
frank26080115 | 0:bf7b9fba3924 | 462 | // (uint8_t *)pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength; |
frank26080115 | 0:bf7b9fba3924 | 463 | tmp = (uint32_t)pD; |
frank26080115 | 0:bf7b9fba3924 | 464 | tmp += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength; |
frank26080115 | 0:bf7b9fba3924 | 465 | pD = (USB_COMMON_DESCRIPTOR *)tmp; |
frank26080115 | 0:bf7b9fba3924 | 466 | continue; |
frank26080115 | 0:bf7b9fba3924 | 467 | } |
frank26080115 | 0:bf7b9fba3924 | 468 | break; |
frank26080115 | 0:bf7b9fba3924 | 469 | case USB_INTERFACE_DESCRIPTOR_TYPE: |
frank26080115 | 0:bf7b9fba3924 | 470 | alt = ((USB_INTERFACE_DESCRIPTOR *)pD)->bAlternateSetting; |
frank26080115 | 0:bf7b9fba3924 | 471 | break; |
frank26080115 | 0:bf7b9fba3924 | 472 | case USB_ENDPOINT_DESCRIPTOR_TYPE: |
frank26080115 | 0:bf7b9fba3924 | 473 | if (alt == 0) { |
frank26080115 | 0:bf7b9fba3924 | 474 | n = ((USB_ENDPOINT_DESCRIPTOR *)pD)->bEndpointAddress & 0x8F; |
frank26080115 | 0:bf7b9fba3924 | 475 | m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n); |
frank26080115 | 0:bf7b9fba3924 | 476 | USB_EndPointMask |= m; |
frank26080115 | 0:bf7b9fba3924 | 477 | USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR *)pD); |
frank26080115 | 0:bf7b9fba3924 | 478 | USB_EnableEP(n); |
frank26080115 | 0:bf7b9fba3924 | 479 | USB_ResetEP(n); |
frank26080115 | 0:bf7b9fba3924 | 480 | } |
frank26080115 | 0:bf7b9fba3924 | 481 | break; |
frank26080115 | 0:bf7b9fba3924 | 482 | } |
frank26080115 | 0:bf7b9fba3924 | 483 | // (uint8_t *)pD += pD->bLength; |
frank26080115 | 0:bf7b9fba3924 | 484 | tmp = (uint32_t)pD; |
frank26080115 | 0:bf7b9fba3924 | 485 | tmp += pD->bLength; |
frank26080115 | 0:bf7b9fba3924 | 486 | pD = (USB_COMMON_DESCRIPTOR *)tmp; |
frank26080115 | 0:bf7b9fba3924 | 487 | } |
frank26080115 | 0:bf7b9fba3924 | 488 | } |
frank26080115 | 0:bf7b9fba3924 | 489 | else { |
frank26080115 | 0:bf7b9fba3924 | 490 | USB_Configuration = 0; |
frank26080115 | 0:bf7b9fba3924 | 491 | for (n = 1; n < 16; n++) { |
frank26080115 | 0:bf7b9fba3924 | 492 | if (USB_EndPointMask & (1 << n)) { |
frank26080115 | 0:bf7b9fba3924 | 493 | USB_DisableEP(n); |
frank26080115 | 0:bf7b9fba3924 | 494 | } |
frank26080115 | 0:bf7b9fba3924 | 495 | if (USB_EndPointMask & ((1 << 16) << n)) { |
frank26080115 | 0:bf7b9fba3924 | 496 | USB_DisableEP(n | 0x80); |
frank26080115 | 0:bf7b9fba3924 | 497 | } |
frank26080115 | 0:bf7b9fba3924 | 498 | } |
frank26080115 | 0:bf7b9fba3924 | 499 | USB_EndPointMask = 0x00010001; |
frank26080115 | 0:bf7b9fba3924 | 500 | USB_EndPointHalt = 0x00000000; |
frank26080115 | 0:bf7b9fba3924 | 501 | USB_EndPointStall = 0x00000000; |
frank26080115 | 0:bf7b9fba3924 | 502 | USB_Configure(FALSE); |
frank26080115 | 0:bf7b9fba3924 | 503 | } |
frank26080115 | 0:bf7b9fba3924 | 504 | |
frank26080115 | 0:bf7b9fba3924 | 505 | if (USB_Configuration != SetupPacket.wValue.WB.L) { |
frank26080115 | 0:bf7b9fba3924 | 506 | return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 507 | } |
frank26080115 | 0:bf7b9fba3924 | 508 | break; |
frank26080115 | 0:bf7b9fba3924 | 509 | default: |
frank26080115 | 0:bf7b9fba3924 | 510 | return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 511 | } |
frank26080115 | 0:bf7b9fba3924 | 512 | return (TRUE); |
frank26080115 | 0:bf7b9fba3924 | 513 | } |
frank26080115 | 0:bf7b9fba3924 | 514 | |
frank26080115 | 0:bf7b9fba3924 | 515 | |
frank26080115 | 0:bf7b9fba3924 | 516 | /* |
frank26080115 | 0:bf7b9fba3924 | 517 | * Get Interface USB Request |
frank26080115 | 0:bf7b9fba3924 | 518 | * Parameters: None (global SetupPacket) |
frank26080115 | 0:bf7b9fba3924 | 519 | * Return Value: TRUE - Success, FALSE - Error |
frank26080115 | 0:bf7b9fba3924 | 520 | */ |
frank26080115 | 0:bf7b9fba3924 | 521 | |
frank26080115 | 0:bf7b9fba3924 | 522 | #if defined ( __IAR_SYSTEMS_ICC__ ) |
frank26080115 | 0:bf7b9fba3924 | 523 | inline uint32_t USB_ReqGetInterface (void) { |
frank26080115 | 0:bf7b9fba3924 | 524 | #else |
frank26080115 | 0:bf7b9fba3924 | 525 | __inline uint32_t USB_ReqGetInterface (void) { |
frank26080115 | 0:bf7b9fba3924 | 526 | #endif |
frank26080115 | 0:bf7b9fba3924 | 527 | switch (SetupPacket.bmRequestType.BM.Recipient) { |
frank26080115 | 0:bf7b9fba3924 | 528 | case REQUEST_TO_INTERFACE: |
frank26080115 | 0:bf7b9fba3924 | 529 | if ((USB_Configuration != 0) && (SetupPacket.wIndex.WB.L < USB_NumInterfaces)) { |
frank26080115 | 0:bf7b9fba3924 | 530 | EP0Data.pData = USB_AltSetting + SetupPacket.wIndex.WB.L; |
frank26080115 | 0:bf7b9fba3924 | 531 | } else { |
frank26080115 | 0:bf7b9fba3924 | 532 | return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 533 | } |
frank26080115 | 0:bf7b9fba3924 | 534 | break; |
frank26080115 | 0:bf7b9fba3924 | 535 | default: |
frank26080115 | 0:bf7b9fba3924 | 536 | return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 537 | } |
frank26080115 | 0:bf7b9fba3924 | 538 | return (TRUE); |
frank26080115 | 0:bf7b9fba3924 | 539 | } |
frank26080115 | 0:bf7b9fba3924 | 540 | |
frank26080115 | 0:bf7b9fba3924 | 541 | |
frank26080115 | 0:bf7b9fba3924 | 542 | /* |
frank26080115 | 0:bf7b9fba3924 | 543 | * Set Interface USB Request |
frank26080115 | 0:bf7b9fba3924 | 544 | * Parameters: None (global SetupPacket) |
frank26080115 | 0:bf7b9fba3924 | 545 | * Return Value: TRUE - Success, FALSE - Error |
frank26080115 | 0:bf7b9fba3924 | 546 | */ |
frank26080115 | 0:bf7b9fba3924 | 547 | #if defined ( __IAR_SYSTEMS_ICC__ ) |
frank26080115 | 0:bf7b9fba3924 | 548 | inline uint32_t USB_ReqSetInterface (void) { |
frank26080115 | 0:bf7b9fba3924 | 549 | #else |
frank26080115 | 0:bf7b9fba3924 | 550 | __inline uint32_t USB_ReqSetInterface (void) { |
frank26080115 | 0:bf7b9fba3924 | 551 | #endif |
frank26080115 | 0:bf7b9fba3924 | 552 | USB_COMMON_DESCRIPTOR *pD; |
frank26080115 | 0:bf7b9fba3924 | 553 | uint32_t ifn = 0, alt = 0, old = 0, msk = 0; |
frank26080115 | 0:bf7b9fba3924 | 554 | uint32_t n, m; |
frank26080115 | 0:bf7b9fba3924 | 555 | uint32_t set; |
frank26080115 | 0:bf7b9fba3924 | 556 | uint32_t tmp; |
frank26080115 | 0:bf7b9fba3924 | 557 | |
frank26080115 | 0:bf7b9fba3924 | 558 | switch (SetupPacket.bmRequestType.BM.Recipient) { |
frank26080115 | 0:bf7b9fba3924 | 559 | case REQUEST_TO_INTERFACE: |
frank26080115 | 0:bf7b9fba3924 | 560 | if (USB_Configuration == 0) return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 561 | set = FALSE; |
frank26080115 | 0:bf7b9fba3924 | 562 | pD = (USB_COMMON_DESCRIPTOR *)USB_ConfigDescriptor; |
frank26080115 | 0:bf7b9fba3924 | 563 | while (pD->bLength) { |
frank26080115 | 0:bf7b9fba3924 | 564 | switch (pD->bDescriptorType) { |
frank26080115 | 0:bf7b9fba3924 | 565 | case USB_CONFIGURATION_DESCRIPTOR_TYPE: |
frank26080115 | 0:bf7b9fba3924 | 566 | if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bConfigurationValue != USB_Configuration) { |
frank26080115 | 0:bf7b9fba3924 | 567 | // (uint8_t *)pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength; |
frank26080115 | 0:bf7b9fba3924 | 568 | tmp = (uint32_t)pD; |
frank26080115 | 0:bf7b9fba3924 | 569 | tmp += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength; |
frank26080115 | 0:bf7b9fba3924 | 570 | pD = (USB_COMMON_DESCRIPTOR *)tmp; |
frank26080115 | 0:bf7b9fba3924 | 571 | |
frank26080115 | 0:bf7b9fba3924 | 572 | continue; |
frank26080115 | 0:bf7b9fba3924 | 573 | } |
frank26080115 | 0:bf7b9fba3924 | 574 | break; |
frank26080115 | 0:bf7b9fba3924 | 575 | case USB_INTERFACE_DESCRIPTOR_TYPE: |
frank26080115 | 0:bf7b9fba3924 | 576 | ifn = ((USB_INTERFACE_DESCRIPTOR *)pD)->bInterfaceNumber; |
frank26080115 | 0:bf7b9fba3924 | 577 | alt = ((USB_INTERFACE_DESCRIPTOR *)pD)->bAlternateSetting; |
frank26080115 | 0:bf7b9fba3924 | 578 | msk = 0; |
frank26080115 | 0:bf7b9fba3924 | 579 | if ((ifn == SetupPacket.wIndex.WB.L) && (alt == SetupPacket.wValue.WB.L)) { |
frank26080115 | 0:bf7b9fba3924 | 580 | set = TRUE; |
frank26080115 | 0:bf7b9fba3924 | 581 | old = USB_AltSetting[ifn]; |
frank26080115 | 0:bf7b9fba3924 | 582 | USB_AltSetting[ifn] = (uint8_t)alt; |
frank26080115 | 0:bf7b9fba3924 | 583 | } |
frank26080115 | 0:bf7b9fba3924 | 584 | break; |
frank26080115 | 0:bf7b9fba3924 | 585 | case USB_ENDPOINT_DESCRIPTOR_TYPE: |
frank26080115 | 0:bf7b9fba3924 | 586 | if (ifn == SetupPacket.wIndex.WB.L) { |
frank26080115 | 0:bf7b9fba3924 | 587 | n = ((USB_ENDPOINT_DESCRIPTOR *)pD)->bEndpointAddress & 0x8F; |
frank26080115 | 0:bf7b9fba3924 | 588 | m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n); |
frank26080115 | 0:bf7b9fba3924 | 589 | if (alt == SetupPacket.wValue.WB.L) { |
frank26080115 | 0:bf7b9fba3924 | 590 | USB_EndPointMask |= m; |
frank26080115 | 0:bf7b9fba3924 | 591 | USB_EndPointHalt &= ~m; |
frank26080115 | 0:bf7b9fba3924 | 592 | USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR *)pD); |
frank26080115 | 0:bf7b9fba3924 | 593 | USB_EnableEP(n); |
frank26080115 | 0:bf7b9fba3924 | 594 | USB_ResetEP(n); |
frank26080115 | 0:bf7b9fba3924 | 595 | msk |= m; |
frank26080115 | 0:bf7b9fba3924 | 596 | } |
frank26080115 | 0:bf7b9fba3924 | 597 | else if ((alt == old) && ((msk & m) == 0)) { |
frank26080115 | 0:bf7b9fba3924 | 598 | USB_EndPointMask &= ~m; |
frank26080115 | 0:bf7b9fba3924 | 599 | USB_EndPointHalt &= ~m; |
frank26080115 | 0:bf7b9fba3924 | 600 | USB_DisableEP(n); |
frank26080115 | 0:bf7b9fba3924 | 601 | } |
frank26080115 | 0:bf7b9fba3924 | 602 | } |
frank26080115 | 0:bf7b9fba3924 | 603 | break; |
frank26080115 | 0:bf7b9fba3924 | 604 | } |
frank26080115 | 0:bf7b9fba3924 | 605 | // (uint8_t *)pD += pD->bLength; |
frank26080115 | 0:bf7b9fba3924 | 606 | tmp = (uint32_t)pD; |
frank26080115 | 0:bf7b9fba3924 | 607 | tmp += pD->bLength; |
frank26080115 | 0:bf7b9fba3924 | 608 | pD = (USB_COMMON_DESCRIPTOR *)tmp; |
frank26080115 | 0:bf7b9fba3924 | 609 | } |
frank26080115 | 0:bf7b9fba3924 | 610 | break; |
frank26080115 | 0:bf7b9fba3924 | 611 | default: |
frank26080115 | 0:bf7b9fba3924 | 612 | return (FALSE); |
frank26080115 | 0:bf7b9fba3924 | 613 | } |
frank26080115 | 0:bf7b9fba3924 | 614 | |
frank26080115 | 0:bf7b9fba3924 | 615 | return (set); |
frank26080115 | 0:bf7b9fba3924 | 616 | } |
frank26080115 | 0:bf7b9fba3924 | 617 | |
frank26080115 | 0:bf7b9fba3924 | 618 | |
frank26080115 | 0:bf7b9fba3924 | 619 | /* |
frank26080115 | 0:bf7b9fba3924 | 620 | * USB Endpoint 0 Event Callback |
frank26080115 | 0:bf7b9fba3924 | 621 | * Parameters: event |
frank26080115 | 0:bf7b9fba3924 | 622 | * Return Value: none |
frank26080115 | 0:bf7b9fba3924 | 623 | */ |
frank26080115 | 0:bf7b9fba3924 | 624 | |
frank26080115 | 0:bf7b9fba3924 | 625 | void USB_EndPoint0 (uint32_t event) { |
frank26080115 | 0:bf7b9fba3924 | 626 | |
frank26080115 | 0:bf7b9fba3924 | 627 | switch (event) { |
frank26080115 | 0:bf7b9fba3924 | 628 | case USB_EVT_SETUP: |
frank26080115 | 0:bf7b9fba3924 | 629 | USB_SetupStage(); |
frank26080115 | 0:bf7b9fba3924 | 630 | USB_DirCtrlEP(SetupPacket.bmRequestType.BM.Dir); |
frank26080115 | 0:bf7b9fba3924 | 631 | EP0Data.Count = SetupPacket.wLength; /* Number of bytes to transfer */ |
frank26080115 | 0:bf7b9fba3924 | 632 | switch (SetupPacket.bmRequestType.BM.Type) { |
frank26080115 | 0:bf7b9fba3924 | 633 | |
frank26080115 | 0:bf7b9fba3924 | 634 | case REQUEST_STANDARD: |
frank26080115 | 0:bf7b9fba3924 | 635 | switch (SetupPacket.bRequest) { |
frank26080115 | 0:bf7b9fba3924 | 636 | case USB_REQUEST_GET_STATUS: |
frank26080115 | 0:bf7b9fba3924 | 637 | if (!USB_ReqGetStatus()) { |
frank26080115 | 0:bf7b9fba3924 | 638 | goto stall_i; |
frank26080115 | 0:bf7b9fba3924 | 639 | } |
frank26080115 | 0:bf7b9fba3924 | 640 | USB_DataInStage(); |
frank26080115 | 0:bf7b9fba3924 | 641 | break; |
frank26080115 | 0:bf7b9fba3924 | 642 | |
frank26080115 | 0:bf7b9fba3924 | 643 | case USB_REQUEST_CLEAR_FEATURE: |
frank26080115 | 0:bf7b9fba3924 | 644 | if (!USB_ReqSetClrFeature(0)) { |
frank26080115 | 0:bf7b9fba3924 | 645 | goto stall_i; |
frank26080115 | 0:bf7b9fba3924 | 646 | } |
frank26080115 | 0:bf7b9fba3924 | 647 | USB_StatusInStage(); |
frank26080115 | 0:bf7b9fba3924 | 648 | #if USB_FEATURE_EVENT |
frank26080115 | 0:bf7b9fba3924 | 649 | USB_Feature_Event(); |
frank26080115 | 0:bf7b9fba3924 | 650 | #endif |
frank26080115 | 0:bf7b9fba3924 | 651 | break; |
frank26080115 | 0:bf7b9fba3924 | 652 | |
frank26080115 | 0:bf7b9fba3924 | 653 | case USB_REQUEST_SET_FEATURE: |
frank26080115 | 0:bf7b9fba3924 | 654 | if (!USB_ReqSetClrFeature(1)) { |
frank26080115 | 0:bf7b9fba3924 | 655 | goto stall_i; |
frank26080115 | 0:bf7b9fba3924 | 656 | } |
frank26080115 | 0:bf7b9fba3924 | 657 | USB_StatusInStage(); |
frank26080115 | 0:bf7b9fba3924 | 658 | #if USB_FEATURE_EVENT |
frank26080115 | 0:bf7b9fba3924 | 659 | USB_Feature_Event(); |
frank26080115 | 0:bf7b9fba3924 | 660 | #endif |
frank26080115 | 0:bf7b9fba3924 | 661 | break; |
frank26080115 | 0:bf7b9fba3924 | 662 | |
frank26080115 | 0:bf7b9fba3924 | 663 | case USB_REQUEST_SET_ADDRESS: |
frank26080115 | 0:bf7b9fba3924 | 664 | if (!USB_ReqSetAddress()) { |
frank26080115 | 0:bf7b9fba3924 | 665 | goto stall_i; |
frank26080115 | 0:bf7b9fba3924 | 666 | } |
frank26080115 | 0:bf7b9fba3924 | 667 | USB_StatusInStage(); |
frank26080115 | 0:bf7b9fba3924 | 668 | break; |
frank26080115 | 0:bf7b9fba3924 | 669 | |
frank26080115 | 0:bf7b9fba3924 | 670 | case USB_REQUEST_GET_DESCRIPTOR: |
frank26080115 | 0:bf7b9fba3924 | 671 | if (!USB_ReqGetDescriptor()) { |
frank26080115 | 0:bf7b9fba3924 | 672 | goto stall_i; |
frank26080115 | 0:bf7b9fba3924 | 673 | } |
frank26080115 | 0:bf7b9fba3924 | 674 | USB_DataInStage(); |
frank26080115 | 0:bf7b9fba3924 | 675 | break; |
frank26080115 | 0:bf7b9fba3924 | 676 | |
frank26080115 | 0:bf7b9fba3924 | 677 | case USB_REQUEST_SET_DESCRIPTOR: |
frank26080115 | 0:bf7b9fba3924 | 678 | /*stall_o:*/ USB_SetStallEP(0x00); /* not supported */ |
frank26080115 | 0:bf7b9fba3924 | 679 | EP0Data.Count = 0; |
frank26080115 | 0:bf7b9fba3924 | 680 | break; |
frank26080115 | 0:bf7b9fba3924 | 681 | |
frank26080115 | 0:bf7b9fba3924 | 682 | case USB_REQUEST_GET_CONFIGURATION: |
frank26080115 | 0:bf7b9fba3924 | 683 | if (!USB_ReqGetConfiguration()) { |
frank26080115 | 0:bf7b9fba3924 | 684 | goto stall_i; |
frank26080115 | 0:bf7b9fba3924 | 685 | } |
frank26080115 | 0:bf7b9fba3924 | 686 | USB_DataInStage(); |
frank26080115 | 0:bf7b9fba3924 | 687 | break; |
frank26080115 | 0:bf7b9fba3924 | 688 | |
frank26080115 | 0:bf7b9fba3924 | 689 | case USB_REQUEST_SET_CONFIGURATION: |
frank26080115 | 0:bf7b9fba3924 | 690 | if (!USB_ReqSetConfiguration()) { |
frank26080115 | 0:bf7b9fba3924 | 691 | goto stall_i; |
frank26080115 | 0:bf7b9fba3924 | 692 | } |
frank26080115 | 0:bf7b9fba3924 | 693 | USB_StatusInStage(); |
frank26080115 | 0:bf7b9fba3924 | 694 | #if USB_CONFIGURE_EVENT |
frank26080115 | 0:bf7b9fba3924 | 695 | USB_Configure_Event(); |
frank26080115 | 0:bf7b9fba3924 | 696 | #endif |
frank26080115 | 0:bf7b9fba3924 | 697 | break; |
frank26080115 | 0:bf7b9fba3924 | 698 | |
frank26080115 | 0:bf7b9fba3924 | 699 | case USB_REQUEST_GET_INTERFACE: |
frank26080115 | 0:bf7b9fba3924 | 700 | if (!USB_ReqGetInterface()) { |
frank26080115 | 0:bf7b9fba3924 | 701 | goto stall_i; |
frank26080115 | 0:bf7b9fba3924 | 702 | } |
frank26080115 | 0:bf7b9fba3924 | 703 | USB_DataInStage(); |
frank26080115 | 0:bf7b9fba3924 | 704 | break; |
frank26080115 | 0:bf7b9fba3924 | 705 | |
frank26080115 | 0:bf7b9fba3924 | 706 | case USB_REQUEST_SET_INTERFACE: |
frank26080115 | 0:bf7b9fba3924 | 707 | if (!USB_ReqSetInterface()) { |
frank26080115 | 0:bf7b9fba3924 | 708 | goto stall_i; |
frank26080115 | 0:bf7b9fba3924 | 709 | } |
frank26080115 | 0:bf7b9fba3924 | 710 | USB_StatusInStage(); |
frank26080115 | 0:bf7b9fba3924 | 711 | #if USB_INTERFACE_EVENT |
frank26080115 | 0:bf7b9fba3924 | 712 | USB_Interface_Event(); |
frank26080115 | 0:bf7b9fba3924 | 713 | #endif |
frank26080115 | 0:bf7b9fba3924 | 714 | break; |
frank26080115 | 0:bf7b9fba3924 | 715 | |
frank26080115 | 0:bf7b9fba3924 | 716 | default: |
frank26080115 | 0:bf7b9fba3924 | 717 | goto stall_i; |
frank26080115 | 0:bf7b9fba3924 | 718 | } |
frank26080115 | 0:bf7b9fba3924 | 719 | break; /* end case REQUEST_STANDARD */ |
frank26080115 | 0:bf7b9fba3924 | 720 | |
frank26080115 | 0:bf7b9fba3924 | 721 | #if USB_CLASS |
frank26080115 | 0:bf7b9fba3924 | 722 | case REQUEST_CLASS: |
frank26080115 | 0:bf7b9fba3924 | 723 | switch (SetupPacket.bmRequestType.BM.Recipient) { |
frank26080115 | 0:bf7b9fba3924 | 724 | |
frank26080115 | 0:bf7b9fba3924 | 725 | case REQUEST_TO_DEVICE: |
frank26080115 | 0:bf7b9fba3924 | 726 | goto stall_i; /* not supported */ |
frank26080115 | 0:bf7b9fba3924 | 727 | |
frank26080115 | 0:bf7b9fba3924 | 728 | case REQUEST_TO_INTERFACE: |
frank26080115 | 0:bf7b9fba3924 | 729 | #if USB_HID |
frank26080115 | 0:bf7b9fba3924 | 730 | if (SetupPacket.wIndex.WB.L == USB_HID_IF_NUM) { /* IF number correct? */ |
frank26080115 | 0:bf7b9fba3924 | 731 | switch (SetupPacket.bRequest) { |
frank26080115 | 0:bf7b9fba3924 | 732 | case HID_REQUEST_GET_REPORT: |
frank26080115 | 0:bf7b9fba3924 | 733 | if (HID_GetReport()) { |
frank26080115 | 0:bf7b9fba3924 | 734 | EP0Data.pData = EP0Buf; /* point to data to be sent */ |
frank26080115 | 0:bf7b9fba3924 | 735 | USB_DataInStage(); /* send requested data */ |
frank26080115 | 0:bf7b9fba3924 | 736 | goto setup_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 737 | } |
frank26080115 | 0:bf7b9fba3924 | 738 | break; |
frank26080115 | 0:bf7b9fba3924 | 739 | case HID_REQUEST_SET_REPORT: |
frank26080115 | 0:bf7b9fba3924 | 740 | EP0Data.pData = EP0Buf; /* data to be received */ |
frank26080115 | 0:bf7b9fba3924 | 741 | goto setup_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 742 | case HID_REQUEST_GET_IDLE: |
frank26080115 | 0:bf7b9fba3924 | 743 | if (HID_GetIdle()) { |
frank26080115 | 0:bf7b9fba3924 | 744 | EP0Data.pData = EP0Buf; /* point to data to be sent */ |
frank26080115 | 0:bf7b9fba3924 | 745 | USB_DataInStage(); /* send requested data */ |
frank26080115 | 0:bf7b9fba3924 | 746 | goto setup_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 747 | } |
frank26080115 | 0:bf7b9fba3924 | 748 | break; |
frank26080115 | 0:bf7b9fba3924 | 749 | case HID_REQUEST_SET_IDLE: |
frank26080115 | 0:bf7b9fba3924 | 750 | if (HID_SetIdle()) { |
frank26080115 | 0:bf7b9fba3924 | 751 | USB_StatusInStage(); /* send Acknowledge */ |
frank26080115 | 0:bf7b9fba3924 | 752 | goto setup_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 753 | } |
frank26080115 | 0:bf7b9fba3924 | 754 | break; |
frank26080115 | 0:bf7b9fba3924 | 755 | case HID_REQUEST_GET_PROTOCOL: |
frank26080115 | 0:bf7b9fba3924 | 756 | if (HID_GetProtocol()) { |
frank26080115 | 0:bf7b9fba3924 | 757 | EP0Data.pData = EP0Buf; /* point to data to be sent */ |
frank26080115 | 0:bf7b9fba3924 | 758 | USB_DataInStage(); /* send requested data */ |
frank26080115 | 0:bf7b9fba3924 | 759 | goto setup_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 760 | } |
frank26080115 | 0:bf7b9fba3924 | 761 | break; |
frank26080115 | 0:bf7b9fba3924 | 762 | case HID_REQUEST_SET_PROTOCOL: |
frank26080115 | 0:bf7b9fba3924 | 763 | if (HID_SetProtocol()) { |
frank26080115 | 0:bf7b9fba3924 | 764 | USB_StatusInStage(); /* send Acknowledge */ |
frank26080115 | 0:bf7b9fba3924 | 765 | goto setup_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 766 | } |
frank26080115 | 0:bf7b9fba3924 | 767 | break; |
frank26080115 | 0:bf7b9fba3924 | 768 | } |
frank26080115 | 0:bf7b9fba3924 | 769 | } |
frank26080115 | 0:bf7b9fba3924 | 770 | #endif /* USB_HID */ |
frank26080115 | 0:bf7b9fba3924 | 771 | #if USB_MSC |
frank26080115 | 0:bf7b9fba3924 | 772 | if (SetupPacket.wIndex.WB.L == USB_MSC_IF_NUM) { /* IF number correct? */ |
frank26080115 | 0:bf7b9fba3924 | 773 | switch (SetupPacket.bRequest) { |
frank26080115 | 0:bf7b9fba3924 | 774 | case MSC_REQUEST_RESET: |
frank26080115 | 0:bf7b9fba3924 | 775 | if ((SetupPacket.wValue.W == 0) && /* RESET with invalid parameters -> STALL */ |
frank26080115 | 0:bf7b9fba3924 | 776 | (SetupPacket.wLength == 0)) { |
frank26080115 | 0:bf7b9fba3924 | 777 | if (MSC_Reset()) { |
frank26080115 | 0:bf7b9fba3924 | 778 | USB_StatusInStage(); |
frank26080115 | 0:bf7b9fba3924 | 779 | goto setup_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 780 | } |
frank26080115 | 0:bf7b9fba3924 | 781 | } |
frank26080115 | 0:bf7b9fba3924 | 782 | break; |
frank26080115 | 0:bf7b9fba3924 | 783 | case MSC_REQUEST_GET_MAX_LUN: |
frank26080115 | 0:bf7b9fba3924 | 784 | if ((SetupPacket.wValue.W == 0) && /* GET_MAX_LUN with invalid parameters -> STALL */ |
frank26080115 | 0:bf7b9fba3924 | 785 | (SetupPacket.wLength == 1)) { |
frank26080115 | 0:bf7b9fba3924 | 786 | if (MSC_GetMaxLUN()) { |
frank26080115 | 0:bf7b9fba3924 | 787 | EP0Data.pData = EP0Buf; |
frank26080115 | 0:bf7b9fba3924 | 788 | USB_DataInStage(); |
frank26080115 | 0:bf7b9fba3924 | 789 | goto setup_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 790 | } |
frank26080115 | 0:bf7b9fba3924 | 791 | } |
frank26080115 | 0:bf7b9fba3924 | 792 | break; |
frank26080115 | 0:bf7b9fba3924 | 793 | } |
frank26080115 | 0:bf7b9fba3924 | 794 | } |
frank26080115 | 0:bf7b9fba3924 | 795 | #endif /* USB_MSC */ |
frank26080115 | 0:bf7b9fba3924 | 796 | #if USB_AUDIO |
frank26080115 | 0:bf7b9fba3924 | 797 | if ((SetupPacket.wIndex.WB.L == USB_ADC_CIF_NUM) || /* IF number correct? */ |
frank26080115 | 0:bf7b9fba3924 | 798 | (SetupPacket.wIndex.WB.L == USB_ADC_SIF1_NUM) || |
frank26080115 | 0:bf7b9fba3924 | 799 | (SetupPacket.wIndex.WB.L == USB_ADC_SIF2_NUM)) { |
frank26080115 | 0:bf7b9fba3924 | 800 | switch (SetupPacket.bRequest) { |
frank26080115 | 0:bf7b9fba3924 | 801 | case AUDIO_REQUEST_GET_CUR: |
frank26080115 | 0:bf7b9fba3924 | 802 | case AUDIO_REQUEST_GET_MIN: |
frank26080115 | 0:bf7b9fba3924 | 803 | case AUDIO_REQUEST_GET_MAX: |
frank26080115 | 0:bf7b9fba3924 | 804 | case AUDIO_REQUEST_GET_RES: |
frank26080115 | 0:bf7b9fba3924 | 805 | if (ADC_IF_GetRequest()) { |
frank26080115 | 0:bf7b9fba3924 | 806 | EP0Data.pData = EP0Buf; /* point to data to be sent */ |
frank26080115 | 0:bf7b9fba3924 | 807 | USB_DataInStage(); /* send requested data */ |
frank26080115 | 0:bf7b9fba3924 | 808 | goto setup_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 809 | } |
frank26080115 | 0:bf7b9fba3924 | 810 | break; |
frank26080115 | 0:bf7b9fba3924 | 811 | case AUDIO_REQUEST_SET_CUR: |
frank26080115 | 0:bf7b9fba3924 | 812 | // case AUDIO_REQUEST_SET_MIN: |
frank26080115 | 0:bf7b9fba3924 | 813 | // case AUDIO_REQUEST_SET_MAX: |
frank26080115 | 0:bf7b9fba3924 | 814 | // case AUDIO_REQUEST_SET_RES: |
frank26080115 | 0:bf7b9fba3924 | 815 | EP0Data.pData = EP0Buf; /* data to be received */ |
frank26080115 | 0:bf7b9fba3924 | 816 | goto setup_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 817 | } |
frank26080115 | 0:bf7b9fba3924 | 818 | } |
frank26080115 | 0:bf7b9fba3924 | 819 | #endif /* USB_AUDIO */ |
frank26080115 | 0:bf7b9fba3924 | 820 | #if USB_CDC |
frank26080115 | 0:bf7b9fba3924 | 821 | if ((SetupPacket.wIndex.WB.L == USB_CDC_CIF_NUM) || /* IF number correct? */ |
frank26080115 | 0:bf7b9fba3924 | 822 | (SetupPacket.wIndex.WB.L == USB_CDC_DIF_NUM)) { |
frank26080115 | 0:bf7b9fba3924 | 823 | switch (SetupPacket.bRequest) { |
frank26080115 | 0:bf7b9fba3924 | 824 | case CDC_SEND_ENCAPSULATED_COMMAND: |
frank26080115 | 0:bf7b9fba3924 | 825 | EP0Data.pData = EP0Buf; /* data to be received, see USB_EVT_OUT */ |
frank26080115 | 0:bf7b9fba3924 | 826 | goto setup_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 827 | case CDC_GET_ENCAPSULATED_RESPONSE: |
frank26080115 | 0:bf7b9fba3924 | 828 | if (CDC_GetEncapsulatedResponse()) { |
frank26080115 | 0:bf7b9fba3924 | 829 | EP0Data.pData = EP0Buf; /* point to data to be sent */ |
frank26080115 | 0:bf7b9fba3924 | 830 | USB_DataInStage(); /* send requested data */ |
frank26080115 | 0:bf7b9fba3924 | 831 | goto setup_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 832 | } |
frank26080115 | 0:bf7b9fba3924 | 833 | break; |
frank26080115 | 0:bf7b9fba3924 | 834 | case CDC_SET_COMM_FEATURE: |
frank26080115 | 0:bf7b9fba3924 | 835 | EP0Data.pData = EP0Buf; /* data to be received, see USB_EVT_OUT */ |
frank26080115 | 0:bf7b9fba3924 | 836 | goto setup_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 837 | case CDC_GET_COMM_FEATURE: |
frank26080115 | 0:bf7b9fba3924 | 838 | if (CDC_GetCommFeature(SetupPacket.wValue.W)) { |
frank26080115 | 0:bf7b9fba3924 | 839 | EP0Data.pData = EP0Buf; /* point to data to be sent */ |
frank26080115 | 0:bf7b9fba3924 | 840 | USB_DataInStage(); /* send requested data */ |
frank26080115 | 0:bf7b9fba3924 | 841 | goto setup_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 842 | } |
frank26080115 | 0:bf7b9fba3924 | 843 | break; |
frank26080115 | 0:bf7b9fba3924 | 844 | case CDC_CLEAR_COMM_FEATURE: |
frank26080115 | 0:bf7b9fba3924 | 845 | if (CDC_ClearCommFeature(SetupPacket.wValue.W)) { |
frank26080115 | 0:bf7b9fba3924 | 846 | USB_StatusInStage(); /* send Acknowledge */ |
frank26080115 | 0:bf7b9fba3924 | 847 | goto setup_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 848 | } |
frank26080115 | 0:bf7b9fba3924 | 849 | break; |
frank26080115 | 0:bf7b9fba3924 | 850 | case CDC_SET_LINE_CODING: |
frank26080115 | 0:bf7b9fba3924 | 851 | EP0Data.pData = EP0Buf; /* data to be received, see USB_EVT_OUT */ |
frank26080115 | 0:bf7b9fba3924 | 852 | goto setup_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 853 | case CDC_GET_LINE_CODING: |
frank26080115 | 0:bf7b9fba3924 | 854 | if (CDC_GetLineCoding()) { |
frank26080115 | 0:bf7b9fba3924 | 855 | EP0Data.pData = EP0Buf; /* point to data to be sent */ |
frank26080115 | 0:bf7b9fba3924 | 856 | USB_DataInStage(); /* send requested data */ |
frank26080115 | 0:bf7b9fba3924 | 857 | goto setup_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 858 | } |
frank26080115 | 0:bf7b9fba3924 | 859 | break; |
frank26080115 | 0:bf7b9fba3924 | 860 | case CDC_SET_CONTROL_LINE_STATE: |
frank26080115 | 0:bf7b9fba3924 | 861 | if (CDC_SetControlLineState(SetupPacket.wValue.W)) { |
frank26080115 | 0:bf7b9fba3924 | 862 | USB_StatusInStage(); /* send Acknowledge */ |
frank26080115 | 0:bf7b9fba3924 | 863 | goto setup_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 864 | } |
frank26080115 | 0:bf7b9fba3924 | 865 | break; |
frank26080115 | 0:bf7b9fba3924 | 866 | case CDC_SEND_BREAK: |
frank26080115 | 0:bf7b9fba3924 | 867 | if (CDC_SendBreak(SetupPacket.wValue.W)) { |
frank26080115 | 0:bf7b9fba3924 | 868 | USB_StatusInStage(); /* send Acknowledge */ |
frank26080115 | 0:bf7b9fba3924 | 869 | goto setup_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 870 | } |
frank26080115 | 0:bf7b9fba3924 | 871 | break; |
frank26080115 | 0:bf7b9fba3924 | 872 | } |
frank26080115 | 0:bf7b9fba3924 | 873 | } |
frank26080115 | 0:bf7b9fba3924 | 874 | #endif /* USB_CDC */ |
frank26080115 | 0:bf7b9fba3924 | 875 | goto stall_i; /* not supported */ |
frank26080115 | 0:bf7b9fba3924 | 876 | /* end case REQUEST_TO_INTERFACE */ |
frank26080115 | 0:bf7b9fba3924 | 877 | |
frank26080115 | 0:bf7b9fba3924 | 878 | case REQUEST_TO_ENDPOINT: |
frank26080115 | 0:bf7b9fba3924 | 879 | #if USB_AUDIO |
frank26080115 | 0:bf7b9fba3924 | 880 | switch (SetupPacket.bRequest) { |
frank26080115 | 0:bf7b9fba3924 | 881 | case AUDIO_REQUEST_GET_CUR: |
frank26080115 | 0:bf7b9fba3924 | 882 | case AUDIO_REQUEST_GET_MIN: |
frank26080115 | 0:bf7b9fba3924 | 883 | case AUDIO_REQUEST_GET_MAX: |
frank26080115 | 0:bf7b9fba3924 | 884 | case AUDIO_REQUEST_GET_RES: |
frank26080115 | 0:bf7b9fba3924 | 885 | if (ADC_EP_GetRequest()) { |
frank26080115 | 0:bf7b9fba3924 | 886 | EP0Data.pData = EP0Buf; /* point to data to be sent */ |
frank26080115 | 0:bf7b9fba3924 | 887 | USB_DataInStage(); /* send requested data */ |
frank26080115 | 0:bf7b9fba3924 | 888 | goto setup_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 889 | } |
frank26080115 | 0:bf7b9fba3924 | 890 | break; |
frank26080115 | 0:bf7b9fba3924 | 891 | case AUDIO_REQUEST_SET_CUR: |
frank26080115 | 0:bf7b9fba3924 | 892 | // case AUDIO_REQUEST_SET_MIN: |
frank26080115 | 0:bf7b9fba3924 | 893 | // case AUDIO_REQUEST_SET_MAX: |
frank26080115 | 0:bf7b9fba3924 | 894 | // case AUDIO_REQUEST_SET_RES: |
frank26080115 | 0:bf7b9fba3924 | 895 | EP0Data.pData = EP0Buf; /* data to be received */ |
frank26080115 | 0:bf7b9fba3924 | 896 | goto setup_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 897 | } |
frank26080115 | 0:bf7b9fba3924 | 898 | #endif /* USB_AUDIO */ |
frank26080115 | 0:bf7b9fba3924 | 899 | goto stall_i; |
frank26080115 | 0:bf7b9fba3924 | 900 | /* end case REQUEST_TO_ENDPOINT */ |
frank26080115 | 0:bf7b9fba3924 | 901 | |
frank26080115 | 0:bf7b9fba3924 | 902 | default: |
frank26080115 | 0:bf7b9fba3924 | 903 | goto stall_i; |
frank26080115 | 0:bf7b9fba3924 | 904 | } |
frank26080115 | 0:bf7b9fba3924 | 905 | setup_class_ok: /* request finished successfully */ |
frank26080115 | 0:bf7b9fba3924 | 906 | break; /* end case REQUEST_CLASS */ |
frank26080115 | 0:bf7b9fba3924 | 907 | #endif /* USB_CLASS */ |
frank26080115 | 0:bf7b9fba3924 | 908 | |
frank26080115 | 0:bf7b9fba3924 | 909 | #if USB_VENDOR |
frank26080115 | 0:bf7b9fba3924 | 910 | case REQUEST_VENDOR: |
frank26080115 | 0:bf7b9fba3924 | 911 | switch (SetupPacket.bmRequestType.BM.Recipient) { |
frank26080115 | 0:bf7b9fba3924 | 912 | |
frank26080115 | 0:bf7b9fba3924 | 913 | case REQUEST_TO_DEVICE: |
frank26080115 | 0:bf7b9fba3924 | 914 | if (!USB_ReqVendorDev(TRUE)) { |
frank26080115 | 0:bf7b9fba3924 | 915 | goto stall_i; /* not supported */ |
frank26080115 | 0:bf7b9fba3924 | 916 | } |
frank26080115 | 0:bf7b9fba3924 | 917 | break; |
frank26080115 | 0:bf7b9fba3924 | 918 | |
frank26080115 | 0:bf7b9fba3924 | 919 | case REQUEST_TO_INTERFACE: |
frank26080115 | 0:bf7b9fba3924 | 920 | if (!USB_ReqVendorIF(TRUE)) { |
frank26080115 | 0:bf7b9fba3924 | 921 | goto stall_i; /* not supported */ |
frank26080115 | 0:bf7b9fba3924 | 922 | } |
frank26080115 | 0:bf7b9fba3924 | 923 | break; |
frank26080115 | 0:bf7b9fba3924 | 924 | |
frank26080115 | 0:bf7b9fba3924 | 925 | case REQUEST_TO_ENDPOINT: |
frank26080115 | 0:bf7b9fba3924 | 926 | if (!USB_ReqVendorEP(TRUE)) { |
frank26080115 | 0:bf7b9fba3924 | 927 | goto stall_i; /* not supported */ |
frank26080115 | 0:bf7b9fba3924 | 928 | } |
frank26080115 | 0:bf7b9fba3924 | 929 | break; |
frank26080115 | 0:bf7b9fba3924 | 930 | |
frank26080115 | 0:bf7b9fba3924 | 931 | default: |
frank26080115 | 0:bf7b9fba3924 | 932 | goto stall_i; |
frank26080115 | 0:bf7b9fba3924 | 933 | } |
frank26080115 | 0:bf7b9fba3924 | 934 | |
frank26080115 | 0:bf7b9fba3924 | 935 | if (SetupPacket.wLength) { |
frank26080115 | 0:bf7b9fba3924 | 936 | if (SetupPacket.bmRequestType.BM.Dir == REQUEST_DEVICE_TO_HOST) { |
frank26080115 | 0:bf7b9fba3924 | 937 | USB_DataInStage(); |
frank26080115 | 0:bf7b9fba3924 | 938 | } |
frank26080115 | 0:bf7b9fba3924 | 939 | } else { |
frank26080115 | 0:bf7b9fba3924 | 940 | USB_StatusInStage(); |
frank26080115 | 0:bf7b9fba3924 | 941 | } |
frank26080115 | 0:bf7b9fba3924 | 942 | |
frank26080115 | 0:bf7b9fba3924 | 943 | break; /* end case REQUEST_VENDOR */ |
frank26080115 | 0:bf7b9fba3924 | 944 | #endif /* USB_VENDOR */ |
frank26080115 | 0:bf7b9fba3924 | 945 | |
frank26080115 | 0:bf7b9fba3924 | 946 | default: |
frank26080115 | 0:bf7b9fba3924 | 947 | stall_i: USB_SetStallEP(0x80); |
frank26080115 | 0:bf7b9fba3924 | 948 | EP0Data.Count = 0; |
frank26080115 | 0:bf7b9fba3924 | 949 | break; |
frank26080115 | 0:bf7b9fba3924 | 950 | } |
frank26080115 | 0:bf7b9fba3924 | 951 | break; /* end case USB_EVT_SETUP */ |
frank26080115 | 0:bf7b9fba3924 | 952 | |
frank26080115 | 0:bf7b9fba3924 | 953 | case USB_EVT_OUT: |
frank26080115 | 0:bf7b9fba3924 | 954 | if (SetupPacket.bmRequestType.BM.Dir == REQUEST_HOST_TO_DEVICE) { |
frank26080115 | 0:bf7b9fba3924 | 955 | if (EP0Data.Count) { /* still data to receive ? */ |
frank26080115 | 0:bf7b9fba3924 | 956 | USB_DataOutStage(); /* receive data */ |
frank26080115 | 0:bf7b9fba3924 | 957 | if (EP0Data.Count == 0) { /* data complete ? */ |
frank26080115 | 0:bf7b9fba3924 | 958 | switch (SetupPacket.bmRequestType.BM.Type) { |
frank26080115 | 0:bf7b9fba3924 | 959 | |
frank26080115 | 0:bf7b9fba3924 | 960 | case REQUEST_STANDARD: |
frank26080115 | 0:bf7b9fba3924 | 961 | goto stall_i; /* not supported */ |
frank26080115 | 0:bf7b9fba3924 | 962 | |
frank26080115 | 0:bf7b9fba3924 | 963 | #if (USB_CLASS) |
frank26080115 | 0:bf7b9fba3924 | 964 | case REQUEST_CLASS: |
frank26080115 | 0:bf7b9fba3924 | 965 | switch (SetupPacket.bmRequestType.BM.Recipient) { |
frank26080115 | 0:bf7b9fba3924 | 966 | case REQUEST_TO_DEVICE: |
frank26080115 | 0:bf7b9fba3924 | 967 | goto stall_i; /* not supported */ |
frank26080115 | 0:bf7b9fba3924 | 968 | |
frank26080115 | 0:bf7b9fba3924 | 969 | case REQUEST_TO_INTERFACE: |
frank26080115 | 0:bf7b9fba3924 | 970 | #if USB_HID |
frank26080115 | 0:bf7b9fba3924 | 971 | if (SetupPacket.wIndex.WB.L == USB_HID_IF_NUM) { /* IF number correct? */ |
frank26080115 | 0:bf7b9fba3924 | 972 | switch (SetupPacket.bRequest) { |
frank26080115 | 0:bf7b9fba3924 | 973 | case HID_REQUEST_SET_REPORT: |
frank26080115 | 0:bf7b9fba3924 | 974 | if (HID_SetReport()) { |
frank26080115 | 0:bf7b9fba3924 | 975 | USB_StatusInStage(); /* send Acknowledge */ |
frank26080115 | 0:bf7b9fba3924 | 976 | goto out_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 977 | } |
frank26080115 | 0:bf7b9fba3924 | 978 | break; |
frank26080115 | 0:bf7b9fba3924 | 979 | } |
frank26080115 | 0:bf7b9fba3924 | 980 | } |
frank26080115 | 0:bf7b9fba3924 | 981 | #endif /* USB_HID */ |
frank26080115 | 0:bf7b9fba3924 | 982 | #if USB_AUDIO |
frank26080115 | 0:bf7b9fba3924 | 983 | if ((SetupPacket.wIndex.WB.L == USB_ADC_CIF_NUM) || /* IF number correct? */ |
frank26080115 | 0:bf7b9fba3924 | 984 | (SetupPacket.wIndex.WB.L == USB_ADC_SIF1_NUM) || |
frank26080115 | 0:bf7b9fba3924 | 985 | (SetupPacket.wIndex.WB.L == USB_ADC_SIF2_NUM)) { |
frank26080115 | 0:bf7b9fba3924 | 986 | switch (SetupPacket.bRequest) { |
frank26080115 | 0:bf7b9fba3924 | 987 | case AUDIO_REQUEST_SET_CUR: |
frank26080115 | 0:bf7b9fba3924 | 988 | // case AUDIO_REQUEST_SET_MIN: |
frank26080115 | 0:bf7b9fba3924 | 989 | // case AUDIO_REQUEST_SET_MAX: |
frank26080115 | 0:bf7b9fba3924 | 990 | // case AUDIO_REQUEST_SET_RES: |
frank26080115 | 0:bf7b9fba3924 | 991 | if (ADC_IF_SetRequest()) { |
frank26080115 | 0:bf7b9fba3924 | 992 | USB_StatusInStage(); /* send Acknowledge */ |
frank26080115 | 0:bf7b9fba3924 | 993 | goto out_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 994 | } |
frank26080115 | 0:bf7b9fba3924 | 995 | break; |
frank26080115 | 0:bf7b9fba3924 | 996 | } |
frank26080115 | 0:bf7b9fba3924 | 997 | } |
frank26080115 | 0:bf7b9fba3924 | 998 | #endif /* USB_AUDIO */ |
frank26080115 | 0:bf7b9fba3924 | 999 | #if USB_CDC |
frank26080115 | 0:bf7b9fba3924 | 1000 | if ((SetupPacket.wIndex.WB.L == USB_CDC_CIF_NUM) || /* IF number correct? */ |
frank26080115 | 0:bf7b9fba3924 | 1001 | (SetupPacket.wIndex.WB.L == USB_CDC_DIF_NUM)) { |
frank26080115 | 0:bf7b9fba3924 | 1002 | switch (SetupPacket.bRequest) { |
frank26080115 | 0:bf7b9fba3924 | 1003 | case CDC_SEND_ENCAPSULATED_COMMAND: |
frank26080115 | 0:bf7b9fba3924 | 1004 | if (CDC_SendEncapsulatedCommand()) { |
frank26080115 | 0:bf7b9fba3924 | 1005 | USB_StatusInStage(); /* send Acknowledge */ |
frank26080115 | 0:bf7b9fba3924 | 1006 | goto out_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 1007 | } |
frank26080115 | 0:bf7b9fba3924 | 1008 | break; |
frank26080115 | 0:bf7b9fba3924 | 1009 | case CDC_SET_COMM_FEATURE: |
frank26080115 | 0:bf7b9fba3924 | 1010 | if (CDC_SetCommFeature(SetupPacket.wValue.W)) { |
frank26080115 | 0:bf7b9fba3924 | 1011 | USB_StatusInStage(); /* send Acknowledge */ |
frank26080115 | 0:bf7b9fba3924 | 1012 | goto out_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 1013 | } |
frank26080115 | 0:bf7b9fba3924 | 1014 | break; |
frank26080115 | 0:bf7b9fba3924 | 1015 | case CDC_SET_LINE_CODING: |
frank26080115 | 0:bf7b9fba3924 | 1016 | if (CDC_SetLineCoding()) { |
frank26080115 | 0:bf7b9fba3924 | 1017 | USB_StatusInStage(); /* send Acknowledge */ |
frank26080115 | 0:bf7b9fba3924 | 1018 | goto out_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 1019 | } |
frank26080115 | 0:bf7b9fba3924 | 1020 | break; |
frank26080115 | 0:bf7b9fba3924 | 1021 | } |
frank26080115 | 0:bf7b9fba3924 | 1022 | } |
frank26080115 | 0:bf7b9fba3924 | 1023 | #endif /* USB_CDC */ |
frank26080115 | 0:bf7b9fba3924 | 1024 | goto stall_i; |
frank26080115 | 0:bf7b9fba3924 | 1025 | /* end case REQUEST_TO_INTERFACE */ |
frank26080115 | 0:bf7b9fba3924 | 1026 | |
frank26080115 | 0:bf7b9fba3924 | 1027 | case REQUEST_TO_ENDPOINT: |
frank26080115 | 0:bf7b9fba3924 | 1028 | #if USB_AUDIO |
frank26080115 | 0:bf7b9fba3924 | 1029 | switch (SetupPacket.bRequest) { |
frank26080115 | 0:bf7b9fba3924 | 1030 | case AUDIO_REQUEST_SET_CUR: |
frank26080115 | 0:bf7b9fba3924 | 1031 | // case AUDIO_REQUEST_SET_MIN: |
frank26080115 | 0:bf7b9fba3924 | 1032 | // case AUDIO_REQUEST_SET_MAX: |
frank26080115 | 0:bf7b9fba3924 | 1033 | // case AUDIO_REQUEST_SET_RES: |
frank26080115 | 0:bf7b9fba3924 | 1034 | if (ADC_EP_SetRequest()) { |
frank26080115 | 0:bf7b9fba3924 | 1035 | USB_StatusInStage(); /* send Acknowledge */ |
frank26080115 | 0:bf7b9fba3924 | 1036 | goto out_class_ok; |
frank26080115 | 0:bf7b9fba3924 | 1037 | } |
frank26080115 | 0:bf7b9fba3924 | 1038 | break; |
frank26080115 | 0:bf7b9fba3924 | 1039 | } |
frank26080115 | 0:bf7b9fba3924 | 1040 | #endif /* USB_AUDIO */ |
frank26080115 | 0:bf7b9fba3924 | 1041 | goto stall_i; |
frank26080115 | 0:bf7b9fba3924 | 1042 | /* end case REQUEST_TO_ENDPOINT */ |
frank26080115 | 0:bf7b9fba3924 | 1043 | |
frank26080115 | 0:bf7b9fba3924 | 1044 | default: |
frank26080115 | 0:bf7b9fba3924 | 1045 | goto stall_i; |
frank26080115 | 0:bf7b9fba3924 | 1046 | } |
frank26080115 | 0:bf7b9fba3924 | 1047 | out_class_ok: /* request finished successfully */ |
frank26080115 | 0:bf7b9fba3924 | 1048 | break; /* end case REQUEST_CLASS */ |
frank26080115 | 0:bf7b9fba3924 | 1049 | #endif /* USB_CLASS */ |
frank26080115 | 0:bf7b9fba3924 | 1050 | |
frank26080115 | 0:bf7b9fba3924 | 1051 | #if USB_VENDOR |
frank26080115 | 0:bf7b9fba3924 | 1052 | case REQUEST_VENDOR: |
frank26080115 | 0:bf7b9fba3924 | 1053 | switch (SetupPacket.bmRequestType.BM.Recipient) { |
frank26080115 | 0:bf7b9fba3924 | 1054 | |
frank26080115 | 0:bf7b9fba3924 | 1055 | case REQUEST_TO_DEVICE: |
frank26080115 | 0:bf7b9fba3924 | 1056 | if (!USB_ReqVendorDev(FALSE)) { |
frank26080115 | 0:bf7b9fba3924 | 1057 | goto stall_i; /* not supported */ |
frank26080115 | 0:bf7b9fba3924 | 1058 | } |
frank26080115 | 0:bf7b9fba3924 | 1059 | break; |
frank26080115 | 0:bf7b9fba3924 | 1060 | |
frank26080115 | 0:bf7b9fba3924 | 1061 | case REQUEST_TO_INTERFACE: |
frank26080115 | 0:bf7b9fba3924 | 1062 | if (!USB_ReqVendorIF(FALSE)) { |
frank26080115 | 0:bf7b9fba3924 | 1063 | goto stall_i; /* not supported */ |
frank26080115 | 0:bf7b9fba3924 | 1064 | } |
frank26080115 | 0:bf7b9fba3924 | 1065 | break; |
frank26080115 | 0:bf7b9fba3924 | 1066 | |
frank26080115 | 0:bf7b9fba3924 | 1067 | case REQUEST_TO_ENDPOINT: |
frank26080115 | 0:bf7b9fba3924 | 1068 | if (!USB_ReqVendorEP(FALSE)) { |
frank26080115 | 0:bf7b9fba3924 | 1069 | goto stall_i; /* not supported */ |
frank26080115 | 0:bf7b9fba3924 | 1070 | } |
frank26080115 | 0:bf7b9fba3924 | 1071 | break; |
frank26080115 | 0:bf7b9fba3924 | 1072 | |
frank26080115 | 0:bf7b9fba3924 | 1073 | default: |
frank26080115 | 0:bf7b9fba3924 | 1074 | goto stall_i; |
frank26080115 | 0:bf7b9fba3924 | 1075 | } |
frank26080115 | 0:bf7b9fba3924 | 1076 | |
frank26080115 | 0:bf7b9fba3924 | 1077 | USB_StatusInStage(); |
frank26080115 | 0:bf7b9fba3924 | 1078 | |
frank26080115 | 0:bf7b9fba3924 | 1079 | break; /* end case REQUEST_VENDOR */ |
frank26080115 | 0:bf7b9fba3924 | 1080 | #endif /* USB_VENDOR */ |
frank26080115 | 0:bf7b9fba3924 | 1081 | |
frank26080115 | 0:bf7b9fba3924 | 1082 | default: |
frank26080115 | 0:bf7b9fba3924 | 1083 | goto stall_i; |
frank26080115 | 0:bf7b9fba3924 | 1084 | } |
frank26080115 | 0:bf7b9fba3924 | 1085 | } |
frank26080115 | 0:bf7b9fba3924 | 1086 | } |
frank26080115 | 0:bf7b9fba3924 | 1087 | } else { |
frank26080115 | 0:bf7b9fba3924 | 1088 | USB_StatusOutStage(); /* receive Acknowledge */ |
frank26080115 | 0:bf7b9fba3924 | 1089 | } |
frank26080115 | 0:bf7b9fba3924 | 1090 | break; /* end case USB_EVT_OUT */ |
frank26080115 | 0:bf7b9fba3924 | 1091 | |
frank26080115 | 0:bf7b9fba3924 | 1092 | case USB_EVT_IN : |
frank26080115 | 0:bf7b9fba3924 | 1093 | if (SetupPacket.bmRequestType.BM.Dir == REQUEST_DEVICE_TO_HOST) { |
frank26080115 | 0:bf7b9fba3924 | 1094 | USB_DataInStage(); /* send data */ |
frank26080115 | 0:bf7b9fba3924 | 1095 | } else { |
frank26080115 | 0:bf7b9fba3924 | 1096 | if (USB_DeviceAddress & 0x80) { |
frank26080115 | 0:bf7b9fba3924 | 1097 | USB_DeviceAddress &= 0x7F; |
frank26080115 | 0:bf7b9fba3924 | 1098 | USB_SetAddress(USB_DeviceAddress); |
frank26080115 | 0:bf7b9fba3924 | 1099 | } |
frank26080115 | 0:bf7b9fba3924 | 1100 | } |
frank26080115 | 0:bf7b9fba3924 | 1101 | break; /* end case USB_EVT_IN */ |
frank26080115 | 0:bf7b9fba3924 | 1102 | |
frank26080115 | 0:bf7b9fba3924 | 1103 | case USB_EVT_OUT_STALL: |
frank26080115 | 0:bf7b9fba3924 | 1104 | USB_ClrStallEP(0x00); |
frank26080115 | 0:bf7b9fba3924 | 1105 | break; |
frank26080115 | 0:bf7b9fba3924 | 1106 | |
frank26080115 | 0:bf7b9fba3924 | 1107 | case USB_EVT_IN_STALL: |
frank26080115 | 0:bf7b9fba3924 | 1108 | USB_ClrStallEP(0x80); |
frank26080115 | 0:bf7b9fba3924 | 1109 | break; |
frank26080115 | 0:bf7b9fba3924 | 1110 | |
frank26080115 | 0:bf7b9fba3924 | 1111 | } |
frank26080115 | 0:bf7b9fba3924 | 1112 | } |