diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c index e8aed6f5ddd..a9f37c61b0e 100644 --- a/tmk_core/protocol/vusb/vusb.c +++ b/tmk_core/protocol/vusb/vusb.c @@ -43,12 +43,15 @@ along with this program. If not, see . */ enum usb_interfaces { KEYBOARD_INTERFACE = NEXT_INTERFACE, -#if (defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)) - MOUSE_EXTRA_INTERFACE = NEXT_INTERFACE, -#endif +// It is important that the Raw HID interface is at a constant +// interface number, to support Linux/OSX platforms and chrome.hid +// If Raw HID is enabled, let it be always 1. #ifdef RAW_ENABLE RAW_INTERFACE = NEXT_INTERFACE, #endif +#if (defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)) + MOUSE_EXTRA_INTERFACE = NEXT_INTERFACE, +#endif #ifdef CONSOLE_ENABLE CONSOLE_INTERFACE = NEXT_INTERFACE, #endif @@ -404,6 +407,29 @@ const PROGMEM uchar keyboard_hid_report[] = { 0xC0 // End Collection }; +#ifdef RAW_ENABLE +const PROGMEM uchar raw_hid_report[] = { + 0x06, 0x60, 0xFF, // Usage Page (Vendor Defined) + 0x09, 0x61, // Usage (Vendor Defined) + 0xA1, 0x01, // Collection (Application) + // Data to host + 0x09, 0x62, // Usage (Vendor Defined) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, RAW_BUFFER_SIZE, // Report Count + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data, Variable, Absolute) + // Data from host + 0x09, 0x63, // Usage (Vendor Defined) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, RAW_BUFFER_SIZE, // Report Count + 0x75, 0x08, // Report Size (8) + 0x91, 0x02, // Output (Data, Variable, Absolute) + 0xC0 // End Collection +}; +#endif + #if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) const PROGMEM uchar mouse_extra_hid_report[] = { # ifdef MOUSE_ENABLE @@ -488,29 +514,6 @@ const PROGMEM uchar mouse_extra_hid_report[] = { }; #endif -#ifdef RAW_ENABLE -const PROGMEM uchar raw_hid_report[] = { - 0x06, 0x60, 0xFF, // Usage Page (Vendor Defined) - 0x09, 0x61, // Usage (Vendor Defined) - 0xA1, 0x01, // Collection (Application) - // Data to host - 0x09, 0x62, // Usage (Vendor Defined) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, RAW_BUFFER_SIZE, // Report Count - 0x75, 0x08, // Report Size (8) - 0x81, 0x02, // Input (Data, Variable, Absolute) - // Data from host - 0x09, 0x63, // Usage (Vendor Defined) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, RAW_BUFFER_SIZE, // Report Count - 0x75, 0x08, // Report Size (8) - 0x91, 0x02, // Output (Data, Variable, Absolute) - 0xC0 // End Collection -}; -#endif - #if defined(CONSOLE_ENABLE) const PROGMEM uchar console_hid_report[] = { 0x06, 0x31, 0xFF, // Usage Page (Vendor Defined - PJRC Teensy compatible) @@ -657,46 +660,10 @@ const PROGMEM usbConfigurationDescriptor_t usbConfigurationDescriptor = { .bInterval = USB_POLLING_INTERVAL_MS }, -# if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) - /* - * Mouse/Extrakeys - */ - .mouseExtraInterface = { - .header = { - .bLength = sizeof(usbInterfaceDescriptor_t), - .bDescriptorType = USBDESCR_INTERFACE - }, - .bInterfaceNumber = MOUSE_EXTRA_INTERFACE, - .bAlternateSetting = 0x00, - .bNumEndpoints = 1, - .bInterfaceClass = 0x03, - .bInterfaceSubClass = 0x00, - .bInterfaceProtocol = 0x00, - .iInterface = 0x00 - }, - .mouseExtraHID = { - .header = { - .bLength = sizeof(usbHIDDescriptor_t), - .bDescriptorType = USBDESCR_HID - }, - .bcdHID = 0x0101, - .bCountryCode = 0x00, - .bNumDescriptors = 1, - .bDescriptorType = USBDESCR_HID_REPORT, - .wDescriptorLength = sizeof(mouse_extra_hid_report) - }, - .mouseExtraINEndpoint = { - .header = { - .bLength = sizeof(usbEndpointDescriptor_t), - .bDescriptorType = USBDESCR_ENDPOINT - }, - .bEndpointAddress = (USBRQ_DIR_DEVICE_TO_HOST | USB_CFG_EP3_NUMBER), - .bmAttributes = 0x03, - .wMaxPacketSize = 8, - .bInterval = USB_POLLING_INTERVAL_MS - }, -# endif # if defined(RAW_ENABLE) + /* + * RAW HID + */ .rawInterface = { .header = { .bLength = sizeof(usbInterfaceDescriptor_t), @@ -742,6 +709,45 @@ const PROGMEM usbConfigurationDescriptor_t usbConfigurationDescriptor = { .bInterval = USB_POLLING_INTERVAL_MS }, # endif +# if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) + /* + * Mouse/Extrakeys + */ + .mouseExtraInterface = { + .header = { + .bLength = sizeof(usbInterfaceDescriptor_t), + .bDescriptorType = USBDESCR_INTERFACE + }, + .bInterfaceNumber = MOUSE_EXTRA_INTERFACE, + .bAlternateSetting = 0x00, + .bNumEndpoints = 1, + .bInterfaceClass = 0x03, + .bInterfaceSubClass = 0x00, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00 + }, + .mouseExtraHID = { + .header = { + .bLength = sizeof(usbHIDDescriptor_t), + .bDescriptorType = USBDESCR_HID + }, + .bcdHID = 0x0101, + .bCountryCode = 0x00, + .bNumDescriptors = 1, + .bDescriptorType = USBDESCR_HID_REPORT, + .wDescriptorLength = sizeof(mouse_extra_hid_report) + }, + .mouseExtraINEndpoint = { + .header = { + .bLength = sizeof(usbEndpointDescriptor_t), + .bDescriptorType = USBDESCR_ENDPOINT + }, + .bEndpointAddress = (USBRQ_DIR_DEVICE_TO_HOST | USB_CFG_EP3_NUMBER), + .bmAttributes = 0x03, + .wMaxPacketSize = 8, + .bInterval = USB_POLLING_INTERVAL_MS + }, +# endif # if defined(CONSOLE_ENABLE) /* * Console @@ -841,18 +847,18 @@ USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq) { usbMsgPtr = (unsigned char *)&usbConfigurationDescriptor.keyboardHID; len = sizeof(usbHIDDescriptor_t); break; -#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) - case MOUSE_EXTRA_INTERFACE: - usbMsgPtr = (unsigned char *)&usbConfigurationDescriptor.mouseExtraHID; - len = sizeof(usbHIDDescriptor_t); - break; -#endif #if defined(RAW_ENABLE) case RAW_INTERFACE: usbMsgPtr = (unsigned char *)&usbConfigurationDescriptor.rawHID; len = sizeof(usbHIDDescriptor_t); break; #endif +#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) + case MOUSE_EXTRA_INTERFACE: + usbMsgPtr = (unsigned char *)&usbConfigurationDescriptor.mouseExtraHID; + len = sizeof(usbHIDDescriptor_t); + break; +#endif #if defined(CONSOLE_ENABLE) case CONSOLE_INTERFACE: usbMsgPtr = (unsigned char *)&usbConfigurationDescriptor.consoleHID; @@ -868,18 +874,18 @@ USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq) { usbMsgPtr = (unsigned char *)keyboard_hid_report; len = sizeof(keyboard_hid_report); break; -#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) - case MOUSE_EXTRA_INTERFACE: - usbMsgPtr = (unsigned char *)mouse_extra_hid_report; - len = sizeof(mouse_extra_hid_report); - break; -#endif #if defined(RAW_ENABLE) case RAW_INTERFACE: usbMsgPtr = (unsigned char *)raw_hid_report; len = sizeof(raw_hid_report); break; #endif +#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) + case MOUSE_EXTRA_INTERFACE: + usbMsgPtr = (unsigned char *)mouse_extra_hid_report; + len = sizeof(mouse_extra_hid_report); + break; +#endif #if defined(CONSOLE_ENABLE) case CONSOLE_INTERFACE: usbMsgPtr = (unsigned char *)console_hid_report; diff --git a/tmk_core/protocol/vusb/vusb.h b/tmk_core/protocol/vusb/vusb.h index 96471433cfa..828960fc351 100644 --- a/tmk_core/protocol/vusb/vusb.h +++ b/tmk_core/protocol/vusb/vusb.h @@ -89,12 +89,6 @@ typedef struct usbConfigurationDescriptor { usbHIDDescriptor_t keyboardHID; usbEndpointDescriptor_t keyboardINEndpoint; -#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) - usbInterfaceDescriptor_t mouseExtraInterface; - usbHIDDescriptor_t mouseExtraHID; - usbEndpointDescriptor_t mouseExtraINEndpoint; -#endif - #if defined(RAW_ENABLE) usbInterfaceDescriptor_t rawInterface; usbHIDDescriptor_t rawHID; @@ -102,6 +96,12 @@ typedef struct usbConfigurationDescriptor { usbEndpointDescriptor_t rawOUTEndpoint; #endif +#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) + usbInterfaceDescriptor_t mouseExtraInterface; + usbHIDDescriptor_t mouseExtraHID; + usbEndpointDescriptor_t mouseExtraINEndpoint; +#endif + #if defined(CONSOLE_ENABLE) usbInterfaceDescriptor_t consoleInterface; usbHIDDescriptor_t consoleHID;