USB composite device example program, drag-and-drop flash writer.

Dependencies:   SWD USBDevice mbed BaseDAP

Committer:
va009039
Date:
Sat Sep 28 03:21:14 2013 +0000
Revision:
1:ea8e179320d7
add USBMSD_Drop class. add CDC(Virtual COM) and HID(for example CMSIS-DAP), but KL25Z not work.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 1:ea8e179320d7 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
va009039 1:ea8e179320d7 2 *
va009039 1:ea8e179320d7 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
va009039 1:ea8e179320d7 4 * and associated documentation files (the "Software"), to deal in the Software without
va009039 1:ea8e179320d7 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
va009039 1:ea8e179320d7 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
va009039 1:ea8e179320d7 7 * Software is furnished to do so, subject to the following conditions:
va009039 1:ea8e179320d7 8 *
va009039 1:ea8e179320d7 9 * The above copyright notice and this permission notice shall be included in all copies or
va009039 1:ea8e179320d7 10 * substantial portions of the Software.
va009039 1:ea8e179320d7 11 *
va009039 1:ea8e179320d7 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
va009039 1:ea8e179320d7 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
va009039 1:ea8e179320d7 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
va009039 1:ea8e179320d7 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
va009039 1:ea8e179320d7 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
va009039 1:ea8e179320d7 17 */
va009039 1:ea8e179320d7 18
va009039 1:ea8e179320d7 19 #include "stdint.h"
va009039 1:ea8e179320d7 20 #include "USBMSD2.h"
va009039 1:ea8e179320d7 21 #include "USB_MSD.h"
va009039 1:ea8e179320d7 22 #include "USB_CDC.h"
va009039 1:ea8e179320d7 23 #include "USB_HID.h"
va009039 1:ea8e179320d7 24 #include "mydebug.h"
va009039 1:ea8e179320d7 25
va009039 1:ea8e179320d7 26 #define DEFAULT_CONFIGURATION (1)
va009039 1:ea8e179320d7 27
va009039 1:ea8e179320d7 28 USBMSD2::USBMSD2(uint16_t vendor_id, uint16_t product_id, uint16_t product_release)
va009039 1:ea8e179320d7 29 : USBDevice(vendor_id, product_id, product_release)
va009039 1:ea8e179320d7 30 {
va009039 1:ea8e179320d7 31 _msd = new USB_MSD(this, this);
va009039 1:ea8e179320d7 32 _cdc = new USB_CDC(this);
va009039 1:ea8e179320d7 33 _hid = new USB_HID(this);
va009039 1:ea8e179320d7 34 }
va009039 1:ea8e179320d7 35
va009039 1:ea8e179320d7 36 USBMSD2::~USBMSD2() {
va009039 1:ea8e179320d7 37 _msd->disconnect();
va009039 1:ea8e179320d7 38 USBDevice::disconnect();
va009039 1:ea8e179320d7 39 }
va009039 1:ea8e179320d7 40
va009039 1:ea8e179320d7 41 void USBMSD2::putc(int c)
va009039 1:ea8e179320d7 42 {
va009039 1:ea8e179320d7 43 _cdc->putc(c);
va009039 1:ea8e179320d7 44 }
va009039 1:ea8e179320d7 45
va009039 1:ea8e179320d7 46 int USBMSD2::getc()
va009039 1:ea8e179320d7 47 {
va009039 1:ea8e179320d7 48 return _cdc->getc();
va009039 1:ea8e179320d7 49 }
va009039 1:ea8e179320d7 50
va009039 1:ea8e179320d7 51 int USBMSD2::readable()
va009039 1:ea8e179320d7 52 {
va009039 1:ea8e179320d7 53 return _cdc->readable();
va009039 1:ea8e179320d7 54 }
va009039 1:ea8e179320d7 55
va009039 1:ea8e179320d7 56 int USBMSD2::writeable()
va009039 1:ea8e179320d7 57 {
va009039 1:ea8e179320d7 58 return _cdc->writeable();
va009039 1:ea8e179320d7 59 }
va009039 1:ea8e179320d7 60
va009039 1:ea8e179320d7 61 bool USBMSD2::readNB(HID_REPORT* report)
va009039 1:ea8e179320d7 62 {
va009039 1:ea8e179320d7 63 return _hid->readNB(report);
va009039 1:ea8e179320d7 64 }
va009039 1:ea8e179320d7 65
va009039 1:ea8e179320d7 66 bool USBMSD2::send(HID_REPORT* report)
va009039 1:ea8e179320d7 67 {
va009039 1:ea8e179320d7 68 return _hid->send(report);
va009039 1:ea8e179320d7 69 }
va009039 1:ea8e179320d7 70
va009039 1:ea8e179320d7 71 bool USBMSD2::connect()
va009039 1:ea8e179320d7 72 {
va009039 1:ea8e179320d7 73 if (_msd->connect()) {
va009039 1:ea8e179320d7 74 USBDevice::connect();
va009039 1:ea8e179320d7 75 return true;
va009039 1:ea8e179320d7 76 }
va009039 1:ea8e179320d7 77 return false;
va009039 1:ea8e179320d7 78 }
va009039 1:ea8e179320d7 79
va009039 1:ea8e179320d7 80 // Called in ISR context to process a class specific request
va009039 1:ea8e179320d7 81 bool USBMSD2::USBCallback_request(void) {
va009039 1:ea8e179320d7 82 CONTROL_TRANSFER* transfer = getTransferPtr();
va009039 1:ea8e179320d7 83 if (_msd->Request_callback(transfer)) {
va009039 1:ea8e179320d7 84 return true;
va009039 1:ea8e179320d7 85 }
va009039 1:ea8e179320d7 86 if (_cdc->Request_callback(transfer)) {
va009039 1:ea8e179320d7 87 return true;
va009039 1:ea8e179320d7 88 }
va009039 1:ea8e179320d7 89 // Find the HID descriptor, after the configuration descriptor
va009039 1:ea8e179320d7 90 uint8_t* hidDescriptor = findDescriptor(HID_DESCRIPTOR);
va009039 1:ea8e179320d7 91 if (_hid->Request_callback(transfer, hidDescriptor)) {
va009039 1:ea8e179320d7 92 return true;
va009039 1:ea8e179320d7 93 }
va009039 1:ea8e179320d7 94 return false;
va009039 1:ea8e179320d7 95 }
va009039 1:ea8e179320d7 96
va009039 1:ea8e179320d7 97 /* virtual */ void USBMSD2::USBCallback_requestCompleted(uint8_t* buf, uint32_t length)
va009039 1:ea8e179320d7 98 {
va009039 1:ea8e179320d7 99 CONTROL_TRANSFER* transfer = getTransferPtr();
va009039 1:ea8e179320d7 100 if (_cdc->RequestCompleted_callback(transfer, buf, length)) {
va009039 1:ea8e179320d7 101 return;
va009039 1:ea8e179320d7 102 }
va009039 1:ea8e179320d7 103 }
va009039 1:ea8e179320d7 104
va009039 1:ea8e179320d7 105 // Called in ISR context
va009039 1:ea8e179320d7 106 // Set configuration. Return false if the
va009039 1:ea8e179320d7 107 // configuration is not supported.
va009039 1:ea8e179320d7 108 bool USBMSD2::USBCallback_setConfiguration(uint8_t configuration) {
va009039 1:ea8e179320d7 109 if (configuration != DEFAULT_CONFIGURATION) {
va009039 1:ea8e179320d7 110 return false;
va009039 1:ea8e179320d7 111 }
va009039 1:ea8e179320d7 112
va009039 1:ea8e179320d7 113 // Configure endpoints > 0
va009039 1:ea8e179320d7 114 addEndpoint(EPBULK_IN, MAX_PACKET_SIZE_EPBULK);
va009039 1:ea8e179320d7 115 addEndpoint(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
va009039 1:ea8e179320d7 116
va009039 1:ea8e179320d7 117 addEndpoint(CDC_EPINT_IN, MAX_PACKET_SIZE_EPINT);
va009039 1:ea8e179320d7 118 addEndpoint(CDC_EPBULK_IN, MAX_PACKET_SIZE_EPBULK);
va009039 1:ea8e179320d7 119 addEndpoint(CDC_EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
va009039 1:ea8e179320d7 120
va009039 1:ea8e179320d7 121 addEndpoint(HID_EPINT_IN, MAX_PACKET_SIZE_EPINT);
va009039 1:ea8e179320d7 122 addEndpoint(HID_EPINT_OUT, MAX_PACKET_SIZE_EPINT);
va009039 1:ea8e179320d7 123
va009039 1:ea8e179320d7 124 //activate readings
va009039 1:ea8e179320d7 125 readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
va009039 1:ea8e179320d7 126
va009039 1:ea8e179320d7 127 readStart(CDC_EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
va009039 1:ea8e179320d7 128
va009039 1:ea8e179320d7 129 readStart(HID_EPINT_OUT, MAX_PACKET_SIZE_EPINT);
va009039 1:ea8e179320d7 130
va009039 1:ea8e179320d7 131 return true;
va009039 1:ea8e179320d7 132 }
va009039 1:ea8e179320d7 133
va009039 1:ea8e179320d7 134 /* virtual */ bool USBMSD2::EP2_OUT_callback() { return _msd->EPBULK_OUT_callback(); }
va009039 1:ea8e179320d7 135 /* virtual */ bool USBMSD2::EP2_IN_callback() { return _msd->EPBULK_IN_callback(); }
va009039 1:ea8e179320d7 136 /* virtual */ bool USBMSD2::EP5_OUT_callback() { return _cdc->EPBULK_OUT_callback(); }
va009039 1:ea8e179320d7 137
va009039 1:ea8e179320d7 138 uint8_t * USBMSD2::deviceDesc() {
va009039 1:ea8e179320d7 139 static uint8_t deviceDescriptor[] = {
va009039 1:ea8e179320d7 140 18, // bLength
va009039 1:ea8e179320d7 141 1, // bDescriptorType
va009039 1:ea8e179320d7 142 0x10, 0x01, // bcdUSB
va009039 1:ea8e179320d7 143 2, // bDeviceClass
va009039 1:ea8e179320d7 144 0, // bDeviceSubClass
va009039 1:ea8e179320d7 145 0, // bDeviceProtocol
va009039 1:ea8e179320d7 146 MAX_PACKET_SIZE_EP0, // bMaxPacketSize0
va009039 1:ea8e179320d7 147 (uint8_t)(LSB(VENDOR_ID)), (uint8_t)(MSB(VENDOR_ID)), // idVendor
va009039 1:ea8e179320d7 148 (uint8_t)(LSB(PRODUCT_ID)), (uint8_t)(MSB(PRODUCT_ID)),// idProduct
va009039 1:ea8e179320d7 149 0x00, 0x01, // bcdDevice
va009039 1:ea8e179320d7 150 1, // iManufacturer
va009039 1:ea8e179320d7 151 2, // iProduct
va009039 1:ea8e179320d7 152 3, // iSerialNumber
va009039 1:ea8e179320d7 153 1 // bNumConfigurations
va009039 1:ea8e179320d7 154 };
va009039 1:ea8e179320d7 155 return deviceDescriptor;
va009039 1:ea8e179320d7 156 }
va009039 1:ea8e179320d7 157
va009039 1:ea8e179320d7 158 uint8_t * USBMSD2::stringIinterfaceDesc() {
va009039 1:ea8e179320d7 159 static uint8_t stringIinterfaceDescriptor[] = {
va009039 1:ea8e179320d7 160 0x08, //bLength
va009039 1:ea8e179320d7 161 STRING_DESCRIPTOR, //bDescriptorType 0x03
va009039 1:ea8e179320d7 162 'H',0,'I',0,'D',0, //bString iInterface - HID
va009039 1:ea8e179320d7 163 };
va009039 1:ea8e179320d7 164 return stringIinterfaceDescriptor;
va009039 1:ea8e179320d7 165 }
va009039 1:ea8e179320d7 166
va009039 1:ea8e179320d7 167 uint8_t * USBMSD2::stringIproductDesc() {
va009039 1:ea8e179320d7 168 static uint8_t stringIproductDescriptor[] = {
va009039 1:ea8e179320d7 169 32, //bLength
va009039 1:ea8e179320d7 170 STRING_DESCRIPTOR, //bDescriptorType 0x03
va009039 1:ea8e179320d7 171 'K',0,'L',0,'2',0,'5',0,'Z',0,' ',0,'C',0,'M',0,'S',0,'I',0,'S',0,'-',0,'D',0,'A',0,'P',0 // KL25Z CMSIS-DAP
va009039 1:ea8e179320d7 172 };
va009039 1:ea8e179320d7 173 return stringIproductDescriptor;
va009039 1:ea8e179320d7 174 }
va009039 1:ea8e179320d7 175
va009039 1:ea8e179320d7 176 uint8_t * USBMSD2::configurationDesc() {
va009039 1:ea8e179320d7 177 static uint8_t configDescriptor[] = {
va009039 1:ea8e179320d7 178 // Configuration 1
va009039 1:ea8e179320d7 179 9, // bLength
va009039 1:ea8e179320d7 180 2, // bDescriptorType
va009039 1:ea8e179320d7 181 LSB(122), // wTotalLength
va009039 1:ea8e179320d7 182 MSB(122),
va009039 1:ea8e179320d7 183 4, // bNumInterfaces
va009039 1:ea8e179320d7 184 1, // bConfigurationValue: 0x01 is used to select this configuration
va009039 1:ea8e179320d7 185 0x00, // iConfiguration: no string to describe this configuration
va009039 1:ea8e179320d7 186 0x80, // bmAttributes
va009039 1:ea8e179320d7 187 250, // bMaxPower, device power consumption is 100 mA
va009039 1:ea8e179320d7 188
va009039 1:ea8e179320d7 189 // Interface 0, Alternate Setting 0, MSC Class
va009039 1:ea8e179320d7 190 INTERFACE_DESCRIPTOR_LENGTH, // bLength
va009039 1:ea8e179320d7 191 INTERFACE_DESCRIPTOR, // bDescriptorType
va009039 1:ea8e179320d7 192 0, // bInterfaceNumber
va009039 1:ea8e179320d7 193 0, // bAlternateSetting
va009039 1:ea8e179320d7 194 2, // bNumEndpoints
va009039 1:ea8e179320d7 195 0x08, // bInterfaceClass
va009039 1:ea8e179320d7 196 0x06, // bInterfaceSubClass
va009039 1:ea8e179320d7 197 0x50, // bInterfaceProtocol
va009039 1:ea8e179320d7 198 0x04, // iInterface
va009039 1:ea8e179320d7 199
va009039 1:ea8e179320d7 200 // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
va009039 1:ea8e179320d7 201 ENDPOINT_DESCRIPTOR_LENGTH, // bLength
va009039 1:ea8e179320d7 202 ENDPOINT_DESCRIPTOR, // bDescriptorType
va009039 1:ea8e179320d7 203 PHY_TO_DESC(EPBULK_IN), // bEndpointAddress
va009039 1:ea8e179320d7 204 E_BULK, // bmAttributes (0x02=bulk)
va009039 1:ea8e179320d7 205 LSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (LSB)
va009039 1:ea8e179320d7 206 MSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (MSB)
va009039 1:ea8e179320d7 207 0, // bInterval
va009039 1:ea8e179320d7 208
va009039 1:ea8e179320d7 209 // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
va009039 1:ea8e179320d7 210 ENDPOINT_DESCRIPTOR_LENGTH, // bLength
va009039 1:ea8e179320d7 211 ENDPOINT_DESCRIPTOR, // bDescriptorType
va009039 1:ea8e179320d7 212 PHY_TO_DESC(EPBULK_OUT), // bEndpointAddress
va009039 1:ea8e179320d7 213 E_BULK, // bmAttributes (0x02=bulk)
va009039 1:ea8e179320d7 214 LSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (LSB)
va009039 1:ea8e179320d7 215 MSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (MSB)
va009039 1:ea8e179320d7 216 0, // bInterval
va009039 1:ea8e179320d7 217
va009039 1:ea8e179320d7 218 // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
va009039 1:ea8e179320d7 219 INTERFACE_DESCRIPTOR_LENGTH, // bLength
va009039 1:ea8e179320d7 220 INTERFACE_DESCRIPTOR, // bDescriptorType
va009039 1:ea8e179320d7 221 1, // bInterfaceNumber
va009039 1:ea8e179320d7 222 0, // bAlternateSetting
va009039 1:ea8e179320d7 223 1, // bNumEndpoints
va009039 1:ea8e179320d7 224 0x02, // bInterfaceClass
va009039 1:ea8e179320d7 225 0x02, // bInterfaceSubClass
va009039 1:ea8e179320d7 226 0x01, // bInterfaceProtocol
va009039 1:ea8e179320d7 227 0, // iInterface
va009039 1:ea8e179320d7 228
va009039 1:ea8e179320d7 229 // CDC Header Functional Descriptor, CDC Spec 5.2.3.1, Table 26
va009039 1:ea8e179320d7 230 5, // bFunctionLength
va009039 1:ea8e179320d7 231 0x24, // bDescriptorType
va009039 1:ea8e179320d7 232 0x00, // bDescriptorSubtype
va009039 1:ea8e179320d7 233 0x10, 0x01, // bcdCDC
va009039 1:ea8e179320d7 234
va009039 1:ea8e179320d7 235 // Call Management Functional Descriptor, CDC Spec 5.2.3.2, Table 27
va009039 1:ea8e179320d7 236 5, // bFunctionLength
va009039 1:ea8e179320d7 237 0x24, // bDescriptorType
va009039 1:ea8e179320d7 238 0x01, // bDescriptorSubtype
va009039 1:ea8e179320d7 239 0x03, // bmCapabilities
va009039 1:ea8e179320d7 240 2, // bDataInterface
va009039 1:ea8e179320d7 241
va009039 1:ea8e179320d7 242 // Abstract Control Management Functional Descriptor, CDC Spec 5.2.3.3, Table 28
va009039 1:ea8e179320d7 243 4, // bFunctionLength
va009039 1:ea8e179320d7 244 0x24, // bDescriptorType
va009039 1:ea8e179320d7 245 0x02, // bDescriptorSubtype
va009039 1:ea8e179320d7 246 0x06, // bmCapabilities
va009039 1:ea8e179320d7 247
va009039 1:ea8e179320d7 248 // Union Functional Descriptor, CDC Spec 5.2.3.8, Table 33
va009039 1:ea8e179320d7 249 5, // bFunctionLength
va009039 1:ea8e179320d7 250 0x24, // bDescriptorType
va009039 1:ea8e179320d7 251 0x06, // bDescriptorSubtype
va009039 1:ea8e179320d7 252 1, // bMasterInterface
va009039 1:ea8e179320d7 253 2, // bSlaveInterface0
va009039 1:ea8e179320d7 254
va009039 1:ea8e179320d7 255 // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
va009039 1:ea8e179320d7 256 ENDPOINT_DESCRIPTOR_LENGTH, // bLength
va009039 1:ea8e179320d7 257 ENDPOINT_DESCRIPTOR, // bDescriptorType
va009039 1:ea8e179320d7 258 PHY_TO_DESC(CDC_EPINT_IN), // bEndpointAddress
va009039 1:ea8e179320d7 259 E_INTERRUPT, // bmAttributes (0x03=intr)
va009039 1:ea8e179320d7 260 LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB)
va009039 1:ea8e179320d7 261 MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB)
va009039 1:ea8e179320d7 262 2, // bInterval
va009039 1:ea8e179320d7 263
va009039 1:ea8e179320d7 264 // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
va009039 1:ea8e179320d7 265 INTERFACE_DESCRIPTOR_LENGTH, // bLength
va009039 1:ea8e179320d7 266 INTERFACE_DESCRIPTOR, // bDescriptorType
va009039 1:ea8e179320d7 267 2, // bInterfaceNumber
va009039 1:ea8e179320d7 268 0, // bAlternateSetting
va009039 1:ea8e179320d7 269 2, // bNumEndpoints
va009039 1:ea8e179320d7 270 0x0A, // bInterfaceClass
va009039 1:ea8e179320d7 271 0x00, // bInterfaceSubClass
va009039 1:ea8e179320d7 272 0x00, // bInterfaceProtocol
va009039 1:ea8e179320d7 273 0, // iInterface
va009039 1:ea8e179320d7 274
va009039 1:ea8e179320d7 275 // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
va009039 1:ea8e179320d7 276 ENDPOINT_DESCRIPTOR_LENGTH, // bLength
va009039 1:ea8e179320d7 277 ENDPOINT_DESCRIPTOR, // bDescriptorType
va009039 1:ea8e179320d7 278 PHY_TO_DESC(CDC_EPBULK_IN), // bEndpointAddress
va009039 1:ea8e179320d7 279 E_BULK, // bmAttributes (0x02=bulk)
va009039 1:ea8e179320d7 280 LSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (LSB)
va009039 1:ea8e179320d7 281 MSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (MSB)
va009039 1:ea8e179320d7 282 0, // bInterval
va009039 1:ea8e179320d7 283
va009039 1:ea8e179320d7 284 // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
va009039 1:ea8e179320d7 285 ENDPOINT_DESCRIPTOR_LENGTH, // bLength
va009039 1:ea8e179320d7 286 ENDPOINT_DESCRIPTOR, // bDescriptorType
va009039 1:ea8e179320d7 287 PHY_TO_DESC(CDC_EPBULK_OUT),// bEndpointAddress
va009039 1:ea8e179320d7 288 E_BULK, // bmAttributes (0x02=bulk)
va009039 1:ea8e179320d7 289 LSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (LSB)
va009039 1:ea8e179320d7 290 MSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (MSB)
va009039 1:ea8e179320d7 291 0, // bInterval
va009039 1:ea8e179320d7 292
va009039 1:ea8e179320d7 293 INTERFACE_DESCRIPTOR_LENGTH, // bLength
va009039 1:ea8e179320d7 294 INTERFACE_DESCRIPTOR, // bDescriptorType
va009039 1:ea8e179320d7 295 3, // bInterfaceNumber
va009039 1:ea8e179320d7 296 0, // bAlternateSetting
va009039 1:ea8e179320d7 297 2, // bNumEndpoints
va009039 1:ea8e179320d7 298 HID_CLASS, // bInterfaceClass
va009039 1:ea8e179320d7 299 HID_SUBCLASS_NONE, // bInterfaceSubClass
va009039 1:ea8e179320d7 300 HID_PROTOCOL_NONE, // bInterfaceProtocol
va009039 1:ea8e179320d7 301 0, // iInterface
va009039 1:ea8e179320d7 302
va009039 1:ea8e179320d7 303 HID_DESCRIPTOR_LENGTH, // bLength
va009039 1:ea8e179320d7 304 HID_DESCRIPTOR, // bDescriptorType
va009039 1:ea8e179320d7 305 LSB(HID_VERSION_1_11), // bcdHID (LSB)
va009039 1:ea8e179320d7 306 MSB(HID_VERSION_1_11), // bcdHID (MSB)
va009039 1:ea8e179320d7 307 0x00, // bCountryCode
va009039 1:ea8e179320d7 308 1, // bNumDescriptors
va009039 1:ea8e179320d7 309 REPORT_DESCRIPTOR, // bDescriptorType
va009039 1:ea8e179320d7 310 LSB(_hid->reportDescLength()), // wDescriptorLength (LSB)
va009039 1:ea8e179320d7 311 MSB(_hid->reportDescLength()), // wDescriptorLength (MSB)
va009039 1:ea8e179320d7 312
va009039 1:ea8e179320d7 313 ENDPOINT_DESCRIPTOR_LENGTH, // bLength
va009039 1:ea8e179320d7 314 ENDPOINT_DESCRIPTOR, // bDescriptorType
va009039 1:ea8e179320d7 315 PHY_TO_DESC(HID_EPINT_IN), // bEndpointAddress
va009039 1:ea8e179320d7 316 E_INTERRUPT, // bmAttributes
va009039 1:ea8e179320d7 317 LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB)
va009039 1:ea8e179320d7 318 MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB)
va009039 1:ea8e179320d7 319 1, // bInterval (milliseconds)
va009039 1:ea8e179320d7 320
va009039 1:ea8e179320d7 321 ENDPOINT_DESCRIPTOR_LENGTH, // bLength
va009039 1:ea8e179320d7 322 ENDPOINT_DESCRIPTOR, // bDescriptorType
va009039 1:ea8e179320d7 323 PHY_TO_DESC(HID_EPINT_OUT), // bEndpointAddress
va009039 1:ea8e179320d7 324 E_INTERRUPT, // bmAttributes
va009039 1:ea8e179320d7 325 LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB)
va009039 1:ea8e179320d7 326 MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB)
va009039 1:ea8e179320d7 327 1, // bInterval (milliseconds)
va009039 1:ea8e179320d7 328 };
va009039 1:ea8e179320d7 329 return configDescriptor;
va009039 1:ea8e179320d7 330 }