Browse Source

Remove assumption on XAP interface number

zvecr 3 years ago
parent
commit
2f7be506de

+ 11 - 11
tmk_core/protocol/chibios/usb_main.c

@@ -368,14 +368,14 @@ typedef struct {
 #ifdef RAW_ENABLE
             usb_driver_config_t raw_driver;
 #endif
-#ifdef XAP_ENABLE
-            usb_driver_config_t xap_driver;
-#endif
 #ifdef MIDI_ENABLE
             usb_driver_config_t midi_driver;
 #endif
 #ifdef VIRTSER_ENABLE
             usb_driver_config_t serial_driver;
+#endif
+#ifdef XAP_ENABLE
+            usb_driver_config_t xap_driver;
 #endif
         };
         usb_driver_config_t array[0];
@@ -402,14 +402,6 @@ static usb_driver_configs_t drivers = {
     .raw_driver = QMK_USB_DRIVER_CONFIG(RAW, 0, false),
 #endif
 
-#ifdef XAP_ENABLE
-#    define XAP_IN_CAPACITY 4
-#    define XAP_OUT_CAPACITY 4
-#    define XAP_IN_MODE USB_EP_MODE_TYPE_INTR
-#    define XAP_OUT_MODE USB_EP_MODE_TYPE_INTR
-    .xap_driver = QMK_USB_DRIVER_CONFIG(XAP, 0, false),
-#endif
-
 #ifdef MIDI_ENABLE
 #    define MIDI_STREAM_IN_CAPACITY 4
 #    define MIDI_STREAM_OUT_CAPACITY 4
@@ -425,6 +417,14 @@ static usb_driver_configs_t drivers = {
 #    define CDC_OUT_MODE USB_EP_MODE_TYPE_BULK
     .serial_driver = QMK_USB_DRIVER_CONFIG(CDC, CDC_NOTIFICATION_EPNUM, false),
 #endif
+
+#ifdef XAP_ENABLE
+#    define XAP_IN_CAPACITY 4
+#    define XAP_OUT_CAPACITY 4
+#    define XAP_IN_MODE USB_EP_MODE_TYPE_INTR
+#    define XAP_OUT_MODE USB_EP_MODE_TYPE_INTR
+    .xap_driver = QMK_USB_DRIVER_CONFIG(XAP, 0, false),
+#endif
 };
 
 #define NUM_USB_DRIVERS (sizeof(drivers) / sizeof(usb_driver_config_t))

+ 6 - 6
tmk_core/protocol/lufa/lufa.c

@@ -486,12 +486,6 @@ void EVENT_USB_Device_ConfigurationChanged(void) {
     ConfigSuccess &= Endpoint_ConfigureEndpoint((RAW_OUT_EPNUM | ENDPOINT_DIR_OUT), EP_TYPE_INTERRUPT, RAW_EPSIZE, 1);
 #endif
 
-#ifdef XAP_ENABLE
-    /* Setup XAP endpoints */
-    ConfigSuccess &= Endpoint_ConfigureEndpoint((XAP_IN_EPNUM | ENDPOINT_DIR_IN), EP_TYPE_INTERRUPT, XAP_EPSIZE, 1);
-    ConfigSuccess &= Endpoint_ConfigureEndpoint((XAP_OUT_EPNUM | ENDPOINT_DIR_OUT), EP_TYPE_INTERRUPT, XAP_EPSIZE, 1);
-#endif // XAP_ENABLE
-
 #ifdef CONSOLE_ENABLE
     /* Setup console endpoint */
     ConfigSuccess &= Endpoint_ConfigureEndpoint((CONSOLE_IN_EPNUM | ENDPOINT_DIR_IN), EP_TYPE_INTERRUPT, CONSOLE_EPSIZE, 1);
@@ -523,6 +517,12 @@ void EVENT_USB_Device_ConfigurationChanged(void) {
     ConfigSuccess &= Endpoint_ConfigureEndpoint((DIGITIZER_IN_EPNUM | ENDPOINT_DIR_IN), EP_TYPE_INTERRUPT, DIGITIZER_EPSIZE, 1);
 #endif
 
+#ifdef XAP_ENABLE
+    /* Setup XAP endpoints */
+    ConfigSuccess &= Endpoint_ConfigureEndpoint((XAP_IN_EPNUM | ENDPOINT_DIR_IN), EP_TYPE_INTERRUPT, XAP_EPSIZE, 1);
+    ConfigSuccess &= Endpoint_ConfigureEndpoint((XAP_OUT_EPNUM | ENDPOINT_DIR_OUT), EP_TYPE_INTERRUPT, XAP_EPSIZE, 1);
+#endif // XAP_ENABLE
+
     usb_device_state_set_configuration(USB_DeviceState == DEVICE_STATE_Configured, USB_Device_ConfigurationNumber);
 }
 

+ 86 - 84
tmk_core/protocol/usb_descriptor.c

@@ -406,53 +406,53 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM RawReport[] = {
 };
 #endif
 
-#ifdef XAP_ENABLE
-const USB_Descriptor_HIDReport_Datatype_t PROGMEM XapReport[] = {
-    HID_RI_USAGE_PAGE(16, 0xFF51), // Vendor Defined ('Q')
-    HID_RI_USAGE(8, 0x58),         // Vendor Defined ('X')
+#ifdef CONSOLE_ENABLE
+const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] = {
+    HID_RI_USAGE_PAGE(16, 0xFF31), // Vendor Defined (PJRC Teensy compatible)
+    HID_RI_USAGE(8, 0x74),         // Vendor Defined (PJRC Teensy compatible)
     HID_RI_COLLECTION(8, 0x01),    // Application
         // Data to host
-        HID_RI_USAGE(8, 0x62),     // Vendor Defined
+        HID_RI_USAGE(8, 0x75),     // Vendor Defined
         HID_RI_LOGICAL_MINIMUM(8, 0x00),
         HID_RI_LOGICAL_MAXIMUM(16, 0x00FF),
-        HID_RI_REPORT_COUNT(8, XAP_EPSIZE),
+        HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE),
         HID_RI_REPORT_SIZE(8, 0x08),
         HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
 
         // Data from host
-        HID_RI_USAGE(8, 0x63),     // Vendor Defined
+        HID_RI_USAGE(8, 0x76),     // Vendor Defined
         HID_RI_LOGICAL_MINIMUM(8, 0x00),
         HID_RI_LOGICAL_MAXIMUM(16, 0x00FF),
-        HID_RI_REPORT_COUNT(8, XAP_EPSIZE),
+        HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE),
         HID_RI_REPORT_SIZE(8, 0x08),
         HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
     HID_RI_END_COLLECTION(0),
 };
-#endif //  XAP_ENABLE
+#endif
 
-#ifdef CONSOLE_ENABLE
-const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] = {
-    HID_RI_USAGE_PAGE(16, 0xFF31), // Vendor Defined (PJRC Teensy compatible)
-    HID_RI_USAGE(8, 0x74),         // Vendor Defined (PJRC Teensy compatible)
+#ifdef XAP_ENABLE
+const USB_Descriptor_HIDReport_Datatype_t PROGMEM XapReport[] = {
+    HID_RI_USAGE_PAGE(16, 0xFF51), // Vendor Defined ('Q')
+    HID_RI_USAGE(8, 0x58),         // Vendor Defined ('X')
     HID_RI_COLLECTION(8, 0x01),    // Application
         // Data to host
-        HID_RI_USAGE(8, 0x75),     // Vendor Defined
+        HID_RI_USAGE(8, 0x62),     // Vendor Defined
         HID_RI_LOGICAL_MINIMUM(8, 0x00),
         HID_RI_LOGICAL_MAXIMUM(16, 0x00FF),
-        HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE),
+        HID_RI_REPORT_COUNT(8, XAP_EPSIZE),
         HID_RI_REPORT_SIZE(8, 0x08),
         HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
 
         // Data from host
-        HID_RI_USAGE(8, 0x76),     // Vendor Defined
+        HID_RI_USAGE(8, 0x63),     // Vendor Defined
         HID_RI_LOGICAL_MINIMUM(8, 0x00),
         HID_RI_LOGICAL_MAXIMUM(16, 0x00FF),
-        HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE),
+        HID_RI_REPORT_COUNT(8, XAP_EPSIZE),
         HID_RI_REPORT_SIZE(8, 0x08),
         HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
     HID_RI_END_COLLECTION(0),
 };
-#endif
+#endif //  XAP_ENABLE
 
 /*
  * Device descriptor
@@ -603,56 +603,6 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = {
     },
 #endif
 
-#ifdef XAP_ENABLE
-    /*
-     * QMK XAP
-     */
-    .Xap_Interface = {
-        .Header = {
-            .Size               = sizeof(USB_Descriptor_Interface_t),
-            .Type               = DTYPE_Interface
-        },
-        .InterfaceNumber        = XAP_INTERFACE,
-        .AlternateSetting       = 0x00,
-        .TotalEndpoints         = 2,
-        .Class                  = HID_CSCP_HIDClass,
-        .SubClass               = HID_CSCP_NonBootSubclass,
-        .Protocol               = HID_CSCP_NonBootProtocol,
-        .InterfaceStrIndex      = NO_DESCRIPTOR
-    },
-    .Xap_HID = {
-        .Header = {
-            .Size               = sizeof(USB_HID_Descriptor_HID_t),
-            .Type               = HID_DTYPE_HID
-        },
-        .HIDSpec                = VERSION_BCD(1, 1, 1),
-        .CountryCode            = 0x00,
-        .TotalReportDescriptors = 1,
-        .HIDReportType          = HID_DTYPE_Report,
-        .HIDReportLength        = sizeof(XapReport)
-    },
-    .Xap_INEndpoint = {
-        .Header = {
-            .Size               = sizeof(USB_Descriptor_Endpoint_t),
-            .Type               = DTYPE_Endpoint
-        },
-        .EndpointAddress        = (ENDPOINT_DIR_IN | XAP_IN_EPNUM),
-        .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
-        .EndpointSize           = XAP_EPSIZE,
-        .PollingIntervalMS      = 0x01
-    },
-    .Xap_OUTEndpoint = {
-        .Header = {
-            .Size               = sizeof(USB_Descriptor_Endpoint_t),
-            .Type               = DTYPE_Endpoint
-        },
-        .EndpointAddress        = (ENDPOINT_DIR_OUT | XAP_OUT_EPNUM),
-        .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
-        .EndpointSize           = XAP_EPSIZE,
-        .PollingIntervalMS      = 0x01
-    },
-#endif
-
 #if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP)
     /*
      * Mouse
@@ -1122,6 +1072,56 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = {
         .PollingIntervalMS      = USB_POLLING_INTERVAL_MS
     },
 #endif
+
+#ifdef XAP_ENABLE
+    /*
+     * QMK XAP
+     */
+    .Xap_Interface = {
+        .Header = {
+            .Size               = sizeof(USB_Descriptor_Interface_t),
+            .Type               = DTYPE_Interface
+        },
+        .InterfaceNumber        = XAP_INTERFACE,
+        .AlternateSetting       = 0x00,
+        .TotalEndpoints         = 2,
+        .Class                  = HID_CSCP_HIDClass,
+        .SubClass               = HID_CSCP_NonBootSubclass,
+        .Protocol               = HID_CSCP_NonBootProtocol,
+        .InterfaceStrIndex      = NO_DESCRIPTOR
+    },
+    .Xap_HID = {
+        .Header = {
+            .Size               = sizeof(USB_HID_Descriptor_HID_t),
+            .Type               = HID_DTYPE_HID
+        },
+        .HIDSpec                = VERSION_BCD(1, 1, 1),
+        .CountryCode            = 0x00,
+        .TotalReportDescriptors = 1,
+        .HIDReportType          = HID_DTYPE_Report,
+        .HIDReportLength        = sizeof(XapReport)
+    },
+    .Xap_INEndpoint = {
+        .Header = {
+            .Size               = sizeof(USB_Descriptor_Endpoint_t),
+            .Type               = DTYPE_Endpoint
+        },
+        .EndpointAddress        = (ENDPOINT_DIR_IN | XAP_IN_EPNUM),
+        .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+        .EndpointSize           = XAP_EPSIZE,
+        .PollingIntervalMS      = 0x01
+    },
+    .Xap_OUTEndpoint = {
+        .Header = {
+            .Size               = sizeof(USB_Descriptor_Endpoint_t),
+            .Type               = DTYPE_Endpoint
+        },
+        .EndpointAddress        = (ENDPOINT_DIR_OUT | XAP_OUT_EPNUM),
+        .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+        .EndpointSize           = XAP_EPSIZE,
+        .PollingIntervalMS      = 0x01
+    },
+#endif
 };
 
 /*
@@ -1250,14 +1250,6 @@ uint16_t get_usb_descriptor(const uint16_t wValue, const uint16_t wIndex, const
                     break;
 #endif
 
-#ifdef XAP_ENABLE
-                case XAP_INTERFACE:
-                    Address = &ConfigurationDescriptor.Xap_HID;
-                    Size    = sizeof(USB_HID_Descriptor_HID_t);
-
-                    break;
-#endif
-
 #ifdef CONSOLE_ENABLE
                 case CONSOLE_INTERFACE:
                     Address = &ConfigurationDescriptor.Console_HID;
@@ -1265,12 +1257,14 @@ uint16_t get_usb_descriptor(const uint16_t wValue, const uint16_t wIndex, const
 
                     break;
 #endif
+
 #if defined(JOYSTICK_ENABLE) && !defined(JOYSTICK_SHARED_EP)
                 case JOYSTICK_INTERFACE:
                     Address = &ConfigurationDescriptor.Joystick_HID;
                     Size    = sizeof(USB_HID_Descriptor_HID_t);
                     break;
 #endif
+
 #if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP)
                 case DIGITIZER_INTERFACE:
                     Address = &ConfigurationDescriptor.Digitizer_HID;
@@ -1278,6 +1272,14 @@ uint16_t get_usb_descriptor(const uint16_t wValue, const uint16_t wIndex, const
 
                     break;
 #endif
+
+#ifdef XAP_ENABLE
+                case XAP_INTERFACE:
+                    Address = &ConfigurationDescriptor.Xap_HID;
+                    Size    = sizeof(USB_HID_Descriptor_HID_t);
+
+                    break;
+#endif
             }
 
             break;
@@ -1315,14 +1317,6 @@ uint16_t get_usb_descriptor(const uint16_t wValue, const uint16_t wIndex, const
                     break;
 #endif
 
-#ifdef XAP_ENABLE
-                case XAP_INTERFACE:
-                    Address = &XapReport;
-                    Size    = sizeof(XapReport);
-
-                    break;
-#endif
-
 #ifdef CONSOLE_ENABLE
                 case CONSOLE_INTERFACE:
                     Address = &ConsoleReport;
@@ -1342,6 +1336,14 @@ uint16_t get_usb_descriptor(const uint16_t wValue, const uint16_t wIndex, const
                     Size    = sizeof(DigitizerReport);
                     break;
 #endif
+
+#ifdef XAP_ENABLE
+                case XAP_INTERFACE:
+                    Address = &XapReport;
+                    Size    = sizeof(XapReport);
+
+                    break;
+#endif
             }
 
             break;

+ 21 - 21
tmk_core/protocol/usb_descriptor.h

@@ -78,14 +78,6 @@ typedef struct {
     USB_Descriptor_Endpoint_t  Raw_OUTEndpoint;
 #endif
 
-#ifdef XAP_ENABLE
-    // Mouse HID Interface
-    USB_Descriptor_Interface_t Xap_Interface;
-    USB_HID_Descriptor_HID_t   Xap_HID;
-    USB_Descriptor_Endpoint_t  Xap_INEndpoint;
-    USB_Descriptor_Endpoint_t  Xap_OUTEndpoint;
-#endif
-
 #if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP)
     // Mouse HID Interface
     USB_Descriptor_Interface_t Mouse_Interface;
@@ -153,6 +145,14 @@ typedef struct {
     USB_HID_Descriptor_HID_t   Digitizer_HID;
     USB_Descriptor_Endpoint_t  Digitizer_INEndpoint;
 #endif
+
+#ifdef XAP_ENABLE
+    // XAP HID Interface
+    USB_Descriptor_Interface_t Xap_Interface;
+    USB_HID_Descriptor_HID_t   Xap_HID;
+    USB_Descriptor_Endpoint_t  Xap_INEndpoint;
+    USB_Descriptor_Endpoint_t  Xap_OUTEndpoint;
+#endif
 } USB_Descriptor_Configuration_t;
 
 /*
@@ -173,10 +173,6 @@ enum usb_interfaces {
     RAW_INTERFACE,
 #endif
 
-#ifdef XAP_ENABLE
-    XAP_INTERFACE,
-#endif
-
 #if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP)
     MOUSE_INTERFACE,
 #endif
@@ -206,6 +202,10 @@ enum usb_interfaces {
 #if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP)
     DIGITIZER_INTERFACE,
 #endif
+
+#ifdef XAP_ENABLE
+    XAP_INTERFACE,
+#endif
     TOTAL_INTERFACES
 };
 
@@ -238,15 +238,6 @@ enum usb_endpoints {
 #    endif
 #endif
 
-#ifdef XAP_ENABLE
-    XAP_IN_EPNUM = NEXT_EPNUM,
-#    if STM32_USB_USE_OTG1
-#        define XAP_OUT_EPNUM XAP_IN_EPNUM
-#    else
-    XAP_OUT_EPNUM         = NEXT_EPNUM,
-#    endif
-#endif
-
 #ifdef SHARED_EP_ENABLE
     SHARED_IN_EPNUM = NEXT_EPNUM,
 #endif
@@ -302,6 +293,15 @@ enum usb_endpoints {
 #        define DIGITIZER_IN_EPNUM SHARED_IN_EPNUM
 #    endif
 #endif
+
+#ifdef XAP_ENABLE
+    XAP_IN_EPNUM = NEXT_EPNUM,
+#    if STM32_USB_USE_OTG1
+#        define XAP_OUT_EPNUM XAP_IN_EPNUM
+#    else
+    XAP_OUT_EPNUM         = NEXT_EPNUM,
+#    endif
+#endif
 };
 
 #ifdef PROTOCOL_LUFA

+ 92 - 92
tmk_core/protocol/vusb/vusb.c

@@ -73,10 +73,6 @@ enum usb_interfaces {
     RAW_INTERFACE = NEXT_INTERFACE,
 #endif
 
-#ifdef XAP_ENABLE
-    XAP_INTERFACE = NEXT_INTERFACE,
-#endif
-
 #if defined(SHARED_EP_ENABLE) && !defined(KEYBOARD_SHARED_EP)
     SHARED_INTERFACE = NEXT_INTERFACE,
 #endif
@@ -85,6 +81,10 @@ enum usb_interfaces {
     CONSOLE_INTERFACE = NEXT_INTERFACE,
 #endif
 
+#ifdef XAP_ENABLE
+    XAP_INTERFACE = NEXT_INTERFACE,
+#endif
+
     TOTAL_INTERFACES = NEXT_INTERFACE
 };
 
@@ -789,29 +789,6 @@ const PROGMEM uchar raw_hid_report[] = {
 };
 #endif
 
-#ifdef XAP_ENABLE
-const PROGMEM uchar xap_report[] = {
-    0x06, 0x51, 0xFF, // Usage Page (Vendor Defined)
-    0x09, 0x58,       // 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, XAP_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, XAP_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)
@@ -835,6 +812,29 @@ const PROGMEM uchar console_hid_report[] = {
 };
 #endif
 
+#ifdef XAP_ENABLE
+const PROGMEM uchar xap_report[] = {
+    0x06, 0x51, 0xFF, // Usage Page (Vendor Defined)
+    0x09, 0x58,       // 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, XAP_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, XAP_BUFFER_SIZE, //   Report Count
+    0x75, 0x08,            //   Report Size (8)
+    0x91, 0x02,            //   Output (Data, Variable, Absolute)
+    0xC0                   // End Collection
+};
+#endif
+
 #ifndef USB_MAX_POWER_CONSUMPTION
 #    define USB_MAX_POWER_CONSUMPTION 500
 #endif
@@ -1011,56 +1011,6 @@ const PROGMEM usbConfigurationDescriptor_t usbConfigurationDescriptor = {
     },
 #    endif
 
-#    if defined(XAP_ENABLE)
-    /*
-     * XAP
-     */
-    .xapInterface = {
-        .header = {
-            .bLength         = sizeof(usbInterfaceDescriptor_t),
-            .bDescriptorType = USBDESCR_INTERFACE
-        },
-        .bInterfaceNumber    = XAP_INTERFACE,
-        .bAlternateSetting   = 0x00,
-        .bNumEndpoints       = 2,
-        .bInterfaceClass     = 0x03,
-        .bInterfaceSubClass  = 0x00,
-        .bInterfaceProtocol  = 0x00,
-        .iInterface          = 0x00
-    },
-    .xapHID = {
-        .header = {
-            .bLength         = sizeof(usbHIDDescriptor_t),
-            .bDescriptorType = USBDESCR_HID
-        },
-        .bcdHID              = 0x0101,
-        .bCountryCode        = 0x00,
-        .bNumDescriptors     = 1,
-        .bDescriptorType     = USBDESCR_HID_REPORT,
-        .wDescriptorLength   = sizeof(xap_report)
-    },
-    .xapINEndpoint = {
-        .header = {
-            .bLength         = sizeof(usbEndpointDescriptor_t),
-            .bDescriptorType = USBDESCR_ENDPOINT
-        },
-        .bEndpointAddress    = (USBRQ_DIR_DEVICE_TO_HOST | USB_CFG_EP4_NUMBER),
-        .bmAttributes        = 0x03,
-        .wMaxPacketSize      = XAP_EPSIZE,
-        .bInterval           = USB_POLLING_INTERVAL_MS
-    },
-    .xapOUTEndpoint = {
-        .header = {
-            .bLength         = sizeof(usbEndpointDescriptor_t),
-            .bDescriptorType = USBDESCR_ENDPOINT
-        },
-        .bEndpointAddress    = (USBRQ_DIR_HOST_TO_DEVICE | USB_CFG_EP4_NUMBER),
-        .bmAttributes        = 0x03,
-        .wMaxPacketSize      = XAP_EPSIZE,
-        .bInterval           = USB_POLLING_INTERVAL_MS
-    },
-#    endif
-
 #    ifdef SHARED_EP_ENABLE
     /*
      * Shared
@@ -1157,7 +1107,57 @@ const PROGMEM usbConfigurationDescriptor_t usbConfigurationDescriptor = {
         .bmAttributes        = 0x03,
         .wMaxPacketSize      = CONSOLE_EPSIZE,
         .bInterval           = 0x01
-    }
+    },
+#    endif
+
+#    if defined(XAP_ENABLE)
+    /*
+     * XAP
+     */
+    .xapInterface = {
+        .header = {
+            .bLength         = sizeof(usbInterfaceDescriptor_t),
+            .bDescriptorType = USBDESCR_INTERFACE
+        },
+        .bInterfaceNumber    = XAP_INTERFACE,
+        .bAlternateSetting   = 0x00,
+        .bNumEndpoints       = 2,
+        .bInterfaceClass     = 0x03,
+        .bInterfaceSubClass  = 0x00,
+        .bInterfaceProtocol  = 0x00,
+        .iInterface          = 0x00
+    },
+    .xapHID = {
+        .header = {
+            .bLength         = sizeof(usbHIDDescriptor_t),
+            .bDescriptorType = USBDESCR_HID
+        },
+        .bcdHID              = 0x0101,
+        .bCountryCode        = 0x00,
+        .bNumDescriptors     = 1,
+        .bDescriptorType     = USBDESCR_HID_REPORT,
+        .wDescriptorLength   = sizeof(xap_report)
+    },
+    .xapINEndpoint = {
+        .header = {
+            .bLength         = sizeof(usbEndpointDescriptor_t),
+            .bDescriptorType = USBDESCR_ENDPOINT
+        },
+        .bEndpointAddress    = (USBRQ_DIR_DEVICE_TO_HOST | USB_CFG_EP4_NUMBER),
+        .bmAttributes        = 0x03,
+        .wMaxPacketSize      = XAP_EPSIZE,
+        .bInterval           = USB_POLLING_INTERVAL_MS
+    },
+    .xapOUTEndpoint = {
+        .header = {
+            .bLength         = sizeof(usbEndpointDescriptor_t),
+            .bDescriptorType = USBDESCR_ENDPOINT
+        },
+        .bEndpointAddress    = (USBRQ_DIR_HOST_TO_DEVICE | USB_CFG_EP4_NUMBER),
+        .bmAttributes        = 0x03,
+        .wMaxPacketSize      = XAP_EPSIZE,
+        .bInterval           = USB_POLLING_INTERVAL_MS
+    },
 #    endif
 };
 
@@ -1216,13 +1216,6 @@ USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq) {
                     break;
 #endif
 
-#if defined(XAP_ENABLE)
-                case XAP_INTERFACE:
-                    usbMsgPtr = (usbMsgPtr_t)&usbConfigurationDescriptor.xapHID;
-                    len       = sizeof(usbHIDDescriptor_t);
-                    break;
-#endif
-
 #ifdef SHARED_EP_ENABLE
                 case SHARED_INTERFACE:
                     usbMsgPtr = (usbMsgPtr_t)&usbConfigurationDescriptor.sharedHID;
@@ -1236,6 +1229,13 @@ USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq) {
                     len       = sizeof(usbHIDDescriptor_t);
                     break;
 #endif
+
+#if defined(XAP_ENABLE)
+                case XAP_INTERFACE:
+                    usbMsgPtr = (usbMsgPtr_t)&usbConfigurationDescriptor.xapHID;
+                    len       = sizeof(usbHIDDescriptor_t);
+                    break;
+#endif
             }
             break;
         case USBDESCR_HID_REPORT:
@@ -1255,13 +1255,6 @@ USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq) {
                     break;
 #endif
 
-#if defined(XAP_ENABLE)
-                case XAP_INTERFACE:
-                    usbMsgPtr = (usbMsgPtr_t)xap_report;
-                    len       = sizeof(xap_report);
-                    break;
-#endif
-
 #ifdef SHARED_EP_ENABLE
                 case SHARED_INTERFACE:
                     usbMsgPtr = (usbMsgPtr_t)shared_hid_report;
@@ -1275,6 +1268,13 @@ USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq) {
                     len       = sizeof(console_hid_report);
                     break;
 #endif
+
+#if defined(XAP_ENABLE)
+                case XAP_INTERFACE:
+                    usbMsgPtr = (usbMsgPtr_t)xap_report;
+                    len       = sizeof(xap_report);
+                    break;
+#endif
             }
             break;
     }

+ 7 - 7
tmk_core/protocol/vusb/vusb.h

@@ -104,13 +104,6 @@ typedef struct usbConfigurationDescriptor {
     usbEndpointDescriptor_t  rawOUTEndpoint;
 #endif
 
-#if defined(XAP_ENABLE)
-    usbInterfaceDescriptor_t xapInterface;
-    usbHIDDescriptor_t       xapHID;
-    usbEndpointDescriptor_t  xapINEndpoint;
-    usbEndpointDescriptor_t  xapOUTEndpoint;
-#endif
-
 #if defined(SHARED_EP_ENABLE) && !defined(KEYBOARD_SHARED_EP)
     usbInterfaceDescriptor_t sharedInterface;
     usbHIDDescriptor_t       sharedHID;
@@ -123,6 +116,13 @@ typedef struct usbConfigurationDescriptor {
     usbEndpointDescriptor_t  consoleINEndpoint;
     usbEndpointDescriptor_t  consoleOUTEndpoint;
 #endif
+
+#if defined(XAP_ENABLE)
+    usbInterfaceDescriptor_t xapInterface;
+    usbHIDDescriptor_t       xapHID;
+    usbEndpointDescriptor_t  xapINEndpoint;
+    usbEndpointDescriptor_t  xapOUTEndpoint;
+#endif
 } __attribute__((packed)) usbConfigurationDescriptor_t;
 
 extern bool vusb_suspended;