These are the examples provided for [[/users/frank26080115/libraries/LPC1700CMSIS_Lib/]] Note, the entire "program" is not compilable!

Committer:
frank26080115
Date:
Sun Mar 20 05:38:56 2011 +0000
Revision:
0:bf7b9fba3924

        

Who changed what in which revision?

UserRevisionLine numberNew 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 }