X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/df5500e81cc40633eb5edee59410030f0aa77c2d..eee712f76944ca846942be20a14c7a8b1769d500:/LUFA/Drivers/USB/Class/Host/HID.c diff --git a/LUFA/Drivers/USB/Class/Host/HID.c b/LUFA/Drivers/USB/Class/Host/HID.c index 793523866..11dfb67ad 100644 --- a/LUFA/Drivers/USB/Class/Host/HID.c +++ b/LUFA/Drivers/USB/Class/Host/HID.c @@ -60,18 +60,20 @@ uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint } while (HIDInterfaceInfo->Config.HIDInterfaceProtocol && (CurrentHIDInterface->Protocol != HIDInterfaceInfo->Config.HIDInterfaceProtocol)); - HIDInterfaceInfo->State.InterfaceNumber = - #if defined(USE_NONSTANDARD_DESCRIPTOR_NAMES) - CurrentHIDInterface->InterfaceNumber; - #else - CurrentHIDInterface->bInterfaceNumber; - #endif + HIDInterfaceInfo->State.InterfaceNumber = CurrentHIDInterface->InterfaceNumber; HIDInterfaceInfo->State.SupportsBootSubClass = (CurrentHIDInterface->SubClass != 0); + if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, DComp_NextHID) != DESCRIPTOR_SEARCH_COMP_Found) + { + return HID_ENUMERROR_NoHIDDescriptorFound; + } + + HIDInterfaceInfo->State.HIDReportSize = DESCRIPTOR_CAST(ConfigDescriptorData, USB_HID_Descriptor_t).HIDReportLength; + while (FoundEndpoints != (HID_FOUND_DATAPIPE_IN | HID_FOUND_DATAPIPE_OUT)) { if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, - DComp_HID_Host_NextInterfaceHIDDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) + DComp_HID_Host_NextHIDInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) { if (FoundEndpoints == (1 << HID_FOUND_DATAPIPE_IN)) break; @@ -99,7 +101,7 @@ uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint } } - HIDInterfaceInfo->State.Active = true; + HIDInterfaceInfo->State.IsActive = true; return HID_ENUMERROR_NoError; } @@ -117,7 +119,17 @@ static uint8_t DComp_HID_Host_NextHIDInterface(void* CurrentDescriptor) return DESCRIPTOR_SEARCH_NotFound; } -static uint8_t DComp_HID_Host_NextInterfaceHIDDataEndpoint(void* CurrentDescriptor) +static uint8_t DComp_NextHID(void* CurrentDescriptor) +{ + if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_HID) + return DESCRIPTOR_SEARCH_Found; + else if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface) + return DESCRIPTOR_SEARCH_Fail; + else + return DESCRIPTOR_SEARCH_NotFound; +} + +static uint8_t DComp_HID_Host_NextHIDInterfaceEndpoint(void* CurrentDescriptor) { if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint) { @@ -142,11 +154,11 @@ void HID_Host_USBTask(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo) bool HID_Host_IsReportReceived(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo) { - bool ReportReceived; - - if ((USB_HostState != HOST_STATE_Configured) || !(HIDInterfaceInfo->State.Active)) + if ((USB_HostState != HOST_STATE_Configured) || !(HIDInterfaceInfo->State.IsActive)) return false; + bool ReportReceived; + Pipe_SelectPipe(HIDInterfaceInfo->Config.DataINPipeNumber); Pipe_Unfreeze(); @@ -170,6 +182,9 @@ uint8_t USB_HID_Host_SetProtocol(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, boo Pipe_SelectPipe(PIPE_CONTROLPIPE); + if (UseReportProtocol && !(HIDInterfaceInfo->State.SupportsBootSubClass)) + return MS_ERROR_UNSUPPORTED; + return USB_Host_SendControlRequest(NULL); }