Fork of the official USBDevice library

Fork of USBDevice by mbed official

Committer:
screamer
Date:
Fri Apr 28 11:26:51 2017 +0100
Branch:
github-merge
Revision:
73:8d28a0cb7b43
Parent:
47:a0cd9646ecd1
Merge from mbed-os @ github

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 }