]> git.friedersdorff.com Git - max/tmk_keyboard.git/blob - tmk_core/tool/mbed/mbed-sdk/libraries/USBDevice/USBHID/USBKeyboard.cpp
Merge commit '1fe4406f374291ab2e86e95a97341fd9c475fcb8'
[max/tmk_keyboard.git] / tmk_core / tool / mbed / mbed-sdk / libraries / USBDevice / USBHID / USBKeyboard.cpp
1 /* Copyright (c) 2010-2011 mbed.org, MIT License
2 *
3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
4 * and associated documentation files (the "Software"), to deal in the Software without
5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
7 * Software is furnished to do so, subject to the following conditions:
8 *
9 * The above copyright notice and this permission notice shall be included in all copies or
10 * substantial portions of the Software.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
17 */
18
19 #include "stdint.h"
20
21 #include "USBKeyboard.h"
22
23 #define REPORT_ID_KEYBOARD 1
24 #define REPORT_ID_VOLUME   3
25
26
27 typedef struct {
28     unsigned char usage;
29     unsigned char modifier;
30 } KEYMAP;
31
32 #ifdef US_KEYBOARD
33 /* US keyboard (as HID standard) */
34 #define KEYMAP_SIZE (152)
35 const KEYMAP keymap[KEYMAP_SIZE] = {
36     {0, 0},             /* NUL */
37     {0, 0},             /* SOH */
38     {0, 0},             /* STX */
39     {0, 0},             /* ETX */
40     {0, 0},             /* EOT */
41     {0, 0},             /* ENQ */
42     {0, 0},             /* ACK */
43     {0, 0},             /* BEL */
44     {0x2a, 0},          /* BS  */  /* Keyboard Delete (Backspace) */
45     {0x2b, 0},          /* TAB */  /* Keyboard Tab */
46     {0x28, 0},          /* LF  */  /* Keyboard Return (Enter) */
47     {0, 0},             /* VT  */
48     {0, 0},             /* FF  */
49     {0, 0},             /* CR  */
50     {0, 0},             /* SO  */
51     {0, 0},             /* SI  */
52     {0, 0},             /* DEL */
53     {0, 0},             /* DC1 */
54     {0, 0},             /* DC2 */
55     {0, 0},             /* DC3 */
56     {0, 0},             /* DC4 */
57     {0, 0},             /* NAK */
58     {0, 0},             /* SYN */
59     {0, 0},             /* ETB */
60     {0, 0},             /* CAN */
61     {0, 0},             /* EM  */
62     {0, 0},             /* SUB */
63     {0, 0},             /* ESC */
64     {0, 0},             /* FS  */
65     {0, 0},             /* GS  */
66     {0, 0},             /* RS  */
67     {0, 0},             /* US  */
68     {0x2c, 0},          /*   */
69     {0x1e, KEY_SHIFT},      /* ! */
70     {0x34, KEY_SHIFT},      /* " */
71     {0x20, KEY_SHIFT},      /* # */
72     {0x21, KEY_SHIFT},      /* $ */
73     {0x22, KEY_SHIFT},      /* % */
74     {0x24, KEY_SHIFT},      /* & */
75     {0x34, 0},          /* ' */
76     {0x26, KEY_SHIFT},      /* ( */
77     {0x27, KEY_SHIFT},      /* ) */
78     {0x25, KEY_SHIFT},      /* * */
79     {0x2e, KEY_SHIFT},      /* + */
80     {0x36, 0},          /* , */
81     {0x2d, 0},          /* - */
82     {0x37, 0},          /* . */
83     {0x38, 0},          /* / */
84     {0x27, 0},          /* 0 */
85     {0x1e, 0},          /* 1 */
86     {0x1f, 0},          /* 2 */
87     {0x20, 0},          /* 3 */
88     {0x21, 0},          /* 4 */
89     {0x22, 0},          /* 5 */
90     {0x23, 0},          /* 6 */
91     {0x24, 0},          /* 7 */
92     {0x25, 0},          /* 8 */
93     {0x26, 0},          /* 9 */
94     {0x33, KEY_SHIFT},      /* : */
95     {0x33, 0},          /* ; */
96     {0x36, KEY_SHIFT},      /* < */
97     {0x2e, 0},          /* = */
98     {0x37, KEY_SHIFT},      /* > */
99     {0x38, KEY_SHIFT},      /* ? */
100     {0x1f, KEY_SHIFT},      /* @ */
101     {0x04, KEY_SHIFT},      /* A */
102     {0x05, KEY_SHIFT},      /* B */
103     {0x06, KEY_SHIFT},      /* C */
104     {0x07, KEY_SHIFT},      /* D */
105     {0x08, KEY_SHIFT},      /* E */
106     {0x09, KEY_SHIFT},      /* F */
107     {0x0a, KEY_SHIFT},      /* G */
108     {0x0b, KEY_SHIFT},      /* H */
109     {0x0c, KEY_SHIFT},      /* I */
110     {0x0d, KEY_SHIFT},      /* J */
111     {0x0e, KEY_SHIFT},      /* K */
112     {0x0f, KEY_SHIFT},      /* L */
113     {0x10, KEY_SHIFT},      /* M */
114     {0x11, KEY_SHIFT},      /* N */
115     {0x12, KEY_SHIFT},      /* O */
116     {0x13, KEY_SHIFT},      /* P */
117     {0x14, KEY_SHIFT},      /* Q */
118     {0x15, KEY_SHIFT},      /* R */
119     {0x16, KEY_SHIFT},      /* S */
120     {0x17, KEY_SHIFT},      /* T */
121     {0x18, KEY_SHIFT},      /* U */
122     {0x19, KEY_SHIFT},      /* V */
123     {0x1a, KEY_SHIFT},      /* W */
124     {0x1b, KEY_SHIFT},      /* X */
125     {0x1c, KEY_SHIFT},      /* Y */
126     {0x1d, KEY_SHIFT},      /* Z */
127     {0x2f, 0},          /* [ */
128     {0x31, 0},          /* \ */
129     {0x30, 0},          /* ] */
130     {0x23, KEY_SHIFT},      /* ^ */
131     {0x2d, KEY_SHIFT},      /* _ */
132     {0x35, 0},          /* ` */
133     {0x04, 0},          /* a */
134     {0x05, 0},          /* b */
135     {0x06, 0},          /* c */
136     {0x07, 0},          /* d */
137     {0x08, 0},          /* e */
138     {0x09, 0},          /* f */
139     {0x0a, 0},          /* g */
140     {0x0b, 0},          /* h */
141     {0x0c, 0},          /* i */
142     {0x0d, 0},          /* j */
143     {0x0e, 0},          /* k */
144     {0x0f, 0},          /* l */
145     {0x10, 0},          /* m */
146     {0x11, 0},          /* n */
147     {0x12, 0},          /* o */
148     {0x13, 0},          /* p */
149     {0x14, 0},          /* q */
150     {0x15, 0},          /* r */
151     {0x16, 0},          /* s */
152     {0x17, 0},          /* t */
153     {0x18, 0},          /* u */
154     {0x19, 0},          /* v */
155     {0x1a, 0},          /* w */
156     {0x1b, 0},          /* x */
157     {0x1c, 0},          /* y */
158     {0x1d, 0},          /* z */
159     {0x2f, KEY_SHIFT},      /* { */
160     {0x31, KEY_SHIFT},      /* | */
161     {0x30, KEY_SHIFT},      /* } */
162     {0x35, KEY_SHIFT},      /* ~ */
163     {0,0},              /* DEL */
164
165     {0x3a, 0},          /* F1 */
166     {0x3b, 0},          /* F2 */
167     {0x3c, 0},          /* F3 */
168     {0x3d, 0},          /* F4 */
169     {0x3e, 0},          /* F5 */
170     {0x3f, 0},          /* F6 */
171     {0x40, 0},          /* F7 */
172     {0x41, 0},          /* F8 */
173     {0x42, 0},          /* F9 */
174     {0x43, 0},          /* F10 */
175     {0x44, 0},          /* F11 */
176     {0x45, 0},          /* F12 */
177
178     {0x46, 0},          /* PRINT_SCREEN */
179     {0x47, 0},          /* SCROLL_LOCK */
180     {0x39, 0},          /* CAPS_LOCK */
181     {0x53, 0},          /* NUM_LOCK */
182     {0x49, 0},          /* INSERT */
183     {0x4a, 0},          /* HOME */
184     {0x4b, 0},          /* PAGE_UP */
185     {0x4e, 0},          /* PAGE_DOWN */
186
187     {0x4f, 0},          /* RIGHT_ARROW */
188     {0x50, 0},          /* LEFT_ARROW */
189     {0x51, 0},          /* DOWN_ARROW */
190     {0x52, 0},          /* UP_ARROW */
191 };
192
193 #else
194 /* UK keyboard */
195 #define KEYMAP_SIZE (152)
196 const KEYMAP keymap[KEYMAP_SIZE] = {
197     {0, 0},             /* NUL */
198     {0, 0},             /* SOH */
199     {0, 0},             /* STX */
200     {0, 0},             /* ETX */
201     {0, 0},             /* EOT */
202     {0, 0},             /* ENQ */
203     {0, 0},             /* ACK */
204     {0, 0},             /* BEL */
205     {0x2a, 0},          /* BS  */  /* Keyboard Delete (Backspace) */
206     {0x2b, 0},          /* TAB */  /* Keyboard Tab */
207     {0x28, 0},          /* LF  */  /* Keyboard Return (Enter) */
208     {0, 0},             /* VT  */
209     {0, 0},             /* FF  */
210     {0, 0},             /* CR  */
211     {0, 0},             /* SO  */
212     {0, 0},             /* SI  */
213     {0, 0},             /* DEL */
214     {0, 0},             /* DC1 */
215     {0, 0},             /* DC2 */
216     {0, 0},             /* DC3 */
217     {0, 0},             /* DC4 */
218     {0, 0},             /* NAK */
219     {0, 0},             /* SYN */
220     {0, 0},             /* ETB */
221     {0, 0},             /* CAN */
222     {0, 0},             /* EM  */
223     {0, 0},             /* SUB */
224     {0, 0},             /* ESC */
225     {0, 0},             /* FS  */
226     {0, 0},             /* GS  */
227     {0, 0},             /* RS  */
228     {0, 0},             /* US  */
229     {0x2c, 0},          /*   */
230     {0x1e, KEY_SHIFT},      /* ! */
231     {0x1f, KEY_SHIFT},      /* " */
232     {0x32, 0},          /* # */
233     {0x21, KEY_SHIFT},      /* $ */
234     {0x22, KEY_SHIFT},      /* % */
235     {0x24, KEY_SHIFT},      /* & */
236     {0x34, 0},          /* ' */
237     {0x26, KEY_SHIFT},      /* ( */
238     {0x27, KEY_SHIFT},      /* ) */
239     {0x25, KEY_SHIFT},      /* * */
240     {0x2e, KEY_SHIFT},      /* + */
241     {0x36, 0},          /* , */
242     {0x2d, 0},          /* - */
243     {0x37, 0},          /* . */
244     {0x38, 0},          /* / */
245     {0x27, 0},          /* 0 */
246     {0x1e, 0},          /* 1 */
247     {0x1f, 0},          /* 2 */
248     {0x20, 0},          /* 3 */
249     {0x21, 0},          /* 4 */
250     {0x22, 0},          /* 5 */
251     {0x23, 0},          /* 6 */
252     {0x24, 0},          /* 7 */
253     {0x25, 0},          /* 8 */
254     {0x26, 0},          /* 9 */
255     {0x33, KEY_SHIFT},      /* : */
256     {0x33, 0},          /* ; */
257     {0x36, KEY_SHIFT},      /* < */
258     {0x2e, 0},          /* = */
259     {0x37, KEY_SHIFT},      /* > */
260     {0x38, KEY_SHIFT},      /* ? */
261     {0x34, KEY_SHIFT},      /* @ */
262     {0x04, KEY_SHIFT},      /* A */
263     {0x05, KEY_SHIFT},      /* B */
264     {0x06, KEY_SHIFT},      /* C */
265     {0x07, KEY_SHIFT},      /* D */
266     {0x08, KEY_SHIFT},      /* E */
267     {0x09, KEY_SHIFT},      /* F */
268     {0x0a, KEY_SHIFT},      /* G */
269     {0x0b, KEY_SHIFT},      /* H */
270     {0x0c, KEY_SHIFT},      /* I */
271     {0x0d, KEY_SHIFT},      /* J */
272     {0x0e, KEY_SHIFT},      /* K */
273     {0x0f, KEY_SHIFT},      /* L */
274     {0x10, KEY_SHIFT},      /* M */
275     {0x11, KEY_SHIFT},      /* N */
276     {0x12, KEY_SHIFT},      /* O */
277     {0x13, KEY_SHIFT},      /* P */
278     {0x14, KEY_SHIFT},      /* Q */
279     {0x15, KEY_SHIFT},      /* R */
280     {0x16, KEY_SHIFT},      /* S */
281     {0x17, KEY_SHIFT},      /* T */
282     {0x18, KEY_SHIFT},      /* U */
283     {0x19, KEY_SHIFT},      /* V */
284     {0x1a, KEY_SHIFT},      /* W */
285     {0x1b, KEY_SHIFT},      /* X */
286     {0x1c, KEY_SHIFT},      /* Y */
287     {0x1d, KEY_SHIFT},      /* Z */
288     {0x2f, 0},          /* [ */
289     {0x64, 0},          /* \ */
290     {0x30, 0},          /* ] */
291     {0x23, KEY_SHIFT},      /* ^ */
292     {0x2d, KEY_SHIFT},      /* _ */
293     {0x35, 0},          /* ` */
294     {0x04, 0},          /* a */
295     {0x05, 0},          /* b */
296     {0x06, 0},          /* c */
297     {0x07, 0},          /* d */
298     {0x08, 0},          /* e */
299     {0x09, 0},          /* f */
300     {0x0a, 0},          /* g */
301     {0x0b, 0},          /* h */
302     {0x0c, 0},          /* i */
303     {0x0d, 0},          /* j */
304     {0x0e, 0},          /* k */
305     {0x0f, 0},          /* l */
306     {0x10, 0},          /* m */
307     {0x11, 0},          /* n */
308     {0x12, 0},          /* o */
309     {0x13, 0},          /* p */
310     {0x14, 0},          /* q */
311     {0x15, 0},          /* r */
312     {0x16, 0},          /* s */
313     {0x17, 0},          /* t */
314     {0x18, 0},          /* u */
315     {0x19, 0},          /* v */
316     {0x1a, 0},          /* w */
317     {0x1b, 0},          /* x */
318     {0x1c, 0},          /* y */
319     {0x1d, 0},          /* z */
320     {0x2f, KEY_SHIFT},      /* { */
321     {0x64, KEY_SHIFT},      /* | */
322     {0x30, KEY_SHIFT},      /* } */
323     {0x32, KEY_SHIFT},      /* ~ */
324     {0,0},             /* DEL */
325
326     {0x3a, 0},          /* F1 */
327     {0x3b, 0},          /* F2 */
328     {0x3c, 0},          /* F3 */
329     {0x3d, 0},          /* F4 */
330     {0x3e, 0},          /* F5 */
331     {0x3f, 0},          /* F6 */
332     {0x40, 0},          /* F7 */
333     {0x41, 0},          /* F8 */
334     {0x42, 0},          /* F9 */
335     {0x43, 0},          /* F10 */
336     {0x44, 0},          /* F11 */
337     {0x45, 0},          /* F12 */
338
339     {0x46, 0},          /* PRINT_SCREEN */
340     {0x47, 0},          /* SCROLL_LOCK */
341     {0x39, 0},          /* CAPS_LOCK */
342     {0x53, 0},          /* NUM_LOCK */
343     {0x49, 0},          /* INSERT */
344     {0x4a, 0},          /* HOME */
345     {0x4b, 0},          /* PAGE_UP */
346     {0x4e, 0},          /* PAGE_DOWN */
347
348     {0x4f, 0},          /* RIGHT_ARROW */
349     {0x50, 0},          /* LEFT_ARROW */
350     {0x51, 0},          /* DOWN_ARROW */
351     {0x52, 0},          /* UP_ARROW */
352 };
353 #endif
354
355 uint8_t * USBKeyboard::reportDesc() {
356     static uint8_t reportDescriptor[] = {
357         USAGE_PAGE(1), 0x01,                    // Generic Desktop
358         USAGE(1), 0x06,                         // Keyboard
359         COLLECTION(1), 0x01,                    // Application
360         REPORT_ID(1),       REPORT_ID_KEYBOARD,
361
362         USAGE_PAGE(1), 0x07,                    // Key Codes
363         USAGE_MINIMUM(1), 0xE0,
364         USAGE_MAXIMUM(1), 0xE7,
365         LOGICAL_MINIMUM(1), 0x00,
366         LOGICAL_MAXIMUM(1), 0x01,
367         REPORT_SIZE(1), 0x01,
368         REPORT_COUNT(1), 0x08,
369         INPUT(1), 0x02,                         // Data, Variable, Absolute
370         REPORT_COUNT(1), 0x01,
371         REPORT_SIZE(1), 0x08,
372         INPUT(1), 0x01,                         // Constant
373
374
375         REPORT_COUNT(1), 0x05,
376         REPORT_SIZE(1), 0x01,
377         USAGE_PAGE(1), 0x08,                    // LEDs
378         USAGE_MINIMUM(1), 0x01,
379         USAGE_MAXIMUM(1), 0x05,
380         OUTPUT(1), 0x02,                        // Data, Variable, Absolute
381         REPORT_COUNT(1), 0x01,
382         REPORT_SIZE(1), 0x03,
383         OUTPUT(1), 0x01,                        // Constant
384
385
386         REPORT_COUNT(1), 0x06,
387         REPORT_SIZE(1), 0x08,
388         LOGICAL_MINIMUM(1), 0x00,
389         LOGICAL_MAXIMUM(1), 0x65,
390         USAGE_PAGE(1), 0x07,                    // Key Codes
391         USAGE_MINIMUM(1), 0x00,
392         USAGE_MAXIMUM(1), 0x65,
393         INPUT(1), 0x00,                         // Data, Array
394         END_COLLECTION(0),
395
396         // Media Control
397         USAGE_PAGE(1), 0x0C,
398         USAGE(1), 0x01,
399         COLLECTION(1), 0x01,
400         REPORT_ID(1), REPORT_ID_VOLUME,
401         USAGE_PAGE(1), 0x0C,
402         LOGICAL_MINIMUM(1), 0x00,
403         LOGICAL_MAXIMUM(1), 0x01,
404         REPORT_SIZE(1), 0x01,
405         REPORT_COUNT(1), 0x07,
406         USAGE(1), 0xB5,             // Next Track
407         USAGE(1), 0xB6,             // Previous Track
408         USAGE(1), 0xB7,             // Stop
409         USAGE(1), 0xCD,             // Play / Pause
410         USAGE(1), 0xE2,             // Mute
411         USAGE(1), 0xE9,             // Volume Up
412         USAGE(1), 0xEA,             // Volume Down
413         INPUT(1), 0x02,             // Input (Data, Variable, Absolute)
414         REPORT_COUNT(1), 0x01,
415         INPUT(1), 0x01,
416         END_COLLECTION(0),
417     };
418     reportLength = sizeof(reportDescriptor);
419     return reportDescriptor;
420 }
421
422
423 bool USBKeyboard::EPINT_OUT_callback() {
424     uint32_t bytesRead = 0;
425     uint8_t led[65];
426     USBDevice::readEP(EPINT_OUT, led, &bytesRead, MAX_HID_REPORT_SIZE);
427
428     // we take led[1] because led[0] is the report ID
429     lock_status = led[1] & 0x07;
430
431     // We activate the endpoint to be able to recceive data
432     if (!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
433         return false;
434     return true;
435 }
436
437 uint8_t USBKeyboard::lockStatus() {
438     return lock_status;
439 }
440
441 int USBKeyboard::_putc(int c) {
442     return keyCode(c, keymap[c].modifier);
443 }
444
445 bool USBKeyboard::keyCode(uint8_t key, uint8_t modifier) {
446     // Send a simulated keyboard keypress. Returns true if successful.
447     HID_REPORT report;
448
449     report.data[0] = REPORT_ID_KEYBOARD;
450     report.data[1] = modifier;
451     report.data[2] = 0;
452     report.data[3] = keymap[key].usage;
453     report.data[4] = 0;
454     report.data[5] = 0;
455     report.data[6] = 0;
456     report.data[7] = 0;
457     report.data[8] = 0;
458
459     report.length = 9;
460
461     if (!send(&report)) {
462         return false;
463     }
464
465     report.data[1] = 0;
466     report.data[3] = 0;
467
468     if (!send(&report)) {
469         return false;
470     }
471
472     return true;
473
474 }
475
476
477 bool USBKeyboard::mediaControl(MEDIA_KEY key) {
478     HID_REPORT report;
479
480     report.data[0] = REPORT_ID_VOLUME;
481     report.data[1] = (1 << key) & 0x7f;
482
483     report.length = 2;
484
485     if (!send(&report)) {
486         return false;
487     }
488
489     report.data[0] = REPORT_ID_VOLUME;
490     report.data[1] = 0;
491
492     report.length = 2;
493
494     return send(&report);
495 }
496
497
498 #define DEFAULT_CONFIGURATION (1)
499 #define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \
500                                + (1 * INTERFACE_DESCRIPTOR_LENGTH) \
501                                + (1 * HID_DESCRIPTOR_LENGTH) \
502                                + (2 * ENDPOINT_DESCRIPTOR_LENGTH))
503
504 uint8_t * USBKeyboard::configurationDesc() {
505     static uint8_t configurationDescriptor[] = {
506         CONFIGURATION_DESCRIPTOR_LENGTH,// bLength
507         CONFIGURATION_DESCRIPTOR,       // bDescriptorType
508         LSB(TOTAL_DESCRIPTOR_LENGTH),   // wTotalLength (LSB)
509         MSB(TOTAL_DESCRIPTOR_LENGTH),   // wTotalLength (MSB)
510         0x01,                           // bNumInterfaces
511         DEFAULT_CONFIGURATION,          // bConfigurationValue
512         0x00,                           // iConfiguration
513         C_RESERVED | C_SELF_POWERED,    // bmAttributes
514         C_POWER(0),                     // bMaxPowerHello World from Mbed
515
516         INTERFACE_DESCRIPTOR_LENGTH,    // bLength
517         INTERFACE_DESCRIPTOR,           // bDescriptorType
518         0x00,                           // bInterfaceNumber
519         0x00,                           // bAlternateSetting
520         0x02,                           // bNumEndpoints
521         HID_CLASS,                      // bInterfaceClass
522         1,                              // bInterfaceSubClass
523         1,                              // bInterfaceProtocol (keyboard)
524         0x00,                           // iInterface
525
526         HID_DESCRIPTOR_LENGTH,          // bLength
527         HID_DESCRIPTOR,                 // bDescriptorType
528         LSB(HID_VERSION_1_11),          // bcdHID (LSB)
529         MSB(HID_VERSION_1_11),          // bcdHID (MSB)
530         0x00,                           // bCountryCode
531         0x01,                           // bNumDescriptors
532         REPORT_DESCRIPTOR,              // bDescriptorType
533         (uint8_t)(LSB(reportDescLength())),  // wDescriptorLength (LSB)
534         (uint8_t)(MSB(reportDescLength())),  // wDescriptorLength (MSB)
535
536         ENDPOINT_DESCRIPTOR_LENGTH,     // bLength
537         ENDPOINT_DESCRIPTOR,            // bDescriptorType
538         PHY_TO_DESC(EPINT_IN),          // bEndpointAddress
539         E_INTERRUPT,                    // bmAttributes
540         LSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (LSB)
541         MSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (MSB)
542         1,                             // bInterval (milliseconds)
543
544         ENDPOINT_DESCRIPTOR_LENGTH,     // bLength
545         ENDPOINT_DESCRIPTOR,            // bDescriptorType
546         PHY_TO_DESC(EPINT_OUT),          // bEndpointAddress
547         E_INTERRUPT,                    // bmAttributes
548         LSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (LSB)
549         MSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (MSB)
550         1,                             // bInterval (milliseconds)
551     };
552     return configurationDescriptor;
553 }