Added support to the CDCHost demo for devices with mutiple CDC interfaces which are...
authorDean Camera <dean@fourwalledcubicle.com>
Tue, 7 Apr 2009 11:46:54 +0000 (11:46 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Tue, 7 Apr 2009 11:46:54 +0000 (11:46 +0000)
Demos/Host/CDCHost/ConfigDescriptor.c
Demos/Host/CDCHost/ConfigDescriptor.h
LUFA/ChangeLog.txt

index eb80ec3..3b919bd 100644 (file)
@@ -69,8 +69,8 @@ uint8_t ProcessConfigurationDescriptor(void)
        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
@@ -83,11 +83,24 @@ uint8_t ProcessConfigurationDescriptor(void)
                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
@@ -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
- *  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
@@ -170,7 +183,23 @@ DESCRIPTOR_COMPARATOR(NextCDCInterface)
                {\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
index 0ba6148..9db4b65 100644 (file)
@@ -77,7 +77,8 @@
                };\r
 \r
        /* Configuration Descriptor Comparison Functions: */\r
-               DESCRIPTOR_COMPARATOR(NextCDCInterface);\r
+               DESCRIPTOR_COMPARATOR(NextCDCControlInterface);\r
+               DESCRIPTOR_COMPARATOR(NextCDCDataInterface);\r
                DESCRIPTOR_COMPARATOR(NextInterfaceCDCDataEndpoint);\r
 \r
        /* Function Prototypes: */\r
index 0b15df0..04b0e97 100644 (file)
@@ -24,6 +24,8 @@
   *    code without having to be itself patched and recompiled first\r
   *  - Added preprocessor checks and documentation to the bootloaders giving information about missing SIGNATURE_x defines due to\r
   *    outdated avr-libc versions.\r
+  *  - Added support to the CDCHost demo for devices with mutiple CDC interfaces which are not the correct ACM type preceeding the desired\r
+  *    ACM CDC interface\r
   *\r
   *  \section Sec_ChangeLog090401 Version 090401\r
   *\r