Fixed Mouse and Keyboard device demos not acting in accordance with the HID specifica...
authorDean Camera <dean@fourwalledcubicle.com>
Tue, 12 May 2009 08:28:02 +0000 (08:28 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Tue, 12 May 2009 08:28:02 +0000 (08:28 +0000)
Removed support for endpoint/pipe non-control interrupts; these did not act in the way users expected, and had many subtle issues.

23 files changed:
Demos/Device/GenericHID/GenericHID.c
Demos/Device/GenericHID/GenericHID.txt
Demos/Device/Keyboard/Keyboard.c
Demos/Device/Keyboard/Keyboard.h
Demos/Device/Keyboard/Keyboard.txt
Demos/Device/MassStorage/MassStorage.c
Demos/Device/Mouse/Mouse.c
Demos/Device/Mouse/Mouse.h
Demos/Device/Mouse/Mouse.txt
Demos/Device/RNDISEthernet/RNDISConstants.h
Demos/Host/GenericHIDHost/GenericHIDHost.c
Demos/Host/GenericHIDHost/GenericHIDHost.txt
Demos/Host/KeyboardHost/KeyboardHost.c
Demos/Host/KeyboardHost/KeyboardHost.txt
Demos/Host/MouseHost/MouseHost.c
Demos/Host/MouseHost/MouseHost.txt
Demos/OTG/TestApp/TestEvents.c
LUFA.pnproj
LUFA/ChangeLog.txt
LUFA/Drivers/USB/LowLevel/Endpoint.h
LUFA/Drivers/USB/LowLevel/HostChapter9.c
LUFA/Drivers/USB/LowLevel/Pipe.h
LUFA/MigrationInformation.txt

index 695342d..d4e7cca 100644 (file)
@@ -43,9 +43,7 @@ TASK_LIST
        { .Task = USB_USBTask          , .TaskStatus = TASK_STOP },\r
        #endif\r
        \r
        { .Task = USB_USBTask          , .TaskStatus = TASK_STOP },\r
        #endif\r
        \r
-       #if !defined(INTERRUPT_DATA_ENDPOINT)\r
        { .Task = USB_HID_Report       , .TaskStatus = TASK_STOP },\r
        { .Task = USB_HID_Report       , .TaskStatus = TASK_STOP },\r
-       #endif\r
 };\r
 \r
 /** Static buffer to hold the last received report from the host, so that it can be echoed back in the next sent report */\r
 };\r
 \r
 /** Static buffer to hold the last received report from the host, so that it can be echoed back in the next sent report */\r
@@ -112,9 +110,7 @@ EVENT_HANDLER(USB_Connect)
 EVENT_HANDLER(USB_Disconnect)\r
 {\r
        /* Stop running HID reporting and USB management tasks */\r
 EVENT_HANDLER(USB_Disconnect)\r
 {\r
        /* Stop running HID reporting and USB management tasks */\r
-       #if !defined(INTERRUPT_DATA_ENDPOINT)\r
        Scheduler_SetTaskMode(USB_HID_Report, TASK_STOP);\r
        Scheduler_SetTaskMode(USB_HID_Report, TASK_STOP);\r
-       #endif\r
 \r
        #if !defined(INTERRUPT_CONTROL_ENDPOINT)\r
        Scheduler_SetTaskMode(USB_USBTask, TASK_STOP);\r
 \r
        #if !defined(INTERRUPT_CONTROL_ENDPOINT)\r
        Scheduler_SetTaskMode(USB_USBTask, TASK_STOP);\r
@@ -134,21 +130,11 @@ EVENT_HANDLER(USB_ConfigurationChanged)
                                       ENDPOINT_DIR_IN, GENERIC_EPSIZE,\r
                                   ENDPOINT_BANK_SINGLE);\r
 \r
                                       ENDPOINT_DIR_IN, GENERIC_EPSIZE,\r
                                   ENDPOINT_BANK_SINGLE);\r
 \r
-       #if defined(INTERRUPT_DATA_ENDPOINT)\r
-       /* Enable the endpoint IN interrupt ISR for the report endpoint */\r
-       USB_INT_Enable(ENDPOINT_INT_IN);\r
-       #endif\r
-\r
        /* Setup Generic OUT Report Endpoint */\r
        Endpoint_ConfigureEndpoint(GENERIC_OUT_EPNUM, EP_TYPE_INTERRUPT,\r
                                       ENDPOINT_DIR_OUT, GENERIC_EPSIZE,\r
                                   ENDPOINT_BANK_SINGLE);\r
 \r
        /* Setup Generic OUT Report Endpoint */\r
        Endpoint_ConfigureEndpoint(GENERIC_OUT_EPNUM, EP_TYPE_INTERRUPT,\r
                                       ENDPOINT_DIR_OUT, GENERIC_EPSIZE,\r
                                   ENDPOINT_BANK_SINGLE);\r
 \r
-       #if defined(INTERRUPT_DATA_ENDPOINT)\r
-       /* Enable the endpoint OUT interrupt ISR for the report endpoint */\r
-       USB_INT_Enable(ENDPOINT_INT_OUT);\r
-       #endif\r
-\r
        /* Indicate USB connected and ready */\r
        UpdateStatus(Status_USBReady);\r
 }\r
        /* Indicate USB connected and ready */\r
        UpdateStatus(Status_USBReady);\r
 }\r
@@ -266,7 +252,6 @@ void CreateGenericHIDReport(uint8_t* DataArray)
          DataArray[i] = LastReceived[i];\r
 }\r
 \r
          DataArray[i] = LastReceived[i];\r
 }\r
 \r
-#if !defined(INTERRUPT_DATA_ENDPOINT)\r
 TASK(USB_HID_Report)\r
 {\r
        /* Check if the USB system is connected to a host */\r
 TASK(USB_HID_Report)\r
 {\r
        /* Check if the USB system is connected to a host */\r
@@ -313,8 +298,8 @@ TASK(USB_HID_Report)
                }\r
        }\r
 }\r
                }\r
        }\r
 }\r
-#endif\r
 \r
 \r
+#if defined(INTERRUPT_CONTROL_ENDPOINT)\r
 /** ISR for the general Pipe/Endpoint interrupt vector. This ISR fires when an endpoint's status changes (such as\r
  *  a packet has been received) on an endpoint with its corresponding ISR enabling bits set. This is used to send\r
  *  HID packets to the host each time the HID interrupt endpoints polling period elapses, as managed by the USB\r
 /** ISR for the general Pipe/Endpoint interrupt vector. This ISR fires when an endpoint's status changes (such as\r
  *  a packet has been received) on an endpoint with its corresponding ISR enabling bits set. This is used to send\r
  *  HID packets to the host each time the HID interrupt endpoints polling period elapses, as managed by the USB\r
@@ -325,7 +310,6 @@ ISR(ENDPOINT_PIPE_vect, ISR_BLOCK)
        /* Save previously selected endpoint before selecting a new endpoint */\r
        uint8_t PrevSelectedEndpoint = Endpoint_GetCurrentEndpoint();\r
 \r
        /* Save previously selected endpoint before selecting a new endpoint */\r
        uint8_t PrevSelectedEndpoint = Endpoint_GetCurrentEndpoint();\r
 \r
-       #if defined(INTERRUPT_CONTROL_ENDPOINT)\r
        /* Check if the control endpoint has received a request */\r
        if (Endpoint_HasEndpointInterrupted(ENDPOINT_CONTROLEP))\r
        {\r
        /* Check if the control endpoint has received a request */\r
        if (Endpoint_HasEndpointInterrupted(ENDPOINT_CONTROLEP))\r
        {\r
@@ -338,60 +322,8 @@ ISR(ENDPOINT_PIPE_vect, ISR_BLOCK)
                /* Handshake the endpoint setup interrupt - must be after the call to USB_USBTask() */\r
                USB_INT_Clear(ENDPOINT_INT_SETUP);\r
        }\r
                /* Handshake the endpoint setup interrupt - must be after the call to USB_USBTask() */\r
                USB_INT_Clear(ENDPOINT_INT_SETUP);\r
        }\r
-       #endif\r
-\r
-       #if defined(INTERRUPT_DATA_ENDPOINT)\r
-       /* Check if Generic IN endpoint has interrupted */\r
-       if (Endpoint_HasEndpointInterrupted(GENERIC_IN_EPNUM))\r
-       {\r
-               /* Select the Generic IN Report Endpoint */\r
-               Endpoint_SelectEndpoint(GENERIC_IN_EPNUM);\r
-\r
-               /* Clear the endpoint IN interrupt flag */\r
-               USB_INT_Clear(ENDPOINT_INT_IN);\r
-\r
-               /* Clear the Generic IN Report endpoint interrupt and select the endpoint */\r
-               Endpoint_ClearEndpointInterrupt(GENERIC_IN_EPNUM);\r
-\r
-               /* Create a temporary buffer to hold the report to send to the host */\r
-               uint8_t GenericData[GENERIC_REPORT_SIZE];\r
-               \r
-               /* Create Generic Report Data */\r
-               CreateGenericHIDReport(GenericData);\r
-\r
-               /* Write Generic Report Data */\r
-               Endpoint_Write_Stream_LE(&GenericData, sizeof(GenericData));\r
-\r
-               /* Finalize the stream transfer to send the last packet */\r
-               Endpoint_ClearIN();\r
-       }\r
-\r
-       /* Check if Generic OUT endpoint has interrupted */\r
-       if (Endpoint_HasEndpointInterrupted(GENERIC_OUT_EPNUM))\r
-       {\r
-               /* Select the Generic OUT Report Endpoint */\r
-               Endpoint_SelectEndpoint(GENERIC_OUT_EPNUM);\r
-\r
-               /* Clear the endpoint OUT Interrupt flag */\r
-               USB_INT_Clear(ENDPOINT_INT_OUT);\r
-\r
-               /* Clear the Generic OUT Report endpoint interrupt and select the endpoint */\r
-               Endpoint_ClearEndpointInterrupt(GENERIC_OUT_EPNUM);\r
-\r
-               /* Create a temporary buffer to hold the read in report from the host */\r
-               uint8_t GenericData[GENERIC_REPORT_SIZE];\r
-               \r
-               /* Read Generic Report Data */\r
-               Endpoint_Read_Stream_LE(&GenericData, sizeof(GenericData));\r
-               \r
-               /* Process Generic Report Data */\r
-               ProcessGenericHIDReport(GenericData);\r
-\r
-               /* Finalize the stream transfer to send the last packet */\r
-               Endpoint_ClearOUT();\r
-       }\r
-       #endif\r
 \r
        /* Restore previously selected endpoint */\r
        Endpoint_SelectEndpoint(PrevSelectedEndpoint);\r
 }\r
 \r
        /* Restore previously selected endpoint */\r
        Endpoint_SelectEndpoint(PrevSelectedEndpoint);\r
 }\r
+#endif\r
index 2e092cf..c78f637 100644 (file)
  *        which services control requests from the host. If not defined, the control endpoint\r
  *        is serviced via polling using the task scheduler.</td>\r
  *   </tr>\r
  *        which services control requests from the host. If not defined, the control endpoint\r
  *        is serviced via polling using the task scheduler.</td>\r
  *   </tr>\r
- *   <tr>\r
- *    <td>INTERRUPT_DATA_ENDPOINT</td>\r
- *    <td>Makefile CDEFS</td>\r
- *    <td>When defined, this causes the demo to enable interrupts for the data endpoints,\r
- *        which services incoming LED reports and outgoing key status reports to and from the host.\r
- *        If not defined, the data endpoints are serviced via polling using the task scheduler.</td>\r
- *   </tr>\r
  *  </table>\r
  */\r
  *  </table>\r
  */\r
index 33545bf..7b93172 100644 (file)
@@ -56,9 +56,9 @@ TASK_LIST
 bool UsingReportProtocol = true;\r
 \r
 /** Current Idle period. This is set by the host via a Set Idle HID class request to silence the device's reports\r
 bool UsingReportProtocol = true;\r
 \r
 /** Current Idle period. This is set by the host via a Set Idle HID class request to silence the device's reports\r
- *  for either the entire idle duration, or until the report status changes (e.g. the user moves the mouse).\r
+ *  for either the entire idle duration, or until the report status changes (e.g. the user presses a key).\r
  */\r
  */\r
-uint8_t IdleCount = 0;\r
+uint16_t IdleCount = 500;\r
 \r
 /** Current Idle period remaining. When the IdleCount value is set, this tracks the remaining number of idle\r
  *  milliseconds. This is separate to the IdleCount timer and is incremented and compared as the host may request \r
 \r
 /** Current Idle period remaining. When the IdleCount value is set, this tracks the remaining number of idle\r
  *  milliseconds. This is separate to the IdleCount timer and is incremented and compared as the host may request \r
@@ -140,9 +140,7 @@ EVENT_HANDLER(USB_Reset)
 EVENT_HANDLER(USB_Disconnect)\r
 {\r
        /* Stop running keyboard reporting and USB management tasks */\r
 EVENT_HANDLER(USB_Disconnect)\r
 {\r
        /* Stop running keyboard reporting and USB management tasks */\r
-       #if !defined(INTERRUPT_DATA_ENDPOINT)\r
        Scheduler_SetTaskMode(USB_Keyboard_Report, TASK_STOP);\r
        Scheduler_SetTaskMode(USB_Keyboard_Report, TASK_STOP);\r
-       #endif\r
 \r
        #if !defined(INTERRUPT_CONTROL_ENDPOINT)\r
        Scheduler_SetTaskMode(USB_USBTask, TASK_STOP);\r
 \r
        #if !defined(INTERRUPT_CONTROL_ENDPOINT)\r
        Scheduler_SetTaskMode(USB_USBTask, TASK_STOP);\r
@@ -162,28 +160,16 @@ EVENT_HANDLER(USB_ConfigurationChanged)
                                       ENDPOINT_DIR_IN, KEYBOARD_EPSIZE,\r
                                   ENDPOINT_BANK_SINGLE);\r
 \r
                                       ENDPOINT_DIR_IN, KEYBOARD_EPSIZE,\r
                                   ENDPOINT_BANK_SINGLE);\r
 \r
-       #if defined(INTERRUPT_DATA_ENDPOINT)\r
-       /* Enable the endpoint IN interrupt ISR for the report endpoint */\r
-       USB_INT_Enable(ENDPOINT_INT_IN);\r
-       #endif\r
-\r
        /* Setup Keyboard LED Report Endpoint */\r
        Endpoint_ConfigureEndpoint(KEYBOARD_LEDS_EPNUM, EP_TYPE_INTERRUPT,\r
                                       ENDPOINT_DIR_OUT, KEYBOARD_EPSIZE,\r
                                   ENDPOINT_BANK_SINGLE);\r
 \r
        /* Setup Keyboard LED Report Endpoint */\r
        Endpoint_ConfigureEndpoint(KEYBOARD_LEDS_EPNUM, EP_TYPE_INTERRUPT,\r
                                       ENDPOINT_DIR_OUT, KEYBOARD_EPSIZE,\r
                                   ENDPOINT_BANK_SINGLE);\r
 \r
-       #if defined(INTERRUPT_DATA_ENDPOINT)\r
-       /* Enable the endpoint OUT interrupt ISR for the LED report endpoint */\r
-       USB_INT_Enable(ENDPOINT_INT_OUT);\r
-       #endif\r
-\r
        /* Indicate USB connected and ready */\r
        UpdateStatus(Status_USBReady);\r
 \r
        /* Indicate USB connected and ready */\r
        UpdateStatus(Status_USBReady);\r
 \r
-       #if !defined(INTERRUPT_DATA_ENDPOINT)\r
        /* Start running keyboard reporting task */\r
        Scheduler_SetTaskMode(USB_Keyboard_Report, TASK_RUN);\r
        /* Start running keyboard reporting task */\r
        Scheduler_SetTaskMode(USB_Keyboard_Report, TASK_RUN);\r
-       #endif\r
 }\r
 \r
 /** Event handler for the USB_UnhandledControlPacket event. This is used to catch standard and class specific\r
 }\r
 \r
 /** Event handler for the USB_UnhandledControlPacket event. This is used to catch standard and class specific\r
@@ -358,7 +344,7 @@ void ProcessLEDReport(uint8_t LEDReport)
 }\r
 \r
 /** Sends the next HID report to the host, via the keyboard data endpoint. */\r
 }\r
 \r
 /** Sends the next HID report to the host, via the keyboard data endpoint. */\r
-static inline void SendNextReport(void)\r
+void SendNextReport(void)\r
 {\r
        static USB_KeyboardReport_Data_t PrevKeyboardReportData;\r
        USB_KeyboardReport_Data_t        KeyboardReportData;\r
 {\r
        static USB_KeyboardReport_Data_t PrevKeyboardReportData;\r
        USB_KeyboardReport_Data_t        KeyboardReportData;\r
@@ -367,41 +353,38 @@ static inline void SendNextReport(void)
        /* Create the next keyboard report for transmission to the host */\r
        CreateKeyboardReport(&KeyboardReportData);\r
        \r
        /* Create the next keyboard report for transmission to the host */\r
        CreateKeyboardReport(&KeyboardReportData);\r
        \r
-       /* Check if the idle period is set */\r
-       if (IdleCount)\r
-       {\r
-               /* Check if idle period has elapsed */\r
-               if (!(IdleMSRemaining))\r
-               {\r
-                       /* Reset the idle time remaining counter, must multiply by 4 to get the duration in milliseconds */\r
-                       IdleMSRemaining = (IdleCount << 2);\r
-               }\r
-               else\r
-               {\r
-                       /* Idle period not elapsed, indicate that a report must not be sent unless the report has changed */\r
-                       SendReport = (memcmp(&PrevKeyboardReportData, &KeyboardReportData, sizeof(USB_KeyboardReport_Data_t)) != 0);\r
-               }\r
-       }\r
+       /* Check to see if the report data has changed - if so a report MUST be sent */\r
+       SendReport = (memcmp(&PrevKeyboardReportData, &KeyboardReportData, sizeof(USB_KeyboardReport_Data_t)) != 0);\r
        \r
        /* Save the current report data for later comparison to check for changes */\r
        PrevKeyboardReportData = KeyboardReportData;\r
        \r
        /* Save the current report data for later comparison to check for changes */\r
        PrevKeyboardReportData = KeyboardReportData;\r
-\r
+       \r
+       /* Check if the idle period is set and has elapsed */\r
+       if ((IdleCount != HID_IDLE_CHANGESONLY) && (!(IdleMSRemaining)))\r
+       {\r
+               /* Reset the idle time remaining counter, must multiply by 4 to get the duration in milliseconds */\r
+               IdleMSRemaining = (IdleCount << 2);\r
+               \r
+               /* Idle period is set and has elapsed, must send a report to the host */\r
+               SendReport = true;\r
+       }\r
+       \r
        /* Select the Keyboard Report Endpoint */\r
        Endpoint_SelectEndpoint(KEYBOARD_EPNUM);\r
 \r
        /* Select the Keyboard Report Endpoint */\r
        Endpoint_SelectEndpoint(KEYBOARD_EPNUM);\r
 \r
-       /* Check if Keyboard Endpoint Ready for Read/Write, and if we should send a report */\r
+       /* Check if Keyboard Endpoint Ready for Read/Write and if we should send a new report */\r
        if (Endpoint_IsReadWriteAllowed() && SendReport)\r
        {\r
                /* Write Keyboard Report Data */\r
                Endpoint_Write_Stream_LE(&KeyboardReportData, sizeof(KeyboardReportData));\r
        if (Endpoint_IsReadWriteAllowed() && SendReport)\r
        {\r
                /* Write Keyboard Report Data */\r
                Endpoint_Write_Stream_LE(&KeyboardReportData, sizeof(KeyboardReportData));\r
-\r
+               \r
                /* Finalize the stream transfer to send the last packet */\r
                Endpoint_ClearIN();\r
        }\r
 }\r
 \r
 /** Reads the next LED status report from the host from the LED data endpoint, if one has been sent. */\r
                /* Finalize the stream transfer to send the last packet */\r
                Endpoint_ClearIN();\r
        }\r
 }\r
 \r
 /** Reads the next LED status report from the host from the LED data endpoint, if one has been sent. */\r
-static inline void ReceiveNextReport(void)\r
+void ReceiveNextReport(void)\r
 {\r
        /* Select the Keyboard LED Report Endpoint */\r
        Endpoint_SelectEndpoint(KEYBOARD_LEDS_EPNUM);\r
 {\r
        /* Select the Keyboard LED Report Endpoint */\r
        Endpoint_SelectEndpoint(KEYBOARD_LEDS_EPNUM);\r
@@ -451,7 +434,6 @@ void UpdateStatus(uint8_t CurrentStatus)
        LEDs_SetAllLEDs(LEDMask);\r
 }\r
 \r
        LEDs_SetAllLEDs(LEDMask);\r
 }\r
 \r
-#if !defined(INTERRUPT_DATA_ENDPOINT)\r
 /** Function to manage HID report generation and transmission to the host, when in report mode. */\r
 TASK(USB_Keyboard_Report)\r
 {\r
 /** Function to manage HID report generation and transmission to the host, when in report mode. */\r
 TASK(USB_Keyboard_Report)\r
 {\r
@@ -465,8 +447,8 @@ TASK(USB_Keyboard_Report)
                ReceiveNextReport();\r
        }\r
 }\r
                ReceiveNextReport();\r
        }\r
 }\r
-#endif\r
 \r
 \r
+#if defined(INTERRUPT_CONTROL_ENDPOINT)\r
 /** ISR for the general Pipe/Endpoint interrupt vector. This ISR fires when an endpoint's status changes (such as\r
  *  a packet has been received) on an endpoint with its corresponding ISR enabling bits set. This is used to send\r
  *  HID packets to the host each time the HID interrupt endpoints polling period elapses, as managed by the USB\r
 /** ISR for the general Pipe/Endpoint interrupt vector. This ISR fires when an endpoint's status changes (such as\r
  *  a packet has been received) on an endpoint with its corresponding ISR enabling bits set. This is used to send\r
  *  HID packets to the host each time the HID interrupt endpoints polling period elapses, as managed by the USB\r
@@ -475,52 +457,20 @@ TASK(USB_Keyboard_Report)
  */\r
 ISR(ENDPOINT_PIPE_vect, ISR_BLOCK)\r
 {\r
  */\r
 ISR(ENDPOINT_PIPE_vect, ISR_BLOCK)\r
 {\r
-       #if defined(INTERRUPT_CONTROL_ENDPOINT)\r
+       /* Save previously selected endpoint before selecting a new endpoint */\r
+       uint8_t PrevSelectedEndpoint = Endpoint_GetCurrentEndpoint();\r
+\r
        /* Check if the control endpoint has received a request */\r
        if (Endpoint_HasEndpointInterrupted(ENDPOINT_CONTROLEP))\r
        {\r
        /* Check if the control endpoint has received a request */\r
        if (Endpoint_HasEndpointInterrupted(ENDPOINT_CONTROLEP))\r
        {\r
-               /* Clear the endpoint interrupt */\r
-               Endpoint_ClearEndpointInterrupt(ENDPOINT_CONTROLEP);\r
-\r
                /* Process the control request */\r
                USB_USBTask();\r
 \r
                /* Handshake the endpoint setup interrupt - must be after the call to USB_USBTask() */\r
                USB_INT_Clear(ENDPOINT_INT_SETUP);\r
        }\r
                /* Process the control request */\r
                USB_USBTask();\r
 \r
                /* Handshake the endpoint setup interrupt - must be after the call to USB_USBTask() */\r
                USB_INT_Clear(ENDPOINT_INT_SETUP);\r
        }\r
-       #endif\r
-\r
-       #if defined(INTERRUPT_DATA_ENDPOINT)\r
-       /* Check if keyboard endpoint has interrupted */\r
-       if (Endpoint_HasEndpointInterrupted(KEYBOARD_EPNUM))\r
-       {\r
-               /* Select the Keyboard Report Endpoint */\r
-               Endpoint_SelectEndpoint(KEYBOARD_EPNUM);\r
-\r
-               /* Clear the endpoint IN interrupt flag */\r
-               USB_INT_Clear(ENDPOINT_INT_IN);\r
-\r
-               /* Clear the Keyboard Report endpoint interrupt */\r
-               Endpoint_ClearEndpointInterrupt(KEYBOARD_EPNUM);\r
-\r
-               /* Send the next keypress report to the host */\r
-               SendNextReport();\r
-       }\r
-\r
-       /* Check if Keyboard LED status Endpoint has interrupted */\r
-       if (Endpoint_HasEndpointInterrupted(KEYBOARD_LEDS_EPNUM))\r
-       {\r
-               /* Select the Keyboard LED Report Endpoint */\r
-               Endpoint_SelectEndpoint(KEYBOARD_LEDS_EPNUM);\r
-\r
-               /* Clear the endpoint OUT interrupt flag */\r
-               USB_INT_Clear(ENDPOINT_INT_OUT);\r
-\r
-               /* Clear the Keyboard LED Report endpoint interrupt */\r
-               Endpoint_ClearEndpointInterrupt(KEYBOARD_LEDS_EPNUM);\r
-\r
-               /* Process the LED report sent from the host */\r
-               ReceiveNextReport();\r
-       }\r
-       #endif\r
+       \r
+       /* Restore previously selected endpoint */\r
+       Endpoint_SelectEndpoint(PrevSelectedEndpoint);  \r
 }\r
 }\r
+#endif\r
index 76b7705..c737019 100644 (file)
@@ -54,6 +54,9 @@
                #include <LUFA/Drivers/Board/LEDs.h>         // LEDs driver\r
 \r
        /* Macros: */\r
                #include <LUFA/Drivers/Board/LEDs.h>         // LEDs driver\r
 \r
        /* Macros: */\r
+               /** Idle period indicating that reports should be sent only when the inputs have changed */\r
+               #define HID_IDLE_CHANGESONLY 0\r
+\r
                /** HID Class specific request to get the next HID report from the device. */\r
                #define REQ_GetReport      0x01\r
 \r
                /** HID Class specific request to get the next HID report from the device. */\r
                #define REQ_GetReport      0x01\r
 \r
        /* Function Prototypes: */\r
                void CreateKeyboardReport(USB_KeyboardReport_Data_t* ReportData);\r
                void ProcessLEDReport(uint8_t LEDReport);\r
        /* Function Prototypes: */\r
                void CreateKeyboardReport(USB_KeyboardReport_Data_t* ReportData);\r
                void ProcessLEDReport(uint8_t LEDReport);\r
-               static inline void SendNextReport(void);\r
-               static inline void ReceiveNextReport(void);\r
+               void SendNextReport(void);\r
+               void ReceiveNextReport(void);\r
                void UpdateStatus(uint8_t CurrentStatus);\r
                \r
 #endif\r
                void UpdateStatus(uint8_t CurrentStatus);\r
                \r
 #endif\r
index fd95e45..39df2a1 100644 (file)
  *        which services control requests from the host. If not defined, the control endpoint\r
  *        is serviced via polling using the task scheduler.</td>\r
  *   </tr>\r
  *        which services control requests from the host. If not defined, the control endpoint\r
  *        is serviced via polling using the task scheduler.</td>\r
  *   </tr>\r
- *   <tr>\r
- *    <td>INTERRUPT_DATA_ENDPOINT</td>\r
- *    <td>Makefile CDEFS</td>\r
- *    <td>When defined, this causes the demo to enable interrupts for the data endpoints,\r
- *        which services incoming LED reports and outgoing key status reports to and from the host.\r
- *        If not defined, the data endpoints are serviced via polling using the task scheduler.</td>\r
- *   </tr>\r
  *  </table>\r
  */\r
  *  </table>\r
  */\r
index e2c2424..b24018a 100644 (file)
@@ -387,9 +387,6 @@ ISR(ENDPOINT_PIPE_vect, ISR_BLOCK)
        /* Check if the control endpoint has received a request */\r
        if (Endpoint_HasEndpointInterrupted(ENDPOINT_CONTROLEP))\r
        {\r
        /* Check if the control endpoint has received a request */\r
        if (Endpoint_HasEndpointInterrupted(ENDPOINT_CONTROLEP))\r
        {\r
-               /* Clear the endpoint interrupt */\r
-               Endpoint_ClearEndpointInterrupt(ENDPOINT_CONTROLEP);\r
-\r
                /* Process the control request */\r
                USB_USBTask();\r
 \r
                /* Process the control request */\r
                USB_USBTask();\r
 \r
index 763d366..8998530 100644 (file)
@@ -43,9 +43,7 @@ TASK_LIST
        { .Task = USB_USBTask          , .TaskStatus = TASK_STOP },\r
        #endif\r
        \r
        { .Task = USB_USBTask          , .TaskStatus = TASK_STOP },\r
        #endif\r
        \r
-       #if !defined(INTERRUPT_DATA_ENDPOINT)\r
        { .Task = USB_Mouse_Report     , .TaskStatus = TASK_STOP },\r
        { .Task = USB_Mouse_Report     , .TaskStatus = TASK_STOP },\r
-       #endif\r
 };\r
 \r
 /* Global Variables */\r
 };\r
 \r
 /* Global Variables */\r
@@ -57,7 +55,7 @@ bool UsingReportProtocol = true;
 /** Current Idle period. This is set by the host via a Set Idle HID class request to silence the device's reports\r
  *  for either the entire idle duration, or until the report status changes (e.g. the user moves the mouse).\r
  */\r
 /** Current Idle period. This is set by the host via a Set Idle HID class request to silence the device's reports\r
  *  for either the entire idle duration, or until the report status changes (e.g. the user moves the mouse).\r
  */\r
-uint8_t IdleCount = 0;\r
+uint16_t IdleCount = HID_IDLE_CHANGESONLY;\r
 \r
 /** Current Idle period remaining. When the IdleCount value is set, this tracks the remaining number of idle\r
  *  milliseconds. This is separate to the IdleCount timer and is incremented and compared as the host may request \r
 \r
 /** Current Idle period remaining. When the IdleCount value is set, this tracks the remaining number of idle\r
  *  milliseconds. This is separate to the IdleCount timer and is incremented and compared as the host may request \r
@@ -140,9 +138,7 @@ EVENT_HANDLER(USB_Reset)
 EVENT_HANDLER(USB_Disconnect)\r
 {\r
        /* Stop running mouse reporting and USB management tasks */\r
 EVENT_HANDLER(USB_Disconnect)\r
 {\r
        /* Stop running mouse reporting and USB management tasks */\r
-       #if !defined(INTERRUPT_DATA_ENDPOINT)\r
        Scheduler_SetTaskMode(USB_Mouse_Report, TASK_STOP);\r
        Scheduler_SetTaskMode(USB_Mouse_Report, TASK_STOP);\r
-       #endif\r
 \r
        #if !defined(INTERRUPT_CONTROL_ENDPOINT)\r
        Scheduler_SetTaskMode(USB_USBTask, TASK_STOP);\r
 \r
        #if !defined(INTERRUPT_CONTROL_ENDPOINT)\r
        Scheduler_SetTaskMode(USB_USBTask, TASK_STOP);\r
@@ -162,18 +158,11 @@ EVENT_HANDLER(USB_ConfigurationChanged)
                                       ENDPOINT_DIR_IN, MOUSE_EPSIZE,\r
                                   ENDPOINT_BANK_SINGLE);\r
 \r
                                       ENDPOINT_DIR_IN, MOUSE_EPSIZE,\r
                                   ENDPOINT_BANK_SINGLE);\r
 \r
-       #if defined(INTERRUPT_DATA_ENDPOINT)\r
-       /* Enable the endpoint IN interrupt ISR for the report endpoint */\r
-       USB_INT_Enable(ENDPOINT_INT_IN);\r
-       #endif\r
-\r
        /* Indicate USB connected and ready */\r
        UpdateStatus(Status_USBReady);\r
 \r
        /* Indicate USB connected and ready */\r
        UpdateStatus(Status_USBReady);\r
 \r
-       #if !defined(INTERRUPT_DATA_ENDPOINT)\r
        /* Start running mouse reporting task */\r
        Scheduler_SetTaskMode(USB_Mouse_Report, TASK_RUN);\r
        /* Start running mouse reporting task */\r
        Scheduler_SetTaskMode(USB_Mouse_Report, TASK_RUN);\r
-       #endif\r
 }\r
 \r
 /** Event handler for the USB_UnhandledControlPacket event. This is used to catch standard and class specific\r
 }\r
 \r
 /** Event handler for the USB_UnhandledControlPacket event. This is used to catch standard and class specific\r
@@ -311,34 +300,36 @@ void CreateMouseReport(USB_MouseReport_Data_t* ReportData)
 }\r
 \r
 /** Sends the next HID report to the host, via the keyboard data endpoint. */\r
 }\r
 \r
 /** Sends the next HID report to the host, via the keyboard data endpoint. */\r
-static inline void SendNextReport(void)\r
+void SendNextReport(void)\r
 {\r
        static USB_MouseReport_Data_t PrevMouseReportData;\r
        USB_MouseReport_Data_t        MouseReportData;\r
 {\r
        static USB_MouseReport_Data_t PrevMouseReportData;\r
        USB_MouseReport_Data_t        MouseReportData;\r
-       bool                          SendReport = true;\r
+       bool                          SendReport;\r
        \r
        /* Create the next mouse report for transmission to the host */\r
        CreateMouseReport(&MouseReportData);\r
        \r
        \r
        /* Create the next mouse report for transmission to the host */\r
        CreateMouseReport(&MouseReportData);\r
        \r
-       /* Check if the idle period is set*/\r
-       if (IdleCount)\r
-       {\r
-               /* Determine if the idle period has elapsed */\r
-               if (!(IdleMSRemaining))\r
-               {\r
-                       /* Reset the idle time remaining counter, must multiply by 4 to get the duration in milliseconds */\r
-                       IdleMSRemaining = (IdleCount << 2);             \r
-               }\r
-               else\r
-               {\r
-                       /* Idle period not elapsed, indicate that a report must not be sent unless the report has changed */\r
-                       SendReport = (memcmp(&PrevMouseReportData, &MouseReportData, sizeof(USB_MouseReport_Data_t)) != 0);\r
-               }\r
-       }\r
-\r
+       /* Check to see if the report data has changed - if so a report MUST be sent */\r
+       SendReport = (memcmp(&PrevMouseReportData, &MouseReportData, sizeof(USB_MouseReport_Data_t)) != 0);\r
+       \r
+       /* Override the check if the Y or X values are non-zero - we want continuous movement while the joystick\r
+        * is being held down (via continuous reports), otherwise the cursor will only move once per joystick toggle */\r
+       if ((MouseReportData.Y != 0) || (MouseReportData.X != 0))\r
+         SendReport = true;\r
+       \r
        /* Save the current report data for later comparison to check for changes */\r
        PrevMouseReportData = MouseReportData;\r
        \r
        /* Save the current report data for later comparison to check for changes */\r
        PrevMouseReportData = MouseReportData;\r
        \r
+       /* Check if the idle period is set and has elapsed */\r
+       if ((IdleCount != HID_IDLE_CHANGESONLY) && (!(IdleMSRemaining)))\r
+       {\r
+               /* Reset the idle time remaining counter, must multiply by 4 to get the duration in milliseconds */\r
+               IdleMSRemaining = (IdleCount << 2);\r
+               \r
+               /* Idle period is set and has elapsed, must send a report to the host */\r
+               SendReport = true;\r
+       }\r
+       \r
        /* Select the Mouse Report Endpoint */\r
        Endpoint_SelectEndpoint(MOUSE_EPNUM);\r
 \r
        /* Select the Mouse Report Endpoint */\r
        Endpoint_SelectEndpoint(MOUSE_EPNUM);\r
 \r
@@ -380,7 +371,6 @@ void UpdateStatus(uint8_t CurrentStatus)
        LEDs_SetAllLEDs(LEDMask);\r
 }\r
 \r
        LEDs_SetAllLEDs(LEDMask);\r
 }\r
 \r
-#if !defined(INTERRUPT_DATA_ENDPOINT)\r
 /** Task to manage HID report generation and transmission to the host, when in report mode. */\r
 TASK(USB_Mouse_Report)\r
 {\r
 /** Task to manage HID report generation and transmission to the host, when in report mode. */\r
 TASK(USB_Mouse_Report)\r
 {\r
@@ -391,8 +381,8 @@ TASK(USB_Mouse_Report)
                SendNextReport();\r
        }\r
 }\r
                SendNextReport();\r
        }\r
 }\r
-#endif\r
 \r
 \r
+#if defined(INTERRUPT_CONTROL_ENDPOINT)\r
 /** ISR for the general Pipe/Endpoint interrupt vector. This ISR fires when an endpoint's status changes (such as\r
  *  a packet has been received) on an endpoint with its corresponding ISR enabling bits set. This is used to send\r
  *  HID packets to the host each time the HID interrupt endpoints polling period elapses, as managed by the USB\r
 /** ISR for the general Pipe/Endpoint interrupt vector. This ISR fires when an endpoint's status changes (such as\r
  *  a packet has been received) on an endpoint with its corresponding ISR enabling bits set. This is used to send\r
  *  HID packets to the host each time the HID interrupt endpoints polling period elapses, as managed by the USB\r
@@ -401,36 +391,20 @@ TASK(USB_Mouse_Report)
  */\r
 ISR(ENDPOINT_PIPE_vect, ISR_BLOCK)\r
 {\r
  */\r
 ISR(ENDPOINT_PIPE_vect, ISR_BLOCK)\r
 {\r
-       #if defined(INTERRUPT_CONTROL_ENDPOINT)\r
+       /* Save previously selected endpoint before selecting a new endpoint */\r
+       uint8_t PrevSelectedEndpoint = Endpoint_GetCurrentEndpoint();\r
+\r
        /* Check if the control endpoint has received a request */\r
        if (Endpoint_HasEndpointInterrupted(ENDPOINT_CONTROLEP))\r
        {\r
        /* Check if the control endpoint has received a request */\r
        if (Endpoint_HasEndpointInterrupted(ENDPOINT_CONTROLEP))\r
        {\r
-               /* Clear the endpoint interrupt */\r
-               Endpoint_ClearEndpointInterrupt(ENDPOINT_CONTROLEP);\r
-\r
                /* Process the control request */\r
                USB_USBTask();\r
 \r
                /* Handshake the endpoint setup interrupt - must be after the call to USB_USBTask() */\r
                USB_INT_Clear(ENDPOINT_INT_SETUP);\r
        }\r
                /* Process the control request */\r
                USB_USBTask();\r
 \r
                /* Handshake the endpoint setup interrupt - must be after the call to USB_USBTask() */\r
                USB_INT_Clear(ENDPOINT_INT_SETUP);\r
        }\r
-       #endif\r
-       \r
-       #if defined(INTERRUPT_DATA_ENDPOINT)\r
-       /* Check if mouse endpoint has interrupted */\r
-       if (Endpoint_HasEndpointInterrupted(MOUSE_EPNUM))\r
-       {\r
-               /* Select the Mouse Report Endpoint */\r
-               Endpoint_SelectEndpoint(MOUSE_EPNUM);\r
 \r
 \r
-               /* Clear the endpoint IN interrupt flag */\r
-               USB_INT_Clear(ENDPOINT_INT_IN);\r
-\r
-               /* Clear the Mouse Report endpoint interrupt and select the endpoint */\r
-               Endpoint_ClearEndpointInterrupt(MOUSE_EPNUM);\r
-\r
-               /* Send the next mouse report to the host */\r
-               SendNextReport();\r
-       }\r
-       #endif\r
+       /* Restore previously selected endpoint */\r
+       Endpoint_SelectEndpoint(PrevSelectedEndpoint);\r
 }\r
 }\r
+#endif\r
index 4eaf457..afa5a6a 100644 (file)
                TASK(USB_Mouse_Report);\r
 \r
        /* Macros: */\r
                TASK(USB_Mouse_Report);\r
 \r
        /* Macros: */\r
+               /** Idle period indicating that reports should be sent only when the inputs have changed */\r
+               #define HID_IDLE_CHANGESONLY 0\r
+       \r
                /** HID Class specific request to get the next HID report from the device. */\r
                /** HID Class specific request to get the next HID report from the device. */\r
-               #define REQ_GetReport      0x01\r
+               #define REQ_GetReport        0x01\r
 \r
                /** HID Class specific request to get the idle timeout period of the device. */\r
 \r
                /** HID Class specific request to get the idle timeout period of the device. */\r
-               #define REQ_GetIdle        0x02\r
+               #define REQ_GetIdle          0x02\r
 \r
                /** HID Class specific request to send the next HID report to the device. */\r
 \r
                /** HID Class specific request to send the next HID report to the device. */\r
-               #define REQ_SetReport      0x09\r
+               #define REQ_SetReport        0x09\r
 \r
                /** HID Class specific request to set the idle timeout period of the device. */\r
 \r
                /** HID Class specific request to set the idle timeout period of the device. */\r
-               #define REQ_SetIdle        0x0A\r
+               #define REQ_SetIdle          0x0A\r
 \r
                /** HID Class specific request to get the current HID protocol in use, either report or boot. */\r
 \r
                /** HID Class specific request to get the current HID protocol in use, either report or boot. */\r
-               #define REQ_GetProtocol    0x03\r
+               #define REQ_GetProtocol      0x03\r
 \r
                /** HID Class specific request to set the current HID protocol in use, either report or boot. */\r
 \r
                /** HID Class specific request to set the current HID protocol in use, either report or boot. */\r
-               #define REQ_SetProtocol    0x0B\r
+               #define REQ_SetProtocol      0x0B\r
 \r
        /* Type Defines: */\r
                /** Type define for the mouse HID report structure, for creating and sending HID reports to the host PC.\r
 \r
        /* Type Defines: */\r
                /** Type define for the mouse HID report structure, for creating and sending HID reports to the host PC.\r
index 2d566dd..a3bf024 100644 (file)
  *        which services control requests from the host. If not defined, the control endpoint\r
  *        is serviced via polling using the task scheduler.</td>\r
  *   </tr>\r
  *        which services control requests from the host. If not defined, the control endpoint\r
  *        is serviced via polling using the task scheduler.</td>\r
  *   </tr>\r
- *   <tr>\r
- *    <td>INTERRUPT_DATA_ENDPOINT</td>\r
- *    <td>Makefile CDEFS</td>\r
- *    <td>When defined, this causes the demo to enable interrupts for the data endpoint,\r
- *        which services outgoing mouse button and movement reports to the host. If not defined,\r
- *        the data endpoint is serviced via polling using the task scheduler.</td>\r
- *   </tr>\r
  *  </table>\r
  */\r
  *  </table>\r
  */\r
index 3296666..ad66f62 100644 (file)
@@ -96,4 +96,4 @@
                #define OID_802_3_XMIT_ONE_COLLISION          0x01020102UL\r
                #define OID_802_3_XMIT_MORE_COLLISIONS        0x01020103UL\r
 \r
                #define OID_802_3_XMIT_ONE_COLLISION          0x01020102UL\r
                #define OID_802_3_XMIT_MORE_COLLISIONS        0x01020103UL\r
 \r
-#endif
\ No newline at end of file
+#endif\r
index 9f419ad..5ac4257 100644 (file)
@@ -182,10 +182,8 @@ void ReadNextReport(void)
        /* Check to see if a packet has been received */\r
        if (!(Pipe_IsINReceived()))\r
        {\r
        /* Check to see if a packet has been received */\r
        if (!(Pipe_IsINReceived()))\r
        {\r
-               #if !defined(INTERRUPT_DATA_PIPE)\r
                /* Refreeze HID data IN pipe */\r
                Pipe_Freeze();\r
                /* Refreeze HID data IN pipe */\r
                Pipe_Freeze();\r
-               #endif\r
                        \r
                return;\r
        }\r
                        \r
                return;\r
        }\r
@@ -208,10 +206,8 @@ void ReadNextReport(void)
        /* Clear the IN endpoint, ready for next data packet */\r
        Pipe_ClearIN();\r
        \r
        /* Clear the IN endpoint, ready for next data packet */\r
        Pipe_ClearIN();\r
        \r
-       #if !defined(INTERRUPT_DATA_PIPE)\r
        /* Refreeze HID data IN pipe */\r
        Pipe_Freeze();\r
        /* Refreeze HID data IN pipe */\r
        Pipe_Freeze();\r
-       #endif\r
 }\r
 \r
 /** Writes a report to the attached device.\r
 }\r
 \r
 /** Writes a report to the attached device.\r
@@ -345,43 +341,9 @@ TASK(USB_HID_Host)
                                        \r
                        USB_HostState = HOST_STATE_Ready;\r
                        break;\r
                                        \r
                        USB_HostState = HOST_STATE_Ready;\r
                        break;\r
-               #if !defined(INTERRUPT_DATA_PIPE)\r
                case HOST_STATE_Ready:\r
                        ReadNextReport();\r
 \r
                        break;\r
                case HOST_STATE_Ready:\r
                        ReadNextReport();\r
 \r
                        break;\r
-               #endif\r
        }\r
 }\r
        }\r
 }\r
-\r
-#if defined(INTERRUPT_DATA_PIPE)\r
-/** Interrupt handler for the Endpoint/Pipe interrupt vector. This interrupt fires each time an enabled\r
- *  pipe interrupt occurs on a pipe which has had that interrupt enabled.\r
- */\r
-ISR(ENDPOINT_PIPE_vect, ISR_BLOCK)\r
-{\r
-       /* Save previously selected pipe before selecting a new pipe */\r
-       uint8_t PrevSelectedPipe = Pipe_GetCurrentPipe();\r
-\r
-       /* Check to see if the HID data IN pipe has caused the interrupt */\r
-       if (Pipe_HasPipeInterrupted(HID_DATA_IN_PIPE))\r
-       {\r
-               /* Clear the pipe interrupt, and select the data IN pipe */\r
-               Pipe_ClearPipeInterrupt(HID_DATA_IN_PIPE);\r
-               Pipe_SelectPipe(HID_DATA_IN_PIPE);      \r
-\r
-               /* Check to see if the pipe IN interrupt has fired */\r
-               if (USB_INT_HasOccurred(PIPE_INT_IN) && USB_INT_IsEnabled(PIPE_INT_IN))\r
-               {\r
-                       /* Clear interrupt flag */\r
-                       USB_INT_Clear(PIPE_INT_IN);             \r
-\r
-                       /* Read and process the next report from the device */\r
-                       ReadNextReport();\r
-               }\r
-       }\r
-\r
-       /* Restore previously selected pipe */\r
-       Pipe_SelectPipe(PrevSelectedPipe);\r
-}\r
-#endif\r
index 4117417..d72dda1 100644 (file)
  *\r
  *  <table>\r
  *   <tr>\r
  *\r
  *  <table>\r
  *   <tr>\r
- *    <td><b>Define Name:</b></td>\r
- *    <td><b>Location:</b></td>\r
- *    <td><b>Description:</b></td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td>INTERRUPT_DATA_ENDPOINT</td>\r
- *    <td>Makefile CDEFS</td>\r
- *    <td>When defined, this causes the demo to enable interrupts for the data IN pipe,\r
- *        which services reports from the device. If not defined, the data pipe is\r
- *        serviced via polling using the task scheduler.</td>\r
+ *    <td>\r
+ *     None\r
+ *    </td>\r
  *   </tr>\r
  *  </table>\r
  */\r
  *   </tr>\r
  *  </table>\r
  */\r
index f17f950..628a273 100644 (file)
@@ -180,18 +180,14 @@ void ReadNextReport(void)
        /* Select keyboard data pipe */\r
        Pipe_SelectPipe(KEYBOARD_DATAPIPE);     \r
 \r
        /* Select keyboard data pipe */\r
        Pipe_SelectPipe(KEYBOARD_DATAPIPE);     \r
 \r
-       #if !defined(INTERRUPT_DATA_PIPE)\r
        /* Unfreeze keyboard data pipe */\r
        Pipe_Unfreeze();\r
        /* Unfreeze keyboard data pipe */\r
        Pipe_Unfreeze();\r
-       #endif\r
 \r
        /* Check to see if a packet has been received */\r
        if (!(Pipe_IsINReceived()))\r
        {\r
 \r
        /* Check to see if a packet has been received */\r
        if (!(Pipe_IsINReceived()))\r
        {\r
-               #if !defined(INTERRUPT_DATA_PIPE)\r
                /* Refreeze HID data IN pipe */\r
                Pipe_Freeze();\r
                /* Refreeze HID data IN pipe */\r
                Pipe_Freeze();\r
-               #endif\r
                        \r
                return;\r
        }\r
                        \r
                return;\r
        }\r
@@ -231,15 +227,12 @@ void ReadNextReport(void)
                          putchar(PressedKey);\r
                }\r
        }\r
                          putchar(PressedKey);\r
                }\r
        }\r
-       \r
-                                               \r
+               \r
        /* Clear the IN endpoint, ready for next data packet */\r
        Pipe_ClearIN();\r
 \r
        /* Clear the IN endpoint, ready for next data packet */\r
        Pipe_ClearIN();\r
 \r
-       #if !defined(INTERRUPT_DATA_PIPE)\r
        /* Refreeze keyboard data pipe */\r
        Pipe_Freeze();\r
        /* Refreeze keyboard data pipe */\r
        Pipe_Freeze();\r
-       #endif\r
 }\r
 \r
 /** Task to set the configuration of the attached device after it has been enumerated, and to read and process\r
 }\r
 \r
 /** Task to set the configuration of the attached device after it has been enumerated, and to read and process\r
@@ -329,53 +322,14 @@ TASK(USB_Keyboard_Host)
                                break;\r
                        }\r
 \r
                                break;\r
                        }\r
 \r
-                       #if defined(INTERRUPT_DATA_PIPE)                        \r
-                       /* Select and unfreeze keyboard data pipe */\r
-                       Pipe_SelectPipe(KEYBOARD_DATAPIPE);     \r
-                       Pipe_Unfreeze();\r
-                       #endif\r
-\r
                        puts_P(PSTR("Keyboard Enumerated.\r\n"));\r
 \r
                        USB_HostState = HOST_STATE_Ready;\r
                        break;\r
                        puts_P(PSTR("Keyboard Enumerated.\r\n"));\r
 \r
                        USB_HostState = HOST_STATE_Ready;\r
                        break;\r
-               #if !defined(INTERRUPT_DATA_PIPE)\r
                case HOST_STATE_Ready:\r
                        /* If a report has been received, read and process it */\r
                        ReadNextReport();\r
 \r
                        break;\r
                case HOST_STATE_Ready:\r
                        /* If a report has been received, read and process it */\r
                        ReadNextReport();\r
 \r
                        break;\r
-               #endif\r
        }\r
 }\r
        }\r
 }\r
-\r
-#if defined(INTERRUPT_DATA_PIPE)\r
-/** Interrupt handler for the Endpoint/Pipe interrupt vector. This interrupt fires each time an enabled\r
- *  pipe interrupt occurs on a pipe which has had that interrupt enabled.\r
- */\r
-ISR(ENDPOINT_PIPE_vect, ISR_BLOCK)\r
-{\r
-       /* Save previously selected pipe before selecting a new pipe */\r
-       uint8_t PrevSelectedPipe = Pipe_GetCurrentPipe();\r
-\r
-       /* Check to see if the keyboard data pipe has caused the interrupt */\r
-       if (Pipe_HasPipeInterrupted(KEYBOARD_DATAPIPE))\r
-       {\r
-               /* Clear the pipe interrupt, and select the keyboard pipe */\r
-               Pipe_ClearPipeInterrupt(KEYBOARD_DATAPIPE);\r
-               Pipe_SelectPipe(KEYBOARD_DATAPIPE);     \r
-\r
-               /* Check to see if the pipe IN interrupt has fired */\r
-               if (USB_INT_HasOccurred(PIPE_INT_IN) && USB_INT_IsEnabled(PIPE_INT_IN))\r
-               {\r
-                       /* Clear interrupt flag */\r
-                       USB_INT_Clear(PIPE_INT_IN);             \r
-\r
-                       /* Read and process the next report from the device */\r
-                       ReadNextReport();\r
-       }\r
-       \r
-       /* Restore previously selected pipe */\r
-       Pipe_SelectPipe(PrevSelectedPipe);\r
-}\r
-#endif\r
index 455c2d2..a3d5f71 100644 (file)
  *\r
  *  <table>\r
  *   <tr>\r
  *\r
  *  <table>\r
  *   <tr>\r
- *    <td><b>Define Name:</b></td>\r
- *    <td><b>Location:</b></td>\r
- *    <td><b>Description:</b></td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td>INTERRUPT_DATA_ENDPOINT</td>\r
- *    <td>Makefile CDEFS</td>\r
- *    <td>When defined, this causes the demo to enable interrupts for the data pipe,\r
- *        which services reports from the device. If not defined, the data pipe is\r
- *        serviced via polling using the task scheduler.</td>\r
+ *    <td>\r
+ *     None\r
+ *    </td>\r
  *   </tr>\r
  *  </table>\r
  */\r
  *   </tr>\r
  *  </table>\r
  */\r
index 3c858a8..77db552 100644 (file)
@@ -181,18 +181,14 @@ void ReadNextReport(void)
        /* Select mouse data pipe */\r
        Pipe_SelectPipe(MOUSE_DATAPIPE);        \r
 \r
        /* Select mouse data pipe */\r
        Pipe_SelectPipe(MOUSE_DATAPIPE);        \r
 \r
-       #if !defined(INTERRUPT_DATA_PIPE)\r
        /* Unfreeze keyboard data pipe */\r
        Pipe_Unfreeze();\r
        /* Unfreeze keyboard data pipe */\r
        Pipe_Unfreeze();\r
-       #endif\r
 \r
        /* Check to see if a packet has been received */\r
        if (!(Pipe_IsINReceived()))\r
        {\r
 \r
        /* Check to see if a packet has been received */\r
        if (!(Pipe_IsINReceived()))\r
        {\r
-               #if !defined(INTERRUPT_DATA_PIPE)\r
                /* Refreeze HID data IN pipe */\r
                Pipe_Freeze();\r
                /* Refreeze HID data IN pipe */\r
                Pipe_Freeze();\r
-               #endif\r
                        \r
                return;\r
        }\r
                        \r
                return;\r
        }\r
@@ -230,10 +226,8 @@ void ReadNextReport(void)
        /* Clear the IN endpoint, ready for next data packet */\r
        Pipe_ClearIN();\r
 \r
        /* Clear the IN endpoint, ready for next data packet */\r
        Pipe_ClearIN();\r
 \r
-       #if !defined(INTERRUPT_DATA_PIPE)\r
        /* Refreeze mouse data pipe */\r
        Pipe_Freeze();\r
        /* Refreeze mouse data pipe */\r
        Pipe_Freeze();\r
-       #endif\r
 }\r
 \r
 /** Task to set the configuration of the attached device after it has been enumerated, and to read and process\r
 }\r
 \r
 /** Task to set the configuration of the attached device after it has been enumerated, and to read and process\r
@@ -324,54 +318,14 @@ TASK(USB_Mouse_Host)
                                break;\r
                        }\r
 \r
                                break;\r
                        }\r
 \r
-                       #if defined(INTERRUPT_DATA_PIPE)                        \r
-                       /* Select and unfreeze mouse data pipe */\r
-                       Pipe_SelectPipe(MOUSE_DATAPIPE);        \r
-                       Pipe_Unfreeze();\r
-                       #endif\r
-\r
                        puts_P(PSTR("Mouse Enumerated.\r\n"));\r
                        \r
                        USB_HostState = HOST_STATE_Ready;\r
                        break;\r
                        puts_P(PSTR("Mouse Enumerated.\r\n"));\r
                        \r
                        USB_HostState = HOST_STATE_Ready;\r
                        break;\r
-               #if !defined(INTERRUPT_DATA_PIPE)\r
                case HOST_STATE_Ready:\r
                        /* If a report has been received, read and process it */\r
                        ReadNextReport();\r
 \r
                        break;\r
                case HOST_STATE_Ready:\r
                        /* If a report has been received, read and process it */\r
                        ReadNextReport();\r
 \r
                        break;\r
-               #endif\r
-       }\r
-}\r
-\r
-#if defined(INTERRUPT_DATA_PIPE)\r
-/** Interrupt handler for the Endpoint/Pipe interrupt vector. This interrupt fires each time an enabled\r
- *  pipe interrupt occurs on a pipe which has had that interrupt enabled.\r
- */\r
-ISR(ENDPOINT_PIPE_vect, ISR_BLOCK)\r
-{\r
-       /* Save previously selected pipe before selecting a new pipe */\r
-       uint8_t PrevSelectedPipe = Pipe_GetCurrentPipe();\r
-\r
-       /* Check to see if the mouse data pipe has caused the interrupt */\r
-       if (Pipe_HasPipeInterrupted(MOUSE_DATAPIPE))\r
-       {\r
-               /* Clear the pipe interrupt, and select the mouse pipe */\r
-               Pipe_ClearPipeInterrupt(MOUSE_DATAPIPE);\r
-               Pipe_SelectPipe(MOUSE_DATAPIPE);        \r
-\r
-               /* Check to see if the pipe IN interrupt has fired */\r
-               if (USB_INT_HasOccurred(PIPE_INT_IN) && USB_INT_IsEnabled(PIPE_INT_IN))\r
-               {\r
-                       /* Clear interrupt flag */\r
-                       USB_INT_Clear(PIPE_INT_IN);             \r
-\r
-                       /* Read and process the next report from the device */\r
-                       ReadNextReport();\r
-               }\r
        }\r
        }\r
-\r
-       /* Restore previously selected pipe */\r
-       Pipe_SelectPipe(PrevSelectedPipe);\r
 }\r
 }\r
-#endif\r
index 118ca9d..3838a70 100644 (file)
  *\r
  *  <table>\r
  *   <tr>\r
  *\r
  *  <table>\r
  *   <tr>\r
- *    <td><b>Define Name:</b></td>\r
- *    <td><b>Location:</b></td>\r
- *    <td><b>Description:</b></td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td>INTERRUPT_DATA_ENDPOINT</td>\r
- *    <td>Makefile CDEFS</td>\r
- *    <td>When defined, this causes the demo to enable interrupts for the data pipe,\r
- *        which services reports from the device. If not defined, the data pipe is\r
- *        serviced via polling using the task scheduler.</td>\r
+ *    <td>\r
+ *     None\r
+ *    </td>\r
  *   </tr>\r
  *  </table>\r
  */\r
  *   </tr>\r
  *  </table>\r
  */\r
index 884e5b6..b542bfc 100644 (file)
@@ -175,6 +175,8 @@ EVENT_HANDLER(USB_DeviceEnumerationFailed)
 {\r
        puts_P(PSTR(ESC_BG_RED "Dev Enum Error\r\n"));\r
        printf_P(PSTR(" -- Error Code %d\r\n"), ErrorCode);\r
 {\r
        puts_P(PSTR(ESC_BG_RED "Dev Enum Error\r\n"));\r
        printf_P(PSTR(" -- Error Code %d\r\n"), ErrorCode);\r
+       printf_P(PSTR(" -- Sub Error Code %d\r\n"), SubErrorCode);\r
+       printf_P(PSTR(" -- In State %d\r\n"), USB_HostState);\r
 }\r
 \r
 /**\r
 }\r
 \r
 /**\r
index dae734b..4e78e5b 100644 (file)
@@ -1 +1 @@
-<Project name="LUFA"><Folder name="Demos"><Folder name="Device"><Folder name="AudioInput"><File path="Demos\Device\AudioInput\AudioInput.c"></File><File path="Demos\Device\AudioInput\AudioInput.h"></File><File path="Demos\Device\AudioInput\AudioInput.txt"></File><File path="Demos\Device\AudioInput\Descriptors.c"></File><File path="Demos\Device\AudioInput\Descriptors.h"></File><File path="Demos\Device\AudioInput\Doxygen.conf"></File><File path="Demos\Device\AudioInput\makefile"></File></Folder><Folder name="AudioOutput"><File path="Demos\Device\AudioOutput\AudioOutput.c"></File><File path="Demos\Device\AudioOutput\AudioOutput.h"></File><File path="Demos\Device\AudioOutput\AudioOutput.txt"></File><File path="Demos\Device\AudioOutput\Descriptors.c"></File><File path="Demos\Device\AudioOutput\Descriptors.h"></File><File path="Demos\Device\AudioOutput\Doxygen.conf"></File><File path="Demos\Device\AudioOutput\makefile"></File></Folder><Folder name="CDC"><File path="Demos\Device\CDC\CDC.c"></File><File path="Demos\Device\CDC\CDC.h"></File><File path="Demos\Device\CDC\CDC.txt"></File><File path="Demos\Device\CDC\Descriptors.c"></File><File path="Demos\Device\CDC\Descriptors.h"></File><File path="Demos\Device\CDC\Doxygen.conf"></File><File path="Demos\Device\CDC\LUFA CDC.inf"></File><File path="Demos\Device\CDC\makefile"></File></Folder><Folder name="DualCDC"><File path="Demos\Device\DualCDC\Descriptors.c"></File><File path="Demos\Device\DualCDC\Descriptors.h"></File><File path="Demos\Device\DualCDC\Doxygen.conf"></File><File path="Demos\Device\DualCDC\DualCDC.c"></File><File path="Demos\Device\DualCDC\DualCDC.h"></File><File path="Demos\Device\DualCDC\DualCDC.txt"></File><File path="Demos\Device\DualCDC\LUFA DualCDC.inf"></File><File path="Demos\Device\DualCDC\makefile"></File></Folder><Folder name="GenericHID"><File path="Demos\Device\GenericHID\Descriptors.c"></File><File path="Demos\Device\GenericHID\Descriptors.h"></File><File path="Demos\Device\GenericHID\GenericHID.c"></File><File path="Demos\Device\GenericHID\GenericHID.h"></File><File path="Demos\Device\GenericHID\makefile"></File><File path="Demos\Device\GenericHID\GenericHID.txt"></File><File path="Demos\Device\GenericHID\Doxygen.conf"></File></Folder><Folder name="Joystick"><File path="Demos\Device\Joystick\Descriptors.c"></File><File path="Demos\Device\Joystick\Descriptors.h"></File><File path="Demos\Device\Joystick\Doxygen.conf"></File><File path="Demos\Device\Joystick\Joystick.c"></File><File path="Demos\Device\Joystick\Joystick.h"></File><File path="Demos\Device\Joystick\Joystick.txt"></File><File path="Demos\Device\Joystick\makefile"></File></Folder><Folder name="Keyboard"><File path="Demos\Device\Keyboard\Descriptors.c"></File><File path="Demos\Device\Keyboard\Descriptors.h"></File><File path="Demos\Device\Keyboard\Doxygen.conf"></File><File path="Demos\Device\Keyboard\Keyboard.c"></File><File path="Demos\Device\Keyboard\Keyboard.h"></File><File path="Demos\Device\Keyboard\Keyboard.txt"></File><File path="Demos\Device\Keyboard\makefile"></File></Folder><Folder name="KeyboardMouse"><File path="Demos\Device\KeyboardMouse\Descriptors.c"></File><File path="Demos\Device\KeyboardMouse\Descriptors.h"></File><File path="Demos\Device\KeyboardMouse\Doxygen.conf"></File><File path="Demos\Device\KeyboardMouse\KeyboardMouse.c"></File><File path="Demos\Device\KeyboardMouse\KeyboardMouse.h"></File><File path="Demos\Device\KeyboardMouse\KeyboardMouse.txt"></File><File path="Demos\Device\KeyboardMouse\makefile"></File></Folder><Folder name="MassStorage"><File path="Demos\Device\MassStorage\DataflashManager.c"></File><File path="Demos\Device\MassStorage\DataflashManager.h"></File><File path="Demos\Device\MassStorage\Descriptors.c"></File><File path="Demos\Device\MassStorage\Descriptors.h"></File><File path="Demos\Device\MassStorage\Doxygen.conf"></File><File path="Demos\Device\MassStorage\makefile"></File><File path="Demos\Device\MassStorage\MassStorage.c"></File><File path="Demos\Device\MassStorage\MassStorage.h"></File><File path="Demos\Device\MassStorage\MassStorage.txt"></File><File path="Demos\Device\MassStorage\SCSI.c"></File><File path="Demos\Device\MassStorage\SCSI.h"></File><File path="Demos\Device\MassStorage\SCSI_Codes.h"></File></Folder><Folder name="MIDI"><File path="Demos\Device\MIDI\Descriptors.c"></File><File path="Demos\Device\MIDI\Descriptors.h"></File><File path="Demos\Device\MIDI\Doxygen.conf"></File><File path="Demos\Device\MIDI\makefile"></File><File path="Demos\Device\MIDI\MIDI.c"></File><File path="Demos\Device\MIDI\MIDI.h"></File><File path="Demos\Device\MIDI\MIDI.txt"></File></Folder><Folder name="Mouse"><File path="Demos\Device\Mouse\Descriptors.c"></File><File path="Demos\Device\Mouse\Descriptors.h"></File><File path="Demos\Device\Mouse\Doxygen.conf"></File><File path="Demos\Device\Mouse\makefile"></File><File path="Demos\Device\Mouse\Mouse.c"></File><File path="Demos\Device\Mouse\Mouse.h"></File><File path="Demos\Device\Mouse\Mouse.txt"></File></Folder><Folder name="RNDISEthernet"><File path="Demos\Device\RNDISEthernet\ARP.c"></File><File path="Demos\Device\RNDISEthernet\ARP.h"></File><File path="Demos\Device\RNDISEthernet\Descriptors.c"></File><File path="Demos\Device\RNDISEthernet\Descriptors.h"></File><File path="Demos\Device\RNDISEthernet\DHCP.c"></File><File path="Demos\Device\RNDISEthernet\DHCP.h"></File><File path="Demos\Device\RNDISEthernet\Doxygen.conf"></File><File path="Demos\Device\RNDISEthernet\Ethernet.c"></File><File path="Demos\Device\RNDISEthernet\Ethernet.h"></File><File path="Demos\Device\RNDISEthernet\EthernetProtocols.h"></File><File path="Demos\Device\RNDISEthernet\ICMP.c"></File><File path="Demos\Device\RNDISEthernet\ICMP.h"></File><File path="Demos\Device\RNDISEthernet\IP.c"></File><File path="Demos\Device\RNDISEthernet\IP.h"></File><File path="Demos\Device\RNDISEthernet\LUFA RNDIS.inf"></File><File path="Demos\Device\RNDISEthernet\makefile"></File><File path="Demos\Device\RNDISEthernet\ProtocolDecoders.c"></File><File path="Demos\Device\RNDISEthernet\ProtocolDecoders.h"></File><File path="Demos\Device\RNDISEthernet\RNDIS.c"></File><File path="Demos\Device\RNDISEthernet\RNDIS.h"></File><File path="Demos\Device\RNDISEthernet\RNDISConstants.h"></File><File path="Demos\Device\RNDISEthernet\RNDISEthernet.c"></File><File path="Demos\Device\RNDISEthernet\RNDISEthernet.h"></File><File path="Demos\Device\RNDISEthernet\RNDISEthernet.txt"></File><File path="Demos\Device\RNDISEthernet\TCP.c"></File><File path="Demos\Device\RNDISEthernet\TCP.h"></File><File path="Demos\Device\RNDISEthernet\UDP.c"></File><File path="Demos\Device\RNDISEthernet\UDP.h"></File><File path="Demos\Device\RNDISEthernet\Webserver.c"></File><File path="Demos\Device\RNDISEthernet\Webserver.h"></File></Folder><Folder name="USBtoSerial"><File path="Demos\Device\USBtoSerial\Descriptors.c"></File><File path="Demos\Device\USBtoSerial\Descriptors.h"></File><File path="Demos\Device\USBtoSerial\Doxygen.conf"></File><File path="Demos\Device\USBtoSerial\LUFA USBtoSerial.inf"></File><File path="Demos\Device\USBtoSerial\makefile"></File><File path="Demos\Device\USBtoSerial\RingBuff.c"></File><File path="Demos\Device\USBtoSerial\RingBuff.h"></File><File path="Demos\Device\USBtoSerial\USBtoSerial.c"></File><File path="Demos\Device\USBtoSerial\USBtoSerial.h"></File><File path="Demos\Device\USBtoSerial\USBtoSerial.txt"></File></Folder><File path="Demos\Device\makefile"></File></Folder><Folder name="Host"><Folder name="CDCHost"><File path="Demos\Host\CDCHost\CDCHost.c"></File><File path="Demos\Host\CDCHost\CDCHost.h"></File><File path="Demos\Host\CDCHost\CDCHost.txt"></File><File path="Demos\Host\CDCHost\ConfigDescriptor.c"></File><File path="Demos\Host\CDCHost\ConfigDescriptor.h"></File><File path="Demos\Host\CDCHost\Doxygen.conf"></File><File path="Demos\Host\CDCHost\makefile"></File></Folder><Folder name="GenericHIDHost"><File path="Demos\Host\GenericHIDHost\ConfigDescriptor.c"></File><File path="Demos\Host\GenericHIDHost\ConfigDescriptor.h"></File><File path="Demos\Host\GenericHIDHost\GenericHIDHost.c"></File><File path="Demos\Host\GenericHIDHost\GenericHIDHost.h"></File><File path="Demos\Host\GenericHIDHost\makefile"></File><File path="Demos\Host\GenericHIDHost\Doxygen.conf"></File></Folder><Folder name="KeyboardHost"><File path="Demos\Host\KeyboardHost\ConfigDescriptor.c"></File><File path="Demos\Host\KeyboardHost\ConfigDescriptor.h"></File><File path="Demos\Host\KeyboardHost\Doxygen.conf"></File><File path="Demos\Host\KeyboardHost\KeyboardHost.c"></File><File path="Demos\Host\KeyboardHost\KeyboardHost.h"></File><File path="Demos\Host\KeyboardHost\KeyboardHost.txt"></File><File path="Demos\Host\KeyboardHost\makefile"></File></Folder><Folder name="KeyboardHostWithParser"><File path="Demos\Host\KeyboardHostWithParser\ConfigDescriptor.c"></File><File path="Demos\Host\KeyboardHostWithParser\ConfigDescriptor.h"></File><File path="Demos\Host\KeyboardHostWithParser\Doxygen.conf"></File><File path="Demos\Host\KeyboardHostWithParser\HIDReport.c"></File><File path="Demos\Host\KeyboardHostWithParser\HIDReport.h"></File><File path="Demos\Host\KeyboardHostWithParser\KeyboardHostWithParser.c"></File><File path="Demos\Host\KeyboardHostWithParser\KeyboardHostWithParser.h"></File><File path="Demos\Host\KeyboardHostWithParser\KeyboardHostWithParser.txt"></File><File path="Demos\Host\KeyboardHostWithParser\makefile"></File></Folder><Folder name="MassStorageHost"><File path="Demos\Host\MassStorageHost\ConfigDescriptor.c"></File><File path="Demos\Host\MassStorageHost\ConfigDescriptor.h"></File><File path="Demos\Host\MassStorageHost\Doxygen.conf"></File><File path="Demos\Host\MassStorageHost\makefile"></File><File path="Demos\Host\MassStorageHost\MassStorageHost.c"></File><File path="Demos\Host\MassStorageHost\MassStorageHost.h"></File><File path="Demos\Host\MassStorageHost\MassStorageHost.txt"></File><File path="Demos\Host\MassStorageHost\MassStoreCommands.c"></File><File path="Demos\Host\MassStorageHost\MassStoreCommands.h"></File><File path="Demos\Host\MassStorageHost\SCSI_Codes.h"></File></Folder><Folder name="MouseHost"><File path="Demos\Host\MouseHost\ConfigDescriptor.c"></File><File path="Demos\Host\MouseHost\ConfigDescriptor.h"></File><File path="Demos\Host\MouseHost\Doxygen.conf"></File><File path="Demos\Host\MouseHost\makefile"></File><File path="Demos\Host\MouseHost\MouseHost.c"></File><File path="Demos\Host\MouseHost\MouseHost.h"></File><File path="Demos\Host\MouseHost\MouseHost.txt"></File></Folder><Folder name="MouseHostWithParser"><File path="Demos\Host\MouseHostWithParser\ConfigDescriptor.c"></File><File path="Demos\Host\MouseHostWithParser\ConfigDescriptor.h"></File><File path="Demos\Host\MouseHostWithParser\Doxygen.conf"></File><File path="Demos\Host\MouseHostWithParser\HIDReport.c"></File><File path="Demos\Host\MouseHostWithParser\HIDReport.h"></File><File path="Demos\Host\MouseHostWithParser\makefile"></File><File path="Demos\Host\MouseHostWithParser\MouseHostWithParser.c"></File><File path="Demos\Host\MouseHostWithParser\MouseHostWithParser.h"></File><File path="Demos\Host\MouseHostWithParser\MouseHostWithParser.txt"></File></Folder><Folder name="StillImageHost"><File path="Demos\Host\StillImageHost\ConfigDescriptor.c"></File><File path="Demos\Host\StillImageHost\ConfigDescriptor.h"></File><File path="Demos\Host\StillImageHost\Doxygen.conf"></File><File path="Demos\Host\StillImageHost\makefile"></File><File path="Demos\Host\StillImageHost\PIMACodes.h"></File><File path="Demos\Host\StillImageHost\StillImageCommands.c"></File><File path="Demos\Host\StillImageHost\StillImageCommands.h"></File><File path="Demos\Host\StillImageHost\StillImageHost.c"></File><File path="Demos\Host\StillImageHost\StillImageHost.h"></File><File path="Demos\Host\StillImageHost\StillImageHost.txt"></File></Folder><File path="Demos\Host\makefile"></File></Folder><Folder name="OTG"><Folder name="TestApp"><File path="Demos\OTG\TestApp\Descriptors.c"></File><File path="Demos\OTG\TestApp\Descriptors.h"></File><File path="Demos\OTG\TestApp\Doxygen.conf"></File><File path="Demos\OTG\TestApp\makefile"></File><File path="Demos\OTG\TestApp\TestApp.c"></File><File path="Demos\OTG\TestApp\TestApp.h"></File><File path="Demos\OTG\TestApp\TestApp.txt"></File><File path="Demos\OTG\TestApp\TestEvents.c"></File><File path="Demos\OTG\TestApp\TestEvents.h"></File></Folder><File path="Demos\OTG\makefile"></File></Folder><File path="Demos\makefile"></File></Folder><Folder name="LUFA"><Folder name="Common"><File path="LUFA\Common\Common.h"></File><File path="LUFA\Common\FunctionAttributes.h"></File><File path="LUFA\Common\BoardTypes.h"></File></Folder><Folder name="Drivers"><Folder name="USB"><Folder name="LowLevel"><File path="LUFA\Drivers\USB\LowLevel\HostChapter9.h"></File><File path="LUFA\Drivers\USB\LowLevel\LowLevel.c"></File><File path="LUFA\Drivers\USB\LowLevel\LowLevel.h"></File><File path="LUFA\Drivers\USB\LowLevel\Pipe.c"></File><File path="LUFA\Drivers\USB\LowLevel\Pipe.h"></File><File path="LUFA\Drivers\USB\LowLevel\DevChapter9.c"></File><File path="LUFA\Drivers\USB\LowLevel\DevChapter9.h"></File><File path="LUFA\Drivers\USB\LowLevel\Device.h"></File><File path="LUFA\Drivers\USB\LowLevel\Endpoint.c"></File><File path="LUFA\Drivers\USB\LowLevel\Endpoint.h"></File><File path="LUFA\Drivers\USB\LowLevel\Host.c"></File><File path="LUFA\Drivers\USB\LowLevel\Host.h"></File><File path="LUFA\Drivers\USB\LowLevel\HostChapter9.c"></File><File path="LUFA\Drivers\USB\LowLevel\OTG.h"></File></Folder><Folder name="HighLevel"><File path="LUFA\Drivers\USB\HighLevel\USBTask.h"></File><File path="LUFA\Drivers\USB\HighLevel\Events.c"></File><File path="LUFA\Drivers\USB\HighLevel\Events.h"></File><File path="LUFA\Drivers\USB\HighLevel\USBInterrupt.c"></File><File path="LUFA\Drivers\USB\HighLevel\USBInterrupt.h"></File><File path="LUFA\Drivers\USB\HighLevel\USBTask.c"></File><File path="LUFA\Drivers\USB\HighLevel\StdDescriptors.c"></File><File path="LUFA\Drivers\USB\HighLevel\StdDescriptors.h"></File><File path="LUFA\Drivers\USB\HighLevel\StdRequestType.h"></File><File path="LUFA\Drivers\USB\HighLevel\StreamCallbacks.h"></File><File path="LUFA\Drivers\USB\HighLevel\USBMode.h"></File></Folder><Folder name="Class"><File path="LUFA\Drivers\USB\Class\HIDParser.c"></File><File path="LUFA\Drivers\USB\Class\HIDParser.h"></File><File path="LUFA\Drivers\USB\Class\HIDReportData.h"></File><File path="LUFA\Drivers\USB\Class\ConfigDescriptor.c"></File><File path="LUFA\Drivers\USB\Class\ConfigDescriptor.h"></File></Folder><File path="LUFA\Drivers\USB\USB.h"></File></Folder><Folder name="Misc"><File path="LUFA\Drivers\Misc\TerminalCodes.h"></File></Folder><Folder name="Board"><Folder name="USBKEY"><File path="LUFA\Drivers\Board\USBKEY\Dataflash.h"></File><File path="LUFA\Drivers\Board\USBKEY\Joystick.h"></File><File path="LUFA\Drivers\Board\USBKEY\AT45DB642D.h"></File><File path="LUFA\Drivers\Board\USBKEY\LEDs.h"></File><File path="LUFA\Drivers\Board\USBKEY\Buttons.h"></File></Folder><Folder name="STK526"><File path="LUFA\Drivers\Board\STK526\Dataflash.h"></File><File path="LUFA\Drivers\Board\STK526\Joystick.h"></File><File path="LUFA\Drivers\Board\STK526\AT45DB642D.h"></File><File path="LUFA\Drivers\Board\STK526\LEDs.h"></File><File path="LUFA\Drivers\Board\STK526\Buttons.h"></File></Folder><Folder name="STK525"><File path="LUFA\Drivers\Board\STK525\Dataflash.h"></File><File path="LUFA\Drivers\Board\STK525\Joystick.h"></File><File path="LUFA\Drivers\Board\STK525\AT45DB321C.h"></File><File path="LUFA\Drivers\Board\STK525\LEDs.h"></File><File path="LUFA\Drivers\Board\STK525\Buttons.h"></File></Folder><Folder name="RZUSBSTICK"><File path="LUFA\Drivers\Board\RZUSBSTICK\LEDs.h"></File></Folder><Folder name="ATAVRUSBRF01"><File path="LUFA\Drivers\Board\ATAVRUSBRF01\LEDs.h"></File><File path="LUFA\Drivers\Board\ATAVRUSBRF01\Buttons.h"></File></Folder><File path="LUFA\Drivers\Board\Temperature.h"></File><File path="LUFA\Drivers\Board\Dataflash.h"></File><File path="LUFA\Drivers\Board\Joystick.h"></File><File path="LUFA\Drivers\Board\Temperature.c"></File><File path="LUFA\Drivers\Board\LEDs.h"></File><File path="LUFA\Drivers\Board\Buttons.h"></File></Folder><Folder name="Peripheral"><Folder name="AT90USBXXX67"><File path="LUFA\Drivers\Peripheral\AT90USBXXX67\ADC.h"></File></Folder><File path="LUFA\Drivers\Peripheral\ADC.h"></File><File path="LUFA\Drivers\Peripheral\Serial.c"></File><File path="LUFA\Drivers\Peripheral\Serial.h"></File><File path="LUFA\Drivers\Peripheral\SPI.h"></File><File path="LUFA\Drivers\Peripheral\SerialStream.c"></File><File path="LUFA\Drivers\Peripheral\SerialStream.h"></File></Folder></Folder><Folder name="Scheduler"><File path="LUFA\Scheduler\Scheduler.h"></File><File path="LUFA\Scheduler\Scheduler.c"></File></Folder><Folder name="MemoryAllocator"><File path="LUFA\MemoryAllocator\DynAlloc.h"></File><File path="LUFA\MemoryAllocator\DynAlloc.c"></File></Folder><Folder name="DriverStubs"><File path="LUFA\DriverStubs\Dataflash.h"></File><File path="LUFA\DriverStubs\Joystick.h"></File><File path="LUFA\DriverStubs\LEDs.h"></File><File path="LUFA\DriverStubs\Buttons.h"></File></Folder><File path="LUFA\makefile"></File><File path="LUFA\Version.h"></File><File path="LUFA\BuildingLinkableLibraries.txt"></File><File path="LUFA\GettingStarted.txt"></File><File path="LUFA\MainPage.txt"></File><File path="LUFA\SchedulerOverview.txt"></File><File path="LUFA\VIDAndPIDValues.txt"></File><File path="LUFA\ChangeLog.txt"></File><File path="LUFA\CompileTimeTokens.txt"></File><File path="LUFA\MigrationInformation.txt"></File><File path="LUFA\DirectorySummaries.txt"></File><File path="LUFA\Doxygen.conf"></File><File path="LUFA\WritingBoardDrivers.txt"></File><File path="LUFA\LUFAPoweredProjects.txt"></File><File path="LUFA\Groups.txt"></File></Folder><Folder name="Projects"><Folder name="MagStripe"><File path="Projects\Magstripe\Descriptors.c"></File><File path="Projects\Magstripe\Descriptors.h"></File><File path="Projects\Magstripe\Magstripe.c"></File><File path="Projects\Magstripe\Magstripe.h"></File><File path="Projects\Magstripe\MagstripeHW.h"></File><File path="Projects\Magstripe\makefile"></File><File path="Projects\Magstripe\Magstripe.txt"></File><File path="Projects\Magstripe\Doxygen.conf"></File><File path="Projects\Magstripe\CircularBitBuffer.c"></File><File path="Projects\Magstripe\CircularBitBuffer.h"></File></Folder><File path="Projects\makefile"></File></Folder><Folder name="Bootloaders"><Folder name="DFU"><File path="Bootloaders\DFU\BootloaderDFU.c"></File><File path="Bootloaders\DFU\BootloaderDFU.h"></File><File path="Bootloaders\DFU\Descriptors.c"></File><File path="Bootloaders\DFU\Descriptors.h"></File><File path="Bootloaders\DFU\makefile"></File><File path="Bootloaders\DFU\BootloaderDFU.txt"></File><File path="Bootloaders\DFU\Doxygen.conf"></File></Folder><Folder name="CDC"><File path="Bootloaders\CDC\BootloaderCDC.c"></File><File path="Bootloaders\CDC\BootloaderCDC.h"></File><File path="Bootloaders\CDC\Descriptors.c"></File><File path="Bootloaders\CDC\Descriptors.h"></File><File path="Bootloaders\CDC\makefile"></File><File path="Bootloaders\CDC\LUFA CDC Bootloader.inf"></File><File path="Bootloaders\CDC\Doxygen.conf"></File><File path="Bootloaders\CDC\BootloaderCDC.txt"></File></Folder><Folder name="TeensyHID"><File path="Bootloaders\TeensyHID\Descriptors.c"></File><File path="Bootloaders\TeensyHID\Descriptors.h"></File><File path="Bootloaders\TeensyHID\makefile"></File><File path="Bootloaders\TeensyHID\TeensyHID.c"></File><File path="Bootloaders\TeensyHID\TeensyHID.h"></File><File path="Bootloaders\TeensyHID\TeensyHID.txt"></File></Folder><File path="Bootloaders\makefile"></File></Folder><File path="makefile"></File></Project>
\ No newline at end of file
+<Project name="LUFA"><Folder name="Demos"><Folder name="Device"><Folder name="AudioInput"><File path="Demos\Device\AudioInput\AudioInput.c"></File><File path="Demos\Device\AudioInput\AudioInput.h"></File><File path="Demos\Device\AudioInput\AudioInput.txt"></File><File path="Demos\Device\AudioInput\Descriptors.c"></File><File path="Demos\Device\AudioInput\Descriptors.h"></File><File path="Demos\Device\AudioInput\Doxygen.conf"></File><File path="Demos\Device\AudioInput\makefile"></File></Folder><Folder name="AudioOutput"><File path="Demos\Device\AudioOutput\AudioOutput.c"></File><File path="Demos\Device\AudioOutput\AudioOutput.h"></File><File path="Demos\Device\AudioOutput\AudioOutput.txt"></File><File path="Demos\Device\AudioOutput\Descriptors.c"></File><File path="Demos\Device\AudioOutput\Descriptors.h"></File><File path="Demos\Device\AudioOutput\Doxygen.conf"></File><File path="Demos\Device\AudioOutput\makefile"></File></Folder><Folder name="CDC"><File path="Demos\Device\CDC\CDC.c"></File><File path="Demos\Device\CDC\CDC.h"></File><File path="Demos\Device\CDC\CDC.txt"></File><File path="Demos\Device\CDC\Descriptors.c"></File><File path="Demos\Device\CDC\Descriptors.h"></File><File path="Demos\Device\CDC\Doxygen.conf"></File><File path="Demos\Device\CDC\LUFA CDC.inf"></File><File path="Demos\Device\CDC\makefile"></File></Folder><Folder name="DualCDC"><File path="Demos\Device\DualCDC\Descriptors.c"></File><File path="Demos\Device\DualCDC\Descriptors.h"></File><File path="Demos\Device\DualCDC\Doxygen.conf"></File><File path="Demos\Device\DualCDC\DualCDC.c"></File><File path="Demos\Device\DualCDC\DualCDC.h"></File><File path="Demos\Device\DualCDC\DualCDC.txt"></File><File path="Demos\Device\DualCDC\LUFA DualCDC.inf"></File><File path="Demos\Device\DualCDC\makefile"></File></Folder><Folder name="GenericHID"><File path="Demos\Device\GenericHID\Descriptors.c"></File><File path="Demos\Device\GenericHID\Descriptors.h"></File><File path="Demos\Device\GenericHID\GenericHID.c"></File><File path="Demos\Device\GenericHID\GenericHID.h"></File><File path="Demos\Device\GenericHID\makefile"></File><File path="Demos\Device\GenericHID\GenericHID.txt"></File><File path="Demos\Device\GenericHID\Doxygen.conf"></File></Folder><Folder name="Joystick"><File path="Demos\Device\Joystick\Descriptors.c"></File><File path="Demos\Device\Joystick\Descriptors.h"></File><File path="Demos\Device\Joystick\Doxygen.conf"></File><File path="Demos\Device\Joystick\Joystick.c"></File><File path="Demos\Device\Joystick\Joystick.h"></File><File path="Demos\Device\Joystick\Joystick.txt"></File><File path="Demos\Device\Joystick\makefile"></File></Folder><Folder name="Keyboard"><File path="Demos\Device\Keyboard\Descriptors.c"></File><File path="Demos\Device\Keyboard\Descriptors.h"></File><File path="Demos\Device\Keyboard\Doxygen.conf"></File><File path="Demos\Device\Keyboard\Keyboard.c"></File><File path="Demos\Device\Keyboard\Keyboard.h"></File><File path="Demos\Device\Keyboard\Keyboard.txt"></File><File path="Demos\Device\Keyboard\makefile"></File></Folder><Folder name="KeyboardMouse"><File path="Demos\Device\KeyboardMouse\Descriptors.c"></File><File path="Demos\Device\KeyboardMouse\Descriptors.h"></File><File path="Demos\Device\KeyboardMouse\Doxygen.conf"></File><File path="Demos\Device\KeyboardMouse\KeyboardMouse.c"></File><File path="Demos\Device\KeyboardMouse\KeyboardMouse.h"></File><File path="Demos\Device\KeyboardMouse\KeyboardMouse.txt"></File><File path="Demos\Device\KeyboardMouse\makefile"></File></Folder><Folder name="MassStorage"><File path="Demos\Device\MassStorage\DataflashManager.c"></File><File path="Demos\Device\MassStorage\DataflashManager.h"></File><File path="Demos\Device\MassStorage\Descriptors.c"></File><File path="Demos\Device\MassStorage\Descriptors.h"></File><File path="Demos\Device\MassStorage\Doxygen.conf"></File><File path="Demos\Device\MassStorage\makefile"></File><File path="Demos\Device\MassStorage\MassStorage.c"></File><File path="Demos\Device\MassStorage\MassStorage.h"></File><File path="Demos\Device\MassStorage\MassStorage.txt"></File><File path="Demos\Device\MassStorage\SCSI.c"></File><File path="Demos\Device\MassStorage\SCSI.h"></File><File path="Demos\Device\MassStorage\SCSI_Codes.h"></File></Folder><Folder name="MIDI"><File path="Demos\Device\MIDI\Descriptors.c"></File><File path="Demos\Device\MIDI\Descriptors.h"></File><File path="Demos\Device\MIDI\Doxygen.conf"></File><File path="Demos\Device\MIDI\makefile"></File><File path="Demos\Device\MIDI\MIDI.c"></File><File path="Demos\Device\MIDI\MIDI.h"></File><File path="Demos\Device\MIDI\MIDI.txt"></File></Folder><Folder name="Mouse"><File path="Demos\Device\Mouse\Descriptors.c"></File><File path="Demos\Device\Mouse\Descriptors.h"></File><File path="Demos\Device\Mouse\Doxygen.conf"></File><File path="Demos\Device\Mouse\makefile"></File><File path="Demos\Device\Mouse\Mouse.c"></File><File path="Demos\Device\Mouse\Mouse.h"></File><File path="Demos\Device\Mouse\Mouse.txt"></File></Folder><Folder name="RNDISEthernet"><File path="Demos\Device\RNDISEthernet\ARP.c"></File><File path="Demos\Device\RNDISEthernet\ARP.h"></File><File path="Demos\Device\RNDISEthernet\Descriptors.c"></File><File path="Demos\Device\RNDISEthernet\Descriptors.h"></File><File path="Demos\Device\RNDISEthernet\DHCP.c"></File><File path="Demos\Device\RNDISEthernet\DHCP.h"></File><File path="Demos\Device\RNDISEthernet\Doxygen.conf"></File><File path="Demos\Device\RNDISEthernet\Ethernet.c"></File><File path="Demos\Device\RNDISEthernet\Ethernet.h"></File><File path="Demos\Device\RNDISEthernet\EthernetProtocols.h"></File><File path="Demos\Device\RNDISEthernet\ICMP.c"></File><File path="Demos\Device\RNDISEthernet\ICMP.h"></File><File path="Demos\Device\RNDISEthernet\IP.c"></File><File path="Demos\Device\RNDISEthernet\IP.h"></File><File path="Demos\Device\RNDISEthernet\LUFA RNDIS.inf"></File><File path="Demos\Device\RNDISEthernet\makefile"></File><File path="Demos\Device\RNDISEthernet\ProtocolDecoders.c"></File><File path="Demos\Device\RNDISEthernet\ProtocolDecoders.h"></File><File path="Demos\Device\RNDISEthernet\RNDIS.c"></File><File path="Demos\Device\RNDISEthernet\RNDIS.h"></File><File path="Demos\Device\RNDISEthernet\RNDISConstants.h"></File><File path="Demos\Device\RNDISEthernet\RNDISEthernet.c"></File><File path="Demos\Device\RNDISEthernet\RNDISEthernet.h"></File><File path="Demos\Device\RNDISEthernet\RNDISEthernet.txt"></File><File path="Demos\Device\RNDISEthernet\TCP.c"></File><File path="Demos\Device\RNDISEthernet\TCP.h"></File><File path="Demos\Device\RNDISEthernet\UDP.c"></File><File path="Demos\Device\RNDISEthernet\UDP.h"></File><File path="Demos\Device\RNDISEthernet\Webserver.c"></File><File path="Demos\Device\RNDISEthernet\Webserver.h"></File></Folder><Folder name="USBtoSerial"><File path="Demos\Device\USBtoSerial\Descriptors.c"></File><File path="Demos\Device\USBtoSerial\Descriptors.h"></File><File path="Demos\Device\USBtoSerial\Doxygen.conf"></File><File path="Demos\Device\USBtoSerial\LUFA USBtoSerial.inf"></File><File path="Demos\Device\USBtoSerial\makefile"></File><File path="Demos\Device\USBtoSerial\RingBuff.c"></File><File path="Demos\Device\USBtoSerial\RingBuff.h"></File><File path="Demos\Device\USBtoSerial\USBtoSerial.c"></File><File path="Demos\Device\USBtoSerial\USBtoSerial.h"></File><File path="Demos\Device\USBtoSerial\USBtoSerial.txt"></File></Folder><File path="Demos\Device\makefile"></File></Folder><Folder name="Host"><Folder name="CDCHost"><File path="Demos\Host\CDCHost\CDCHost.c"></File><File path="Demos\Host\CDCHost\CDCHost.h"></File><File path="Demos\Host\CDCHost\CDCHost.txt"></File><File path="Demos\Host\CDCHost\ConfigDescriptor.c"></File><File path="Demos\Host\CDCHost\ConfigDescriptor.h"></File><File path="Demos\Host\CDCHost\Doxygen.conf"></File><File path="Demos\Host\CDCHost\makefile"></File></Folder><Folder name="GenericHIDHost"><File path="Demos\Host\GenericHIDHost\ConfigDescriptor.c"></File><File path="Demos\Host\GenericHIDHost\ConfigDescriptor.h"></File><File path="Demos\Host\GenericHIDHost\GenericHIDHost.c"></File><File path="Demos\Host\GenericHIDHost\GenericHIDHost.h"></File><File path="Demos\Host\GenericHIDHost\makefile"></File><File path="Demos\Host\GenericHIDHost\Doxygen.conf"></File><File path="Demos\Host\GenericHIDHost\GenericHIDHost.txt"></File></Folder><Folder name="KeyboardHost"><File path="Demos\Host\KeyboardHost\ConfigDescriptor.c"></File><File path="Demos\Host\KeyboardHost\ConfigDescriptor.h"></File><File path="Demos\Host\KeyboardHost\Doxygen.conf"></File><File path="Demos\Host\KeyboardHost\KeyboardHost.c"></File><File path="Demos\Host\KeyboardHost\KeyboardHost.h"></File><File path="Demos\Host\KeyboardHost\KeyboardHost.txt"></File><File path="Demos\Host\KeyboardHost\makefile"></File></Folder><Folder name="KeyboardHostWithParser"><File path="Demos\Host\KeyboardHostWithParser\ConfigDescriptor.c"></File><File path="Demos\Host\KeyboardHostWithParser\ConfigDescriptor.h"></File><File path="Demos\Host\KeyboardHostWithParser\Doxygen.conf"></File><File path="Demos\Host\KeyboardHostWithParser\HIDReport.c"></File><File path="Demos\Host\KeyboardHostWithParser\HIDReport.h"></File><File path="Demos\Host\KeyboardHostWithParser\KeyboardHostWithParser.c"></File><File path="Demos\Host\KeyboardHostWithParser\KeyboardHostWithParser.h"></File><File path="Demos\Host\KeyboardHostWithParser\KeyboardHostWithParser.txt"></File><File path="Demos\Host\KeyboardHostWithParser\makefile"></File></Folder><Folder name="MassStorageHost"><File path="Demos\Host\MassStorageHost\ConfigDescriptor.c"></File><File path="Demos\Host\MassStorageHost\ConfigDescriptor.h"></File><File path="Demos\Host\MassStorageHost\Doxygen.conf"></File><File path="Demos\Host\MassStorageHost\makefile"></File><File path="Demos\Host\MassStorageHost\MassStorageHost.c"></File><File path="Demos\Host\MassStorageHost\MassStorageHost.h"></File><File path="Demos\Host\MassStorageHost\MassStorageHost.txt"></File><File path="Demos\Host\MassStorageHost\MassStoreCommands.c"></File><File path="Demos\Host\MassStorageHost\MassStoreCommands.h"></File><File path="Demos\Host\MassStorageHost\SCSI_Codes.h"></File></Folder><Folder name="MouseHost"><File path="Demos\Host\MouseHost\ConfigDescriptor.c"></File><File path="Demos\Host\MouseHost\ConfigDescriptor.h"></File><File path="Demos\Host\MouseHost\Doxygen.conf"></File><File path="Demos\Host\MouseHost\makefile"></File><File path="Demos\Host\MouseHost\MouseHost.c"></File><File path="Demos\Host\MouseHost\MouseHost.h"></File><File path="Demos\Host\MouseHost\MouseHost.txt"></File></Folder><Folder name="MouseHostWithParser"><File path="Demos\Host\MouseHostWithParser\ConfigDescriptor.c"></File><File path="Demos\Host\MouseHostWithParser\ConfigDescriptor.h"></File><File path="Demos\Host\MouseHostWithParser\Doxygen.conf"></File><File path="Demos\Host\MouseHostWithParser\HIDReport.c"></File><File path="Demos\Host\MouseHostWithParser\HIDReport.h"></File><File path="Demos\Host\MouseHostWithParser\makefile"></File><File path="Demos\Host\MouseHostWithParser\MouseHostWithParser.c"></File><File path="Demos\Host\MouseHostWithParser\MouseHostWithParser.h"></File><File path="Demos\Host\MouseHostWithParser\MouseHostWithParser.txt"></File></Folder><Folder name="StillImageHost"><File path="Demos\Host\StillImageHost\ConfigDescriptor.c"></File><File path="Demos\Host\StillImageHost\ConfigDescriptor.h"></File><File path="Demos\Host\StillImageHost\Doxygen.conf"></File><File path="Demos\Host\StillImageHost\makefile"></File><File path="Demos\Host\StillImageHost\PIMACodes.h"></File><File path="Demos\Host\StillImageHost\StillImageCommands.c"></File><File path="Demos\Host\StillImageHost\StillImageCommands.h"></File><File path="Demos\Host\StillImageHost\StillImageHost.c"></File><File path="Demos\Host\StillImageHost\StillImageHost.h"></File><File path="Demos\Host\StillImageHost\StillImageHost.txt"></File></Folder><File path="Demos\Host\makefile"></File></Folder><Folder name="OTG"><Folder name="TestApp"><File path="Demos\OTG\TestApp\Descriptors.c"></File><File path="Demos\OTG\TestApp\Descriptors.h"></File><File path="Demos\OTG\TestApp\Doxygen.conf"></File><File path="Demos\OTG\TestApp\makefile"></File><File path="Demos\OTG\TestApp\TestApp.c"></File><File path="Demos\OTG\TestApp\TestApp.h"></File><File path="Demos\OTG\TestApp\TestApp.txt"></File><File path="Demos\OTG\TestApp\TestEvents.c"></File><File path="Demos\OTG\TestApp\TestEvents.h"></File></Folder><File path="Demos\OTG\makefile"></File></Folder><File path="Demos\makefile"></File></Folder><Folder name="LUFA"><Folder name="Common"><File path="LUFA\Common\Common.h"></File><File path="LUFA\Common\FunctionAttributes.h"></File><File path="LUFA\Common\BoardTypes.h"></File></Folder><Folder name="Drivers"><Folder name="USB"><Folder name="LowLevel"><File path="LUFA\Drivers\USB\LowLevel\HostChapter9.h"></File><File path="LUFA\Drivers\USB\LowLevel\LowLevel.c"></File><File path="LUFA\Drivers\USB\LowLevel\LowLevel.h"></File><File path="LUFA\Drivers\USB\LowLevel\Pipe.c"></File><File path="LUFA\Drivers\USB\LowLevel\Pipe.h"></File><File path="LUFA\Drivers\USB\LowLevel\DevChapter9.c"></File><File path="LUFA\Drivers\USB\LowLevel\DevChapter9.h"></File><File path="LUFA\Drivers\USB\LowLevel\Device.h"></File><File path="LUFA\Drivers\USB\LowLevel\Endpoint.c"></File><File path="LUFA\Drivers\USB\LowLevel\Endpoint.h"></File><File path="LUFA\Drivers\USB\LowLevel\Host.c"></File><File path="LUFA\Drivers\USB\LowLevel\Host.h"></File><File path="LUFA\Drivers\USB\LowLevel\HostChapter9.c"></File><File path="LUFA\Drivers\USB\LowLevel\OTG.h"></File></Folder><Folder name="HighLevel"><File path="LUFA\Drivers\USB\HighLevel\USBTask.h"></File><File path="LUFA\Drivers\USB\HighLevel\Events.c"></File><File path="LUFA\Drivers\USB\HighLevel\Events.h"></File><File path="LUFA\Drivers\USB\HighLevel\USBInterrupt.c"></File><File path="LUFA\Drivers\USB\HighLevel\USBInterrupt.h"></File><File path="LUFA\Drivers\USB\HighLevel\USBTask.c"></File><File path="LUFA\Drivers\USB\HighLevel\StdDescriptors.c"></File><File path="LUFA\Drivers\USB\HighLevel\StdDescriptors.h"></File><File path="LUFA\Drivers\USB\HighLevel\StdRequestType.h"></File><File path="LUFA\Drivers\USB\HighLevel\StreamCallbacks.h"></File><File path="LUFA\Drivers\USB\HighLevel\USBMode.h"></File></Folder><Folder name="Class"><File path="LUFA\Drivers\USB\Class\HIDParser.c"></File><File path="LUFA\Drivers\USB\Class\HIDParser.h"></File><File path="LUFA\Drivers\USB\Class\HIDReportData.h"></File><File path="LUFA\Drivers\USB\Class\ConfigDescriptor.c"></File><File path="LUFA\Drivers\USB\Class\ConfigDescriptor.h"></File></Folder><File path="LUFA\Drivers\USB\USB.h"></File></Folder><Folder name="Misc"><File path="LUFA\Drivers\Misc\TerminalCodes.h"></File></Folder><Folder name="Board"><Folder name="USBKEY"><File path="LUFA\Drivers\Board\USBKEY\Dataflash.h"></File><File path="LUFA\Drivers\Board\USBKEY\Joystick.h"></File><File path="LUFA\Drivers\Board\USBKEY\AT45DB642D.h"></File><File path="LUFA\Drivers\Board\USBKEY\LEDs.h"></File><File path="LUFA\Drivers\Board\USBKEY\Buttons.h"></File></Folder><Folder name="STK526"><File path="LUFA\Drivers\Board\STK526\Dataflash.h"></File><File path="LUFA\Drivers\Board\STK526\Joystick.h"></File><File path="LUFA\Drivers\Board\STK526\AT45DB642D.h"></File><File path="LUFA\Drivers\Board\STK526\LEDs.h"></File><File path="LUFA\Drivers\Board\STK526\Buttons.h"></File></Folder><Folder name="STK525"><File path="LUFA\Drivers\Board\STK525\Dataflash.h"></File><File path="LUFA\Drivers\Board\STK525\Joystick.h"></File><File path="LUFA\Drivers\Board\STK525\AT45DB321C.h"></File><File path="LUFA\Drivers\Board\STK525\LEDs.h"></File><File path="LUFA\Drivers\Board\STK525\Buttons.h"></File></Folder><Folder name="RZUSBSTICK"><File path="LUFA\Drivers\Board\RZUSBSTICK\LEDs.h"></File></Folder><Folder name="ATAVRUSBRF01"><File path="LUFA\Drivers\Board\ATAVRUSBRF01\LEDs.h"></File><File path="LUFA\Drivers\Board\ATAVRUSBRF01\Buttons.h"></File></Folder><File path="LUFA\Drivers\Board\Temperature.h"></File><File path="LUFA\Drivers\Board\Dataflash.h"></File><File path="LUFA\Drivers\Board\Joystick.h"></File><File path="LUFA\Drivers\Board\Temperature.c"></File><File path="LUFA\Drivers\Board\LEDs.h"></File><File path="LUFA\Drivers\Board\Buttons.h"></File></Folder><Folder name="Peripheral"><Folder name="AT90USBXXX67"><File path="LUFA\Drivers\Peripheral\AT90USBXXX67\ADC.h"></File></Folder><File path="LUFA\Drivers\Peripheral\ADC.h"></File><File path="LUFA\Drivers\Peripheral\Serial.c"></File><File path="LUFA\Drivers\Peripheral\Serial.h"></File><File path="LUFA\Drivers\Peripheral\SPI.h"></File><File path="LUFA\Drivers\Peripheral\SerialStream.c"></File><File path="LUFA\Drivers\Peripheral\SerialStream.h"></File></Folder></Folder><Folder name="Scheduler"><File path="LUFA\Scheduler\Scheduler.h"></File><File path="LUFA\Scheduler\Scheduler.c"></File></Folder><Folder name="MemoryAllocator"><File path="LUFA\MemoryAllocator\DynAlloc.h"></File><File path="LUFA\MemoryAllocator\DynAlloc.c"></File></Folder><Folder name="DriverStubs"><File path="LUFA\DriverStubs\Dataflash.h"></File><File path="LUFA\DriverStubs\Joystick.h"></File><File path="LUFA\DriverStubs\LEDs.h"></File><File path="LUFA\DriverStubs\Buttons.h"></File></Folder><File path="LUFA\makefile"></File><File path="LUFA\Version.h"></File><File path="LUFA\BuildingLinkableLibraries.txt"></File><File path="LUFA\GettingStarted.txt"></File><File path="LUFA\MainPage.txt"></File><File path="LUFA\SchedulerOverview.txt"></File><File path="LUFA\VIDAndPIDValues.txt"></File><File path="LUFA\ChangeLog.txt"></File><File path="LUFA\CompileTimeTokens.txt"></File><File path="LUFA\MigrationInformation.txt"></File><File path="LUFA\DirectorySummaries.txt"></File><File path="LUFA\Doxygen.conf"></File><File path="LUFA\WritingBoardDrivers.txt"></File><File path="LUFA\LUFAPoweredProjects.txt"></File><File path="LUFA\Groups.txt"></File></Folder><Folder name="Projects"><Folder name="MagStripe"><File path="Projects\Magstripe\Descriptors.c"></File><File path="Projects\Magstripe\Descriptors.h"></File><File path="Projects\Magstripe\Magstripe.c"></File><File path="Projects\Magstripe\Magstripe.h"></File><File path="Projects\Magstripe\MagstripeHW.h"></File><File path="Projects\Magstripe\makefile"></File><File path="Projects\Magstripe\Magstripe.txt"></File><File path="Projects\Magstripe\Doxygen.conf"></File><File path="Projects\Magstripe\CircularBitBuffer.c"></File><File path="Projects\Magstripe\CircularBitBuffer.h"></File></Folder><File path="Projects\makefile"></File></Folder><Folder name="Bootloaders"><Folder name="DFU"><File path="Bootloaders\DFU\BootloaderDFU.c"></File><File path="Bootloaders\DFU\BootloaderDFU.h"></File><File path="Bootloaders\DFU\Descriptors.c"></File><File path="Bootloaders\DFU\Descriptors.h"></File><File path="Bootloaders\DFU\makefile"></File><File path="Bootloaders\DFU\BootloaderDFU.txt"></File><File path="Bootloaders\DFU\Doxygen.conf"></File></Folder><Folder name="CDC"><File path="Bootloaders\CDC\BootloaderCDC.c"></File><File path="Bootloaders\CDC\BootloaderCDC.h"></File><File path="Bootloaders\CDC\Descriptors.c"></File><File path="Bootloaders\CDC\Descriptors.h"></File><File path="Bootloaders\CDC\makefile"></File><File path="Bootloaders\CDC\LUFA CDC Bootloader.inf"></File><File path="Bootloaders\CDC\Doxygen.conf"></File><File path="Bootloaders\CDC\BootloaderCDC.txt"></File></Folder><Folder name="TeensyHID"><File path="Bootloaders\TeensyHID\Descriptors.c"></File><File path="Bootloaders\TeensyHID\Descriptors.h"></File><File path="Bootloaders\TeensyHID\makefile"></File><File path="Bootloaders\TeensyHID\TeensyHID.c"></File><File path="Bootloaders\TeensyHID\TeensyHID.h"></File><File path="Bootloaders\TeensyHID\TeensyHID.txt"></File></Folder><File path="Bootloaders\makefile"></File></Folder><File path="makefile"></File></Project>
\ No newline at end of file
index cc19808..1833596 100644 (file)
@@ -11,6 +11,8 @@
   *  - Fixed bug in RNDISEthernet and DualCDC demos not using the correct USB_ControlRequest structure for control request data\r
   *  - Fixed documentation showing incorrect USB mode support on the supported AVRs list\r
   *  - Fixed RNDISEthernet not working under Linux due to Linux requiring an "optional" request which was unhandled\r
   *  - Fixed bug in RNDISEthernet and DualCDC demos not using the correct USB_ControlRequest structure for control request data\r
   *  - Fixed documentation showing incorrect USB mode support on the supported AVRs list\r
   *  - Fixed RNDISEthernet not working under Linux due to Linux requiring an "optional" request which was unhandled\r
+  *  - Fixed Mouse and Keyboard device demos not acting in accordance with the HID specification for idle periods (thanks to Brian Dickman)\r
+  *  - Removed support for endpoint/pipe non-control interrupts; these did not act in the way users expected, and had many subtle issues\r
   *\r
   *\r
   *  \section Sec_ChangeLog090510 Version 090510\r
   *\r
   *\r
   *  \section Sec_ChangeLog090510 Version 090510\r
index aa5005a..4882acc 100644 (file)
                         *  \see \ref ENDPOINT_PIPE_vect for more information on the common pipe and endpoint interrupt vector.\r
                         */\r
                        #define ENDPOINT_INT_SETUP                    UEIENX, (1 << RXSTPE), UEINTX, (1 << RXSTPI)\r
                         *  \see \ref ENDPOINT_PIPE_vect for more information on the common pipe and endpoint interrupt vector.\r
                         */\r
                        #define ENDPOINT_INT_SETUP                    UEIENX, (1 << RXSTPE), UEINTX, (1 << RXSTPI)\r
-\r
-                       /** Interrupt definition for the endpoint IN interrupt (for INTERRUPT type endpoints). Should be\r
-                        *  used with the USB_INT_* macros located in USBInterrupt.h.\r
-                        *\r
-                        *  This interrupt will fire if enabled on an INTERRUPT type endpoint if a the endpoint interrupt\r
-                        *  period has elapsed and the endpoint is ready for a new packet to be written to its FIFO buffer\r
-                        *  (if required).\r
-                        *\r
-                        *  \note This interrupt must be enabled and cleared on *each* endpoint which requires it (after the\r
-                        *        endpoint is selected), and will fire the common endpoint interrupt vector.\r
-                        *\r
-                        *  \see \ref ENDPOINT_PIPE_vect for more information on the common pipe and endpoint interrupt vector.\r
-                        */\r
-                       #define ENDPOINT_INT_IN                       UEIENX, (1 << TXINE) , UEINTX, (1 << TXINI)\r
-\r
-                       /** Interrupt definition for the endpoint OUT interrupt (for INTERRUPT type endpoints). Should be\r
-                        *  used with the USB_INT_* macros located in USBInterrupt.h.\r
-                        *\r
-                        *  This interrupt will fire if enabled on an INTERRUPT type endpoint if a the endpoint interrupt\r
-                        *  period has elapsed and the endpoint is ready for a packet from the host to be read from its\r
-                        *  FIFO buffer (if received).\r
-                        *\r
-                        *  \note This interrupt must be enabled and cleared on *each* endpoint which requires it (after the\r
-                        *        endpoint is selected), and will fire the common endpoint interrupt vector.\r
-                        *\r
-                        *  \see \ref ENDPOINT_PIPE_vect for more information on the common pipe and endpoint interrupt vector.\r
-                        */\r
-                       #define ENDPOINT_INT_OUT                      UEIENX, (1 << RXOUTE), UEINTX, (1 << RXOUTI)\r
                        \r
                /* Pseudo-Function Macros: */\r
                        #if defined(__DOXYGEN__)\r
                        \r
                /* Pseudo-Function Macros: */\r
                        #if defined(__DOXYGEN__)\r
                                 */\r
                                static inline uint8_t Endpoint_GetEndpointInterrupts(void);\r
                                \r
                                 */\r
                                static inline uint8_t Endpoint_GetEndpointInterrupts(void);\r
                                \r
-                               /** Clears the endpoint interrupt flag. This clears the specified endpoint number's interrupt\r
-                                *  mask in the endpoint interrupt flag register.\r
-                                *\r
-                                *  \param EndpointNumber  Index of the endpoint whose interrupt flag should be cleared\r
-                                */\r
-                               static inline void Endpoint_ClearEndpointInterrupt(uint8_t EndpointNumber);\r
-                               \r
                                /** Determines if the specified endpoint number has interrupted (valid only for INTERRUPT type\r
                                 *  endpoints).\r
                                 *\r
                                /** Determines if the specified endpoint number has interrupted (valid only for INTERRUPT type\r
                                 *  endpoints).\r
                                 *\r
 \r
                                #define Endpoint_GetEndpointInterrupts()      UEINT\r
 \r
 \r
                                #define Endpoint_GetEndpointInterrupts()      UEINT\r
 \r
-                               #define Endpoint_ClearEndpointInterrupt(n)    MACROS{ UEINT &= ~(1 << n); }MACROE\r
-\r
                                #define Endpoint_HasEndpointInterrupted(n)    ((UEINT & (1 << n)) ? true : false)\r
                                \r
                                #define Endpoint_IsINReady()                  ((UEINTX & (1 << TXINI))  ? true : false)\r
                                #define Endpoint_HasEndpointInterrupted(n)    ((UEINT & (1 << n)) ? true : false)\r
                                \r
                                #define Endpoint_IsINReady()                  ((UEINTX & (1 << TXINI))  ? true : false)\r
index ee51cf3..4b96c69 100644 (file)
@@ -155,7 +155,7 @@ static uint8_t USB_Host_Wait_For_Setup_IOS(const uint8_t WaitType)
 {\r
        uint16_t TimeoutCounter = USB_HOST_TIMEOUT_MS;\r
        \r
 {\r
        uint16_t TimeoutCounter = USB_HOST_TIMEOUT_MS;\r
        \r
-       while (!(((WaitType == USB_HOST_WAITFOR_SetupSent)  && Pipe_IsSETUPSent())       ||\r
+       while (!(((WaitType == USB_HOST_WAITFOR_SetupSent)  && Pipe_IsSETUPSent())  ||\r
                 ((WaitType == USB_HOST_WAITFOR_InReceived) && Pipe_IsINReceived()) ||\r
                 ((WaitType == USB_HOST_WAITFOR_OutReady)   && Pipe_IsOUTReady())))\r
        {\r
                 ((WaitType == USB_HOST_WAITFOR_InReceived) && Pipe_IsINReceived()) ||\r
                 ((WaitType == USB_HOST_WAITFOR_OutReady)   && Pipe_IsOUTReady())))\r
        {\r
index 7e81cf6..d5c2094 100644 (file)
                         */\r
                        #define PIPE_EPSIZE_MASK                0x7FF\r
 \r
                         */\r
                        #define PIPE_EPSIZE_MASK                0x7FF\r
 \r
-                       /** Interrupt definition for the pipe IN interrupt (for INTERRUPT type pipes). Should be used with\r
-                        *  the USB_INT_* macros located in USBInterrupt.h.\r
-                        *\r
-                        *  This interrupt will fire if enabled on an INTERRUPT type pipe if the pipe interrupt period has\r
-                        *  elapsed and the pipe is ready for the next packet from the attached device to be read out from its\r
-                        *  FIFO buffer (if received).\r
-                        *\r
-                        *  \note This interrupt must be enabled and cleared on *each* pipe which requires it (after the pipe\r
-                        *        is selected), and will fire the common pipe interrupt vector.\r
-                        *\r
-                        *  \see \ref ENDPOINT_PIPE_vect for more information on the common pipe and endpoint interrupt vector.\r
-                        */\r
-                       #define PIPE_INT_IN                     UPIENX, (1 << RXINE) , UPINTX, (1 << RXINI)\r
-\r
-                       /** Interrupt definition for the pipe OUT interrupt (for INTERRUPT type pipes). Should be used with\r
-                        *  the USB_INT_* macros located in USBInterrupt.h.\r
-                        *\r
-                        *  This interrupt will fire if enabled on an INTERRUPT type endpoint if a the pipe interrupt period\r
-                        *  has elapsed and the pipe is ready for a packet to be written to the pipe's FIFO buffer and sent\r
-                        *  to the attached device (if required).\r
-                        *  \r
-                        *  \note This interrupt must be enabled and cleared on *each* pipe which requires it (after the pipe\r
-                        *        is selected), and will fire the common pipe interrupt vector.\r
-                        *\r
-                        *  \see \ref ENDPOINT_PIPE_vect for more information on the common pipe and endpoint interrupt vector.\r
-                        */\r
-                       #define PIPE_INT_OUT                   UPIENX, (1 << TXOUTE), UPINTX, (1 << TXOUTI)\r
-\r
                        /** Interrupt definition for the pipe SETUP bank ready interrupt (for CONTROL type pipes). Should be\r
                         *  used with the USB_INT_* macros located in USBInterrupt.h.\r
                         *\r
                        /** Interrupt definition for the pipe SETUP bank ready interrupt (for CONTROL type pipes). Should be\r
                         *  used with the USB_INT_* macros located in USBInterrupt.h.\r
                         *\r
                                 */\r
                                static inline uint8_t Pipe_GetPipeInterrupts(void);\r
                                \r
                                 */\r
                                static inline uint8_t Pipe_GetPipeInterrupts(void);\r
                                \r
-                               /** Clears the interrupt flag for the specified pipe number.\r
-                                *\r
-                                *  \param PipeNumber  Index of the pipe whose interrupt flag is to be cleared\r
-                                */\r
-                               static inline void Pipe_ClearPipeInterrupt(uint8_t PipeNumber);\r
-                               \r
                                /** Determines if the specified pipe number has interrupted (valid only for INTERRUPT type\r
                                 *  pipes).\r
                                 *\r
                                /** Determines if the specified pipe number has interrupted (valid only for INTERRUPT type\r
                                 *  pipes).\r
                                 *\r
 \r
                                #define Pipe_GetPipeInterrupts()       UPINT\r
 \r
 \r
                                #define Pipe_GetPipeInterrupts()       UPINT\r
 \r
-                               #define Pipe_ClearPipeInterrupt(n)     MACROS{ UPINT &= ~(1 << n); }MACROE\r
-\r
                                #define Pipe_HasPipeInterrupted(n)     ((UPINT & (1 << n)) ? true : false)\r
 \r
                                #define Pipe_Unfreeze()                MACROS{ UPCONX &= ~(1 << PFREEZE); }MACROE\r
                                #define Pipe_HasPipeInterrupted(n)     ((UPINT & (1 << n)) ? true : false)\r
 \r
                                #define Pipe_Unfreeze()                MACROS{ UPCONX &= ~(1 << PFREEZE); }MACROE\r
index 891c5b2..d7eb2df 100644 (file)
  *\r
  * \section Sec_MigrationXXXXXX Migrating from 090510 to XXXXXX\r
  *\r
  *\r
  * \section Sec_MigrationXXXXXX Migrating from 090510 to XXXXXX\r
  *\r
+ *  <b>Device Mode</b>\r
+ *    - Support for non-control data endpoint interrupts has been dropped due to many issues in the implementation. All existing\r
+ *      projects using interrupts on non-control endpoints should switch to polling.\r
+ *    - The Endpoint_ClearEndpointInterrupt() macro has been deleted and references to it should be removed.\r
+ *\r
+ *  <b>Device Mode</b>\r
+ *    - Support for non-control data pipe interrupts has been dropped due to many issues in the implementation. All existing\r
+ *      projects using interrupts on non-control pipes should switch to polling.\r
+ *    - The Pipe_ClearPipeInterrupt() macro has been deleted and references to it should be removed.\r
+ *\r
  *\r
  * \section Sec_Migration090510 Migrating from 090401 to 090510\r
  *\r
  *\r
  * \section Sec_Migration090510 Migrating from 090401 to 090510\r
  *\r