#include "../../HighLevel/USBMode.h"\r
#if defined(USB_CAN_BE_HOST)\r
\r
+#define INCLUDE_FROM_HID_CLASS_HOST_C\r
#include "HID.h"\r
\r
+uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint16_t MaxConfigBufferSize)\r
+{\r
+ uint8_t* ConfigDescriptorData;\r
+ uint16_t ConfigDescriptorSize;\r
+ uint8_t FoundEndpoints = 0;\r
+\r
+ if (USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful)\r
+ return HID_ENUMERROR_ControlError;\r
+ \r
+ if (ConfigDescriptorSize > MaxConfigBufferSize)\r
+ return HID_ENUMERROR_DescriptorTooLarge;\r
+ \r
+ ConfigDescriptorData = alloca(ConfigDescriptorSize);\r
+\r
+ USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData);\r
+ \r
+ if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)\r
+ return HID_ENUMERROR_InvalidConfigDataReturned;\r
+ \r
+ do\r
+ {\r
+ if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,\r
+ DComp_HID_Host_NextHIDInterface) != DESCRIPTOR_SEARCH_COMP_Found)\r
+ {\r
+ return HID_ENUMERROR_NoHIDInterfaceFound;\r
+ }\r
+ } while (HIDInterfaceInfo->Config.MatchInterfaceProtocol &&\r
+ DESCRIPTOR_PCAST(ConfigDescriptorData,\r
+ USB_Descriptor_Interface_t)->HIDInterfaceProtocol != HIDInterfaceInfo->Config.Protocol);\r
+\r
+ while (FoundEndpoints != ((1 << HID_FOUND_DATAPIPE_IN) | (1 << HID_FOUND_DATAPIPE_OUT)))\r
+ {\r
+ if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,\r
+ DComp_HID_Host_NextInterfaceHIDDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)\r
+ {\r
+ if (FoundEndpoints == (1 << HID_FOUND_DATAPIPE_IN))\r
+ break;\r
+ \r
+ return HID_ENUMERROR_EndpointsNotFound;\r
+ }\r
+ \r
+ USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t);\r
+\r
+ if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)\r
+ {\r
+ Pipe_ConfigurePipe(HIDInterfaceInfo->Config.DataINPipeNumber, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN,\r
+ EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE);\r
+ \r
+ FoundEndpoints |= (1 << HID_FOUND_DATAPIPE_IN);\r
+ }\r
+ else\r
+ {\r
+ Pipe_ConfigurePipe(HIDInterfaceInfo->Config.DataOUTPipeNumber, EP_TYPE_INTERRUPT, PIPE_TOKEN_OUT,\r
+ EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE);\r
+ \r
+ FoundEndpoints |= (1 << HID_FOUND_DATAPIPE_OUT); \r
+ }\r
+ }\r
+\r
+ return HID_ENUMERROR_NoError;\r
+}\r
+\r
+static uint8_t DComp_HID_Host_NextHIDInterface(void* CurrentDescriptor)\r
+{\r
+ if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface)\r
+ {\r
+ USB_Descriptor_Interface_t* CurrentInterface = DESCRIPTOR_PCAST(CurrentDescriptor,\r
+ USB_Descriptor_Interface_t);\r
+ \r
+ if (CurrentInterface->Class == HID_INTERFACE_CLASS)\r
+ return DESCRIPTOR_SEARCH_Found;\r
+ }\r
+ \r
+ return DESCRIPTOR_SEARCH_NotFound;\r
+}\r
+\r
+static uint8_t DComp_HID_Host_NextInterfaceHIDDataEndpoint(void* CurrentDescriptor)\r
+{\r
+ if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint)\r
+ {\r
+ USB_Descriptor_Endpoint_t* CurrentEndpoint = DESCRIPTOR_PCAST(CurrentDescriptor,\r
+ USB_Descriptor_Endpoint_t); \r
+\r
+ if (!(Pipe_IsEndpointBound(CurrentEndpoint->EndpointAddress)))\r
+ return DESCRIPTOR_SEARCH_Found;\r
+ }\r
+ else if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface)\r
+ {\r
+ return DESCRIPTOR_SEARCH_Fail;\r
+ }\r
+\r
+ return DESCRIPTOR_SEARCH_NotFound;\r
+}\r
+\r
+void HID_Host_USBTask(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo)\r
+{\r
+\r
+}\r
+\r
#endif\r