BA / SerialCom

Fork of OmniWheels by Gustav Atmel

Committer:
gustavatmel
Date:
Tue May 01 15:47:08 2018 +0000
Revision:
1:9c5af431a1f1
sdf

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gustavatmel 1:9c5af431a1f1 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
gustavatmel 1:9c5af431a1f1 2 *
gustavatmel 1:9c5af431a1f1 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
gustavatmel 1:9c5af431a1f1 4 * and associated documentation files (the "Software"), to deal in the Software without
gustavatmel 1:9c5af431a1f1 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
gustavatmel 1:9c5af431a1f1 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
gustavatmel 1:9c5af431a1f1 7 * Software is furnished to do so, subject to the following conditions:
gustavatmel 1:9c5af431a1f1 8 *
gustavatmel 1:9c5af431a1f1 9 * The above copyright notice and this permission notice shall be included in all copies or
gustavatmel 1:9c5af431a1f1 10 * substantial portions of the Software.
gustavatmel 1:9c5af431a1f1 11 *
gustavatmel 1:9c5af431a1f1 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
gustavatmel 1:9c5af431a1f1 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
gustavatmel 1:9c5af431a1f1 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
gustavatmel 1:9c5af431a1f1 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
gustavatmel 1:9c5af431a1f1 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
gustavatmel 1:9c5af431a1f1 17 */
gustavatmel 1:9c5af431a1f1 18
gustavatmel 1:9c5af431a1f1 19 #include "stdint.h"
gustavatmel 1:9c5af431a1f1 20 #include "USBCDC.h"
gustavatmel 1:9c5af431a1f1 21
gustavatmel 1:9c5af431a1f1 22 static uint8_t cdc_line_coding[7]= {0x80, 0x25, 0x00, 0x00, 0x00, 0x00, 0x08};
gustavatmel 1:9c5af431a1f1 23
gustavatmel 1:9c5af431a1f1 24 #define DEFAULT_CONFIGURATION (1)
gustavatmel 1:9c5af431a1f1 25
gustavatmel 1:9c5af431a1f1 26 #define CDC_SET_LINE_CODING 0x20
gustavatmel 1:9c5af431a1f1 27 #define CDC_GET_LINE_CODING 0x21
gustavatmel 1:9c5af431a1f1 28 #define CDC_SET_CONTROL_LINE_STATE 0x22
gustavatmel 1:9c5af431a1f1 29
gustavatmel 1:9c5af431a1f1 30 // Control Line State bits
gustavatmel 1:9c5af431a1f1 31 #define CLS_DTR (1 << 0)
gustavatmel 1:9c5af431a1f1 32 #define CLS_RTS (1 << 1)
gustavatmel 1:9c5af431a1f1 33
gustavatmel 1:9c5af431a1f1 34 #define MAX_CDC_REPORT_SIZE MAX_PACKET_SIZE_EPBULK
gustavatmel 1:9c5af431a1f1 35
gustavatmel 1:9c5af431a1f1 36 USBCDC::USBCDC(uint16_t vendor_id, uint16_t product_id, uint16_t product_release, bool connect_blocking): USBDevice(vendor_id, product_id, product_release) {
gustavatmel 1:9c5af431a1f1 37 terminal_connected = false;
gustavatmel 1:9c5af431a1f1 38 USBDevice::connect(connect_blocking);
gustavatmel 1:9c5af431a1f1 39 }
gustavatmel 1:9c5af431a1f1 40
gustavatmel 1:9c5af431a1f1 41 void USBCDC::USBCallback_busReset(void) {
gustavatmel 1:9c5af431a1f1 42 terminal_connected = false;
gustavatmel 1:9c5af431a1f1 43 };
gustavatmel 1:9c5af431a1f1 44
gustavatmel 1:9c5af431a1f1 45 bool USBCDC::USBCallback_request(void) {
gustavatmel 1:9c5af431a1f1 46 /* Called in ISR context */
gustavatmel 1:9c5af431a1f1 47
gustavatmel 1:9c5af431a1f1 48 bool success = false;
gustavatmel 1:9c5af431a1f1 49 CONTROL_TRANSFER * transfer = getTransferPtr();
gustavatmel 1:9c5af431a1f1 50
gustavatmel 1:9c5af431a1f1 51 /* Process class-specific requests */
gustavatmel 1:9c5af431a1f1 52
gustavatmel 1:9c5af431a1f1 53 if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
gustavatmel 1:9c5af431a1f1 54 switch (transfer->setup.bRequest) {
gustavatmel 1:9c5af431a1f1 55 case CDC_GET_LINE_CODING:
gustavatmel 1:9c5af431a1f1 56 transfer->remaining = 7;
gustavatmel 1:9c5af431a1f1 57 transfer->ptr = cdc_line_coding;
gustavatmel 1:9c5af431a1f1 58 transfer->direction = DEVICE_TO_HOST;
gustavatmel 1:9c5af431a1f1 59 success = true;
gustavatmel 1:9c5af431a1f1 60 break;
gustavatmel 1:9c5af431a1f1 61 case CDC_SET_LINE_CODING:
gustavatmel 1:9c5af431a1f1 62 transfer->remaining = 7;
gustavatmel 1:9c5af431a1f1 63 transfer->notify = true;
gustavatmel 1:9c5af431a1f1 64 success = true;
gustavatmel 1:9c5af431a1f1 65 break;
gustavatmel 1:9c5af431a1f1 66 case CDC_SET_CONTROL_LINE_STATE:
gustavatmel 1:9c5af431a1f1 67 if (transfer->setup.wValue & CLS_DTR) {
gustavatmel 1:9c5af431a1f1 68 terminal_connected = true;
gustavatmel 1:9c5af431a1f1 69 } else {
gustavatmel 1:9c5af431a1f1 70 terminal_connected = false;
gustavatmel 1:9c5af431a1f1 71 }
gustavatmel 1:9c5af431a1f1 72 success = true;
gustavatmel 1:9c5af431a1f1 73 break;
gustavatmel 1:9c5af431a1f1 74 default:
gustavatmel 1:9c5af431a1f1 75 break;
gustavatmel 1:9c5af431a1f1 76 }
gustavatmel 1:9c5af431a1f1 77 }
gustavatmel 1:9c5af431a1f1 78
gustavatmel 1:9c5af431a1f1 79 return success;
gustavatmel 1:9c5af431a1f1 80 }
gustavatmel 1:9c5af431a1f1 81
gustavatmel 1:9c5af431a1f1 82 void USBCDC::USBCallback_requestCompleted(uint8_t *buf, uint32_t length) {
gustavatmel 1:9c5af431a1f1 83 // Request of setting line coding has 7 bytes
gustavatmel 1:9c5af431a1f1 84 if (length != 7) {
gustavatmel 1:9c5af431a1f1 85 return;
gustavatmel 1:9c5af431a1f1 86 }
gustavatmel 1:9c5af431a1f1 87
gustavatmel 1:9c5af431a1f1 88 CONTROL_TRANSFER * transfer = getTransferPtr();
gustavatmel 1:9c5af431a1f1 89
gustavatmel 1:9c5af431a1f1 90 /* Process class-specific requests */
gustavatmel 1:9c5af431a1f1 91 if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
gustavatmel 1:9c5af431a1f1 92 if (transfer->setup.bRequest == CDC_SET_LINE_CODING) {
gustavatmel 1:9c5af431a1f1 93 if (memcmp(cdc_line_coding, buf, 7)) {
gustavatmel 1:9c5af431a1f1 94 memcpy(cdc_line_coding, buf, 7);
gustavatmel 1:9c5af431a1f1 95
gustavatmel 1:9c5af431a1f1 96 int baud = buf[0] + (buf[1] << 8)
gustavatmel 1:9c5af431a1f1 97 + (buf[2] << 16) + (buf[3] << 24);
gustavatmel 1:9c5af431a1f1 98 int stop = buf[4];
gustavatmel 1:9c5af431a1f1 99 int bits = buf[6];
gustavatmel 1:9c5af431a1f1 100 int parity = buf[5];
gustavatmel 1:9c5af431a1f1 101
gustavatmel 1:9c5af431a1f1 102 lineCodingChanged(baud, bits, parity, stop);
gustavatmel 1:9c5af431a1f1 103 }
gustavatmel 1:9c5af431a1f1 104 }
gustavatmel 1:9c5af431a1f1 105 }
gustavatmel 1:9c5af431a1f1 106 }
gustavatmel 1:9c5af431a1f1 107
gustavatmel 1:9c5af431a1f1 108 // Called in ISR context
gustavatmel 1:9c5af431a1f1 109 // Set configuration. Return false if the
gustavatmel 1:9c5af431a1f1 110 // configuration is not supported.
gustavatmel 1:9c5af431a1f1 111 bool USBCDC::USBCallback_setConfiguration(uint8_t configuration) {
gustavatmel 1:9c5af431a1f1 112 if (configuration != DEFAULT_CONFIGURATION) {
gustavatmel 1:9c5af431a1f1 113 return false;
gustavatmel 1:9c5af431a1f1 114 }
gustavatmel 1:9c5af431a1f1 115
gustavatmel 1:9c5af431a1f1 116 // Configure endpoints > 0
gustavatmel 1:9c5af431a1f1 117 addEndpoint(EPINT_IN, MAX_PACKET_SIZE_EPINT);
gustavatmel 1:9c5af431a1f1 118 addEndpoint(EPBULK_IN, MAX_PACKET_SIZE_EPBULK);
gustavatmel 1:9c5af431a1f1 119 addEndpoint(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
gustavatmel 1:9c5af431a1f1 120
gustavatmel 1:9c5af431a1f1 121 // We activate the endpoint to be able to recceive data
gustavatmel 1:9c5af431a1f1 122 readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
gustavatmel 1:9c5af431a1f1 123 return true;
gustavatmel 1:9c5af431a1f1 124 }
gustavatmel 1:9c5af431a1f1 125
gustavatmel 1:9c5af431a1f1 126 bool USBCDC::send(uint8_t * buffer, uint32_t size) {
gustavatmel 1:9c5af431a1f1 127 return USBDevice::write(EPBULK_IN, buffer, size, MAX_CDC_REPORT_SIZE);
gustavatmel 1:9c5af431a1f1 128 }
gustavatmel 1:9c5af431a1f1 129
gustavatmel 1:9c5af431a1f1 130 bool USBCDC::readEP(uint8_t * buffer, uint32_t * size) {
gustavatmel 1:9c5af431a1f1 131 if (!USBDevice::readEP(EPBULK_OUT, buffer, size, MAX_CDC_REPORT_SIZE))
gustavatmel 1:9c5af431a1f1 132 return false;
gustavatmel 1:9c5af431a1f1 133 if (!readStart(EPBULK_OUT, MAX_CDC_REPORT_SIZE))
gustavatmel 1:9c5af431a1f1 134 return false;
gustavatmel 1:9c5af431a1f1 135 return true;
gustavatmel 1:9c5af431a1f1 136 }
gustavatmel 1:9c5af431a1f1 137
gustavatmel 1:9c5af431a1f1 138 bool USBCDC::readEP_NB(uint8_t * buffer, uint32_t * size) {
gustavatmel 1:9c5af431a1f1 139 if (!USBDevice::readEP_NB(EPBULK_OUT, buffer, size, MAX_CDC_REPORT_SIZE))
gustavatmel 1:9c5af431a1f1 140 return false;
gustavatmel 1:9c5af431a1f1 141 if (!readStart(EPBULK_OUT, MAX_CDC_REPORT_SIZE))
gustavatmel 1:9c5af431a1f1 142 return false;
gustavatmel 1:9c5af431a1f1 143 return true;
gustavatmel 1:9c5af431a1f1 144 }
gustavatmel 1:9c5af431a1f1 145
gustavatmel 1:9c5af431a1f1 146
gustavatmel 1:9c5af431a1f1 147 const uint8_t * USBCDC::deviceDesc() {
gustavatmel 1:9c5af431a1f1 148 uint8_t deviceDescriptorTemp[] = {
gustavatmel 1:9c5af431a1f1 149 18, // bLength
gustavatmel 1:9c5af431a1f1 150 1, // bDescriptorType
gustavatmel 1:9c5af431a1f1 151 0x10, 0x01, // bcdUSB
gustavatmel 1:9c5af431a1f1 152 2, // bDeviceClass
gustavatmel 1:9c5af431a1f1 153 0, // bDeviceSubClass
gustavatmel 1:9c5af431a1f1 154 0, // bDeviceProtocol
gustavatmel 1:9c5af431a1f1 155 MAX_PACKET_SIZE_EP0, // bMaxPacketSize0
gustavatmel 1:9c5af431a1f1 156 (uint8_t)(LSB(VENDOR_ID)), (uint8_t)(MSB(VENDOR_ID)), // idVendor
gustavatmel 1:9c5af431a1f1 157 (uint8_t)(LSB(PRODUCT_ID)), (uint8_t)(MSB(PRODUCT_ID)),// idProduct
gustavatmel 1:9c5af431a1f1 158 0x00, 0x01, // bcdDevice
gustavatmel 1:9c5af431a1f1 159 1, // iManufacturer
gustavatmel 1:9c5af431a1f1 160 2, // iProduct
gustavatmel 1:9c5af431a1f1 161 3, // iSerialNumber
gustavatmel 1:9c5af431a1f1 162 1 // bNumConfigurations
gustavatmel 1:9c5af431a1f1 163 };
gustavatmel 1:9c5af431a1f1 164 MBED_ASSERT(sizeof(deviceDescriptorTemp) == sizeof(deviceDescriptor));
gustavatmel 1:9c5af431a1f1 165 memcpy(deviceDescriptor, deviceDescriptorTemp, sizeof(deviceDescriptor));
gustavatmel 1:9c5af431a1f1 166 return deviceDescriptor;
gustavatmel 1:9c5af431a1f1 167 }
gustavatmel 1:9c5af431a1f1 168
gustavatmel 1:9c5af431a1f1 169 const uint8_t * USBCDC::stringIinterfaceDesc() {
gustavatmel 1:9c5af431a1f1 170 static const uint8_t stringIinterfaceDescriptor[] = {
gustavatmel 1:9c5af431a1f1 171 0x08,
gustavatmel 1:9c5af431a1f1 172 STRING_DESCRIPTOR,
gustavatmel 1:9c5af431a1f1 173 'C',0,'D',0,'C',0,
gustavatmel 1:9c5af431a1f1 174 };
gustavatmel 1:9c5af431a1f1 175 return stringIinterfaceDescriptor;
gustavatmel 1:9c5af431a1f1 176 }
gustavatmel 1:9c5af431a1f1 177
gustavatmel 1:9c5af431a1f1 178 const uint8_t * USBCDC::stringIproductDesc() {
gustavatmel 1:9c5af431a1f1 179 static const uint8_t stringIproductDescriptor[] = {
gustavatmel 1:9c5af431a1f1 180 0x16,
gustavatmel 1:9c5af431a1f1 181 STRING_DESCRIPTOR,
gustavatmel 1:9c5af431a1f1 182 'C',0,'D',0,'C',0,' ',0,'D',0,'E',0,'V',0,'I',0,'C',0,'E',0
gustavatmel 1:9c5af431a1f1 183 };
gustavatmel 1:9c5af431a1f1 184 return stringIproductDescriptor;
gustavatmel 1:9c5af431a1f1 185 }
gustavatmel 1:9c5af431a1f1 186
gustavatmel 1:9c5af431a1f1 187
gustavatmel 1:9c5af431a1f1 188 #define CONFIG1_DESC_SIZE (9+8+9+5+5+4+5+7+9+7+7)
gustavatmel 1:9c5af431a1f1 189
gustavatmel 1:9c5af431a1f1 190 const uint8_t * USBCDC::configurationDesc() {
gustavatmel 1:9c5af431a1f1 191 static const uint8_t configDescriptor[] = {
gustavatmel 1:9c5af431a1f1 192 // configuration descriptor
gustavatmel 1:9c5af431a1f1 193 9, // bLength
gustavatmel 1:9c5af431a1f1 194 2, // bDescriptorType
gustavatmel 1:9c5af431a1f1 195 LSB(CONFIG1_DESC_SIZE), // wTotalLength
gustavatmel 1:9c5af431a1f1 196 MSB(CONFIG1_DESC_SIZE),
gustavatmel 1:9c5af431a1f1 197 2, // bNumInterfaces
gustavatmel 1:9c5af431a1f1 198 1, // bConfigurationValue
gustavatmel 1:9c5af431a1f1 199 0, // iConfiguration
gustavatmel 1:9c5af431a1f1 200 0x80, // bmAttributes
gustavatmel 1:9c5af431a1f1 201 50, // bMaxPower
gustavatmel 1:9c5af431a1f1 202
gustavatmel 1:9c5af431a1f1 203 // IAD to associate the two CDC interfaces
gustavatmel 1:9c5af431a1f1 204 0x08, // bLength
gustavatmel 1:9c5af431a1f1 205 0x0b, // bDescriptorType
gustavatmel 1:9c5af431a1f1 206 0x00, // bFirstInterface
gustavatmel 1:9c5af431a1f1 207 0x02, // bInterfaceCount
gustavatmel 1:9c5af431a1f1 208 0x02, // bFunctionClass
gustavatmel 1:9c5af431a1f1 209 0x02, // bFunctionSubClass
gustavatmel 1:9c5af431a1f1 210 0, // bFunctionProtocol
gustavatmel 1:9c5af431a1f1 211 0, // iFunction
gustavatmel 1:9c5af431a1f1 212
gustavatmel 1:9c5af431a1f1 213 // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
gustavatmel 1:9c5af431a1f1 214 9, // bLength
gustavatmel 1:9c5af431a1f1 215 4, // bDescriptorType
gustavatmel 1:9c5af431a1f1 216 0, // bInterfaceNumber
gustavatmel 1:9c5af431a1f1 217 0, // bAlternateSetting
gustavatmel 1:9c5af431a1f1 218 1, // bNumEndpoints
gustavatmel 1:9c5af431a1f1 219 0x02, // bInterfaceClass
gustavatmel 1:9c5af431a1f1 220 0x02, // bInterfaceSubClass
gustavatmel 1:9c5af431a1f1 221 0x01, // bInterfaceProtocol
gustavatmel 1:9c5af431a1f1 222 0, // iInterface
gustavatmel 1:9c5af431a1f1 223
gustavatmel 1:9c5af431a1f1 224 // CDC Header Functional Descriptor, CDC Spec 5.2.3.1, Table 26
gustavatmel 1:9c5af431a1f1 225 5, // bFunctionLength
gustavatmel 1:9c5af431a1f1 226 0x24, // bDescriptorType
gustavatmel 1:9c5af431a1f1 227 0x00, // bDescriptorSubtype
gustavatmel 1:9c5af431a1f1 228 0x10, 0x01, // bcdCDC
gustavatmel 1:9c5af431a1f1 229
gustavatmel 1:9c5af431a1f1 230 // Call Management Functional Descriptor, CDC Spec 5.2.3.2, Table 27
gustavatmel 1:9c5af431a1f1 231 5, // bFunctionLength
gustavatmel 1:9c5af431a1f1 232 0x24, // bDescriptorType
gustavatmel 1:9c5af431a1f1 233 0x01, // bDescriptorSubtype
gustavatmel 1:9c5af431a1f1 234 0x03, // bmCapabilities
gustavatmel 1:9c5af431a1f1 235 1, // bDataInterface
gustavatmel 1:9c5af431a1f1 236
gustavatmel 1:9c5af431a1f1 237 // Abstract Control Management Functional Descriptor, CDC Spec 5.2.3.3, Table 28
gustavatmel 1:9c5af431a1f1 238 4, // bFunctionLength
gustavatmel 1:9c5af431a1f1 239 0x24, // bDescriptorType
gustavatmel 1:9c5af431a1f1 240 0x02, // bDescriptorSubtype
gustavatmel 1:9c5af431a1f1 241 0x06, // bmCapabilities
gustavatmel 1:9c5af431a1f1 242
gustavatmel 1:9c5af431a1f1 243 // Union Functional Descriptor, CDC Spec 5.2.3.8, Table 33
gustavatmel 1:9c5af431a1f1 244 5, // bFunctionLength
gustavatmel 1:9c5af431a1f1 245 0x24, // bDescriptorType
gustavatmel 1:9c5af431a1f1 246 0x06, // bDescriptorSubtype
gustavatmel 1:9c5af431a1f1 247 0, // bMasterInterface
gustavatmel 1:9c5af431a1f1 248 1, // bSlaveInterface0
gustavatmel 1:9c5af431a1f1 249
gustavatmel 1:9c5af431a1f1 250 // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
gustavatmel 1:9c5af431a1f1 251 ENDPOINT_DESCRIPTOR_LENGTH, // bLength
gustavatmel 1:9c5af431a1f1 252 ENDPOINT_DESCRIPTOR, // bDescriptorType
gustavatmel 1:9c5af431a1f1 253 PHY_TO_DESC(EPINT_IN), // bEndpointAddress
gustavatmel 1:9c5af431a1f1 254 E_INTERRUPT, // bmAttributes (0x03=intr)
gustavatmel 1:9c5af431a1f1 255 LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB)
gustavatmel 1:9c5af431a1f1 256 MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB)
gustavatmel 1:9c5af431a1f1 257 16, // bInterval
gustavatmel 1:9c5af431a1f1 258
gustavatmel 1:9c5af431a1f1 259
gustavatmel 1:9c5af431a1f1 260
gustavatmel 1:9c5af431a1f1 261
gustavatmel 1:9c5af431a1f1 262 // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
gustavatmel 1:9c5af431a1f1 263 9, // bLength
gustavatmel 1:9c5af431a1f1 264 4, // bDescriptorType
gustavatmel 1:9c5af431a1f1 265 1, // bInterfaceNumber
gustavatmel 1:9c5af431a1f1 266 0, // bAlternateSetting
gustavatmel 1:9c5af431a1f1 267 2, // bNumEndpoints
gustavatmel 1:9c5af431a1f1 268 0x0A, // bInterfaceClass
gustavatmel 1:9c5af431a1f1 269 0x00, // bInterfaceSubClass
gustavatmel 1:9c5af431a1f1 270 0x00, // bInterfaceProtocol
gustavatmel 1:9c5af431a1f1 271 0, // iInterface
gustavatmel 1:9c5af431a1f1 272
gustavatmel 1:9c5af431a1f1 273 // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
gustavatmel 1:9c5af431a1f1 274 ENDPOINT_DESCRIPTOR_LENGTH, // bLength
gustavatmel 1:9c5af431a1f1 275 ENDPOINT_DESCRIPTOR, // bDescriptorType
gustavatmel 1:9c5af431a1f1 276 PHY_TO_DESC(EPBULK_IN), // bEndpointAddress
gustavatmel 1:9c5af431a1f1 277 E_BULK, // bmAttributes (0x02=bulk)
gustavatmel 1:9c5af431a1f1 278 LSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (LSB)
gustavatmel 1:9c5af431a1f1 279 MSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (MSB)
gustavatmel 1:9c5af431a1f1 280 0, // bInterval
gustavatmel 1:9c5af431a1f1 281
gustavatmel 1:9c5af431a1f1 282 // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
gustavatmel 1:9c5af431a1f1 283 ENDPOINT_DESCRIPTOR_LENGTH, // bLength
gustavatmel 1:9c5af431a1f1 284 ENDPOINT_DESCRIPTOR, // bDescriptorType
gustavatmel 1:9c5af431a1f1 285 PHY_TO_DESC(EPBULK_OUT), // bEndpointAddress
gustavatmel 1:9c5af431a1f1 286 E_BULK, // bmAttributes (0x02=bulk)
gustavatmel 1:9c5af431a1f1 287 LSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (LSB)
gustavatmel 1:9c5af431a1f1 288 MSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (MSB)
gustavatmel 1:9c5af431a1f1 289 0 // bInterval
gustavatmel 1:9c5af431a1f1 290 };
gustavatmel 1:9c5af431a1f1 291 return configDescriptor;
gustavatmel 1:9c5af431a1f1 292 }