Fixed LowLevel JoystickHostWithParser demo not saving the chosen HID interface's...
[pub/USBasp.git] / Demos / Host / LowLevel / MouseHostWithParser / ConfigDescriptor.c
index c5afbe4..dc8ada8 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)))
@@ -66,29 +68,11 @@ uint8_t ProcessConfigurationDescriptor(void)
                        return ControlError;
        }
        
-       /* Get the first HID interface from the configuration descriptor */
-       if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
-                                     DComp_NextMouseInterface) != DESCRIPTOR_SEARCH_COMP_Found)
-       {
-               /* Descriptor not found, error out */
-               return NoCompatibleInterfaceFound;
-       }
-
-       /* 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 report size for later use */
-       HIDReportSize = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_HID_t)->HIDReportLength;
-
        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_NextMouseInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
                {
                        /* Get the next HID interface from the configuration descriptor */
@@ -99,6 +83,9 @@ 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)
@@ -107,9 +94,9 @@ uint8_t ProcessConfigurationDescriptor(void)
                                return NoCompatibleInterfaceFound;
                        }
                        
-                       /* Save the HID report size for later use */
-                       HIDReportSize = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_HID_t)->HIDReportLength;                    
-
+                       /* 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;
                }
@@ -127,6 +114,9 @@ uint8_t ProcessConfigurationDescriptor(void)
                           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;
 }