library

Dependents:   USB_CDC_MSD_Hello

Committer:
sherckuith
Date:
Fri Aug 24 02:01:51 2012 +0000
Revision:
0:d5bb9a9c3e24
[mbed] converted /USB_CDC_MSD_Hello/USBDevice

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sherckuith 0:d5bb9a9c3e24 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
sherckuith 0:d5bb9a9c3e24 2 *
sherckuith 0:d5bb9a9c3e24 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
sherckuith 0:d5bb9a9c3e24 4 * and associated documentation files (the "Software"), to deal in the Software without
sherckuith 0:d5bb9a9c3e24 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
sherckuith 0:d5bb9a9c3e24 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
sherckuith 0:d5bb9a9c3e24 7 * Software is furnished to do so, subject to the following conditions:
sherckuith 0:d5bb9a9c3e24 8 *
sherckuith 0:d5bb9a9c3e24 9 * The above copyright notice and this permission notice shall be included in all copies or
sherckuith 0:d5bb9a9c3e24 10 * substantial portions of the Software.
sherckuith 0:d5bb9a9c3e24 11 *
sherckuith 0:d5bb9a9c3e24 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
sherckuith 0:d5bb9a9c3e24 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
sherckuith 0:d5bb9a9c3e24 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
sherckuith 0:d5bb9a9c3e24 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
sherckuith 0:d5bb9a9c3e24 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
sherckuith 0:d5bb9a9c3e24 17 */
sherckuith 0:d5bb9a9c3e24 18
sherckuith 0:d5bb9a9c3e24 19 #include "stdint.h"
sherckuith 0:d5bb9a9c3e24 20 #include "USBAudio.h"
sherckuith 0:d5bb9a9c3e24 21 #include "USBBusInterface.h"
sherckuith 0:d5bb9a9c3e24 22 #include "USBAudio_Types.h"
sherckuith 0:d5bb9a9c3e24 23
sherckuith 0:d5bb9a9c3e24 24
sherckuith 0:d5bb9a9c3e24 25
sherckuith 0:d5bb9a9c3e24 26 USBAudio::USBAudio(uint32_t frequency, uint8_t channel_nb, uint16_t vendor_id, uint16_t product_id, uint16_t product_release): USBDevice(vendor_id, product_id, product_release) {
sherckuith 0:d5bb9a9c3e24 27 mute = 0;
sherckuith 0:d5bb9a9c3e24 28 volCur = 0x0080;
sherckuith 0:d5bb9a9c3e24 29 volMin = 0x0000;
sherckuith 0:d5bb9a9c3e24 30 volMax = 0x0100;
sherckuith 0:d5bb9a9c3e24 31 volRes = 0x0004;
sherckuith 0:d5bb9a9c3e24 32 available = false;
sherckuith 0:d5bb9a9c3e24 33
sherckuith 0:d5bb9a9c3e24 34 FREQ = frequency;
sherckuith 0:d5bb9a9c3e24 35
sherckuith 0:d5bb9a9c3e24 36 this->channel_nb = channel_nb;
sherckuith 0:d5bb9a9c3e24 37
sherckuith 0:d5bb9a9c3e24 38 // stereo -> *2, mono -> *1
sherckuith 0:d5bb9a9c3e24 39 PACKET_SIZE_ISO = (FREQ / 500) * channel_nb;
sherckuith 0:d5bb9a9c3e24 40
sherckuith 0:d5bb9a9c3e24 41 // STEREO -> left and right
sherckuith 0:d5bb9a9c3e24 42 channel_config = (channel_nb == 1) ? CHANNEL_M : CHANNEL_L + CHANNEL_R;
sherckuith 0:d5bb9a9c3e24 43
sherckuith 0:d5bb9a9c3e24 44 SOF_handler = false;
sherckuith 0:d5bb9a9c3e24 45
sherckuith 0:d5bb9a9c3e24 46 buf_stream = NULL;
sherckuith 0:d5bb9a9c3e24 47
sherckuith 0:d5bb9a9c3e24 48 // connect the device
sherckuith 0:d5bb9a9c3e24 49 USBDevice::connect();
sherckuith 0:d5bb9a9c3e24 50 }
sherckuith 0:d5bb9a9c3e24 51
sherckuith 0:d5bb9a9c3e24 52 bool USBAudio::read(uint8_t * buf) {
sherckuith 0:d5bb9a9c3e24 53 buf_stream = buf;
sherckuith 0:d5bb9a9c3e24 54 while (!available);
sherckuith 0:d5bb9a9c3e24 55 available = false;
sherckuith 0:d5bb9a9c3e24 56 buf_stream = NULL;
sherckuith 0:d5bb9a9c3e24 57 return true;
sherckuith 0:d5bb9a9c3e24 58 }
sherckuith 0:d5bb9a9c3e24 59
sherckuith 0:d5bb9a9c3e24 60 bool USBAudio::readNB(uint8_t * buf) {
sherckuith 0:d5bb9a9c3e24 61 buf_stream = buf;
sherckuith 0:d5bb9a9c3e24 62 SOF_handler = false;
sherckuith 0:d5bb9a9c3e24 63 while (!SOF_handler);
sherckuith 0:d5bb9a9c3e24 64 if (available) {
sherckuith 0:d5bb9a9c3e24 65 available = false;
sherckuith 0:d5bb9a9c3e24 66 buf_stream = NULL;
sherckuith 0:d5bb9a9c3e24 67 return true;
sherckuith 0:d5bb9a9c3e24 68 }
sherckuith 0:d5bb9a9c3e24 69 buf_stream = NULL;
sherckuith 0:d5bb9a9c3e24 70 return false;
sherckuith 0:d5bb9a9c3e24 71 }
sherckuith 0:d5bb9a9c3e24 72
sherckuith 0:d5bb9a9c3e24 73
sherckuith 0:d5bb9a9c3e24 74 float USBAudio::getVolume() {
sherckuith 0:d5bb9a9c3e24 75 return (mute) ? 0.0 : (float)volCur/(float)volMax;
sherckuith 0:d5bb9a9c3e24 76 }
sherckuith 0:d5bb9a9c3e24 77
sherckuith 0:d5bb9a9c3e24 78
sherckuith 0:d5bb9a9c3e24 79 // Called in ISR context on each start of frame
sherckuith 0:d5bb9a9c3e24 80 void USBAudio::SOF(int frameNumber) {
sherckuith 0:d5bb9a9c3e24 81 uint16_t size = 0;
sherckuith 0:d5bb9a9c3e24 82
sherckuith 0:d5bb9a9c3e24 83 // read the isochronous endpoint
sherckuith 0:d5bb9a9c3e24 84 if (buf_stream != NULL) {
sherckuith 0:d5bb9a9c3e24 85 USBDevice::readEP_NB(EP3OUT, buf_stream, &size, PACKET_SIZE_ISO);
sherckuith 0:d5bb9a9c3e24 86 }
sherckuith 0:d5bb9a9c3e24 87
sherckuith 0:d5bb9a9c3e24 88 // if we read something, modify the flag "available"
sherckuith 0:d5bb9a9c3e24 89 available = (size) ? true : false;
sherckuith 0:d5bb9a9c3e24 90
sherckuith 0:d5bb9a9c3e24 91 // activate readings on the isochronous
sherckuith 0:d5bb9a9c3e24 92 readStart(EP3OUT, PACKET_SIZE_ISO);
sherckuith 0:d5bb9a9c3e24 93
sherckuith 0:d5bb9a9c3e24 94 SOF_handler = true;
sherckuith 0:d5bb9a9c3e24 95 }
sherckuith 0:d5bb9a9c3e24 96
sherckuith 0:d5bb9a9c3e24 97
sherckuith 0:d5bb9a9c3e24 98 // Called in ISR context
sherckuith 0:d5bb9a9c3e24 99 // Set configuration. Return false if the configuration is not supported.
sherckuith 0:d5bb9a9c3e24 100 bool USBAudio::USBCallback_setConfiguration(uint8_t configuration) {
sherckuith 0:d5bb9a9c3e24 101 if (configuration != DEFAULT_CONFIGURATION) {
sherckuith 0:d5bb9a9c3e24 102 return false;
sherckuith 0:d5bb9a9c3e24 103 }
sherckuith 0:d5bb9a9c3e24 104
sherckuith 0:d5bb9a9c3e24 105 // Configure isochronous endpoint
sherckuith 0:d5bb9a9c3e24 106 realiseEndpoint(EP3OUT, PACKET_SIZE_ISO, ISOCHRONOUS);
sherckuith 0:d5bb9a9c3e24 107
sherckuith 0:d5bb9a9c3e24 108 // activate readings on this endpoint
sherckuith 0:d5bb9a9c3e24 109 readStart(EP3OUT, PACKET_SIZE_ISO);
sherckuith 0:d5bb9a9c3e24 110 return true;
sherckuith 0:d5bb9a9c3e24 111 }
sherckuith 0:d5bb9a9c3e24 112
sherckuith 0:d5bb9a9c3e24 113
sherckuith 0:d5bb9a9c3e24 114 // Called in ISR context
sherckuith 0:d5bb9a9c3e24 115 // Set alternate setting. Return false if the alternate setting is not supported
sherckuith 0:d5bb9a9c3e24 116 bool USBAudio::USBCallback_setInterface(uint16_t interface, uint8_t alternate) {
sherckuith 0:d5bb9a9c3e24 117 if (interface == 0 && alternate == 0) {
sherckuith 0:d5bb9a9c3e24 118 return true;
sherckuith 0:d5bb9a9c3e24 119 }
sherckuith 0:d5bb9a9c3e24 120 if (interface == 1 && (alternate == 0 || alternate == 1)) {
sherckuith 0:d5bb9a9c3e24 121 return true;
sherckuith 0:d5bb9a9c3e24 122 }
sherckuith 0:d5bb9a9c3e24 123 return false;
sherckuith 0:d5bb9a9c3e24 124 }
sherckuith 0:d5bb9a9c3e24 125
sherckuith 0:d5bb9a9c3e24 126
sherckuith 0:d5bb9a9c3e24 127
sherckuith 0:d5bb9a9c3e24 128 // Called in ISR context
sherckuith 0:d5bb9a9c3e24 129 // Called by USBDevice on Endpoint0 request
sherckuith 0:d5bb9a9c3e24 130 // This is used to handle extensions to standard requests and class specific requests.
sherckuith 0:d5bb9a9c3e24 131 // Return true if class handles this request
sherckuith 0:d5bb9a9c3e24 132 bool USBAudio::USBCallback_request() {
sherckuith 0:d5bb9a9c3e24 133 bool success = false;
sherckuith 0:d5bb9a9c3e24 134 CONTROL_TRANSFER * transfer = getTransferPtr();
sherckuith 0:d5bb9a9c3e24 135
sherckuith 0:d5bb9a9c3e24 136 // Process class-specific requests
sherckuith 0:d5bb9a9c3e24 137 if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
sherckuith 0:d5bb9a9c3e24 138
sherckuith 0:d5bb9a9c3e24 139 // Feature Unit: Interface = 0, ID = 2
sherckuith 0:d5bb9a9c3e24 140 if (transfer->setup.wIndex == 0x0200) {
sherckuith 0:d5bb9a9c3e24 141
sherckuith 0:d5bb9a9c3e24 142 // Master Channel
sherckuith 0:d5bb9a9c3e24 143 if ((transfer->setup.wValue & 0xff) == 0) {
sherckuith 0:d5bb9a9c3e24 144
sherckuith 0:d5bb9a9c3e24 145 switch (transfer->setup.wValue >> 8) {
sherckuith 0:d5bb9a9c3e24 146 case MUTE_CONTROL:
sherckuith 0:d5bb9a9c3e24 147 switch (transfer->setup.bRequest) {
sherckuith 0:d5bb9a9c3e24 148 case REQUEST_GET_CUR:
sherckuith 0:d5bb9a9c3e24 149 transfer->remaining = 1;
sherckuith 0:d5bb9a9c3e24 150 transfer->ptr = &mute;
sherckuith 0:d5bb9a9c3e24 151 transfer->direction = DEVICE_TO_HOST;
sherckuith 0:d5bb9a9c3e24 152 success = true;
sherckuith 0:d5bb9a9c3e24 153 break;
sherckuith 0:d5bb9a9c3e24 154
sherckuith 0:d5bb9a9c3e24 155 case REQUEST_SET_CUR:
sherckuith 0:d5bb9a9c3e24 156 transfer->remaining = 1;
sherckuith 0:d5bb9a9c3e24 157 transfer->notify = true;
sherckuith 0:d5bb9a9c3e24 158 transfer->direction = HOST_TO_DEVICE;
sherckuith 0:d5bb9a9c3e24 159 success = true;
sherckuith 0:d5bb9a9c3e24 160 break;
sherckuith 0:d5bb9a9c3e24 161 default:
sherckuith 0:d5bb9a9c3e24 162 break;
sherckuith 0:d5bb9a9c3e24 163 }
sherckuith 0:d5bb9a9c3e24 164 break;
sherckuith 0:d5bb9a9c3e24 165 case VOLUME_CONTROL:
sherckuith 0:d5bb9a9c3e24 166 switch (transfer->setup.bRequest) {
sherckuith 0:d5bb9a9c3e24 167 case REQUEST_GET_CUR:
sherckuith 0:d5bb9a9c3e24 168 transfer->remaining = 2;
sherckuith 0:d5bb9a9c3e24 169 transfer->ptr = (uint8_t *)&volCur;
sherckuith 0:d5bb9a9c3e24 170 transfer->direction = DEVICE_TO_HOST;
sherckuith 0:d5bb9a9c3e24 171 success = true;
sherckuith 0:d5bb9a9c3e24 172 break;
sherckuith 0:d5bb9a9c3e24 173 case REQUEST_GET_MIN:
sherckuith 0:d5bb9a9c3e24 174 transfer->remaining = 2;
sherckuith 0:d5bb9a9c3e24 175 transfer->ptr = (uint8_t *)&volMin;
sherckuith 0:d5bb9a9c3e24 176 transfer->direction = DEVICE_TO_HOST;
sherckuith 0:d5bb9a9c3e24 177 success = true;
sherckuith 0:d5bb9a9c3e24 178 break;
sherckuith 0:d5bb9a9c3e24 179 case REQUEST_GET_MAX:
sherckuith 0:d5bb9a9c3e24 180 transfer->remaining = 2;
sherckuith 0:d5bb9a9c3e24 181 transfer->ptr = (uint8_t *)&volMax;
sherckuith 0:d5bb9a9c3e24 182 transfer->direction = DEVICE_TO_HOST;
sherckuith 0:d5bb9a9c3e24 183 success = true;
sherckuith 0:d5bb9a9c3e24 184 break;
sherckuith 0:d5bb9a9c3e24 185 case REQUEST_GET_RES:
sherckuith 0:d5bb9a9c3e24 186 transfer->remaining = 2;
sherckuith 0:d5bb9a9c3e24 187 transfer->ptr = (uint8_t *)&volRes;
sherckuith 0:d5bb9a9c3e24 188 transfer->direction = DEVICE_TO_HOST;
sherckuith 0:d5bb9a9c3e24 189 success = true;
sherckuith 0:d5bb9a9c3e24 190 break;
sherckuith 0:d5bb9a9c3e24 191
sherckuith 0:d5bb9a9c3e24 192 case REQUEST_SET_CUR:
sherckuith 0:d5bb9a9c3e24 193 transfer->remaining = 2;
sherckuith 0:d5bb9a9c3e24 194 transfer->notify = true;
sherckuith 0:d5bb9a9c3e24 195 transfer->direction = HOST_TO_DEVICE;
sherckuith 0:d5bb9a9c3e24 196 success = true;
sherckuith 0:d5bb9a9c3e24 197 break;
sherckuith 0:d5bb9a9c3e24 198 case REQUEST_SET_MIN:
sherckuith 0:d5bb9a9c3e24 199 transfer->remaining = 2;
sherckuith 0:d5bb9a9c3e24 200 transfer->notify = true;
sherckuith 0:d5bb9a9c3e24 201 transfer->direction = HOST_TO_DEVICE;
sherckuith 0:d5bb9a9c3e24 202 success = true;
sherckuith 0:d5bb9a9c3e24 203 break;
sherckuith 0:d5bb9a9c3e24 204 case REQUEST_SET_MAX:
sherckuith 0:d5bb9a9c3e24 205 transfer->remaining = 2;
sherckuith 0:d5bb9a9c3e24 206 transfer->notify = true;
sherckuith 0:d5bb9a9c3e24 207 transfer->direction = HOST_TO_DEVICE;
sherckuith 0:d5bb9a9c3e24 208 success = true;
sherckuith 0:d5bb9a9c3e24 209 break;
sherckuith 0:d5bb9a9c3e24 210 case REQUEST_SET_RES:
sherckuith 0:d5bb9a9c3e24 211 transfer->remaining = 2;
sherckuith 0:d5bb9a9c3e24 212 transfer->notify = true;
sherckuith 0:d5bb9a9c3e24 213 transfer->direction = HOST_TO_DEVICE;
sherckuith 0:d5bb9a9c3e24 214 success = true;
sherckuith 0:d5bb9a9c3e24 215 break;
sherckuith 0:d5bb9a9c3e24 216 }
sherckuith 0:d5bb9a9c3e24 217 break;
sherckuith 0:d5bb9a9c3e24 218 default:
sherckuith 0:d5bb9a9c3e24 219 break;
sherckuith 0:d5bb9a9c3e24 220 }
sherckuith 0:d5bb9a9c3e24 221 }
sherckuith 0:d5bb9a9c3e24 222 }
sherckuith 0:d5bb9a9c3e24 223 }
sherckuith 0:d5bb9a9c3e24 224 return success;
sherckuith 0:d5bb9a9c3e24 225 }
sherckuith 0:d5bb9a9c3e24 226
sherckuith 0:d5bb9a9c3e24 227
sherckuith 0:d5bb9a9c3e24 228 // Called in ISR context when a data OUT stage has been performed
sherckuith 0:d5bb9a9c3e24 229 void USBAudio::USBCallback_requestCompleted(uint8_t * buf, uint16_t length) {
sherckuith 0:d5bb9a9c3e24 230 uint16_t data = *((uint16_t *)buf);
sherckuith 0:d5bb9a9c3e24 231 CONTROL_TRANSFER * transfer = getTransferPtr();
sherckuith 0:d5bb9a9c3e24 232 switch (transfer->setup.wValue >> 8) {
sherckuith 0:d5bb9a9c3e24 233 case MUTE_CONTROL:
sherckuith 0:d5bb9a9c3e24 234 switch (transfer->setup.bRequest) {
sherckuith 0:d5bb9a9c3e24 235 case REQUEST_SET_CUR:
sherckuith 0:d5bb9a9c3e24 236 mute = data & 0xff;
sherckuith 0:d5bb9a9c3e24 237 updateVol.call();
sherckuith 0:d5bb9a9c3e24 238 break;
sherckuith 0:d5bb9a9c3e24 239 default:
sherckuith 0:d5bb9a9c3e24 240 break;
sherckuith 0:d5bb9a9c3e24 241 }
sherckuith 0:d5bb9a9c3e24 242 break;
sherckuith 0:d5bb9a9c3e24 243 case VOLUME_CONTROL:
sherckuith 0:d5bb9a9c3e24 244 switch (transfer->setup.bRequest) {
sherckuith 0:d5bb9a9c3e24 245 case REQUEST_SET_CUR:
sherckuith 0:d5bb9a9c3e24 246 volCur = data;
sherckuith 0:d5bb9a9c3e24 247 updateVol.call();
sherckuith 0:d5bb9a9c3e24 248 break;
sherckuith 0:d5bb9a9c3e24 249 default:
sherckuith 0:d5bb9a9c3e24 250 break;
sherckuith 0:d5bb9a9c3e24 251 }
sherckuith 0:d5bb9a9c3e24 252 break;
sherckuith 0:d5bb9a9c3e24 253 default:
sherckuith 0:d5bb9a9c3e24 254 break;
sherckuith 0:d5bb9a9c3e24 255 }
sherckuith 0:d5bb9a9c3e24 256 }
sherckuith 0:d5bb9a9c3e24 257
sherckuith 0:d5bb9a9c3e24 258
sherckuith 0:d5bb9a9c3e24 259
sherckuith 0:d5bb9a9c3e24 260 #define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \
sherckuith 0:d5bb9a9c3e24 261 + (3 * INTERFACE_DESCRIPTOR_LENGTH) \
sherckuith 0:d5bb9a9c3e24 262 + (1 * CONTROL_INTERFACE_DESCRIPTOR_LENGTH) \
sherckuith 0:d5bb9a9c3e24 263 + (1 * INPUT_TERMINAL_DESCRIPTOR_LENGTH) \
sherckuith 0:d5bb9a9c3e24 264 + (1 * FEATURE_UNIT_DESCRIPTOR_LENGTH) \
sherckuith 0:d5bb9a9c3e24 265 + (1 * OUTPUT_TERMINAL_DESCRIPTOR_LENGTH) \
sherckuith 0:d5bb9a9c3e24 266 + (1 * STREAMING_INTERFACE_DESCRIPTOR_LENGTH) \
sherckuith 0:d5bb9a9c3e24 267 + (1 * FORMAT_TYPE_I_DESCRIPTOR_LENGTH) \
sherckuith 0:d5bb9a9c3e24 268 + (1 * (ENDPOINT_DESCRIPTOR_LENGTH + 2)) \
sherckuith 0:d5bb9a9c3e24 269 + (1 * STREAMING_ENDPOINT_DESCRIPTOR_LENGTH) )
sherckuith 0:d5bb9a9c3e24 270
sherckuith 0:d5bb9a9c3e24 271 #define TOTAL_CONTROL_INTF_LENGTH (CONTROL_INTERFACE_DESCRIPTOR_LENGTH + \
sherckuith 0:d5bb9a9c3e24 272 INPUT_TERMINAL_DESCRIPTOR_LENGTH + \
sherckuith 0:d5bb9a9c3e24 273 FEATURE_UNIT_DESCRIPTOR_LENGTH + \
sherckuith 0:d5bb9a9c3e24 274 OUTPUT_TERMINAL_DESCRIPTOR_LENGTH)
sherckuith 0:d5bb9a9c3e24 275
sherckuith 0:d5bb9a9c3e24 276 uint8_t * USBAudio::configurationDesc() {
sherckuith 0:d5bb9a9c3e24 277 static uint8_t configDescriptor[] = {
sherckuith 0:d5bb9a9c3e24 278 // Configuration 1
sherckuith 0:d5bb9a9c3e24 279 CONFIGURATION_DESCRIPTOR_LENGTH, // bLength
sherckuith 0:d5bb9a9c3e24 280 CONFIGURATION_DESCRIPTOR, // bDescriptorType
sherckuith 0:d5bb9a9c3e24 281 LSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (LSB)
sherckuith 0:d5bb9a9c3e24 282 MSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (MSB)
sherckuith 0:d5bb9a9c3e24 283 0x02, // bNumInterfaces
sherckuith 0:d5bb9a9c3e24 284 DEFAULT_CONFIGURATION, // bConfigurationValue
sherckuith 0:d5bb9a9c3e24 285 0x00, // iConfiguration
sherckuith 0:d5bb9a9c3e24 286 0x80, // bmAttributes
sherckuith 0:d5bb9a9c3e24 287 50, // bMaxPower
sherckuith 0:d5bb9a9c3e24 288
sherckuith 0:d5bb9a9c3e24 289 // Interface 0, Alternate Setting 0, Audio Control
sherckuith 0:d5bb9a9c3e24 290 INTERFACE_DESCRIPTOR_LENGTH, // bLength
sherckuith 0:d5bb9a9c3e24 291 INTERFACE_DESCRIPTOR, // bDescriptorType
sherckuith 0:d5bb9a9c3e24 292 0x00, // bInterfaceNumber
sherckuith 0:d5bb9a9c3e24 293 0x00, // bAlternateSetting
sherckuith 0:d5bb9a9c3e24 294 0x00, // bNumEndpoints
sherckuith 0:d5bb9a9c3e24 295 AUDIO_CLASS, // bInterfaceClass
sherckuith 0:d5bb9a9c3e24 296 SUBCLASS_AUDIOCONTROL, // bInterfaceSubClass
sherckuith 0:d5bb9a9c3e24 297 0x00, // bInterfaceProtocol
sherckuith 0:d5bb9a9c3e24 298 0x00, // iInterface
sherckuith 0:d5bb9a9c3e24 299
sherckuith 0:d5bb9a9c3e24 300
sherckuith 0:d5bb9a9c3e24 301 // Audio Control Interface
sherckuith 0:d5bb9a9c3e24 302 CONTROL_INTERFACE_DESCRIPTOR_LENGTH, // bLength
sherckuith 0:d5bb9a9c3e24 303 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
sherckuith 0:d5bb9a9c3e24 304 CONTROL_HEADER, // bDescriptorSubtype
sherckuith 0:d5bb9a9c3e24 305 LSB(0x0100), // bcdADC (LSB)
sherckuith 0:d5bb9a9c3e24 306 MSB(0x0100), // bcdADC (MSB)
sherckuith 0:d5bb9a9c3e24 307 LSB(TOTAL_CONTROL_INTF_LENGTH), // wTotalLength
sherckuith 0:d5bb9a9c3e24 308 MSB(TOTAL_CONTROL_INTF_LENGTH), // wTotalLength
sherckuith 0:d5bb9a9c3e24 309 0x01, // bInCollection
sherckuith 0:d5bb9a9c3e24 310 0x01, // baInterfaceNr
sherckuith 0:d5bb9a9c3e24 311
sherckuith 0:d5bb9a9c3e24 312 // Audio Input Terminal
sherckuith 0:d5bb9a9c3e24 313 INPUT_TERMINAL_DESCRIPTOR_LENGTH, // bLength
sherckuith 0:d5bb9a9c3e24 314 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
sherckuith 0:d5bb9a9c3e24 315 CONTROL_INPUT_TERMINAL, // bDescriptorSubtype
sherckuith 0:d5bb9a9c3e24 316 0x01, // bTerminalID
sherckuith 0:d5bb9a9c3e24 317 LSB(TERMINAL_USB_STREAMING), // wTerminalType
sherckuith 0:d5bb9a9c3e24 318 MSB(TERMINAL_USB_STREAMING), // wTerminalType
sherckuith 0:d5bb9a9c3e24 319 0x00, // bAssocTerminal
sherckuith 0:d5bb9a9c3e24 320 channel_nb, // bNrChannels
sherckuith 0:d5bb9a9c3e24 321 LSB(channel_config), // wChannelConfig
sherckuith 0:d5bb9a9c3e24 322 MSB(channel_config), // wChannelConfig
sherckuith 0:d5bb9a9c3e24 323 0x00, // iChannelNames
sherckuith 0:d5bb9a9c3e24 324 0x00, // iTerminal
sherckuith 0:d5bb9a9c3e24 325
sherckuith 0:d5bb9a9c3e24 326 // Audio Feature Unit
sherckuith 0:d5bb9a9c3e24 327 FEATURE_UNIT_DESCRIPTOR_LENGTH, // bLength
sherckuith 0:d5bb9a9c3e24 328 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
sherckuith 0:d5bb9a9c3e24 329 CONTROL_FEATURE_UNIT, // bDescriptorSubtype
sherckuith 0:d5bb9a9c3e24 330 0x02, // bUnitID
sherckuith 0:d5bb9a9c3e24 331 0x01, // bSourceID
sherckuith 0:d5bb9a9c3e24 332 0x01, // bControlSize
sherckuith 0:d5bb9a9c3e24 333 CONTROL_MUTE |
sherckuith 0:d5bb9a9c3e24 334 CONTROL_VOLUME, // bmaControls(0)
sherckuith 0:d5bb9a9c3e24 335 0x00, // bmaControls(1)
sherckuith 0:d5bb9a9c3e24 336 0x00, // iTerminal
sherckuith 0:d5bb9a9c3e24 337
sherckuith 0:d5bb9a9c3e24 338 // Audio Output Terminal
sherckuith 0:d5bb9a9c3e24 339 OUTPUT_TERMINAL_DESCRIPTOR_LENGTH, // bLength
sherckuith 0:d5bb9a9c3e24 340 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
sherckuith 0:d5bb9a9c3e24 341 CONTROL_OUTPUT_TERMINAL, // bDescriptorSubtype
sherckuith 0:d5bb9a9c3e24 342 0x03, // bTerminalID
sherckuith 0:d5bb9a9c3e24 343 LSB(TERMINAL_SPEAKER), // wTerminalType
sherckuith 0:d5bb9a9c3e24 344 MSB(TERMINAL_SPEAKER), // wTerminalType
sherckuith 0:d5bb9a9c3e24 345 0x00, // bAssocTerminal
sherckuith 0:d5bb9a9c3e24 346 0x02, // bSourceID
sherckuith 0:d5bb9a9c3e24 347 0x00, // iTerminal
sherckuith 0:d5bb9a9c3e24 348
sherckuith 0:d5bb9a9c3e24 349
sherckuith 0:d5bb9a9c3e24 350 // Interface 1, Alternate Setting 0, Audio Streaming - Zero Bandwith
sherckuith 0:d5bb9a9c3e24 351 INTERFACE_DESCRIPTOR_LENGTH, // bLength
sherckuith 0:d5bb9a9c3e24 352 INTERFACE_DESCRIPTOR, // bDescriptorType
sherckuith 0:d5bb9a9c3e24 353 0x01, // bInterfaceNumber
sherckuith 0:d5bb9a9c3e24 354 0x00, // bAlternateSetting
sherckuith 0:d5bb9a9c3e24 355 0x00, // bNumEndpoints
sherckuith 0:d5bb9a9c3e24 356 AUDIO_CLASS, // bInterfaceClass
sherckuith 0:d5bb9a9c3e24 357 SUBCLASS_AUDIOSTREAMING, // bInterfaceSubClass
sherckuith 0:d5bb9a9c3e24 358 0x00, // bInterfaceProtocol
sherckuith 0:d5bb9a9c3e24 359 0x00, // iInterface
sherckuith 0:d5bb9a9c3e24 360
sherckuith 0:d5bb9a9c3e24 361 // Interface 1, Alternate Setting 1, Audio Streaming - Operational
sherckuith 0:d5bb9a9c3e24 362 INTERFACE_DESCRIPTOR_LENGTH, // bLength
sherckuith 0:d5bb9a9c3e24 363 INTERFACE_DESCRIPTOR, // bDescriptorType
sherckuith 0:d5bb9a9c3e24 364 0x01, // bInterfaceNumber
sherckuith 0:d5bb9a9c3e24 365 0x01, // bAlternateSetting
sherckuith 0:d5bb9a9c3e24 366 0x01, // bNumEndpoints
sherckuith 0:d5bb9a9c3e24 367 AUDIO_CLASS, // bInterfaceClass
sherckuith 0:d5bb9a9c3e24 368 SUBCLASS_AUDIOSTREAMING, // bInterfaceSubClass
sherckuith 0:d5bb9a9c3e24 369 0x00, // bInterfaceProtocol
sherckuith 0:d5bb9a9c3e24 370 0x00, // iInterface
sherckuith 0:d5bb9a9c3e24 371
sherckuith 0:d5bb9a9c3e24 372 // Audio Streaming Interface
sherckuith 0:d5bb9a9c3e24 373 STREAMING_INTERFACE_DESCRIPTOR_LENGTH, // bLength
sherckuith 0:d5bb9a9c3e24 374 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
sherckuith 0:d5bb9a9c3e24 375 STREAMING_GENERAL, // bDescriptorSubtype
sherckuith 0:d5bb9a9c3e24 376 0x01, // bTerminalLink
sherckuith 0:d5bb9a9c3e24 377 0x00, // bDelay
sherckuith 0:d5bb9a9c3e24 378 LSB(FORMAT_PCM), // wFormatTag
sherckuith 0:d5bb9a9c3e24 379 MSB(FORMAT_PCM), // wFormatTag
sherckuith 0:d5bb9a9c3e24 380
sherckuith 0:d5bb9a9c3e24 381 // Audio Type I Format
sherckuith 0:d5bb9a9c3e24 382 FORMAT_TYPE_I_DESCRIPTOR_LENGTH, // bLength
sherckuith 0:d5bb9a9c3e24 383 INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType
sherckuith 0:d5bb9a9c3e24 384 STREAMING_FORMAT_TYPE, // bDescriptorSubtype
sherckuith 0:d5bb9a9c3e24 385 FORMAT_TYPE_I, // bFormatType
sherckuith 0:d5bb9a9c3e24 386 channel_nb, // bNrChannels
sherckuith 0:d5bb9a9c3e24 387 0x02, // bSubFrameSize
sherckuith 0:d5bb9a9c3e24 388 16, // bBitResolution
sherckuith 0:d5bb9a9c3e24 389 0x01, // bSamFreqType
sherckuith 0:d5bb9a9c3e24 390 LSB(FREQ), // tSamFreq
sherckuith 0:d5bb9a9c3e24 391 (FREQ >> 8) & 0xff, // tSamFreq
sherckuith 0:d5bb9a9c3e24 392 (FREQ >> 16) & 0xff, // tSamFreq
sherckuith 0:d5bb9a9c3e24 393
sherckuith 0:d5bb9a9c3e24 394 // Endpoint - Standard Descriptor
sherckuith 0:d5bb9a9c3e24 395 ENDPOINT_DESCRIPTOR_LENGTH + 2, // bLength
sherckuith 0:d5bb9a9c3e24 396 ENDPOINT_DESCRIPTOR, // bDescriptorType
sherckuith 0:d5bb9a9c3e24 397 PHY_TO_DESC(EPISO_OUT), // bEndpointAddress
sherckuith 0:d5bb9a9c3e24 398 E_ISOCHRONOUS, // bmAttributes
sherckuith 0:d5bb9a9c3e24 399 LSB(PACKET_SIZE_ISO), // wMaxPacketSize
sherckuith 0:d5bb9a9c3e24 400 MSB(PACKET_SIZE_ISO), // wMaxPacketSize
sherckuith 0:d5bb9a9c3e24 401 0x01, // bInterval
sherckuith 0:d5bb9a9c3e24 402 0x00, // bRefresh
sherckuith 0:d5bb9a9c3e24 403 0x00, // bSynchAddress
sherckuith 0:d5bb9a9c3e24 404
sherckuith 0:d5bb9a9c3e24 405 // Endpoint - Audio Streaming
sherckuith 0:d5bb9a9c3e24 406 STREAMING_ENDPOINT_DESCRIPTOR_LENGTH, // bLength
sherckuith 0:d5bb9a9c3e24 407 ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType
sherckuith 0:d5bb9a9c3e24 408 ENDPOINT_GENERAL, // bDescriptor
sherckuith 0:d5bb9a9c3e24 409 0x00, // bmAttributes
sherckuith 0:d5bb9a9c3e24 410 0x00, // bLockDelayUnits
sherckuith 0:d5bb9a9c3e24 411 LSB(0x0000), // wLockDelay
sherckuith 0:d5bb9a9c3e24 412 MSB(0x0000), // wLockDelay
sherckuith 0:d5bb9a9c3e24 413
sherckuith 0:d5bb9a9c3e24 414 // Terminator
sherckuith 0:d5bb9a9c3e24 415 0 // bLength
sherckuith 0:d5bb9a9c3e24 416 };
sherckuith 0:d5bb9a9c3e24 417 return configDescriptor;
sherckuith 0:d5bb9a9c3e24 418 }
sherckuith 0:d5bb9a9c3e24 419
sherckuith 0:d5bb9a9c3e24 420 uint8_t * USBAudio::stringIinterfaceDesc() {
sherckuith 0:d5bb9a9c3e24 421 static uint8_t stringIinterfaceDescriptor[] = {
sherckuith 0:d5bb9a9c3e24 422 0x0c, //bLength
sherckuith 0:d5bb9a9c3e24 423 STRING_DESCRIPTOR, //bDescriptorType 0x03
sherckuith 0:d5bb9a9c3e24 424 'A',0,'u',0,'d',0,'i',0,'o',0 //bString iInterface - Audio
sherckuith 0:d5bb9a9c3e24 425 };
sherckuith 0:d5bb9a9c3e24 426 return stringIinterfaceDescriptor;
sherckuith 0:d5bb9a9c3e24 427 }
sherckuith 0:d5bb9a9c3e24 428
sherckuith 0:d5bb9a9c3e24 429 uint8_t * USBAudio::stringIproductDesc() {
sherckuith 0:d5bb9a9c3e24 430 static uint8_t stringIproductDescriptor[] = {
sherckuith 0:d5bb9a9c3e24 431 0x16, //bLength
sherckuith 0:d5bb9a9c3e24 432 STRING_DESCRIPTOR, //bDescriptorType 0x03
sherckuith 0:d5bb9a9c3e24 433 'M',0,'b',0,'e',0,'d',0,' ',0,'A',0,'u',0,'d',0,'i',0,'o',0 //bString iProduct - Mbed Audio
sherckuith 0:d5bb9a9c3e24 434 };
sherckuith 0:d5bb9a9c3e24 435 return stringIproductDescriptor;
sherckuith 0:d5bb9a9c3e24 436 }