Port of Keils USBCDC example, compiles ok. Gets stuck at init

Dependencies:   mbed

Committer:
tecnosys
Date:
Mon Jul 05 10:16:57 2010 +0000
Revision:
0:0b777ff85deb

        

Who changed what in which revision?

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