USB device stack - modified

Dependents:   shaun_larada

Fork of USBDevice by mbed official

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers USBKeyboard.cpp Source File

USBKeyboard.cpp

00001 /* Copyright (c) 2010-2011 mbed.org, MIT License
00002 *
00003 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
00004 * and associated documentation files (the "Software"), to deal in the Software without
00005 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
00006 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
00007 * Software is furnished to do so, subject to the following conditions:
00008 *
00009 * The above copyright notice and this permission notice shall be included in all copies or
00010 * substantial portions of the Software.
00011 *
00012 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
00013 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00014 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
00015 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00016 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00017 */
00018 
00019 #include "stdint.h"
00020 
00021 #include "USBKeyboard.h"
00022 
00023 #define REPORT_ID_KEYBOARD 1
00024 #define REPORT_ID_VOLUME   3
00025 
00026 
00027 typedef struct
00028 {
00029     unsigned char usage;
00030     unsigned char modifier;
00031 } KEYMAP;
00032 
00033 #ifdef US_KEYBOARD
00034 /* US keyboard (as HID standard) */
00035 #define KEYMAP_SIZE (152)
00036 const KEYMAP keymap[KEYMAP_SIZE] =
00037 {
00038     {0, 0},             /* NUL */
00039     {0, 0},             /* SOH */
00040     {0, 0},             /* STX */
00041     {0, 0},             /* ETX */
00042     {0, 0},             /* EOT */
00043     {0, 0},             /* ENQ */
00044     {0, 0},             /* ACK */
00045     {0, 0},             /* BEL */
00046     {0x2a, 0},          /* BS  */  /* Keyboard Delete (Backspace) */
00047     {0x2b, 0},          /* TAB */  /* Keyboard Tab */
00048     {0x28, 0},          /* LF  */  /* Keyboard Return (Enter) */
00049     {0, 0},             /* VT  */
00050     {0, 0},             /* FF  */
00051     {0, 0},             /* CR  */
00052     {0, 0},             /* SO  */
00053     {0, 0},             /* SI  */
00054     {0, 0},             /* DEL */
00055     {0, 0},             /* DC1 */
00056     {0, 0},             /* DC2 */
00057     {0, 0},             /* DC3 */
00058     {0, 0},             /* DC4 */
00059     {0, 0},             /* NAK */
00060     {0, 0},             /* SYN */
00061     {0, 0},             /* ETB */
00062     {0, 0},             /* CAN */
00063     {0, 0},             /* EM  */
00064     {0, 0},             /* SUB */
00065     {0, 0},             /* ESC */
00066     {0, 0},             /* FS  */
00067     {0, 0},             /* GS  */
00068     {0, 0},             /* RS  */
00069     {0, 0},             /* US  */
00070     {0x2c, 0},          /*   */
00071     {0x1e, KEY_SHIFT},      /* ! */
00072     {0x34, KEY_SHIFT},      /* " */
00073     {0x20, KEY_SHIFT},      /* # */
00074     {0x21, KEY_SHIFT},      /* $ */
00075     {0x22, KEY_SHIFT},      /* % */
00076     {0x24, KEY_SHIFT},      /* & */
00077     {0x34, 0},          /* ' */
00078     {0x26, KEY_SHIFT},      /* ( */
00079     {0x27, KEY_SHIFT},      /* ) */
00080     {0x25, KEY_SHIFT},      /* * */
00081     {0x2e, KEY_SHIFT},      /* + */
00082     {0x36, 0},          /* , */
00083     {0x2d, 0},          /* - */
00084     {0x37, 0},          /* . */
00085     {0x38, 0},          /* / */
00086     {0x27, 0},          /* 0 */
00087     {0x1e, 0},          /* 1 */
00088     {0x1f, 0},          /* 2 */
00089     {0x20, 0},          /* 3 */
00090     {0x21, 0},          /* 4 */
00091     {0x22, 0},          /* 5 */
00092     {0x23, 0},          /* 6 */
00093     {0x24, 0},          /* 7 */
00094     {0x25, 0},          /* 8 */
00095     {0x26, 0},          /* 9 */
00096     {0x33, KEY_SHIFT},      /* : */
00097     {0x33, 0},          /* ; */
00098     {0x36, KEY_SHIFT},      /* < */
00099     {0x2e, 0},          /* = */
00100     {0x37, KEY_SHIFT},      /* > */
00101     {0x38, KEY_SHIFT},      /* ? */
00102     {0x1f, KEY_SHIFT},      /* @ */
00103     {0x04, KEY_SHIFT},      /* A */
00104     {0x05, KEY_SHIFT},      /* B */
00105     {0x06, KEY_SHIFT},      /* C */
00106     {0x07, KEY_SHIFT},      /* D */
00107     {0x08, KEY_SHIFT},      /* E */
00108     {0x09, KEY_SHIFT},      /* F */
00109     {0x0a, KEY_SHIFT},      /* G */
00110     {0x0b, KEY_SHIFT},      /* H */
00111     {0x0c, KEY_SHIFT},      /* I */
00112     {0x0d, KEY_SHIFT},      /* J */
00113     {0x0e, KEY_SHIFT},      /* K */
00114     {0x0f, KEY_SHIFT},      /* L */
00115     {0x10, KEY_SHIFT},      /* M */
00116     {0x11, KEY_SHIFT},      /* N */
00117     {0x12, KEY_SHIFT},      /* O */
00118     {0x13, KEY_SHIFT},      /* P */
00119     {0x14, KEY_SHIFT},      /* Q */
00120     {0x15, KEY_SHIFT},      /* R */
00121     {0x16, KEY_SHIFT},      /* S */
00122     {0x17, KEY_SHIFT},      /* T */
00123     {0x18, KEY_SHIFT},      /* U */
00124     {0x19, KEY_SHIFT},      /* V */
00125     {0x1a, KEY_SHIFT},      /* W */
00126     {0x1b, KEY_SHIFT},      /* X */
00127     {0x1c, KEY_SHIFT},      /* Y */
00128     {0x1d, KEY_SHIFT},      /* Z */
00129     {0x2f, 0},          /* [ */
00130     {0x31, 0},          /* \ */
00131     {0x30, 0},          /* ] */
00132     {0x23, KEY_SHIFT},      /* ^ */
00133     {0x2d, KEY_SHIFT},      /* _ */
00134     {0x35, 0},          /* ` */
00135     {0x04, 0},          /* a */
00136     {0x05, 0},          /* b */
00137     {0x06, 0},          /* c */
00138     {0x07, 0},          /* d */
00139     {0x08, 0},          /* e */
00140     {0x09, 0},          /* f */
00141     {0x0a, 0},          /* g */
00142     {0x0b, 0},          /* h */
00143     {0x0c, 0},          /* i */
00144     {0x0d, 0},          /* j */
00145     {0x0e, 0},          /* k */
00146     {0x0f, 0},          /* l */
00147     {0x10, 0},          /* m */
00148     {0x11, 0},          /* n */
00149     {0x12, 0},          /* o */
00150     {0x13, 0},          /* p */
00151     {0x14, 0},          /* q */
00152     {0x15, 0},          /* r */
00153     {0x16, 0},          /* s */
00154     {0x17, 0},          /* t */
00155     {0x18, 0},          /* u */
00156     {0x19, 0},          /* v */
00157     {0x1a, 0},          /* w */
00158     {0x1b, 0},          /* x */
00159     {0x1c, 0},          /* y */
00160     {0x1d, 0},          /* z */
00161     {0x2f, KEY_SHIFT},      /* { */
00162     {0x31, KEY_SHIFT},      /* | */
00163     {0x30, KEY_SHIFT},      /* } */
00164     {0x35, KEY_SHIFT},      /* ~ */
00165     {0, 0},             /* DEL */
00166 
00167     {0x3a, 0},          /* F1 */
00168     {0x3b, 0},          /* F2 */
00169     {0x3c, 0},          /* F3 */
00170     {0x3d, 0},          /* F4 */
00171     {0x3e, 0},          /* F5 */
00172     {0x3f, 0},          /* F6 */
00173     {0x40, 0},          /* F7 */
00174     {0x41, 0},          /* F8 */
00175     {0x42, 0},          /* F9 */
00176     {0x43, 0},          /* F10 */
00177     {0x44, 0},          /* F11 */
00178     {0x45, 0},          /* F12 */
00179 
00180     {0x46, 0},          /* PRINT_SCREEN */
00181     {0x47, 0},          /* SCROLL_LOCK */
00182     {0x39, 0},          /* CAPS_LOCK */
00183     {0x53, 0},          /* NUM_LOCK */
00184     {0x49, 0},          /* INSERT */
00185     {0x4a, 0},          /* HOME */
00186     {0x4b, 0},          /* PAGE_UP */
00187     {0x4e, 0},          /* PAGE_DOWN */
00188 
00189     {0x4f, 0},          /* RIGHT_ARROW */
00190     {0x50, 0},          /* LEFT_ARROW */
00191     {0x51, 0},          /* DOWN_ARROW */
00192     {0x52, 0},          /* UP_ARROW */
00193 };
00194 
00195 #else
00196 /* UK keyboard */
00197 #define KEYMAP_SIZE (152)
00198 const KEYMAP keymap[KEYMAP_SIZE] =
00199 {
00200     {0, 0},             /* NUL */
00201     {0, 0},             /* SOH */
00202     {0, 0},             /* STX */
00203     {0, 0},             /* ETX */
00204     {0, 0},             /* EOT */
00205     {0, 0},             /* ENQ */
00206     {0, 0},             /* ACK */
00207     {0, 0},             /* BEL */
00208     {0x2a, 0},          /* BS  */  /* Keyboard Delete (Backspace) */
00209     {0x2b, 0},          /* TAB */  /* Keyboard Tab */
00210     {0x28, 0},          /* LF  */  /* Keyboard Return (Enter) */
00211     {0, 0},             /* VT  */
00212     {0, 0},             /* FF  */
00213     {0, 0},             /* CR  */
00214     {0, 0},             /* SO  */
00215     {0, 0},             /* SI  */
00216     {0, 0},             /* DEL */
00217     {0, 0},             /* DC1 */
00218     {0, 0},             /* DC2 */
00219     {0, 0},             /* DC3 */
00220     {0, 0},             /* DC4 */
00221     {0, 0},             /* NAK */
00222     {0, 0},             /* SYN */
00223     {0, 0},             /* ETB */
00224     {0, 0},             /* CAN */
00225     {0, 0},             /* EM  */
00226     {0, 0},             /* SUB */
00227     {0, 0},             /* ESC */
00228     {0, 0},             /* FS  */
00229     {0, 0},             /* GS  */
00230     {0, 0},             /* RS  */
00231     {0, 0},             /* US  */
00232     {0x2c, 0},          /*   */
00233     {0x1e, KEY_SHIFT},      /* ! */
00234     {0x1f, KEY_SHIFT},      /* " */
00235     {0x32, 0},          /* # */
00236     {0x21, KEY_SHIFT},      /* $ */
00237     {0x22, KEY_SHIFT},      /* % */
00238     {0x24, KEY_SHIFT},      /* & */
00239     {0x34, 0},          /* ' */
00240     {0x26, KEY_SHIFT},      /* ( */
00241     {0x27, KEY_SHIFT},      /* ) */
00242     {0x25, KEY_SHIFT},      /* * */
00243     {0x2e, KEY_SHIFT},      /* + */
00244     {0x36, 0},          /* , */
00245     {0x2d, 0},          /* - */
00246     {0x37, 0},          /* . */
00247     {0x38, 0},          /* / */
00248     {0x27, 0},          /* 0 */
00249     {0x1e, 0},          /* 1 */
00250     {0x1f, 0},          /* 2 */
00251     {0x20, 0},          /* 3 */
00252     {0x21, 0},          /* 4 */
00253     {0x22, 0},          /* 5 */
00254     {0x23, 0},          /* 6 */
00255     {0x24, 0},          /* 7 */
00256     {0x25, 0},          /* 8 */
00257     {0x26, 0},          /* 9 */
00258     {0x33, KEY_SHIFT},      /* : */
00259     {0x33, 0},          /* ; */
00260     {0x36, KEY_SHIFT},      /* < */
00261     {0x2e, 0},          /* = */
00262     {0x37, KEY_SHIFT},      /* > */
00263     {0x38, KEY_SHIFT},      /* ? */
00264     {0x34, KEY_SHIFT},      /* @ */
00265     {0x04, KEY_SHIFT},      /* A */
00266     {0x05, KEY_SHIFT},      /* B */
00267     {0x06, KEY_SHIFT},      /* C */
00268     {0x07, KEY_SHIFT},      /* D */
00269     {0x08, KEY_SHIFT},      /* E */
00270     {0x09, KEY_SHIFT},      /* F */
00271     {0x0a, KEY_SHIFT},      /* G */
00272     {0x0b, KEY_SHIFT},      /* H */
00273     {0x0c, KEY_SHIFT},      /* I */
00274     {0x0d, KEY_SHIFT},      /* J */
00275     {0x0e, KEY_SHIFT},      /* K */
00276     {0x0f, KEY_SHIFT},      /* L */
00277     {0x10, KEY_SHIFT},      /* M */
00278     {0x11, KEY_SHIFT},      /* N */
00279     {0x12, KEY_SHIFT},      /* O */
00280     {0x13, KEY_SHIFT},      /* P */
00281     {0x14, KEY_SHIFT},      /* Q */
00282     {0x15, KEY_SHIFT},      /* R */
00283     {0x16, KEY_SHIFT},      /* S */
00284     {0x17, KEY_SHIFT},      /* T */
00285     {0x18, KEY_SHIFT},      /* U */
00286     {0x19, KEY_SHIFT},      /* V */
00287     {0x1a, KEY_SHIFT},      /* W */
00288     {0x1b, KEY_SHIFT},      /* X */
00289     {0x1c, KEY_SHIFT},      /* Y */
00290     {0x1d, KEY_SHIFT},      /* Z */
00291     {0x2f, 0},          /* [ */
00292     {0x64, 0},          /* \ */
00293     {0x30, 0},          /* ] */
00294     {0x23, KEY_SHIFT},      /* ^ */
00295     {0x2d, KEY_SHIFT},      /* _ */
00296     {0x35, 0},          /* ` */
00297     {0x04, 0},          /* a */
00298     {0x05, 0},          /* b */
00299     {0x06, 0},          /* c */
00300     {0x07, 0},          /* d */
00301     {0x08, 0},          /* e */
00302     {0x09, 0},          /* f */
00303     {0x0a, 0},          /* g */
00304     {0x0b, 0},          /* h */
00305     {0x0c, 0},          /* i */
00306     {0x0d, 0},          /* j */
00307     {0x0e, 0},          /* k */
00308     {0x0f, 0},          /* l */
00309     {0x10, 0},          /* m */
00310     {0x11, 0},          /* n */
00311     {0x12, 0},          /* o */
00312     {0x13, 0},          /* p */
00313     {0x14, 0},          /* q */
00314     {0x15, 0},          /* r */
00315     {0x16, 0},          /* s */
00316     {0x17, 0},          /* t */
00317     {0x18, 0},          /* u */
00318     {0x19, 0},          /* v */
00319     {0x1a, 0},          /* w */
00320     {0x1b, 0},          /* x */
00321     {0x1c, 0},          /* y */
00322     {0x1d, 0},          /* z */
00323     {0x2f, KEY_SHIFT},      /* { */
00324     {0x64, KEY_SHIFT},      /* | */
00325     {0x30, KEY_SHIFT},      /* } */
00326     {0x32, KEY_SHIFT},      /* ~ */
00327     {0, 0},            /* DEL */
00328 
00329     {0x3a, 0},          /* F1 */
00330     {0x3b, 0},          /* F2 */
00331     {0x3c, 0},          /* F3 */
00332     {0x3d, 0},          /* F4 */
00333     {0x3e, 0},          /* F5 */
00334     {0x3f, 0},          /* F6 */
00335     {0x40, 0},          /* F7 */
00336     {0x41, 0},          /* F8 */
00337     {0x42, 0},          /* F9 */
00338     {0x43, 0},          /* F10 */
00339     {0x44, 0},          /* F11 */
00340     {0x45, 0},          /* F12 */
00341 
00342     {0x46, 0},          /* PRINT_SCREEN */
00343     {0x47, 0},          /* SCROLL_LOCK */
00344     {0x39, 0},          /* CAPS_LOCK */
00345     {0x53, 0},          /* NUM_LOCK */
00346     {0x49, 0},          /* INSERT */
00347     {0x4a, 0},          /* HOME */
00348     {0x4b, 0},          /* PAGE_UP */
00349     {0x4e, 0},          /* PAGE_DOWN */
00350 
00351     {0x4f, 0},          /* RIGHT_ARROW */
00352     {0x50, 0},          /* LEFT_ARROW */
00353     {0x51, 0},          /* DOWN_ARROW */
00354     {0x52, 0},          /* UP_ARROW */
00355 };
00356 #endif
00357 
00358 uint8_t *USBKeyboard::reportDesc()
00359 {
00360     static uint8_t reportDescriptor[] =
00361     {
00362         USAGE_PAGE( 1 ), 0x01,                  // Generic Desktop
00363         USAGE( 1 ), 0x06,                       // Keyboard
00364         COLLECTION( 1 ), 0x01,                  // Application
00365         REPORT_ID( 1 ),       REPORT_ID_KEYBOARD,
00366 
00367         USAGE_PAGE( 1 ), 0x07,                  // Key Codes
00368         USAGE_MINIMUM( 1 ), 0xE0,
00369         USAGE_MAXIMUM( 1 ), 0xE7,
00370         LOGICAL_MINIMUM( 1 ), 0x00,
00371         LOGICAL_MAXIMUM( 1 ), 0x01,
00372         REPORT_SIZE( 1 ), 0x01,
00373         REPORT_COUNT( 1 ), 0x08,
00374         INPUT( 1 ), 0x02,                       // Data, Variable, Absolute
00375         REPORT_COUNT( 1 ), 0x01,
00376         REPORT_SIZE( 1 ), 0x08,
00377         INPUT( 1 ), 0x01,                       // Constant
00378 
00379 
00380         REPORT_COUNT( 1 ), 0x05,
00381         REPORT_SIZE( 1 ), 0x01,
00382         USAGE_PAGE( 1 ), 0x08,                  // LEDs
00383         USAGE_MINIMUM( 1 ), 0x01,
00384         USAGE_MAXIMUM( 1 ), 0x05,
00385         OUTPUT( 1 ), 0x02,                      // Data, Variable, Absolute
00386         REPORT_COUNT( 1 ), 0x01,
00387         REPORT_SIZE( 1 ), 0x03,
00388         OUTPUT( 1 ), 0x01,                      // Constant
00389 
00390 
00391         REPORT_COUNT( 1 ), 0x06,
00392         REPORT_SIZE( 1 ), 0x08,
00393         LOGICAL_MINIMUM( 1 ), 0x00,
00394         LOGICAL_MAXIMUM( 1 ), 0x65,
00395         USAGE_PAGE( 1 ), 0x07,                  // Key Codes
00396         USAGE_MINIMUM( 1 ), 0x00,
00397         USAGE_MAXIMUM( 1 ), 0x65,
00398         INPUT( 1 ), 0x00,                       // Data, Array
00399         END_COLLECTION( 0 ),
00400 
00401         // Media Control
00402         USAGE_PAGE( 1 ), 0x0C,
00403         USAGE( 1 ), 0x01,
00404         COLLECTION( 1 ), 0x01,
00405         REPORT_ID( 1 ), REPORT_ID_VOLUME,
00406         USAGE_PAGE( 1 ), 0x0C,
00407         LOGICAL_MINIMUM( 1 ), 0x00,
00408         LOGICAL_MAXIMUM( 1 ), 0x01,
00409         REPORT_SIZE( 1 ), 0x01,
00410         REPORT_COUNT( 1 ), 0x07,
00411         USAGE( 1 ), 0xB5,           // Next Track
00412         USAGE( 1 ), 0xB6,           // Previous Track
00413         USAGE( 1 ), 0xB7,           // Stop
00414         USAGE( 1 ), 0xCD,           // Play / Pause
00415         USAGE( 1 ), 0xE2,           // Mute
00416         USAGE( 1 ), 0xE9,           // Volume Up
00417         USAGE( 1 ), 0xEA,           // Volume Down
00418         INPUT( 1 ), 0x02,           // Input (Data, Variable, Absolute)
00419         REPORT_COUNT( 1 ), 0x01,
00420         INPUT( 1 ), 0x01,
00421         END_COLLECTION( 0 ),
00422     };
00423     reportLength = sizeof( reportDescriptor );
00424     return reportDescriptor;
00425 }
00426 
00427 
00428 bool USBKeyboard::EP1_OUT_callback()
00429 {
00430     uint32_t bytesRead = 0;
00431     uint8_t led[65];
00432     USBDevice::readEP( EPINT_OUT, led, &bytesRead, MAX_HID_REPORT_SIZE );
00433     // we take led[1] because led[0] is the report ID
00434     lock_status = led[1] & 0x07;
00435 
00436     // We activate the endpoint to be able to recceive data
00437     if ( !readStart( EPINT_OUT, MAX_HID_REPORT_SIZE ) )
00438     {
00439         return false;
00440     }
00441 
00442     return true;
00443 }
00444 
00445 uint8_t USBKeyboard::lockStatus()
00446 {
00447     return lock_status;
00448 }
00449 
00450 int USBKeyboard::_putc( int c )
00451 {
00452     return keyCode( c, keymap[c].modifier );
00453 }
00454 
00455 bool USBKeyboard::keyCode( uint8_t key, uint8_t modifier )
00456 {
00457     // Send a simulated keyboard keypress. Returns true if successful.
00458     HID_REPORT report;
00459     report.data[0] = REPORT_ID_KEYBOARD;
00460     report.data[1] = modifier;
00461     report.data[2] = 0;
00462     report.data[3] = keymap[key].usage;
00463     report.data[4] = 0;
00464     report.data[5] = 0;
00465     report.data[6] = 0;
00466     report.data[7] = 0;
00467     report.data[8] = 0;
00468     report.length = 9;
00469 
00470     if ( !send( &report ) )
00471     {
00472         return false;
00473     }
00474 
00475     report.data[1] = 0;
00476     report.data[3] = 0;
00477 
00478     if ( !send( &report ) )
00479     {
00480         return false;
00481     }
00482 
00483     return true;
00484 }
00485 
00486 
00487 bool USBKeyboard::mediaControl( MEDIA_KEY key )
00488 {
00489     HID_REPORT report;
00490     report.data[0] = REPORT_ID_VOLUME;
00491     report.data[1] = ( 1 << key ) & 0x7f;
00492     report.length = 2;
00493 
00494     if ( !send( &report ) )
00495     {
00496         return false;
00497     }
00498 
00499     report.data[0] = REPORT_ID_VOLUME;
00500     report.data[1] = 0;
00501     report.length = 2;
00502     return send( &report );
00503 }
00504 
00505 
00506 #define DEFAULT_CONFIGURATION (1)
00507 #define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \
00508                                  + (1 * INTERFACE_DESCRIPTOR_LENGTH) \
00509                                  + (1 * HID_DESCRIPTOR_LENGTH) \
00510                                  + (2 * ENDPOINT_DESCRIPTOR_LENGTH))
00511 
00512 uint8_t *USBKeyboard::configurationDesc()
00513 {
00514     static uint8_t configurationDescriptor[] =
00515     {
00516         CONFIGURATION_DESCRIPTOR_LENGTH,// bLength
00517         CONFIGURATION_DESCRIPTOR,       // bDescriptorType
00518         LSB( TOTAL_DESCRIPTOR_LENGTH ), // wTotalLength (LSB)
00519         MSB( TOTAL_DESCRIPTOR_LENGTH ), // wTotalLength (MSB)
00520         0x01,                           // bNumInterfaces
00521         DEFAULT_CONFIGURATION,          // bConfigurationValue
00522         0x00,                           // iConfiguration
00523         C_RESERVED | C_SELF_POWERED,    // bmAttributes
00524         C_POWER( 0 ),                   // bMaxPowerHello World from Mbed
00525 
00526         INTERFACE_DESCRIPTOR_LENGTH,    // bLength
00527         INTERFACE_DESCRIPTOR,           // bDescriptorType
00528         0x00,                           // bInterfaceNumber
00529         0x00,                           // bAlternateSetting
00530         0x02,                           // bNumEndpoints
00531         HID_CLASS,                      // bInterfaceClass
00532         1,                              // bInterfaceSubClass
00533         1,                              // bInterfaceProtocol (keyboard)
00534         0x00,                           // iInterface
00535 
00536         HID_DESCRIPTOR_LENGTH,          // bLength
00537         HID_DESCRIPTOR,                 // bDescriptorType
00538         LSB( HID_VERSION_1_11 ),        // bcdHID (LSB)
00539         MSB( HID_VERSION_1_11 ),        // bcdHID (MSB)
00540         0x00,                           // bCountryCode
00541         0x01,                           // bNumDescriptors
00542         REPORT_DESCRIPTOR,              // bDescriptorType
00543         LSB( reportDescLength() ), // wDescriptorLength (LSB)
00544         MSB( reportDescLength() ), // wDescriptorLength (MSB)
00545 
00546         ENDPOINT_DESCRIPTOR_LENGTH,     // bLength
00547         ENDPOINT_DESCRIPTOR,            // bDescriptorType
00548         PHY_TO_DESC( EPINT_IN ),        // bEndpointAddress
00549         E_INTERRUPT,                    // bmAttributes
00550         LSB( MAX_PACKET_SIZE_EPINT ),   // wMaxPacketSize (LSB)
00551         MSB( MAX_PACKET_SIZE_EPINT ),   // wMaxPacketSize (MSB)
00552         1,                             // bInterval (milliseconds)
00553 
00554         ENDPOINT_DESCRIPTOR_LENGTH,     // bLength
00555         ENDPOINT_DESCRIPTOR,            // bDescriptorType
00556         PHY_TO_DESC( EPINT_OUT ),        // bEndpointAddress
00557         E_INTERRUPT,                    // bmAttributes
00558         LSB( MAX_PACKET_SIZE_EPINT ),   // wMaxPacketSize (LSB)
00559         MSB( MAX_PACKET_SIZE_EPINT ),   // wMaxPacketSize (MSB)
00560         1,                             // bInterval (milliseconds)
00561     };
00562     return configurationDescriptor;
00563 }
00564