Align VUSB HID descriptors with LUFA/ChibiOS (#7675)

* Align VUSB HID descriptors with LUFA/ChibiOS

* Wrap send_system and send_consumer in ifdefs too

* Offset system usages to match LUFA/ChibiOS
This commit is contained in:
fauxpark 2020-02-12 17:19:39 +11:00 committed by GitHub
parent f318d6fffc
commit eaf32621aa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 127 additions and 120 deletions

View File

@ -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 void send_extra(uint8_t report_id, uint16_t data) {
static uint8_t last_id = 0; static uint8_t last_id = 0;
static uint16_t last_data = 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)); 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 * * Request from host *
@ -200,128 +210,125 @@ uchar usbFunctionWrite(uchar *data, uchar len) {
* Descriptors * * Descriptors *
*------------------------------------------------------------------*/ *------------------------------------------------------------------*/
/*
* Report Descriptor for keyboard
*
* from an example in HID spec appendix
*/
const PROGMEM uchar keyboard_hid_report[] = { const PROGMEM uchar keyboard_hid_report[] = {
0x05, 0x01, // Usage Page (Generic Desktop), 0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x06, // Usage (Keyboard), 0x09, 0x06, // Usage (Keyboard)
0xA1, 0x01, // Collection (Application), 0xA1, 0x01, // Collection (Application)
0x75, 0x01, // Report Size (1), // Modifiers (8 bits)
0x95, 0x08, // Report Count (8), 0x05, 0x07, // Usage Page (Keyboard/Keypad)
0x05, 0x07, // Usage Page (Key Codes), 0x19, 0xE0, // Usage Minimum (Keyboard Left Control)
0x19, 0xE0, // Usage Minimum (224), 0x29, 0xE7, // Usage Maximum (Keyboard Right GUI)
0x29, 0xE7, // Usage Maximum (231), 0x15, 0x00, // Logical Minimum (0)
0x15, 0x00, // Logical Minimum (0), 0x25, 0x01, // Logical Maximum (1)
0x25, 0x01, // Logical Maximum (1), 0x95, 0x08, // Report Count (8)
0x81, 0x02, // Input (Data, Variable, Absolute), ;Modifier byte 0x75, 0x01, // Report Size (1)
0x95, 0x01, // Report Count (1), 0x81, 0x02, // Input (Data, Variable, Absolute)
0x75, 0x08, // Report Size (8), // Reserved (1 byte)
0x81, 0x03, // Input (Constant), ;Reserved byte 0x95, 0x01, // Report Count (1)
0x95, 0x05, // Report Count (5), 0x75, 0x08, // Report Size (8)
0x75, 0x01, // Report Size (1), 0x81, 0x03, // Input (Constant)
0x05, 0x08, // Usage Page (LEDs), // Keycodes (6 bytes)
0x19, 0x01, // Usage Minimum (1), 0x05, 0x07, // Usage Page (Keyboard/Keypad)
0x29, 0x05, // Usage Maximum (5), 0x19, 0x00, // Usage Minimum (0)
0x91, 0x02, // Output (Data, Variable, Absolute), ;LED report 0x29, 0xFF, // Usage Maximum (255)
0x95, 0x01, // Report Count (1), 0x15, 0x00, // Logical Minimum (0)
0x75, 0x03, // Report Size (3), 0x26, 0xFF, 0x00, // Logical Maximum (255)
0x91, 0x03, // Output (Constant), ;LED report padding 0x95, 0x06, // Report Count (6)
0x95, 0x06, // Report Count (6), 0x75, 0x08, // Report Size (8)
0x75, 0x08, // Report Size (8), 0x81, 0x00, // Input (Data, Array, Absolute)
0x15, 0x00, // Logical Minimum (0),
0x26, 0xFF, 0x00, // Logical Maximum(255), // Status LEDs (5 bits)
0x05, 0x07, // Usage Page (Key Codes), 0x05, 0x08, // Usage Page (LED)
0x19, 0x00, // Usage Minimum (0), 0x19, 0x01, // Usage Minimum (Num Lock)
0x29, 0xFF, // Usage Maximum (255), 0x29, 0x05, // Usage Maximum (Kana)
0x81, 0x00, // Input (Data, Array), 0x95, 0x05, // Report Count (5)
0xc0 // End Collection 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[] = { const PROGMEM uchar mouse_hid_report[] = {
/* mouse */ // Mouse report descriptor
0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x02, // USAGE (Mouse) 0x09, 0x02, // Usage (Mouse)
0xa1, 0x01, // COLLECTION (Application) 0xA1, 0x01, // Collection (Application)
0x85, REPORT_ID_MOUSE, // REPORT_ID (1) 0x85, REPORT_ID_MOUSE, // Report ID
0x09, 0x01, // USAGE (Pointer) 0x09, 0x01, // Usage (Pointer)
0xa1, 0x00, // COLLECTION (Physical) 0xA1, 0x00, // Collection (Physical)
// ---------------------------- Buttons // Buttons (5 bits)
0x05, 0x09, // USAGE_PAGE (Button) 0x05, 0x09, // Usage Page (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1) 0x19, 0x01, // Usage Minimum (Button 1)
0x29, 0x05, // USAGE_MAXIMUM (Button 5) 0x29, 0x05, // Usage Maximum (Button 5)
0x15, 0x00, // LOGICAL_MINIMUM (0) 0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x05, // Report Count (5)
0x95, 0x05, // REPORT_COUNT (5) 0x75, 0x01, // Report Size (1)
0x81, 0x02, // INPUT (Data,Var,Abs) 0x81, 0x02, // Input (Data, Variable, Absolute)
0x75, 0x03, // REPORT_SIZE (3) // Button padding (3 bits)
0x95, 0x01, // REPORT_COUNT (1) 0x95, 0x01, // Report Count (1)
0x81, 0x03, // INPUT (Cnst,Var,Abs) 0x75, 0x03, // Report Size (3)
// ---------------------------- X,Y position 0x81, 0x03, // Input (Constant)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x30, // USAGE (X) // X/Y position (2 bytes)
0x09, 0x31, // USAGE (Y) 0x05, 0x01, // Usage Page (Generic Desktop)
0x15, 0x81, // LOGICAL_MINIMUM (-127) 0x09, 0x30, // Usage (X)
0x25, 0x7f, // LOGICAL_MAXIMUM (127) 0x09, 0x31, // Usage (Y)
0x75, 0x08, // REPORT_SIZE (8) 0x15, 0x81, // Logical Minimum (-127)
0x95, 0x02, // REPORT_COUNT (2) 0x25, 0x7F, // Logical Maximum (127)
0x81, 0x06, // INPUT (Data,Var,Rel) 0x95, 0x02, // Report Count (2)
// ---------------------------- Vertical wheel 0x75, 0x08, // Report Size (8)
0x09, 0x38, // USAGE (Wheel) 0x81, 0x06, // Input (Data, Variable, Relative)
0x15, 0x81, // LOGICAL_MINIMUM (-127)
0x25, 0x7f, // LOGICAL_MAXIMUM (127) // Vertical wheel (1 byte)
0x35, 0x00, // PHYSICAL_MINIMUM (0) - reset physical 0x09, 0x38, // Usage (Wheel)
0x45, 0x00, // PHYSICAL_MAXIMUM (0) 0x15, 0x81, // Logical Minimum (-127)
0x75, 0x08, // REPORT_SIZE (8) 0x25, 0x7F, // Logical Maximum (127)
0x95, 0x01, // REPORT_COUNT (1) 0x95, 0x01, // Report Count (1)
0x81, 0x06, // INPUT (Data,Var,Rel) 0x75, 0x08, // Report Size (8)
// ---------------------------- Horizontal wheel 0x81, 0x06, // Input (Data, Variable, Relative)
0x05, 0x0c, // USAGE_PAGE (Consumer Devices) // Horizontal wheel (1 byte)
0x0a, 0x38, 0x02, // USAGE (AC Pan) 0x05, 0x0C, // Usage Page (Consumer)
0x15, 0x81, // LOGICAL_MINIMUM (-127) 0x0A, 0x38, 0x02, // Usage (AC Pan)
0x25, 0x7f, // LOGICAL_MAXIMUM (127) 0x15, 0x81, // Logical Minimum (-127)
0x75, 0x08, // REPORT_SIZE (8) 0x25, 0x7F, // Logical Maximum (127)
0x95, 0x01, // REPORT_COUNT (1) 0x95, 0x01, // Report Count (1)
0x81, 0x06, // INPUT (Data,Var,Rel) 0x75, 0x08, // Report Size (8)
0xc0, // END_COLLECTION 0x81, 0x06, // Input (Data, Variable, Relative)
0xc0, // END_COLLECTION 0xC0, // End Collection
/* system control */ 0xC0, // End Collection
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x80, // USAGE (System Control) #ifdef EXTRAKEY_ENABLE
0xa1, 0x01, // COLLECTION (Application) // Extrakeys report descriptor
0x85, REPORT_ID_SYSTEM, // REPORT_ID (2) 0x05, 0x01, // Usage Page (Generic Desktop)
0x15, 0x01, // LOGICAL_MINIMUM (0x1) 0x09, 0x80, // Usage (System Control)
0x26, 0xb7, 0x00, // LOGICAL_MAXIMUM (0xb7) 0xA1, 0x01, // Collection (Application)
0x19, 0x01, // USAGE_MINIMUM (0x1) 0x85, REPORT_ID_SYSTEM, // Report ID
0x29, 0xb7, // USAGE_MAXIMUM (0xb7) 0x1A, 0x81, 0x00, // Usage Minimum (System Power Down)
0x75, 0x10, // REPORT_SIZE (16) 0x2A, 0x83, 0x00, // Usage Maximum (System Wake Up)
0x95, 0x01, // REPORT_COUNT (1) 0x16, 0x01, 0x00, // Logical Minimum
0x81, 0x00, // INPUT (Data,Array,Abs) 0x26, 0x03, 0x00, // Logical Maximum
0xc0, // END_COLLECTION 0x95, 0x01, // Report Count (1)
/* consumer */ 0x75, 0x10, // Report Size (16)
0x05, 0x0c, // USAGE_PAGE (Consumer Devices) 0x81, 0x00, // Input (Data, Array, Absolute)
0x09, 0x01, // USAGE (Consumer Control) 0xC0, // End Collection
0xa1, 0x01, // COLLECTION (Application)
0x85, REPORT_ID_CONSUMER, // REPORT_ID (3) 0x05, 0x0C, // Usage Page (Consumer)
0x15, 0x01, // LOGICAL_MINIMUM (0x1) 0x09, 0x01, // Usage (Consumer Control)
0x26, 0x9c, 0x02, // LOGICAL_MAXIMUM (0x29c) 0xA1, 0x01, // Collection (Application)
0x19, 0x01, // USAGE_MINIMUM (0x1) 0x85, REPORT_ID_CONSUMER, // Report ID
0x2a, 0x9c, 0x02, // USAGE_MAXIMUM (0x29c) 0x1A, 0x01, 0x00, // Usage Minimum (Consumer Control)
0x75, 0x10, // REPORT_SIZE (16) 0x2A, 0x9C, 0x02, // Usage Maximum (AC Distribute Vertically)
0x95, 0x01, // REPORT_COUNT (1) 0x16, 0x01, 0x00, // Logical Minimum
0x81, 0x00, // INPUT (Data,Array,Abs) 0x26, 0x9C, 0x02, // Logical Maximum
0xc0, // END_COLLECTION 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 #ifndef USB_MAX_POWER_CONSUMPTION