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.
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 * pilzm: 00019 * Added funtion for sending report with multiple keys 00020 */ 00021 00022 #include "stdint.h" 00023 00024 #include "USBKeyboard.h" 00025 00026 #define REPORT_ID_KEYBOARD 1 00027 #define REPORT_ID_VOLUME 3 00028 00029 00030 typedef struct { 00031 unsigned char usage; 00032 unsigned char modifier; 00033 } KEYMAP; 00034 00035 #ifdef US_KEYBOARD 00036 /* US keyboard (as HID standard) */ 00037 #define KEYMAP_SIZE (152) 00038 const KEYMAP keymap[KEYMAP_SIZE] = { 00039 {0, 0}, /* NUL */ 00040 {0, 0}, /* SOH */ 00041 {0, 0}, /* STX */ 00042 {0, 0}, /* ETX */ 00043 {0, 0}, /* EOT */ 00044 {0, 0}, /* ENQ */ 00045 {0, 0}, /* ACK */ 00046 {0, 0}, /* BEL */ 00047 {0x2a, 0}, /* BS */ /* Keyboard Delete (Backspace) */ 00048 {0x2b, 0}, /* TAB */ /* Keyboard Tab */ 00049 {0x28, 0}, /* LF */ /* Keyboard Return (Enter) */ 00050 {0, 0}, /* VT */ 00051 {0, 0}, /* FF */ 00052 {0, 0}, /* CR */ 00053 {0, 0}, /* SO */ 00054 {0, 0}, /* SI */ 00055 {0, 0}, /* DEL */ 00056 {0, 0}, /* DC1 */ 00057 {0, 0}, /* DC2 */ 00058 {0, 0}, /* DC3 */ 00059 {0, 0}, /* DC4 */ 00060 {0, 0}, /* NAK */ 00061 {0, 0}, /* SYN */ 00062 {0, 0}, /* ETB */ 00063 {0, 0}, /* CAN */ 00064 {0, 0}, /* EM */ 00065 {0, 0}, /* SUB */ 00066 {0, 0}, /* ESC */ 00067 {0, 0}, /* FS */ 00068 {0, 0}, /* GS */ 00069 {0, 0}, /* RS */ 00070 {0, 0}, /* US */ 00071 {0x2c, 0}, /* */ 00072 {0x1e, KEY_SHIFT}, /* ! */ 00073 {0x34, KEY_SHIFT}, /* " */ 00074 {0x20, KEY_SHIFT}, /* # */ 00075 {0x21, KEY_SHIFT}, /* $ */ 00076 {0x22, KEY_SHIFT}, /* % */ 00077 {0x24, KEY_SHIFT}, /* & */ 00078 {0x34, 0}, /* ' */ 00079 {0x26, KEY_SHIFT}, /* ( */ 00080 {0x27, KEY_SHIFT}, /* ) */ 00081 {0x25, KEY_SHIFT}, /* * */ 00082 {0x2e, KEY_SHIFT}, /* + */ 00083 {0x36, 0}, /* , */ 00084 {0x2d, 0}, /* - */ 00085 {0x37, 0}, /* . */ 00086 {0x38, 0}, /* / */ 00087 {0x27, 0}, /* 0 */ 00088 {0x1e, 0}, /* 1 */ 00089 {0x1f, 0}, /* 2 */ 00090 {0x20, 0}, /* 3 */ 00091 {0x21, 0}, /* 4 */ 00092 {0x22, 0}, /* 5 */ 00093 {0x23, 0}, /* 6 */ 00094 {0x24, 0}, /* 7 */ 00095 {0x25, 0}, /* 8 */ 00096 {0x26, 0}, /* 9 */ 00097 {0x33, KEY_SHIFT}, /* : */ 00098 {0x33, 0}, /* ; */ 00099 {0x36, KEY_SHIFT}, /* < */ 00100 {0x2e, 0}, /* = */ 00101 {0x37, KEY_SHIFT}, /* > */ 00102 {0x38, KEY_SHIFT}, /* ? */ 00103 {0x1f, KEY_SHIFT}, /* @ */ 00104 {0x04, KEY_SHIFT}, /* A */ 00105 {0x05, KEY_SHIFT}, /* B */ 00106 {0x06, KEY_SHIFT}, /* C */ 00107 {0x07, KEY_SHIFT}, /* D */ 00108 {0x08, KEY_SHIFT}, /* E */ 00109 {0x09, KEY_SHIFT}, /* F */ 00110 {0x0a, KEY_SHIFT}, /* G */ 00111 {0x0b, KEY_SHIFT}, /* H */ 00112 {0x0c, KEY_SHIFT}, /* I */ 00113 {0x0d, KEY_SHIFT}, /* J */ 00114 {0x0e, KEY_SHIFT}, /* K */ 00115 {0x0f, KEY_SHIFT}, /* L */ 00116 {0x10, KEY_SHIFT}, /* M */ 00117 {0x11, KEY_SHIFT}, /* N */ 00118 {0x12, KEY_SHIFT}, /* O */ 00119 {0x13, KEY_SHIFT}, /* P */ 00120 {0x14, KEY_SHIFT}, /* Q */ 00121 {0x15, KEY_SHIFT}, /* R */ 00122 {0x16, KEY_SHIFT}, /* S */ 00123 {0x17, KEY_SHIFT}, /* T */ 00124 {0x18, KEY_SHIFT}, /* U */ 00125 {0x19, KEY_SHIFT}, /* V */ 00126 {0x1a, KEY_SHIFT}, /* W */ 00127 {0x1b, KEY_SHIFT}, /* X */ 00128 {0x1c, KEY_SHIFT}, /* Y */ 00129 {0x1d, KEY_SHIFT}, /* Z */ 00130 {0x2f, 0}, /* [ */ 00131 {0x31, 0}, /* \ */ 00132 {0x30, 0}, /* ] */ 00133 {0x23, KEY_SHIFT}, /* ^ */ 00134 {0x2d, KEY_SHIFT}, /* _ */ 00135 {0x35, 0}, /* ` */ 00136 {0x04, 0}, /* a */ 00137 {0x05, 0}, /* b */ 00138 {0x06, 0}, /* c */ 00139 {0x07, 0}, /* d */ 00140 {0x08, 0}, /* e */ 00141 {0x09, 0}, /* f */ 00142 {0x0a, 0}, /* g */ 00143 {0x0b, 0}, /* h */ 00144 {0x0c, 0}, /* i */ 00145 {0x0d, 0}, /* j */ 00146 {0x0e, 0}, /* k */ 00147 {0x0f, 0}, /* l */ 00148 {0x10, 0}, /* m */ 00149 {0x11, 0}, /* n */ 00150 {0x12, 0}, /* o */ 00151 {0x13, 0}, /* p */ 00152 {0x14, 0}, /* q */ 00153 {0x15, 0}, /* r */ 00154 {0x16, 0}, /* s */ 00155 {0x17, 0}, /* t */ 00156 {0x18, 0}, /* u */ 00157 {0x19, 0}, /* v */ 00158 {0x1a, 0}, /* w */ 00159 {0x1b, 0}, /* x */ 00160 {0x1c, 0}, /* y */ 00161 {0x1d, 0}, /* z */ 00162 {0x2f, KEY_SHIFT}, /* { */ 00163 {0x31, KEY_SHIFT}, /* | */ 00164 {0x30, KEY_SHIFT}, /* } */ 00165 {0x35, KEY_SHIFT}, /* ~ */ 00166 {0,0}, /* DEL */ 00167 00168 {0x3a, 0}, /* F1 */ 00169 {0x3b, 0}, /* F2 */ 00170 {0x3c, 0}, /* F3 */ 00171 {0x3d, 0}, /* F4 */ 00172 {0x3e, 0}, /* F5 */ 00173 {0x3f, 0}, /* F6 */ 00174 {0x40, 0}, /* F7 */ 00175 {0x41, 0}, /* F8 */ 00176 {0x42, 0}, /* F9 */ 00177 {0x43, 0}, /* F10 */ 00178 {0x44, 0}, /* F11 */ 00179 {0x45, 0}, /* F12 */ 00180 00181 {0x46, 0}, /* PRINT_SCREEN */ 00182 {0x47, 0}, /* SCROLL_LOCK */ 00183 {0x39, 0}, /* CAPS_LOCK */ 00184 {0x53, 0}, /* NUM_LOCK */ 00185 {0x49, 0}, /* INSERT */ 00186 {0x4a, 0}, /* HOME */ 00187 {0x4b, 0}, /* PAGE_UP */ 00188 {0x4e, 0}, /* PAGE_DOWN */ 00189 00190 {0x4f, 0}, /* RIGHT_ARROW */ 00191 {0x50, 0}, /* LEFT_ARROW */ 00192 {0x51, 0}, /* DOWN_ARROW */ 00193 {0x52, 0}, /* UP_ARROW */ 00194 }; 00195 00196 #else 00197 /* UK keyboard */ 00198 #define KEYMAP_SIZE (152) 00199 const KEYMAP keymap[KEYMAP_SIZE] = { 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 static uint8_t reportDescriptor[] = { 00360 USAGE_PAGE(1), 0x01, // Generic Desktop 00361 USAGE(1), 0x06, // Keyboard 00362 COLLECTION(1), 0x01, // Application 00363 REPORT_ID(1), REPORT_ID_KEYBOARD, 00364 00365 USAGE_PAGE(1), 0x07, // Key Codes 00366 USAGE_MINIMUM(1), 0xE0, 00367 USAGE_MAXIMUM(1), 0xE7, 00368 LOGICAL_MINIMUM(1), 0x00, 00369 LOGICAL_MAXIMUM(1), 0x01, 00370 REPORT_SIZE(1), 0x01, 00371 REPORT_COUNT(1), 0x08, 00372 INPUT(1), 0x02, // Data, Variable, Absolute 00373 REPORT_COUNT(1), 0x01, 00374 REPORT_SIZE(1), 0x08, 00375 INPUT(1), 0x01, // Constant 00376 00377 00378 REPORT_COUNT(1), 0x05, 00379 REPORT_SIZE(1), 0x01, 00380 USAGE_PAGE(1), 0x08, // LEDs 00381 USAGE_MINIMUM(1), 0x01, 00382 USAGE_MAXIMUM(1), 0x05, 00383 OUTPUT(1), 0x02, // Data, Variable, Absolute 00384 REPORT_COUNT(1), 0x01, 00385 REPORT_SIZE(1), 0x03, 00386 OUTPUT(1), 0x01, // Constant 00387 00388 00389 REPORT_COUNT(1), 0x06, 00390 REPORT_SIZE(1), 0x08, 00391 LOGICAL_MINIMUM(1), 0x00, 00392 LOGICAL_MAXIMUM(1), 0x65, 00393 USAGE_PAGE(1), 0x07, // Key Codes 00394 USAGE_MINIMUM(1), 0x00, 00395 USAGE_MAXIMUM(1), 0x65, 00396 INPUT(1), 0x00, // Data, Array 00397 END_COLLECTION(0), 00398 00399 // Media Control 00400 USAGE_PAGE(1), 0x0C, 00401 USAGE(1), 0x01, 00402 COLLECTION(1), 0x01, 00403 REPORT_ID(1), REPORT_ID_VOLUME, 00404 USAGE_PAGE(1), 0x0C, 00405 LOGICAL_MINIMUM(1), 0x00, 00406 LOGICAL_MAXIMUM(1), 0x01, 00407 REPORT_SIZE(1), 0x01, 00408 REPORT_COUNT(1), 0x07, 00409 USAGE(1), 0xB5, // Next Track 00410 USAGE(1), 0xB6, // Previous Track 00411 USAGE(1), 0xB7, // Stop 00412 USAGE(1), 0xCD, // Play / Pause 00413 USAGE(1), 0xE2, // Mute 00414 USAGE(1), 0xE9, // Volume Up 00415 USAGE(1), 0xEA, // Volume Down 00416 INPUT(1), 0x02, // Input (Data, Variable, Absolute) 00417 REPORT_COUNT(1), 0x01, 00418 INPUT(1), 0x01, 00419 END_COLLECTION(0), 00420 }; 00421 reportLength = sizeof(reportDescriptor); 00422 return reportDescriptor; 00423 } 00424 00425 00426 bool USBKeyboard::EPINT_OUT_callback() { 00427 uint32_t bytesRead = 0; 00428 uint8_t led[65]; 00429 USBDevice::readEP(EPINT_OUT, led, &bytesRead, MAX_HID_REPORT_SIZE); 00430 00431 // we take led[1] because led[0] is the report ID 00432 lock_status = led[1] & 0x07; 00433 00434 // We activate the endpoint to be able to recceive data 00435 if (!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE)) 00436 return false; 00437 return true; 00438 } 00439 00440 uint8_t USBKeyboard::lockStatus() { 00441 return lock_status; 00442 } 00443 00444 int USBKeyboard::_putc(int c) { 00445 return keyCode(c, keymap[c].modifier); 00446 } 00447 00448 bool USBKeyboard::keyCode(uint8_t key, uint8_t modifier) { 00449 // Send a simulated keyboard keypress. Returns true if successful. 00450 HID_REPORT report; 00451 00452 report.data[0] = REPORT_ID_KEYBOARD; 00453 report.data[1] = modifier; 00454 report.data[2] = 0; 00455 report.data[3] = keymap[key].usage; 00456 report.data[4] = 0; 00457 report.data[5] = 0; 00458 report.data[6] = 0; 00459 report.data[7] = 0; 00460 report.data[8] = 0; 00461 00462 report.length = 9; 00463 00464 if (!send(&report)) { 00465 return false; 00466 } 00467 00468 report.data[1] = 0; 00469 report.data[3] = 0; 00470 00471 if (!send(&report)) { 00472 return false; 00473 } 00474 00475 return true; 00476 00477 } 00478 00479 /* 00480 * added function 00481 */ 00482 bool USBKeyboard::scanCodeRep(uint8_t *krep) { 00483 // Send simulated keyboard keypress. Returns true if successful. 00484 HID_REPORT report; 00485 00486 report.data[0] = REPORT_ID_KEYBOARD; 00487 report.data[1] = krep[1]; //modifier byte 00488 report.data[2] = 0; 00489 report.data[3] = krep[3]; //key bytes 00490 report.data[4] = krep[4]; 00491 report.data[5] = krep[5]; 00492 report.data[6] = krep[6]; 00493 report.data[7] = krep[7]; 00494 report.data[8] = krep[8]; 00495 00496 report.length = 9; 00497 00498 if (!send(&report)) { 00499 return false; 00500 } 00501 00502 return true; 00503 00504 } 00505 00506 00507 bool USBKeyboard::mediaControl(MEDIA_KEY key) { 00508 HID_REPORT report; 00509 00510 report.data[0] = REPORT_ID_VOLUME; 00511 report.data[1] = (1 << key) & 0x7f; 00512 00513 report.length = 2; 00514 00515 if (!send(&report)) { 00516 return false; 00517 } 00518 00519 report.data[0] = REPORT_ID_VOLUME; 00520 report.data[1] = 0; 00521 00522 report.length = 2; 00523 00524 return send(&report); 00525 } 00526 00527 00528 #define DEFAULT_CONFIGURATION (1) 00529 #define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \ 00530 + (1 * INTERFACE_DESCRIPTOR_LENGTH) \ 00531 + (1 * HID_DESCRIPTOR_LENGTH) \ 00532 + (2 * ENDPOINT_DESCRIPTOR_LENGTH)) 00533 00534 uint8_t * USBKeyboard::configurationDesc() { 00535 static uint8_t configurationDescriptor[] = { 00536 CONFIGURATION_DESCRIPTOR_LENGTH, // bLength 00537 CONFIGURATION_DESCRIPTOR, // bDescriptorType 00538 LSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (LSB) 00539 MSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (MSB) 00540 0x01, // bNumInterfaces 00541 DEFAULT_CONFIGURATION, // bConfigurationValue 00542 0x00, // iConfiguration 00543 C_RESERVED | C_SELF_POWERED, // bmAttributes 00544 C_POWER(0), // bMaxPower 00545 00546 INTERFACE_DESCRIPTOR_LENGTH, // bLength 00547 INTERFACE_DESCRIPTOR, // bDescriptorType 00548 0x00, // bInterfaceNumber 00549 0x00, // bAlternateSetting 00550 0x02, // bNumEndpoints 00551 HID_CLASS, // bInterfaceClass 00552 HID_SUBCLASS_BOOT, // bInterfaceSubClass 00553 HID_PROTOCOL_KEYBOARD, // bInterfaceProtocol 00554 0x00, // iInterface 00555 00556 HID_DESCRIPTOR_LENGTH, // bLength 00557 HID_DESCRIPTOR, // bDescriptorType 00558 LSB(HID_VERSION_1_11), // bcdHID (LSB) 00559 MSB(HID_VERSION_1_11), // bcdHID (MSB) 00560 0x00, // bCountryCode 00561 0x01, // bNumDescriptors 00562 REPORT_DESCRIPTOR, // bDescriptorType 00563 (uint8_t)(LSB(reportDescLength())), // wDescriptorLength (LSB) 00564 (uint8_t)(MSB(reportDescLength())), // wDescriptorLength (MSB) 00565 00566 ENDPOINT_DESCRIPTOR_LENGTH, // bLength 00567 ENDPOINT_DESCRIPTOR, // bDescriptorType 00568 PHY_TO_DESC(EPINT_IN), // bEndpointAddress 00569 E_INTERRUPT, // bmAttributes 00570 LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB) 00571 MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB) 00572 1, // bInterval (milliseconds) 00573 00574 ENDPOINT_DESCRIPTOR_LENGTH, // bLength 00575 ENDPOINT_DESCRIPTOR, // bDescriptorType 00576 PHY_TO_DESC(EPINT_OUT), // bEndpointAddress 00577 E_INTERRUPT, // bmAttributes 00578 LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB) 00579 MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB) 00580 1, // bInterval (milliseconds) 00581 }; 00582 return configurationDescriptor; 00583 }
Generated on Fri Jul 15 2022 10:09:06 by
1.7.2