Fixed LowLevel JoystickHostWithParser demo not saving the chosen HID interface's...
authorDean Camera <dean@fourwalledcubicle.com>
Fri, 1 Oct 2010 12:01:54 +0000 (12:01 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Fri, 1 Oct 2010 12:01:54 +0000 (12:01 +0000)
Simplified low level Host demo configuration descriptor parser routines.

15 files changed:
Demos/Host/LowLevel/GenericHIDHost/ConfigDescriptor.c
Demos/Host/LowLevel/JoystickHostWithParser/ConfigDescriptor.c
Demos/Host/LowLevel/KeyboardHost/ConfigDescriptor.c
Demos/Host/LowLevel/KeyboardHostWithParser/ConfigDescriptor.c
Demos/Host/LowLevel/MIDIHost/ConfigDescriptor.c
Demos/Host/LowLevel/MassStorageHost/ConfigDescriptor.c
Demos/Host/LowLevel/MouseHost/ConfigDescriptor.c
Demos/Host/LowLevel/MouseHostWithParser/ConfigDescriptor.c
Demos/Host/LowLevel/PrinterHost/ConfigDescriptor.c
Demos/Host/LowLevel/RNDISEthernetHost/ConfigDescriptor.c
Demos/Host/LowLevel/StillImageHost/ConfigDescriptor.c
Demos/Host/LowLevel/VirtualSerialHost/ConfigDescriptor.c
LUFA/Drivers/USB/Class/Host/MIDI.c
LUFA/Drivers/USB/Class/Host/MassStorage.c
Projects/MissileLauncher/ConfigDescriptor.c

index 2de7b72..093c7db 100644 (file)
@@ -51,8 +51,9 @@ uint8_t ProcessConfigurationDescriptor(void)
        void*    CurrConfigLocation = ConfigDescriptorData;
        uint16_t CurrConfigBytesRem;
        
-       USB_Descriptor_Endpoint_t* DataINEndpoint  = NULL;
-       USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL;
+       USB_Descriptor_Interface_t* HIDInterface    = NULL;
+       USB_Descriptor_Endpoint_t*  DataINEndpoint  = NULL;
+       USB_Descriptor_Endpoint_t*  DataOUTEndpoint = NULL;
 
        /* Retrieve the entire configuration descriptor into the allocated buffer */
        switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
@@ -66,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_NextHIDInterface) != DESCRIPTOR_SEARCH_COMP_Found)
-       {
-               /* Descriptor not found, error out */
-               return NoCompatibleInterfaceFound;
-       }
 
        while (!(DataINEndpoint) || !(DataOUTEndpoint))
        {
-               /* 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_NextHIDInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
                {
                        /* Not all HID devices have an OUT endpoint - if we've reached the end of the HID descriptor
@@ -86,9 +80,6 @@ uint8_t ProcessConfigurationDescriptor(void)
                        if (DataINEndpoint)
                          break;
                        
-                       /* Clear any found endpoints */
-                       DataOUTEndpoint = NULL;
-
                        /* Get the next HID interface from the configuration descriptor */
                        if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                                                                  DComp_NextHIDInterface) != DESCRIPTOR_SEARCH_COMP_Found)
@@ -97,6 +88,12 @@ 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);
+
+                       /* Clear any found endpoints */
+                       DataOUTEndpoint = NULL;
+                       
                        /* Skip the remainder of the loop as we have not found an endpoint yet */
                        continue;
                }
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;
 }
index 988579c..e1e32ed 100644 (file)
@@ -51,7 +51,8 @@ uint8_t ProcessConfigurationDescriptor(void)
        void*    CurrConfigLocation = ConfigDescriptorData;
        uint16_t CurrConfigBytesRem;
        
-       USB_Descriptor_Endpoint_t* DataINEndpoint = NULL;
+       USB_Descriptor_Interface_t* HIDInterface   = 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,18 +67,11 @@ uint8_t ProcessConfigurationDescriptor(void)
                        return ControlError;
        }
        
-       /* Get the first HID interface from the configuration descriptor */
-       if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
-                                     DComp_NextKeyboardInterface) != 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_NextKeyboardInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
                {
                        /* Get the next HID interface from the configuration descriptor */
@@ -88,6 +82,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);
+
                        /* Skip the remainder of the loop as we have not found an endpoint yet */
                        continue;
                }
index bf2c4e0..74817a2 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,30 +67,12 @@ uint8_t ProcessConfigurationDescriptor(void)
                default:
                        return ControlError;
        }
-       
-       /* Get the first HID interface from the configuration descriptor */
-       if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
-                                     DComp_NextKeyboardInterface) != 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_NextKeyboardInterfaceDataEndpoint) != 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;
 }
index 7dda634..7feb312 100644 (file)
@@ -51,8 +51,9 @@ uint8_t ProcessConfigurationDescriptor(void)
        void*    CurrConfigLocation = ConfigDescriptorData;
        uint16_t CurrConfigBytesRem;
        
-       USB_Descriptor_Endpoint_t* DataINEndpoint  = NULL;
-       USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL;
+       USB_Descriptor_Interface_t* MIDIInterface   = NULL;
+       USB_Descriptor_Endpoint_t*  DataINEndpoint  = NULL;
+       USB_Descriptor_Endpoint_t*  DataOUTEndpoint = NULL;
 
        /* Retrieve the entire configuration descriptor into the allocated buffer */
        switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
@@ -67,24 +68,13 @@ uint8_t ProcessConfigurationDescriptor(void)
                        return ControlError;
        }
        
-       /* Get the first MIDI interface from the configuration descriptor */
-       if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
-                                     DComp_NextMIDIStreamingInterface) != DESCRIPTOR_SEARCH_COMP_Found)
-       {
-               /* Descriptor not found, error out */
-               return NoCompatibleInterfaceFound;
-       }
-
        while (!(DataINEndpoint) || !(DataOUTEndpoint))
        {
-               /* Get the next MIDI 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 (!(MIDIInterface) ||
+                   USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                              DComp_NextMIDIStreamingDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
                {
-                       /* Clear any found endpoints */
-                       DataINEndpoint  = NULL;
-                       DataOUTEndpoint = NULL;
-
                        /* Get the next Mass Storage interface from the configuration descriptor */
                        if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                                                                  DComp_NextMIDIStreamingInterface) != DESCRIPTOR_SEARCH_COMP_Found)
@@ -93,6 +83,13 @@ uint8_t ProcessConfigurationDescriptor(void)
                                return NoCompatibleInterfaceFound;
                        }
 
+                       /* Save the interface in case we need to refer back to it later */
+                       MIDIInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
+
+                       /* Clear any found endpoints */
+                       DataINEndpoint  = NULL;
+                       DataOUTEndpoint = NULL;
+
                        /* Skip the remainder of the loop as we have not found an endpoint yet */
                        continue;
                }
@@ -102,7 +99,7 @@ uint8_t ProcessConfigurationDescriptor(void)
 
                /* If the endpoint is a IN type endpoint */
                if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
-                 DataINEndpoint = EndpointData;
+                 DataINEndpoint  = EndpointData;
                else
                  DataOUTEndpoint = EndpointData;
        }
index a91d61a..3468e0d 100644 (file)
@@ -51,8 +51,9 @@ uint8_t ProcessConfigurationDescriptor(void)
        void*    CurrConfigLocation = ConfigDescriptorData;
        uint16_t CurrConfigBytesRem;
        
-       USB_Descriptor_Endpoint_t* DataINEndpoint  = NULL;
-       USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL;
+       USB_Descriptor_Interface_t* MSInterface     = NULL;
+       USB_Descriptor_Endpoint_t*  DataINEndpoint  = NULL;
+       USB_Descriptor_Endpoint_t*  DataOUTEndpoint = NULL;
 
        /* Retrieve the entire configuration descriptor into the allocated buffer */
        switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
@@ -66,25 +67,14 @@ uint8_t ProcessConfigurationDescriptor(void)
                default:
                        return ControlError;
        }
-       
-       /* Get the first Mass Storage interface from the configuration descriptor */
-       if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
-                                     DComp_NextMSInterface) != DESCRIPTOR_SEARCH_COMP_Found)
-       {
-               /* Descriptor not found, error out */
-               return NoCompatibleInterfaceFound;
-       }
 
        while (!(DataINEndpoint) || !(DataOUTEndpoint))
        {
-               /* Get the next Mass Storage 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 (!(MSInterface) ||
+                   USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                              DComp_NextMSInterfaceBulkDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
                {
-                       /* Clear any found endpoints */
-                       DataINEndpoint  = NULL;
-                       DataOUTEndpoint = NULL;
-
                        /* Get the next Mass Storage interface from the configuration descriptor */
                        if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                                                                  DComp_NextMSInterface) != DESCRIPTOR_SEARCH_COMP_Found)
@@ -93,6 +83,13 @@ uint8_t ProcessConfigurationDescriptor(void)
                                return NoCompatibleInterfaceFound;
                        }
 
+                       /* Save the interface in case we need to refer back to it later */
+                       MSInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
+
+                       /* Clear any found endpoints */
+                       DataINEndpoint  = NULL;
+                       DataOUTEndpoint = NULL;
+
                        /* Skip the remainder of the loop as we have not found an endpoint yet */
                        continue;
                }
@@ -102,7 +99,7 @@ uint8_t ProcessConfigurationDescriptor(void)
 
                /* If the endpoint is a IN type endpoint */
                if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
-                 DataINEndpoint = EndpointData;
+                 DataINEndpoint  = EndpointData;
                else
                  DataOUTEndpoint = EndpointData;
        }
index 4ea8aef..b5d6223 100644 (file)
@@ -51,7 +51,8 @@ uint8_t ProcessConfigurationDescriptor(void)
        void*    CurrConfigLocation = ConfigDescriptorData;
        uint16_t CurrConfigBytesRem;
        
-       USB_Descriptor_Endpoint_t* DataINEndpoint = NULL;
+       USB_Descriptor_Interface_t* HIDInterface   = 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 +66,12 @@ uint8_t ProcessConfigurationDescriptor(void)
                default:
                        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;
-       }
 
        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 */
@@ -88,6 +82,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);
+
                        /* Skip the remainder of the loop as we have not found an endpoint yet */
                        continue;
                }
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;
 }
index b16ac66..89bf488 100644 (file)
@@ -50,8 +50,9 @@ uint8_t ProcessConfigurationDescriptor(void)
        void*    CurrConfigLocation = ConfigDescriptorData;
        uint16_t CurrConfigBytesRem;
        
-       USB_Descriptor_Endpoint_t* DataINEndpoint  = NULL;
-       USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL;
+       USB_Descriptor_Interface_t* PrinterInterface = NULL;
+       USB_Descriptor_Endpoint_t*  DataINEndpoint   = NULL;
+       USB_Descriptor_Endpoint_t*  DataOUTEndpoint  = NULL;
 
        /* Retrieve the entire configuration descriptor into the allocated buffer */
        switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
@@ -66,28 +67,13 @@ uint8_t ProcessConfigurationDescriptor(void)
                        return ControlError;
        }
        
-       /* Get the first Printer interface from the configuration descriptor */
-       if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
-                                     DComp_NextBidirectionalPrinterInterface) != DESCRIPTOR_SEARCH_COMP_Found)
-       {
-               /* Descriptor not found, error out */
-               return NoCompatibleInterfaceFound;
-       }
-
-       /* Save Printer interface details for later use */
-       PrinterInterfaceNumber = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t)->InterfaceNumber;
-       PrinterAltSetting      = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t)->AlternateSetting;
-
        while (!(DataINEndpoint) || !(DataOUTEndpoint))
        {
-               /* Get the next Printer 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 (!(PrinterInterface) ||
+                   USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                              DComp_NextPrinterInterfaceBulkDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
                {
-                       /* Clear any found endpoints */
-                       DataINEndpoint  = NULL;
-                       DataOUTEndpoint = NULL;
-
                        /* Get the next Printer interface from the configuration descriptor */
                        if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                                                                  DComp_NextBidirectionalPrinterInterface) != DESCRIPTOR_SEARCH_COMP_Found)
@@ -96,9 +82,12 @@ uint8_t ProcessConfigurationDescriptor(void)
                                return NoCompatibleInterfaceFound;
                        }
                        
-                       /* Save Printer interface details for later use */
-                       PrinterInterfaceNumber = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t)->InterfaceNumber;
-                       PrinterAltSetting      = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t)->AlternateSetting;                    
+                       /* Save the interface in case we need to refer back to it later */
+                       PrinterInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
+
+                       /* Clear any found endpoints */
+                       DataINEndpoint  = NULL;
+                       DataOUTEndpoint = NULL;
 
                        /* Skip the remainder of the loop as we have not found an endpoint yet */
                        continue;
@@ -114,6 +103,10 @@ uint8_t ProcessConfigurationDescriptor(void)
                  DataOUTEndpoint = EndpointData;
        }
        
+       /* Save Printer interface details for later use */
+       PrinterInterfaceNumber = PrinterInterface->InterfaceNumber;
+       PrinterAltSetting      = PrinterInterface->AlternateSetting;                    
+
        /* Configure the Printer data IN pipe */
        Pipe_ConfigurePipe(PRINTER_DATA_IN_PIPE, EP_TYPE_BULK, PIPE_TOKEN_IN,
                           DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_SINGLE);
index aa75dd1..58e1408 100644 (file)
@@ -51,9 +51,10 @@ uint8_t ProcessConfigurationDescriptor(void)
        void*    CurrConfigLocation = ConfigDescriptorData;
        uint16_t CurrConfigBytesRem;
        
-       USB_Descriptor_Endpoint_t* DataINEndpoint       = NULL;
-       USB_Descriptor_Endpoint_t* DataOUTEndpoint      = NULL;
-       USB_Descriptor_Endpoint_t* NotificationEndpoint = NULL;
+       USB_Descriptor_Interface_t* RNDISControlInterface  = NULL;
+       USB_Descriptor_Endpoint_t*  DataINEndpoint         = NULL;
+       USB_Descriptor_Endpoint_t*  DataOUTEndpoint        = NULL;
+       USB_Descriptor_Endpoint_t*  NotificationEndpoint   = NULL;
 
        /* Retrieve the entire configuration descriptor into the allocated buffer */
        switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
@@ -67,19 +68,12 @@ uint8_t ProcessConfigurationDescriptor(void)
                default:
                        return ControlError;
        }
-       
-       /* Get the first RNDIS control interface from the configuration descriptor */
-       if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
-                                     DComp_NextCDCControlInterface) != DESCRIPTOR_SEARCH_COMP_Found)
-       {
-               /* Descriptor not found, error out */
-               return NoCompatibleInterfaceFound;
-       }
 
        while (!(DataINEndpoint) || !(DataOUTEndpoint) || !(NotificationEndpoint))
        {
-               /* Get the next RNDIS interface's 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 (!(RNDISControlInterface) ||
+                   USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                              DComp_NextCDCDataInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
                {
                        /* Check if we have already found the control interface's notification endpoint or not */
@@ -107,6 +101,9 @@ uint8_t ProcessConfigurationDescriptor(void)
                                        return NoCompatibleInterfaceFound;
                                }
 
+                               /* Save the interface in case we need to refer back to it later */
+                               RNDISControlInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
+
                                /* Clear any found endpoints */
                                NotificationEndpoint = NULL;
                        }
index 78bca7f..d11dee0 100644 (file)
@@ -51,9 +51,10 @@ uint8_t ProcessConfigurationDescriptor(void)
        void*    CurrConfigLocation = ConfigDescriptorData;
        uint16_t CurrConfigBytesRem;
        
-       USB_Descriptor_Endpoint_t* DataINEndpoint  = NULL;
-       USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL;
-       USB_Descriptor_Endpoint_t* EventsEndpoint  = NULL;
+       USB_Descriptor_Interface_t* StillImageInterface = NULL;
+       USB_Descriptor_Endpoint_t*  DataINEndpoint      = NULL;
+       USB_Descriptor_Endpoint_t*  DataOUTEndpoint     = NULL;
+       USB_Descriptor_Endpoint_t*  EventsEndpoint      = NULL;
 
        /* Retrieve the entire configuration descriptor into the allocated buffer */
        switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
@@ -67,26 +68,14 @@ uint8_t ProcessConfigurationDescriptor(void)
                default:
                        return ControlError;
        }
-       
-       /* Get the first Still Image interface from the configuration descriptor */
-       if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
-                                     DComp_NextStillImageInterface) != DESCRIPTOR_SEARCH_COMP_Found)
-       {
-               /* Descriptor not found, error out */
-               return NoCompatibleInterfaceFound;
-       }
 
        while (!(DataINEndpoint) || !(DataOUTEndpoint))
        {
-               /* Get the next Still Image 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 (!(StillImageInterface) ||
+                   USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                              DComp_NextStillImageInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
                {
-                       /* Clear any found endpoints */
-                       DataINEndpoint  = NULL;
-                       DataOUTEndpoint = NULL;
-                       EventsEndpoint  = NULL;
-
                        /* Get the next Still Image interface from the configuration descriptor */
                        if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                                                                  DComp_NextStillImageInterface) != DESCRIPTOR_SEARCH_COMP_Found)
@@ -95,6 +84,14 @@ uint8_t ProcessConfigurationDescriptor(void)
                                return NoCompatibleInterfaceFound;
                        }
 
+                       /* Save the interface in case we need to refer back to it later */
+                       StillImageInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
+
+                       /* Clear any found endpoints */
+                       DataINEndpoint  = NULL;
+                       DataOUTEndpoint = NULL;
+                       EventsEndpoint  = NULL;
+
                        /* Skip the remainder of the loop as we have not found an endpoint yet */
                        continue;
                }
index a26fa5c..7d9fb38 100644 (file)
@@ -51,9 +51,10 @@ uint8_t ProcessConfigurationDescriptor(void)
        void*    CurrConfigLocation = ConfigDescriptorData;
        uint16_t CurrConfigBytesRem;
        
-       USB_Descriptor_Endpoint_t* DataINEndpoint       = NULL;
-       USB_Descriptor_Endpoint_t* DataOUTEndpoint      = NULL;
-       USB_Descriptor_Endpoint_t* NotificationEndpoint = NULL;
+       USB_Descriptor_Interface_t* CDCControlInterface  = NULL;
+       USB_Descriptor_Endpoint_t*  DataINEndpoint       = NULL;
+       USB_Descriptor_Endpoint_t*  DataOUTEndpoint      = NULL;
+       USB_Descriptor_Endpoint_t*  NotificationEndpoint = NULL;
 
        /* Retrieve the entire configuration descriptor into the allocated buffer */
        switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
@@ -67,19 +68,12 @@ uint8_t ProcessConfigurationDescriptor(void)
                default:
                        return ControlError;
        }
-       
-       /* Get the first CDC control interface from the configuration descriptor */
-       if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
-                                     DComp_NextCDCControlInterface) != DESCRIPTOR_SEARCH_COMP_Found)
-       {
-               /* Descriptor not found, error out */
-               return NoCompatibleInterfaceFound;
-       }
 
        while (!(DataINEndpoint) || !(DataOUTEndpoint) || !(NotificationEndpoint))
        {
-               /* Get the next CDC interface's 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 (!(CDCControlInterface) ||
+                   USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                              DComp_NextCDCDataInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
                {
                        /* Check if we have already found the control interface's notification endpoint or not */
@@ -107,6 +101,9 @@ uint8_t ProcessConfigurationDescriptor(void)
                                        return NoCompatibleInterfaceFound;
                                }
 
+                               /* Save the interface in case we need to refer back to it later */
+                               CDCControlInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
+
                                /* Clear any found endpoints */
                                NotificationEndpoint = NULL;
                        }
index 904e1fe..3d844c2 100644 (file)
@@ -72,7 +72,7 @@ uint8_t MIDI_Host_ConfigurePipes(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceI
                USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t);
 
                if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
-                 DataINEndpoint = EndpointData;
+                 DataINEndpoint  = EndpointData;
                else
                  DataOUTEndpoint = EndpointData;
        }
index 0a966cf..2d7956e 100644 (file)
@@ -72,7 +72,7 @@ uint8_t MS_Host_ConfigurePipes(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
                USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t);
 
                if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
-                 DataINEndpoint = EndpointData;
+                 DataINEndpoint  = EndpointData;
                else
                  DataOUTEndpoint = EndpointData;
        }
index 78b4d2f..7ee2449 100644 (file)
@@ -51,8 +51,9 @@ uint8_t ProcessConfigurationDescriptor(void)
        void*    CurrConfigLocation = ConfigDescriptorData;
        uint16_t CurrConfigBytesRem;
        
-       USB_Descriptor_Endpoint_t* DataINEndpoint  = NULL;
-       USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL;
+       USB_Descriptor_Interface_t* HIDInterface    = NULL;
+       USB_Descriptor_Endpoint_t*  DataINEndpoint  = NULL;
+       USB_Descriptor_Endpoint_t*  DataOUTEndpoint = NULL;
 
        /* Retrieve the entire configuration descriptor into the allocated buffer */
        switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
@@ -66,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_NextHIDInterface) != DESCRIPTOR_SEARCH_COMP_Found)
-       {
-               /* Descriptor not found, error out */
-               return NoCompatibleInterfaceFound;
-       }
 
        while (!(DataINEndpoint) || !(DataOUTEndpoint))
        {
-               /* 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_NextHIDInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
                {
                        /* Not all HID devices have an OUT endpoint - if we've reached the end of the HID descriptor
@@ -86,9 +80,6 @@ uint8_t ProcessConfigurationDescriptor(void)
                        if (DataINEndpoint)
                          break;
                        
-                       /* Clear any found endpoints */
-                       DataOUTEndpoint = NULL;
-
                        /* Get the next HID interface from the configuration descriptor */
                        if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
                                                                                  DComp_NextHIDInterface) != DESCRIPTOR_SEARCH_COMP_Found)
@@ -97,6 +88,12 @@ 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);
+
+                       /* Clear any found endpoints */
+                       DataOUTEndpoint = NULL;
+
                        /* Skip the remainder of the loop as we have not found an endpoint yet */
                        continue;
                }