blablabla

Dependencies:   MAG3110 MMA8451Q SLCD- TSI USBDevice mbed

Committer:
Osator
Date:
Wed Apr 16 12:20:00 2014 +0000
Revision:
0:339b7abfa147
blablabla

Who changed what in which revision?

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