HID Consumer page and System control are also supported now.
merged mediakey branch: d53a356cd2
tags/v1.9
@@ -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 |
@@ -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; |
@@ -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 | |||
@@ -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 | |||
@@ -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); | |||
} |
@@ -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 |
@@ -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 |
@@ -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, |
@@ -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 */ |
@@ -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 | |||
}; | |||