doku newon / DokuUSBDevice

Dependents:   Peach_AudioChannelDividerAndCompensator

Committer:
dokunewon
Date:
Sun Oct 18 08:16:03 2015 +0000
Revision:
61:ff0388dee94f
Parent:
60:68924f211e71
Change a little.

Who changed what in which revision?

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