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.10
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) 2005-2009 Keil Software.
frank26080115 0:bf7b9fba3924 17 *---------------------------------------------------------------------------*/
frank26080115 0:bf7b9fba3924 18
frank26080115 0:bf7b9fba3924 19 #include "lpc_types.h"
frank26080115 0:bf7b9fba3924 20
frank26080115 0:bf7b9fba3924 21 #include "usb.h"
frank26080115 0:bf7b9fba3924 22 #include "usbcfg.h"
frank26080115 0:bf7b9fba3924 23 #include "usbhw.h"
frank26080115 0:bf7b9fba3924 24 #include "usbcore.h"
frank26080115 0:bf7b9fba3924 25 #include "usbdesc.h"
frank26080115 0:bf7b9fba3924 26 #include "usbuser.h"
frank26080115 0:bf7b9fba3924 27
frank26080115 0:bf7b9fba3924 28 #if (USB_CLASS)
frank26080115 0:bf7b9fba3924 29
frank26080115 0:bf7b9fba3924 30 #if (USB_AUDIO)
frank26080115 0:bf7b9fba3924 31 #include "audio.h"
frank26080115 0:bf7b9fba3924 32 #include "adcuser.h"
frank26080115 0:bf7b9fba3924 33 #endif
frank26080115 0:bf7b9fba3924 34
frank26080115 0:bf7b9fba3924 35 #if (USB_HID)
frank26080115 0:bf7b9fba3924 36 #include "hid.h"
frank26080115 0:bf7b9fba3924 37 #include "hiduser.h"
frank26080115 0:bf7b9fba3924 38 #endif
frank26080115 0:bf7b9fba3924 39
frank26080115 0:bf7b9fba3924 40 #if (USB_MSC)
frank26080115 0:bf7b9fba3924 41 #include "msc.h"
frank26080115 0:bf7b9fba3924 42 #include "mscuser.h"
frank26080115 0:bf7b9fba3924 43 extern MSC_CSW CSW;
frank26080115 0:bf7b9fba3924 44 #endif
frank26080115 0:bf7b9fba3924 45
frank26080115 0:bf7b9fba3924 46 #if (USB_CDC)
frank26080115 0:bf7b9fba3924 47 #include "cdc.h"
frank26080115 0:bf7b9fba3924 48 #include "cdcuser.h"
frank26080115 0:bf7b9fba3924 49 #endif
frank26080115 0:bf7b9fba3924 50
frank26080115 0:bf7b9fba3924 51 #endif
frank26080115 0:bf7b9fba3924 52
frank26080115 0:bf7b9fba3924 53 #if (USB_VENDOR)
frank26080115 0:bf7b9fba3924 54 #include "vendor.h"
frank26080115 0:bf7b9fba3924 55 #endif
frank26080115 0:bf7b9fba3924 56
frank26080115 0:bf7b9fba3924 57 #ifndef __IAR_SYSTEMS_ICC__
frank26080115 0:bf7b9fba3924 58 #pragma diag_suppress 111,1441
frank26080115 0:bf7b9fba3924 59 #endif
frank26080115 0:bf7b9fba3924 60
frank26080115 0:bf7b9fba3924 61 uint16_t USB_DeviceStatus;
frank26080115 0:bf7b9fba3924 62 uint8_t USB_DeviceAddress;
frank26080115 0:bf7b9fba3924 63 uint8_t USB_Configuration;
frank26080115 0:bf7b9fba3924 64 uint32_t USB_EndPointMask;
frank26080115 0:bf7b9fba3924 65 uint32_t USB_EndPointHalt;
frank26080115 0:bf7b9fba3924 66 uint8_t USB_NumInterfaces;
frank26080115 0:bf7b9fba3924 67 uint8_t USB_AltSetting[USB_IF_NUM];
frank26080115 0:bf7b9fba3924 68
frank26080115 0:bf7b9fba3924 69 uint8_t EP0Buf[USB_MAX_PACKET0];
frank26080115 0:bf7b9fba3924 70
frank26080115 0:bf7b9fba3924 71
frank26080115 0:bf7b9fba3924 72 USB_EP_DATA EP0Data;
frank26080115 0:bf7b9fba3924 73
frank26080115 0:bf7b9fba3924 74 USB_SETUP_PACKET SetupPacket;
frank26080115 0:bf7b9fba3924 75
frank26080115 0:bf7b9fba3924 76
frank26080115 0:bf7b9fba3924 77 /*
frank26080115 0:bf7b9fba3924 78 * Reset USB Core
frank26080115 0:bf7b9fba3924 79 * Parameters: None
frank26080115 0:bf7b9fba3924 80 * Return Value: None
frank26080115 0:bf7b9fba3924 81 */
frank26080115 0:bf7b9fba3924 82
frank26080115 0:bf7b9fba3924 83 void USB_ResetCore (void) {
frank26080115 0:bf7b9fba3924 84
frank26080115 0:bf7b9fba3924 85 USB_DeviceStatus = USB_POWER;
frank26080115 0:bf7b9fba3924 86 USB_DeviceAddress = 0;
frank26080115 0:bf7b9fba3924 87 USB_Configuration = 0;
frank26080115 0:bf7b9fba3924 88 USB_EndPointMask = 0x00010001;
frank26080115 0:bf7b9fba3924 89 USB_EndPointHalt = 0x00000000;
frank26080115 0:bf7b9fba3924 90 }
frank26080115 0:bf7b9fba3924 91
frank26080115 0:bf7b9fba3924 92
frank26080115 0:bf7b9fba3924 93 /*
frank26080115 0:bf7b9fba3924 94 * USB Request - Setup Stage
frank26080115 0:bf7b9fba3924 95 * Parameters: None (global SetupPacket)
frank26080115 0:bf7b9fba3924 96 * Return Value: None
frank26080115 0:bf7b9fba3924 97 */
frank26080115 0:bf7b9fba3924 98
frank26080115 0:bf7b9fba3924 99 void USB_SetupStage (void) {
frank26080115 0:bf7b9fba3924 100 USB_ReadEP(0x00, (uint8_t *)&SetupPacket);
frank26080115 0:bf7b9fba3924 101 }
frank26080115 0:bf7b9fba3924 102
frank26080115 0:bf7b9fba3924 103
frank26080115 0:bf7b9fba3924 104 /*
frank26080115 0:bf7b9fba3924 105 * USB Request - Data In Stage
frank26080115 0:bf7b9fba3924 106 * Parameters: None (global EP0Data)
frank26080115 0:bf7b9fba3924 107 * Return Value: None
frank26080115 0:bf7b9fba3924 108 */
frank26080115 0:bf7b9fba3924 109
frank26080115 0:bf7b9fba3924 110 void USB_DataInStage (void) {
frank26080115 0:bf7b9fba3924 111 uint32_t cnt;
frank26080115 0:bf7b9fba3924 112
frank26080115 0:bf7b9fba3924 113 if (EP0Data.Count > USB_MAX_PACKET0) {
frank26080115 0:bf7b9fba3924 114 cnt = USB_MAX_PACKET0;
frank26080115 0:bf7b9fba3924 115 } else {
frank26080115 0:bf7b9fba3924 116 cnt = EP0Data.Count;
frank26080115 0:bf7b9fba3924 117 }
frank26080115 0:bf7b9fba3924 118 cnt = USB_WriteEP(0x80, EP0Data.pData, cnt);
frank26080115 0:bf7b9fba3924 119 EP0Data.pData += cnt;
frank26080115 0:bf7b9fba3924 120 EP0Data.Count -= cnt;
frank26080115 0:bf7b9fba3924 121 }
frank26080115 0:bf7b9fba3924 122
frank26080115 0:bf7b9fba3924 123
frank26080115 0:bf7b9fba3924 124 /*
frank26080115 0:bf7b9fba3924 125 * USB Request - Data Out Stage
frank26080115 0:bf7b9fba3924 126 * Parameters: None (global EP0Data)
frank26080115 0:bf7b9fba3924 127 * Return Value: None
frank26080115 0:bf7b9fba3924 128 */
frank26080115 0:bf7b9fba3924 129
frank26080115 0:bf7b9fba3924 130 void USB_DataOutStage (void) {
frank26080115 0:bf7b9fba3924 131 uint32_t cnt;
frank26080115 0:bf7b9fba3924 132
frank26080115 0:bf7b9fba3924 133 cnt = USB_ReadEP(0x00, EP0Data.pData);
frank26080115 0:bf7b9fba3924 134 EP0Data.pData += cnt;
frank26080115 0:bf7b9fba3924 135 EP0Data.Count -= cnt;
frank26080115 0:bf7b9fba3924 136 }
frank26080115 0:bf7b9fba3924 137
frank26080115 0:bf7b9fba3924 138
frank26080115 0:bf7b9fba3924 139 /*
frank26080115 0:bf7b9fba3924 140 * USB Request - Status In Stage
frank26080115 0:bf7b9fba3924 141 * Parameters: None
frank26080115 0:bf7b9fba3924 142 * Return Value: None
frank26080115 0:bf7b9fba3924 143 */
frank26080115 0:bf7b9fba3924 144
frank26080115 0:bf7b9fba3924 145 void USB_StatusInStage (void) {
frank26080115 0:bf7b9fba3924 146 USB_WriteEP(0x80, NULL, 0);
frank26080115 0:bf7b9fba3924 147 }
frank26080115 0:bf7b9fba3924 148
frank26080115 0:bf7b9fba3924 149
frank26080115 0:bf7b9fba3924 150 /*
frank26080115 0:bf7b9fba3924 151 * USB Request - Status Out 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_StatusOutStage (void) {
frank26080115 0:bf7b9fba3924 157 USB_ReadEP(0x00, EP0Buf);
frank26080115 0:bf7b9fba3924 158 }
frank26080115 0:bf7b9fba3924 159
frank26080115 0:bf7b9fba3924 160
frank26080115 0:bf7b9fba3924 161 /*
frank26080115 0:bf7b9fba3924 162 * Get Status USB Request
frank26080115 0:bf7b9fba3924 163 * Parameters: None (global SetupPacket)
frank26080115 0:bf7b9fba3924 164 * Return Value: TRUE - Success, FALSE - Error
frank26080115 0:bf7b9fba3924 165 */
frank26080115 0:bf7b9fba3924 166
frank26080115 0:bf7b9fba3924 167 #ifdef __IAR_SYSTEMS_ICC__
frank26080115 0:bf7b9fba3924 168 inline uint32_t USB_GetStatus (void) {
frank26080115 0:bf7b9fba3924 169 #else
frank26080115 0:bf7b9fba3924 170 __inline uint32_t USB_GetStatus (void) {
frank26080115 0:bf7b9fba3924 171 #endif
frank26080115 0:bf7b9fba3924 172 uint32_t n, m;
frank26080115 0:bf7b9fba3924 173
frank26080115 0:bf7b9fba3924 174 switch (SetupPacket.bmRequestType.BM.Recipient) {
frank26080115 0:bf7b9fba3924 175 case REQUEST_TO_DEVICE:
frank26080115 0:bf7b9fba3924 176 EP0Data.pData = (uint8_t *)&USB_DeviceStatus;
frank26080115 0:bf7b9fba3924 177 USB_DataInStage();
frank26080115 0:bf7b9fba3924 178 break;
frank26080115 0:bf7b9fba3924 179 case REQUEST_TO_INTERFACE:
frank26080115 0:bf7b9fba3924 180 if ((USB_Configuration != 0) && (SetupPacket.wIndex.WB.L < USB_NumInterfaces)) {
frank26080115 0:bf7b9fba3924 181 *((__packed uint16_t *)EP0Buf) = 0;
frank26080115 0:bf7b9fba3924 182 EP0Data.pData = EP0Buf;
frank26080115 0:bf7b9fba3924 183 USB_DataInStage();
frank26080115 0:bf7b9fba3924 184 } else {
frank26080115 0:bf7b9fba3924 185 return (FALSE);
frank26080115 0:bf7b9fba3924 186 }
frank26080115 0:bf7b9fba3924 187 break;
frank26080115 0:bf7b9fba3924 188 case REQUEST_TO_ENDPOINT:
frank26080115 0:bf7b9fba3924 189 n = SetupPacket.wIndex.WB.L & 0x8F;
frank26080115 0:bf7b9fba3924 190 m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n);
frank26080115 0:bf7b9fba3924 191 if (((USB_Configuration != 0) || ((n & 0x0F) == 0)) && (USB_EndPointMask & m)) {
frank26080115 0:bf7b9fba3924 192 *((__packed uint16_t *)EP0Buf) = (USB_EndPointHalt & m) ? 1 : 0;
frank26080115 0:bf7b9fba3924 193 EP0Data.pData = EP0Buf;
frank26080115 0:bf7b9fba3924 194 USB_DataInStage();
frank26080115 0:bf7b9fba3924 195 } else {
frank26080115 0:bf7b9fba3924 196 return (FALSE);
frank26080115 0:bf7b9fba3924 197 }
frank26080115 0:bf7b9fba3924 198 break;
frank26080115 0:bf7b9fba3924 199 default:
frank26080115 0:bf7b9fba3924 200 return (FALSE);
frank26080115 0:bf7b9fba3924 201 }
frank26080115 0:bf7b9fba3924 202 return (TRUE);
frank26080115 0:bf7b9fba3924 203 }
frank26080115 0:bf7b9fba3924 204
frank26080115 0:bf7b9fba3924 205
frank26080115 0:bf7b9fba3924 206 /*
frank26080115 0:bf7b9fba3924 207 * Set/Clear Feature USB Request
frank26080115 0:bf7b9fba3924 208 * Parameters: sc: 0 - Clear, 1 - Set
frank26080115 0:bf7b9fba3924 209 * None (global SetupPacket)
frank26080115 0:bf7b9fba3924 210 * Return Value: TRUE - Success, FALSE - Error
frank26080115 0:bf7b9fba3924 211 */
frank26080115 0:bf7b9fba3924 212
frank26080115 0:bf7b9fba3924 213 #ifdef __IAR_SYSTEMS_ICC__
frank26080115 0:bf7b9fba3924 214 inline uint32_t USB_SetClrFeature (uint32_t sc) {
frank26080115 0:bf7b9fba3924 215 #else
frank26080115 0:bf7b9fba3924 216 __inline uint32_t USB_SetClrFeature (uint32_t sc) {
frank26080115 0:bf7b9fba3924 217 #endif
frank26080115 0:bf7b9fba3924 218 uint32_t n, m;
frank26080115 0:bf7b9fba3924 219
frank26080115 0:bf7b9fba3924 220 switch (SetupPacket.bmRequestType.BM.Recipient) {
frank26080115 0:bf7b9fba3924 221 case REQUEST_TO_DEVICE:
frank26080115 0:bf7b9fba3924 222 if (SetupPacket.wValue.W == USB_FEATURE_REMOTE_WAKEUP) {
frank26080115 0:bf7b9fba3924 223 if (sc) {
frank26080115 0:bf7b9fba3924 224 USB_WakeUpCfg(TRUE);
frank26080115 0:bf7b9fba3924 225 USB_DeviceStatus |= USB_GETSTATUS_REMOTE_WAKEUP;
frank26080115 0:bf7b9fba3924 226 } else {
frank26080115 0:bf7b9fba3924 227 USB_WakeUpCfg(FALSE);
frank26080115 0:bf7b9fba3924 228 USB_DeviceStatus &= ~USB_GETSTATUS_REMOTE_WAKEUP;
frank26080115 0:bf7b9fba3924 229 }
frank26080115 0:bf7b9fba3924 230 } else {
frank26080115 0:bf7b9fba3924 231 return (FALSE);
frank26080115 0:bf7b9fba3924 232 }
frank26080115 0:bf7b9fba3924 233 break;
frank26080115 0:bf7b9fba3924 234 case REQUEST_TO_INTERFACE:
frank26080115 0:bf7b9fba3924 235 return (FALSE);
frank26080115 0:bf7b9fba3924 236 case REQUEST_TO_ENDPOINT:
frank26080115 0:bf7b9fba3924 237 n = SetupPacket.wIndex.WB.L & 0x8F;
frank26080115 0:bf7b9fba3924 238 m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n);
frank26080115 0:bf7b9fba3924 239 if ((USB_Configuration != 0) && ((n & 0x0F) != 0) && (USB_EndPointMask & m)) {
frank26080115 0:bf7b9fba3924 240 if (SetupPacket.wValue.W == USB_FEATURE_ENDPOINT_STALL) {
frank26080115 0:bf7b9fba3924 241 if (sc) {
frank26080115 0:bf7b9fba3924 242 USB_SetStallEP(n);
frank26080115 0:bf7b9fba3924 243 USB_EndPointHalt |= m;
frank26080115 0:bf7b9fba3924 244 } else {
frank26080115 0:bf7b9fba3924 245 USB_ClrStallEP(n);
frank26080115 0:bf7b9fba3924 246 USB_EndPointHalt &= ~m;
frank26080115 0:bf7b9fba3924 247 }
frank26080115 0:bf7b9fba3924 248 } else {
frank26080115 0:bf7b9fba3924 249 return (FALSE);
frank26080115 0:bf7b9fba3924 250 }
frank26080115 0:bf7b9fba3924 251 } else {
frank26080115 0:bf7b9fba3924 252 return (FALSE);
frank26080115 0:bf7b9fba3924 253 }
frank26080115 0:bf7b9fba3924 254 break;
frank26080115 0:bf7b9fba3924 255 default:
frank26080115 0:bf7b9fba3924 256 return (FALSE);
frank26080115 0:bf7b9fba3924 257 }
frank26080115 0:bf7b9fba3924 258 return (TRUE);
frank26080115 0:bf7b9fba3924 259 }
frank26080115 0:bf7b9fba3924 260
frank26080115 0:bf7b9fba3924 261
frank26080115 0:bf7b9fba3924 262 /*
frank26080115 0:bf7b9fba3924 263 * Get Descriptor USB Request
frank26080115 0:bf7b9fba3924 264 * Parameters: None (global SetupPacket)
frank26080115 0:bf7b9fba3924 265 * Return Value: TRUE - Success, FALSE - Error
frank26080115 0:bf7b9fba3924 266 */
frank26080115 0:bf7b9fba3924 267
frank26080115 0:bf7b9fba3924 268 #ifdef __IAR_SYSTEMS_ICC__
frank26080115 0:bf7b9fba3924 269 inline uint32_t USB_GetDescriptor (void) {
frank26080115 0:bf7b9fba3924 270 #else
frank26080115 0:bf7b9fba3924 271 __inline uint32_t USB_GetDescriptor (void) {
frank26080115 0:bf7b9fba3924 272 #endif
frank26080115 0:bf7b9fba3924 273 uint8_t *pD;
frank26080115 0:bf7b9fba3924 274 uint32_t len, n;
frank26080115 0:bf7b9fba3924 275
frank26080115 0:bf7b9fba3924 276 switch (SetupPacket.bmRequestType.BM.Recipient) {
frank26080115 0:bf7b9fba3924 277 case REQUEST_TO_DEVICE:
frank26080115 0:bf7b9fba3924 278 switch (SetupPacket.wValue.WB.H) {
frank26080115 0:bf7b9fba3924 279 case USB_DEVICE_DESCRIPTOR_TYPE:
frank26080115 0:bf7b9fba3924 280 EP0Data.pData = (uint8_t *)USB_DeviceDescriptor;
frank26080115 0:bf7b9fba3924 281 len = USB_DEVICE_DESC_SIZE;
frank26080115 0:bf7b9fba3924 282 break;
frank26080115 0:bf7b9fba3924 283 case USB_CONFIGURATION_DESCRIPTOR_TYPE:
frank26080115 0:bf7b9fba3924 284 pD = (uint8_t *)USB_ConfigDescriptor;
frank26080115 0:bf7b9fba3924 285 for (n = 0; n != SetupPacket.wValue.WB.L; n++) {
frank26080115 0:bf7b9fba3924 286 if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bLength != 0) {
frank26080115 0:bf7b9fba3924 287 pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
frank26080115 0:bf7b9fba3924 288 }
frank26080115 0:bf7b9fba3924 289 }
frank26080115 0:bf7b9fba3924 290 if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bLength == 0) {
frank26080115 0:bf7b9fba3924 291 return (FALSE);
frank26080115 0:bf7b9fba3924 292 }
frank26080115 0:bf7b9fba3924 293 EP0Data.pData = pD;
frank26080115 0:bf7b9fba3924 294 len = ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
frank26080115 0:bf7b9fba3924 295 break;
frank26080115 0:bf7b9fba3924 296 case USB_STRING_DESCRIPTOR_TYPE:
frank26080115 0:bf7b9fba3924 297 EP0Data.pData = (uint8_t *)USB_StringDescriptor + SetupPacket.wValue.WB.L;
frank26080115 0:bf7b9fba3924 298 len = ((USB_STRING_DESCRIPTOR *)EP0Data.pData)->bLength;
frank26080115 0:bf7b9fba3924 299 break;
frank26080115 0:bf7b9fba3924 300 default:
frank26080115 0:bf7b9fba3924 301 return (FALSE);
frank26080115 0:bf7b9fba3924 302 }
frank26080115 0:bf7b9fba3924 303 break;
frank26080115 0:bf7b9fba3924 304 case REQUEST_TO_INTERFACE:
frank26080115 0:bf7b9fba3924 305 switch (SetupPacket.wValue.WB.H) {
frank26080115 0:bf7b9fba3924 306 #if USB_HID
frank26080115 0:bf7b9fba3924 307 case HID_HID_DESCRIPTOR_TYPE:
frank26080115 0:bf7b9fba3924 308 if (SetupPacket.wIndex.WB.L != USB_HID_IF_NUM) {
frank26080115 0:bf7b9fba3924 309 return (FALSE); /* Only Single HID Interface is supported */
frank26080115 0:bf7b9fba3924 310 }
frank26080115 0:bf7b9fba3924 311 EP0Data.pData = (uint8_t *)USB_ConfigDescriptor + HID_DESC_OFFSET;
frank26080115 0:bf7b9fba3924 312 len = HID_DESC_SIZE;
frank26080115 0:bf7b9fba3924 313 break;
frank26080115 0:bf7b9fba3924 314 case HID_REPORT_DESCRIPTOR_TYPE:
frank26080115 0:bf7b9fba3924 315 if (SetupPacket.wIndex.WB.L != USB_HID_IF_NUM) {
frank26080115 0:bf7b9fba3924 316 return (FALSE); /* Only Single HID Interface is supported */
frank26080115 0:bf7b9fba3924 317 }
frank26080115 0:bf7b9fba3924 318 EP0Data.pData = (uint8_t *)HID_ReportDescriptor;
frank26080115 0:bf7b9fba3924 319 len = HID_ReportDescSize;
frank26080115 0:bf7b9fba3924 320 break;
frank26080115 0:bf7b9fba3924 321 case HID_PHYSICAL_DESCRIPTOR_TYPE:
frank26080115 0:bf7b9fba3924 322 return (FALSE); /* HID Physical Descriptor is not supported */
frank26080115 0:bf7b9fba3924 323 #endif
frank26080115 0:bf7b9fba3924 324 default:
frank26080115 0:bf7b9fba3924 325 return (FALSE);
frank26080115 0:bf7b9fba3924 326 }
frank26080115 0:bf7b9fba3924 327 default:
frank26080115 0:bf7b9fba3924 328 return (FALSE);
frank26080115 0:bf7b9fba3924 329 }
frank26080115 0:bf7b9fba3924 330
frank26080115 0:bf7b9fba3924 331 if (EP0Data.Count > len) {
frank26080115 0:bf7b9fba3924 332 EP0Data.Count = len;
frank26080115 0:bf7b9fba3924 333 }
frank26080115 0:bf7b9fba3924 334 USB_DataInStage();
frank26080115 0:bf7b9fba3924 335
frank26080115 0:bf7b9fba3924 336 return (TRUE);
frank26080115 0:bf7b9fba3924 337 }
frank26080115 0:bf7b9fba3924 338
frank26080115 0:bf7b9fba3924 339
frank26080115 0:bf7b9fba3924 340 /*
frank26080115 0:bf7b9fba3924 341 * Set Configuration USB Request
frank26080115 0:bf7b9fba3924 342 * Parameters: None (global SetupPacket)
frank26080115 0:bf7b9fba3924 343 * Return Value: TRUE - Success, FALSE - Error
frank26080115 0:bf7b9fba3924 344 */
frank26080115 0:bf7b9fba3924 345
frank26080115 0:bf7b9fba3924 346 #ifdef __IAR_SYSTEMS_ICC__
frank26080115 0:bf7b9fba3924 347 inline uint32_t USB_SetConfiguration (void) {
frank26080115 0:bf7b9fba3924 348 #else
frank26080115 0:bf7b9fba3924 349 __inline uint32_t USB_SetConfiguration (void) {
frank26080115 0:bf7b9fba3924 350 #endif
frank26080115 0:bf7b9fba3924 351 USB_COMMON_DESCRIPTOR *pD;
frank26080115 0:bf7b9fba3924 352 uint32_t alt, n, m;
frank26080115 0:bf7b9fba3924 353 uint32_t tmp;
frank26080115 0:bf7b9fba3924 354
frank26080115 0:bf7b9fba3924 355 if (SetupPacket.wValue.WB.L) {
frank26080115 0:bf7b9fba3924 356 pD = (USB_COMMON_DESCRIPTOR *)USB_ConfigDescriptor;
frank26080115 0:bf7b9fba3924 357 while (pD->bLength) {
frank26080115 0:bf7b9fba3924 358 switch (pD->bDescriptorType) {
frank26080115 0:bf7b9fba3924 359 case USB_CONFIGURATION_DESCRIPTOR_TYPE:
frank26080115 0:bf7b9fba3924 360 if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bConfigurationValue == SetupPacket.wValue.WB.L) {
frank26080115 0:bf7b9fba3924 361 USB_Configuration = SetupPacket.wValue.WB.L;
frank26080115 0:bf7b9fba3924 362 USB_NumInterfaces = ((USB_CONFIGURATION_DESCRIPTOR *)pD)->bNumInterfaces;
frank26080115 0:bf7b9fba3924 363 for (n = 0; n < USB_IF_NUM; n++) {
frank26080115 0:bf7b9fba3924 364 USB_AltSetting[n] = 0;
frank26080115 0:bf7b9fba3924 365 }
frank26080115 0:bf7b9fba3924 366 for (n = 1; n < 16; n++) {
frank26080115 0:bf7b9fba3924 367 if (USB_EndPointMask & (1 << n)) {
frank26080115 0:bf7b9fba3924 368 USB_DisableEP(n);
frank26080115 0:bf7b9fba3924 369 }
frank26080115 0:bf7b9fba3924 370 if (USB_EndPointMask & ((1 << 16) << n)) {
frank26080115 0:bf7b9fba3924 371 USB_DisableEP(n | 0x80);
frank26080115 0:bf7b9fba3924 372 }
frank26080115 0:bf7b9fba3924 373 }
frank26080115 0:bf7b9fba3924 374 USB_EndPointMask = 0x00010001;
frank26080115 0:bf7b9fba3924 375 USB_EndPointHalt = 0x00000000;
frank26080115 0:bf7b9fba3924 376 USB_Configure(TRUE);
frank26080115 0:bf7b9fba3924 377 if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bmAttributes & USB_CONFIG_SELF_POWERED) {
frank26080115 0:bf7b9fba3924 378 USB_DeviceStatus |= USB_GETSTATUS_SELF_POWERED;
frank26080115 0:bf7b9fba3924 379 } else {
frank26080115 0:bf7b9fba3924 380 USB_DeviceStatus &= ~USB_GETSTATUS_SELF_POWERED;
frank26080115 0:bf7b9fba3924 381 }
frank26080115 0:bf7b9fba3924 382 } else {
frank26080115 0:bf7b9fba3924 383 //(uint8_t *)pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
frank26080115 0:bf7b9fba3924 384 tmp = (uint32_t) pD;
frank26080115 0:bf7b9fba3924 385 tmp += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
frank26080115 0:bf7b9fba3924 386 pD = (USB_COMMON_DESCRIPTOR *)tmp;
frank26080115 0:bf7b9fba3924 387 continue;
frank26080115 0:bf7b9fba3924 388 }
frank26080115 0:bf7b9fba3924 389 break;
frank26080115 0:bf7b9fba3924 390 case USB_INTERFACE_DESCRIPTOR_TYPE:
frank26080115 0:bf7b9fba3924 391 alt = ((USB_INTERFACE_DESCRIPTOR *)pD)->bAlternateSetting;
frank26080115 0:bf7b9fba3924 392 break;
frank26080115 0:bf7b9fba3924 393 case USB_ENDPOINT_DESCRIPTOR_TYPE:
frank26080115 0:bf7b9fba3924 394 if (alt == 0) {
frank26080115 0:bf7b9fba3924 395 n = ((USB_ENDPOINT_DESCRIPTOR *)pD)->bEndpointAddress & 0x8F;
frank26080115 0:bf7b9fba3924 396 m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n);
frank26080115 0:bf7b9fba3924 397 USB_EndPointMask |= m;
frank26080115 0:bf7b9fba3924 398 USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR *)pD);
frank26080115 0:bf7b9fba3924 399 USB_EnableEP(n);
frank26080115 0:bf7b9fba3924 400 USB_ResetEP(n);
frank26080115 0:bf7b9fba3924 401 }
frank26080115 0:bf7b9fba3924 402 break;
frank26080115 0:bf7b9fba3924 403 }
frank26080115 0:bf7b9fba3924 404 //(uint8_t *)pD += pD->bLength;
frank26080115 0:bf7b9fba3924 405 tmp = (uint32_t) pD;
frank26080115 0:bf7b9fba3924 406 tmp += pD->bLength;
frank26080115 0:bf7b9fba3924 407 pD = (USB_COMMON_DESCRIPTOR *)tmp;
frank26080115 0:bf7b9fba3924 408 }
frank26080115 0:bf7b9fba3924 409 }
frank26080115 0:bf7b9fba3924 410 else {
frank26080115 0:bf7b9fba3924 411 USB_Configuration = 0;
frank26080115 0:bf7b9fba3924 412 for (n = 1; n < 16; n++) {
frank26080115 0:bf7b9fba3924 413 if (USB_EndPointMask & (1 << n)) {
frank26080115 0:bf7b9fba3924 414 USB_DisableEP(n);
frank26080115 0:bf7b9fba3924 415 }
frank26080115 0:bf7b9fba3924 416 if (USB_EndPointMask & ((1 << 16) << n)) {
frank26080115 0:bf7b9fba3924 417 USB_DisableEP(n | 0x80);
frank26080115 0:bf7b9fba3924 418 }
frank26080115 0:bf7b9fba3924 419 }
frank26080115 0:bf7b9fba3924 420 USB_EndPointMask = 0x00010001;
frank26080115 0:bf7b9fba3924 421 USB_EndPointHalt = 0x00000000;
frank26080115 0:bf7b9fba3924 422 USB_Configure(FALSE);
frank26080115 0:bf7b9fba3924 423 }
frank26080115 0:bf7b9fba3924 424
frank26080115 0:bf7b9fba3924 425 if (USB_Configuration == SetupPacket.wValue.WB.L) {
frank26080115 0:bf7b9fba3924 426 return (TRUE);
frank26080115 0:bf7b9fba3924 427 } else {
frank26080115 0:bf7b9fba3924 428 return (FALSE);
frank26080115 0:bf7b9fba3924 429 }
frank26080115 0:bf7b9fba3924 430 }
frank26080115 0:bf7b9fba3924 431
frank26080115 0:bf7b9fba3924 432
frank26080115 0:bf7b9fba3924 433 /*
frank26080115 0:bf7b9fba3924 434 * Set Interface USB Request
frank26080115 0:bf7b9fba3924 435 * Parameters: None (global SetupPacket)
frank26080115 0:bf7b9fba3924 436 * Return Value: TRUE - Success, FALSE - Error
frank26080115 0:bf7b9fba3924 437 */
frank26080115 0:bf7b9fba3924 438
frank26080115 0:bf7b9fba3924 439 #ifdef __IAR_SYSTEMS_ICC__
frank26080115 0:bf7b9fba3924 440 inline uint32_t USB_SetInterface (void) {
frank26080115 0:bf7b9fba3924 441 #else
frank26080115 0:bf7b9fba3924 442 __inline uint32_t USB_SetInterface (void) {
frank26080115 0:bf7b9fba3924 443 #endif
frank26080115 0:bf7b9fba3924 444 USB_COMMON_DESCRIPTOR *pD;
frank26080115 0:bf7b9fba3924 445 uint32_t ifn, alt, old, msk, n, m;
frank26080115 0:bf7b9fba3924 446 uint32_t set;
frank26080115 0:bf7b9fba3924 447 uint32_t tmp;
frank26080115 0:bf7b9fba3924 448
frank26080115 0:bf7b9fba3924 449 if (USB_Configuration == 0) return (FALSE);
frank26080115 0:bf7b9fba3924 450
frank26080115 0:bf7b9fba3924 451 set = FALSE;
frank26080115 0:bf7b9fba3924 452 pD = (USB_COMMON_DESCRIPTOR *)USB_ConfigDescriptor;
frank26080115 0:bf7b9fba3924 453 while (pD->bLength) {
frank26080115 0:bf7b9fba3924 454 switch (pD->bDescriptorType) {
frank26080115 0:bf7b9fba3924 455 case USB_CONFIGURATION_DESCRIPTOR_TYPE:
frank26080115 0:bf7b9fba3924 456 if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bConfigurationValue != USB_Configuration) {
frank26080115 0:bf7b9fba3924 457 //(uint8_t *)pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
frank26080115 0:bf7b9fba3924 458 tmp = (uint32_t)pD;
frank26080115 0:bf7b9fba3924 459 tmp += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
frank26080115 0:bf7b9fba3924 460 pD = (USB_COMMON_DESCRIPTOR *)tmp;
frank26080115 0:bf7b9fba3924 461 continue;
frank26080115 0:bf7b9fba3924 462 }
frank26080115 0:bf7b9fba3924 463 break;
frank26080115 0:bf7b9fba3924 464 case USB_INTERFACE_DESCRIPTOR_TYPE:
frank26080115 0:bf7b9fba3924 465 ifn = ((USB_INTERFACE_DESCRIPTOR *)pD)->bInterfaceNumber;
frank26080115 0:bf7b9fba3924 466 alt = ((USB_INTERFACE_DESCRIPTOR *)pD)->bAlternateSetting;
frank26080115 0:bf7b9fba3924 467 msk = 0;
frank26080115 0:bf7b9fba3924 468 if ((ifn == SetupPacket.wIndex.WB.L) && (alt == SetupPacket.wValue.WB.L)) {
frank26080115 0:bf7b9fba3924 469 set = TRUE;
frank26080115 0:bf7b9fba3924 470 old = USB_AltSetting[ifn];
frank26080115 0:bf7b9fba3924 471 USB_AltSetting[ifn] = (uint8_t)alt;
frank26080115 0:bf7b9fba3924 472 }
frank26080115 0:bf7b9fba3924 473 break;
frank26080115 0:bf7b9fba3924 474 case USB_ENDPOINT_DESCRIPTOR_TYPE:
frank26080115 0:bf7b9fba3924 475 if (ifn == SetupPacket.wIndex.WB.L) {
frank26080115 0:bf7b9fba3924 476 n = ((USB_ENDPOINT_DESCRIPTOR *)pD)->bEndpointAddress & 0x8F;
frank26080115 0:bf7b9fba3924 477 m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n);
frank26080115 0:bf7b9fba3924 478 if (alt == SetupPacket.wValue.WB.L) {
frank26080115 0:bf7b9fba3924 479 USB_EndPointMask |= m;
frank26080115 0:bf7b9fba3924 480 USB_EndPointHalt &= ~m;
frank26080115 0:bf7b9fba3924 481 USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR *)pD);
frank26080115 0:bf7b9fba3924 482 USB_EnableEP(n);
frank26080115 0:bf7b9fba3924 483 USB_ResetEP(n);
frank26080115 0:bf7b9fba3924 484 msk |= m;
frank26080115 0:bf7b9fba3924 485 }
frank26080115 0:bf7b9fba3924 486 else if ((alt == old) && ((msk & m) == 0)) {
frank26080115 0:bf7b9fba3924 487 USB_EndPointMask &= ~m;
frank26080115 0:bf7b9fba3924 488 USB_EndPointHalt &= ~m;
frank26080115 0:bf7b9fba3924 489 USB_DisableEP(n);
frank26080115 0:bf7b9fba3924 490 }
frank26080115 0:bf7b9fba3924 491 }
frank26080115 0:bf7b9fba3924 492 break;
frank26080115 0:bf7b9fba3924 493 }
frank26080115 0:bf7b9fba3924 494 //(uint8_t *)pD += pD->bLength;
frank26080115 0:bf7b9fba3924 495 tmp = (uint32_t)pD;
frank26080115 0:bf7b9fba3924 496 tmp += pD->bLength;
frank26080115 0:bf7b9fba3924 497 pD = (USB_COMMON_DESCRIPTOR *) tmp;
frank26080115 0:bf7b9fba3924 498 }
frank26080115 0:bf7b9fba3924 499 return (set);
frank26080115 0:bf7b9fba3924 500 }
frank26080115 0:bf7b9fba3924 501
frank26080115 0:bf7b9fba3924 502
frank26080115 0:bf7b9fba3924 503 /*
frank26080115 0:bf7b9fba3924 504 * USB Endpoint 0 Event Callback
frank26080115 0:bf7b9fba3924 505 * Parameter: event
frank26080115 0:bf7b9fba3924 506 */
frank26080115 0:bf7b9fba3924 507
frank26080115 0:bf7b9fba3924 508 void USB_EndPoint0 (uint32_t event) {
frank26080115 0:bf7b9fba3924 509
frank26080115 0:bf7b9fba3924 510 switch (event) {
frank26080115 0:bf7b9fba3924 511
frank26080115 0:bf7b9fba3924 512 case USB_EVT_SETUP:
frank26080115 0:bf7b9fba3924 513 USB_SetupStage();
frank26080115 0:bf7b9fba3924 514 USB_DirCtrlEP(SetupPacket.bmRequestType.BM.Dir);
frank26080115 0:bf7b9fba3924 515 EP0Data.Count = SetupPacket.wLength;
frank26080115 0:bf7b9fba3924 516 switch (SetupPacket.bmRequestType.BM.Type) {
frank26080115 0:bf7b9fba3924 517
frank26080115 0:bf7b9fba3924 518 case REQUEST_STANDARD:
frank26080115 0:bf7b9fba3924 519 switch (SetupPacket.bRequest) {
frank26080115 0:bf7b9fba3924 520
frank26080115 0:bf7b9fba3924 521 case USB_REQUEST_GET_STATUS:
frank26080115 0:bf7b9fba3924 522 if (!USB_GetStatus()) {
frank26080115 0:bf7b9fba3924 523 goto stall_i;
frank26080115 0:bf7b9fba3924 524 }
frank26080115 0:bf7b9fba3924 525 break;
frank26080115 0:bf7b9fba3924 526
frank26080115 0:bf7b9fba3924 527 case USB_REQUEST_CLEAR_FEATURE:
frank26080115 0:bf7b9fba3924 528 if (!USB_SetClrFeature(0)) {
frank26080115 0:bf7b9fba3924 529 goto stall_i;
frank26080115 0:bf7b9fba3924 530 }
frank26080115 0:bf7b9fba3924 531 USB_StatusInStage();
frank26080115 0:bf7b9fba3924 532 #if USB_FEATURE_EVENT
frank26080115 0:bf7b9fba3924 533 USB_Feature_Event();
frank26080115 0:bf7b9fba3924 534 #endif
frank26080115 0:bf7b9fba3924 535 break;
frank26080115 0:bf7b9fba3924 536
frank26080115 0:bf7b9fba3924 537 case USB_REQUEST_SET_FEATURE:
frank26080115 0:bf7b9fba3924 538 if (!USB_SetClrFeature(1)) {
frank26080115 0:bf7b9fba3924 539 goto stall_i;
frank26080115 0:bf7b9fba3924 540 }
frank26080115 0:bf7b9fba3924 541 USB_StatusInStage();
frank26080115 0:bf7b9fba3924 542 #if USB_FEATURE_EVENT
frank26080115 0:bf7b9fba3924 543 USB_Feature_Event();
frank26080115 0:bf7b9fba3924 544 #endif
frank26080115 0:bf7b9fba3924 545 break;
frank26080115 0:bf7b9fba3924 546
frank26080115 0:bf7b9fba3924 547 case USB_REQUEST_SET_ADDRESS:
frank26080115 0:bf7b9fba3924 548 switch (SetupPacket.bmRequestType.BM.Recipient) {
frank26080115 0:bf7b9fba3924 549 case REQUEST_TO_DEVICE:
frank26080115 0:bf7b9fba3924 550 USB_DeviceAddress = 0x80 | SetupPacket.wValue.WB.L;
frank26080115 0:bf7b9fba3924 551 USB_StatusInStage();
frank26080115 0:bf7b9fba3924 552 break;
frank26080115 0:bf7b9fba3924 553 default:
frank26080115 0:bf7b9fba3924 554 goto stall_i;
frank26080115 0:bf7b9fba3924 555 }
frank26080115 0:bf7b9fba3924 556 break;
frank26080115 0:bf7b9fba3924 557
frank26080115 0:bf7b9fba3924 558 case USB_REQUEST_GET_DESCRIPTOR:
frank26080115 0:bf7b9fba3924 559 if (!USB_GetDescriptor()) {
frank26080115 0:bf7b9fba3924 560 goto stall_i;
frank26080115 0:bf7b9fba3924 561 }
frank26080115 0:bf7b9fba3924 562 break;
frank26080115 0:bf7b9fba3924 563
frank26080115 0:bf7b9fba3924 564 case USB_REQUEST_SET_DESCRIPTOR:
frank26080115 0:bf7b9fba3924 565 /*stall_o:*/ USB_SetStallEP(0x00);
frank26080115 0:bf7b9fba3924 566 EP0Data.Count = 0;
frank26080115 0:bf7b9fba3924 567 break;
frank26080115 0:bf7b9fba3924 568
frank26080115 0:bf7b9fba3924 569 case USB_REQUEST_GET_CONFIGURATION:
frank26080115 0:bf7b9fba3924 570 switch (SetupPacket.bmRequestType.BM.Recipient) {
frank26080115 0:bf7b9fba3924 571 case REQUEST_TO_DEVICE:
frank26080115 0:bf7b9fba3924 572 EP0Data.pData = &USB_Configuration;
frank26080115 0:bf7b9fba3924 573 USB_DataInStage();
frank26080115 0:bf7b9fba3924 574 break;
frank26080115 0:bf7b9fba3924 575 default:
frank26080115 0:bf7b9fba3924 576 goto stall_i;
frank26080115 0:bf7b9fba3924 577 }
frank26080115 0:bf7b9fba3924 578 break;
frank26080115 0:bf7b9fba3924 579
frank26080115 0:bf7b9fba3924 580 case USB_REQUEST_SET_CONFIGURATION:
frank26080115 0:bf7b9fba3924 581 switch (SetupPacket.bmRequestType.BM.Recipient) {
frank26080115 0:bf7b9fba3924 582 case REQUEST_TO_DEVICE:
frank26080115 0:bf7b9fba3924 583 if (!USB_SetConfiguration()) {
frank26080115 0:bf7b9fba3924 584 goto stall_i;
frank26080115 0:bf7b9fba3924 585 }
frank26080115 0:bf7b9fba3924 586 USB_StatusInStage();
frank26080115 0:bf7b9fba3924 587 #if USB_CONFIGURE_EVENT
frank26080115 0:bf7b9fba3924 588 USB_Configure_Event();
frank26080115 0:bf7b9fba3924 589 #endif
frank26080115 0:bf7b9fba3924 590 break;
frank26080115 0:bf7b9fba3924 591 default:
frank26080115 0:bf7b9fba3924 592 goto stall_i;
frank26080115 0:bf7b9fba3924 593 }
frank26080115 0:bf7b9fba3924 594 break;
frank26080115 0:bf7b9fba3924 595
frank26080115 0:bf7b9fba3924 596 case USB_REQUEST_GET_INTERFACE:
frank26080115 0:bf7b9fba3924 597 switch (SetupPacket.bmRequestType.BM.Recipient) {
frank26080115 0:bf7b9fba3924 598 case REQUEST_TO_INTERFACE:
frank26080115 0:bf7b9fba3924 599 if ((USB_Configuration != 0) &&
frank26080115 0:bf7b9fba3924 600 (SetupPacket.wIndex.WB.L < USB_NumInterfaces)) {
frank26080115 0:bf7b9fba3924 601 EP0Data.pData = USB_AltSetting + SetupPacket.wIndex.WB.L;
frank26080115 0:bf7b9fba3924 602 USB_DataInStage();
frank26080115 0:bf7b9fba3924 603 } else {
frank26080115 0:bf7b9fba3924 604 goto stall_i;
frank26080115 0:bf7b9fba3924 605 }
frank26080115 0:bf7b9fba3924 606 break;
frank26080115 0:bf7b9fba3924 607 default:
frank26080115 0:bf7b9fba3924 608 goto stall_i;
frank26080115 0:bf7b9fba3924 609 }
frank26080115 0:bf7b9fba3924 610 break;
frank26080115 0:bf7b9fba3924 611
frank26080115 0:bf7b9fba3924 612 case USB_REQUEST_SET_INTERFACE:
frank26080115 0:bf7b9fba3924 613 switch (SetupPacket.bmRequestType.BM.Recipient) {
frank26080115 0:bf7b9fba3924 614 case REQUEST_TO_INTERFACE:
frank26080115 0:bf7b9fba3924 615 if (!USB_SetInterface()) {
frank26080115 0:bf7b9fba3924 616 goto stall_i;
frank26080115 0:bf7b9fba3924 617 }
frank26080115 0:bf7b9fba3924 618 USB_StatusInStage();
frank26080115 0:bf7b9fba3924 619 #if USB_INTERFACE_EVENT
frank26080115 0:bf7b9fba3924 620 USB_Interface_Event();
frank26080115 0:bf7b9fba3924 621 #endif
frank26080115 0:bf7b9fba3924 622 break;
frank26080115 0:bf7b9fba3924 623 default:
frank26080115 0:bf7b9fba3924 624 goto stall_i;
frank26080115 0:bf7b9fba3924 625 }
frank26080115 0:bf7b9fba3924 626 break;
frank26080115 0:bf7b9fba3924 627
frank26080115 0:bf7b9fba3924 628 default:
frank26080115 0:bf7b9fba3924 629 goto stall_i;
frank26080115 0:bf7b9fba3924 630
frank26080115 0:bf7b9fba3924 631 }
frank26080115 0:bf7b9fba3924 632 break;
frank26080115 0:bf7b9fba3924 633
frank26080115 0:bf7b9fba3924 634 case REQUEST_CLASS:
frank26080115 0:bf7b9fba3924 635 #if USB_CLASS
frank26080115 0:bf7b9fba3924 636 switch (SetupPacket.bmRequestType.BM.Recipient) {
frank26080115 0:bf7b9fba3924 637 case REQUEST_TO_INTERFACE:
frank26080115 0:bf7b9fba3924 638 #if USB_HID
frank26080115 0:bf7b9fba3924 639 if (SetupPacket.wIndex.WB.L == USB_HID_IF_NUM) {
frank26080115 0:bf7b9fba3924 640 switch (SetupPacket.bRequest) {
frank26080115 0:bf7b9fba3924 641 case HID_REQUEST_GET_REPORT:
frank26080115 0:bf7b9fba3924 642 if (HID_GetReport()) {
frank26080115 0:bf7b9fba3924 643 EP0Data.pData = EP0Buf;
frank26080115 0:bf7b9fba3924 644 USB_DataInStage();
frank26080115 0:bf7b9fba3924 645 goto class_ok;
frank26080115 0:bf7b9fba3924 646 }
frank26080115 0:bf7b9fba3924 647 break;
frank26080115 0:bf7b9fba3924 648 case HID_REQUEST_SET_REPORT:
frank26080115 0:bf7b9fba3924 649 EP0Data.pData = EP0Buf;
frank26080115 0:bf7b9fba3924 650 goto class_ok;
frank26080115 0:bf7b9fba3924 651 case HID_REQUEST_GET_IDLE:
frank26080115 0:bf7b9fba3924 652 if (HID_GetIdle()) {
frank26080115 0:bf7b9fba3924 653 EP0Data.pData = EP0Buf;
frank26080115 0:bf7b9fba3924 654 USB_DataInStage();
frank26080115 0:bf7b9fba3924 655 goto class_ok;
frank26080115 0:bf7b9fba3924 656 }
frank26080115 0:bf7b9fba3924 657 break;
frank26080115 0:bf7b9fba3924 658 case HID_REQUEST_SET_IDLE:
frank26080115 0:bf7b9fba3924 659 if (HID_SetIdle()) {
frank26080115 0:bf7b9fba3924 660 USB_StatusInStage();
frank26080115 0:bf7b9fba3924 661 goto class_ok;
frank26080115 0:bf7b9fba3924 662 }
frank26080115 0:bf7b9fba3924 663 break;
frank26080115 0:bf7b9fba3924 664 case HID_REQUEST_GET_PROTOCOL:
frank26080115 0:bf7b9fba3924 665 if (HID_GetProtocol()) {
frank26080115 0:bf7b9fba3924 666 EP0Data.pData = EP0Buf;
frank26080115 0:bf7b9fba3924 667 USB_DataInStage();
frank26080115 0:bf7b9fba3924 668 goto class_ok;
frank26080115 0:bf7b9fba3924 669 }
frank26080115 0:bf7b9fba3924 670 break;
frank26080115 0:bf7b9fba3924 671 case HID_REQUEST_SET_PROTOCOL:
frank26080115 0:bf7b9fba3924 672 if (HID_SetProtocol()) {
frank26080115 0:bf7b9fba3924 673 USB_StatusInStage();
frank26080115 0:bf7b9fba3924 674 goto class_ok;
frank26080115 0:bf7b9fba3924 675 }
frank26080115 0:bf7b9fba3924 676 break;
frank26080115 0:bf7b9fba3924 677 }
frank26080115 0:bf7b9fba3924 678 }
frank26080115 0:bf7b9fba3924 679 #endif /* USB_HID */
frank26080115 0:bf7b9fba3924 680 #if USB_MSC
frank26080115 0:bf7b9fba3924 681 if (SetupPacket.wIndex.WB.L == USB_MSC_IF_NUM) {
frank26080115 0:bf7b9fba3924 682 switch (SetupPacket.bRequest) {
frank26080115 0:bf7b9fba3924 683 case MSC_REQUEST_RESET:
frank26080115 0:bf7b9fba3924 684 if (MSC_Reset()) {
frank26080115 0:bf7b9fba3924 685 USB_StatusInStage();
frank26080115 0:bf7b9fba3924 686 goto class_ok;
frank26080115 0:bf7b9fba3924 687 }
frank26080115 0:bf7b9fba3924 688 break;
frank26080115 0:bf7b9fba3924 689 case MSC_REQUEST_GET_MAX_LUN:
frank26080115 0:bf7b9fba3924 690 if (MSC_GetMaxLUN()) {
frank26080115 0:bf7b9fba3924 691 EP0Data.pData = EP0Buf;
frank26080115 0:bf7b9fba3924 692 USB_DataInStage();
frank26080115 0:bf7b9fba3924 693 goto class_ok;
frank26080115 0:bf7b9fba3924 694 }
frank26080115 0:bf7b9fba3924 695 break;
frank26080115 0:bf7b9fba3924 696 }
frank26080115 0:bf7b9fba3924 697 }
frank26080115 0:bf7b9fba3924 698 #endif /* USB_MSC */
frank26080115 0:bf7b9fba3924 699 #if USB_AUDIO
frank26080115 0:bf7b9fba3924 700 if ((SetupPacket.wIndex.WB.L == USB_ADC_CIF_NUM) ||
frank26080115 0:bf7b9fba3924 701 (SetupPacket.wIndex.WB.L == USB_ADC_SIF1_NUM) ||
frank26080115 0:bf7b9fba3924 702 (SetupPacket.wIndex.WB.L == USB_ADC_SIF2_NUM)) {
frank26080115 0:bf7b9fba3924 703 if (SetupPacket.bmRequestType.BM.Dir) {
frank26080115 0:bf7b9fba3924 704 if (ADC_IF_GetRequest()) {
frank26080115 0:bf7b9fba3924 705 EP0Data.pData = EP0Buf;
frank26080115 0:bf7b9fba3924 706 USB_DataInStage();
frank26080115 0:bf7b9fba3924 707 goto class_ok;
frank26080115 0:bf7b9fba3924 708 }
frank26080115 0:bf7b9fba3924 709 } else {
frank26080115 0:bf7b9fba3924 710 EP0Data.pData = EP0Buf;
frank26080115 0:bf7b9fba3924 711 goto class_ok;
frank26080115 0:bf7b9fba3924 712 }
frank26080115 0:bf7b9fba3924 713 }
frank26080115 0:bf7b9fba3924 714 #endif /* USB_AUDIO */
frank26080115 0:bf7b9fba3924 715 goto stall_i;
frank26080115 0:bf7b9fba3924 716 #if USB_AUDIO
frank26080115 0:bf7b9fba3924 717 case REQUEST_TO_ENDPOINT:
frank26080115 0:bf7b9fba3924 718 if (SetupPacket.bmRequestType.BM.Dir) {
frank26080115 0:bf7b9fba3924 719 if (ADC_EP_GetRequest()) {
frank26080115 0:bf7b9fba3924 720 EP0Data.pData = EP0Buf;
frank26080115 0:bf7b9fba3924 721 USB_DataInStage();
frank26080115 0:bf7b9fba3924 722 goto class_ok;
frank26080115 0:bf7b9fba3924 723 }
frank26080115 0:bf7b9fba3924 724 } else {
frank26080115 0:bf7b9fba3924 725 EP0Data.pData = EP0Buf;
frank26080115 0:bf7b9fba3924 726 goto class_ok;
frank26080115 0:bf7b9fba3924 727 }
frank26080115 0:bf7b9fba3924 728 goto stall_i;
frank26080115 0:bf7b9fba3924 729 #endif /* USB_AUDIO */
frank26080115 0:bf7b9fba3924 730 default:
frank26080115 0:bf7b9fba3924 731 goto stall_i;
frank26080115 0:bf7b9fba3924 732 }
frank26080115 0:bf7b9fba3924 733 class_ok: break;
frank26080115 0:bf7b9fba3924 734 #else
frank26080115 0:bf7b9fba3924 735 goto stall_i;
frank26080115 0:bf7b9fba3924 736 #endif /* USB_CLASS */
frank26080115 0:bf7b9fba3924 737
frank26080115 0:bf7b9fba3924 738 case REQUEST_VENDOR:
frank26080115 0:bf7b9fba3924 739 goto stall_i;
frank26080115 0:bf7b9fba3924 740
frank26080115 0:bf7b9fba3924 741 default:
frank26080115 0:bf7b9fba3924 742 stall_i: USB_SetStallEP(0x80);
frank26080115 0:bf7b9fba3924 743 EP0Data.Count = 0;
frank26080115 0:bf7b9fba3924 744 break;
frank26080115 0:bf7b9fba3924 745
frank26080115 0:bf7b9fba3924 746 }
frank26080115 0:bf7b9fba3924 747 break;
frank26080115 0:bf7b9fba3924 748
frank26080115 0:bf7b9fba3924 749 case USB_EVT_OUT:
frank26080115 0:bf7b9fba3924 750 if (SetupPacket.bmRequestType.BM.Dir == 0) {
frank26080115 0:bf7b9fba3924 751 if (EP0Data.Count) {
frank26080115 0:bf7b9fba3924 752 USB_DataOutStage();
frank26080115 0:bf7b9fba3924 753 if (EP0Data.Count == 0) {
frank26080115 0:bf7b9fba3924 754 switch (SetupPacket.bmRequestType.BM.Type) {
frank26080115 0:bf7b9fba3924 755 case REQUEST_STANDARD:
frank26080115 0:bf7b9fba3924 756 goto stall_i;
frank26080115 0:bf7b9fba3924 757 #if (USB_CLASS)
frank26080115 0:bf7b9fba3924 758 case REQUEST_CLASS:
frank26080115 0:bf7b9fba3924 759 switch (SetupPacket.bmRequestType.BM.Recipient) {
frank26080115 0:bf7b9fba3924 760 case REQUEST_TO_INTERFACE:
frank26080115 0:bf7b9fba3924 761 #if USB_HID
frank26080115 0:bf7b9fba3924 762 if (SetupPacket.wIndex.WB.L == USB_HID_IF_NUM) {
frank26080115 0:bf7b9fba3924 763 if (!HID_SetReport()) {
frank26080115 0:bf7b9fba3924 764 goto stall_i;
frank26080115 0:bf7b9fba3924 765 }
frank26080115 0:bf7b9fba3924 766 break;
frank26080115 0:bf7b9fba3924 767 }
frank26080115 0:bf7b9fba3924 768 #endif
frank26080115 0:bf7b9fba3924 769 #if USB_AUDIO
frank26080115 0:bf7b9fba3924 770 if ((SetupPacket.wIndex.WB.L == USB_ADC_CIF_NUM) ||
frank26080115 0:bf7b9fba3924 771 (SetupPacket.wIndex.WB.L == USB_ADC_SIF1_NUM) ||
frank26080115 0:bf7b9fba3924 772 (SetupPacket.wIndex.WB.L == USB_ADC_SIF2_NUM)) {
frank26080115 0:bf7b9fba3924 773 if (!ADC_IF_SetRequest()) {
frank26080115 0:bf7b9fba3924 774 goto stall_i;
frank26080115 0:bf7b9fba3924 775 }
frank26080115 0:bf7b9fba3924 776 break;
frank26080115 0:bf7b9fba3924 777 }
frank26080115 0:bf7b9fba3924 778 #endif
frank26080115 0:bf7b9fba3924 779 goto stall_i;
frank26080115 0:bf7b9fba3924 780 case REQUEST_TO_ENDPOINT:
frank26080115 0:bf7b9fba3924 781 #if USB_AUDIO
frank26080115 0:bf7b9fba3924 782 if (ADC_EP_SetRequest()) break;
frank26080115 0:bf7b9fba3924 783 #endif
frank26080115 0:bf7b9fba3924 784 goto stall_i;
frank26080115 0:bf7b9fba3924 785 default:
frank26080115 0:bf7b9fba3924 786 goto stall_i;
frank26080115 0:bf7b9fba3924 787 }
frank26080115 0:bf7b9fba3924 788 #endif
frank26080115 0:bf7b9fba3924 789 default:
frank26080115 0:bf7b9fba3924 790 goto stall_i;
frank26080115 0:bf7b9fba3924 791 }
frank26080115 0:bf7b9fba3924 792 // USB_StatusInStage();
frank26080115 0:bf7b9fba3924 793 }
frank26080115 0:bf7b9fba3924 794 }
frank26080115 0:bf7b9fba3924 795 } else {
frank26080115 0:bf7b9fba3924 796 USB_StatusOutStage();
frank26080115 0:bf7b9fba3924 797 }
frank26080115 0:bf7b9fba3924 798 break;
frank26080115 0:bf7b9fba3924 799
frank26080115 0:bf7b9fba3924 800 case USB_EVT_IN:
frank26080115 0:bf7b9fba3924 801 if (SetupPacket.bmRequestType.BM.Dir == 1) {
frank26080115 0:bf7b9fba3924 802 USB_DataInStage();
frank26080115 0:bf7b9fba3924 803 } else {
frank26080115 0:bf7b9fba3924 804 if (USB_DeviceAddress & 0x80) {
frank26080115 0:bf7b9fba3924 805 USB_DeviceAddress &= 0x7F;
frank26080115 0:bf7b9fba3924 806 USB_SetAddress(USB_DeviceAddress);
frank26080115 0:bf7b9fba3924 807 }
frank26080115 0:bf7b9fba3924 808 }
frank26080115 0:bf7b9fba3924 809 break;
frank26080115 0:bf7b9fba3924 810
frank26080115 0:bf7b9fba3924 811 case USB_EVT_IN_STALL:
frank26080115 0:bf7b9fba3924 812 USB_ClrStallEP(0x80);
frank26080115 0:bf7b9fba3924 813 break;
frank26080115 0:bf7b9fba3924 814
frank26080115 0:bf7b9fba3924 815 case USB_EVT_OUT_STALL:
frank26080115 0:bf7b9fba3924 816 USB_ClrStallEP(0x00);
frank26080115 0:bf7b9fba3924 817 break;
frank26080115 0:bf7b9fba3924 818
frank26080115 0:bf7b9fba3924 819 }
frank26080115 0:bf7b9fba3924 820 }