ME11B Sample Code in Maxim Integrated Team

Dependencies:   BMI160 max32630hsp3 MemoryLCD USBDevice

Fork of Host_Software_MAX32664GWEB_HR_EXTENDED by Seyhmus Cacina

Committer:
seyhmus.cacina
Date:
Mon Mar 18 10:21:53 2019 +0300
Revision:
0:ac4dea3e2894
ME11B Sample Code First Commit

Who changed what in which revision?

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