]> git.donarmstrong.com Git - tmk_firmware.git/commitdiff
Interrupt driven Control ep and Console task
authortmk <nobody@nowhere>
Sun, 8 Jul 2012 14:57:25 +0000 (23:57 +0900)
committertmk <nobody@nowhere>
Sun, 8 Jul 2012 14:57:25 +0000 (23:57 +0900)
keyboard/hhkb/Makefile.lufa
protocol/lufa/descriptor.h
protocol/lufa/lufa.c

index cdd68f40abcfe02c2eb95e5a013dc8cbf24810b0..0dc295e621a3c2693e36ef8f33db47bb025a41e4 100644 (file)
@@ -93,6 +93,9 @@ ARCH = AVR8
 #     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
 F_USB = $(F_CPU)
 
+# Interrupt driven control endpoint task
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
 
 # Build Options
 #   comment out to disable the options.
index 001e072e6ab50f7c59e06e54ff398ba4027690c1..09fb24acc1ef5aa47ae721cc9136cfdd903cbbe4 100644 (file)
@@ -110,7 +110,7 @@ typedef struct
 
 #define KEYBOARD_EPSIZE             8
 #define MOUSE_EPSIZE                8
-#define CONSOLE_EPSIZE              8
+#define CONSOLE_EPSIZE              32
 #define EXTRA_EPSIZE                8
 
 
index 8fa719bc95a466f8d1530181cb325e23da30817a..10511ba67b27339177740065f280a403a38cceba 100644 (file)
@@ -69,7 +69,7 @@ static host_driver_t lufa_driver = {
 
 
 static void SetupHardware(void);
-static void Console_HID_Task(void);
+static void Console_Task(void);
 
 int main(void)
 {
@@ -90,8 +90,9 @@ int main(void)
     while (1) {
         keyboard_proc();
 
-        Console_HID_Task();
+#if !defined(INTERRUPT_CONTROL_ENDPOINT)
         USB_USBTask();
+#endif
     }
 }
 
@@ -105,42 +106,52 @@ void SetupHardware(void)
     clock_prescale_set(clock_div_1);
 
     USB_Init();
+
+    // for Console_Task
+    USB_Device_EnableSOFEvents();
 }
 
-static void Console_HID_Task(void)
+static void Console_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(CONSOLE_OUT_EPNUM);
-
-       /* Check to see if a packet has been sent from the host */
-       if (Endpoint_IsOUTReceived())
-       {
-               /* Check to see if the packet contains data */
-               if (Endpoint_IsReadWriteAllowed())
-               {
-                       /* Create a temporary buffer to hold the read in report from the host */
-                       uint8_t ConsoleData[CONSOLE_EPSIZE];
-
-                       /* Read Console Report Data */
-                       Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL);
-
-                       /* Process Console Report Data */
-                       //ProcessConsoleHIDReport(ConsoleData);
-               }
-
-               /* Finalize the stream transfer to send the last packet */
-               Endpoint_ClearOUT();
-       }
-
-        /* IN packet */
-       Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM);
-        // send IN packet
-       if (Endpoint_IsINReady())
-            Endpoint_ClearIN();
+    /* Device must be connected and configured for the task to run */
+    if (USB_DeviceState != DEVICE_STATE_Configured)
+      return;
+
+    uint8_t ep = Endpoint_GetCurrentEndpoint();
+
+#if 0
+    // TODO: impl receivechar()/recvchar()
+    Endpoint_SelectEndpoint(CONSOLE_OUT_EPNUM);
+
+    /* Check to see if a packet has been sent from the host */
+    if (Endpoint_IsOUTReceived())
+    {
+        /* Check to see if the packet contains data */
+        if (Endpoint_IsReadWriteAllowed())
+        {
+            /* Create a temporary buffer to hold the read in report from the host */
+            uint8_t ConsoleData[CONSOLE_EPSIZE];
+            /* Read Console Report Data */
+            Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL);
+            /* Process Console Report Data */
+            //ProcessConsoleHIDReport(ConsoleData);
+        }
+
+        /* Finalize the stream transfer to send the last packet */
+        Endpoint_ClearOUT();
+    }
+#endif
+
+    /* IN packet */
+    Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM);
+    // flash senchar packet
+    if (Endpoint_IsINReady()) {
+        Endpoint_ClearIN();
+    }
+
+    Endpoint_SelectEndpoint(ep);
 }
 
 
@@ -157,6 +168,16 @@ void EVENT_USB_Device_Disconnect(void)
 {
 }
 
+#define CONSOLE_TASK_INTERVAL 50
+void EVENT_USB_Device_StartOfFrame(void)
+{
+    static uint8_t interval;
+    if (++interval == CONSOLE_TASK_INTERVAL) {
+        Console_Task();
+        interval = 0;
+    }
+}
+
 /** Event handler for the USB_ConfigurationChanged event.
  * This is fired when the host sets the current configuration of the USB device after enumeration.
  */
@@ -182,7 +203,7 @@ void EVENT_USB_Device_ConfigurationChanged(void)
 
     /* Setup Console HID Report Endpoints */
     ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
-                                                CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE);
+                                                CONSOLE_EPSIZE, ENDPOINT_BANK_DOUBLE);
     ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
                                                 CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE);
 }
@@ -374,6 +395,7 @@ static void send_consumer(uint16_t data)
 /*******************************************************************************
  * sendchar
  ******************************************************************************/
+#define SEND_TIMEOUT 10
 int8_t sendchar(uint8_t c)
 {
     if (USB_DeviceState != DEVICE_STATE_Configured)
@@ -381,9 +403,9 @@ int8_t sendchar(uint8_t c)
 
     Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM);
 
-    uint8_t timeout = 10;
+    uint8_t timeout = SEND_TIMEOUT;
     uint16_t prevFN = USB_Device_GetFrameNumber();
-    while (!Endpoint_IsINReady()) {
+    while (!Endpoint_IsReadWriteAllowed()) {
         switch (USB_DeviceState) {
         case DEVICE_STATE_Unattached:
         case DEVICE_STATE_Suspended:
@@ -400,7 +422,7 @@ int8_t sendchar(uint8_t c)
 
     Endpoint_Write_8(c);
 
-    // send when packet is full
+    // send when bank is full
     if (!Endpoint_IsReadWriteAllowed())
         Endpoint_ClearIN();