The preloaded firmware shipped on the mBot.

Dependencies:   mbed

Please use the version of this project/repo found at: http://developer.mbed.org/teams/Outrageous-Circuits/code/Official_mBot/

Committer:
jeffknaggs
Date:
Tue Nov 25 14:49:40 2014 +0000
Revision:
1:ffd9a51e7d35
Parent:
0:865d42c46692
Initial commit.

Who changed what in which revision?

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