Lucas Lim / Mbed 2 deprecated HSP_Temperature_Barometer_CS3237

Dependencies:   mbed

Committer:
lucaslwl
Date:
Mon Aug 26 08:11:41 2019 +0000
Revision:
22:5c07298d3383
add library folder

Who changed what in which revision?

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