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.
USBDevice/USBHID/.svn/text-base/USBKeyboard.cpp.svn-base@0:505207de8566, 2011-11-29 (annotated)
- Committer:
- znuh
- Date:
- Tue Nov 29 21:26:20 2011 +0000
- Revision:
- 0:505207de8566
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| znuh | 0:505207de8566 | 1 | /* USBKeyboard.c */ |
| znuh | 0:505207de8566 | 2 | /* USB device example: Standard keyboard */ |
| znuh | 0:505207de8566 | 3 | /* Copyright (c) 2011 ARM Limited. All rights reserved. */ |
| znuh | 0:505207de8566 | 4 | |
| znuh | 0:505207de8566 | 5 | #include "stdint.h" |
| znuh | 0:505207de8566 | 6 | |
| znuh | 0:505207de8566 | 7 | #include "USBKeyboard.h" |
| znuh | 0:505207de8566 | 8 | |
| znuh | 0:505207de8566 | 9 | /* |
| znuh | 0:505207de8566 | 10 | * Descriptors |
| znuh | 0:505207de8566 | 11 | */ |
| znuh | 0:505207de8566 | 12 | |
| znuh | 0:505207de8566 | 13 | uint8_t * USBKeyboard::ReportDesc() { |
| znuh | 0:505207de8566 | 14 | static uint8_t reportDescriptor[] = { |
| znuh | 0:505207de8566 | 15 | |
| znuh | 0:505207de8566 | 16 | /* Based on Appendix E.6 of "Device Class Definition for Human Interface |
| znuh | 0:505207de8566 | 17 | Devices (HID)" Version 1.11. */ |
| znuh | 0:505207de8566 | 18 | |
| znuh | 0:505207de8566 | 19 | USAGE_PAGE(1), 0x01, /* Generic Desktop */ |
| znuh | 0:505207de8566 | 20 | USAGE(1), 0x06, /* Keyboard */ |
| znuh | 0:505207de8566 | 21 | COLLECTION(1), 0x01, /* Application*/ |
| znuh | 0:505207de8566 | 22 | REPORT_ID(1), REPORT_ID_KEYBOARD, |
| znuh | 0:505207de8566 | 23 | |
| znuh | 0:505207de8566 | 24 | USAGE_PAGE(1), 0x07, /* Key Codes */ |
| znuh | 0:505207de8566 | 25 | USAGE_MINIMUM(1), 0xE0, |
| znuh | 0:505207de8566 | 26 | USAGE_MAXIMUM(1), 0xE7, |
| znuh | 0:505207de8566 | 27 | LOGICAL_MINIMUM(1), 0x00, |
| znuh | 0:505207de8566 | 28 | LOGICAL_MAXIMUM(1), 0x01, |
| znuh | 0:505207de8566 | 29 | REPORT_SIZE(1), 0x01, |
| znuh | 0:505207de8566 | 30 | REPORT_COUNT(1), 0x08, |
| znuh | 0:505207de8566 | 31 | INPUT(1), 0x02, /* Data, Variable, Absolute */ |
| znuh | 0:505207de8566 | 32 | REPORT_COUNT(1), 0x01, |
| znuh | 0:505207de8566 | 33 | REPORT_SIZE(1), 0x08, |
| znuh | 0:505207de8566 | 34 | INPUT(1), 0x01, /* Constant */ |
| znuh | 0:505207de8566 | 35 | REPORT_COUNT(1), 0x05, |
| znuh | 0:505207de8566 | 36 | REPORT_SIZE(1), 0x01, |
| znuh | 0:505207de8566 | 37 | |
| znuh | 0:505207de8566 | 38 | |
| znuh | 0:505207de8566 | 39 | USAGE_PAGE(1), 0x08, /* LEDs */ |
| znuh | 0:505207de8566 | 40 | USAGE_MINIMUM(1), 0x01, |
| znuh | 0:505207de8566 | 41 | USAGE_MAXIMUM(1), 0x05, |
| znuh | 0:505207de8566 | 42 | OUTPUT(1), 0x02, /* Data, Variable, Absolute */ |
| znuh | 0:505207de8566 | 43 | REPORT_COUNT(1), 0x01, |
| znuh | 0:505207de8566 | 44 | REPORT_SIZE(1), 0x03, |
| znuh | 0:505207de8566 | 45 | OUTPUT(1), 0x01, /* Constant */ |
| znuh | 0:505207de8566 | 46 | REPORT_COUNT(1), 0x06, |
| znuh | 0:505207de8566 | 47 | REPORT_SIZE(1), 0x08, |
| znuh | 0:505207de8566 | 48 | LOGICAL_MINIMUM(1), 0x00, |
| znuh | 0:505207de8566 | 49 | LOGICAL_MAXIMUM(1), 0x65, |
| znuh | 0:505207de8566 | 50 | |
| znuh | 0:505207de8566 | 51 | |
| znuh | 0:505207de8566 | 52 | USAGE_PAGE(1), 0x07, /* Key Codes */ |
| znuh | 0:505207de8566 | 53 | USAGE_MINIMUM(1), 0x00, |
| znuh | 0:505207de8566 | 54 | USAGE_MAXIMUM(1), 0x65, |
| znuh | 0:505207de8566 | 55 | INPUT(1), 0x00, /* Data, Array */ |
| znuh | 0:505207de8566 | 56 | END_COLLECTION(0), |
| znuh | 0:505207de8566 | 57 | |
| znuh | 0:505207de8566 | 58 | /* Media Control */ |
| znuh | 0:505207de8566 | 59 | USAGE_PAGE(1), 0x0C, |
| znuh | 0:505207de8566 | 60 | USAGE(1), 0x01, |
| znuh | 0:505207de8566 | 61 | COLLECTION(1), 0x01, |
| znuh | 0:505207de8566 | 62 | REPORT_ID(1), REPORT_ID_VOLUME, |
| znuh | 0:505207de8566 | 63 | USAGE_PAGE(1), 0x0C, |
| znuh | 0:505207de8566 | 64 | LOGICAL_MINIMUM(1), 0x00, |
| znuh | 0:505207de8566 | 65 | LOGICAL_MAXIMUM(1), 0x01, |
| znuh | 0:505207de8566 | 66 | REPORT_SIZE(1), 0x01, |
| znuh | 0:505207de8566 | 67 | REPORT_COUNT(1), 0x07, |
| znuh | 0:505207de8566 | 68 | USAGE(1), 0xB5, /* Next Track */ |
| znuh | 0:505207de8566 | 69 | USAGE(1), 0xB6, /* Previous Track */ |
| znuh | 0:505207de8566 | 70 | USAGE(1), 0xB7, /* Stop */ |
| znuh | 0:505207de8566 | 71 | USAGE(1), 0xCD, /* Play / Pause */ |
| znuh | 0:505207de8566 | 72 | USAGE(1), 0xE2, /* Mute */ |
| znuh | 0:505207de8566 | 73 | USAGE(1), 0xE9, /* Volume Up */ |
| znuh | 0:505207de8566 | 74 | USAGE(1), 0xEA, /* Volume Down */ |
| znuh | 0:505207de8566 | 75 | INPUT(1), 0x02, /* Input (Data, Variable, Absolute) */ |
| znuh | 0:505207de8566 | 76 | REPORT_COUNT(1), 0x01, |
| znuh | 0:505207de8566 | 77 | INPUT(1), 0x01, |
| znuh | 0:505207de8566 | 78 | END_COLLECTION(0), |
| znuh | 0:505207de8566 | 79 | |
| znuh | 0:505207de8566 | 80 | }; |
| znuh | 0:505207de8566 | 81 | reportLength = sizeof(reportDescriptor); |
| znuh | 0:505207de8566 | 82 | return reportDescriptor; |
| znuh | 0:505207de8566 | 83 | } |
| znuh | 0:505207de8566 | 84 | |
| znuh | 0:505207de8566 | 85 | int USBKeyboard::_putc(int c) { |
| znuh | 0:505207de8566 | 86 | return keyCode(keymap[c].modifier, c); |
| znuh | 0:505207de8566 | 87 | } |
| znuh | 0:505207de8566 | 88 | |
| znuh | 0:505207de8566 | 89 | bool USBKeyboard::keyCode(uint8_t modifier, uint8_t key) { |
| znuh | 0:505207de8566 | 90 | /* Send a simulated keyboard keypress. Returns true if successful. */ |
| znuh | 0:505207de8566 | 91 | |
| znuh | 0:505207de8566 | 92 | HID_REPORT report; |
| znuh | 0:505207de8566 | 93 | |
| znuh | 0:505207de8566 | 94 | report.data[0] = REPORT_ID_KEYBOARD; |
| znuh | 0:505207de8566 | 95 | report.data[1] = modifier; |
| znuh | 0:505207de8566 | 96 | report.data[2] = 0; |
| znuh | 0:505207de8566 | 97 | report.data[3] = keymap[key].usage; |
| znuh | 0:505207de8566 | 98 | report.data[4] = 0; |
| znuh | 0:505207de8566 | 99 | report.data[5] = 0; |
| znuh | 0:505207de8566 | 100 | report.data[6] = 0; |
| znuh | 0:505207de8566 | 101 | report.data[7] = 0; |
| znuh | 0:505207de8566 | 102 | report.data[8] = 0; |
| znuh | 0:505207de8566 | 103 | |
| znuh | 0:505207de8566 | 104 | report.length = 9; |
| znuh | 0:505207de8566 | 105 | |
| znuh | 0:505207de8566 | 106 | if (!USBHID_send(EPINT_IN, &report)) { |
| znuh | 0:505207de8566 | 107 | return false; |
| znuh | 0:505207de8566 | 108 | } |
| znuh | 0:505207de8566 | 109 | |
| znuh | 0:505207de8566 | 110 | report.data[1] = 0; |
| znuh | 0:505207de8566 | 111 | report.data[3] = 0; |
| znuh | 0:505207de8566 | 112 | |
| znuh | 0:505207de8566 | 113 | if (!USBHID_send(EPINT_IN, &report)) { |
| znuh | 0:505207de8566 | 114 | return false; |
| znuh | 0:505207de8566 | 115 | } |
| znuh | 0:505207de8566 | 116 | |
| znuh | 0:505207de8566 | 117 | return true; |
| znuh | 0:505207de8566 | 118 | |
| znuh | 0:505207de8566 | 119 | } |
| znuh | 0:505207de8566 | 120 | |
| znuh | 0:505207de8566 | 121 | |
| znuh | 0:505207de8566 | 122 | bool USBKeyboard::mediaControl(MEDIA_KEY key) { |
| znuh | 0:505207de8566 | 123 | HID_REPORT report; |
| znuh | 0:505207de8566 | 124 | |
| znuh | 0:505207de8566 | 125 | report.data[0] = REPORT_ID_VOLUME; |
| znuh | 0:505207de8566 | 126 | report.data[1] = (1 << key) & 0x7f; |
| znuh | 0:505207de8566 | 127 | |
| znuh | 0:505207de8566 | 128 | report.length = 2; |
| znuh | 0:505207de8566 | 129 | |
| znuh | 0:505207de8566 | 130 | return USBHID_send(EPINT_IN, &report); |
| znuh | 0:505207de8566 | 131 | } |