]> git.friedersdorff.com Git - max/tmk_keyboard.git/blobdiff - keyboard/lufa/lufa.c
Add consumer/system control feature to LUFA.
[max/tmk_keyboard.git] / keyboard / lufa / lufa.c
index 569960e2a9aa91251b585dfe11659459928bd74e..09da96b2e572860d640e08a378c92d9a8fee1b26 100644 (file)
@@ -68,7 +68,7 @@ static host_driver_t lufa_driver = {
 
 
 static void SetupHardware(void);
-static void Generic_HID_Task(void);
+static void Console_HID_Task(void);
 
 int main(void)
 {
@@ -93,7 +93,7 @@ int main(void)
     while (1) {
         keyboard_proc();
 
-        Generic_HID_Task();
+        Console_HID_Task();
         USB_USBTask();
     }
 }
@@ -110,14 +110,14 @@ void SetupHardware(void)
     USB_Init();
 }
 
-static void Generic_HID_Task(void)
+static void Console_HID_Task(void)
 {
        /* Device must be connected and configured for the task to run */
        if (USB_DeviceState != DEVICE_STATE_Configured)
          return;
 
         // TODO: impl receivechar()/recvchar()
-       Endpoint_SelectEndpoint(GENERIC_OUT_EPNUM);
+       Endpoint_SelectEndpoint(CONSOLE_OUT_EPNUM);
 
        /* Check to see if a packet has been sent from the host */
        if (Endpoint_IsOUTReceived())
@@ -126,13 +126,13 @@ static void Generic_HID_Task(void)
                if (Endpoint_IsReadWriteAllowed())
                {
                        /* Create a temporary buffer to hold the read in report from the host */
-                       uint8_t GenericData[GENERIC_REPORT_SIZE];
+                       uint8_t ConsoleData[CONSOLE_EPSIZE];
 
-                       /* Read Generic Report Data */
-                       Endpoint_Read_Stream_LE(&GenericData, sizeof(GenericData), NULL);
+                       /* Read Console Report Data */
+                       Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL);
 
-                       /* Process Generic Report Data */
-                       //ProcessGenericHIDReport(GenericData);
+                       /* Process Console Report Data */
+                       //ProcessConsoleHIDReport(ConsoleData);
                }
 
                /* Finalize the stream transfer to send the last packet */
@@ -140,7 +140,7 @@ static void Generic_HID_Task(void)
        }
 
         /* IN packet */
-       Endpoint_SelectEndpoint(GENERIC_IN_EPNUM);
+       Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM);
         // send IN packet
        if (Endpoint_IsINReady())
             Endpoint_ClearIN();
@@ -169,19 +169,36 @@ void EVENT_USB_Device_ConfigurationChanged(void)
 
     /* Setup Keyboard HID Report Endpoints */
     ConfigSuccess &= Endpoint_ConfigureEndpoint(KEYBOARD_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
-                                                HID_EPSIZE, ENDPOINT_BANK_SINGLE);
+                                                KEYBOARD_EPSIZE, ENDPOINT_BANK_SINGLE);
 
     /* Setup Mouse HID Report Endpoint */
     ConfigSuccess &= Endpoint_ConfigureEndpoint(MOUSE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
-                                                HID_EPSIZE, ENDPOINT_BANK_SINGLE);
+                                                MOUSE_EPSIZE, ENDPOINT_BANK_SINGLE);
 
-    /* Setup Generic HID Report Endpoints */
-    ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
-                                                GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE);
-    ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
-                                                GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE);
+    /* Setup Console HID Report Endpoints */
+    ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
+                                                CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE);
+    ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
+                                                CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE);
+
+    /* Setup Extra HID Report Endpoint */
+    ConfigSuccess &= Endpoint_ConfigureEndpoint(EXTRA_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
+                                                EXTRA_EPSIZE, ENDPOINT_BANK_SINGLE);
 }
 
+/*
+Appendix G: HID Request Support Requirements
+
+The following table enumerates the requests that need to be supported by various types of HID class devices.
+
+Device type     GetReport   SetReport   GetIdle     SetIdle     GetProtocol SetProtocol
+------------------------------------------------------------------------------------------
+Boot Mouse      Required    Optional    Optional    Optional    Required    Required
+Non-Boot Mouse  Required    Optional    Optional    Optional    Optional    Optional
+Boot Keyboard   Required    Optional    Required    Required    Required    Required
+Non-Boot Keybrd Required    Optional    Required    Required    Optional    Optional
+Other Device    Required    Optional    Optional    Optional    Optional    Optional
+*/
 /** Event handler for the USB_ControlRequest event.
  *  This is fired before passing along unhandled control requests to the library for processing internally.
  */
@@ -210,7 +227,9 @@ void EVENT_USB_Device_ControlRequest(void)
                     ReportData = (uint8_t*)&mouse_report_sent;
                     ReportSize = sizeof(mouse_report_sent);
                     break;
-                case GENERIC_INTERFACE:
+                case CONSOLE_INTERFACE:
+                    break;
+                case EXTRA_INTERFACE:
                     break;
                 }
 
@@ -241,7 +260,9 @@ void EVENT_USB_Device_ControlRequest(void)
                     break;
                 case MOUSE_INTERFACE:
                     break;
-                case GENERIC_INTERFACE:
+                case CONSOLE_INTERFACE:
+                    break;
+                case EXTRA_INTERFACE:
                     break;
                 }
 
@@ -296,12 +317,35 @@ static void send_mouse(report_mouse_t *report)
     mouse_report_sent = *report;
 }
 
+typedef struct {
+    uint8_t  report_id;
+    uint16_t usage;
+} __attribute__ ((packed)) report_extra_t;
+
 static void send_system(uint16_t data)
 {
+    Endpoint_SelectEndpoint(EXTRA_IN_EPNUM);
+    if (Endpoint_IsReadWriteAllowed()) {
+        report_extra_t r = {
+            .report_id = REPORT_ID_SYSTEM,
+            .usage = data
+        };
+        Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);
+        Endpoint_ClearIN();
+    }
 }
 
 static void send_consumer(uint16_t data)
 {
+    Endpoint_SelectEndpoint(EXTRA_IN_EPNUM);
+    if (Endpoint_IsReadWriteAllowed()) {
+        report_extra_t r = {
+            .report_id = REPORT_ID_CONSUMER,
+            .usage = data
+        };
+        Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);
+        Endpoint_ClearIN();
+    }
 }
 
 
@@ -313,7 +357,7 @@ int8_t sendchar(uint8_t c)
     if (USB_DeviceState != DEVICE_STATE_Configured)
       return -1;
 
-    Endpoint_SelectEndpoint(GENERIC_IN_EPNUM);
+    Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM);
 
     uint8_t timeout = 10;
     uint16_t prevFN = USB_Device_GetFrameNumber();