Browse Source

Added PS/2 multimeda key support.
HID Consumer page and System control are also supported now.
merged mediakey branch: d53a356cd2011b461843a5c7c1527a61692893c1

tmk 14 năm trước cách đây
mục cha
commit
6d45e05ede
10 tập tin đã thay đổi với 446 bổ sung349 xóa
  1. 27 12
      host.h
  2. 59 15
      keyboard.c
  3. 7 3
      pjrc/host.c
  4. 68 97
      pjrc/usb.c
  5. 9 6
      pjrc/usb_extra.c
  6. 3 14
      pjrc/usb_extra.h
  7. 30 0
      ps2_usb/README
  8. 59 21
      ps2_usb/keymap.c
  9. 107 104
      usb_keycodes.h
  10. 77 77
      vusb/host.c

+ 27 - 12
host.h

@@ -7,7 +7,7 @@
 /* report id */
 #define REPORT_ID_MOUSE     1
 #define REPORT_ID_SYSTEM    2
-#define REPORT_ID_AUDIO     3
+#define REPORT_ID_CONSUMER  3
 
 /* keyboard Modifiers in boot protocol report */
 #define BIT_LCTRL   (1<<0)
@@ -30,15 +30,30 @@
 #define MOUSE_BTN4 (1<<3)
 #define MOUSE_BTN5 (1<<4)
 
-// Consumer Page(0x0C) Consumer Control(0x01)
-#define AUDIO_VOL_UP		(1<<0)
-#define AUDIO_VOL_DOWN		(1<<1)
-#define AUDIO_MUTE		(1<<2)
-
-// Generic Desktop Page(0x01) System Control(0x80)
-#define SYSTEM_POWER_DOWN	(1<<0)
-#define SYSTEM_SLEEP		(1<<1)
-#define SYSTEM_WAKE_UP		(1<<2)
+// Consumer Page(0x0C)
+#define AUDIO_MUTE              0x00E2
+#define AUDIO_VOL_UP            0x00E9
+#define AUDIO_VOL_DOWN          0x00EA
+#define TRANSPORT_NEXT_TRACK    0x00B5
+#define TRANSPORT_PREV_TRACK    0x00B6
+#define TRANSPORT_STOP          0x00B7
+#define TRANSPORT_PLAY_PAUSE    0x00CD
+#define AL_CC_CONFIG            0x0183
+#define AL_EMAIL                0x018A
+#define AL_CALCULATOR           0x0192
+#define AL_LOCAL_BROWSER        0x0194
+#define AC_SEARCH               0x0221
+#define AC_HOME                 0x0223
+#define AC_BACK                 0x0224
+#define AC_FORWARD              0x0225
+#define AC_STOP                 0x0226
+#define AC_REFRESH              0x0227
+#define AC_BOOKMARKS            0x022A
+
+// Generic Desktop Page(0x01)
+#define SYSTEM_POWER_DOWN       0x0081
+#define SYSTEM_SLEEP            0x0082
+#define SYSTEM_WAKE_UP          0x0083
 
 
 #if defined(HOST_PJRC)
@@ -94,8 +109,8 @@ void host_send_keyboard_report(void);
 void host_mouse_send(report_mouse_t *report);
 #endif
 #ifdef USB_EXTRA_ENABLE
-void host_system_send(uint8_t data);
-void host_audio_send(uint8_t data);
+void host_system_send(uint16_t data);
+void host_consumer_send(uint16_t data);
 #endif
 
 #endif

+ 59 - 15
keyboard.c

@@ -31,6 +31,9 @@ void keyboard_init(void)
 void keyboard_proc(void)
 {
     uint8_t fn_bits = 0;
+#ifdef USB_EXTRA_ENABLE
+    uint16_t consumer_code = 0;
+#endif
 
     matrix_scan();
 
@@ -64,20 +67,8 @@ void keyboard_proc(void)
                 fn_bits |= FN_BIT(code);
             }
 #ifdef USB_EXTRA_ENABLE
-            // audio control & system control
-            else if (code == KB_MUTE) {
-                host_audio_send(AUDIO_MUTE);
-                _delay_ms(500);
-                host_audio_send(0);
-            } else if (code == KB_VOLU) {
-                host_audio_send(AUDIO_VOL_UP);
-                _delay_ms(200);
-                host_audio_send(0);
-            } else if (code == KB_VOLD) {
-                host_audio_send(AUDIO_VOL_DOWN);
-                _delay_ms(200);
-                host_audio_send(0);
-            } else if (code == KB_PWR) {
+            // System Control
+            else if (code == KB_SYSTEM_POWER) {
 #ifdef HOST_PJRC
                 if (suspend && remote_wakeup) {
                     usb_remote_wakeup();
@@ -87,7 +78,57 @@ void keyboard_proc(void)
 #else
                 host_system_send(SYSTEM_POWER_DOWN);
 #endif
-                _delay_ms(1000);
+                host_system_send(0);
+                _delay_ms(500);
+            } else if (code == KB_SYSTEM_SLEEP) {
+                host_system_send(SYSTEM_SLEEP);
+                host_system_send(0);
+                _delay_ms(500);
+            } else if (code == KB_SYSTEM_WAKE) {
+                host_system_send(SYSTEM_WAKE_UP);
+                host_system_send(0);
+                _delay_ms(500);
+            }
+            // Consumer Page
+            else if (code == KB_AUDIO_MUTE) {
+                consumer_code = AUDIO_MUTE;
+            } else if (code == KB_AUDIO_VOL_UP) {
+                consumer_code = AUDIO_VOL_UP;
+            } else if (code == KB_AUDIO_VOL_DOWN) {
+                consumer_code = AUDIO_VOL_DOWN;
+            }
+            else if (code == KB_MEDIA_NEXT_TRACK) {
+                consumer_code = TRANSPORT_NEXT_TRACK;
+            } else if (code == KB_MEDIA_PREV_TRACK) {
+                consumer_code = TRANSPORT_PREV_TRACK;
+            } else if (code == KB_MEDIA_STOP) {
+                consumer_code = TRANSPORT_STOP;
+            } else if (code == KB_MEDIA_PLAY_PAUSE) {
+                consumer_code = TRANSPORT_PLAY_PAUSE;
+            } else if (code == KB_MEDIA_SELECT) {
+                consumer_code = AL_CC_CONFIG;
+            }
+            else if (code == KB_MAIL) {
+                consumer_code = AL_EMAIL;
+            } else if (code == KB_CALCULATOR) {
+                consumer_code = AL_CALCULATOR;
+            } else if (code == KB_MY_COMPUTER) {
+                consumer_code = AL_LOCAL_BROWSER;
+            }
+            else if (code == KB_WWW_SEARCH) {
+                consumer_code = AC_SEARCH;
+            } else if (code == KB_WWW_HOME) {
+                consumer_code = AC_HOME;
+            } else if (code == KB_WWW_BACK) {
+                consumer_code = AC_BACK;
+            } else if (code == KB_WWW_FORWARD) {
+                consumer_code = AC_FORWARD;
+            } else if (code == KB_WWW_STOP) {
+                consumer_code = AC_STOP;
+            } else if (code == KB_WWW_REFRESH) {
+                consumer_code = AC_REFRESH;
+            } else if (code == KB_WWW_FAVORITES) {
+                consumer_code = AC_BOOKMARKS;
             }
 #endif
             else if (IS_KEY(code)) {
@@ -113,6 +154,9 @@ void keyboard_proc(void)
     // TODO: should send only when changed from last report
     if (matrix_is_modified()) {
         host_send_keyboard_report();
+#ifdef USB_EXTRA_ENABLE
+        host_consumer_send(consumer_code);
+#endif
 #ifdef DEBUG_LED
         // LED flash for debug
         DEBUG_LED_CONFIG;

+ 7 - 3
pjrc/host.c

@@ -117,14 +117,18 @@ void host_mouse_send(report_mouse_t *report)
 #endif
 
 #ifdef USB_EXTRA_ENABLE
-void host_system_send(uint8_t data)
+void host_system_send(uint16_t data)
 {
     usb_extra_system_send(data);
 }
 
-void host_audio_send(uint8_t data)
+void host_consumer_send(uint16_t data)
 {
-    usb_extra_audio_send(data);
+    static uint16_t last_data = 0;
+    if (data == last_data) return;
+    last_data = data;
+
+    usb_extra_consumer_send(data);
 }
 #endif
 

+ 68 - 97
pjrc/usb.c

@@ -219,76 +219,53 @@ static uint8_t PROGMEM keyboard2_hid_report_desc[] = {
 // http://www.keil.com/forum/15671/
 // http://www.microsoft.com/whdc/device/input/wheel.mspx
 static uint8_t PROGMEM mouse_hid_report_desc[] = {
-    0x05, 0x01,        // USAGE_PAGE (Generic Desktop)
-    0x09, 0x02,        // USAGE (Mouse)
-    0xa1, 0x01,        // COLLECTION (Application)
-    0x09, 0x02,        //   USAGE (Mouse)
-    0xa1, 0x02,        //   COLLECTION (Logical)
-    0x09, 0x01,        //     USAGE (Pointer)
-    0xa1, 0x00,        //     COLLECTION (Physical)
-                       // ------------------------------  Buttons
-    0x05, 0x09,        //       USAGE_PAGE (Button)
-    0x19, 0x01,        //       USAGE_MINIMUM (Button 1)
-    0x29, 0x05,        //       USAGE_MAXIMUM (Button 5)
-    0x15, 0x00,        //       LOGICAL_MINIMUM (0)
-    0x25, 0x01,        //       LOGICAL_MAXIMUM (1)
-    0x75, 0x01,        //       REPORT_SIZE (1)
-    0x95, 0x05,        //       REPORT_COUNT (5)
-    0x81, 0x02,        //       INPUT (Data,Var,Abs)
-                       // ------------------------------  Padding
-    0x75, 0x03,        //       REPORT_SIZE (3)
-    0x95, 0x01,        //       REPORT_COUNT (1)
-    0x81, 0x03,        //       INPUT (Cnst,Var,Abs)
-                       // ------------------------------  X,Y position
-    0x05, 0x01,        //       USAGE_PAGE (Generic Desktop)
-    0x09, 0x30,        //       USAGE (X)
-    0x09, 0x31,        //       USAGE (Y)
-    0x15, 0x81,        //       LOGICAL_MINIMUM (-127)
-    0x25, 0x7f,        //       LOGICAL_MAXIMUM (127)
-    0x75, 0x08,        //       REPORT_SIZE (8)
-    0x95, 0x02,        //       REPORT_COUNT (2)
-    0x81, 0x06,        //       INPUT (Data,Var,Rel)
-    0xa1, 0x02,        //       COLLECTION (Logical)
-                       // ------------------------------  Vertical wheel res multiplier
-    0x09, 0x48,        //         USAGE (Resolution Multiplier)
-    0x15, 0x00,        //         LOGICAL_MINIMUM (0)
-    0x25, 0x01,        //         LOGICAL_MAXIMUM (1)
-    0x35, 0x01,        //         PHYSICAL_MINIMUM (1)
-    0x45, 0x04,        //         PHYSICAL_MAXIMUM (4)
-    0x75, 0x02,        //         REPORT_SIZE (2)
-    0x95, 0x01,        //         REPORT_COUNT (1)
-    0xa4,              //         PUSH
-    0xb1, 0x02,        //         FEATURE (Data,Var,Abs)
-                       // ------------------------------  Vertical wheel
-    0x09, 0x38,        //         USAGE (Wheel)
-    0x15, 0x81,        //         LOGICAL_MINIMUM (-127)
-    0x25, 0x7f,        //         LOGICAL_MAXIMUM (127)
-    0x35, 0x00,        //         PHYSICAL_MINIMUM (0)        - reset physical
-    0x45, 0x00,        //         PHYSICAL_MAXIMUM (0)
-    0x75, 0x08,        //         REPORT_SIZE (8)
-    0x81, 0x06,        //         INPUT (Data,Var,Rel)
-    0xc0,              //       END_COLLECTION
-    0xa1, 0x02,        //       COLLECTION (Logical)
-                       // ------------------------------  Horizontal wheel res multiplier
-    0x09, 0x48,        //         USAGE (Resolution Multiplier)
-    0xb4,              //         POP
-    0xb1, 0x02,        //         FEATURE (Data,Var,Abs)
-                       // ------------------------------  Padding for Feature report
-    0x35, 0x00,        //         PHYSICAL_MINIMUM (0)        - reset physical
-    0x45, 0x00,        //         PHYSICAL_MAXIMUM (0)
-    0x75, 0x04,        //         REPORT_SIZE (4)
-    0xb1, 0x03,        //         FEATURE (Cnst,Var,Abs)
-                       // ------------------------------  Horizontal wheel
-    0x05, 0x0c,        //         USAGE_PAGE (Consumer Devices)
-    0x0a, 0x38, 0x02,  //         USAGE (AC Pan)
-    0x15, 0x81,        //         LOGICAL_MINIMUM (-127)
-    0x25, 0x7f,        //         LOGICAL_MAXIMUM (127)
-    0x75, 0x08,        //         REPORT_SIZE (8)
-    0x81, 0x06,        //         INPUT (Data,Var,Rel)
-    0xc0,              //       END_COLLECTION
-    0xc0,              //     END_COLLECTION
-    0xc0,              //   END_COLLECTION
-    0xc0               // END_COLLECTION
+    /* mouse */
+    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
+    0x09, 0x02,                    // USAGE (Mouse)
+    0xa1, 0x01,                    // COLLECTION (Application)
+    //0x85, REPORT_ID_MOUSE,         //   REPORT_ID (1)
+    0x09, 0x01,                    //   USAGE (Pointer)
+    0xa1, 0x00,                    //   COLLECTION (Physical)
+                                   // ----------------------------  Buttons
+    0x05, 0x09,                    //     USAGE_PAGE (Button)
+    0x19, 0x01,                    //     USAGE_MINIMUM (Button 1)
+    0x29, 0x05,                    //     USAGE_MAXIMUM (Button 5)
+    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
+    0x25, 0x01,                    //     LOGICAL_MAXIMUM (1)
+    0x75, 0x01,                    //     REPORT_SIZE (1)
+    0x95, 0x05,                    //     REPORT_COUNT (5)
+    0x81, 0x02,                    //     INPUT (Data,Var,Abs)
+    0x75, 0x03,                    //     REPORT_SIZE (3)
+    0x95, 0x01,                    //     REPORT_COUNT (1)
+    0x81, 0x03,                    //     INPUT (Cnst,Var,Abs)
+                                   // ----------------------------  X,Y position
+    0x05, 0x01,                    //     USAGE_PAGE (Generic Desktop)
+    0x09, 0x30,                    //     USAGE (X)
+    0x09, 0x31,                    //     USAGE (Y)
+    0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)
+    0x25, 0x7f,                    //     LOGICAL_MAXIMUM (127)
+    0x75, 0x08,                    //     REPORT_SIZE (8)
+    0x95, 0x02,                    //     REPORT_COUNT (2)
+    0x81, 0x06,                    //     INPUT (Data,Var,Rel)
+                                   // ----------------------------  Vertical wheel
+    0x09, 0x38,                    //     USAGE (Wheel)
+    0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)
+    0x25, 0x7f,                    //     LOGICAL_MAXIMUM (127)
+    0x35, 0x00,                    //     PHYSICAL_MINIMUM (0)        - reset physical
+    0x45, 0x00,                    //     PHYSICAL_MAXIMUM (0)
+    0x75, 0x08,                    //     REPORT_SIZE (8)
+    0x95, 0x01,                    //     REPORT_COUNT (1)
+    0x81, 0x06,                    //     INPUT (Data,Var,Rel)
+                                   // ----------------------------  Horizontal wheel
+    0x05, 0x0c,                    //     USAGE_PAGE (Consumer Devices)
+    0x0a, 0x38, 0x02,              //     USAGE (AC Pan)
+    0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)
+    0x25, 0x7f,                    //     LOGICAL_MAXIMUM (127)
+    0x75, 0x08,                    //     REPORT_SIZE (8)
+    0x95, 0x01,                    //     REPORT_COUNT (1)
+    0x81, 0x06,                    //     INPUT (Data,Var,Rel)
+    0xc0,                          //   END_COLLECTION
+    0xc0,                          // END_COLLECTION
 };
 #endif
 
@@ -309,38 +286,32 @@ static uint8_t PROGMEM debug_hid_report_desc[] = {
 // audio controls & system controls
 // http://www.microsoft.com/whdc/archive/w2kbd.mspx
 static uint8_t PROGMEM extra_hid_report_desc[] = {
+    /* system control */
+    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
+    0x09, 0x80,                    // USAGE (System Control)
+    0xa1, 0x01,                    // COLLECTION (Application)
+    0x85, REPORT_ID_SYSTEM,        //   REPORT_ID (2)
+    0x15, 0x01,                    //   LOGICAL_MINIMUM (0x1)
+    0x25, 0xb7,                    //   LOGICAL_MAXIMUM (0xb7)
+    0x19, 0x01,                    //   USAGE_MINIMUM (0x1)
+    0x29, 0xb7,                    //   USAGE_MAXIMUM (0xb7)
+    0x75, 0x10,                    //   REPORT_SIZE (16)
+    0x95, 0x01,                    //   REPORT_COUNT (1)
+    0x81, 0x00,                    //   INPUT (Data,Array,Abs)
+    0xc0,                          // END_COLLECTION
+    /* consumer */
     0x05, 0x0c,                    // USAGE_PAGE (Consumer Devices)
     0x09, 0x01,                    // USAGE (Consumer Control)
     0xa1, 0x01,                    // COLLECTION (Application)
-    0x85, 0x01,                    //   REPORT_ID (1)
-    0x09, 0xe9,                    //   USAGE (Volume Up)
-    0x09, 0xea,                    //   USAGE (Volume Down)
-    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
-    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
-    0x75, 0x01,                    //   REPORT_SIZE (1)
-    0x95, 0x02,                    //   REPORT_COUNT (2)
-    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
-    0x09, 0xe2,                    //   USAGE (Mute)
-    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
-    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
-    0x75, 0x01,                    //   REPORT_SIZE (1)
+    0x85, REPORT_ID_CONSUMER,      //   REPORT_ID (3)
+    0x15, 0x01,                    //   LOGICAL_MINIMUM (0x1)
+    0x26, 0x9c, 0x02,              //   LOGICAL_MAXIMUM (0x29c)
+    0x19, 0x01,                    //   USAGE_MINIMUM (0x1)
+    0x2a, 0x9c, 0x02,              //   USAGE_MAXIMUM (0x29c)
+    0x75, 0x10,                    //   REPORT_SIZE (16)
     0x95, 0x01,                    //   REPORT_COUNT (1)
-    0x81, 0x06,                    //   INPUT (Data,Var,Rel)
-    0x95, 0x05,                    //   REPORT_COUNT (5)
-    0x81, 0x07,                    //   INPUT (Cnst,Var,Abs)
+    0x81, 0x00,                    //   INPUT (Data,Array,Abs)
     0xc0,                          // END_COLLECTION
-
-    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
-    0x09, 0x80,                    // USAGE (System Control)
-    0xa1, 0x01,                    // COLLECTION (Application)
-    0x85, 0x02,                    //   REPORT_ID (2)
-    0x19, 0x81,                    //   USAGE_MINIMUM (System Power Down)
-    0x29, 0x83,                    //   USAGE_MAXIMUM (System Wake Up)
-    0x95, 0x03,                    //   REPORT_COUNT (3)
-    0x81, 0x06,                    //   INPUT (Data,Var,Rel)
-    0x95, 0x05,                    //   REPORT_COUNT (5)
-    0x81, 0x07,                    //   INPUT (Cnst,Var,Rel)
-    0xc0                           // END_COLLECTION
 };
 #endif
 

+ 9 - 6
pjrc/usb_extra.c

@@ -1,8 +1,10 @@
+#include <util/delay.h>
 #include <avr/interrupt.h>
+#include "host.h"
 #include "usb_extra.h"
 
 
-int8_t usb_extra_send(uint8_t report_id, uint8_t bits)
+int8_t usb_extra_send(uint8_t report_id, uint16_t data)
 {
 	uint8_t intr_state, timeout;
 
@@ -26,19 +28,20 @@ int8_t usb_extra_send(uint8_t report_id, uint8_t bits)
 	}
 
 	UEDATX = report_id;
-	UEDATX = bits;
+        UEDATX = data&0xFF;
+        UEDATX = (data>>8)&0xFF;
 
 	UEINTX = 0x3A;
 	SREG = intr_state;
 	return 0;
 }
 
-int8_t usb_extra_audio_send(uint8_t bits)
+int8_t usb_extra_consumer_send(uint16_t bits)
 {
-	return usb_extra_send(1, bits);
+	return usb_extra_send(REPORT_ID_CONSUMER, bits);
 }
 
-int8_t usb_extra_system_send(uint8_t bits)
+int8_t usb_extra_system_send(uint16_t bits)
 {
-	return usb_extra_send(2, bits);
+	return usb_extra_send(REPORT_ID_SYSTEM, bits);
 }

+ 3 - 14
pjrc/usb_extra.h

@@ -13,22 +13,11 @@
 
 #define EXTRA_INTERFACE		3
 #define EXTRA_ENDPOINT		4
-#define EXTRA_SIZE		2
+#define EXTRA_SIZE		8
 #define EXTRA_BUFFER		EP_DOUBLE_BUFFER
 
 
-// Consumer Page(0x0C) Consumer Control(0x01)
-#define AUDIO_VOL_UP		(1<<0)
-#define AUDIO_VOL_DOWN		(1<<1)
-#define AUDIO_MUTE		(1<<2)
-
-// Generic Desktop Page(0x01) System Control(0x80)
-#define SYSTEM_POWER_DOWN	(1<<0)
-#define SYSTEM_SLEEP		(1<<1)
-#define SYSTEM_WAKE_UP		(1<<2)
-
-
-int8_t usb_extra_audio_send(uint8_t bits);
-int8_t usb_extra_system_send(uint8_t bits);
+int8_t usb_extra_consumer_send(uint16_t bits);
+int8_t usb_extra_system_send(uint16_t bits);
 
 #endif

+ 30 - 0
ps2_usb/README

@@ -133,4 +133,34 @@ needs a bit of your effort at this time.
     ),
 
 
+Multimedia keys
+---------------
+Following lists PS/2 special keys supported by Windows.
+http://msdn.microsoft.com/en-us/windows/hardware/gg463372.aspx
+
+Key                         PS/2(Set2)      HID
+---------------------------------------------------
+System Power                E0 37           01 0081
+System Sleep                E0 3F           01 0082
+System Wake                 E0 5E           01 0083
+System Mute                 E0 23           0C 00E2
+Volume Up                   E0 32           0C 00E9
+Volume Down                 E0 21           0C 00EA
+Scan Next Track             E0 4D           0C 00B5
+Scan Previous Track         E0 15           0C 00B6
+Stop                        E0 3B           0C 00B7
+Play/Pause                  E0 34           0C 00CD
+Media Select                E0 50           0C 0183
+Mail                        E0 48           0C 018A
+Calculator                  E0 2B           0C 0192
+My Computer                 E0 40           0C 0194
+WWW Search                  E0 10           0C 0221
+WWW Home                    E0 3A           0C 0223
+WWW Back                    E0 38           0C 0224
+WWW Forward                 E0 30           0C 0225
+WWW Stop                    E0 28           0C 0226
+WWW Refresh                 E0 20           0C 0227
+WWW Favorites               E0 18           0C 022A
+
+
 EOF

+ 59 - 21
ps2_usb/keymap.c

@@ -13,15 +13,23 @@
 
 #define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)]))
 
-// Convert physical keyboard layout to matrix array.
-// This is a macro to define keymap easily in keyboard layout form.
-#define KEYMAP( \
-    K76,  K05,K06,K04,K0C, K03,K0B,K83,K0A, K01,K09,K78,K07, KFC,K7E,KFE,      KB7,KBF,KDE, \
+
+// The keymap is a 32*8 matrix which convert a PS/2 scancode into a USB keycode.
+// See matrix.c for the detail of matrix.
+#define KEYMAP_ALL( \
+    K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07,     KFC,K7E,KFE,                   \
     K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD,  K77,KCA,K7C,K7B, \
     K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA,  K6C,K75,K7D,     \
     K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52,    K5A,               K6B,K73,K74,K79, \
     K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A,        K59,     KF5,      K69,K72,K7A,     \
-    K14,K9F,K11,        K29,                K91,KA7,KAF,K94, KEB,KF2,KF4,  K70,    K71,KDA  \
+    K14,K9F,K11,        K29,                K91,KA7,KAF,K94, KEB,KF2,KF4,  K70,    K71,KDA, \
+                                                                                            \
+    KB7, KBF, KDE,           /* System Power, Sleep, Wake */                                \
+    KA3, KB2, KA1,           /* Mute, Volume Up, Volume Down */                             \
+    KCD, K95, KBB, KB4, KD0, /* Next, Previous, Stop, Pause, Media Select */                \
+    KC8, KAB, KC0,           /* Mail, Calculator, My Computer */                            \
+    K90, KBA, KB8, KB0,      /* WWW Search, Home, Back, Forward */                          \
+    KA8, KA0, K98            /* WWW Stop, Refresh, Favorites */                             \
 ) { \
     { KB_NO,    KB_##K01, KB_NO,    KB_##K03, KB_##K04, KB_##K05, KB_##K06, KB_##K07 }, \
     { KB_NO,    KB_##K09, KB_##K0A, KB_##K0B, KB_##K0C, KB_##K0D, KB_##K0E, KB_NO    }, \
@@ -41,15 +49,15 @@
     { KB_##K78, KB_##K79, KB_##K7A, KB_##K7B, KB_##K7C, KB_##K7D, KB_##K7E, KB_NO    }, \
     { KB_NO,    KB_NO,    KB_NO,    KB_##K83, KB_NO,    KB_NO,    KB_NO,    KB_NO    }, \
     { KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO    }, \
-    { KB_NO,    KB_##K91, KB_NO,    KB_NO,    KB_##K94, KB_NO,    KB_NO,    KB_NO    }, \
-    { KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_##K9F }, \
-    { KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_##KA7 }, \
-    { KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_##KAF }, \
-    { KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_##KB7 }, \
-    { KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_##KBF }, \
-    { KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO    }, \
-    { KB_NO,    KB_NO,    KB_##KCA, KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO    }, \
-    { KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO    }, \
+    { KB_##K90, KB_##K91, KB_NO,    KB_NO,    KB_##K94, KB_##K95, KB_NO,    KB_NO    }, \
+    { KB_##K98, KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_##K9F }, \
+    { KB_##KA0, KB_##KA1, KB_NO,    KB_##KA3, KB_NO,    KB_NO,    KB_NO,    KB_##KA7 }, \
+    { KB_##KA8, KB_NO,    KB_NO,    KB_##KAB, KB_NO,    KB_NO,    KB_NO,    KB_##KAF }, \
+    { KB_##KB0, KB_NO,    KB_##KB2, KB_NO,    KB_##KB4, KB_NO,    KB_NO,    KB_##KB7 }, \
+    { KB_##KB8, KB_NO,    KB_##KBA, KB_##KBB, KB_NO,    KB_NO,    KB_NO,    KB_##KBF }, \
+    { KB_##KC0, KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO    }, \
+    { KB_##KC8, KB_NO,    KB_##KCA, KB_NO,    KB_NO,    KB_##KCD, KB_NO,    KB_NO    }, \
+    { KB_##KD0, KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO    }, \
     { KB_NO,    KB_NO,    KB_##KDA, KB_NO,    KB_NO,    KB_NO,    KB_##KDE, KB_NO    }, \
     { KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO,    KB_NO    }, \
     { KB_NO,    KB_##KE9, KB_NO,    KB_##KEB, KB_##KEC, KB_NO,    KB_NO,    KB_NO    }, \
@@ -57,6 +65,30 @@
     { KB_NO,    KB_NO,    KB_##KFA, KB_NO,    KB_##KFC, KB_##KFD, KB_##KFE, KB_NO    }, \
 }
 
+#define KEYMAP( \
+    K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07,     KFC,K7E,KFE,                   \
+    K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD,  K77,KCA,K7C,K7B, \
+    K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA,  K6C,K75,K7D,     \
+    K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52,    K5A,               K6B,K73,K74,K79, \
+    K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A,        K59,     KF5,      K69,K72,K7A,     \
+    K14,K9F,K11,        K29,                K91,KA7,KAF,K94, KEB,KF2,KF4,  K70,    K71,KDA  \
+) \
+KEYMAP_ALL( \
+    K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07,     KFC,K7E,KFE,                   \
+    K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD,  K77,KCA,K7C,K7B, \
+    K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA,  K6C,K75,K7D,     \
+    K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52,    K5A,               K6B,K73,K74,K79, \
+    K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A,        K59,     KF5,      K69,K72,K7A,     \
+    K14,K9F,K11,        K29,                K91,KA7,KAF,K94, KEB,KF2,KF4,  K70,    K71,KDA, \
+                                                                                            \
+    SYSTEM_POWER, SYSTEM_SLEEP, SYSTEM_WAKE,                                                \
+    AUDIO_MUTE, AUDIO_VOL_UP, AUDIO_VOL_DOWN,                                               \
+    MEDIA_NEXT_TRACK, MEDIA_PREV_TRACK, MEDIA_STOP, MEDIA_PLAY_PAUSE, MEDIA_SELECT,         \
+    MAIL, CALCULATOR, MY_COMPUTER,                                                          \
+    WWW_SEARCH, WWW_HOME, WWW_BACK, WWW_FORWARD,                                            \
+    WWW_STOP, WWW_REFRESH, WWW_FAVORITES                                                    \
+)
+
 
 // Assign Fn key(0-7) to a layer to which switch with the Fn key pressed.
 static const uint8_t PROGMEM fn_layer[] = {
@@ -102,61 +134,67 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
      */
     /* 0: default */
     KEYMAP(
-    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,          PWR, F13, F14,
+    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,
     GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC,     INS, HOME,PGUP,    NLCK,PSLS,PAST,PMNS,
     TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,BSLS,     DEL, END, PGDN,    P7,  P8,  P9,
     CAPS,FN2, S,   D,   F,   G,   H,   J,   K,   L,   FN0, QUOT,     ENT,                         P4,  P5,  P6,  PPLS,
     LSFT,Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, FN1,           RSFT,          UP,           P1,  P2,  P3,
     LCTL,LGUI,LALT,          SPC,                     RALT,RGUI,APP, RCTL,     LEFT,DOWN,RGHT,    P0,       PDOT,PENT
     ),
+
     /* 1: plain Qwerty without layer switching */
     KEYMAP(
-    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,          PWR, F13, F14,
+    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,
     GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC,     INS, HOME,PGUP,    NLCK,PSLS,PAST,PMNS,
     TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,BSLS,     DEL, END, PGDN,    P7,  P8,  P9,
     CAPS,A,   S,   D,   F,   G,   H,   J,   K,   L,   SCLN,QUOT,     ENT,                         P4,  P5,  P6,  PPLS,
     LSFT,Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, SLSH,          RSFT,          UP,           P1,  P2,  P3,
     LCTL,LGUI,LALT,          SPC,                     RALT,RGUI,APP, RCTL,     LEFT,DOWN,RGHT,    P0,       PDOT,PENT
     ),
+
     /* 2: Colemak http://colemak.com */
     KEYMAP(
-    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,          PWR, F13, F14,
+    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,
     GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC,     INS, HOME,PGUP,    NLCK,PSLS,PAST,PMNS,
     TAB, Q,   W,   F,   P,   G,   J,   L,   U,   Y,   SCLN,LBRC,RBRC,BSLS,     DEL, END, PGDN,    P7,  P8,  P9,
     BSPC,A,   R,   S,   T,   D,   H,   N,   E,   I,   O,   QUOT,     ENT,                         P4,  P5,  P6,  PPLS,
     LSFT,Z,   X,   C,   V,   B,   K,   M,   COMM,DOT, SLSH,          RSFT,          UP,           P1,  P2,  P3,
     LCTL,LGUI,LALT,          SPC,                     RALT,RGUI,APP, RCTL,     LEFT,DOWN,RGHT,    P0,       PDOT,PENT
     ),
+
     /* 3: Dvorak http://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard */
     KEYMAP(
-    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,          PWR, F13, F14,
+    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,
     GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   LBRC,RBRC,BSPC,     INS, HOME,PGUP,    NLCK,PSLS,PAST,PMNS,
     TAB, QUOT,COMM,DOT, P,   Y,   F,   G,   C,   R,   L,   SLSH,EQL, BSLS,     DEL, END, PGDN,    P7,  P8,  P9,
     CAPS,A,   O,   E,   U,   I,   D,   H,   T,   N,   S,   MINS,     ENT,                         P4,  P5,  P6,  PPLS,
     LSFT,SCLN,Q,   J,   K,   X,   B,   M,   W,   V,   Z,             RSFT,          UP,           P1,  P2,  P3,
     LCTL,LGUI,LALT,          SPC,                     RALT,RGUI,APP, RCTL,     LEFT,DOWN,RGHT,    P0,       PDOT,PENT
     ),
+
     /* 4: Workman http://viralintrospection.wordpress.com/2010/09/06/a-different-philosophy-in-designing-keyboard-layouts/ */
     KEYMAP(
-    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,          PWR, F13, F14,
+    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,
     GRV, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSPC,     INS, HOME,PGUP,    NLCK,PSLS,PAST,PMNS,
     TAB, Q,   D,   R,   W,   B,   J,   F,   U,   P,   SCLN,LBRC,RBRC,BSLS,     DEL, END, PGDN,    P7,  P8,  P9,
     BSPC,A,   S,   H,   T,   G,   Y,   N,   E,   O,   I,   QUOT,     ENT,                         P4,  P5,  P6,  PPLS,
     LSFT,Z,   X,   M,   C,   V,   K,   L,   COMM,DOT, SLSH,          RSFT,          UP,           P1,  P2,  P3,
     LCTL,LGUI,LALT,          SPC,                     RALT,RGUI,APP, RCTL,     LEFT,DOWN,RGHT,    P0,       PDOT,PENT
     ),
+
     /* 5: Mouse keys */
     KEYMAP(
-    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,          PWR, F13, F14,
+    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,
     ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F8,  F10, F11, F12, BSPC,     INS, HOME,PGUP,    NLCK,PSLS,PAST,PMNS,
     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,
     CAPS,FN2, MS_L,MS_D,MS_R,NO,  MS_L,MS_D,MS_U,MS_R,FN0, NO,       ENT,                         P4,  P5,  P6,  PPLS,
     LSFT,VOLD,VOLU,MUTE,BTN2,BTN3,BTN2,BTN1,VOLD,VOLU,MUTE,          RSFT,          UP,           P1,  P2,  P3,
     LCTL,LGUI,LALT,          BTN1,                    RALT,RGUI,APP, RCTL,     LEFT,DOWN,RGHT,    P0,       PDOT,PENT
     ),
+
     /* 6: Cursor keys */
     KEYMAP(
-    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,          PWR, F13, F14,
+    ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12,           PSCR,SLCK,BRK,
     ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F8,  F10, F11, F12, BSPC,     INS, HOME,PGUP,    NLCK,PSLS,PAST,PMNS,
     TAB, NO,  NO,  NO,  NO,  NO,  HOME,PGDN,PGUP,END, NO,  NO,  NO,  BSLS,     DEL, END, PGDN,    P7,  P8,  P9,
     CAPS,NO,  NO,  NO,  NO,  NO,  LEFT,DOWN,UP,  RGHT,NO,  NO,       ENT,                         P4,  P5,  P6,  PPLS,

+ 107 - 104
usb_keycodes.h

@@ -1,43 +1,13 @@
 /* 
  * Key codes from HID Keyboard/Keypad Page
  * http://www.usb.org/developers/devclass_docs/Hut1_12.pdf
- *
- * Based on Keyboard Upgrade v0.3.0 http://github.com/rhomann/kbupgrade
- */
-/*
- * Keyboard Upgrade -- Firmware for homebrew computer keyboard controllers.
- * Copyright (C) 2009  Robert Homann
- *
- * Based on RUMP (http://mg8.org/rump/), Copyright (C) 2008  Chris Lee
- *
- * Based on c64key (http://symlink.dk/projects/c64key/),
- * Copyright (C) 2006-2007  Mikkel Holm Olsen
- *
- * Based on HID-Test by Christian Starkjohann, Objective Development
- *
- * This file is part of the Keyboard Upgrade package.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the Keyboard Upgrade package; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA  02110-1301  USA
  */
 #ifndef USB_KEYCODES_H
 #define USB_KEYCODES_H
 
 
 #define IS_ERROR(code)           (KB_ROLL_OVER <= (code) && (code) <= KB_UNDEFINED)
-#define IS_KEY(code)             (KB_A         <= (code) && (code) <= KB_KP_HEXADECIMAL)
+#define IS_KEY(code)             (KB_A         <= (code) && (code) <= KB_EXSEL)
 #define IS_MOD(code)             (KB_LCTRL     <= (code) && (code) <= KB_RGUI)
 #define IS_FN(code)              (KB_FN0       <= (code) && (code) <= KB_FN7)
 #define IS_MOUSEKEY(code)        (KB_MS_UP     <= (code) && (code) <= KB_MS_WH_RIGHT)
@@ -49,9 +19,7 @@
 #define FN_BIT(code)  (1<<((code) - KB_FN0))
 
 
-//
-// Short names
-//
+/* Short names */
 #define KB_LCTL KB_LCTRL
 #define KB_RCTL KB_RCTRL
 #define KB_LSFT KB_LSHIFT
@@ -79,20 +47,17 @@
 #define KB_SLSH KB_SLASH
 #define KB_SCLN KB_SCOLON
 #define KB_QUOT KB_QUOTE
-#define KB_PWR  KB_POWER
-#define KB_VOLU KB_VOLUP
-#define KB_VOLD KB_VOLDOWN
 #define KB_APP  KB_APPLICATION
 #define KB_NUHS KB_NONUS_HASH
 #define KB_NUBS KB_NONUS_BSLASH
-// for Japanese
+/* for Japanese */
 #define KB_RO   KB_INT1
 #define KB_KANA KB_INT2
 #define KB_JYEN KB_INT3
 #define KB_HENK KB_INT4
 #define KB_MHEN KB_INT5
 #define KB_ZEHA KB_GRAVE
-// Keypad
+/* Keypad */
 #define KB_P1   KB_KP_1
 #define KB_P2   KB_KP_2
 #define KB_P3   KB_KP_3
@@ -110,7 +75,7 @@
 #define KB_PPLS KB_KP_PLUS
 #define KB_PEQL KB_KP_EQUAL
 #define KB_PENT KB_KP_ENTER
-// Mousekey
+/* Mousekey */
 #define KB_MS_U KB_MS_UP
 #define KB_MS_D KB_MS_DOWN
 #define KB_MS_L KB_MS_LEFT
@@ -124,7 +89,68 @@
 #define KB_WH_D KB_MS_WH_DOWN
 #define KB_WH_L KB_MS_WH_LEFT
 #define KB_WH_R KB_MS_WH_RIGHT
+/* Sytem Control & Consumer usage */
+#define KB_PWR  KB_SYSTEM_POWER
+#define KB_MUTE KB_AUDIO_MUTE
+#define KB_VOLU KB_AUDIO_VOL_UP
+#define KB_VOLD KB_AUDIO_VOL_DOWN
+
+
+/* Special keycode */
+enum special_keycodes {
+    /* System Control */
+    KB_SYSTEM_POWER = 0xB0,
+    KB_SYSTEM_SLEEP,
+    KB_SYSTEM_WAKE,
 
+    /* Consumer Page */
+    KB_AUDIO_MUTE,
+    KB_AUDIO_VOL_UP,
+    KB_AUDIO_VOL_DOWN,
+    KB_MEDIA_NEXT_TRACK,
+    KB_MEDIA_PREV_TRACK,
+    KB_MEDIA_STOP,
+    KB_MEDIA_PLAY_PAUSE,
+    KB_MEDIA_SELECT,
+    KB_MAIL,
+    KB_CALCULATOR,
+    KB_MY_COMPUTER,
+    KB_WWW_SEARCH,
+    KB_WWW_HOME,
+    KB_WWW_BACK,        /* 0xC0 */
+    KB_WWW_FORWARD,
+    KB_WWW_STOP,
+    KB_WWW_REFRESH,
+    KB_WWW_FAVORITES,
+
+    /* reserve 0xE0-E7 for Modifiers */
+
+    /* Layer Switching */
+    KB_FN0 = 0xE8,
+    KB_FN1,
+    KB_FN2,
+    KB_FN3,
+    KB_FN4,
+    KB_FN5,
+    KB_FN6,
+    KB_FN7,
+
+    /* Mousekey */
+    KB_MS_UP = 0xF0,
+    KB_MS_DOWN,
+    KB_MS_LEFT,
+    KB_MS_RIGHT,
+    KB_MS_BTN1,
+    KB_MS_BTN2,
+    KB_MS_BTN3,
+    KB_MS_BTN4,
+    KB_MS_BTN5,
+    /* Mousekey wheel */
+    KB_MS_WH_UP,
+    KB_MS_WH_DOWN,
+    KB_MS_WH_LEFT,
+    KB_MS_WH_RIGHT,
+};
 
 enum keycodes {
     KB_NO = 0,
@@ -143,7 +169,7 @@ enum keycodes {
     KB_J,
     KB_K,
     KB_L,
-    KB_M,       /* 0x10 */
+    KB_M,               /* 0x10 */
     KB_N,
     KB_O,
     KB_P,
@@ -159,7 +185,7 @@ enum keycodes {
     KB_Z,
     KB_1,
     KB_2,
-    KB_3,       /* 0x20 */
+    KB_3,               /* 0x20 */
     KB_4,
     KB_5,
     KB_6,
@@ -174,16 +200,16 @@ enum keycodes {
     KB_SPACE,
     KB_MINUS,
     KB_EQUAL,
-    KB_LBRACKET,          /* [ */
-    KB_RBRACKET,          /* ] */
-    KB_BSLASH,            /* \ (and |) */
-    KB_NONUS_HASH,        /* Non-US # and ~ */
-    KB_SCOLON,            /* ; (and :) */
-    KB_QUOTE,             /* ' and " */
-    KB_GRAVE,             /* Grave accent and tilde */
-    KB_COMMA,             /* , and < */
-    KB_DOT,               /* . and > */
-    KB_SLASH,             /* / and ? */
+    KB_LBRACKET,
+    KB_RBRACKET,        /* 0x30 */
+    KB_BSLASH,          /* \ (and |) */
+    KB_NONUS_HASH,      /* Non-US # and ~ */
+    KB_SCOLON,          /* ; (and :) */
+    KB_QUOTE,           /* ' and " */
+    KB_GRAVE,           /* Grave accent and tilde */
+    KB_COMMA,           /* , and < */
+    KB_DOT,             /* . and > */
+    KB_SLASH,           /* / and ? */
     KB_CAPSLOCK,
     KB_F1,
     KB_F2,
@@ -191,7 +217,7 @@ enum keycodes {
     KB_F4,
     KB_F5,
     KB_F6,
-    KB_F7,      /* 0x40 */
+    KB_F7,              /* 0x40 */
     KB_F8,
     KB_F9,
     KB_F10,
@@ -207,7 +233,7 @@ enum keycodes {
     KB_END,
     KB_PGDOWN,
     KB_RIGHT,
-    KB_LEFT,    /* 0x50 */
+    KB_LEFT,            /* 0x50 */
     KB_DOWN,
     KB_UP,
     KB_NUMLOCK,
@@ -223,11 +249,11 @@ enum keycodes {
     KB_KP_5,
     KB_KP_6,
     KB_KP_7,
-    KB_KP_8,       /* 0x60 */
+    KB_KP_8,            /* 0x60 */
     KB_KP_9,
     KB_KP_0,
     KB_KP_DOT,
-    KB_NONUS_BSLASH,      /* Non-US \ and | */
+    KB_NONUS_BSLASH,    /* Non-US \ and | */
     KB_APPLICATION,
     KB_POWER,
     KB_KP_EQUAL,
@@ -239,7 +265,7 @@ enum keycodes {
     KB_F18,
     KB_F19,
     KB_F20,
-    KB_F21,     /* 0x70 */
+    KB_F21,             /* 0x70 */
     KB_F22,
     KB_F23,
     KB_F24,
@@ -254,14 +280,14 @@ enum keycodes {
     KB_COPY,
     KB_PASTE,
     KB_FIND,
-    KB_MUTE,
-    KB_VOLUP,   /* 0x80 */
-    KB_VOLDOWN,
-    KB_LOCKING_CAPS,      /* locking Caps Lock */
-    KB_LOCKING_NUM,       /* locking Num Lock */
-    KB_LOCKING_SCROLL,    /* locking Scroll Lock */
+    KB__MUTE,
+    KB__VOLUP,          /* 0x80 */
+    KB__VOLDOWN,
+    KB_LOCKING_CAPS,    /* locking Caps Lock */
+    KB_LOCKING_NUM,     /* locking Num Lock */
+    KB_LOCKING_SCROLL,  /* locking Scroll Lock */
     KB_KP_COMMA,
-    KB_KP_EQUAL_AS400,       /* equal sign on AS/400 */
+    KB_KP_EQUAL_AS400,  /* equal sign on AS/400 */
     KB_INT1,
     KB_INT2,
     KB_INT3,
@@ -271,7 +297,7 @@ enum keycodes {
     KB_INT7,
     KB_INT8,
     KB_INT9,
-    KB_LANG1,    /* 0x90 */
+    KB_LANG1,           /* 0x90 */
     KB_LANG2,
     KB_LANG3,
     KB_LANG4,
@@ -287,12 +313,13 @@ enum keycodes {
     KB_PRIOR,
     KB_RETURN,
     KB_SEPARATOR,
-    KB_OUT,
+    KB_OUT,             /* 0xA0 */
     KB_OPER,
     KB_CLEAR_AGAIN,
     KB_CRSEL,
     KB_EXSEL,
 
+    /* NOTE: uses 0xB0-DF for special keycodes */
     KB_KP_00 = 0xB0,
     KB_KP_000,
     KB_THOUSANDS_SEPARATOR,
@@ -301,15 +328,15 @@ enum keycodes {
     KB_CURRENCY_SUB_UNIT,
     KB_KP_LPAREN,
     KB_KP_RPAREN,
-    KB_KP_LCBRACKET,         /* { */
-    KB_KP_RCBRACKET,         /* } */
+    KB_KP_LCBRACKET,    /* { */
+    KB_KP_RCBRACKET,    /* } */
     KB_KP_TAB,
     KB_KP_BSPACE,
     KB_KP_A,
     KB_KP_B,
     KB_KP_C,
     KB_KP_D,
-    KB_KP_E,
+    KB_KP_E,            /* 0xC0 */
     KB_KP_F,
     KB_KP_XOR,
     KB_KP_HAT,
@@ -325,7 +352,7 @@ enum keycodes {
     KB_KP_SPACE,
     KB_KP_ATMARK,
     KB_KP_EXCLAMATION,
-    KB_KP_MEM_STORE,
+    KB_KP_MEM_STORE,    /* 0xD0 */
     KB_KP_MEM_RECALL,
     KB_KP_MEM_CLEAR,
     KB_KP_MEM_ADD,
@@ -340,41 +367,17 @@ enum keycodes {
     KB_KP_DECIMAL,
     KB_KP_HEXADECIMAL,
 
-    /* modifiers */
-    KB_LCTRL = 0xE0,    /* 0x01 */
-    KB_LSHIFT,          /* 0x02 */
-    KB_LALT,            /* 0x04 */
-    KB_LGUI,            /* 0x08 */
-    KB_RCTRL,           /* 0x10 */
-    KB_RSHIFT,          /* 0x20 */
-    KB_RALT,            /* 0x40 */
-    KB_RGUI,            /* 0x80 */
+    /* Modifiers */
+    KB_LCTRL = 0xE0,
+    KB_LSHIFT,
+    KB_LALT,
+    KB_LGUI,
+    KB_RCTRL,
+    KB_RSHIFT,
+    KB_RALT,
+    KB_RGUI,
 
-    /* extensions for internal use */
-    KB_FN0 = 0xE8,
-    KB_FN1,
-    KB_FN2,
-    KB_FN3,
-    KB_FN4,
-    KB_FN5,
-    KB_FN6,
-    KB_FN7,
-    // Mousekey move
-    KB_MS_UP = 0xF0,
-    KB_MS_DOWN,
-    KB_MS_LEFT,
-    KB_MS_RIGHT,
-    // Mousekey buttons
-    KB_MS_BTN1 = 0xF4,
-    KB_MS_BTN2,
-    KB_MS_BTN3,
-    KB_MS_BTN4,
-    KB_MS_BTN5,
-    // Mousekey wheel
-    KB_MS_WH_UP,
-    KB_MS_WH_DOWN,
-    KB_MS_WH_LEFT,
-    KB_MS_WH_RIGHT,
+    /* NOTE: uses 0xE8-FF for special keycodes */
 };
 
 #endif /* USB_KEYCODES_H */

+ 77 - 77
vusb/host.c

@@ -146,10 +146,12 @@ void host_mouse_send(report_mouse_t *report)
 #endif
 
 #ifdef USB_EXTRA_ENABLE
-void host_system_send(uint8_t data)
+void host_system_send(uint16_t data)
 {
-    static uint8_t report[] = { REPORT_ID_SYSTEM, 0 };
-    report[1] = data;
+    // Not need static?
+    static uint8_t report[] = { REPORT_ID_SYSTEM, 0, 0 };
+    report[1] = data&0xFF;
+    report[2] = (data>>8)&0xFF;
     if (usbInterruptIsReady3()) {
         usbSetInterrupt3((void *)&report, sizeof(report));
     } else {
@@ -157,10 +159,16 @@ void host_system_send(uint8_t data)
     }
 }
 
-void host_audio_send(uint8_t data)
+void host_consumer_send(uint16_t data)
 {
-    static uint8_t report[] = { REPORT_ID_AUDIO, 0 };
-    report[1] = data;
+    static uint16_t last_data = 0;
+    if (data == last_data) return;
+    last_data = data;
+
+    // Not need static?
+    static uint8_t report[] = { REPORT_ID_CONSUMER, 0, 0 };
+    report[1] = data&0xFF;
+    report[2] = (data>>8)&0xFF;
     if (usbInterruptIsReady3()) {
         usbSetInterrupt3((void *)&report, sizeof(report));
     } else {
@@ -293,85 +301,77 @@ PROGMEM uchar keyboard_hid_report[] = {
  */
 PROGMEM uchar mouse_hid_report[] = {
     /* mouse */
-    0x05, 0x01,        // USAGE_PAGE (Generic Desktop)
-    0x09, 0x02,        // USAGE (Mouse)
-    0xa1, 0x01,        // COLLECTION (Application)
-    0x85, 0x01,        //   REPORT_ID (1)
-    0x09, 0x01,        //   USAGE (Pointer)
-    0xa1, 0x00,        //   COLLECTION (Physical)
-                       // ----------------------------  Buttons
-    0x05, 0x09,        //     USAGE_PAGE (Button)
-    0x19, 0x01,        //     USAGE_MINIMUM (Button 1)
-    0x29, 0x05,        //     USAGE_MAXIMUM (Button 5)
-    0x15, 0x00,        //     LOGICAL_MINIMUM (0)
-    0x25, 0x01,        //     LOGICAL_MAXIMUM (1)
-    0x75, 0x01,        //     REPORT_SIZE (1)
-    0x95, 0x05,        //     REPORT_COUNT (5)
-    0x81, 0x02,        //     INPUT (Data,Var,Abs)
-                       // ----------------------------  Padding
-    0x75, 0x03,        //     REPORT_SIZE (3)
-    0x95, 0x01,        //     REPORT_COUNT (1)
-    0x81, 0x03,        //     INPUT (Cnst,Var,Abs)
-                       // ----------------------------  X,Y position
-    0x05, 0x01,        //     USAGE_PAGE (Generic Desktop)
-    0x09, 0x30,        //     USAGE (X)
-    0x09, 0x31,        //     USAGE (Y)
-    0x15, 0x81,        //     LOGICAL_MINIMUM (-127)
-    0x25, 0x7f,        //     LOGICAL_MAXIMUM (127)
-    0x75, 0x08,        //     REPORT_SIZE (8)
-    0x95, 0x02,        //     REPORT_COUNT (2)
-    0x81, 0x06,        //     INPUT (Data,Var,Rel)
-                       // ----------------------------  Vertical wheel
-    0x09, 0x38,        //     USAGE (Wheel)
-    0x15, 0x81,        //     LOGICAL_MINIMUM (-127)
-    0x25, 0x7f,        //     LOGICAL_MAXIMUM (127)
-    0x35, 0x00,        //     PHYSICAL_MINIMUM (0)        - reset physical
-    0x45, 0x00,        //     PHYSICAL_MAXIMUM (0)
-    0x75, 0x08,        //     REPORT_SIZE (8)
-    0x95, 0x01,        //     REPORT_COUNT (1)
-    0x81, 0x06,        //     INPUT (Data,Var,Rel)
-                       // ----------------------------  Horizontal wheel
-    0x05, 0x0c,        //     USAGE_PAGE (Consumer Devices)
-    0x0a, 0x38, 0x02,  //     USAGE (AC Pan)
-    0x15, 0x81,        //     LOGICAL_MINIMUM (-127)
-    0x25, 0x7f,        //     LOGICAL_MAXIMUM (127)
-    0x75, 0x08,        //     REPORT_SIZE (8)
-    0x95, 0x01,        //     REPORT_COUNT (1)
-    0x81, 0x06,        //     INPUT (Data,Var,Rel)
-    0xc0,              //   END_COLLECTION
-    0xc0,              // END_COLLECTION
-    /* system */
+    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
+    0x09, 0x02,                    // USAGE (Mouse)
+    0xa1, 0x01,                    // COLLECTION (Application)
+    0x85, REPORT_ID_MOUSE,         //   REPORT_ID (1)
+    0x09, 0x01,                    //   USAGE (Pointer)
+    0xa1, 0x00,                    //   COLLECTION (Physical)
+                                   // ----------------------------  Buttons
+    0x05, 0x09,                    //     USAGE_PAGE (Button)
+    0x19, 0x01,                    //     USAGE_MINIMUM (Button 1)
+    0x29, 0x05,                    //     USAGE_MAXIMUM (Button 5)
+    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
+    0x25, 0x01,                    //     LOGICAL_MAXIMUM (1)
+    0x75, 0x01,                    //     REPORT_SIZE (1)
+    0x95, 0x05,                    //     REPORT_COUNT (5)
+    0x81, 0x02,                    //     INPUT (Data,Var,Abs)
+    0x75, 0x03,                    //     REPORT_SIZE (3)
+    0x95, 0x01,                    //     REPORT_COUNT (1)
+    0x81, 0x03,                    //     INPUT (Cnst,Var,Abs)
+                                   // ----------------------------  X,Y position
+    0x05, 0x01,                    //     USAGE_PAGE (Generic Desktop)
+    0x09, 0x30,                    //     USAGE (X)
+    0x09, 0x31,                    //     USAGE (Y)
+    0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)
+    0x25, 0x7f,                    //     LOGICAL_MAXIMUM (127)
+    0x75, 0x08,                    //     REPORT_SIZE (8)
+    0x95, 0x02,                    //     REPORT_COUNT (2)
+    0x81, 0x06,                    //     INPUT (Data,Var,Rel)
+                                   // ----------------------------  Vertical wheel
+    0x09, 0x38,                    //     USAGE (Wheel)
+    0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)
+    0x25, 0x7f,                    //     LOGICAL_MAXIMUM (127)
+    0x35, 0x00,                    //     PHYSICAL_MINIMUM (0)        - reset physical
+    0x45, 0x00,                    //     PHYSICAL_MAXIMUM (0)
+    0x75, 0x08,                    //     REPORT_SIZE (8)
+    0x95, 0x01,                    //     REPORT_COUNT (1)
+    0x81, 0x06,                    //     INPUT (Data,Var,Rel)
+                                   // ----------------------------  Horizontal wheel
+    0x05, 0x0c,                    //     USAGE_PAGE (Consumer Devices)
+    0x0a, 0x38, 0x02,              //     USAGE (AC Pan)
+    0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)
+    0x25, 0x7f,                    //     LOGICAL_MAXIMUM (127)
+    0x75, 0x08,                    //     REPORT_SIZE (8)
+    0x95, 0x01,                    //     REPORT_COUNT (1)
+    0x81, 0x06,                    //     INPUT (Data,Var,Rel)
+    0xc0,                          //   END_COLLECTION
+    0xc0,                          // END_COLLECTION
+    /* system control */
     0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
     0x09, 0x80,                    // USAGE (System Control)
     0xa1, 0x01,                    // COLLECTION (Application)
-    0x85, 0x02,                    //   REPORT_ID (2)
-    0x19, 0x81,                    //   USAGE_MINIMUM (System Power Down)
-    0x29, 0x83,                    //   USAGE_MAXIMUM (System Wake Up)
-    0x75, 0x01,                    //   REPORT_SIZE (1)
-    0x95, 0x03,                    //   REPORT_COUNT (3)
-    0x81, 0x06,                    //   INPUT (Data,Var,Rel)
-    0x95, 0x05,                    //   REPORT_COUNT (5)
-    0x81, 0x07,                    //   INPUT (Cnst,Var,Rel)
+    0x85, REPORT_ID_SYSTEM,        //   REPORT_ID (2)
+    0x15, 0x01,                    //   LOGICAL_MINIMUM (0x1)
+    0x25, 0xb7,                    //   LOGICAL_MAXIMUM (0xb7)
+    0x19, 0x01,                    //   USAGE_MINIMUM (0x1)
+    0x29, 0xb7,                    //   USAGE_MAXIMUM (0xb7)
+    0x75, 0x10,                    //   REPORT_SIZE (16)
+    0x95, 0x01,                    //   REPORT_COUNT (1)
+    0x81, 0x00,                    //   INPUT (Data,Array,Abs)
     0xc0,                          // END_COLLECTION
-    /* audio */
+    /* consumer */
     0x05, 0x0c,                    // USAGE_PAGE (Consumer Devices)
     0x09, 0x01,                    // USAGE (Consumer Control)
     0xa1, 0x01,                    // COLLECTION (Application)
-    0x85, 0x03,                    //   REPORT_ID (3)
-    0x09, 0xe9,                    //   USAGE (Volume Up)
-    0x09, 0xea,                    //   USAGE (Volume Down)
-    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
-    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
-    0x75, 0x01,                    //   REPORT_SIZE (1)
-    0x95, 0x02,                    //   REPORT_COUNT (2)
-    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
-    0x09, 0xe2,                    //   USAGE (Mute)
-    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
-    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
+    0x85, REPORT_ID_CONSUMER,      //   REPORT_ID (3)
+    0x15, 0x01,                    //   LOGICAL_MINIMUM (0x1)
+    0x26, 0x9c, 0x02,              //   LOGICAL_MAXIMUM (0x29c)
+    0x19, 0x01,                    //   USAGE_MINIMUM (0x1)
+    0x2a, 0x9c, 0x02,              //   USAGE_MAXIMUM (0x29c)
+    0x75, 0x10,                    //   REPORT_SIZE (16)
     0x95, 0x01,                    //   REPORT_COUNT (1)
-    0x81, 0x06,                    //   INPUT (Data,Var,Rel)
-    0x95, 0x05,                    //   REPORT_COUNT (5)
-    0x81, 0x07,                    //   INPUT (Cnst,Var,Abs)
+    0x81, 0x00,                    //   INPUT (Data,Array,Abs)
     0xc0,                          // END_COLLECTION
 };