X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/f896c00c48f04fb9273555ab8d9b1af99f865d25..cc879df4f014e403e57caca50a5791c996c0d79c:/LUFA/Drivers/USB/Class/Device/HID.c diff --git a/LUFA/Drivers/USB/Class/Device/HID.c b/LUFA/Drivers/USB/Class/Device/HID.c index c37dc5d5c..2ac0dd354 100644 --- a/LUFA/Drivers/USB/Class/Device/HID.c +++ b/LUFA/Drivers/USB/Class/Device/HID.c @@ -33,13 +33,16 @@ #include "HID.h" -void HID_Device_ProcessControlPacket(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo) +void HID_Device_ProcessControlPacket(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) { if (!(Endpoint_IsSETUPReceived())) return; - if (USB_ControlRequest.wIndex != HIDInterfaceInfo->Config.InterfaceNumber) - return; + if ((USB_ControlRequest.wIndex != HIDInterfaceInfo->Config.InterfaceNumber) && + (USB_ControlRequest.bRequest != REQ_SetIdle)) + { + return; + } switch (USB_ControlRequest.bRequest) { @@ -105,12 +108,16 @@ void HID_Device_ProcessControlPacket(USB_ClassInfo_HID_Device_t* HIDInterfaceInf case REQ_SetIdle: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { - Endpoint_ClearSETUP(); - - HIDInterfaceInfo->State.IdleCount = ((USB_ControlRequest.wValue >> 8) << 2); - - while (!(Endpoint_IsINReady())); - Endpoint_ClearIN(); + if ((USB_ControlRequest.wIndex == HIDInterfaceInfo->Config.InterfaceNumber) || + (USB_ControlRequest.wValue & 0xFF) == 0) + { + Endpoint_ClearSETUP(); + + HIDInterfaceInfo->State.IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6); + + while (!(Endpoint_IsINReady())); + Endpoint_ClearIN(); + } } break; @@ -130,7 +137,7 @@ void HID_Device_ProcessControlPacket(USB_ClassInfo_HID_Device_t* HIDInterfaceInf } } -bool HID_Device_ConfigureEndpoints(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo) +bool HID_Device_ConfigureEndpoints(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) { HIDInterfaceInfo->State.UsingReportProtocol = true; @@ -143,7 +150,7 @@ bool HID_Device_ConfigureEndpoints(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo) return true; } -void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo) +void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) { if (!(USB_IsConnected)) return;