]> git.friedersdorff.com Git - max/tmk_keyboard.git/blobdiff - keyboard/lufa/descriptor.c
Add consumer/system control feature to LUFA.
[max/tmk_keyboard.git] / keyboard / lufa / descriptor.c
index 6059fd4a8234a4f16929d6cbb4351a27956b44fd..e9925cca29f90c270424c80c9455fa4257cef97e 100644 (file)
@@ -37,6 +37,7 @@
 */
 
 #include "util.h"
+#include "report.h"
 #include "descriptor.h"
 
 
@@ -86,51 +87,95 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] =
     HID_RI_COLLECTION(8, 0x01), /* Application */
         HID_RI_USAGE(8, 0x01), /* Pointer */
         HID_RI_COLLECTION(8, 0x00), /* Physical */
+
             HID_RI_USAGE_PAGE(8, 0x09), /* Button */
-            HID_RI_USAGE_MINIMUM(8, 0x01),
-            HID_RI_USAGE_MAXIMUM(8, 0x03),
+            HID_RI_USAGE_MINIMUM(8, 0x01),  /* Button 1 */
+            HID_RI_USAGE_MAXIMUM(8, 0x05),  /* Button 5 */
             HID_RI_LOGICAL_MINIMUM(8, 0x00),
             HID_RI_LOGICAL_MAXIMUM(8, 0x01),
-            HID_RI_REPORT_COUNT(8, 0x03),
+            HID_RI_REPORT_COUNT(8, 0x05),
             HID_RI_REPORT_SIZE(8, 0x01),
             HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
             HID_RI_REPORT_COUNT(8, 0x01),
-            HID_RI_REPORT_SIZE(8, 0x05),
+            HID_RI_REPORT_SIZE(8, 0x03),
             HID_RI_INPUT(8, HID_IOF_CONSTANT),
+
             HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
             HID_RI_USAGE(8, 0x30), /* Usage X */
             HID_RI_USAGE(8, 0x31), /* Usage Y */
-            HID_RI_LOGICAL_MINIMUM(8, -1),
-            HID_RI_LOGICAL_MAXIMUM(8, 1),
-            HID_RI_PHYSICAL_MINIMUM(8, -1),
-            HID_RI_PHYSICAL_MAXIMUM(8, 1),
+            HID_RI_LOGICAL_MINIMUM(8, -127),
+            HID_RI_LOGICAL_MAXIMUM(8, 127),
             HID_RI_REPORT_COUNT(8, 0x02),
             HID_RI_REPORT_SIZE(8, 0x08),
             HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
+
+            HID_RI_USAGE(8, 0x38), /* Wheel */
+            HID_RI_LOGICAL_MINIMUM(8, -127),
+            HID_RI_LOGICAL_MAXIMUM(8, 127),
+            HID_RI_REPORT_COUNT(8, 0x01),
+            HID_RI_REPORT_SIZE(8, 0x08),
+            HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
+
+            HID_RI_USAGE_PAGE(8, 0x0C), /* Consumer */
+            HID_RI_USAGE(16, 0x0238), /* AC Pan (Horizontal wheel) */
+            HID_RI_LOGICAL_MINIMUM(8, -127),
+            HID_RI_LOGICAL_MAXIMUM(8, 127),
+            HID_RI_REPORT_COUNT(8, 0x01),
+            HID_RI_REPORT_SIZE(8, 0x08),
+            HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
+
         HID_RI_END_COLLECTION(0),
     HID_RI_END_COLLECTION(0),
 };
 
-const USB_Descriptor_HIDReport_Datatype_t PROGMEM GenericReport[] =
+const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] =
 {
     HID_RI_USAGE_PAGE(16, 0xFF00), /* Vendor Page 0 */
     HID_RI_USAGE(8, 0x01), /* Vendor Usage 1 */
-    HID_RI_COLLECTION(8, 0x01), /* Vendor Usage 1 */
+    HID_RI_COLLECTION(8, 0x01), /* Application */
         HID_RI_USAGE(8, 0x02), /* Vendor Usage 2 */
         HID_RI_LOGICAL_MINIMUM(8, 0x00),
         HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
         HID_RI_REPORT_SIZE(8, 0x08),
-        HID_RI_REPORT_COUNT(8, GENERIC_REPORT_SIZE),
+        HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE),
         HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
         HID_RI_USAGE(8, 0x03), /* Vendor Usage 3 */
         HID_RI_LOGICAL_MINIMUM(8, 0x00),
         HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
         HID_RI_REPORT_SIZE(8, 0x08),
-        HID_RI_REPORT_COUNT(8, GENERIC_REPORT_SIZE),
+        HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE),
         HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
     HID_RI_END_COLLECTION(0),
 };
 
+const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtraReport[] =
+{
+    HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
+    HID_RI_USAGE(8, 0x80), /* System Control */
+    HID_RI_COLLECTION(8, 0x01), /* Application */
+        HID_RI_REPORT_ID(8, REPORT_ID_SYSTEM),
+        HID_RI_LOGICAL_MINIMUM(16, 0x0081),
+        HID_RI_LOGICAL_MAXIMUM(16, 0x00B7),
+        HID_RI_USAGE_MINIMUM(16, 0x0081), /* System Power Down */
+        HID_RI_USAGE_MAXIMUM(16, 0x00B7), /* System Display LCD Autoscale */
+        HID_RI_REPORT_SIZE(8, 16),
+        HID_RI_REPORT_COUNT(8, 1),
+        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
+    HID_RI_END_COLLECTION(0),
+
+    HID_RI_USAGE_PAGE(8, 0x0C), /* Consumer */
+    HID_RI_USAGE(8, 0x01), /* Consumer Control */
+    HID_RI_COLLECTION(8, 0x01), /* Application */
+        HID_RI_REPORT_ID(8, REPORT_ID_CONSUMER),
+        HID_RI_LOGICAL_MINIMUM(16, 0x0010),
+        HID_RI_LOGICAL_MAXIMUM(16, 0x029C),
+        HID_RI_USAGE_MINIMUM(16, 0x0010), /* +10 */
+        HID_RI_USAGE_MAXIMUM(16, 0x029C), /* AC Distribute Vertically */
+        HID_RI_REPORT_SIZE(8, 16),
+        HID_RI_REPORT_COUNT(8, 1),
+        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
+    HID_RI_END_COLLECTION(0),
+};
 
 /*******************************************************************************
  * Device Descriptors
@@ -167,7 +212,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
             .Header                 = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration},
 
             .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t),
-            .TotalInterfaces        = 3,
+            .TotalInterfaces        = TOTAL_INTERFACES,
 
             .ConfigurationNumber    = 1,
             .ConfigurationStrIndex  = NO_DESCRIPTOR,
@@ -177,10 +222,10 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
             .MaxPowerConsumption    = USB_CONFIG_POWER_MA(100)
         },
 
-        /*
-         * Keyboard
-         */
-    .HID0_KeyboardInterface =
+    /*
+     * Keyboard
+     */
+    .Keyboard_Interface =
         {
             .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
 
@@ -196,7 +241,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
             .InterfaceStrIndex      = NO_DESCRIPTOR
         },
 
-    .HID0_KeyboardHID =
+    .Keyboard_HID =
         {
             .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
 
@@ -207,20 +252,20 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
             .HIDReportLength        = sizeof(KeyboardReport)
         },
 
-    .HID0_ReportINEndpoint =
+    .Keyboard_INEndpoint =
         {
             .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
 
             .EndpointAddress        = (ENDPOINT_DIR_IN | KEYBOARD_IN_EPNUM),
             .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
-            .EndpointSize           = HID_EPSIZE,
+            .EndpointSize           = KEYBOARD_EPSIZE,
             .PollingIntervalMS      = 0x01
         },
 
     /*
      * Mouse
      */
-    .HID1_MouseInterface =
+    .Mouse_Interface =
         {
             .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
 
@@ -236,7 +281,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
             .InterfaceStrIndex      = NO_DESCRIPTOR
         },
 
-    .HID1_MouseHID =
+    .Mouse_HID =
         {
             .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
 
@@ -247,24 +292,24 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
             .HIDReportLength        = sizeof(MouseReport)
         },
 
-    .HID1_ReportINEndpoint =
+    .Mouse_INEndpoint =
         {
             .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
 
             .EndpointAddress        = (ENDPOINT_DIR_IN | MOUSE_IN_EPNUM),
             .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
-            .EndpointSize           = HID_EPSIZE,
+            .EndpointSize           = MOUSE_EPSIZE,
             .PollingIntervalMS      = 0x01
         },
 
     /*
-     * Generic
+     * Console
      */
-    .HID2_GenericInterface =
+    .Console_Interface =
         {
             .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
 
-            .InterfaceNumber        = GENERIC_INTERFACE,
+            .InterfaceNumber        = CONSOLE_INTERFACE,
             .AlternateSetting       = 0x00,
 
             .TotalEndpoints         = 2,
@@ -276,7 +321,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
             .InterfaceStrIndex      = NO_DESCRIPTOR
         },
 
-    .HID2_GenericHID =
+    .Console_HID =
         {
             .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
 
@@ -284,28 +329,68 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
             .CountryCode            = 0x00,
             .TotalReportDescriptors = 1,
             .HIDReportType          = HID_DTYPE_Report,
-            .HIDReportLength        = sizeof(GenericReport)
+            .HIDReportLength        = sizeof(ConsoleReport)
+        },
+
+    .Console_INEndpoint =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+            .EndpointAddress        = (ENDPOINT_DIR_IN | CONSOLE_IN_EPNUM),
+            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+            .EndpointSize           = CONSOLE_EPSIZE,
+            .PollingIntervalMS      = 0x01
         },
 
-    .HID2_ReportINEndpoint =
+    .Console_OUTEndpoint =
         {
             .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
 
-            .EndpointAddress        = (ENDPOINT_DIR_IN | GENERIC_IN_EPNUM),
+            .EndpointAddress        = (ENDPOINT_DIR_OUT | CONSOLE_OUT_EPNUM),
             .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
-            .EndpointSize           = GENERIC_EPSIZE,
+            .EndpointSize           = CONSOLE_EPSIZE,
             .PollingIntervalMS      = 0x01
         },
 
-    .HID2_ReportOUTEndpoint =
+    /*
+     * Extra
+     */
+    .Extra_Interface =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
+
+            .InterfaceNumber        = EXTRA_INTERFACE,
+            .AlternateSetting       = 0x00,
+
+            .TotalEndpoints         = 1,
+
+            .Class                  = HID_CSCP_HIDClass,
+            .SubClass               = HID_CSCP_NonBootSubclass,
+            .Protocol               = HID_CSCP_NonBootProtocol,
+
+            .InterfaceStrIndex      = NO_DESCRIPTOR
+        },
+
+    .Extra_HID =
+        {
+            .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
+
+            .HIDSpec                = VERSION_BCD(01.11),
+            .CountryCode            = 0x00,
+            .TotalReportDescriptors = 1,
+            .HIDReportType          = HID_DTYPE_Report,
+            .HIDReportLength        = sizeof(ExtraReport)
+        },
+
+    .Extra_INEndpoint =
         {
             .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
 
-            .EndpointAddress        = (ENDPOINT_DIR_OUT | GENERIC_OUT_EPNUM),
+            .EndpointAddress        = (ENDPOINT_DIR_IN | EXTRA_IN_EPNUM),
             .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
-            .EndpointSize           = GENERIC_EPSIZE,
+            .EndpointSize           = EXTRA_EPSIZE,
             .PollingIntervalMS      = 0x01
-        }
+        },
 };
 
 
@@ -380,15 +465,19 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
         case HID_DTYPE_HID:
             switch (wIndex) {
             case KEYBOARD_INTERFACE:
-                Address = &ConfigurationDescriptor.HID0_KeyboardHID;
+                Address = &ConfigurationDescriptor.Keyboard_HID;
                 Size    = sizeof(USB_HID_Descriptor_HID_t);
                 break;
             case MOUSE_INTERFACE:
-                Address = &ConfigurationDescriptor.HID1_MouseHID;
+                Address = &ConfigurationDescriptor.Mouse_HID;
                 Size    = sizeof(USB_HID_Descriptor_HID_t);
                 break;
-            case GENERIC_INTERFACE:
-                Address = &ConfigurationDescriptor.HID2_GenericHID;
+            case CONSOLE_INTERFACE:
+                Address = &ConfigurationDescriptor.Console_HID;
+                Size    = sizeof(USB_HID_Descriptor_HID_t);
+                break;
+            case EXTRA_INTERFACE:
+                Address = &ConfigurationDescriptor.Extra_HID;
                 Size    = sizeof(USB_HID_Descriptor_HID_t);
                 break;
             }
@@ -403,9 +492,13 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
                 Address = &MouseReport;
                 Size    = sizeof(MouseReport);
                 break;
-            case GENERIC_INTERFACE:
-                Address = &GenericReport;
-                Size    = sizeof(GenericReport);
+            case CONSOLE_INTERFACE:
+                Address = &ConsoleReport;
+                Size    = sizeof(ConsoleReport);
+                break;
+            case EXTRA_INTERFACE:
+                Address = &ExtraReport;
+                Size    = sizeof(ExtraReport);
                 break;
             }
             break;