Fix HID class device driver -- if a SetIDle request is issued with the LSB of wValue...
[pub/USBasp.git] / LUFA / Drivers / USB / Class / Device / HID.c
index d032086..bad934a 100644 (file)
@@ -38,8 +38,11 @@ void HID_Device_ProcessControlPacket(USB_ClassInfo_HID_Device_t* const HIDInterf
        if (!(Endpoint_IsSETUPReceived()))\r
          return;\r
          \r
-       if (USB_ControlRequest.wIndex != HIDInterfaceInfo->Config.InterfaceNumber)\r
-         return;\r
+       if ((USB_ControlRequest.wIndex   != HIDInterfaceInfo->Config.InterfaceNumber) &&\r
+           (USB_ControlRequest.bRequest != SetIdle))\r
+       {\r
+               return;\r
+       }\r
 \r
        switch (USB_ControlRequest.bRequest)\r
        {\r
@@ -105,12 +108,16 @@ void HID_Device_ProcessControlPacket(USB_ClassInfo_HID_Device_t* const HIDInterf
                case REQ_SetIdle:\r
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))\r
                        {\r
-                               Endpoint_ClearSETUP();\r
-                               \r
-                               HIDInterfaceInfo->State.IdleCount = ((USB_ControlRequest.wValue >> 8) << 2);\r
-                               \r
-                               while (!(Endpoint_IsINReady()));\r
-                               Endpoint_ClearIN();\r
+                               if ((USB_ControlRequest.wIndex         == HIDInterfaceInfo->Config.InterfaceNumber) ||\r
+                                   (USB_ControlRequest.wValue & 0xFF) == 0)\r
+                               {\r
+                                       Endpoint_ClearSETUP();\r
+                                       \r
+                                       HIDInterfaceInfo->State.IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6);\r
+                                       \r
+                                       while (!(Endpoint_IsINReady()));\r
+                                       Endpoint_ClearIN();\r
+                               }\r
                        }\r
                        \r
                        break;\r