These are the examples provided for [[/users/frank26080115/libraries/LPC1700CMSIS_Lib/]] Note, the entire "program" is not compilable!
USBDEV/USBMassStorage/usbcore.c@0:bf7b9fba3924, 2011-03-20 (annotated)
- Committer:
- frank26080115
- Date:
- Sun Mar 20 05:38:56 2011 +0000
- Revision:
- 0:bf7b9fba3924
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
frank26080115 | 0:bf7b9fba3924 | 1 | /*---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 2 | * U S B - K e r n e l |
frank26080115 | 0:bf7b9fba3924 | 3 | *---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 4 | * Name: USBCORE.C |
frank26080115 | 0:bf7b9fba3924 | 5 | * Purpose: USB Core Module |
frank26080115 | 0:bf7b9fba3924 | 6 | * Version: V1.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 | } |