Fork of the official USBDevice library

Fork of USBDevice by mbed official

Committer:
screamer
Date:
Fri Apr 28 17:01:10 2017 +0000
Branch:
device-files
Revision:
76:f0fd8d911b24
Parent:
73:8d28a0cb7b43
Changed the layout of USBDevice implementation for various targets to match mbed-os/targets. This also reduces the amount of files being compiled as USBDevice code for other targets is not compiled.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 73:8d28a0cb7b43 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
screamer 73:8d28a0cb7b43 2 *
screamer 73:8d28a0cb7b43 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
screamer 73:8d28a0cb7b43 4 * and associated documentation files (the "Software"), to deal in the Software without
screamer 73:8d28a0cb7b43 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
screamer 73:8d28a0cb7b43 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
screamer 73:8d28a0cb7b43 7 * Software is furnished to do so, subject to the following conditions:
screamer 73:8d28a0cb7b43 8 *
screamer 73:8d28a0cb7b43 9 * The above copyright notice and this permission notice shall be included in all copies or
screamer 73:8d28a0cb7b43 10 * substantial portions of the Software.
screamer 73:8d28a0cb7b43 11 *
screamer 73:8d28a0cb7b43 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
screamer 73:8d28a0cb7b43 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
screamer 73:8d28a0cb7b43 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
screamer 73:8d28a0cb7b43 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
screamer 73:8d28a0cb7b43 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
screamer 73:8d28a0cb7b43 17 */
screamer 73:8d28a0cb7b43 18
screamer 73:8d28a0cb7b43 19 #include "stdint.h"
screamer 73:8d28a0cb7b43 20 #include "USBAudio.h"
screamer 73:8d28a0cb7b43 21 #include "USBAudio_Types.h"
screamer 73:8d28a0cb7b43 22
screamer 73:8d28a0cb7b43 23
screamer 73:8d28a0cb7b43 24
screamer 73:8d28a0cb7b43 25 USBAudio::USBAudio(uint32_t frequency_in, uint8_t channel_nb_in, uint32_t frequency_out, uint8_t channel_nb_out, uint16_t vendor_id, uint16_t product_id, uint16_t product_release): USBDevice(vendor_id, product_id, product_release) {
screamer 73:8d28a0cb7b43 26 mute = 0;
screamer 73:8d28a0cb7b43 27 volCur = 0x0080;
screamer 73:8d28a0cb7b43 28 volMin = 0x0000;
screamer 73:8d28a0cb7b43 29 volMax = 0x0100;
screamer 73:8d28a0cb7b43 30 volRes = 0x0004;
screamer 73:8d28a0cb7b43 31 available = false;
screamer 73:8d28a0cb7b43 32
screamer 73:8d28a0cb7b43 33 FREQ_IN = frequency_in;
screamer 73:8d28a0cb7b43 34 FREQ_OUT = frequency_out;
screamer 73:8d28a0cb7b43 35
screamer 73:8d28a0cb7b43 36 this->channel_nb_in = channel_nb_in;
screamer 73:8d28a0cb7b43 37 this->channel_nb_out = channel_nb_out;
screamer 73:8d28a0cb7b43 38
screamer 73:8d28a0cb7b43 39 // stereo -> *2, mono -> *1
screamer 73:8d28a0cb7b43 40 PACKET_SIZE_ISO_IN = (FREQ_IN / 500) * channel_nb_in;
screamer 73:8d28a0cb7b43 41 PACKET_SIZE_ISO_OUT = (FREQ_OUT / 500) * channel_nb_out;
screamer 73:8d28a0cb7b43 42
screamer 73:8d28a0cb7b43 43 // STEREO -> left and right
screamer 73:8d28a0cb7b43 44 channel_config_in = (channel_nb_in == 1) ? CHANNEL_M : CHANNEL_L + CHANNEL_R;
screamer 73:8d28a0cb7b43 45 channel_config_out = (channel_nb_out == 1) ? CHANNEL_M : CHANNEL_L + CHANNEL_R;
screamer 73:8d28a0cb7b43 46
screamer 73:8d28a0cb7b43 47 SOF_handler = false;
screamer 73:8d28a0cb7b43 48
screamer 73:8d28a0cb7b43 49 buf_stream_out = NULL;
screamer 73:8d28a0cb7b43 50 buf_stream_in = NULL;
screamer 73:8d28a0cb7b43 51
screamer 73:8d28a0cb7b43 52 interruptOUT = false;
screamer 73:8d28a0cb7b43 53 writeIN = false;
screamer 73:8d28a0cb7b43 54 interruptIN = false;
screamer 73:8d28a0cb7b43 55 available = false;
screamer 73:8d28a0cb7b43 56
screamer 73:8d28a0cb7b43 57 volume = 0;
screamer 73:8d28a0cb7b43 58
screamer 73:8d28a0cb7b43 59 // connect the device
screamer 73:8d28a0cb7b43 60 USBDevice::connect();
screamer 73:8d28a0cb7b43 61 }
screamer 73:8d28a0cb7b43 62
screamer 73:8d28a0cb7b43 63 bool USBAudio::read(uint8_t * buf) {
screamer 73:8d28a0cb7b43 64 buf_stream_in = buf;
screamer 73:8d28a0cb7b43 65 SOF_handler = false;
screamer 73:8d28a0cb7b43 66 while (!available || !SOF_handler);
screamer 73:8d28a0cb7b43 67 available = false;
screamer 73:8d28a0cb7b43 68 return true;
screamer 73:8d28a0cb7b43 69 }
screamer 73:8d28a0cb7b43 70
screamer 73:8d28a0cb7b43 71 bool USBAudio::readNB(uint8_t * buf) {
screamer 73:8d28a0cb7b43 72 buf_stream_in = buf;
screamer 73:8d28a0cb7b43 73 SOF_handler = false;
screamer 73:8d28a0cb7b43 74 while (!SOF_handler);
screamer 73:8d28a0cb7b43 75 if (available) {
screamer 73:8d28a0cb7b43 76 available = false;
screamer 73:8d28a0cb7b43 77 buf_stream_in = NULL;
screamer 73:8d28a0cb7b43 78 return true;
screamer 73:8d28a0cb7b43 79 }
screamer 73:8d28a0cb7b43 80 return false;
screamer 73:8d28a0cb7b43 81 }
screamer 73:8d28a0cb7b43 82
screamer 73:8d28a0cb7b43 83 bool USBAudio::readWrite(uint8_t * buf_read, uint8_t * buf_write) {
screamer 73:8d28a0cb7b43 84 buf_stream_in = buf_read;
screamer 73:8d28a0cb7b43 85 SOF_handler = false;
screamer 73:8d28a0cb7b43 86 writeIN = false;
screamer 73:8d28a0cb7b43 87 if (interruptIN) {
screamer 73:8d28a0cb7b43 88 USBDevice::writeNB(EPISO_IN, buf_write, PACKET_SIZE_ISO_OUT, PACKET_SIZE_ISO_OUT);
screamer 73:8d28a0cb7b43 89 } else {
screamer 73:8d28a0cb7b43 90 buf_stream_out = buf_write;
screamer 73:8d28a0cb7b43 91 }
screamer 73:8d28a0cb7b43 92 while (!available);
screamer 73:8d28a0cb7b43 93 if (interruptIN) {
screamer 73:8d28a0cb7b43 94 while (!writeIN);
screamer 73:8d28a0cb7b43 95 }
screamer 73:8d28a0cb7b43 96 while (!SOF_handler);
screamer 73:8d28a0cb7b43 97 return true;
screamer 73:8d28a0cb7b43 98 }
screamer 73:8d28a0cb7b43 99
screamer 73:8d28a0cb7b43 100
screamer 73:8d28a0cb7b43 101 bool USBAudio::write(uint8_t * buf) {
screamer 73:8d28a0cb7b43 102 writeIN = false;
screamer 73:8d28a0cb7b43 103 SOF_handler = false;
screamer 73:8d28a0cb7b43 104 if (interruptIN) {
screamer 73:8d28a0cb7b43 105 USBDevice::writeNB(EPISO_IN, buf, PACKET_SIZE_ISO_OUT, PACKET_SIZE_ISO_OUT);
screamer 73:8d28a0cb7b43 106 } else {
screamer 73:8d28a0cb7b43 107 buf_stream_out = buf;
screamer 73:8d28a0cb7b43 108 }
screamer 73:8d28a0cb7b43 109 while (!SOF_handler);
screamer 73:8d28a0cb7b43 110 if (interruptIN) {
screamer 73:8d28a0cb7b43 111 while (!writeIN);
screamer 73:8d28a0cb7b43 112 }
screamer 73:8d28a0cb7b43 113 return true;
screamer 73:8d28a0cb7b43 114 }
screamer 73:8d28a0cb7b43 115
screamer 73:8d28a0cb7b43 116 void USBAudio::writeSync(uint8_t *buf)
screamer 73:8d28a0cb7b43 117 {
screamer 73:8d28a0cb7b43 118 USBDevice::writeNB(EPISO_IN, buf, PACKET_SIZE_ISO_OUT, PACKET_SIZE_ISO_OUT);
screamer 73:8d28a0cb7b43 119 }
screamer 73:8d28a0cb7b43 120
screamer 73:8d28a0cb7b43 121 uint32_t USBAudio::readSync(uint8_t *buf)
screamer 73:8d28a0cb7b43 122 {
screamer 73:8d28a0cb7b43 123 uint32_t size = 0;
screamer 73:8d28a0cb7b43 124 USBDevice::readEP(EPISO_OUT, (uint8_t *)buf, &size, PACKET_SIZE_ISO_IN);
screamer 73:8d28a0cb7b43 125 return size;
screamer 73:8d28a0cb7b43 126 }
screamer 73:8d28a0cb7b43 127
screamer 73:8d28a0cb7b43 128 float USBAudio::getVolume() {
screamer 73:8d28a0cb7b43 129 return (mute) ? 0.0 : volume;
screamer 73:8d28a0cb7b43 130 }
screamer 73:8d28a0cb7b43 131
screamer 73:8d28a0cb7b43 132
screamer 73:8d28a0cb7b43 133 bool USBAudio::EPISO_OUT_callback() {
screamer 73:8d28a0cb7b43 134 uint32_t size = 0;
screamer 73:8d28a0cb7b43 135 interruptOUT = true;
screamer 73:8d28a0cb7b43 136 if (buf_stream_in != NULL) {
screamer 73:8d28a0cb7b43 137 readEP(EPISO_OUT, (uint8_t *)buf_stream_in, &size, PACKET_SIZE_ISO_IN);
screamer 73:8d28a0cb7b43 138 available = true;
screamer 73:8d28a0cb7b43 139 buf_stream_in = NULL;
screamer 73:8d28a0cb7b43 140 }
screamer 73:8d28a0cb7b43 141 else {
screamer 73:8d28a0cb7b43 142 if (rxDone)
screamer 73:8d28a0cb7b43 143 rxDone.call();
screamer 73:8d28a0cb7b43 144 }
screamer 73:8d28a0cb7b43 145 readStart(EPISO_OUT, PACKET_SIZE_ISO_IN);
screamer 73:8d28a0cb7b43 146 return false;
screamer 73:8d28a0cb7b43 147 }
screamer 73:8d28a0cb7b43 148
screamer 73:8d28a0cb7b43 149
screamer 73:8d28a0cb7b43 150 bool USBAudio::EPISO_IN_callback() {
screamer 73:8d28a0cb7b43 151 interruptIN = true;
screamer 73:8d28a0cb7b43 152 writeIN = true;
screamer 73:8d28a0cb7b43 153 if (txDone)
screamer 73:8d28a0cb7b43 154 txDone.call();
screamer 73:8d28a0cb7b43 155 return true;
screamer 73:8d28a0cb7b43 156 }
screamer 73:8d28a0cb7b43 157
screamer 73:8d28a0cb7b43 158
screamer 73:8d28a0cb7b43 159
screamer 73:8d28a0cb7b43 160 // Called in ISR context on each start of frame
screamer 73:8d28a0cb7b43 161 void USBAudio::SOF(int frameNumber) {
screamer 73:8d28a0cb7b43 162 uint32_t size = 0;
screamer 73:8d28a0cb7b43 163
screamer 73:8d28a0cb7b43 164 if (!interruptOUT) {
screamer 73:8d28a0cb7b43 165 // read the isochronous endpoint
screamer 73:8d28a0cb7b43 166 if (buf_stream_in != NULL) {
screamer 73:8d28a0cb7b43 167 if (USBDevice::readEP_NB(EPISO_OUT, (uint8_t *)buf_stream_in, &size, PACKET_SIZE_ISO_IN)) {
screamer 73:8d28a0cb7b43 168 if (size) {
screamer 73:8d28a0cb7b43 169 available = true;
screamer 73:8d28a0cb7b43 170 readStart(EPISO_OUT, PACKET_SIZE_ISO_IN);
screamer 73:8d28a0cb7b43 171 buf_stream_in = NULL;
screamer 73:8d28a0cb7b43 172 }
screamer 73:8d28a0cb7b43 173 }
screamer 73:8d28a0cb7b43 174 }
screamer 73:8d28a0cb7b43 175 }
screamer 73:8d28a0cb7b43 176
screamer 73:8d28a0cb7b43 177 if (!interruptIN) {
screamer 73:8d28a0cb7b43 178 // write if needed
screamer 73:8d28a0cb7b43 179 if (buf_stream_out != NULL) {
screamer 73:8d28a0cb7b43 180 USBDevice::writeNB(EPISO_IN, (uint8_t *)buf_stream_out, PACKET_SIZE_ISO_OUT, PACKET_SIZE_ISO_OUT);
screamer 73:8d28a0cb7b43 181 buf_stream_out = NULL;
screamer 73:8d28a0cb7b43 182 }
screamer 73:8d28a0cb7b43 183 }
screamer 73:8d28a0cb7b43 184
screamer 73:8d28a0cb7b43 185 SOF_handler = true;
screamer 73:8d28a0cb7b43 186 }
screamer 73:8d28a0cb7b43 187
screamer 73:8d28a0cb7b43 188
screamer 73:8d28a0cb7b43 189 // Called in ISR context
screamer 73:8d28a0cb7b43 190 // Set configuration. Return false if the configuration is not supported.
screamer 73:8d28a0cb7b43 191 bool USBAudio::USBCallback_setConfiguration(uint8_t configuration) {
screamer 73:8d28a0cb7b43 192 if (configuration != DEFAULT_CONFIGURATION) {
screamer 73:8d28a0cb7b43 193 return false;
screamer 73:8d28a0cb7b43 194 }
screamer 73:8d28a0cb7b43 195
screamer 73:8d28a0cb7b43 196 // Configure isochronous endpoint
screamer 73:8d28a0cb7b43 197 realiseEndpoint(EPISO_OUT, PACKET_SIZE_ISO_IN, ISOCHRONOUS);
screamer 73:8d28a0cb7b43 198 realiseEndpoint(EPISO_IN, PACKET_SIZE_ISO_OUT, ISOCHRONOUS);
screamer 73:8d28a0cb7b43 199
screamer 73:8d28a0cb7b43 200 // activate readings on this endpoint
screamer 73:8d28a0cb7b43 201 readStart(EPISO_OUT, PACKET_SIZE_ISO_IN);
screamer 73:8d28a0cb7b43 202 return true;
screamer 73:8d28a0cb7b43 203 }
screamer 73:8d28a0cb7b43 204
screamer 73:8d28a0cb7b43 205
screamer 73:8d28a0cb7b43 206 // Called in ISR context
screamer 73:8d28a0cb7b43 207 // Set alternate setting. Return false if the alternate setting is not supported
screamer 73:8d28a0cb7b43 208 bool USBAudio::USBCallback_setInterface(uint16_t interface, uint8_t alternate) {
screamer 73:8d28a0cb7b43 209 if (interface == 0 && alternate == 0) {
screamer 73:8d28a0cb7b43 210 return true;
screamer 73:8d28a0cb7b43 211 }
screamer 73:8d28a0cb7b43 212 if (interface == 1 && (alternate == 0 || alternate == 1)) {
screamer 73:8d28a0cb7b43 213 return true;
screamer 73:8d28a0cb7b43 214 }
screamer 73:8d28a0cb7b43 215 if (interface == 2 && (alternate == 0 || alternate == 1)) {
screamer 73:8d28a0cb7b43 216 return true;
screamer 73:8d28a0cb7b43 217 }
screamer 73:8d28a0cb7b43 218 return false;
screamer 73:8d28a0cb7b43 219 }
screamer 73:8d28a0cb7b43 220
screamer 73:8d28a0cb7b43 221
screamer 73:8d28a0cb7b43 222
screamer 73:8d28a0cb7b43 223 // Called in ISR context
screamer 73:8d28a0cb7b43 224 // Called by USBDevice on Endpoint0 request
screamer 73:8d28a0cb7b43 225 // This is used to handle extensions to standard requests and class specific requests.
screamer 73:8d28a0cb7b43 226 // Return true if class handles this request
screamer 73:8d28a0cb7b43 227 bool USBAudio::USBCallback_request() {
screamer 73:8d28a0cb7b43 228 bool success = false;
screamer 73:8d28a0cb7b43 229 CONTROL_TRANSFER * transfer = getTransferPtr();
screamer 73:8d28a0cb7b43 230
screamer 73:8d28a0cb7b43 231 // Process class-specific requests
screamer 73:8d28a0cb7b43 232 if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
screamer 73:8d28a0cb7b43 233
screamer 73:8d28a0cb7b43 234 // Feature Unit: Interface = 0, ID = 2
screamer 73:8d28a0cb7b43 235 if (transfer->setup.wIndex == 0x0200) {
screamer 73:8d28a0cb7b43 236
screamer 73:8d28a0cb7b43 237 // Master Channel
screamer 73:8d28a0cb7b43 238 if ((transfer->setup.wValue & 0xff) == 0) {
screamer 73:8d28a0cb7b43 239
screamer 73:8d28a0cb7b43 240 switch (transfer->setup.wValue >> 8) {
screamer 73:8d28a0cb7b43 241 case MUTE_CONTROL:
screamer 73:8d28a0cb7b43 242 switch (transfer->setup.bRequest) {
screamer 73:8d28a0cb7b43 243 case REQUEST_GET_CUR:
screamer 73:8d28a0cb7b43 244 transfer->remaining = 1;
screamer 73:8d28a0cb7b43 245 transfer->ptr = &mute;
screamer 73:8d28a0cb7b43 246 transfer->direction = DEVICE_TO_HOST;
screamer 73:8d28a0cb7b43 247 success = true;
screamer 73:8d28a0cb7b43 248 break;
screamer 73:8d28a0cb7b43 249
screamer 73:8d28a0cb7b43 250 case REQUEST_SET_CUR:
screamer 73:8d28a0cb7b43 251 transfer->remaining = 1;
screamer 73:8d28a0cb7b43 252 transfer->notify = true;
screamer 73:8d28a0cb7b43 253 transfer->direction = HOST_TO_DEVICE;
screamer 73:8d28a0cb7b43 254 success = true;
screamer 73:8d28a0cb7b43 255 break;
screamer 73:8d28a0cb7b43 256 default:
screamer 73:8d28a0cb7b43 257 break;
screamer 73:8d28a0cb7b43 258 }
screamer 73:8d28a0cb7b43 259 break;
screamer 73:8d28a0cb7b43 260 case VOLUME_CONTROL:
screamer 73:8d28a0cb7b43 261 switch (transfer->setup.bRequest) {
screamer 73:8d28a0cb7b43 262 case REQUEST_GET_CUR:
screamer 73:8d28a0cb7b43 263 transfer->remaining = 2;
screamer 73:8d28a0cb7b43 264 transfer->ptr = (uint8_t *)&volCur;
screamer 73:8d28a0cb7b43 265 transfer->direction = DEVICE_TO_HOST;
screamer 73:8d28a0cb7b43 266 success = true;
screamer 73:8d28a0cb7b43 267 break;
screamer 73:8d28a0cb7b43 268 case REQUEST_GET_MIN:
screamer 73:8d28a0cb7b43 269 transfer->remaining = 2;
screamer 73:8d28a0cb7b43 270 transfer->ptr = (uint8_t *)&volMin;
screamer 73:8d28a0cb7b43 271 transfer->direction = DEVICE_TO_HOST;
screamer 73:8d28a0cb7b43 272 success = true;
screamer 73:8d28a0cb7b43 273 break;
screamer 73:8d28a0cb7b43 274 case REQUEST_GET_MAX:
screamer 73:8d28a0cb7b43 275 transfer->remaining = 2;
screamer 73:8d28a0cb7b43 276 transfer->ptr = (uint8_t *)&volMax;
screamer 73:8d28a0cb7b43 277 transfer->direction = DEVICE_TO_HOST;
screamer 73:8d28a0cb7b43 278 success = true;
screamer 73:8d28a0cb7b43 279 break;
screamer 73:8d28a0cb7b43 280 case REQUEST_GET_RES:
screamer 73:8d28a0cb7b43 281 transfer->remaining = 2;
screamer 73:8d28a0cb7b43 282 transfer->ptr = (uint8_t *)&volRes;
screamer 73:8d28a0cb7b43 283 transfer->direction = DEVICE_TO_HOST;
screamer 73:8d28a0cb7b43 284 success = true;
screamer 73:8d28a0cb7b43 285 break;
screamer 73:8d28a0cb7b43 286
screamer 73:8d28a0cb7b43 287 case REQUEST_SET_CUR:
screamer 73:8d28a0cb7b43 288 transfer->remaining = 2;
screamer 73:8d28a0cb7b43 289 transfer->notify = true;
screamer 73:8d28a0cb7b43 290 transfer->direction = HOST_TO_DEVICE;
screamer 73:8d28a0cb7b43 291 success = true;
screamer 73:8d28a0cb7b43 292 break;
screamer 73:8d28a0cb7b43 293 case REQUEST_SET_MIN:
screamer 73:8d28a0cb7b43 294 transfer->remaining = 2;
screamer 73:8d28a0cb7b43 295 transfer->notify = true;
screamer 73:8d28a0cb7b43 296 transfer->direction = HOST_TO_DEVICE;
screamer 73:8d28a0cb7b43 297 success = true;
screamer 73:8d28a0cb7b43 298 break;
screamer 73:8d28a0cb7b43 299 case REQUEST_SET_MAX:
screamer 73:8d28a0cb7b43 300 transfer->remaining = 2;
screamer 73:8d28a0cb7b43 301 transfer->notify = true;
screamer 73:8d28a0cb7b43 302 transfer->direction = HOST_TO_DEVICE;
screamer 73:8d28a0cb7b43 303 success = true;
screamer 73:8d28a0cb7b43 304 break;
screamer 73:8d28a0cb7b43 305 case REQUEST_SET_RES:
screamer 73:8d28a0cb7b43 306 transfer->remaining = 2;
screamer 73:8d28a0cb7b43 307 transfer->notify = true;
screamer 73:8d28a0cb7b43 308 transfer->direction = HOST_TO_DEVICE;
screamer 73:8d28a0cb7b43 309 success = true;
screamer 73:8d28a0cb7b43 310 break;
screamer 73:8d28a0cb7b43 311 }
screamer 73:8d28a0cb7b43 312 break;
screamer 73:8d28a0cb7b43 313 default:
screamer 73:8d28a0cb7b43 314 break;
screamer 73:8d28a0cb7b43 315 }
screamer 73:8d28a0cb7b43 316 }
screamer 73:8d28a0cb7b43 317 }
screamer 73:8d28a0cb7b43 318 }
screamer 73:8d28a0cb7b43 319 return success;
screamer 73:8d28a0cb7b43 320 }
screamer 73:8d28a0cb7b43 321
screamer 73:8d28a0cb7b43 322
screamer 73:8d28a0cb7b43 323 // Called in ISR context when a data OUT stage has been performed
screamer 73:8d28a0cb7b43 324 void USBAudio::USBCallback_requestCompleted(uint8_t * buf, uint32_t length) {
screamer 73:8d28a0cb7b43 325 if ((length == 1) || (length == 2)) {
screamer 73:8d28a0cb7b43 326 uint16_t data = (length == 1) ? *buf : *((uint16_t *)buf);
screamer 73:8d28a0cb7b43 327 CONTROL_TRANSFER * transfer = getTransferPtr();
screamer 73:8d28a0cb7b43 328 switch (transfer->setup.wValue >> 8) {
screamer 73:8d28a0cb7b43 329 case MUTE_CONTROL:
screamer 73:8d28a0cb7b43 330 switch (transfer->setup.bRequest) {
screamer 73:8d28a0cb7b43 331 case REQUEST_SET_CUR:
screamer 73:8d28a0cb7b43 332 mute = data & 0xff;
screamer 73:8d28a0cb7b43 333 if (updateVol)
screamer 73:8d28a0cb7b43 334 updateVol.call();
screamer 73:8d28a0cb7b43 335 break;
screamer 73:8d28a0cb7b43 336 default:
screamer 73:8d28a0cb7b43 337 break;
screamer 73:8d28a0cb7b43 338 }
screamer 73:8d28a0cb7b43 339 break;
screamer 73:8d28a0cb7b43 340 case VOLUME_CONTROL:
screamer 73:8d28a0cb7b43 341 switch (transfer->setup.bRequest) {
screamer 73:8d28a0cb7b43 342 case REQUEST_SET_CUR:
screamer 73:8d28a0cb7b43 343 volCur = data;
screamer 73:8d28a0cb7b43 344 volume = (float)volCur/(float)volMax;
screamer 73:8d28a0cb7b43 345 if (updateVol)
screamer 73:8d28a0cb7b43 346 updateVol.call();
screamer 73:8d28a0cb7b43 347 break;
screamer 73:8d28a0cb7b43 348 default:
screamer 73:8d28a0cb7b43 349 break;
screamer 73:8d28a0cb7b43 350 }
screamer 73:8d28a0cb7b43 351 break;
screamer 73:8d28a0cb7b43 352 default:
screamer 73:8d28a0cb7b43 353 break;
screamer 73:8d28a0cb7b43 354 }
screamer 73:8d28a0cb7b43 355 }
screamer 73:8d28a0cb7b43 356 }
screamer 73:8d28a0cb7b43 357
screamer 73:8d28a0cb7b43 358
screamer 73:8d28a0cb7b43 359
screamer 73:8d28a0cb7b43 360 #define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \
screamer 73:8d28a0cb7b43 361 + (5 * INTERFACE_DESCRIPTOR_LENGTH) \
screamer 73:8d28a0cb7b43 362 + (1 * CONTROL_INTERFACE_DESCRIPTOR_LENGTH + 1) \
screamer 73:8d28a0cb7b43 363 + (2 * INPUT_TERMINAL_DESCRIPTOR_LENGTH) \
screamer 73:8d28a0cb7b43 364 + (1 * FEATURE_UNIT_DESCRIPTOR_LENGTH) \
screamer 73:8d28a0cb7b43 365 + (2 * OUTPUT_TERMINAL_DESCRIPTOR_LENGTH) \
screamer 73:8d28a0cb7b43 366 + (2 * STREAMING_INTERFACE_DESCRIPTOR_LENGTH) \
screamer 73:8d28a0cb7b43 367 + (2 * FORMAT_TYPE_I_DESCRIPTOR_LENGTH) \
screamer 73:8d28a0cb7b43 368 + (2 * (ENDPOINT_DESCRIPTOR_LENGTH + 2)) \
screamer 73:8d28a0cb7b43 369 + (2 * STREAMING_ENDPOINT_DESCRIPTOR_LENGTH) )
screamer 73:8d28a0cb7b43 370
screamer 73:8d28a0cb7b43 371 #define TOTAL_CONTROL_INTF_LENGTH (CONTROL_INTERFACE_DESCRIPTOR_LENGTH + 1 + \
screamer 73:8d28a0cb7b43 372 2*INPUT_TERMINAL_DESCRIPTOR_LENGTH + \
screamer 73:8d28a0cb7b43 373 FEATURE_UNIT_DESCRIPTOR_LENGTH + \
screamer 73:8d28a0cb7b43 374 2*OUTPUT_TERMINAL_DESCRIPTOR_LENGTH)
screamer 73:8d28a0cb7b43 375
screamer 73:8d28a0cb7b43 376 uint8_t * USBAudio::configurationDesc() {
screamer 73:8d28a0cb7b43 377 static uint8_t configDescriptor[] = {
screamer 73:8d28a0cb7b43 378 // Configuration 1
screamer 73:8d28a0cb7b43 379 CONFIGURATION_DESCRIPTOR_LENGTH, // bLength
screamer 73:8d28a0cb7b43 380 CONFIGURATION_DESCRIPTOR, // bDescriptorType
screamer 73:8d28a0cb7b43 381 LSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (LSB)
screamer 73:8d28a0cb7b43 382 MSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (MSB)
screamer 73:8d28a0cb7b43 383 0x03, // bNumInterfaces
screamer 73:8d28a0cb7b43 384 DEFAULT_CONFIGURATION, // bConfigurationValue
screamer 73:8d28a0cb7b43 385 0x00, // iConfiguration
screamer 73:8d28a0cb7b43 386 0x80, // bmAttributes
screamer 73:8d28a0cb7b43 387 50, // bMaxPower
screamer 73:8d28a0cb7b43 388
screamer 73:8d28a0cb7b43 389 // Interface 0, Alternate Setting 0, Audio Control
screamer 73:8d28a0cb7b43 390 INTERFACE_DESCRIPTOR_LENGTH, // bLength
screamer 73:8d28a0cb7b43 391 INTERFACE_DESCRIPTOR, // bDescriptorType
screamer 73:8d28a0cb7b43 392 0x00, // bInterfaceNumber
screamer 73:8d28a0cb7b43 393 0x00, // bAlternateSetting
screamer 73:8d28a0cb7b43 394 0x00, // bNumEndpoints
screamer 73:8d28a0cb7b43 395 AUDIO_CLASS, // bInterfaceClass
screamer 73:8d28a0cb7b43 396 SUBCLASS_AUDIOCONTROL, // bInterfaceSubClass
screamer 73:8d28a0cb7b43 397 0x00, // bInterfaceProtocol
screamer 73:8d28a0cb7b43 398 0x00, // iInterface
screamer 73:8d28a0cb7b43 399
screamer 73:8d28a0cb7b43 400
screamer 73:8d28a0cb7b43 401 // Audio Control Interface
screamer 73:8d28a0cb7b43 402 CONTROL_INTERFACE_DESCRIPTOR_LENGTH + 1,// bLength
screamer 73:8d28a0cb7b43 403 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
screamer 73:8d28a0cb7b43 404 CONTROL_HEADER, // bDescriptorSubtype
screamer 73:8d28a0cb7b43 405 LSB(0x0100), // bcdADC (LSB)
screamer 73:8d28a0cb7b43 406 MSB(0x0100), // bcdADC (MSB)
screamer 73:8d28a0cb7b43 407 LSB(TOTAL_CONTROL_INTF_LENGTH), // wTotalLength
screamer 73:8d28a0cb7b43 408 MSB(TOTAL_CONTROL_INTF_LENGTH), // wTotalLength
screamer 73:8d28a0cb7b43 409 0x02, // bInCollection
screamer 73:8d28a0cb7b43 410 0x01, // baInterfaceNr
screamer 73:8d28a0cb7b43 411 0x02, // baInterfaceNr
screamer 73:8d28a0cb7b43 412
screamer 73:8d28a0cb7b43 413 // Audio Input Terminal (Speaker)
screamer 73:8d28a0cb7b43 414 INPUT_TERMINAL_DESCRIPTOR_LENGTH, // bLength
screamer 73:8d28a0cb7b43 415 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
screamer 73:8d28a0cb7b43 416 CONTROL_INPUT_TERMINAL, // bDescriptorSubtype
screamer 73:8d28a0cb7b43 417 0x01, // bTerminalID
screamer 73:8d28a0cb7b43 418 LSB(TERMINAL_USB_STREAMING), // wTerminalType
screamer 73:8d28a0cb7b43 419 MSB(TERMINAL_USB_STREAMING), // wTerminalType
screamer 73:8d28a0cb7b43 420 0x00, // bAssocTerminal
screamer 73:8d28a0cb7b43 421 channel_nb_in, // bNrChannels
screamer 73:8d28a0cb7b43 422 (uint8_t)(LSB(channel_config_in)), // wChannelConfig
screamer 73:8d28a0cb7b43 423 (uint8_t)(MSB(channel_config_in)), // wChannelConfig
screamer 73:8d28a0cb7b43 424 0x00, // iChannelNames
screamer 73:8d28a0cb7b43 425 0x00, // iTerminal
screamer 73:8d28a0cb7b43 426
screamer 73:8d28a0cb7b43 427 // Audio Feature Unit (Speaker)
screamer 73:8d28a0cb7b43 428 FEATURE_UNIT_DESCRIPTOR_LENGTH, // bLength
screamer 73:8d28a0cb7b43 429 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
screamer 73:8d28a0cb7b43 430 CONTROL_FEATURE_UNIT, // bDescriptorSubtype
screamer 73:8d28a0cb7b43 431 0x02, // bUnitID
screamer 73:8d28a0cb7b43 432 0x01, // bSourceID
screamer 73:8d28a0cb7b43 433 0x01, // bControlSize
screamer 73:8d28a0cb7b43 434 CONTROL_MUTE |
screamer 73:8d28a0cb7b43 435 CONTROL_VOLUME, // bmaControls(0)
screamer 73:8d28a0cb7b43 436 0x00, // bmaControls(1)
screamer 73:8d28a0cb7b43 437 0x00, // iTerminal
screamer 73:8d28a0cb7b43 438
screamer 73:8d28a0cb7b43 439 // Audio Output Terminal (Speaker)
screamer 73:8d28a0cb7b43 440 OUTPUT_TERMINAL_DESCRIPTOR_LENGTH, // bLength
screamer 73:8d28a0cb7b43 441 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
screamer 73:8d28a0cb7b43 442 CONTROL_OUTPUT_TERMINAL, // bDescriptorSubtype
screamer 73:8d28a0cb7b43 443 0x03, // bTerminalID
screamer 73:8d28a0cb7b43 444 LSB(TERMINAL_SPEAKER), // wTerminalType
screamer 73:8d28a0cb7b43 445 MSB(TERMINAL_SPEAKER), // wTerminalType
screamer 73:8d28a0cb7b43 446 0x00, // bAssocTerminal
screamer 73:8d28a0cb7b43 447 0x02, // bSourceID
screamer 73:8d28a0cb7b43 448 0x00, // iTerminal
screamer 73:8d28a0cb7b43 449
screamer 73:8d28a0cb7b43 450
screamer 73:8d28a0cb7b43 451 // Audio Input Terminal (Microphone)
screamer 73:8d28a0cb7b43 452 INPUT_TERMINAL_DESCRIPTOR_LENGTH, // bLength
screamer 73:8d28a0cb7b43 453 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
screamer 73:8d28a0cb7b43 454 CONTROL_INPUT_TERMINAL, // bDescriptorSubtype
screamer 73:8d28a0cb7b43 455 0x04, // bTerminalID
screamer 73:8d28a0cb7b43 456 LSB(TERMINAL_MICROPHONE), // wTerminalType
screamer 73:8d28a0cb7b43 457 MSB(TERMINAL_MICROPHONE), // wTerminalType
screamer 73:8d28a0cb7b43 458 0x00, // bAssocTerminal
screamer 73:8d28a0cb7b43 459 channel_nb_out, // bNrChannels
screamer 73:8d28a0cb7b43 460 (uint8_t)(LSB(channel_config_out)), // wChannelConfig
screamer 73:8d28a0cb7b43 461 (uint8_t)(MSB(channel_config_out)), // wChannelConfig
screamer 73:8d28a0cb7b43 462 0x00, // iChannelNames
screamer 73:8d28a0cb7b43 463 0x00, // iTerminal
screamer 73:8d28a0cb7b43 464
screamer 73:8d28a0cb7b43 465 // Audio Output Terminal (Microphone)
screamer 73:8d28a0cb7b43 466 OUTPUT_TERMINAL_DESCRIPTOR_LENGTH, // bLength
screamer 73:8d28a0cb7b43 467 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
screamer 73:8d28a0cb7b43 468 CONTROL_OUTPUT_TERMINAL, // bDescriptorSubtype
screamer 73:8d28a0cb7b43 469 0x05, // bTerminalID
screamer 73:8d28a0cb7b43 470 LSB(TERMINAL_USB_STREAMING), // wTerminalType
screamer 73:8d28a0cb7b43 471 MSB(TERMINAL_USB_STREAMING), // wTerminalType
screamer 73:8d28a0cb7b43 472 0x00, // bAssocTerminal
screamer 73:8d28a0cb7b43 473 0x04, // bSourceID
screamer 73:8d28a0cb7b43 474 0x00, // iTerminal
screamer 73:8d28a0cb7b43 475
screamer 73:8d28a0cb7b43 476
screamer 73:8d28a0cb7b43 477
screamer 73:8d28a0cb7b43 478
screamer 73:8d28a0cb7b43 479
screamer 73:8d28a0cb7b43 480
screamer 73:8d28a0cb7b43 481 // Interface 1, Alternate Setting 0, Audio Streaming - Zero Bandwith
screamer 73:8d28a0cb7b43 482 INTERFACE_DESCRIPTOR_LENGTH, // bLength
screamer 73:8d28a0cb7b43 483 INTERFACE_DESCRIPTOR, // bDescriptorType
screamer 73:8d28a0cb7b43 484 0x01, // bInterfaceNumber
screamer 73:8d28a0cb7b43 485 0x00, // bAlternateSetting
screamer 73:8d28a0cb7b43 486 0x00, // bNumEndpoints
screamer 73:8d28a0cb7b43 487 AUDIO_CLASS, // bInterfaceClass
screamer 73:8d28a0cb7b43 488 SUBCLASS_AUDIOSTREAMING, // bInterfaceSubClass
screamer 73:8d28a0cb7b43 489 0x00, // bInterfaceProtocol
screamer 73:8d28a0cb7b43 490 0x00, // iInterface
screamer 73:8d28a0cb7b43 491
screamer 73:8d28a0cb7b43 492 // Interface 1, Alternate Setting 1, Audio Streaming - Operational
screamer 73:8d28a0cb7b43 493 INTERFACE_DESCRIPTOR_LENGTH, // bLength
screamer 73:8d28a0cb7b43 494 INTERFACE_DESCRIPTOR, // bDescriptorType
screamer 73:8d28a0cb7b43 495 0x01, // bInterfaceNumber
screamer 73:8d28a0cb7b43 496 0x01, // bAlternateSetting
screamer 73:8d28a0cb7b43 497 0x01, // bNumEndpoints
screamer 73:8d28a0cb7b43 498 AUDIO_CLASS, // bInterfaceClass
screamer 73:8d28a0cb7b43 499 SUBCLASS_AUDIOSTREAMING, // bInterfaceSubClass
screamer 73:8d28a0cb7b43 500 0x00, // bInterfaceProtocol
screamer 73:8d28a0cb7b43 501 0x00, // iInterface
screamer 73:8d28a0cb7b43 502
screamer 73:8d28a0cb7b43 503 // Audio Streaming Interface
screamer 73:8d28a0cb7b43 504 STREAMING_INTERFACE_DESCRIPTOR_LENGTH, // bLength
screamer 73:8d28a0cb7b43 505 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
screamer 73:8d28a0cb7b43 506 STREAMING_GENERAL, // bDescriptorSubtype
screamer 73:8d28a0cb7b43 507 0x01, // bTerminalLink
screamer 73:8d28a0cb7b43 508 0x00, // bDelay
screamer 73:8d28a0cb7b43 509 LSB(FORMAT_PCM), // wFormatTag
screamer 73:8d28a0cb7b43 510 MSB(FORMAT_PCM), // wFormatTag
screamer 73:8d28a0cb7b43 511
screamer 73:8d28a0cb7b43 512 // Audio Type I Format
screamer 73:8d28a0cb7b43 513 FORMAT_TYPE_I_DESCRIPTOR_LENGTH, // bLength
screamer 73:8d28a0cb7b43 514 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
screamer 73:8d28a0cb7b43 515 STREAMING_FORMAT_TYPE, // bDescriptorSubtype
screamer 73:8d28a0cb7b43 516 FORMAT_TYPE_I, // bFormatType
screamer 73:8d28a0cb7b43 517 channel_nb_in, // bNrChannels
screamer 73:8d28a0cb7b43 518 0x02, // bSubFrameSize
screamer 73:8d28a0cb7b43 519 16, // bBitResolution
screamer 73:8d28a0cb7b43 520 0x01, // bSamFreqType
screamer 73:8d28a0cb7b43 521 (uint8_t)(LSB(FREQ_IN)), // tSamFreq
screamer 73:8d28a0cb7b43 522 (uint8_t)((FREQ_IN >> 8) & 0xff), // tSamFreq
screamer 73:8d28a0cb7b43 523 (uint8_t)((FREQ_IN >> 16) & 0xff), // tSamFreq
screamer 73:8d28a0cb7b43 524
screamer 73:8d28a0cb7b43 525 // Endpoint - Standard Descriptor
screamer 73:8d28a0cb7b43 526 ENDPOINT_DESCRIPTOR_LENGTH + 2, // bLength
screamer 73:8d28a0cb7b43 527 ENDPOINT_DESCRIPTOR, // bDescriptorType
screamer 73:8d28a0cb7b43 528 PHY_TO_DESC(EPISO_OUT), // bEndpointAddress
screamer 73:8d28a0cb7b43 529 E_ISOCHRONOUS, // bmAttributes
screamer 73:8d28a0cb7b43 530 (uint8_t)(LSB(PACKET_SIZE_ISO_IN)), // wMaxPacketSize
screamer 73:8d28a0cb7b43 531 (uint8_t)(MSB(PACKET_SIZE_ISO_IN)), // wMaxPacketSize
screamer 73:8d28a0cb7b43 532 0x01, // bInterval
screamer 73:8d28a0cb7b43 533 0x00, // bRefresh
screamer 73:8d28a0cb7b43 534 0x00, // bSynchAddress
screamer 73:8d28a0cb7b43 535
screamer 73:8d28a0cb7b43 536 // Endpoint - Audio Streaming
screamer 73:8d28a0cb7b43 537 STREAMING_ENDPOINT_DESCRIPTOR_LENGTH, // bLength
screamer 73:8d28a0cb7b43 538 ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType
screamer 73:8d28a0cb7b43 539 ENDPOINT_GENERAL, // bDescriptor
screamer 73:8d28a0cb7b43 540 0x00, // bmAttributes
screamer 73:8d28a0cb7b43 541 0x00, // bLockDelayUnits
screamer 73:8d28a0cb7b43 542 LSB(0x0000), // wLockDelay
screamer 73:8d28a0cb7b43 543 MSB(0x0000), // wLockDelay
screamer 73:8d28a0cb7b43 544
screamer 73:8d28a0cb7b43 545
screamer 73:8d28a0cb7b43 546
screamer 73:8d28a0cb7b43 547
screamer 73:8d28a0cb7b43 548
screamer 73:8d28a0cb7b43 549
screamer 73:8d28a0cb7b43 550
screamer 73:8d28a0cb7b43 551 // Interface 1, Alternate Setting 0, Audio Streaming - Zero Bandwith
screamer 73:8d28a0cb7b43 552 INTERFACE_DESCRIPTOR_LENGTH, // bLength
screamer 73:8d28a0cb7b43 553 INTERFACE_DESCRIPTOR, // bDescriptorType
screamer 73:8d28a0cb7b43 554 0x02, // bInterfaceNumber
screamer 73:8d28a0cb7b43 555 0x00, // bAlternateSetting
screamer 73:8d28a0cb7b43 556 0x00, // bNumEndpoints
screamer 73:8d28a0cb7b43 557 AUDIO_CLASS, // bInterfaceClass
screamer 73:8d28a0cb7b43 558 SUBCLASS_AUDIOSTREAMING, // bInterfaceSubClass
screamer 73:8d28a0cb7b43 559 0x00, // bInterfaceProtocol
screamer 73:8d28a0cb7b43 560 0x00, // iInterface
screamer 73:8d28a0cb7b43 561
screamer 73:8d28a0cb7b43 562 // Interface 1, Alternate Setting 1, Audio Streaming - Operational
screamer 73:8d28a0cb7b43 563 INTERFACE_DESCRIPTOR_LENGTH, // bLength
screamer 73:8d28a0cb7b43 564 INTERFACE_DESCRIPTOR, // bDescriptorType
screamer 73:8d28a0cb7b43 565 0x02, // bInterfaceNumber
screamer 73:8d28a0cb7b43 566 0x01, // bAlternateSetting
screamer 73:8d28a0cb7b43 567 0x01, // bNumEndpoints
screamer 73:8d28a0cb7b43 568 AUDIO_CLASS, // bInterfaceClass
screamer 73:8d28a0cb7b43 569 SUBCLASS_AUDIOSTREAMING, // bInterfaceSubClass
screamer 73:8d28a0cb7b43 570 0x00, // bInterfaceProtocol
screamer 73:8d28a0cb7b43 571 0x00, // iInterface
screamer 73:8d28a0cb7b43 572
screamer 73:8d28a0cb7b43 573 // Audio Streaming Interface
screamer 73:8d28a0cb7b43 574 STREAMING_INTERFACE_DESCRIPTOR_LENGTH, // bLength
screamer 73:8d28a0cb7b43 575 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
screamer 73:8d28a0cb7b43 576 SUBCLASS_AUDIOCONTROL, // bDescriptorSubtype
screamer 73:8d28a0cb7b43 577 0x05, // bTerminalLink (output terminal microphone)
screamer 73:8d28a0cb7b43 578 0x01, // bDelay
screamer 73:8d28a0cb7b43 579 0x01, // wFormatTag
screamer 73:8d28a0cb7b43 580 0x00, // wFormatTag
screamer 73:8d28a0cb7b43 581
screamer 73:8d28a0cb7b43 582 // Audio Type I Format
screamer 73:8d28a0cb7b43 583 FORMAT_TYPE_I_DESCRIPTOR_LENGTH, // bLength
screamer 73:8d28a0cb7b43 584 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
screamer 73:8d28a0cb7b43 585 SUBCLASS_AUDIOSTREAMING, // bDescriptorSubtype
screamer 73:8d28a0cb7b43 586 FORMAT_TYPE_I, // bFormatType
screamer 73:8d28a0cb7b43 587 channel_nb_out, // bNrChannels
screamer 73:8d28a0cb7b43 588 0x02, // bSubFrameSize
screamer 73:8d28a0cb7b43 589 0x10, // bBitResolution
screamer 73:8d28a0cb7b43 590 0x01, // bSamFreqType
screamer 73:8d28a0cb7b43 591 (uint8_t)(LSB(FREQ_OUT)), // tSamFreq
screamer 73:8d28a0cb7b43 592 (uint8_t)((FREQ_OUT >> 8) & 0xff), // tSamFreq
screamer 73:8d28a0cb7b43 593 (uint8_t)((FREQ_OUT >> 16) & 0xff), // tSamFreq
screamer 73:8d28a0cb7b43 594
screamer 73:8d28a0cb7b43 595 // Endpoint - Standard Descriptor
screamer 73:8d28a0cb7b43 596 ENDPOINT_DESCRIPTOR_LENGTH + 2, // bLength
screamer 73:8d28a0cb7b43 597 ENDPOINT_DESCRIPTOR, // bDescriptorType
screamer 73:8d28a0cb7b43 598 PHY_TO_DESC(EPISO_IN), // bEndpointAddress
screamer 73:8d28a0cb7b43 599 E_ISOCHRONOUS, // bmAttributes
screamer 73:8d28a0cb7b43 600 (uint8_t)(LSB(PACKET_SIZE_ISO_OUT)), // wMaxPacketSize
screamer 73:8d28a0cb7b43 601 (uint8_t)(MSB(PACKET_SIZE_ISO_OUT)), // wMaxPacketSize
screamer 73:8d28a0cb7b43 602 0x01, // bInterval
screamer 73:8d28a0cb7b43 603 0x00, // bRefresh
screamer 73:8d28a0cb7b43 604 0x00, // bSynchAddress
screamer 73:8d28a0cb7b43 605
screamer 73:8d28a0cb7b43 606 // Endpoint - Audio Streaming
screamer 73:8d28a0cb7b43 607 STREAMING_ENDPOINT_DESCRIPTOR_LENGTH, // bLength
screamer 73:8d28a0cb7b43 608 ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType
screamer 73:8d28a0cb7b43 609 ENDPOINT_GENERAL, // bDescriptor
screamer 73:8d28a0cb7b43 610 0x00, // bmAttributes
screamer 73:8d28a0cb7b43 611 0x00, // bLockDelayUnits
screamer 73:8d28a0cb7b43 612 LSB(0x0000), // wLockDelay
screamer 73:8d28a0cb7b43 613 MSB(0x0000), // wLockDelay
screamer 73:8d28a0cb7b43 614
screamer 73:8d28a0cb7b43 615 // Terminator
screamer 73:8d28a0cb7b43 616 0 // bLength
screamer 73:8d28a0cb7b43 617 };
screamer 73:8d28a0cb7b43 618 return configDescriptor;
screamer 73:8d28a0cb7b43 619 }
screamer 73:8d28a0cb7b43 620
screamer 73:8d28a0cb7b43 621 uint8_t * USBAudio::stringIinterfaceDesc() {
screamer 73:8d28a0cb7b43 622 static uint8_t stringIinterfaceDescriptor[] = {
screamer 73:8d28a0cb7b43 623 0x0c, //bLength
screamer 73:8d28a0cb7b43 624 STRING_DESCRIPTOR, //bDescriptorType 0x03
screamer 73:8d28a0cb7b43 625 'A',0,'u',0,'d',0,'i',0,'o',0 //bString iInterface - Audio
screamer 73:8d28a0cb7b43 626 };
screamer 73:8d28a0cb7b43 627 return stringIinterfaceDescriptor;
screamer 73:8d28a0cb7b43 628 }
screamer 73:8d28a0cb7b43 629
screamer 73:8d28a0cb7b43 630 uint8_t * USBAudio::stringIproductDesc() {
screamer 73:8d28a0cb7b43 631 static uint8_t stringIproductDescriptor[] = {
screamer 73:8d28a0cb7b43 632 0x16, //bLength
screamer 73:8d28a0cb7b43 633 STRING_DESCRIPTOR, //bDescriptorType 0x03
screamer 73:8d28a0cb7b43 634 'M',0,'b',0,'e',0,'d',0,' ',0,'A',0,'u',0,'d',0,'i',0,'o',0 //bString iProduct - Mbed Audio
screamer 73:8d28a0cb7b43 635 };
screamer 73:8d28a0cb7b43 636 return stringIproductDescriptor;
screamer 73:8d28a0cb7b43 637 }