diff options
| author | tmk <nobody@nowhere> | 2011-05-31 21:17:56 +0900 |
|---|---|---|
| committer | tmk <nobody@nowhere> | 2011-05-31 21:25:16 +0900 |
| commit | 6d45e05ede8ea1a96df9a04d58a7d7ede51afd9b (patch) | |
| tree | afad53a7fc2ca86b290af403cf7a2048d02bd526 | |
| parent | af85b6bba6744573f1edecd26fb504c31094414f (diff) | |
| download | qmk_firmware-6d45e05ede8ea1a96df9a04d58a7d7ede51afd9b.tar.gz qmk_firmware-6d45e05ede8ea1a96df9a04d58a7d7ede51afd9b.zip | |
Added PS/2 multimeda key support.
HID Consumer page and System control are also supported now.
merged mediakey branch: d53a356cd2011b461843a5c7c1527a61692893c1
| -rw-r--r-- | host.h | 39 | ||||
| -rw-r--r-- | keyboard.c | 74 | ||||
| -rw-r--r-- | pjrc/host.c | 10 | ||||
| -rw-r--r--[-rwxr-xr-x] | pjrc/usb.c | 165 | ||||
| -rw-r--r-- | pjrc/usb_extra.c | 15 | ||||
| -rw-r--r-- | pjrc/usb_extra.h | 17 | ||||
| -rw-r--r-- | ps2_usb/README | 30 | ||||
| -rw-r--r-- | ps2_usb/keymap.c | 80 | ||||
| -rw-r--r-- | usb_keycodes.h | 211 | ||||
| -rw-r--r-- | vusb/host.c | 154 |
10 files changed, 446 insertions, 349 deletions
| @@ -7,7 +7,7 @@ | |||
| 7 | /* report id */ | 7 | /* report id */ |
| 8 | #define REPORT_ID_MOUSE 1 | 8 | #define REPORT_ID_MOUSE 1 |
| 9 | #define REPORT_ID_SYSTEM 2 | 9 | #define REPORT_ID_SYSTEM 2 |
| 10 | #define REPORT_ID_AUDIO 3 | 10 | #define REPORT_ID_CONSUMER 3 |
| 11 | 11 | ||
| 12 | /* keyboard Modifiers in boot protocol report */ | 12 | /* keyboard Modifiers in boot protocol report */ |
| 13 | #define BIT_LCTRL (1<<0) | 13 | #define BIT_LCTRL (1<<0) |
| @@ -30,15 +30,30 @@ | |||
| 30 | #define MOUSE_BTN4 (1<<3) | 30 | #define MOUSE_BTN4 (1<<3) |
| 31 | #define MOUSE_BTN5 (1<<4) | 31 | #define MOUSE_BTN5 (1<<4) |
| 32 | 32 | ||
| 33 | // Consumer Page(0x0C) Consumer Control(0x01) | 33 | // Consumer Page(0x0C) |
| 34 | #define AUDIO_VOL_UP (1<<0) | 34 | #define AUDIO_MUTE 0x00E2 |
| 35 | #define AUDIO_VOL_DOWN (1<<1) | 35 | #define AUDIO_VOL_UP 0x00E9 |
| 36 | #define AUDIO_MUTE (1<<2) | 36 | #define AUDIO_VOL_DOWN 0x00EA |
| 37 | 37 | #define TRANSPORT_NEXT_TRACK 0x00B5 | |
| 38 | // Generic Desktop Page(0x01) System Control(0x80) | 38 | #define TRANSPORT_PREV_TRACK 0x00B6 |
| 39 | #define SYSTEM_POWER_DOWN (1<<0) | 39 | #define TRANSPORT_STOP 0x00B7 |
| 40 | #define SYSTEM_SLEEP (1<<1) | 40 | #define TRANSPORT_PLAY_PAUSE 0x00CD |
| 41 | #define SYSTEM_WAKE_UP (1<<2) | 41 | #define AL_CC_CONFIG 0x0183 |
| 42 | #define AL_EMAIL 0x018A | ||
| 43 | #define AL_CALCULATOR 0x0192 | ||
| 44 | #define AL_LOCAL_BROWSER 0x0194 | ||
| 45 | #define AC_SEARCH 0x0221 | ||
| 46 | #define AC_HOME 0x0223 | ||
| 47 | #define AC_BACK 0x0224 | ||
| 48 | #define AC_FORWARD 0x0225 | ||
| 49 | #define AC_STOP 0x0226 | ||
| 50 | #define AC_REFRESH 0x0227 | ||
| 51 | #define AC_BOOKMARKS 0x022A | ||
| 52 | |||
| 53 | // Generic Desktop Page(0x01) | ||
| 54 | #define SYSTEM_POWER_DOWN 0x0081 | ||
| 55 | #define SYSTEM_SLEEP 0x0082 | ||
| 56 | #define SYSTEM_WAKE_UP 0x0083 | ||
| 42 | 57 | ||
| 43 | 58 | ||
| 44 | #if defined(HOST_PJRC) | 59 | #if defined(HOST_PJRC) |
| @@ -94,8 +109,8 @@ void host_send_keyboard_report(void); | |||
| 94 | void host_mouse_send(report_mouse_t *report); | 109 | void host_mouse_send(report_mouse_t *report); |
| 95 | #endif | 110 | #endif |
| 96 | #ifdef USB_EXTRA_ENABLE | 111 | #ifdef USB_EXTRA_ENABLE |
| 97 | void host_system_send(uint8_t data); | 112 | void host_system_send(uint16_t data); |
| 98 | void host_audio_send(uint8_t data); | 113 | void host_consumer_send(uint16_t data); |
| 99 | #endif | 114 | #endif |
| 100 | 115 | ||
| 101 | #endif | 116 | #endif |
diff --git a/keyboard.c b/keyboard.c index fd6e23042..af1706735 100644 --- a/keyboard.c +++ b/keyboard.c | |||
| @@ -31,6 +31,9 @@ void keyboard_init(void) | |||
| 31 | void keyboard_proc(void) | 31 | void keyboard_proc(void) |
| 32 | { | 32 | { |
| 33 | uint8_t fn_bits = 0; | 33 | uint8_t fn_bits = 0; |
| 34 | #ifdef USB_EXTRA_ENABLE | ||
| 35 | uint16_t consumer_code = 0; | ||
| 36 | #endif | ||
| 34 | 37 | ||
| 35 | matrix_scan(); | 38 | matrix_scan(); |
| 36 | 39 | ||
| @@ -64,20 +67,8 @@ void keyboard_proc(void) | |||
| 64 | fn_bits |= FN_BIT(code); | 67 | fn_bits |= FN_BIT(code); |
| 65 | } | 68 | } |
| 66 | #ifdef USB_EXTRA_ENABLE | 69 | #ifdef USB_EXTRA_ENABLE |
| 67 | // audio control & system control | 70 | // System Control |
| 68 | else if (code == KB_MUTE) { | 71 | else if (code == KB_SYSTEM_POWER) { |
| 69 | host_audio_send(AUDIO_MUTE); | ||
| 70 | _delay_ms(500); | ||
| 71 | host_audio_send(0); | ||
| 72 | } else if (code == KB_VOLU) { | ||
| 73 | host_audio_send(AUDIO_VOL_UP); | ||
| 74 | _delay_ms(200); | ||
| 75 | host_audio_send(0); | ||
| 76 | } else if (code == KB_VOLD) { | ||
| 77 | host_audio_send(AUDIO_VOL_DOWN); | ||
| 78 | _delay_ms(200); | ||
| 79 | host_audio_send(0); | ||
| 80 | } else if (code == KB_PWR) { | ||
| 81 | #ifdef HOST_PJRC | 72 | #ifdef HOST_PJRC |
| 82 | if (suspend && remote_wakeup) { | 73 | if (suspend && remote_wakeup) { |
| 83 | usb_remote_wakeup(); | 74 | usb_remote_wakeup(); |
| @@ -87,7 +78,57 @@ void keyboard_proc(void) | |||
| 87 | #else | 78 | #else |
| 88 | host_system_send(SYSTEM_POWER_DOWN); | 79 | host_system_send(SYSTEM_POWER_DOWN); |
| 89 | #endif | 80 | #endif |
| 90 | _delay_ms(1000); | 81 | host_system_send(0); |
| 82 | _delay_ms(500); | ||
| 83 | } else if (code == KB_SYSTEM_SLEEP) { | ||
| 84 | host_system_send(SYSTEM_SLEEP); | ||
| 85 | host_system_send(0); | ||
| 86 | _delay_ms(500); | ||
| 87 | } else if (code == KB_SYSTEM_WAKE) { | ||
| 88 | host_system_send(SYSTEM_WAKE_UP); | ||
| 89 | host_system_send(0); | ||
| 90 | _delay_ms(500); | ||
| 91 | } | ||
| 92 | // Consumer Page | ||
| 93 | else if (code == KB_AUDIO_MUTE) { | ||
| 94 | consumer_code = AUDIO_MUTE; | ||
| 95 | } else if (code == KB_AUDIO_VOL_UP) { | ||
| 96 | consumer_code = AUDIO_VOL_UP; | ||
| 97 | } else if (code == KB_AUDIO_VOL_DOWN) { | ||
| 98 | consumer_code = AUDIO_VOL_DOWN; | ||
| 99 | } | ||
| 100 | else if (code == KB_MEDIA_NEXT_TRACK) { | ||
| 101 | consumer_code = TRANSPORT_NEXT_TRACK; | ||
| 102 | } else if (code == KB_MEDIA_PREV_TRACK) { | ||
| 103 | consumer_code = TRANSPORT_PREV_TRACK; | ||
| 104 | } else if (code == KB_MEDIA_STOP) { | ||
| 105 | consumer_code = TRANSPORT_STOP; | ||
| 106 | } else if (code == KB_MEDIA_PLAY_PAUSE) { | ||
| 107 | consumer_code = TRANSPORT_PLAY_PAUSE; | ||
| 108 | } else if (code == KB_MEDIA_SELECT) { | ||
| 109 | consumer_code = AL_CC_CONFIG; | ||
| 110 | } | ||
| 111 | else if (code == KB_MAIL) { | ||
| 112 | consumer_code = AL_EMAIL; | ||
| 113 | } else if (code == KB_CALCULATOR) { | ||
| 114 | consumer_code = AL_CALCULATOR; | ||
| 115 | } else if (code == KB_MY_COMPUTER) { | ||
| 116 | consumer_code = AL_LOCAL_BROWSER; | ||
| 117 | } | ||
| 118 | else if (code == KB_WWW_SEARCH) { | ||
| 119 | consumer_code = AC_SEARCH; | ||
| 120 | } else if (code == KB_WWW_HOME) { | ||
| 121 | consumer_code = AC_HOME; | ||
| 122 | } else if (code == KB_WWW_BACK) { | ||
| 123 | consumer_code = AC_BACK; | ||
| 124 | } else if (code == KB_WWW_FORWARD) { | ||
| 125 | consumer_code = AC_FORWARD; | ||
| 126 | } else if (code == KB_WWW_STOP) { | ||
| 127 | consumer_code = AC_STOP; | ||
| 128 | } else if (code == KB_WWW_REFRESH) { | ||
| 129 | consumer_code = AC_REFRESH; | ||
| 130 | } else if (code == KB_WWW_FAVORITES) { | ||
| 131 | consumer_code = AC_BOOKMARKS; | ||
| 91 | } | 132 | } |
| 92 | #endif | 133 | #endif |
| 93 | else if (IS_KEY(code)) { | 134 | else if (IS_KEY(code)) { |
| @@ -113,6 +154,9 @@ void keyboard_proc(void) | |||
| 113 | // TODO: should send only when changed from last report | 154 | // TODO: should send only when changed from last report |
| 114 | if (matrix_is_modified()) { | 155 | if (matrix_is_modified()) { |
| 115 | host_send_keyboard_report(); | 156 | host_send_keyboard_report(); |
| 157 | #ifdef USB_EXTRA_ENABLE | ||
| 158 | host_consumer_send(consumer_code); | ||
| 159 | #endif | ||
| 116 | #ifdef DEBUG_LED | 160 | #ifdef DEBUG_LED |
| 117 | // LED flash for debug | 161 | // LED flash for debug |
| 118 | DEBUG_LED_CONFIG; | 162 | DEBUG_LED_CONFIG; |
diff --git a/pjrc/host.c b/pjrc/host.c index 2a81e4c5e..ee933ceed 100644 --- a/pjrc/host.c +++ b/pjrc/host.c | |||
| @@ -117,14 +117,18 @@ void host_mouse_send(report_mouse_t *report) | |||
| 117 | #endif | 117 | #endif |
| 118 | 118 | ||
| 119 | #ifdef USB_EXTRA_ENABLE | 119 | #ifdef USB_EXTRA_ENABLE |
| 120 | void host_system_send(uint8_t data) | 120 | void host_system_send(uint16_t data) |
| 121 | { | 121 | { |
| 122 | usb_extra_system_send(data); | 122 | usb_extra_system_send(data); |
| 123 | } | 123 | } |
| 124 | 124 | ||
| 125 | void host_audio_send(uint8_t data) | 125 | void host_consumer_send(uint16_t data) |
| 126 | { | 126 | { |
| 127 | usb_extra_audio_send(data); | 127 | static uint16_t last_data = 0; |
| 128 | if (data == last_data) return; | ||
| 129 | last_data = data; | ||
| 130 | |||
| 131 | usb_extra_consumer_send(data); | ||
| 128 | } | 132 | } |
| 129 | #endif | 133 | #endif |
| 130 | 134 | ||
diff --git a/pjrc/usb.c b/pjrc/usb.c index 711c0e68a..ea2e71b3d 100755..100644 --- a/pjrc/usb.c +++ b/pjrc/usb.c | |||
| @@ -219,76 +219,53 @@ static uint8_t PROGMEM keyboard2_hid_report_desc[] = { | |||
| 219 | // http://www.keil.com/forum/15671/ | 219 | // http://www.keil.com/forum/15671/ |
| 220 | // http://www.microsoft.com/whdc/device/input/wheel.mspx | 220 | // http://www.microsoft.com/whdc/device/input/wheel.mspx |
| 221 | static uint8_t PROGMEM mouse_hid_report_desc[] = { | 221 | static uint8_t PROGMEM mouse_hid_report_desc[] = { |
| 222 | 0x05, 0x01, // USAGE_PAGE (Generic Desktop) | 222 | /* mouse */ |
| 223 | 0x09, 0x02, // USAGE (Mouse) | 223 | 0x05, 0x01, // USAGE_PAGE (Generic Desktop) |
| 224 | 0xa1, 0x01, // COLLECTION (Application) | 224 | 0x09, 0x02, // USAGE (Mouse) |
| 225 | 0x09, 0x02, // USAGE (Mouse) | 225 | 0xa1, 0x01, // COLLECTION (Application) |
| 226 | 0xa1, 0x02, // COLLECTION (Logical) | 226 | //0x85, REPORT_ID_MOUSE, // REPORT_ID (1) |
| 227 | 0x09, 0x01, // USAGE (Pointer) | 227 | 0x09, 0x01, // USAGE (Pointer) |
| 228 | 0xa1, 0x00, // COLLECTION (Physical) | 228 | 0xa1, 0x00, // COLLECTION (Physical) |
| 229 | // ------------------------------ Buttons | 229 | // ---------------------------- Buttons |
| 230 | 0x05, 0x09, // USAGE_PAGE (Button) | 230 | 0x05, 0x09, // USAGE_PAGE (Button) |
| 231 | 0x19, 0x01, // USAGE_MINIMUM (Button 1) | 231 | 0x19, 0x01, // USAGE_MINIMUM (Button 1) |
| 232 | 0x29, 0x05, // USAGE_MAXIMUM (Button 5) | 232 | 0x29, 0x05, // USAGE_MAXIMUM (Button 5) |
| 233 | 0x15, 0x00, // LOGICAL_MINIMUM (0) | 233 | 0x15, 0x00, // LOGICAL_MINIMUM (0) |
| 234 | 0x25, 0x01, // LOGICAL_MAXIMUM (1) | 234 | 0x25, 0x01, // LOGICAL_MAXIMUM (1) |
| 235 | 0x75, 0x01, // REPORT_SIZE (1) | 235 | 0x75, 0x01, // REPORT_SIZE (1) |
| 236 | 0x95, 0x05, // REPORT_COUNT (5) | 236 | 0x95, 0x05, // REPORT_COUNT (5) |
| 237 | 0x81, 0x02, // INPUT (Data,Var,Abs) | 237 | 0x81, 0x02, // INPUT (Data,Var,Abs) |
| 238 | // ------------------------------ Padding | 238 | 0x75, 0x03, // REPORT_SIZE (3) |
| 239 | 0x75, 0x03, // REPORT_SIZE (3) | 239 | 0x95, 0x01, // REPORT_COUNT (1) |
| 240 | 0x95, 0x01, // REPORT_COUNT (1) | 240 | 0x81, 0x03, // INPUT (Cnst,Var,Abs) |
| 241 | 0x81, 0x03, // INPUT (Cnst,Var,Abs) | 241 | // ---------------------------- X,Y position |
| 242 | // ------------------------------ X,Y position | 242 | 0x05, 0x01, // USAGE_PAGE (Generic Desktop) |
| 243 | 0x05, 0x01, // USAGE_PAGE (Generic Desktop) | 243 | 0x09, 0x30, // USAGE (X) |
| 244 | 0x09, 0x30, // USAGE (X) | 244 | 0x09, 0x31, // USAGE (Y) |
| 245 | 0x09, 0x31, // USAGE (Y) | 245 | 0x15, 0x81, // LOGICAL_MINIMUM (-127) |
| 246 | 0x15, 0x81, // LOGICAL_MINIMUM (-127) | 246 | 0x25, 0x7f, // LOGICAL_MAXIMUM (127) |
| 247 | 0x25, 0x7f, // LOGICAL_MAXIMUM (127) | 247 | 0x75, 0x08, // REPORT_SIZE (8) |
| 248 | 0x75, 0x08, // REPORT_SIZE (8) | 248 | 0x95, 0x02, // REPORT_COUNT (2) |
| 249 | 0x95, 0x02, // REPORT_COUNT (2) | 249 | 0x81, 0x06, // INPUT (Data,Var,Rel) |
| 250 | 0x81, 0x06, // INPUT (Data,Var,Rel) | 250 | // ---------------------------- Vertical wheel |
| 251 | 0xa1, 0x02, // COLLECTION (Logical) | 251 | 0x09, 0x38, // USAGE (Wheel) |
| 252 | // ------------------------------ Vertical wheel res multiplier | 252 | 0x15, 0x81, // LOGICAL_MINIMUM (-127) |
| 253 | 0x09, 0x48, // USAGE (Resolution Multiplier) | 253 | 0x25, 0x7f, // LOGICAL_MAXIMUM (127) |
| 254 | 0x15, 0x00, // LOGICAL_MINIMUM (0) | 254 | 0x35, 0x00, // PHYSICAL_MINIMUM (0) - reset physical |
| 255 | 0x25, 0x01, // LOGICAL_MAXIMUM (1) | 255 | 0x45, 0x00, // PHYSICAL_MAXIMUM (0) |
| 256 | 0x35, 0x01, // PHYSICAL_MINIMUM (1) | 256 | 0x75, 0x08, // REPORT_SIZE (8) |
| 257 | 0x45, 0x04, // PHYSICAL_MAXIMUM (4) | 257 | 0x95, 0x01, // REPORT_COUNT (1) |
| 258 | 0x75, 0x02, // REPORT_SIZE (2) | 258 | 0x81, 0x06, // INPUT (Data,Var,Rel) |
| 259 | 0x95, 0x01, // REPORT_COUNT (1) | 259 | // ---------------------------- Horizontal wheel |
| 260 | 0xa4, // PUSH | 260 | 0x05, 0x0c, // USAGE_PAGE (Consumer Devices) |
| 261 | 0xb1, 0x02, // FEATURE (Data,Var,Abs) | 261 | 0x0a, 0x38, 0x02, // USAGE (AC Pan) |
| 262 | // ------------------------------ Vertical wheel | 262 | 0x15, 0x81, // LOGICAL_MINIMUM (-127) |
| 263 | 0x09, 0x38, // USAGE (Wheel) | 263 | 0x25, 0x7f, // LOGICAL_MAXIMUM (127) |
| 264 | 0x15, 0x81, // LOGICAL_MINIMUM (-127) | 264 | 0x75, 0x08, // REPORT_SIZE (8) |
| 265 | 0x25, 0x7f, // LOGICAL_MAXIMUM (127) | 265 | 0x95, 0x01, // REPORT_COUNT (1) |
| 266 | 0x35, 0x00, // PHYSICAL_MINIMUM (0) - reset physical | 266 | 0x81, 0x06, // INPUT (Data,Var,Rel) |
| 267 | 0x45, 0x00, // PHYSICAL_MAXIMUM (0) | 267 | 0xc0, // END_COLLECTION |
| 268 | 0x75, 0x08, // REPORT_SIZE (8) | 268 | 0xc0, // END_COLLECTION |
| 269 | 0x81, 0x06, // INPUT (Data,Var,Rel) | ||
| 270 | 0xc0, // END_COLLECTION | ||
| 271 | 0xa1, 0x02, // COLLECTION (Logical) | ||
| 272 | // ------------------------------ Horizontal wheel res multiplier | ||
| 273 | 0x09, 0x48, // USAGE (Resolution Multiplier) | ||
| 274 | 0xb4, // POP | ||
| 275 | 0xb1, 0x02, // FEATURE (Data,Var,Abs) | ||
| 276 | // ------------------------------ Padding for Feature report | ||
| 277 | 0x35, 0x00, // PHYSICAL_MINIMUM (0) - reset physical | ||
| 278 | 0x45, 0x00, // PHYSICAL_MAXIMUM (0) | ||
| 279 | 0x75, 0x04, // REPORT_SIZE (4) | ||
| 280 | 0xb1, 0x03, // FEATURE (Cnst,Var,Abs) | ||
| 281 | // ------------------------------ Horizontal wheel | ||
| 282 | 0x05, 0x0c, // USAGE_PAGE (Consumer Devices) | ||
| 283 | 0x0a, 0x38, 0x02, // USAGE (AC Pan) | ||
| 284 | 0x15, 0x81, // LOGICAL_MINIMUM (-127) | ||
| 285 | 0x25, 0x7f, // LOGICAL_MAXIMUM (127) | ||
| 286 | 0x75, 0x08, // REPORT_SIZE (8) | ||
| 287 | 0x81, 0x06, // INPUT (Data,Var,Rel) | ||
| 288 | 0xc0, // END_COLLECTION | ||
| 289 | 0xc0, // END_COLLECTION | ||
| 290 | 0xc0, // END_COLLECTION | ||
| 291 | 0xc0 // END_COLLECTION | ||
| 292 | }; | 269 | }; |
| 293 | #endif | 270 | #endif |
| 294 | 271 | ||
| @@ -309,38 +286,32 @@ static uint8_t PROGMEM debug_hid_report_desc[] = { | |||
| 309 | // audio controls & system controls | 286 | // audio controls & system controls |
| 310 | // http://www.microsoft.com/whdc/archive/w2kbd.mspx | 287 | // http://www.microsoft.com/whdc/archive/w2kbd.mspx |
| 311 | static uint8_t PROGMEM extra_hid_report_desc[] = { | 288 | static uint8_t PROGMEM extra_hid_report_desc[] = { |
| 289 | /* system control */ | ||
| 290 | 0x05, 0x01, // USAGE_PAGE (Generic Desktop) | ||
| 291 | 0x09, 0x80, // USAGE (System Control) | ||
| 292 | 0xa1, 0x01, // COLLECTION (Application) | ||
| 293 | 0x85, REPORT_ID_SYSTEM, // REPORT_ID (2) | ||
| 294 | 0x15, 0x01, // LOGICAL_MINIMUM (0x1) | ||
| 295 | 0x25, 0xb7, // LOGICAL_MAXIMUM (0xb7) | ||
| 296 | 0x19, 0x01, // USAGE_MINIMUM (0x1) | ||
| 297 | 0x29, 0xb7, // USAGE_MAXIMUM (0xb7) | ||
| 298 | 0x75, 0x10, // REPORT_SIZE (16) | ||
| 299 | 0x95, 0x01, // REPORT_COUNT (1) | ||
| 300 | 0x81, 0x00, // INPUT (Data,Array,Abs) | ||
| 301 | 0xc0, // END_COLLECTION | ||
| 302 | /* consumer */ | ||
| 312 | 0x05, 0x0c, // USAGE_PAGE (Consumer Devices) | 303 | 0x05, 0x0c, // USAGE_PAGE (Consumer Devices) |
| 313 | 0x09, 0x01, // USAGE (Consumer Control) | 304 | 0x09, 0x01, // USAGE (Consumer Control) |
| 314 | 0xa1, 0x01, // COLLECTION (Application) | 305 | 0xa1, 0x01, // COLLECTION (Application) |
| 315 | 0x85, 0x01, // REPORT_ID (1) | 306 | 0x85, REPORT_ID_CONSUMER, // REPORT_ID (3) |
| 316 | 0x09, 0xe9, // USAGE (Volume Up) | 307 | 0x15, 0x01, // LOGICAL_MINIMUM (0x1) |
| 317 | 0x09, 0xea, // USAGE (Volume Down) | 308 | 0x26, 0x9c, 0x02, // LOGICAL_MAXIMUM (0x29c) |
| 318 | 0x15, 0x00, // LOGICAL_MINIMUM (0) | 309 | 0x19, 0x01, // USAGE_MINIMUM (0x1) |
| 319 | 0x25, 0x01, // LOGICAL_MAXIMUM (1) | 310 | 0x2a, 0x9c, 0x02, // USAGE_MAXIMUM (0x29c) |
| 320 | 0x75, 0x01, // REPORT_SIZE (1) | 311 | 0x75, 0x10, // REPORT_SIZE (16) |
| 321 | 0x95, 0x02, // REPORT_COUNT (2) | ||
| 322 | 0x81, 0x02, // INPUT (Data,Var,Abs) | ||
| 323 | 0x09, 0xe2, // USAGE (Mute) | ||
| 324 | 0x15, 0x00, // LOGICAL_MINIMUM (0) | ||
| 325 | 0x25, 0x01, // LOGICAL_MAXIMUM (1) | ||
| 326 | 0x75, 0x01, // REPORT_SIZE (1) | ||
| 327 | 0x95, 0x01, // REPORT_COUNT (1) | 312 | 0x95, 0x01, // REPORT_COUNT (1) |
| 328 | 0x81, 0x06, // INPUT (Data,Var,Rel) | 313 | 0x81, 0x00, // INPUT (Data,Array,Abs) |
| 329 | 0x95, 0x05, // REPORT_COUNT (5) | ||
| 330 | 0x81, 0x07, // INPUT (Cnst,Var,Abs) | ||
| 331 | 0xc0, // END_COLLECTION | 314 | 0xc0, // END_COLLECTION |
| 332 | |||
| 333 | 0x05, 0x01, // USAGE_PAGE (Generic Desktop) | ||
| 334 | 0x09, 0x80, // USAGE (System Control) | ||
| 335 | 0xa1, 0x01, // COLLECTION (Application) | ||
| 336 | 0x85, 0x02, // REPORT_ID (2) | ||
| 337 | 0x19, 0x81, // USAGE_MINIMUM (System Power Down) | ||
| 338 | 0x29, 0x83, // USAGE_MAXIMUM (System Wake Up) | ||
| 339 | 0x95, 0x03, // REPORT_COUNT (3) | ||
| 340 | 0x81, 0x06, // INPUT (Data,Var,Rel) | ||
| 341 | 0x95, 0x05, // REPORT_COUNT (5) | ||
| 342 | 0x81, 0x07, // INPUT (Cnst,Var,Rel) | ||
| 343 | 0xc0 // END_COLLECTION | ||
| 344 | }; | 315 | }; |
| 345 | #endif | 316 | #endif |
| 346 | 317 | ||
diff --git a/pjrc/usb_extra.c b/pjrc/usb_extra.c index 9bc0c3f5f..670d01e93 100644 --- a/pjrc/usb_extra.c +++ b/pjrc/usb_extra.c | |||
| @@ -1,8 +1,10 @@ | |||
| 1 | #include <util/delay.h> | ||
| 1 | #include <avr/interrupt.h> | 2 | #include <avr/interrupt.h> |
| 3 | #include "host.h" | ||
| 2 | #include "usb_extra.h" | 4 | #include "usb_extra.h" |
| 3 | 5 | ||
| 4 | 6 | ||
| 5 | int8_t usb_extra_send(uint8_t report_id, uint8_t bits) | 7 | int8_t usb_extra_send(uint8_t report_id, uint16_t data) |
| 6 | { | 8 | { |
| 7 | uint8_t intr_state, timeout; | 9 | uint8_t intr_state, timeout; |
| 8 | 10 | ||
| @@ -26,19 +28,20 @@ int8_t usb_extra_send(uint8_t report_id, uint8_t bits) | |||
| 26 | } | 28 | } |
| 27 | 29 | ||
| 28 | UEDATX = report_id; | 30 | UEDATX = report_id; |
| 29 | UEDATX = bits; | 31 | UEDATX = data&0xFF; |
| 32 | UEDATX = (data>>8)&0xFF; | ||
| 30 | 33 | ||
| 31 | UEINTX = 0x3A; | 34 | UEINTX = 0x3A; |
| 32 | SREG = intr_state; | 35 | SREG = intr_state; |
| 33 | return 0; | 36 | return 0; |
| 34 | } | 37 | } |
| 35 | 38 | ||
| 36 | int8_t usb_extra_audio_send(uint8_t bits) | 39 | int8_t usb_extra_consumer_send(uint16_t bits) |
| 37 | { | 40 | { |
| 38 | return usb_extra_send(1, bits); | 41 | return usb_extra_send(REPORT_ID_CONSUMER, bits); |
| 39 | } | 42 | } |
| 40 | 43 | ||
| 41 | int8_t usb_extra_system_send(uint8_t bits) | 44 | int8_t usb_extra_system_send(uint16_t bits) |
| 42 | { | 45 | { |
| 43 | return usb_extra_send(2, bits); | 46 | return usb_extra_send(REPORT_ID_SYSTEM, bits); |
| 44 | } | 47 | } |
diff --git a/pjrc/usb_extra.h b/pjrc/usb_extra.h index d6f9e8ba0..b9128314f 100644 --- a/pjrc/usb_extra.h +++ b/pjrc/usb_extra.h | |||
| @@ -13,22 +13,11 @@ | |||
| 13 | 13 | ||
| 14 | #define EXTRA_INTERFACE 3 | 14 | #define EXTRA_INTERFACE 3 |
| 15 | #define EXTRA_ENDPOINT 4 | 15 | #define EXTRA_ENDPOINT 4 |
| 16 | #define EXTRA_SIZE 2 | 16 | #define EXTRA_SIZE 8 |
| 17 | #define EXTRA_BUFFER EP_DOUBLE_BUFFER | 17 | #define EXTRA_BUFFER EP_DOUBLE_BUFFER |
| 18 | 18 | ||
| 19 | 19 | ||
| 20 | // Consumer Page(0x0C) Consumer Control(0x01) | 20 | int8_t usb_extra_consumer_send(uint16_t bits); |
| 21 | #define AUDIO_VOL_UP (1<<0) | 21 | int8_t usb_extra_system_send(uint16_t bits); |
| 22 | #define AUDIO_VOL_DOWN (1<<1) | ||
| 23 | #define AUDIO_MUTE (1<<2) | ||
| 24 | |||
| 25 | // Generic Desktop Page(0x01) System Control(0x80) | ||
| 26 | #define SYSTEM_POWER_DOWN (1<<0) | ||
| 27 | #define SYSTEM_SLEEP (1<<1) | ||
| 28 | #define SYSTEM_WAKE_UP (1<<2) | ||
| 29 | |||
| 30 | |||
| 31 | int8_t usb_extra_audio_send(uint8_t bits); | ||
| 32 | int8_t usb_extra_system_send(uint8_t bits); | ||
| 33 | 22 | ||
| 34 | #endif | 23 | #endif |
diff --git a/ps2_usb/README b/ps2_usb/README index f4f344c06..0fdeaf1df 100644 --- a/ps2_usb/README +++ b/ps2_usb/README | |||
| @@ -133,4 +133,34 @@ needs a bit of your effort at this time. | |||
| 133 | ), | 133 | ), |
| 134 | 134 | ||
| 135 | 135 | ||
| 136 | Multimedia keys | ||
| 137 | --------------- | ||
| 138 | Following lists PS/2 special keys supported by Windows. | ||
| 139 | http://msdn.microsoft.com/en-us/windows/hardware/gg463372.aspx | ||
| 140 | |||
| 141 | Key PS/2(Set2) HID | ||
| 142 | --------------------------------------------------- | ||
| 143 | System Power E0 37 01 0081 | ||
| 144 | System Sleep E0 3F 01 0082 | ||
| 145 | System Wake E0 5E 01 0083 | ||
| 146 | System Mute E0 23 0C 00E2 | ||
| 147 | Volume Up E0 32 0C 00E9 | ||
| 148 | Volume Down E0 21 0C 00EA | ||
| 149 | Scan Next Track E0 4D 0C 00B5 | ||
| 150 | Scan Previous Track E0 15 0C 00B6 | ||
| 151 | Stop E0 3B 0C 00B7 | ||
| 152 | Play/Pause E0 34 0C 00CD | ||
| 153 | Media Select E0 50 0C 0183 | ||
| 154 | Mail E0 48 0C 018A | ||
| 155 | Calculator E0 2B 0C 0192 | ||
| 156 | My Computer E0 40 0C 0194 | ||
| 157 | WWW Search E0 10 0C 0221 | ||
| 158 | WWW Home E0 3A 0C 0223 | ||
| 159 | WWW Back E0 38 0C 0224 | ||
| 160 | WWW Forward E0 30 0C 0225 | ||
| 161 | WWW Stop E0 28 0C 0226 | ||
| 162 | WWW Refresh E0 20 0C 0227 | ||
| 163 | WWW Favorites E0 18 0C 022A | ||
| 164 | |||
| 165 | |||
| 136 | EOF | 166 | EOF |
diff --git a/ps2_usb/keymap.c b/ps2_usb/keymap.c index 253351f69..7c5bddc9f 100644 --- a/ps2_usb/keymap.c +++ b/ps2_usb/keymap.c | |||
| @@ -13,15 +13,23 @@ | |||
| 13 | 13 | ||
| 14 | #define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)])) | 14 | #define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)])) |
| 15 | 15 | ||
| 16 | // Convert physical keyboard layout to matrix array. | 16 | |
| 17 | // This is a macro to define keymap easily in keyboard layout form. | 17 | // The keymap is a 32*8 matrix which convert a PS/2 scancode into a USB keycode. |
| 18 | #define KEYMAP( \ | 18 | // See matrix.c for the detail of matrix. |
| 19 | K76, K05,K06,K04,K0C, K03,K0B,K83,K0A, K01,K09,K78,K07, KFC,K7E,KFE, KB7,KBF,KDE, \ | 19 | #define KEYMAP_ALL( \ |
| 20 | K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ | ||
| 20 | K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ | 21 | K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ |
| 21 | K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA, K6C,K75,K7D, \ | 22 | K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA, K6C,K75,K7D, \ |
| 22 | K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K79, \ | 23 | K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K79, \ |
| 23 | K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \ | 24 | K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \ |
| 24 | K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA \ | 25 | K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA, \ |
| 26 | \ | ||
| 27 | KB7, KBF, KDE, /* System Power, Sleep, Wake */ \ | ||
| 28 | KA3, KB2, KA1, /* Mute, Volume Up, Volume Down */ \ | ||
| 29 | KCD, K95, KBB, KB4, KD0, /* Next, Previous, Stop, Pause, Media Select */ \ | ||
| 30 | KC8, KAB, KC0, /* Mail, Calculator, My Computer */ \ | ||
| 31 | K90, KBA, KB8, KB0, /* WWW Search, Home, Back, Forward */ \ | ||
| 32 | KA8, KA0, K98 /* WWW Stop, Refresh, Favorites */ \ | ||
| 25 | ) { \ | 33 | ) { \ |
| 26 | { KB_NO, KB_##K01, KB_NO, KB_##K03, KB_##K04, KB_##K05, KB_##K06, KB_##K07 }, \ | 34 | { KB_NO, KB_##K01, KB_NO, KB_##K03, KB_##K04, KB_##K05, KB_##K06, KB_##K07 }, \ |
| 27 | { KB_NO, KB_##K09, KB_##K0A, KB_##K0B, KB_##K0C, KB_##K0D, KB_##K0E, KB_NO }, \ | 35 | { KB_NO, KB_##K09, KB_##K0A, KB_##K0B, KB_##K0C, KB_##K0D, KB_##K0E, KB_NO }, \ |
| @@ -41,15 +49,15 @@ | |||
| 41 | { KB_##K78, KB_##K79, KB_##K7A, KB_##K7B, KB_##K7C, KB_##K7D, KB_##K7E, KB_NO }, \ | 49 | { KB_##K78, KB_##K79, KB_##K7A, KB_##K7B, KB_##K7C, KB_##K7D, KB_##K7E, KB_NO }, \ |
| 42 | { KB_NO, KB_NO, KB_NO, KB_##K83, KB_NO, KB_NO, KB_NO, KB_NO }, \ | 50 | { KB_NO, KB_NO, KB_NO, KB_##K83, KB_NO, KB_NO, KB_NO, KB_NO }, \ |
| 43 | { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, \ | 51 | { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, \ |
| 44 | { KB_NO, KB_##K91, KB_NO, KB_NO, KB_##K94, KB_NO, KB_NO, KB_NO }, \ | 52 | { KB_##K90, KB_##K91, KB_NO, KB_NO, KB_##K94, KB_##K95, KB_NO, KB_NO }, \ |
| 45 | { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_##K9F }, \ | 53 | { KB_##K98, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_##K9F }, \ |
| 46 | { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_##KA7 }, \ | 54 | { KB_##KA0, KB_##KA1, KB_NO, KB_##KA3, KB_NO, KB_NO, KB_NO, KB_##KA7 }, \ |
| 47 | { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_##KAF }, \ | 55 | { KB_##KA8, KB_NO, KB_NO, KB_##KAB, KB_NO, KB_NO, KB_NO, KB_##KAF }, \ |
| 48 | { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_##KB7 }, \ | 56 | { KB_##KB0, KB_NO, KB_##KB2, KB_NO, KB_##KB4, KB_NO, KB_NO, KB_##KB7 }, \ |
| 49 | { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_##KBF }, \ | 57 | { KB_##KB8, KB_NO, KB_##KBA, KB_##KBB, KB_NO, KB_NO, KB_NO, KB_##KBF }, \ |
| 50 | { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, \ | 58 | { KB_##KC0, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, \ |
| 51 | { KB_NO, KB_NO, KB_##KCA, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, \ | 59 | { KB_##KC8, KB_NO, KB_##KCA, KB_NO, KB_NO, KB_##KCD, KB_NO, KB_NO }, \ |
| 52 | { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, \ | 60 | { KB_##KD0, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, \ |
| 53 | { KB_NO, KB_NO, KB_##KDA, KB_NO, KB_NO, KB_NO, KB_##KDE, KB_NO }, \ | 61 | { KB_NO, KB_NO, KB_##KDA, KB_NO, KB_NO, KB_NO, KB_##KDE, KB_NO }, \ |
| 54 | { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, \ | 62 | { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, \ |
| 55 | { KB_NO, KB_##KE9, KB_NO, KB_##KEB, KB_##KEC, KB_NO, KB_NO, KB_NO }, \ | 63 | { KB_NO, KB_##KE9, KB_NO, KB_##KEB, KB_##KEC, KB_NO, KB_NO, KB_NO }, \ |
| @@ -57,6 +65,30 @@ | |||
| 57 | { KB_NO, KB_NO, KB_##KFA, KB_NO, KB_##KFC, KB_##KFD, KB_##KFE, KB_NO }, \ | 65 | { KB_NO, KB_NO, KB_##KFA, KB_NO, KB_##KFC, KB_##KFD, KB_##KFE, KB_NO }, \ |
| 58 | } | 66 | } |
| 59 | 67 | ||
| 68 | #define KEYMAP( \ | ||
| 69 | K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ | ||
| 70 | K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ | ||
| 71 | K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA, K6C,K75,K7D, \ | ||
| 72 | K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K79, \ | ||
| 73 | K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \ | ||
| 74 | K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA \ | ||
| 75 | ) \ | ||
| 76 | KEYMAP_ALL( \ | ||
| 77 | K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ | ||
| 78 | K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ | ||
| 79 | K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA, K6C,K75,K7D, \ | ||
| 80 | K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K79, \ | ||
| 81 | K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \ | ||
| 82 | K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA, \ | ||
| 83 | \ | ||
| 84 | SYSTEM_POWER, SYSTEM_SLEEP, SYSTEM_WAKE, \ | ||
| 85 | AUDIO_MUTE, AUDIO_VOL_UP, AUDIO_VOL_DOWN, \ | ||
| 86 | MEDIA_NEXT_TRACK, MEDIA_PREV_TRACK, MEDIA_STOP, MEDIA_PLAY_PAUSE, MEDIA_SELECT, \ | ||
| 87 | MAIL, CALCULATOR, MY_COMPUTER, \ | ||
| 88 | WWW_SEARCH, WWW_HOME, WWW_BACK, WWW_FORWARD, \ | ||
| 89 | WWW_STOP, WWW_REFRESH, WWW_FAVORITES \ | ||
| 90 | ) | ||
| 91 | |||
| 60 | 92 | ||
| 61 | // Assign Fn key(0-7) to a layer to which switch with the Fn key pressed. | 93 | // Assign Fn key(0-7) to a layer to which switch with the Fn key pressed. |
| 62 | static const uint8_t PROGMEM fn_layer[] = { | 94 | static const uint8_t PROGMEM fn_layer[] = { |
| @@ -102,61 +134,67 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 102 | */ | 134 | */ |
| 103 | /* 0: default */ | 135 | /* 0: default */ |
| 104 | KEYMAP( | 136 | KEYMAP( |
| 105 | ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, PWR, F13, F14, | 137 | ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, |
| 106 | GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, | 138 | GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, |
| 107 | TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, | 139 | TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, |
| 108 | CAPS,FN2, S, D, F, G, H, J, K, L, FN0, QUOT, ENT, P4, P5, P6, PPLS, | 140 | CAPS,FN2, S, D, F, G, H, J, K, L, FN0, QUOT, ENT, P4, P5, P6, PPLS, |
| 109 | LSFT,Z, X, C, V, B, N, M, COMM,DOT, FN1, RSFT, UP, P1, P2, P3, | 141 | LSFT,Z, X, C, V, B, N, M, COMM,DOT, FN1, RSFT, UP, P1, P2, P3, |
| 110 | LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT | 142 | LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT |
| 111 | ), | 143 | ), |
| 144 | |||
| 112 | /* 1: plain Qwerty without layer switching */ | 145 | /* 1: plain Qwerty without layer switching */ |
| 113 | KEYMAP( | 146 | KEYMAP( |
| 114 | ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, PWR, F13, F14, | 147 | ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, |
| 115 | GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, | 148 | GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, |
| 116 | TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, | 149 | TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, |
| 117 | CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, PPLS, | 150 | CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, PPLS, |
| 118 | LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, | 151 | LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, |
| 119 | LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT | 152 | LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT |
| 120 | ), | 153 | ), |
| 154 | |||
| 121 | /* 2: Colemak http://colemak.com */ | 155 | /* 2: Colemak http://colemak.com */ |
| 122 | KEYMAP( | 156 | KEYMAP( |
| 123 | ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, PWR, F13, F14, | 157 | ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, |
| 124 | GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, | 158 | GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, |
| 125 | TAB, Q, W, F, P, G, J, L, U, Y, SCLN,LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, | 159 | TAB, Q, W, F, P, G, J, L, U, Y, SCLN,LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, |
| 126 | BSPC,A, R, S, T, D, H, N, E, I, O, QUOT, ENT, P4, P5, P6, PPLS, | 160 | BSPC,A, R, S, T, D, H, N, E, I, O, QUOT, ENT, P4, P5, P6, PPLS, |
| 127 | LSFT,Z, X, C, V, B, K, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, | 161 | LSFT,Z, X, C, V, B, K, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, |
| 128 | LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT | 162 | LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT |
| 129 | ), | 163 | ), |
| 164 | |||
| 130 | /* 3: Dvorak http://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard */ | 165 | /* 3: Dvorak http://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard */ |
| 131 | KEYMAP( | 166 | KEYMAP( |
| 132 | ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, PWR, F13, F14, | 167 | ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, |
| 133 | GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, LBRC,RBRC,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, | 168 | GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, LBRC,RBRC,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, |
| 134 | TAB, QUOT,COMM,DOT, P, Y, F, G, C, R, L, SLSH,EQL, BSLS, DEL, END, PGDN, P7, P8, P9, | 169 | TAB, QUOT,COMM,DOT, P, Y, F, G, C, R, L, SLSH,EQL, BSLS, DEL, END, PGDN, P7, P8, P9, |
| 135 | CAPS,A, O, E, U, I, D, H, T, N, S, MINS, ENT, P4, P5, P6, PPLS, | 170 | CAPS,A, O, E, U, I, D, H, T, N, S, MINS, ENT, P4, P5, P6, PPLS, |
| 136 | LSFT,SCLN,Q, J, K, X, B, M, W, V, Z, RSFT, UP, P1, P2, P3, | 171 | LSFT,SCLN,Q, J, K, X, B, M, W, V, Z, RSFT, UP, P1, P2, P3, |
| 137 | LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT | 172 | LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT |
| 138 | ), | 173 | ), |
| 174 | |||
| 139 | /* 4: Workman http://viralintrospection.wordpress.com/2010/09/06/a-different-philosophy-in-designing-keyboard-layouts/ */ | 175 | /* 4: Workman http://viralintrospection.wordpress.com/2010/09/06/a-different-philosophy-in-designing-keyboard-layouts/ */ |
| 140 | KEYMAP( | 176 | KEYMAP( |
| 141 | ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, PWR, F13, F14, | 177 | ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, |
| 142 | GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, | 178 | GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, |
| 143 | TAB, Q, D, R, W, B, J, F, U, P, SCLN,LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, | 179 | TAB, Q, D, R, W, B, J, F, U, P, SCLN,LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, |
| 144 | BSPC,A, S, H, T, G, Y, N, E, O, I, QUOT, ENT, P4, P5, P6, PPLS, | 180 | BSPC,A, S, H, T, G, Y, N, E, O, I, QUOT, ENT, P4, P5, P6, PPLS, |
| 145 | LSFT,Z, X, M, C, V, K, L, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, | 181 | LSFT,Z, X, M, C, V, K, L, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, |
| 146 | LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT | 182 | LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT |
| 147 | ), | 183 | ), |
| 184 | |||
| 148 | /* 5: Mouse keys */ | 185 | /* 5: Mouse keys */ |
| 149 | KEYMAP( | 186 | KEYMAP( |
| 150 | ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, PWR, F13, F14, | 187 | ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, |
| 151 | ESC, F1, F2, F3, F4, F5, F6, F7, F8, F8, F10, F11, F12, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, | 188 | ESC, F1, F2, F3, F4, F5, F6, F7, F8, F8, F10, F11, F12, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, |
| 152 | TAB, WH_L,WH_D,MS_U,WH_U,WH_R,WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSLS, DEL, END, PGDN, P7, P8, P9, | 189 | TAB, WH_L,WH_D,MS_U,WH_U,WH_R,WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSLS, DEL, END, PGDN, P7, P8, P9, |
| 153 | CAPS,FN2, MS_L,MS_D,MS_R,NO, MS_L,MS_D,MS_U,MS_R,FN0, NO, ENT, P4, P5, P6, PPLS, | 190 | CAPS,FN2, MS_L,MS_D,MS_R,NO, MS_L,MS_D,MS_U,MS_R,FN0, NO, ENT, P4, P5, P6, PPLS, |
| 154 | LSFT,VOLD,VOLU,MUTE,BTN2,BTN3,BTN2,BTN1,VOLD,VOLU,MUTE, RSFT, UP, P1, P2, P3, | 191 | LSFT,VOLD,VOLU,MUTE,BTN2,BTN3,BTN2,BTN1,VOLD,VOLU,MUTE, RSFT, UP, P1, P2, P3, |
| 155 | LCTL,LGUI,LALT, BTN1, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT | 192 | LCTL,LGUI,LALT, BTN1, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT |
| 156 | ), | 193 | ), |
| 194 | |||
| 157 | /* 6: Cursor keys */ | 195 | /* 6: Cursor keys */ |
| 158 | KEYMAP( | 196 | KEYMAP( |
| 159 | ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, PWR, F13, F14, | 197 | ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, |
| 160 | ESC, F1, F2, F3, F4, F5, F6, F7, F8, F8, F10, F11, F12, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, | 198 | ESC, F1, F2, F3, F4, F5, F6, F7, F8, F8, F10, F11, F12, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, |
| 161 | TAB, NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, NO, NO, NO, BSLS, DEL, END, PGDN, P7, P8, P9, | 199 | TAB, NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, NO, NO, NO, BSLS, DEL, END, PGDN, P7, P8, P9, |
| 162 | CAPS,NO, NO, NO, NO, NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, P4, P5, P6, PPLS, | 200 | CAPS,NO, NO, NO, NO, NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, P4, P5, P6, PPLS, |
diff --git a/usb_keycodes.h b/usb_keycodes.h index dc6f2693b..bdec95391 100644 --- a/usb_keycodes.h +++ b/usb_keycodes.h | |||
| @@ -1,43 +1,13 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Key codes from HID Keyboard/Keypad Page | 2 | * Key codes from HID Keyboard/Keypad Page |
| 3 | * http://www.usb.org/developers/devclass_docs/Hut1_12.pdf | 3 | * http://www.usb.org/developers/devclass_docs/Hut1_12.pdf |
| 4 | * | ||
| 5 | * Based on Keyboard Upgrade v0.3.0 http://github.com/rhomann/kbupgrade | ||
| 6 | */ | ||
| 7 | /* | ||
| 8 | * Keyboard Upgrade -- Firmware for homebrew computer keyboard controllers. | ||
| 9 | * Copyright (C) 2009 Robert Homann | ||
| 10 | * | ||
| 11 | * Based on RUMP (http://mg8.org/rump/), Copyright (C) 2008 Chris Lee | ||
| 12 | * | ||
| 13 | * Based on c64key (http://symlink.dk/projects/c64key/), | ||
| 14 | * Copyright (C) 2006-2007 Mikkel Holm Olsen | ||
| 15 | * | ||
| 16 | * Based on HID-Test by Christian Starkjohann, Objective Development | ||
| 17 | * | ||
| 18 | * This file is part of the Keyboard Upgrade package. | ||
| 19 | * | ||
| 20 | * This program is free software; you can redistribute it and/or modify | ||
| 21 | * it under the terms of the GNU General Public License as published by | ||
| 22 | * the Free Software Foundation; either version 2 of the License, or | ||
| 23 | * (at your option) any later version. | ||
| 24 | * | ||
| 25 | * This program is distributed in the hope that it will be useful, but | ||
| 26 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 27 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 28 | * GNU General Public License for more details. | ||
| 29 | * | ||
| 30 | * You should have received a copy of the GNU General Public License | ||
| 31 | * along with the Keyboard Upgrade package; if not, write to the | ||
| 32 | * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||
| 33 | * MA 02110-1301 USA | ||
| 34 | */ | 4 | */ |
| 35 | #ifndef USB_KEYCODES_H | 5 | #ifndef USB_KEYCODES_H |
| 36 | #define USB_KEYCODES_H | 6 | #define USB_KEYCODES_H |
| 37 | 7 | ||
| 38 | 8 | ||
| 39 | #define IS_ERROR(code) (KB_ROLL_OVER <= (code) && (code) <= KB_UNDEFINED) | 9 | #define IS_ERROR(code) (KB_ROLL_OVER <= (code) && (code) <= KB_UNDEFINED) |
| 40 | #define IS_KEY(code) (KB_A <= (code) && (code) <= KB_KP_HEXADECIMAL) | 10 | #define IS_KEY(code) (KB_A <= (code) && (code) <= KB_EXSEL) |
| 41 | #define IS_MOD(code) (KB_LCTRL <= (code) && (code) <= KB_RGUI) | 11 | #define IS_MOD(code) (KB_LCTRL <= (code) && (code) <= KB_RGUI) |
| 42 | #define IS_FN(code) (KB_FN0 <= (code) && (code) <= KB_FN7) | 12 | #define IS_FN(code) (KB_FN0 <= (code) && (code) <= KB_FN7) |
| 43 | #define IS_MOUSEKEY(code) (KB_MS_UP <= (code) && (code) <= KB_MS_WH_RIGHT) | 13 | #define IS_MOUSEKEY(code) (KB_MS_UP <= (code) && (code) <= KB_MS_WH_RIGHT) |
| @@ -49,9 +19,7 @@ | |||
| 49 | #define FN_BIT(code) (1<<((code) - KB_FN0)) | 19 | #define FN_BIT(code) (1<<((code) - KB_FN0)) |
| 50 | 20 | ||
| 51 | 21 | ||
| 52 | // | 22 | /* Short names */ |
| 53 | // Short names | ||
| 54 | // | ||
| 55 | #define KB_LCTL KB_LCTRL | 23 | #define KB_LCTL KB_LCTRL |
| 56 | #define KB_RCTL KB_RCTRL | 24 | #define KB_RCTL KB_RCTRL |
| 57 | #define KB_LSFT KB_LSHIFT | 25 | #define KB_LSFT KB_LSHIFT |
| @@ -79,20 +47,17 @@ | |||
| 79 | #define KB_SLSH KB_SLASH | 47 | #define KB_SLSH KB_SLASH |
| 80 | #define KB_SCLN KB_SCOLON | 48 | #define KB_SCLN KB_SCOLON |
| 81 | #define KB_QUOT KB_QUOTE | 49 | #define KB_QUOT KB_QUOTE |
| 82 | #define KB_PWR KB_POWER | ||
| 83 | #define KB_VOLU KB_VOLUP | ||
| 84 | #define KB_VOLD KB_VOLDOWN | ||
| 85 | #define KB_APP KB_APPLICATION | 50 | #define KB_APP KB_APPLICATION |
| 86 | #define KB_NUHS KB_NONUS_HASH | 51 | #define KB_NUHS KB_NONUS_HASH |
| 87 | #define KB_NUBS KB_NONUS_BSLASH | 52 | #define KB_NUBS KB_NONUS_BSLASH |
| 88 | // for Japanese | 53 | /* for Japanese */ |
| 89 | #define KB_RO KB_INT1 | 54 | #define KB_RO KB_INT1 |
| 90 | #define KB_KANA KB_INT2 | 55 | #define KB_KANA KB_INT2 |
| 91 | #define KB_JYEN KB_INT3 | 56 | #define KB_JYEN KB_INT3 |
| 92 | #define KB_HENK KB_INT4 | 57 | #define KB_HENK KB_INT4 |
| 93 | #define KB_MHEN KB_INT5 | 58 | #define KB_MHEN KB_INT5 |
| 94 | #define KB_ZEHA KB_GRAVE | 59 | #define KB_ZEHA KB_GRAVE |
| 95 | // Keypad | 60 | /* Keypad */ |
| 96 | #define KB_P1 KB_KP_1 | 61 | #define KB_P1 KB_KP_1 |
| 97 | #define KB_P2 KB_KP_2 | 62 | #define KB_P2 KB_KP_2 |
| 98 | #define KB_P3 KB_KP_3 | 63 | #define KB_P3 KB_KP_3 |
| @@ -110,7 +75,7 @@ | |||
| 110 | #define KB_PPLS KB_KP_PLUS | 75 | #define KB_PPLS KB_KP_PLUS |
| 111 | #define KB_PEQL KB_KP_EQUAL | 76 | #define KB_PEQL KB_KP_EQUAL |
| 112 | #define KB_PENT KB_KP_ENTER | 77 | #define KB_PENT KB_KP_ENTER |
| 113 | // Mousekey | 78 | /* Mousekey */ |
| 114 | #define KB_MS_U KB_MS_UP | 79 | #define KB_MS_U KB_MS_UP |
| 115 | #define KB_MS_D KB_MS_DOWN | 80 | #define KB_MS_D KB_MS_DOWN |
| 116 | #define KB_MS_L KB_MS_LEFT | 81 | #define KB_MS_L KB_MS_LEFT |
| @@ -124,7 +89,68 @@ | |||
| 124 | #define KB_WH_D KB_MS_WH_DOWN | 89 | #define KB_WH_D KB_MS_WH_DOWN |
| 125 | #define KB_WH_L KB_MS_WH_LEFT | 90 | #define KB_WH_L KB_MS_WH_LEFT |
| 126 | #define KB_WH_R KB_MS_WH_RIGHT | 91 | #define KB_WH_R KB_MS_WH_RIGHT |
| 92 | /* Sytem Control & Consumer usage */ | ||
| 93 | #define KB_PWR KB_SYSTEM_POWER | ||
| 94 | #define KB_MUTE KB_AUDIO_MUTE | ||
| 95 | #define KB_VOLU KB_AUDIO_VOL_UP | ||
| 96 | #define KB_VOLD KB_AUDIO_VOL_DOWN | ||
| 97 | |||
| 98 | |||
| 99 | /* Special keycode */ | ||
| 100 | enum special_keycodes { | ||
| 101 | /* System Control */ | ||
| 102 | KB_SYSTEM_POWER = 0xB0, | ||
| 103 | KB_SYSTEM_SLEEP, | ||
| 104 | KB_SYSTEM_WAKE, | ||
| 127 | 105 | ||
| 106 | /* Consumer Page */ | ||
| 107 | KB_AUDIO_MUTE, | ||
| 108 | KB_AUDIO_VOL_UP, | ||
| 109 | KB_AUDIO_VOL_DOWN, | ||
| 110 | KB_MEDIA_NEXT_TRACK, | ||
| 111 | KB_MEDIA_PREV_TRACK, | ||
| 112 | KB_MEDIA_STOP, | ||
| 113 | KB_MEDIA_PLAY_PAUSE, | ||
| 114 | KB_MEDIA_SELECT, | ||
| 115 | KB_MAIL, | ||
| 116 | KB_CALCULATOR, | ||
| 117 | KB_MY_COMPUTER, | ||
| 118 | KB_WWW_SEARCH, | ||
| 119 | KB_WWW_HOME, | ||
| 120 | KB_WWW_BACK, /* 0xC0 */ | ||
| 121 | KB_WWW_FORWARD, | ||
| 122 | KB_WWW_STOP, | ||
| 123 | KB_WWW_REFRESH, | ||
| 124 | KB_WWW_FAVORITES, | ||
| 125 | |||
| 126 | /* reserve 0xE0-E7 for Modifiers */ | ||
| 127 | |||
| 128 | /* Layer Switching */ | ||
| 129 | KB_FN0 = 0xE8, | ||
| 130 | KB_FN1, | ||
| 131 | KB_FN2, | ||
| 132 | KB_FN3, | ||
| 133 | KB_FN4, | ||
| 134 | KB_FN5, | ||
| 135 | KB_FN6, | ||
| 136 | KB_FN7, | ||
| 137 | |||
| 138 | /* Mousekey */ | ||
| 139 | KB_MS_UP = 0xF0, | ||
| 140 | KB_MS_DOWN, | ||
| 141 | KB_MS_LEFT, | ||
| 142 | KB_MS_RIGHT, | ||
| 143 | KB_MS_BTN1, | ||
| 144 | KB_MS_BTN2, | ||
| 145 | KB_MS_BTN3, | ||
| 146 | KB_MS_BTN4, | ||
| 147 | KB_MS_BTN5, | ||
| 148 | /* Mousekey wheel */ | ||
| 149 | KB_MS_WH_UP, | ||
| 150 | KB_MS_WH_DOWN, | ||
| 151 | KB_MS_WH_LEFT, | ||
| 152 | KB_MS_WH_RIGHT, | ||
| 153 | }; | ||
| 128 | 154 | ||
| 129 | enum keycodes { | 155 | enum keycodes { |
| 130 | KB_NO = 0, | 156 | KB_NO = 0, |
| @@ -143,7 +169,7 @@ enum keycodes { | |||
| 143 | KB_J, | 169 | KB_J, |
| 144 | KB_K, | 170 | KB_K, |
| 145 | KB_L, | 171 | KB_L, |
| 146 | KB_M, /* 0x10 */ | 172 | KB_M, /* 0x10 */ |
| 147 | KB_N, | 173 | KB_N, |
| 148 | KB_O, | 174 | KB_O, |
| 149 | KB_P, | 175 | KB_P, |
| @@ -159,7 +185,7 @@ enum keycodes { | |||
| 159 | KB_Z, | 185 | KB_Z, |
| 160 | KB_1, | 186 | KB_1, |
| 161 | KB_2, | 187 | KB_2, |
| 162 | KB_3, /* 0x20 */ | 188 | KB_3, /* 0x20 */ |
| 163 | KB_4, | 189 | KB_4, |
| 164 | KB_5, | 190 | KB_5, |
| 165 | KB_6, | 191 | KB_6, |
| @@ -174,16 +200,16 @@ enum keycodes { | |||
| 174 | KB_SPACE, | 200 | KB_SPACE, |
| 175 | KB_MINUS, | 201 | KB_MINUS, |
| 176 | KB_EQUAL, | 202 | KB_EQUAL, |
| 177 | KB_LBRACKET, /* [ */ | 203 | KB_LBRACKET, |
| 178 | KB_RBRACKET, /* ] */ | 204 | KB_RBRACKET, /* 0x30 */ |
| 179 | KB_BSLASH, /* \ (and |) */ | 205 | KB_BSLASH, /* \ (and |) */ |
| 180 | KB_NONUS_HASH, /* Non-US # and ~ */ | 206 | KB_NONUS_HASH, /* Non-US # and ~ */ |
| 181 | KB_SCOLON, /* ; (and :) */ | 207 | KB_SCOLON, /* ; (and :) */ |
| 182 | KB_QUOTE, /* ' and " */ | 208 | KB_QUOTE, /* ' and " */ |
| 183 | KB_GRAVE, /* Grave accent and tilde */ | 209 | KB_GRAVE, /* Grave accent and tilde */ |
| 184 | KB_COMMA, /* , and < */ | 210 | KB_COMMA, /* , and < */ |
| 185 | KB_DOT, /* . and > */ | 211 | KB_DOT, /* . and > */ |
| 186 | KB_SLASH, /* / and ? */ | 212 | KB_SLASH, /* / and ? */ |
| 187 | KB_CAPSLOCK, | 213 | KB_CAPSLOCK, |
| 188 | KB_F1, | 214 | KB_F1, |
| 189 | KB_F2, | 215 | KB_F2, |
| @@ -191,7 +217,7 @@ enum keycodes { | |||
| 191 | KB_F4, | 217 | KB_F4, |
| 192 | KB_F5, | 218 | KB_F5, |
| 193 | KB_F6, | 219 | KB_F6, |
| 194 | KB_F7, /* 0x40 */ | 220 | KB_F7, /* 0x40 */ |
| 195 | KB_F8, | 221 | KB_F8, |
| 196 | KB_F9, | 222 | KB_F9, |
| 197 | KB_F10, | 223 | KB_F10, |
| @@ -207,7 +233,7 @@ enum keycodes { | |||
| 207 | KB_END, | 233 | KB_END, |
| 208 | KB_PGDOWN, | 234 | KB_PGDOWN, |
| 209 | KB_RIGHT, | 235 | KB_RIGHT, |
| 210 | KB_LEFT, /* 0x50 */ | 236 | KB_LEFT, /* 0x50 */ |
| 211 | KB_DOWN, | 237 | KB_DOWN, |
| 212 | KB_UP, | 238 | KB_UP, |
| 213 | KB_NUMLOCK, | 239 | KB_NUMLOCK, |
| @@ -223,11 +249,11 @@ enum keycodes { | |||
| 223 | KB_KP_5, | 249 | KB_KP_5, |
| 224 | KB_KP_6, | 250 | KB_KP_6, |
| 225 | KB_KP_7, | 251 | KB_KP_7, |
| 226 | KB_KP_8, /* 0x60 */ | 252 | KB_KP_8, /* 0x60 */ |
| 227 | KB_KP_9, | 253 | KB_KP_9, |
| 228 | KB_KP_0, | 254 | KB_KP_0, |
| 229 | KB_KP_DOT, | 255 | KB_KP_DOT, |
| 230 | KB_NONUS_BSLASH, /* Non-US \ and | */ | 256 | KB_NONUS_BSLASH, /* Non-US \ and | */ |
| 231 | KB_APPLICATION, | 257 | KB_APPLICATION, |
| 232 | KB_POWER, | 258 | KB_POWER, |
| 233 | KB_KP_EQUAL, | 259 | KB_KP_EQUAL, |
| @@ -239,7 +265,7 @@ enum keycodes { | |||
| 239 | KB_F18, | 265 | KB_F18, |
| 240 | KB_F19, | 266 | KB_F19, |
| 241 | KB_F20, | 267 | KB_F20, |
| 242 | KB_F21, /* 0x70 */ | 268 | KB_F21, /* 0x70 */ |
| 243 | KB_F22, | 269 | KB_F22, |
| 244 | KB_F23, | 270 | KB_F23, |
| 245 | KB_F24, | 271 | KB_F24, |
| @@ -254,14 +280,14 @@ enum keycodes { | |||
| 254 | KB_COPY, | 280 | KB_COPY, |
| 255 | KB_PASTE, | 281 | KB_PASTE, |
| 256 | KB_FIND, | 282 | KB_FIND, |
| 257 | KB_MUTE, | 283 | KB__MUTE, |
| 258 | KB_VOLUP, /* 0x80 */ | 284 | KB__VOLUP, /* 0x80 */ |
| 259 | KB_VOLDOWN, | 285 | KB__VOLDOWN, |
| 260 | KB_LOCKING_CAPS, /* locking Caps Lock */ | 286 | KB_LOCKING_CAPS, /* locking Caps Lock */ |
| 261 | KB_LOCKING_NUM, /* locking Num Lock */ | 287 | KB_LOCKING_NUM, /* locking Num Lock */ |
| 262 | KB_LOCKING_SCROLL, /* locking Scroll Lock */ | 288 | KB_LOCKING_SCROLL, /* locking Scroll Lock */ |
| 263 | KB_KP_COMMA, | 289 | KB_KP_COMMA, |
| 264 | KB_KP_EQUAL_AS400, /* equal sign on AS/400 */ | 290 | KB_KP_EQUAL_AS400, /* equal sign on AS/400 */ |
| 265 | KB_INT1, | 291 | KB_INT1, |
| 266 | KB_INT2, | 292 | KB_INT2, |
| 267 | KB_INT3, | 293 | KB_INT3, |
| @@ -271,7 +297,7 @@ enum keycodes { | |||
| 271 | KB_INT7, | 297 | KB_INT7, |
| 272 | KB_INT8, | 298 | KB_INT8, |
| 273 | KB_INT9, | 299 | KB_INT9, |
| 274 | KB_LANG1, /* 0x90 */ | 300 | KB_LANG1, /* 0x90 */ |
| 275 | KB_LANG2, | 301 | KB_LANG2, |
| 276 | KB_LANG3, | 302 | KB_LANG3, |
| 277 | KB_LANG4, | 303 | KB_LANG4, |
| @@ -287,12 +313,13 @@ enum keycodes { | |||
| 287 | KB_PRIOR, | 313 | KB_PRIOR, |
| 288 | KB_RETURN, | 314 | KB_RETURN, |
| 289 | KB_SEPARATOR, | 315 | KB_SEPARATOR, |
| 290 | KB_OUT, | 316 | KB_OUT, /* 0xA0 */ |
| 291 | KB_OPER, | 317 | KB_OPER, |
| 292 | KB_CLEAR_AGAIN, | 318 | KB_CLEAR_AGAIN, |
| 293 | KB_CRSEL, | 319 | KB_CRSEL, |
| 294 | KB_EXSEL, | 320 | KB_EXSEL, |
| 295 | 321 | ||
| 322 | /* NOTE: uses 0xB0-DF for special keycodes */ | ||
| 296 | KB_KP_00 = 0xB0, | 323 | KB_KP_00 = 0xB0, |
| 297 | KB_KP_000, | 324 | KB_KP_000, |
| 298 | KB_THOUSANDS_SEPARATOR, | 325 | KB_THOUSANDS_SEPARATOR, |
| @@ -301,15 +328,15 @@ enum keycodes { | |||
| 301 | KB_CURRENCY_SUB_UNIT, | 328 | KB_CURRENCY_SUB_UNIT, |
| 302 | KB_KP_LPAREN, | 329 | KB_KP_LPAREN, |
| 303 | KB_KP_RPAREN, | 330 | KB_KP_RPAREN, |
| 304 | KB_KP_LCBRACKET, /* { */ | 331 | KB_KP_LCBRACKET, /* { */ |
| 305 | KB_KP_RCBRACKET, /* } */ | 332 | KB_KP_RCBRACKET, /* } */ |
| 306 | KB_KP_TAB, | 333 | KB_KP_TAB, |
| 307 | KB_KP_BSPACE, | 334 | KB_KP_BSPACE, |
| 308 | KB_KP_A, | 335 | KB_KP_A, |
| 309 | KB_KP_B, | 336 | KB_KP_B, |
| 310 | KB_KP_C, | 337 | KB_KP_C, |
| 311 | KB_KP_D, | 338 | KB_KP_D, |
| 312 | KB_KP_E, | 339 | KB_KP_E, /* 0xC0 */ |
| 313 | KB_KP_F, | 340 | KB_KP_F, |
| 314 | KB_KP_XOR, | 341 | KB_KP_XOR, |
| 315 | KB_KP_HAT, | 342 | KB_KP_HAT, |
| @@ -325,7 +352,7 @@ enum keycodes { | |||
| 325 | KB_KP_SPACE, | 352 | KB_KP_SPACE, |
| 326 | KB_KP_ATMARK, | 353 | KB_KP_ATMARK, |
| 327 | KB_KP_EXCLAMATION, | 354 | KB_KP_EXCLAMATION, |
| 328 | KB_KP_MEM_STORE, | 355 | KB_KP_MEM_STORE, /* 0xD0 */ |
| 329 | KB_KP_MEM_RECALL, | 356 | KB_KP_MEM_RECALL, |
| 330 | KB_KP_MEM_CLEAR, | 357 | KB_KP_MEM_CLEAR, |
| 331 | KB_KP_MEM_ADD, | 358 | KB_KP_MEM_ADD, |
| @@ -340,41 +367,17 @@ enum keycodes { | |||
| 340 | KB_KP_DECIMAL, | 367 | KB_KP_DECIMAL, |
| 341 | KB_KP_HEXADECIMAL, | 368 | KB_KP_HEXADECIMAL, |
| 342 | 369 | ||
| 343 | /* modifiers */ | 370 | /* Modifiers */ |
| 344 | KB_LCTRL = 0xE0, /* 0x01 */ | 371 | KB_LCTRL = 0xE0, |
| 345 | KB_LSHIFT, /* 0x02 */ | 372 | KB_LSHIFT, |
| 346 | KB_LALT, /* 0x04 */ | 373 | KB_LALT, |
| 347 | KB_LGUI, /* 0x08 */ | 374 | KB_LGUI, |
| 348 | KB_RCTRL, /* 0x10 */ | 375 | KB_RCTRL, |
| 349 | KB_RSHIFT, /* 0x20 */ | 376 | KB_RSHIFT, |
| 350 | KB_RALT, /* 0x40 */ | 377 | KB_RALT, |
| 351 | KB_RGUI, /* 0x80 */ | 378 | KB_RGUI, |
| 352 | 379 | ||
| 353 | /* extensions for internal use */ | 380 | /* NOTE: uses 0xE8-FF for special keycodes */ |
| 354 | KB_FN0 = 0xE8, | ||
| 355 | KB_FN1, | ||
| 356 | KB_FN2, | ||
| 357 | KB_FN3, | ||
| 358 | KB_FN4, | ||
| 359 | KB_FN5, | ||
| 360 | KB_FN6, | ||
| 361 | KB_FN7, | ||
| 362 | // Mousekey move | ||
| 363 | KB_MS_UP = 0xF0, | ||
| 364 | KB_MS_DOWN, | ||
| 365 | KB_MS_LEFT, | ||
| 366 | KB_MS_RIGHT, | ||
| 367 | // Mousekey buttons | ||
| 368 | KB_MS_BTN1 = 0xF4, | ||
| 369 | KB_MS_BTN2, | ||
| 370 | KB_MS_BTN3, | ||
| 371 | KB_MS_BTN4, | ||
| 372 | KB_MS_BTN5, | ||
| 373 | // Mousekey wheel | ||
| 374 | KB_MS_WH_UP, | ||
| 375 | KB_MS_WH_DOWN, | ||
| 376 | KB_MS_WH_LEFT, | ||
| 377 | KB_MS_WH_RIGHT, | ||
| 378 | }; | 381 | }; |
| 379 | 382 | ||
| 380 | #endif /* USB_KEYCODES_H */ | 383 | #endif /* USB_KEYCODES_H */ |
diff --git a/vusb/host.c b/vusb/host.c index 6b091a723..0a507d482 100644 --- a/vusb/host.c +++ b/vusb/host.c | |||
| @@ -146,10 +146,12 @@ void host_mouse_send(report_mouse_t *report) | |||
| 146 | #endif | 146 | #endif |
| 147 | 147 | ||
| 148 | #ifdef USB_EXTRA_ENABLE | 148 | #ifdef USB_EXTRA_ENABLE |
| 149 | void host_system_send(uint8_t data) | 149 | void host_system_send(uint16_t data) |
| 150 | { | 150 | { |
| 151 | static uint8_t report[] = { REPORT_ID_SYSTEM, 0 }; | 151 | // Not need static? |
| 152 | report[1] = data; | 152 | static uint8_t report[] = { REPORT_ID_SYSTEM, 0, 0 }; |
| 153 | report[1] = data&0xFF; | ||
| 154 | report[2] = (data>>8)&0xFF; | ||
| 153 | if (usbInterruptIsReady3()) { | 155 | if (usbInterruptIsReady3()) { |
| 154 | usbSetInterrupt3((void *)&report, sizeof(report)); | 156 | usbSetInterrupt3((void *)&report, sizeof(report)); |
| 155 | } else { | 157 | } else { |
| @@ -157,10 +159,16 @@ void host_system_send(uint8_t data) | |||
| 157 | } | 159 | } |
| 158 | } | 160 | } |
| 159 | 161 | ||
| 160 | void host_audio_send(uint8_t data) | 162 | void host_consumer_send(uint16_t data) |
| 161 | { | 163 | { |
| 162 | static uint8_t report[] = { REPORT_ID_AUDIO, 0 }; | 164 | static uint16_t last_data = 0; |
| 163 | report[1] = data; | 165 | if (data == last_data) return; |
| 166 | last_data = data; | ||
| 167 | |||
| 168 | // Not need static? | ||
| 169 | static uint8_t report[] = { REPORT_ID_CONSUMER, 0, 0 }; | ||
| 170 | report[1] = data&0xFF; | ||
| 171 | report[2] = (data>>8)&0xFF; | ||
| 164 | if (usbInterruptIsReady3()) { | 172 | if (usbInterruptIsReady3()) { |
| 165 | usbSetInterrupt3((void *)&report, sizeof(report)); | 173 | usbSetInterrupt3((void *)&report, sizeof(report)); |
| 166 | } else { | 174 | } else { |
| @@ -293,85 +301,77 @@ PROGMEM uchar keyboard_hid_report[] = { | |||
| 293 | */ | 301 | */ |
| 294 | PROGMEM uchar mouse_hid_report[] = { | 302 | PROGMEM uchar mouse_hid_report[] = { |
| 295 | /* mouse */ | 303 | /* mouse */ |
| 296 | 0x05, 0x01, // USAGE_PAGE (Generic Desktop) | 304 | 0x05, 0x01, // USAGE_PAGE (Generic Desktop) |
| 297 | 0x09, 0x02, // USAGE (Mouse) | 305 | 0x09, 0x02, // USAGE (Mouse) |
| 298 | 0xa1, 0x01, // COLLECTION (Application) | 306 | 0xa1, 0x01, // COLLECTION (Application) |
| 299 | 0x85, 0x01, // REPORT_ID (1) | 307 | 0x85, REPORT_ID_MOUSE, // REPORT_ID (1) |
| 300 | 0x09, 0x01, // USAGE (Pointer) | 308 | 0x09, 0x01, // USAGE (Pointer) |
| 301 | 0xa1, 0x00, // COLLECTION (Physical) | 309 | 0xa1, 0x00, // COLLECTION (Physical) |
| 302 | // ---------------------------- Buttons | 310 | // ---------------------------- Buttons |
| 303 | 0x05, 0x09, // USAGE_PAGE (Button) | 311 | 0x05, 0x09, // USAGE_PAGE (Button) |
| 304 | 0x19, 0x01, // USAGE_MINIMUM (Button 1) | 312 | 0x19, 0x01, // USAGE_MINIMUM (Button 1) |
| 305 | 0x29, 0x05, // USAGE_MAXIMUM (Button 5) | 313 | 0x29, 0x05, // USAGE_MAXIMUM (Button 5) |
| 306 | 0x15, 0x00, // LOGICAL_MINIMUM (0) | 314 | 0x15, 0x00, // LOGICAL_MINIMUM (0) |
| 307 | 0x25, 0x01, // LOGICAL_MAXIMUM (1) | 315 | 0x25, 0x01, // LOGICAL_MAXIMUM (1) |
| 308 | 0x75, 0x01, // REPORT_SIZE (1) | 316 | 0x75, 0x01, // REPORT_SIZE (1) |
| 309 | 0x95, 0x05, // REPORT_COUNT (5) | 317 | 0x95, 0x05, // REPORT_COUNT (5) |
| 310 | 0x81, 0x02, // INPUT (Data,Var,Abs) | 318 | 0x81, 0x02, // INPUT (Data,Var,Abs) |
| 311 | // ---------------------------- Padding | 319 | 0x75, 0x03, // REPORT_SIZE (3) |
| 312 | 0x75, 0x03, // REPORT_SIZE (3) | 320 | 0x95, 0x01, // REPORT_COUNT (1) |
| 313 | 0x95, 0x01, // REPORT_COUNT (1) | 321 | 0x81, 0x03, // INPUT (Cnst,Var,Abs) |
| 314 | 0x81, 0x03, // INPUT (Cnst,Var,Abs) | 322 | // ---------------------------- X,Y position |
| 315 | // ---------------------------- X,Y position | 323 | 0x05, 0x01, // USAGE_PAGE (Generic Desktop) |
| 316 | 0x05, 0x01, // USAGE_PAGE (Generic Desktop) | 324 | 0x09, 0x30, // USAGE (X) |
| 317 | 0x09, 0x30, // USAGE (X) | 325 | 0x09, 0x31, // USAGE (Y) |
| 318 | 0x09, 0x31, // USAGE (Y) | 326 | 0x15, 0x81, // LOGICAL_MINIMUM (-127) |
| 319 | 0x15, 0x81, // LOGICAL_MINIMUM (-127) | 327 | 0x25, 0x7f, // LOGICAL_MAXIMUM (127) |
| 320 | 0x25, 0x7f, // LOGICAL_MAXIMUM (127) | 328 | 0x75, 0x08, // REPORT_SIZE (8) |
| 321 | 0x75, 0x08, // REPORT_SIZE (8) | 329 | 0x95, 0x02, // REPORT_COUNT (2) |
| 322 | 0x95, 0x02, // REPORT_COUNT (2) | 330 | 0x81, 0x06, // INPUT (Data,Var,Rel) |
| 323 | 0x81, 0x06, // INPUT (Data,Var,Rel) | 331 | // ---------------------------- Vertical wheel |
| 324 | // ---------------------------- Vertical wheel | 332 | 0x09, 0x38, // USAGE (Wheel) |
| 325 | 0x09, 0x38, // USAGE (Wheel) | 333 | 0x15, 0x81, // LOGICAL_MINIMUM (-127) |
| 326 | 0x15, 0x81, // LOGICAL_MINIMUM (-127) | 334 | 0x25, 0x7f, // LOGICAL_MAXIMUM (127) |
| 327 | 0x25, 0x7f, // LOGICAL_MAXIMUM (127) | 335 | 0x35, 0x00, // PHYSICAL_MINIMUM (0) - reset physical |
| 328 | 0x35, 0x00, // PHYSICAL_MINIMUM (0) - reset physical | 336 | 0x45, 0x00, // PHYSICAL_MAXIMUM (0) |
| 329 | 0x45, 0x00, // PHYSICAL_MAXIMUM (0) | 337 | 0x75, 0x08, // REPORT_SIZE (8) |
| 330 | 0x75, 0x08, // REPORT_SIZE (8) | 338 | 0x95, 0x01, // REPORT_COUNT (1) |
| 331 | 0x95, 0x01, // REPORT_COUNT (1) | 339 | 0x81, 0x06, // INPUT (Data,Var,Rel) |
| 332 | 0x81, 0x06, // INPUT (Data,Var,Rel) | 340 | // ---------------------------- Horizontal wheel |
| 333 | // ---------------------------- Horizontal wheel | 341 | 0x05, 0x0c, // USAGE_PAGE (Consumer Devices) |
| 334 | 0x05, 0x0c, // USAGE_PAGE (Consumer Devices) | 342 | 0x0a, 0x38, 0x02, // USAGE (AC Pan) |
| 335 | 0x0a, 0x38, 0x02, // USAGE (AC Pan) | 343 | 0x15, 0x81, // LOGICAL_MINIMUM (-127) |
| 336 | 0x15, 0x81, // LOGICAL_MINIMUM (-127) | 344 | 0x25, 0x7f, // LOGICAL_MAXIMUM (127) |
| 337 | 0x25, 0x7f, // LOGICAL_MAXIMUM (127) | 345 | 0x75, 0x08, // REPORT_SIZE (8) |
| 338 | 0x75, 0x08, // REPORT_SIZE (8) | 346 | 0x95, 0x01, // REPORT_COUNT (1) |
| 339 | 0x95, 0x01, // REPORT_COUNT (1) | 347 | 0x81, 0x06, // INPUT (Data,Var,Rel) |
| 340 | 0x81, 0x06, // INPUT (Data,Var,Rel) | 348 | 0xc0, // END_COLLECTION |
| 341 | 0xc0, // END_COLLECTION | 349 | 0xc0, // END_COLLECTION |
| 342 | 0xc0, // END_COLLECTION | 350 | /* system control */ |
| 343 | /* system */ | ||
| 344 | 0x05, 0x01, // USAGE_PAGE (Generic Desktop) | 351 | 0x05, 0x01, // USAGE_PAGE (Generic Desktop) |
| 345 | 0x09, 0x80, // USAGE (System Control) | 352 | 0x09, 0x80, // USAGE (System Control) |
| 346 | 0xa1, 0x01, // COLLECTION (Application) | 353 | 0xa1, 0x01, // COLLECTION (Application) |
| 347 | 0x85, 0x02, // REPORT_ID (2) | 354 | 0x85, REPORT_ID_SYSTEM, // REPORT_ID (2) |
| 348 | 0x19, 0x81, // USAGE_MINIMUM (System Power Down) | 355 | 0x15, 0x01, // LOGICAL_MINIMUM (0x1) |
| 349 | 0x29, 0x83, // USAGE_MAXIMUM (System Wake Up) | 356 | 0x25, 0xb7, // LOGICAL_MAXIMUM (0xb7) |
| 350 | 0x75, 0x01, // REPORT_SIZE (1) | 357 | 0x19, 0x01, // USAGE_MINIMUM (0x1) |
| 351 | 0x95, 0x03, // REPORT_COUNT (3) | 358 | 0x29, 0xb7, // USAGE_MAXIMUM (0xb7) |
| 352 | 0x81, 0x06, // INPUT (Data,Var,Rel) | 359 | 0x75, 0x10, // REPORT_SIZE (16) |
| 353 | 0x95, 0x05, // REPORT_COUNT (5) | 360 | 0x95, 0x01, // REPORT_COUNT (1) |
| 354 | 0x81, 0x07, // INPUT (Cnst,Var,Rel) | 361 | 0x81, 0x00, // INPUT (Data,Array,Abs) |
| 355 | 0xc0, // END_COLLECTION | 362 | 0xc0, // END_COLLECTION |
| 356 | /* audio */ | 363 | /* consumer */ |
| 357 | 0x05, 0x0c, // USAGE_PAGE (Consumer Devices) | 364 | 0x05, 0x0c, // USAGE_PAGE (Consumer Devices) |
| 358 | 0x09, 0x01, // USAGE (Consumer Control) | 365 | 0x09, 0x01, // USAGE (Consumer Control) |
| 359 | 0xa1, 0x01, // COLLECTION (Application) | 366 | 0xa1, 0x01, // COLLECTION (Application) |
| 360 | 0x85, 0x03, // REPORT_ID (3) | 367 | 0x85, REPORT_ID_CONSUMER, // REPORT_ID (3) |
| 361 | 0x09, 0xe9, // USAGE (Volume Up) | 368 | 0x15, 0x01, // LOGICAL_MINIMUM (0x1) |
| 362 | 0x09, 0xea, // USAGE (Volume Down) | 369 | 0x26, 0x9c, 0x02, // LOGICAL_MAXIMUM (0x29c) |
| 363 | 0x15, 0x00, // LOGICAL_MINIMUM (0) | 370 | 0x19, 0x01, // USAGE_MINIMUM (0x1) |
| 364 | 0x25, 0x01, // LOGICAL_MAXIMUM (1) | 371 | 0x2a, 0x9c, 0x02, // USAGE_MAXIMUM (0x29c) |
| 365 | 0x75, 0x01, // REPORT_SIZE (1) | 372 | 0x75, 0x10, // REPORT_SIZE (16) |
| 366 | 0x95, 0x02, // REPORT_COUNT (2) | ||
| 367 | 0x81, 0x02, // INPUT (Data,Var,Abs) | ||
| 368 | 0x09, 0xe2, // USAGE (Mute) | ||
| 369 | 0x15, 0x00, // LOGICAL_MINIMUM (0) | ||
| 370 | 0x25, 0x01, // LOGICAL_MAXIMUM (1) | ||
| 371 | 0x95, 0x01, // REPORT_COUNT (1) | 373 | 0x95, 0x01, // REPORT_COUNT (1) |
| 372 | 0x81, 0x06, // INPUT (Data,Var,Rel) | 374 | 0x81, 0x00, // INPUT (Data,Array,Abs) |
| 373 | 0x95, 0x05, // REPORT_COUNT (5) | ||
| 374 | 0x81, 0x07, // INPUT (Cnst,Var,Abs) | ||
| 375 | 0xc0, // END_COLLECTION | 375 | 0xc0, // END_COLLECTION |
| 376 | }; | 376 | }; |
| 377 | 377 | ||
