Slingshot Controller

Dependencies:   ADXL345 DebounceIn USBDevice mbed

Committer:
Brandon
Date:
Sun Oct 14 18:58:38 2012 +0000
Revision:
0:cf17ea89fd09
lab3

Who changed what in which revision?

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