RAMDisk example for the USBFileSystem

Dependencies:   mbed USBFileSystem

Fork of USBFileSystem_RAMDISK_HelloWorld by Erik -

Committer:
Sissors
Date:
Tue Jul 30 18:27:18 2013 +0000
Revision:
1:e1b0157ce547
Memory leaks -_-

Who changed what in which revision?

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