Add new MouseHost Class Driver demo, unfinished, to allow for better testing of the...
[pub/USBasp.git] / LUFA / Drivers / USB / Class / Host / HID.c
index 99e44a4..4f013d5 100644 (file)
 #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