Added support to the CDCHost demo for devices with mutiple CDC interfaces which are...
[pub/USBasp.git] / Demos / Host / CDCHost / ConfigDescriptor.c
index eb80ec3..3b919bd 100644 (file)
@@ -69,8 +69,8 @@ uint8_t ProcessConfigurationDescriptor(void)
        if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)\r
          return InvalidConfigDataReturned;\r
        \r
        if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)\r
          return InvalidConfigDataReturned;\r
        \r
-       /* Get the CDC interface from the configuration descriptor */\r
-       if (USB_Host_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, NextCDCInterface))\r
+       /* Get the CDC control interface from the configuration descriptor */\r
+       if (USB_Host_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, NextCDCControlInterface))\r
        {\r
                /* Descriptor not found, error out */\r
                return NoCDCInterfaceFound;\r
        {\r
                /* Descriptor not found, error out */\r
                return NoCDCInterfaceFound;\r
@@ -83,11 +83,24 @@ uint8_t ProcessConfigurationDescriptor(void)
                if (USB_Host_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,\r
                                                   NextInterfaceCDCDataEndpoint))\r
                {\r
                if (USB_Host_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,\r
                                                   NextInterfaceCDCDataEndpoint))\r
                {\r
-                       /* Get the next CDC interface from the configuration descriptor (CDC class has two CDC interfaces) */\r
-                       if (USB_Host_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, NextCDCInterface))\r
+                       /* Check to see if the control interface's notification pipe has been found, if so search for the data interface */\r
+                       if (FoundEndpoints & (1 << CDC_NOTIFICATIONPIPE))\r
                        {\r
                        {\r
-                               /* Descriptor not found, error out */\r
-                               return NoCDCInterfaceFound;\r
+                               /* Get the next CDC data interface from the configuration descriptor (CDC class has two CDC interfaces) */\r
+                               if (USB_Host_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, NextCDCDataInterface))\r
+                               {\r
+                                       /* Descriptor not found, error out */\r
+                                       return NoCDCInterfaceFound;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               /* Get the next CDC control interface from the configuration descriptor (CDC class has two CDC interfaces) */\r
+                               if (USB_Host_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, NextCDCControlInterface))\r
+                               {\r
+                                       /* Descriptor not found, error out */\r
+                                       return NoCDCInterfaceFound;\r
+                               }\r
                        }\r
 \r
                        /* Fetch the next bulk or interrupt endpoint from the current CDC interface */\r
                        }\r
 \r
                        /* Fetch the next bulk or interrupt endpoint from the current CDC interface */\r
@@ -155,11 +168,11 @@ uint8_t ProcessConfigurationDescriptor(void)
  *  configuration descriptor, to search for a specific sub descriptor. It can also be used to abort the configuration\r
  *  descriptor processing if an incompatible descriptor configuration is found.\r
  *\r
  *  configuration descriptor, to search for a specific sub descriptor. It can also be used to abort the configuration\r
  *  descriptor processing if an incompatible descriptor configuration is found.\r
  *\r
- *  This comparator searches for the next Interface descriptor of the correct CDC Class, Subclass and Protocol values.\r
+ *  This comparator searches for the next Interface descriptor of the correct CDC control Class, Subclass and Protocol values.\r
  *\r
  *  \return A value from the DSEARCH_Return_ErrorCodes_t enum\r
  */\r
  *\r
  *  \return A value from the DSEARCH_Return_ErrorCodes_t enum\r
  */\r
-DESCRIPTOR_COMPARATOR(NextCDCInterface)\r
+DESCRIPTOR_COMPARATOR(NextCDCControlInterface)\r
 {\r
        if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface)\r
        {\r
 {\r
        if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface)\r
        {\r
@@ -170,7 +183,23 @@ DESCRIPTOR_COMPARATOR(NextCDCInterface)
                {\r
                        return Descriptor_Search_Found;\r
                }\r
                {\r
                        return Descriptor_Search_Found;\r
                }\r
+       }\r
+       \r
+       return Descriptor_Search_NotFound;\r
+}\r
 \r
 \r
+/** Descriptor comparator function. This comparator function is can be called while processing an attached USB device's\r
+ *  configuration descriptor, to search for a specific sub descriptor. It can also be used to abort the configuration\r
+ *  descriptor processing if an incompatible descriptor configuration is found.\r
+ *\r
+ *  This comparator searches for the next Interface descriptor of the correct CDC data Class, Subclass and Protocol values.\r
+ *\r
+ *  \return A value from the DSEARCH_Return_ErrorCodes_t enum\r
+ */\r
+DESCRIPTOR_COMPARATOR(NextCDCDataInterface)\r
+{\r
+       if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface)\r
+       {\r
                /* Check the CDC descriptor class, subclass and protocol, break out if correct data interface found */\r
                if ((DESCRIPTOR_CAST(CurrentDescriptor, USB_Descriptor_Interface_t).Class    == CDC_DATA_CLASS)    &&\r
                    (DESCRIPTOR_CAST(CurrentDescriptor, USB_Descriptor_Interface_t).SubClass == CDC_DATA_SUBCLASS) &&\r
                /* Check the CDC descriptor class, subclass and protocol, break out if correct data interface found */\r
                if ((DESCRIPTOR_CAST(CurrentDescriptor, USB_Descriptor_Interface_t).Class    == CDC_DATA_CLASS)    &&\r
                    (DESCRIPTOR_CAST(CurrentDescriptor, USB_Descriptor_Interface_t).SubClass == CDC_DATA_SUBCLASS) &&\r