X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/c86491af8b24679984a3fc5effc7675779652e4c..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 dc6997736..11dfb67ad 100644 --- a/LUFA/Drivers/USB/Class/Host/HID.c +++ b/LUFA/Drivers/USB/Class/Host/HID.c @@ -39,7 +39,7 @@ uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint16_t ConfigDescriptorSize, uint8_t* ConfigDescriptorData) { - uint8_t FoundEndpoints = 0; + uint8_t FoundEndpoints = 0; memset(&HIDInterfaceInfo->State, 0x00, sizeof(HIDInterfaceInfo->State)); @@ -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); - while (FoundEndpoints != ((1 << HID_FOUND_DATAPIPE_IN) | (1 << HID_FOUND_DATAPIPE_OUT))) + 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; @@ -85,19 +87,21 @@ uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint { Pipe_ConfigurePipe(HIDInterfaceInfo->Config.DataINPipeNumber, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN, EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE); + HIDInterfaceInfo->State.DataINPipeSize = EndpointData->EndpointSize; - FoundEndpoints |= (1 << HID_FOUND_DATAPIPE_IN); + FoundEndpoints |= HID_FOUND_DATAPIPE_IN; } else { Pipe_ConfigurePipe(HIDInterfaceInfo->Config.DataOUTPipeNumber, EP_TYPE_INTERRUPT, PIPE_TOKEN_OUT, EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE); + HIDInterfaceInfo->State.DataOUTPipeSize = EndpointData->EndpointSize; - FoundEndpoints |= (1 << HID_FOUND_DATAPIPE_OUT); + FoundEndpoints |= HID_FOUND_DATAPIPE_OUT; } } - HIDInterfaceInfo->State.Active = true; + HIDInterfaceInfo->State.IsActive = true; return HID_ENUMERROR_NoError; } @@ -115,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) { @@ -140,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(); @@ -168,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); }