summaryrefslogtreecommitdiffstats
path: root/tmk_core
diff options
context:
space:
mode:
Diffstat (limited to 'tmk_core')
-rw-r--r--tmk_core/protocol/vusb/vusb.c247
1 files changed, 127 insertions, 120 deletions
diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c
index 110b3069bd..7c1f4ca7f0 100644
--- a/tmk_core/protocol/vusb/vusb.c
+++ b/tmk_core/protocol/vusb/vusb.c
@@ -112,6 +112,7 @@ static void send_mouse(report_mouse_t *report) {
}
}
+#ifdef EXTRAKEY_ENABLE
static void send_extra(uint8_t report_id, uint16_t data) {
static uint8_t last_id = 0;
static uint16_t last_data = 0;
@@ -124,10 +125,19 @@ static void send_extra(uint8_t report_id, uint16_t data) {
usbSetInterrupt3((void *)&report, sizeof(report));
}
}
+#endif
-static void send_system(uint16_t data) { send_extra(REPORT_ID_SYSTEM, data); }
+static void send_system(uint16_t data) {
+#ifdef EXTRAKEY_ENABLE
+ send_extra(REPORT_ID_SYSTEM, data - SYSTEM_POWER_DOWN + 1);
+#endif
+}
-static void send_consumer(uint16_t data) { send_extra(REPORT_ID_CONSUMER, data); }
+static void send_consumer(uint16_t data) {
+#ifdef EXTRAKEY_ENABLE
+ send_extra(REPORT_ID_CONSUMER, data);
+#endif
+}
/*------------------------------------------------------------------*
* Request from host *
@@ -200,128 +210,125 @@ uchar usbFunctionWrite(uchar *data, uchar len) {
* Descriptors *
*------------------------------------------------------------------*/
-/*
- * Report Descriptor for keyboard
- *
- * from an example in HID spec appendix
- */
const PROGMEM uchar keyboard_hid_report[] = {
- 0x05, 0x01, // Usage Page (Generic Desktop),
- 0x09, 0x06, // Usage (Keyboard),
- 0xA1, 0x01, // Collection (Application),
- 0x75, 0x01, // Report Size (1),
- 0x95, 0x08, // Report Count (8),
- 0x05, 0x07, // Usage Page (Key Codes),
- 0x19, 0xE0, // Usage Minimum (224),
- 0x29, 0xE7, // Usage Maximum (231),
- 0x15, 0x00, // Logical Minimum (0),
- 0x25, 0x01, // Logical Maximum (1),
- 0x81, 0x02, // Input (Data, Variable, Absolute), ;Modifier byte
- 0x95, 0x01, // Report Count (1),
- 0x75, 0x08, // Report Size (8),
- 0x81, 0x03, // Input (Constant), ;Reserved byte
- 0x95, 0x05, // Report Count (5),
- 0x75, 0x01, // Report Size (1),
- 0x05, 0x08, // Usage Page (LEDs),
- 0x19, 0x01, // Usage Minimum (1),
- 0x29, 0x05, // Usage Maximum (5),
- 0x91, 0x02, // Output (Data, Variable, Absolute), ;LED report
- 0x95, 0x01, // Report Count (1),
- 0x75, 0x03, // Report Size (3),
- 0x91, 0x03, // Output (Constant), ;LED report padding
- 0x95, 0x06, // Report Count (6),
- 0x75, 0x08, // Report Size (8),
- 0x15, 0x00, // Logical Minimum (0),
- 0x26, 0xFF, 0x00, // Logical Maximum(255),
- 0x05, 0x07, // Usage Page (Key Codes),
- 0x19, 0x00, // Usage Minimum (0),
- 0x29, 0xFF, // Usage Maximum (255),
- 0x81, 0x00, // Input (Data, Array),
- 0xc0 // End Collection
+ 0x05, 0x01, // Usage Page (Generic Desktop)
+ 0x09, 0x06, // Usage (Keyboard)
+ 0xA1, 0x01, // Collection (Application)
+ // Modifiers (8 bits)
+ 0x05, 0x07, // Usage Page (Keyboard/Keypad)
+ 0x19, 0xE0, // Usage Minimum (Keyboard Left Control)
+ 0x29, 0xE7, // Usage Maximum (Keyboard Right GUI)
+ 0x15, 0x00, // Logical Minimum (0)
+ 0x25, 0x01, // Logical Maximum (1)
+ 0x95, 0x08, // Report Count (8)
+ 0x75, 0x01, // Report Size (1)
+ 0x81, 0x02, // Input (Data, Variable, Absolute)
+ // Reserved (1 byte)
+ 0x95, 0x01, // Report Count (1)
+ 0x75, 0x08, // Report Size (8)
+ 0x81, 0x03, // Input (Constant)
+ // Keycodes (6 bytes)
+ 0x05, 0x07, // Usage Page (Keyboard/Keypad)
+ 0x19, 0x00, // Usage Minimum (0)
+ 0x29, 0xFF, // Usage Maximum (255)
+ 0x15, 0x00, // Logical Minimum (0)
+ 0x26, 0xFF, 0x00, // Logical Maximum (255)
+ 0x95, 0x06, // Report Count (6)
+ 0x75, 0x08, // Report Size (8)
+ 0x81, 0x00, // Input (Data, Array, Absolute)
+
+ // Status LEDs (5 bits)
+ 0x05, 0x08, // Usage Page (LED)
+ 0x19, 0x01, // Usage Minimum (Num Lock)
+ 0x29, 0x05, // Usage Maximum (Kana)
+ 0x95, 0x05, // Report Count (5)
+ 0x75, 0x01, // Report Size (1)
+ 0x91, 0x02, // Output (Data, Variable, Absolute)
+ // LED padding (3 bits)
+ 0x95, 0x01, // Report Count (1)
+ 0x75, 0x03, // Report Size (3)
+ 0x91, 0x03, // Output (Constant)
+ 0xC0 // End Collection
};
-/*
- * Report Descriptor for mouse
- *
- * Mouse Protocol 1, HID 1.11 spec, Appendix B, page 59-60, with wheel extension
- * http://www.microchip.com/forums/tm.aspx?high=&m=391435&mpage=1#391521
- * http://www.keil.com/forum/15671/
- * http://www.microsoft.com/whdc/device/input/wheel.mspx
- */
const PROGMEM uchar mouse_hid_report[] = {
- /* 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
- /* 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)
- 0x26, 0xb7, 0x00, // 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, 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, 0x00, // INPUT (Data,Array,Abs)
- 0xc0, // END_COLLECTION
+ // Mouse report descriptor
+ 0x05, 0x01, // Usage Page (Generic Desktop)
+ 0x09, 0x02, // Usage (Mouse)
+ 0xA1, 0x01, // Collection (Application)
+ 0x85, REPORT_ID_MOUSE, // Report ID
+ 0x09, 0x01, // Usage (Pointer)
+ 0xA1, 0x00, // Collection (Physical)
+ // Buttons (5 bits)
+ 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)
+ 0x95, 0x05, // Report Count (5)
+ 0x75, 0x01, // Report Size (1)
+ 0x81, 0x02, // Input (Data, Variable, Absolute)
+ // Button padding (3 bits)
+ 0x95, 0x01, // Report Count (1)
+ 0x75, 0x03, // Report Size (3)
+ 0x81, 0x03, // Input (Constant)
+
+ // X/Y position (2 bytes)
+ 0x05, 0x01, // Usage Page (Generic Desktop)
+ 0x09, 0x30, // Usage (X)
+ 0x09, 0x31, // Usage (Y)
+ 0x15, 0x81, // Logical Minimum (-127)
+ 0x25, 0x7F, // Logical Maximum (127)
+ 0x95, 0x02, // Report Count (2)
+ 0x75, 0x08, // Report Size (8)
+ 0x81, 0x06, // Input (Data, Variable, Relative)
+
+ // Vertical wheel (1 byte)
+ 0x09, 0x38, // Usage (Wheel)
+ 0x15, 0x81, // Logical Minimum (-127)
+ 0x25, 0x7F, // Logical Maximum (127)
+ 0x95, 0x01, // Report Count (1)
+ 0x75, 0x08, // Report Size (8)
+ 0x81, 0x06, // Input (Data, Variable, Relative)
+ // Horizontal wheel (1 byte)
+ 0x05, 0x0C, // Usage Page (Consumer)
+ 0x0A, 0x38, 0x02, // Usage (AC Pan)
+ 0x15, 0x81, // Logical Minimum (-127)
+ 0x25, 0x7F, // Logical Maximum (127)
+ 0x95, 0x01, // Report Count (1)
+ 0x75, 0x08, // Report Size (8)
+ 0x81, 0x06, // Input (Data, Variable, Relative)
+ 0xC0, // End Collection
+ 0xC0, // End Collection
+
+#ifdef EXTRAKEY_ENABLE
+ // Extrakeys report descriptor
+ 0x05, 0x01, // Usage Page (Generic Desktop)
+ 0x09, 0x80, // Usage (System Control)
+ 0xA1, 0x01, // Collection (Application)
+ 0x85, REPORT_ID_SYSTEM, // Report ID
+ 0x1A, 0x81, 0x00, // Usage Minimum (System Power Down)
+ 0x2A, 0x83, 0x00, // Usage Maximum (System Wake Up)
+ 0x16, 0x01, 0x00, // Logical Minimum
+ 0x26, 0x03, 0x00, // Logical Maximum
+ 0x95, 0x01, // Report Count (1)
+ 0x75, 0x10, // Report Size (16)
+ 0x81, 0x00, // Input (Data, Array, Absolute)
+ 0xC0, // End Collection
+
+ 0x05, 0x0C, // Usage Page (Consumer)
+ 0x09, 0x01, // Usage (Consumer Control)
+ 0xA1, 0x01, // Collection (Application)
+ 0x85, REPORT_ID_CONSUMER, // Report ID
+ 0x1A, 0x01, 0x00, // Usage Minimum (Consumer Control)
+ 0x2A, 0x9C, 0x02, // Usage Maximum (AC Distribute Vertically)
+ 0x16, 0x01, 0x00, // Logical Minimum
+ 0x26, 0x9C, 0x02, // Logical Maximum
+ 0x95, 0x01, // Report Count (1)
+ 0x75, 0x10, // Report Size (16)
+ 0x81, 0x00, // Input (Data, Array, Absolute)
+ 0xC0 // End Collection
+#endif
};
#ifndef USB_MAX_POWER_CONSUMPTION