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