an adapter from any connected PS/2 keyboard to USB HID output
Embed:
(wiki syntax)
Show/hide line numbers
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