Fix Mass Storage Host Class driver GetMaxLUN command - incorrect function return...
[pub/USBasp.git] / LUFA / Drivers / USB / Class / Host / HID.c
index 11dfb67..5a5ec48 100644 (file)
@@ -169,23 +169,73 @@ bool HID_Host_IsReportReceived(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo)
        return ReportReceived;\r
 }\r
 \r
-uint8_t USB_HID_Host_SetProtocol(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, bool UseReportProtocol)\r
+uint8_t USB_HID_Host_SetBootProtocol(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo)\r
 {\r
+       if ((USB_HostState != HOST_STATE_Configured) || !(HIDInterfaceInfo->State.IsActive))\r
+         return false;\r
+\r
        USB_ControlRequest = (USB_Request_Header_t)\r
                {\r
                        .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),\r
                        .bRequest      = REQ_SetProtocol,\r
-                       .wValue        = UseReportProtocol,\r
+                       .wValue        = 1,\r
                        .wIndex        = HIDInterfaceInfo->State.InterfaceNumber,\r
                        .wLength       = 0,\r
                };\r
 \r
        Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
        \r
-       if (UseReportProtocol && !(HIDInterfaceInfo->State.SupportsBootSubClass))\r
-         return MS_ERROR_UNSUPPORTED;\r
+       if (!(HIDInterfaceInfo->State.SupportsBootSubClass))\r
+         return HID_ERROR_LOGICAL;\r
        \r
        return USB_Host_SendControlRequest(NULL);\r
 }\r
 \r
+uint8_t USB_HID_Host_SetReportProtocol(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo)\r
+{\r
+       if ((USB_HostState != HOST_STATE_Configured) || !(HIDInterfaceInfo->State.IsActive))\r
+         return false;\r
+\r
+       uint8_t ErrorCode;\r
+\r
+       uint8_t HIDReportData[HIDInterfaceInfo->State.HIDReportSize];\r
+       \r
+       USB_ControlRequest = (USB_Request_Header_t)\r
+               {\r
+                       .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_INTERFACE),\r
+                       .bRequest      = REQ_GetDescriptor,\r
+                       .wValue        = (DTYPE_Report << 8),\r
+                       .wIndex        = HIDInterfaceInfo->State.InterfaceNumber,\r
+                       .wLength       = HIDInterfaceInfo->State.HIDReportSize,\r
+               };\r
+\r
+       Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
+\r
+       if ((ErrorCode = USB_Host_SendControlRequest(HIDReportData)) != HOST_SENDCONTROL_Successful)\r
+         return ErrorCode;\r
+         \r
+       USB_ControlRequest = (USB_Request_Header_t)\r
+               {\r
+                       .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),\r
+                       .bRequest      = REQ_SetProtocol,\r
+                       .wValue        = 0,\r
+                       .wIndex        = HIDInterfaceInfo->State.InterfaceNumber,\r
+                       .wLength       = 0,\r
+               };\r
+\r
+       if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)\r
+         return ErrorCode;\r
+\r
+       if (HIDInterfaceInfo->Config.HIDParserData == NULL)\r
+         return HID_ERROR_LOGICAL;\r
+         \r
+       if ((ErrorCode = USB_ProcessHIDReport(HIDReportData, HIDInterfaceInfo->State.HIDReportSize,\r
+                                             HIDInterfaceInfo->Config.HIDParserData)) != HID_PARSE_Successful)\r
+       {\r
+               return HID_ERROR_LOGICAL | ErrorCode;\r
+       }\r
+       \r
+       return 0;\r
+}\r
+\r
 #endif\r