Fork of the official USBDevice library

Fork of USBDevice by mbed official

Committer:
screamer
Date:
Fri Apr 28 17:01:10 2017 +0000
Branch:
device-files
Revision:
76:f0fd8d911b24
Parent:
73:8d28a0cb7b43
Changed the layout of USBDevice implementation for various targets to match mbed-os/targets. This also reduces the amount of files being compiled as USBDevice code for other targets is not compiled.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 73:8d28a0cb7b43 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
screamer 73:8d28a0cb7b43 2 *
screamer 73:8d28a0cb7b43 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
screamer 73:8d28a0cb7b43 4 * and associated documentation files (the "Software"), to deal in the Software without
screamer 73:8d28a0cb7b43 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
screamer 73:8d28a0cb7b43 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
screamer 73:8d28a0cb7b43 7 * Software is furnished to do so, subject to the following conditions:
screamer 73:8d28a0cb7b43 8 *
screamer 73:8d28a0cb7b43 9 * The above copyright notice and this permission notice shall be included in all copies or
screamer 73:8d28a0cb7b43 10 * substantial portions of the Software.
screamer 73:8d28a0cb7b43 11 *
screamer 73:8d28a0cb7b43 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
screamer 73:8d28a0cb7b43 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
screamer 73:8d28a0cb7b43 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
screamer 73:8d28a0cb7b43 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
screamer 73:8d28a0cb7b43 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
screamer 73:8d28a0cb7b43 17 */
screamer 73:8d28a0cb7b43 18
screamer 73:8d28a0cb7b43 19 #include "stdint.h"
screamer 73:8d28a0cb7b43 20
screamer 73:8d28a0cb7b43 21 #include "USBKeyboard.h"
screamer 73:8d28a0cb7b43 22
screamer 73:8d28a0cb7b43 23 #define REPORT_ID_KEYBOARD 1
screamer 73:8d28a0cb7b43 24 #define REPORT_ID_VOLUME 3
screamer 73:8d28a0cb7b43 25
screamer 73:8d28a0cb7b43 26
screamer 73:8d28a0cb7b43 27 typedef struct {
screamer 73:8d28a0cb7b43 28 unsigned char usage;
screamer 73:8d28a0cb7b43 29 unsigned char modifier;
screamer 73:8d28a0cb7b43 30 } KEYMAP;
screamer 73:8d28a0cb7b43 31
screamer 73:8d28a0cb7b43 32 #ifdef US_KEYBOARD
screamer 73:8d28a0cb7b43 33 /* US keyboard (as HID standard) */
screamer 73:8d28a0cb7b43 34 #define KEYMAP_SIZE (152)
screamer 73:8d28a0cb7b43 35 const KEYMAP keymap[KEYMAP_SIZE] = {
screamer 73:8d28a0cb7b43 36 {0, 0}, /* NUL */
screamer 73:8d28a0cb7b43 37 {0, 0}, /* SOH */
screamer 73:8d28a0cb7b43 38 {0, 0}, /* STX */
screamer 73:8d28a0cb7b43 39 {0, 0}, /* ETX */
screamer 73:8d28a0cb7b43 40 {0, 0}, /* EOT */
screamer 73:8d28a0cb7b43 41 {0, 0}, /* ENQ */
screamer 73:8d28a0cb7b43 42 {0, 0}, /* ACK */
screamer 73:8d28a0cb7b43 43 {0, 0}, /* BEL */
screamer 73:8d28a0cb7b43 44 {0x2a, 0}, /* BS */ /* Keyboard Delete (Backspace) */
screamer 73:8d28a0cb7b43 45 {0x2b, 0}, /* TAB */ /* Keyboard Tab */
screamer 73:8d28a0cb7b43 46 {0x28, 0}, /* LF */ /* Keyboard Return (Enter) */
screamer 73:8d28a0cb7b43 47 {0, 0}, /* VT */
screamer 73:8d28a0cb7b43 48 {0, 0}, /* FF */
screamer 73:8d28a0cb7b43 49 {0, 0}, /* CR */
screamer 73:8d28a0cb7b43 50 {0, 0}, /* SO */
screamer 73:8d28a0cb7b43 51 {0, 0}, /* SI */
screamer 73:8d28a0cb7b43 52 {0, 0}, /* DEL */
screamer 73:8d28a0cb7b43 53 {0, 0}, /* DC1 */
screamer 73:8d28a0cb7b43 54 {0, 0}, /* DC2 */
screamer 73:8d28a0cb7b43 55 {0, 0}, /* DC3 */
screamer 73:8d28a0cb7b43 56 {0, 0}, /* DC4 */
screamer 73:8d28a0cb7b43 57 {0, 0}, /* NAK */
screamer 73:8d28a0cb7b43 58 {0, 0}, /* SYN */
screamer 73:8d28a0cb7b43 59 {0, 0}, /* ETB */
screamer 73:8d28a0cb7b43 60 {0, 0}, /* CAN */
screamer 73:8d28a0cb7b43 61 {0, 0}, /* EM */
screamer 73:8d28a0cb7b43 62 {0, 0}, /* SUB */
screamer 73:8d28a0cb7b43 63 {0, 0}, /* ESC */
screamer 73:8d28a0cb7b43 64 {0, 0}, /* FS */
screamer 73:8d28a0cb7b43 65 {0, 0}, /* GS */
screamer 73:8d28a0cb7b43 66 {0, 0}, /* RS */
screamer 73:8d28a0cb7b43 67 {0, 0}, /* US */
screamer 73:8d28a0cb7b43 68 {0x2c, 0}, /* */
screamer 73:8d28a0cb7b43 69 {0x1e, KEY_SHIFT}, /* ! */
screamer 73:8d28a0cb7b43 70 {0x34, KEY_SHIFT}, /* " */
screamer 73:8d28a0cb7b43 71 {0x20, KEY_SHIFT}, /* # */
screamer 73:8d28a0cb7b43 72 {0x21, KEY_SHIFT}, /* $ */
screamer 73:8d28a0cb7b43 73 {0x22, KEY_SHIFT}, /* % */
screamer 73:8d28a0cb7b43 74 {0x24, KEY_SHIFT}, /* & */
screamer 73:8d28a0cb7b43 75 {0x34, 0}, /* ' */
screamer 73:8d28a0cb7b43 76 {0x26, KEY_SHIFT}, /* ( */
screamer 73:8d28a0cb7b43 77 {0x27, KEY_SHIFT}, /* ) */
screamer 73:8d28a0cb7b43 78 {0x25, KEY_SHIFT}, /* * */
screamer 73:8d28a0cb7b43 79 {0x2e, KEY_SHIFT}, /* + */
screamer 73:8d28a0cb7b43 80 {0x36, 0}, /* , */
screamer 73:8d28a0cb7b43 81 {0x2d, 0}, /* - */
screamer 73:8d28a0cb7b43 82 {0x37, 0}, /* . */
screamer 73:8d28a0cb7b43 83 {0x38, 0}, /* / */
screamer 73:8d28a0cb7b43 84 {0x27, 0}, /* 0 */
screamer 73:8d28a0cb7b43 85 {0x1e, 0}, /* 1 */
screamer 73:8d28a0cb7b43 86 {0x1f, 0}, /* 2 */
screamer 73:8d28a0cb7b43 87 {0x20, 0}, /* 3 */
screamer 73:8d28a0cb7b43 88 {0x21, 0}, /* 4 */
screamer 73:8d28a0cb7b43 89 {0x22, 0}, /* 5 */
screamer 73:8d28a0cb7b43 90 {0x23, 0}, /* 6 */
screamer 73:8d28a0cb7b43 91 {0x24, 0}, /* 7 */
screamer 73:8d28a0cb7b43 92 {0x25, 0}, /* 8 */
screamer 73:8d28a0cb7b43 93 {0x26, 0}, /* 9 */
screamer 73:8d28a0cb7b43 94 {0x33, KEY_SHIFT}, /* : */
screamer 73:8d28a0cb7b43 95 {0x33, 0}, /* ; */
screamer 73:8d28a0cb7b43 96 {0x36, KEY_SHIFT}, /* < */
screamer 73:8d28a0cb7b43 97 {0x2e, 0}, /* = */
screamer 73:8d28a0cb7b43 98 {0x37, KEY_SHIFT}, /* > */
screamer 73:8d28a0cb7b43 99 {0x38, KEY_SHIFT}, /* ? */
screamer 73:8d28a0cb7b43 100 {0x1f, KEY_SHIFT}, /* @ */
screamer 73:8d28a0cb7b43 101 {0x04, KEY_SHIFT}, /* A */
screamer 73:8d28a0cb7b43 102 {0x05, KEY_SHIFT}, /* B */
screamer 73:8d28a0cb7b43 103 {0x06, KEY_SHIFT}, /* C */
screamer 73:8d28a0cb7b43 104 {0x07, KEY_SHIFT}, /* D */
screamer 73:8d28a0cb7b43 105 {0x08, KEY_SHIFT}, /* E */
screamer 73:8d28a0cb7b43 106 {0x09, KEY_SHIFT}, /* F */
screamer 73:8d28a0cb7b43 107 {0x0a, KEY_SHIFT}, /* G */
screamer 73:8d28a0cb7b43 108 {0x0b, KEY_SHIFT}, /* H */
screamer 73:8d28a0cb7b43 109 {0x0c, KEY_SHIFT}, /* I */
screamer 73:8d28a0cb7b43 110 {0x0d, KEY_SHIFT}, /* J */
screamer 73:8d28a0cb7b43 111 {0x0e, KEY_SHIFT}, /* K */
screamer 73:8d28a0cb7b43 112 {0x0f, KEY_SHIFT}, /* L */
screamer 73:8d28a0cb7b43 113 {0x10, KEY_SHIFT}, /* M */
screamer 73:8d28a0cb7b43 114 {0x11, KEY_SHIFT}, /* N */
screamer 73:8d28a0cb7b43 115 {0x12, KEY_SHIFT}, /* O */
screamer 73:8d28a0cb7b43 116 {0x13, KEY_SHIFT}, /* P */
screamer 73:8d28a0cb7b43 117 {0x14, KEY_SHIFT}, /* Q */
screamer 73:8d28a0cb7b43 118 {0x15, KEY_SHIFT}, /* R */
screamer 73:8d28a0cb7b43 119 {0x16, KEY_SHIFT}, /* S */
screamer 73:8d28a0cb7b43 120 {0x17, KEY_SHIFT}, /* T */
screamer 73:8d28a0cb7b43 121 {0x18, KEY_SHIFT}, /* U */
screamer 73:8d28a0cb7b43 122 {0x19, KEY_SHIFT}, /* V */
screamer 73:8d28a0cb7b43 123 {0x1a, KEY_SHIFT}, /* W */
screamer 73:8d28a0cb7b43 124 {0x1b, KEY_SHIFT}, /* X */
screamer 73:8d28a0cb7b43 125 {0x1c, KEY_SHIFT}, /* Y */
screamer 73:8d28a0cb7b43 126 {0x1d, KEY_SHIFT}, /* Z */
screamer 73:8d28a0cb7b43 127 {0x2f, 0}, /* [ */
screamer 73:8d28a0cb7b43 128 {0x31, 0}, /* \ */
screamer 73:8d28a0cb7b43 129 {0x30, 0}, /* ] */
screamer 73:8d28a0cb7b43 130 {0x23, KEY_SHIFT}, /* ^ */
screamer 73:8d28a0cb7b43 131 {0x2d, KEY_SHIFT}, /* _ */
screamer 73:8d28a0cb7b43 132 {0x35, 0}, /* ` */
screamer 73:8d28a0cb7b43 133 {0x04, 0}, /* a */
screamer 73:8d28a0cb7b43 134 {0x05, 0}, /* b */
screamer 73:8d28a0cb7b43 135 {0x06, 0}, /* c */
screamer 73:8d28a0cb7b43 136 {0x07, 0}, /* d */
screamer 73:8d28a0cb7b43 137 {0x08, 0}, /* e */
screamer 73:8d28a0cb7b43 138 {0x09, 0}, /* f */
screamer 73:8d28a0cb7b43 139 {0x0a, 0}, /* g */
screamer 73:8d28a0cb7b43 140 {0x0b, 0}, /* h */
screamer 73:8d28a0cb7b43 141 {0x0c, 0}, /* i */
screamer 73:8d28a0cb7b43 142 {0x0d, 0}, /* j */
screamer 73:8d28a0cb7b43 143 {0x0e, 0}, /* k */
screamer 73:8d28a0cb7b43 144 {0x0f, 0}, /* l */
screamer 73:8d28a0cb7b43 145 {0x10, 0}, /* m */
screamer 73:8d28a0cb7b43 146 {0x11, 0}, /* n */
screamer 73:8d28a0cb7b43 147 {0x12, 0}, /* o */
screamer 73:8d28a0cb7b43 148 {0x13, 0}, /* p */
screamer 73:8d28a0cb7b43 149 {0x14, 0}, /* q */
screamer 73:8d28a0cb7b43 150 {0x15, 0}, /* r */
screamer 73:8d28a0cb7b43 151 {0x16, 0}, /* s */
screamer 73:8d28a0cb7b43 152 {0x17, 0}, /* t */
screamer 73:8d28a0cb7b43 153 {0x18, 0}, /* u */
screamer 73:8d28a0cb7b43 154 {0x19, 0}, /* v */
screamer 73:8d28a0cb7b43 155 {0x1a, 0}, /* w */
screamer 73:8d28a0cb7b43 156 {0x1b, 0}, /* x */
screamer 73:8d28a0cb7b43 157 {0x1c, 0}, /* y */
screamer 73:8d28a0cb7b43 158 {0x1d, 0}, /* z */
screamer 73:8d28a0cb7b43 159 {0x2f, KEY_SHIFT}, /* { */
screamer 73:8d28a0cb7b43 160 {0x31, KEY_SHIFT}, /* | */
screamer 73:8d28a0cb7b43 161 {0x30, KEY_SHIFT}, /* } */
screamer 73:8d28a0cb7b43 162 {0x35, KEY_SHIFT}, /* ~ */
screamer 73:8d28a0cb7b43 163 {0,0}, /* DEL */
screamer 73:8d28a0cb7b43 164
screamer 73:8d28a0cb7b43 165 {0x3a, 0}, /* F1 */
screamer 73:8d28a0cb7b43 166 {0x3b, 0}, /* F2 */
screamer 73:8d28a0cb7b43 167 {0x3c, 0}, /* F3 */
screamer 73:8d28a0cb7b43 168 {0x3d, 0}, /* F4 */
screamer 73:8d28a0cb7b43 169 {0x3e, 0}, /* F5 */
screamer 73:8d28a0cb7b43 170 {0x3f, 0}, /* F6 */
screamer 73:8d28a0cb7b43 171 {0x40, 0}, /* F7 */
screamer 73:8d28a0cb7b43 172 {0x41, 0}, /* F8 */
screamer 73:8d28a0cb7b43 173 {0x42, 0}, /* F9 */
screamer 73:8d28a0cb7b43 174 {0x43, 0}, /* F10 */
screamer 73:8d28a0cb7b43 175 {0x44, 0}, /* F11 */
screamer 73:8d28a0cb7b43 176 {0x45, 0}, /* F12 */
screamer 73:8d28a0cb7b43 177
screamer 73:8d28a0cb7b43 178 {0x46, 0}, /* PRINT_SCREEN */
screamer 73:8d28a0cb7b43 179 {0x47, 0}, /* SCROLL_LOCK */
screamer 73:8d28a0cb7b43 180 {0x39, 0}, /* CAPS_LOCK */
screamer 73:8d28a0cb7b43 181 {0x53, 0}, /* NUM_LOCK */
screamer 73:8d28a0cb7b43 182 {0x49, 0}, /* INSERT */
screamer 73:8d28a0cb7b43 183 {0x4a, 0}, /* HOME */
screamer 73:8d28a0cb7b43 184 {0x4b, 0}, /* PAGE_UP */
screamer 73:8d28a0cb7b43 185 {0x4e, 0}, /* PAGE_DOWN */
screamer 73:8d28a0cb7b43 186
screamer 73:8d28a0cb7b43 187 {0x4f, 0}, /* RIGHT_ARROW */
screamer 73:8d28a0cb7b43 188 {0x50, 0}, /* LEFT_ARROW */
screamer 73:8d28a0cb7b43 189 {0x51, 0}, /* DOWN_ARROW */
screamer 73:8d28a0cb7b43 190 {0x52, 0}, /* UP_ARROW */
screamer 73:8d28a0cb7b43 191 };
screamer 73:8d28a0cb7b43 192
screamer 73:8d28a0cb7b43 193 #else
screamer 73:8d28a0cb7b43 194 /* UK keyboard */
screamer 73:8d28a0cb7b43 195 #define KEYMAP_SIZE (152)
screamer 73:8d28a0cb7b43 196 const KEYMAP keymap[KEYMAP_SIZE] = {
screamer 73:8d28a0cb7b43 197 {0, 0}, /* NUL */
screamer 73:8d28a0cb7b43 198 {0, 0}, /* SOH */
screamer 73:8d28a0cb7b43 199 {0, 0}, /* STX */
screamer 73:8d28a0cb7b43 200 {0, 0}, /* ETX */
screamer 73:8d28a0cb7b43 201 {0, 0}, /* EOT */
screamer 73:8d28a0cb7b43 202 {0, 0}, /* ENQ */
screamer 73:8d28a0cb7b43 203 {0, 0}, /* ACK */
screamer 73:8d28a0cb7b43 204 {0, 0}, /* BEL */
screamer 73:8d28a0cb7b43 205 {0x2a, 0}, /* BS */ /* Keyboard Delete (Backspace) */
screamer 73:8d28a0cb7b43 206 {0x2b, 0}, /* TAB */ /* Keyboard Tab */
screamer 73:8d28a0cb7b43 207 {0x28, 0}, /* LF */ /* Keyboard Return (Enter) */
screamer 73:8d28a0cb7b43 208 {0, 0}, /* VT */
screamer 73:8d28a0cb7b43 209 {0, 0}, /* FF */
screamer 73:8d28a0cb7b43 210 {0, 0}, /* CR */
screamer 73:8d28a0cb7b43 211 {0, 0}, /* SO */
screamer 73:8d28a0cb7b43 212 {0, 0}, /* SI */
screamer 73:8d28a0cb7b43 213 {0, 0}, /* DEL */
screamer 73:8d28a0cb7b43 214 {0, 0}, /* DC1 */
screamer 73:8d28a0cb7b43 215 {0, 0}, /* DC2 */
screamer 73:8d28a0cb7b43 216 {0, 0}, /* DC3 */
screamer 73:8d28a0cb7b43 217 {0, 0}, /* DC4 */
screamer 73:8d28a0cb7b43 218 {0, 0}, /* NAK */
screamer 73:8d28a0cb7b43 219 {0, 0}, /* SYN */
screamer 73:8d28a0cb7b43 220 {0, 0}, /* ETB */
screamer 73:8d28a0cb7b43 221 {0, 0}, /* CAN */
screamer 73:8d28a0cb7b43 222 {0, 0}, /* EM */
screamer 73:8d28a0cb7b43 223 {0, 0}, /* SUB */
screamer 73:8d28a0cb7b43 224 {0, 0}, /* ESC */
screamer 73:8d28a0cb7b43 225 {0, 0}, /* FS */
screamer 73:8d28a0cb7b43 226 {0, 0}, /* GS */
screamer 73:8d28a0cb7b43 227 {0, 0}, /* RS */
screamer 73:8d28a0cb7b43 228 {0, 0}, /* US */
screamer 73:8d28a0cb7b43 229 {0x2c, 0}, /* */
screamer 73:8d28a0cb7b43 230 {0x1e, KEY_SHIFT}, /* ! */
screamer 73:8d28a0cb7b43 231 {0x1f, KEY_SHIFT}, /* " */
screamer 73:8d28a0cb7b43 232 {0x32, 0}, /* # */
screamer 73:8d28a0cb7b43 233 {0x21, KEY_SHIFT}, /* $ */
screamer 73:8d28a0cb7b43 234 {0x22, KEY_SHIFT}, /* % */
screamer 73:8d28a0cb7b43 235 {0x24, KEY_SHIFT}, /* & */
screamer 73:8d28a0cb7b43 236 {0x34, 0}, /* ' */
screamer 73:8d28a0cb7b43 237 {0x26, KEY_SHIFT}, /* ( */
screamer 73:8d28a0cb7b43 238 {0x27, KEY_SHIFT}, /* ) */
screamer 73:8d28a0cb7b43 239 {0x25, KEY_SHIFT}, /* * */
screamer 73:8d28a0cb7b43 240 {0x2e, KEY_SHIFT}, /* + */
screamer 73:8d28a0cb7b43 241 {0x36, 0}, /* , */
screamer 73:8d28a0cb7b43 242 {0x2d, 0}, /* - */
screamer 73:8d28a0cb7b43 243 {0x37, 0}, /* . */
screamer 73:8d28a0cb7b43 244 {0x38, 0}, /* / */
screamer 73:8d28a0cb7b43 245 {0x27, 0}, /* 0 */
screamer 73:8d28a0cb7b43 246 {0x1e, 0}, /* 1 */
screamer 73:8d28a0cb7b43 247 {0x1f, 0}, /* 2 */
screamer 73:8d28a0cb7b43 248 {0x20, 0}, /* 3 */
screamer 73:8d28a0cb7b43 249 {0x21, 0}, /* 4 */
screamer 73:8d28a0cb7b43 250 {0x22, 0}, /* 5 */
screamer 73:8d28a0cb7b43 251 {0x23, 0}, /* 6 */
screamer 73:8d28a0cb7b43 252 {0x24, 0}, /* 7 */
screamer 73:8d28a0cb7b43 253 {0x25, 0}, /* 8 */
screamer 73:8d28a0cb7b43 254 {0x26, 0}, /* 9 */
screamer 73:8d28a0cb7b43 255 {0x33, KEY_SHIFT}, /* : */
screamer 73:8d28a0cb7b43 256 {0x33, 0}, /* ; */
screamer 73:8d28a0cb7b43 257 {0x36, KEY_SHIFT}, /* < */
screamer 73:8d28a0cb7b43 258 {0x2e, 0}, /* = */
screamer 73:8d28a0cb7b43 259 {0x37, KEY_SHIFT}, /* > */
screamer 73:8d28a0cb7b43 260 {0x38, KEY_SHIFT}, /* ? */
screamer 73:8d28a0cb7b43 261 {0x34, KEY_SHIFT}, /* @ */
screamer 73:8d28a0cb7b43 262 {0x04, KEY_SHIFT}, /* A */
screamer 73:8d28a0cb7b43 263 {0x05, KEY_SHIFT}, /* B */
screamer 73:8d28a0cb7b43 264 {0x06, KEY_SHIFT}, /* C */
screamer 73:8d28a0cb7b43 265 {0x07, KEY_SHIFT}, /* D */
screamer 73:8d28a0cb7b43 266 {0x08, KEY_SHIFT}, /* E */
screamer 73:8d28a0cb7b43 267 {0x09, KEY_SHIFT}, /* F */
screamer 73:8d28a0cb7b43 268 {0x0a, KEY_SHIFT}, /* G */
screamer 73:8d28a0cb7b43 269 {0x0b, KEY_SHIFT}, /* H */
screamer 73:8d28a0cb7b43 270 {0x0c, KEY_SHIFT}, /* I */
screamer 73:8d28a0cb7b43 271 {0x0d, KEY_SHIFT}, /* J */
screamer 73:8d28a0cb7b43 272 {0x0e, KEY_SHIFT}, /* K */
screamer 73:8d28a0cb7b43 273 {0x0f, KEY_SHIFT}, /* L */
screamer 73:8d28a0cb7b43 274 {0x10, KEY_SHIFT}, /* M */
screamer 73:8d28a0cb7b43 275 {0x11, KEY_SHIFT}, /* N */
screamer 73:8d28a0cb7b43 276 {0x12, KEY_SHIFT}, /* O */
screamer 73:8d28a0cb7b43 277 {0x13, KEY_SHIFT}, /* P */
screamer 73:8d28a0cb7b43 278 {0x14, KEY_SHIFT}, /* Q */
screamer 73:8d28a0cb7b43 279 {0x15, KEY_SHIFT}, /* R */
screamer 73:8d28a0cb7b43 280 {0x16, KEY_SHIFT}, /* S */
screamer 73:8d28a0cb7b43 281 {0x17, KEY_SHIFT}, /* T */
screamer 73:8d28a0cb7b43 282 {0x18, KEY_SHIFT}, /* U */
screamer 73:8d28a0cb7b43 283 {0x19, KEY_SHIFT}, /* V */
screamer 73:8d28a0cb7b43 284 {0x1a, KEY_SHIFT}, /* W */
screamer 73:8d28a0cb7b43 285 {0x1b, KEY_SHIFT}, /* X */
screamer 73:8d28a0cb7b43 286 {0x1c, KEY_SHIFT}, /* Y */
screamer 73:8d28a0cb7b43 287 {0x1d, KEY_SHIFT}, /* Z */
screamer 73:8d28a0cb7b43 288 {0x2f, 0}, /* [ */
screamer 73:8d28a0cb7b43 289 {0x64, 0}, /* \ */
screamer 73:8d28a0cb7b43 290 {0x30, 0}, /* ] */
screamer 73:8d28a0cb7b43 291 {0x23, KEY_SHIFT}, /* ^ */
screamer 73:8d28a0cb7b43 292 {0x2d, KEY_SHIFT}, /* _ */
screamer 73:8d28a0cb7b43 293 {0x35, 0}, /* ` */
screamer 73:8d28a0cb7b43 294 {0x04, 0}, /* a */
screamer 73:8d28a0cb7b43 295 {0x05, 0}, /* b */
screamer 73:8d28a0cb7b43 296 {0x06, 0}, /* c */
screamer 73:8d28a0cb7b43 297 {0x07, 0}, /* d */
screamer 73:8d28a0cb7b43 298 {0x08, 0}, /* e */
screamer 73:8d28a0cb7b43 299 {0x09, 0}, /* f */
screamer 73:8d28a0cb7b43 300 {0x0a, 0}, /* g */
screamer 73:8d28a0cb7b43 301 {0x0b, 0}, /* h */
screamer 73:8d28a0cb7b43 302 {0x0c, 0}, /* i */
screamer 73:8d28a0cb7b43 303 {0x0d, 0}, /* j */
screamer 73:8d28a0cb7b43 304 {0x0e, 0}, /* k */
screamer 73:8d28a0cb7b43 305 {0x0f, 0}, /* l */
screamer 73:8d28a0cb7b43 306 {0x10, 0}, /* m */
screamer 73:8d28a0cb7b43 307 {0x11, 0}, /* n */
screamer 73:8d28a0cb7b43 308 {0x12, 0}, /* o */
screamer 73:8d28a0cb7b43 309 {0x13, 0}, /* p */
screamer 73:8d28a0cb7b43 310 {0x14, 0}, /* q */
screamer 73:8d28a0cb7b43 311 {0x15, 0}, /* r */
screamer 73:8d28a0cb7b43 312 {0x16, 0}, /* s */
screamer 73:8d28a0cb7b43 313 {0x17, 0}, /* t */
screamer 73:8d28a0cb7b43 314 {0x18, 0}, /* u */
screamer 73:8d28a0cb7b43 315 {0x19, 0}, /* v */
screamer 73:8d28a0cb7b43 316 {0x1a, 0}, /* w */
screamer 73:8d28a0cb7b43 317 {0x1b, 0}, /* x */
screamer 73:8d28a0cb7b43 318 {0x1c, 0}, /* y */
screamer 73:8d28a0cb7b43 319 {0x1d, 0}, /* z */
screamer 73:8d28a0cb7b43 320 {0x2f, KEY_SHIFT}, /* { */
screamer 73:8d28a0cb7b43 321 {0x64, KEY_SHIFT}, /* | */
screamer 73:8d28a0cb7b43 322 {0x30, KEY_SHIFT}, /* } */
screamer 73:8d28a0cb7b43 323 {0x32, KEY_SHIFT}, /* ~ */
screamer 73:8d28a0cb7b43 324 {0,0}, /* DEL */
screamer 73:8d28a0cb7b43 325
screamer 73:8d28a0cb7b43 326 {0x3a, 0}, /* F1 */
screamer 73:8d28a0cb7b43 327 {0x3b, 0}, /* F2 */
screamer 73:8d28a0cb7b43 328 {0x3c, 0}, /* F3 */
screamer 73:8d28a0cb7b43 329 {0x3d, 0}, /* F4 */
screamer 73:8d28a0cb7b43 330 {0x3e, 0}, /* F5 */
screamer 73:8d28a0cb7b43 331 {0x3f, 0}, /* F6 */
screamer 73:8d28a0cb7b43 332 {0x40, 0}, /* F7 */
screamer 73:8d28a0cb7b43 333 {0x41, 0}, /* F8 */
screamer 73:8d28a0cb7b43 334 {0x42, 0}, /* F9 */
screamer 73:8d28a0cb7b43 335 {0x43, 0}, /* F10 */
screamer 73:8d28a0cb7b43 336 {0x44, 0}, /* F11 */
screamer 73:8d28a0cb7b43 337 {0x45, 0}, /* F12 */
screamer 73:8d28a0cb7b43 338
screamer 73:8d28a0cb7b43 339 {0x46, 0}, /* PRINT_SCREEN */
screamer 73:8d28a0cb7b43 340 {0x47, 0}, /* SCROLL_LOCK */
screamer 73:8d28a0cb7b43 341 {0x39, 0}, /* CAPS_LOCK */
screamer 73:8d28a0cb7b43 342 {0x53, 0}, /* NUM_LOCK */
screamer 73:8d28a0cb7b43 343 {0x49, 0}, /* INSERT */
screamer 73:8d28a0cb7b43 344 {0x4a, 0}, /* HOME */
screamer 73:8d28a0cb7b43 345 {0x4b, 0}, /* PAGE_UP */
screamer 73:8d28a0cb7b43 346 {0x4e, 0}, /* PAGE_DOWN */
screamer 73:8d28a0cb7b43 347
screamer 73:8d28a0cb7b43 348 {0x4f, 0}, /* RIGHT_ARROW */
screamer 73:8d28a0cb7b43 349 {0x50, 0}, /* LEFT_ARROW */
screamer 73:8d28a0cb7b43 350 {0x51, 0}, /* DOWN_ARROW */
screamer 73:8d28a0cb7b43 351 {0x52, 0}, /* UP_ARROW */
screamer 73:8d28a0cb7b43 352 };
screamer 73:8d28a0cb7b43 353 #endif
screamer 73:8d28a0cb7b43 354
screamer 73:8d28a0cb7b43 355 uint8_t * USBKeyboard::reportDesc() {
screamer 73:8d28a0cb7b43 356 static uint8_t reportDescriptor[] = {
screamer 73:8d28a0cb7b43 357 USAGE_PAGE(1), 0x01, // Generic Desktop
screamer 73:8d28a0cb7b43 358 USAGE(1), 0x06, // Keyboard
screamer 73:8d28a0cb7b43 359 COLLECTION(1), 0x01, // Application
screamer 73:8d28a0cb7b43 360 REPORT_ID(1), REPORT_ID_KEYBOARD,
screamer 73:8d28a0cb7b43 361
screamer 73:8d28a0cb7b43 362 USAGE_PAGE(1), 0x07, // Key Codes
screamer 73:8d28a0cb7b43 363 USAGE_MINIMUM(1), 0xE0,
screamer 73:8d28a0cb7b43 364 USAGE_MAXIMUM(1), 0xE7,
screamer 73:8d28a0cb7b43 365 LOGICAL_MINIMUM(1), 0x00,
screamer 73:8d28a0cb7b43 366 LOGICAL_MAXIMUM(1), 0x01,
screamer 73:8d28a0cb7b43 367 REPORT_SIZE(1), 0x01,
screamer 73:8d28a0cb7b43 368 REPORT_COUNT(1), 0x08,
screamer 73:8d28a0cb7b43 369 INPUT(1), 0x02, // Data, Variable, Absolute
screamer 73:8d28a0cb7b43 370 REPORT_COUNT(1), 0x01,
screamer 73:8d28a0cb7b43 371 REPORT_SIZE(1), 0x08,
screamer 73:8d28a0cb7b43 372 INPUT(1), 0x01, // Constant
screamer 73:8d28a0cb7b43 373
screamer 73:8d28a0cb7b43 374
screamer 73:8d28a0cb7b43 375 REPORT_COUNT(1), 0x05,
screamer 73:8d28a0cb7b43 376 REPORT_SIZE(1), 0x01,
screamer 73:8d28a0cb7b43 377 USAGE_PAGE(1), 0x08, // LEDs
screamer 73:8d28a0cb7b43 378 USAGE_MINIMUM(1), 0x01,
screamer 73:8d28a0cb7b43 379 USAGE_MAXIMUM(1), 0x05,
screamer 73:8d28a0cb7b43 380 OUTPUT(1), 0x02, // Data, Variable, Absolute
screamer 73:8d28a0cb7b43 381 REPORT_COUNT(1), 0x01,
screamer 73:8d28a0cb7b43 382 REPORT_SIZE(1), 0x03,
screamer 73:8d28a0cb7b43 383 OUTPUT(1), 0x01, // Constant
screamer 73:8d28a0cb7b43 384
screamer 73:8d28a0cb7b43 385
screamer 73:8d28a0cb7b43 386 REPORT_COUNT(1), 0x06,
screamer 73:8d28a0cb7b43 387 REPORT_SIZE(1), 0x08,
screamer 73:8d28a0cb7b43 388 LOGICAL_MINIMUM(1), 0x00,
screamer 73:8d28a0cb7b43 389 LOGICAL_MAXIMUM(1), 0x65,
screamer 73:8d28a0cb7b43 390 USAGE_PAGE(1), 0x07, // Key Codes
screamer 73:8d28a0cb7b43 391 USAGE_MINIMUM(1), 0x00,
screamer 73:8d28a0cb7b43 392 USAGE_MAXIMUM(1), 0x65,
screamer 73:8d28a0cb7b43 393 INPUT(1), 0x00, // Data, Array
screamer 73:8d28a0cb7b43 394 END_COLLECTION(0),
screamer 73:8d28a0cb7b43 395
screamer 73:8d28a0cb7b43 396 // Media Control
screamer 73:8d28a0cb7b43 397 USAGE_PAGE(1), 0x0C,
screamer 73:8d28a0cb7b43 398 USAGE(1), 0x01,
screamer 73:8d28a0cb7b43 399 COLLECTION(1), 0x01,
screamer 73:8d28a0cb7b43 400 REPORT_ID(1), REPORT_ID_VOLUME,
screamer 73:8d28a0cb7b43 401 USAGE_PAGE(1), 0x0C,
screamer 73:8d28a0cb7b43 402 LOGICAL_MINIMUM(1), 0x00,
screamer 73:8d28a0cb7b43 403 LOGICAL_MAXIMUM(1), 0x01,
screamer 73:8d28a0cb7b43 404 REPORT_SIZE(1), 0x01,
screamer 73:8d28a0cb7b43 405 REPORT_COUNT(1), 0x07,
screamer 73:8d28a0cb7b43 406 USAGE(1), 0xB5, // Next Track
screamer 73:8d28a0cb7b43 407 USAGE(1), 0xB6, // Previous Track
screamer 73:8d28a0cb7b43 408 USAGE(1), 0xB7, // Stop
screamer 73:8d28a0cb7b43 409 USAGE(1), 0xCD, // Play / Pause
screamer 73:8d28a0cb7b43 410 USAGE(1), 0xE2, // Mute
screamer 73:8d28a0cb7b43 411 USAGE(1), 0xE9, // Volume Up
screamer 73:8d28a0cb7b43 412 USAGE(1), 0xEA, // Volume Down
screamer 73:8d28a0cb7b43 413 INPUT(1), 0x02, // Input (Data, Variable, Absolute)
screamer 73:8d28a0cb7b43 414 REPORT_COUNT(1), 0x01,
screamer 73:8d28a0cb7b43 415 INPUT(1), 0x01,
screamer 73:8d28a0cb7b43 416 END_COLLECTION(0),
screamer 73:8d28a0cb7b43 417 };
screamer 73:8d28a0cb7b43 418 reportLength = sizeof(reportDescriptor);
screamer 73:8d28a0cb7b43 419 return reportDescriptor;
screamer 73:8d28a0cb7b43 420 }
screamer 73:8d28a0cb7b43 421
screamer 73:8d28a0cb7b43 422
screamer 73:8d28a0cb7b43 423 bool USBKeyboard::EPINT_OUT_callback() {
screamer 73:8d28a0cb7b43 424 uint32_t bytesRead = 0;
screamer 73:8d28a0cb7b43 425 uint8_t led[65];
screamer 73:8d28a0cb7b43 426 USBDevice::readEP(EPINT_OUT, led, &bytesRead, MAX_HID_REPORT_SIZE);
screamer 73:8d28a0cb7b43 427
screamer 73:8d28a0cb7b43 428 // we take led[1] because led[0] is the report ID
screamer 73:8d28a0cb7b43 429 lock_status = led[1] & 0x07;
screamer 73:8d28a0cb7b43 430
screamer 73:8d28a0cb7b43 431 // We activate the endpoint to be able to recceive data
screamer 73:8d28a0cb7b43 432 if (!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
screamer 73:8d28a0cb7b43 433 return false;
screamer 73:8d28a0cb7b43 434 return true;
screamer 73:8d28a0cb7b43 435 }
screamer 73:8d28a0cb7b43 436
screamer 73:8d28a0cb7b43 437 uint8_t USBKeyboard::lockStatus() {
screamer 73:8d28a0cb7b43 438 return lock_status;
screamer 73:8d28a0cb7b43 439 }
screamer 73:8d28a0cb7b43 440
screamer 73:8d28a0cb7b43 441 int USBKeyboard::_putc(int c) {
screamer 73:8d28a0cb7b43 442 return keyCode(c, keymap[c].modifier);
screamer 73:8d28a0cb7b43 443 }
screamer 73:8d28a0cb7b43 444
screamer 73:8d28a0cb7b43 445 bool USBKeyboard::keyCode(uint8_t key, uint8_t modifier) {
screamer 73:8d28a0cb7b43 446 // Send a simulated keyboard keypress. Returns true if successful.
screamer 73:8d28a0cb7b43 447 HID_REPORT report;
screamer 73:8d28a0cb7b43 448
screamer 73:8d28a0cb7b43 449 report.data[0] = REPORT_ID_KEYBOARD;
screamer 73:8d28a0cb7b43 450 report.data[1] = modifier;
screamer 73:8d28a0cb7b43 451 report.data[2] = 0;
screamer 73:8d28a0cb7b43 452 report.data[3] = keymap[key].usage;
screamer 73:8d28a0cb7b43 453 report.data[4] = 0;
screamer 73:8d28a0cb7b43 454 report.data[5] = 0;
screamer 73:8d28a0cb7b43 455 report.data[6] = 0;
screamer 73:8d28a0cb7b43 456 report.data[7] = 0;
screamer 73:8d28a0cb7b43 457 report.data[8] = 0;
screamer 73:8d28a0cb7b43 458
screamer 73:8d28a0cb7b43 459 report.length = 9;
screamer 73:8d28a0cb7b43 460
screamer 73:8d28a0cb7b43 461 if (!send(&report)) {
screamer 73:8d28a0cb7b43 462 return false;
screamer 73:8d28a0cb7b43 463 }
screamer 73:8d28a0cb7b43 464
screamer 73:8d28a0cb7b43 465 report.data[1] = 0;
screamer 73:8d28a0cb7b43 466 report.data[3] = 0;
screamer 73:8d28a0cb7b43 467
screamer 73:8d28a0cb7b43 468 if (!send(&report)) {
screamer 73:8d28a0cb7b43 469 return false;
screamer 73:8d28a0cb7b43 470 }
screamer 73:8d28a0cb7b43 471
screamer 73:8d28a0cb7b43 472 return true;
screamer 73:8d28a0cb7b43 473
screamer 73:8d28a0cb7b43 474 }
screamer 73:8d28a0cb7b43 475
screamer 73:8d28a0cb7b43 476
screamer 73:8d28a0cb7b43 477 bool USBKeyboard::mediaControl(MEDIA_KEY key) {
screamer 73:8d28a0cb7b43 478 HID_REPORT report;
screamer 73:8d28a0cb7b43 479
screamer 73:8d28a0cb7b43 480 report.data[0] = REPORT_ID_VOLUME;
screamer 73:8d28a0cb7b43 481 report.data[1] = (1 << key) & 0x7f;
screamer 73:8d28a0cb7b43 482
screamer 73:8d28a0cb7b43 483 report.length = 2;
screamer 73:8d28a0cb7b43 484
screamer 73:8d28a0cb7b43 485 if (!send(&report)) {
screamer 73:8d28a0cb7b43 486 return false;
screamer 73:8d28a0cb7b43 487 }
screamer 73:8d28a0cb7b43 488
screamer 73:8d28a0cb7b43 489 report.data[0] = REPORT_ID_VOLUME;
screamer 73:8d28a0cb7b43 490 report.data[1] = 0;
screamer 73:8d28a0cb7b43 491
screamer 73:8d28a0cb7b43 492 report.length = 2;
screamer 73:8d28a0cb7b43 493
screamer 73:8d28a0cb7b43 494 return send(&report);
screamer 73:8d28a0cb7b43 495 }
screamer 73:8d28a0cb7b43 496
screamer 73:8d28a0cb7b43 497
screamer 73:8d28a0cb7b43 498 #define DEFAULT_CONFIGURATION (1)
screamer 73:8d28a0cb7b43 499 #define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \
screamer 73:8d28a0cb7b43 500 + (1 * INTERFACE_DESCRIPTOR_LENGTH) \
screamer 73:8d28a0cb7b43 501 + (1 * HID_DESCRIPTOR_LENGTH) \
screamer 73:8d28a0cb7b43 502 + (2 * ENDPOINT_DESCRIPTOR_LENGTH))
screamer 73:8d28a0cb7b43 503
screamer 73:8d28a0cb7b43 504 uint8_t * USBKeyboard::configurationDesc() {
screamer 73:8d28a0cb7b43 505 static uint8_t configurationDescriptor[] = {
screamer 73:8d28a0cb7b43 506 CONFIGURATION_DESCRIPTOR_LENGTH, // bLength
screamer 73:8d28a0cb7b43 507 CONFIGURATION_DESCRIPTOR, // bDescriptorType
screamer 73:8d28a0cb7b43 508 LSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (LSB)
screamer 73:8d28a0cb7b43 509 MSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (MSB)
screamer 73:8d28a0cb7b43 510 0x01, // bNumInterfaces
screamer 73:8d28a0cb7b43 511 DEFAULT_CONFIGURATION, // bConfigurationValue
screamer 73:8d28a0cb7b43 512 0x00, // iConfiguration
screamer 73:8d28a0cb7b43 513 C_RESERVED | C_SELF_POWERED, // bmAttributes
screamer 73:8d28a0cb7b43 514 C_POWER(0), // bMaxPower
screamer 73:8d28a0cb7b43 515
screamer 73:8d28a0cb7b43 516 INTERFACE_DESCRIPTOR_LENGTH, // bLength
screamer 73:8d28a0cb7b43 517 INTERFACE_DESCRIPTOR, // bDescriptorType
screamer 73:8d28a0cb7b43 518 0x00, // bInterfaceNumber
screamer 73:8d28a0cb7b43 519 0x00, // bAlternateSetting
screamer 73:8d28a0cb7b43 520 0x02, // bNumEndpoints
screamer 73:8d28a0cb7b43 521 HID_CLASS, // bInterfaceClass
screamer 73:8d28a0cb7b43 522 HID_SUBCLASS_BOOT, // bInterfaceSubClass
screamer 73:8d28a0cb7b43 523 HID_PROTOCOL_KEYBOARD, // bInterfaceProtocol
screamer 73:8d28a0cb7b43 524 0x00, // iInterface
screamer 73:8d28a0cb7b43 525
screamer 73:8d28a0cb7b43 526 HID_DESCRIPTOR_LENGTH, // bLength
screamer 73:8d28a0cb7b43 527 HID_DESCRIPTOR, // bDescriptorType
screamer 73:8d28a0cb7b43 528 LSB(HID_VERSION_1_11), // bcdHID (LSB)
screamer 73:8d28a0cb7b43 529 MSB(HID_VERSION_1_11), // bcdHID (MSB)
screamer 73:8d28a0cb7b43 530 0x00, // bCountryCode
screamer 73:8d28a0cb7b43 531 0x01, // bNumDescriptors
screamer 73:8d28a0cb7b43 532 REPORT_DESCRIPTOR, // bDescriptorType
screamer 73:8d28a0cb7b43 533 (uint8_t)(LSB(reportDescLength())), // wDescriptorLength (LSB)
screamer 73:8d28a0cb7b43 534 (uint8_t)(MSB(reportDescLength())), // wDescriptorLength (MSB)
screamer 73:8d28a0cb7b43 535
screamer 73:8d28a0cb7b43 536 ENDPOINT_DESCRIPTOR_LENGTH, // bLength
screamer 73:8d28a0cb7b43 537 ENDPOINT_DESCRIPTOR, // bDescriptorType
screamer 73:8d28a0cb7b43 538 PHY_TO_DESC(EPINT_IN), // bEndpointAddress
screamer 73:8d28a0cb7b43 539 E_INTERRUPT, // bmAttributes
screamer 73:8d28a0cb7b43 540 LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB)
screamer 73:8d28a0cb7b43 541 MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB)
screamer 73:8d28a0cb7b43 542 1, // bInterval (milliseconds)
screamer 73:8d28a0cb7b43 543
screamer 73:8d28a0cb7b43 544 ENDPOINT_DESCRIPTOR_LENGTH, // bLength
screamer 73:8d28a0cb7b43 545 ENDPOINT_DESCRIPTOR, // bDescriptorType
screamer 73:8d28a0cb7b43 546 PHY_TO_DESC(EPINT_OUT), // bEndpointAddress
screamer 73:8d28a0cb7b43 547 E_INTERRUPT, // bmAttributes
screamer 73:8d28a0cb7b43 548 LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB)
screamer 73:8d28a0cb7b43 549 MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB)
screamer 73:8d28a0cb7b43 550 1, // bInterval (milliseconds)
screamer 73:8d28a0cb7b43 551 };
screamer 73:8d28a0cb7b43 552 return configurationDescriptor;
screamer 73:8d28a0cb7b43 553 }