ryou sato / Mbed 2 deprecated LPC11U35_CTswitch_relay

Dependencies:   mbed LPC11U35_MCP41HV51-503EST

Committer:
ryousato
Date:
Tue Mar 09 05:40:47 2021 +0000
Revision:
9:0b3a7a9eed3e
Parent:
0:df1e1f84ded8
20210309

Who changed what in which revision?

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