Fixed LowLevel JoystickHostWithParser demo not saving the chosen HID interface's...
[pub/USBasp.git] / Demos / Host / LowLevel / JoystickHostWithParser / ConfigDescriptor.c
index 1d82650..3eaf7d9 100644 (file)
@@ -51,7 +51,9 @@ uint8_t ProcessConfigurationDescriptor(void)
        void*    CurrConfigLocation = ConfigDescriptorData;
        uint16_t CurrConfigBytesRem;
        
-       USB_Descriptor_Endpoint_t* DataINEndpoint = NULL;
+       USB_Descriptor_Interface_t* HIDInterface   = NULL;
+       USB_Descriptor_HID_t*       HIDDescriptor  = NULL;
+       USB_Descriptor_Endpoint_t*  DataINEndpoint = NULL;
 
        /* Retrieve the entire configuration descriptor into the allocated buffer */
        switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
@@ -65,19 +67,12 @@ uint8_t ProcessConfigurationDescriptor(void)
                default:
                        return ControlError;
        }
-       
-       /* Get the first HID interface from the configuration descriptor */
-       if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
-                                     DComp_NextJoystickInterface) != DESCRIPTOR_SEARCH_COMP_Found)
-       {
-               /* Descriptor not found, error out */
-               return NoCompatibleInterfaceFound;
-       }
 
        while (!(DataINEndpoint))
        {
-               /* Get the next HID interface's data endpoint descriptor */
-               if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
+               /* See if we've found a likely compatible interface, and if there is an endpoint within that interface */
+               if (!(HIDInterface) ||
+                   USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                              DComp_NextJoystickInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
                {
                        /* Get the next HID interface from the configuration descriptor */
@@ -88,6 +83,20 @@ uint8_t ProcessConfigurationDescriptor(void)
                                return NoCompatibleInterfaceFound;
                        }
 
+                       /* Save the interface in case we need to refer back to it later */
+                       HIDInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
+
+                       /* Get the HID descriptor from the configuration descriptor */
+                       if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
+                                                                                 DComp_NextHID) != DESCRIPTOR_SEARCH_COMP_Found)
+                       {
+                               /* Descriptor not found, error out */
+                               return NoCompatibleInterfaceFound;
+                       }
+
+                       /* Save the HID descriptor for later use */
+                       HIDDescriptor = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_HID_t);     
+
                        /* Skip the remainder of the loop as we have not found an endpoint yet */
                        continue;
                }
@@ -104,7 +113,10 @@ uint8_t ProcessConfigurationDescriptor(void)
        Pipe_ConfigurePipe(JOYSTICK_DATA_IN_PIPE, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN,
                           DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_SINGLE);
        Pipe_SetInterruptPeriod(DataINEndpoint->PollingIntervalMS);
-                       
+
+       /* Get the HID report size from the HID report descriptor */
+       HIDReportSize = HIDDescriptor->HIDReportLength;
+
        /* Valid data found, return success */
        return SuccessfulConfigRead;
 }