Miha Bokan / Mbed 2 deprecated FRDM-KL46Z-LAB2_C

Dependencies:   MMA8451Q USBDevice mbed

Committer:
mdestroyer
Date:
Mon May 12 12:14:48 2014 +0000
Revision:
0:22a7d22635fa
Spremenil ime lab1 v lab2

Who changed what in which revision?

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