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
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
- /* 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
* 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
-DESCRIPTOR_COMPARATOR(NextCDCInterface)\r
+DESCRIPTOR_COMPARATOR(NextCDCControlInterface)\r
{\r
if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface)\r
{\r
{\r
return Descriptor_Search_Found;\r
}\r
+ }\r
+ \r
+ return Descriptor_Search_NotFound;\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