aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortmk <nobody@nowhere>2011-05-31 21:17:56 +0900
committertmk <nobody@nowhere>2011-05-31 21:25:16 +0900
commit6d45e05ede8ea1a96df9a04d58a7d7ede51afd9b (patch)
treeafad53a7fc2ca86b290af403cf7a2048d02bd526
parentaf85b6bba6744573f1edecd26fb504c31094414f (diff)
downloadqmk_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.h39
-rw-r--r--keyboard.c74
-rw-r--r--pjrc/host.c10
-rw-r--r--[-rwxr-xr-x]pjrc/usb.c165
-rw-r--r--pjrc/usb_extra.c15
-rw-r--r--pjrc/usb_extra.h17
-rw-r--r--ps2_usb/README30
-rw-r--r--ps2_usb/keymap.c80
-rw-r--r--usb_keycodes.h211
-rw-r--r--vusb/host.c154
10 files changed, 446 insertions, 349 deletions
diff --git a/host.h b/host.h
index 7ba9dd43c..7ddcafc0d 100644
--- a/host.h
+++ b/host.h
@@ -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);
94void host_mouse_send(report_mouse_t *report); 109void host_mouse_send(report_mouse_t *report);
95#endif 110#endif
96#ifdef USB_EXTRA_ENABLE 111#ifdef USB_EXTRA_ENABLE
97void host_system_send(uint8_t data); 112void host_system_send(uint16_t data);
98void host_audio_send(uint8_t data); 113void 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)
31void keyboard_proc(void) 31void 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
120void host_system_send(uint8_t data) 120void host_system_send(uint16_t data)
121{ 121{
122 usb_extra_system_send(data); 122 usb_extra_system_send(data);
123} 123}
124 124
125void host_audio_send(uint8_t data) 125void 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
221static uint8_t PROGMEM mouse_hid_report_desc[] = { 221static 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
311static uint8_t PROGMEM extra_hid_report_desc[] = { 288static 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
5int8_t usb_extra_send(uint8_t report_id, uint8_t bits) 7int8_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
36int8_t usb_extra_audio_send(uint8_t bits) 39int8_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
41int8_t usb_extra_system_send(uint8_t bits) 44int8_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) 20int8_t usb_extra_consumer_send(uint16_t bits);
21#define AUDIO_VOL_UP (1<<0) 21int8_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
31int8_t usb_extra_audio_send(uint8_t bits);
32int8_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
136Multimedia keys
137---------------
138Following lists PS/2 special keys supported by Windows.
139http://msdn.microsoft.com/en-us/windows/hardware/gg463372.aspx
140
141Key PS/2(Set2) HID
142---------------------------------------------------
143System Power E0 37 01 0081
144System Sleep E0 3F 01 0082
145System Wake E0 5E 01 0083
146System Mute E0 23 0C 00E2
147Volume Up E0 32 0C 00E9
148Volume Down E0 21 0C 00EA
149Scan Next Track E0 4D 0C 00B5
150Scan Previous Track E0 15 0C 00B6
151Stop E0 3B 0C 00B7
152Play/Pause E0 34 0C 00CD
153Media Select E0 50 0C 0183
154Mail E0 48 0C 018A
155Calculator E0 2B 0C 0192
156My Computer E0 40 0C 0194
157WWW Search E0 10 0C 0221
158WWW Home E0 3A 0C 0223
159WWW Back E0 38 0C 0224
160WWW Forward E0 30 0C 0225
161WWW Stop E0 28 0C 0226
162WWW Refresh E0 20 0C 0227
163WWW Favorites E0 18 0C 022A
164
165
136EOF 166EOF
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) \
76KEYMAP_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.
62static const uint8_t PROGMEM fn_layer[] = { 94static 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 */
100enum 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
129enum keycodes { 155enum 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
149void host_system_send(uint8_t data) 149void 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
160void host_audio_send(uint8_t data) 162void 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 */
294PROGMEM uchar mouse_hid_report[] = { 302PROGMEM 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