Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of USBDevice by
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
Generated on Sat Jul 16 2022 03:17:41 by
 1.7.2
 1.7.2 
    