Synchronise with the 090605 release.
[pub/USBasp.git] / Demos / Host / CDCHost / ConfigDescriptor.c
index 972d3e6..baf02a2 100644 (file)
@@ -70,7 +70,8 @@ uint8_t ProcessConfigurationDescriptor(void)
          return InvalidConfigDataReturned;\r
        \r
        /* Get the CDC control interface from the configuration descriptor */\r
-       if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, NextCDCControlInterface))\r
+       if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,\r
+                                     DComp_NextCDCControlInterface) != DESCRIPTOR_SEARCH_COMP_Found)\r
        {\r
                /* Descriptor not found, error out */\r
                return NoCDCInterfaceFound;\r
@@ -81,13 +82,14 @@ uint8_t ProcessConfigurationDescriptor(void)
        {\r
                /* Fetch the next bulk or interrupt endpoint from the current CDC interface */\r
                if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,\r
-                                                  NextInterfaceCDCDataEndpoint))\r
+                                             DComp_NextInterfaceCDCDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)\r
                {\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
                                /* Get the next CDC data interface from the configuration descriptor (CDC class has two CDC interfaces) */\r
-                               if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, NextCDCDataInterface))\r
+                               if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, \r
+                                                             DComp_NextCDCDataInterface) != DESCRIPTOR_SEARCH_COMP_Found)\r
                                {\r
                                        /* Descriptor not found, error out */\r
                                        return NoCDCInterfaceFound;\r
@@ -95,8 +97,20 @@ uint8_t ProcessConfigurationDescriptor(void)
                        }\r
                        else\r
                        {\r
+                               /* Clear the found endpoints mask, since any already processed endpoints aren't in the CDC interface we need */\r
+                               FoundEndpoints = 0;\r
+\r
+                               /* Disable any already configured pipes from the invalid CDC interfaces */\r
+                               Pipe_SelectPipe(CDC_NOTIFICATIONPIPE);\r
+                               Pipe_DisablePipe();\r
+                               Pipe_SelectPipe(CDC_DATAPIPE_IN);\r
+                               Pipe_DisablePipe();\r
+                               Pipe_SelectPipe(CDC_DATAPIPE_OUT);\r
+                               Pipe_DisablePipe();\r
+                       \r
                                /* Get the next CDC control interface from the configuration descriptor (CDC class has two CDC interfaces) */\r
-                               if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, NextCDCControlInterface))\r
+                               if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,\r
+                                                             DComp_NextCDCControlInterface) != DESCRIPTOR_SEARCH_COMP_Found)\r
                                {\r
                                        /* Descriptor not found, error out */\r
                                        return NoCDCInterfaceFound;\r
@@ -105,7 +119,7 @@ uint8_t ProcessConfigurationDescriptor(void)
 \r
                        /* Fetch the next bulk or interrupt endpoint from the current CDC interface */\r
                        if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,\r
-                                                                                          NextInterfaceCDCDataEndpoint))\r
+                                                     DComp_NextInterfaceCDCDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)\r
                        {\r
                                /* Descriptor not found, error out */\r
                                return NoEndpointFound;\r
@@ -172,7 +186,7 @@ uint8_t ProcessConfigurationDescriptor(void)
  *\r
  *  \return A value from the DSEARCH_Return_ErrorCodes_t enum\r
  */\r
-DESCRIPTOR_COMPARATOR(NextCDCControlInterface)\r
+uint8_t DComp_NextCDCControlInterface(void* CurrentDescriptor)\r
 {\r
        if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface)\r
        {\r
@@ -181,11 +195,11 @@ DESCRIPTOR_COMPARATOR(NextCDCControlInterface)
                    (DESCRIPTOR_CAST(CurrentDescriptor, USB_Descriptor_Interface_t).SubClass == CDC_CONTROL_SUBCLASS) &&\r
                    (DESCRIPTOR_CAST(CurrentDescriptor, USB_Descriptor_Interface_t).Protocol == CDC_CONTROL_PROTOCOL))\r
                {\r
-                       return Descriptor_Search_Found;\r
+                       return DESCRIPTOR_SEARCH_Found;\r
                }\r
        }\r
        \r
-       return Descriptor_Search_NotFound;\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
@@ -196,7 +210,7 @@ DESCRIPTOR_COMPARATOR(NextCDCControlInterface)
  *\r
  *  \return A value from the DSEARCH_Return_ErrorCodes_t enum\r
  */\r
-DESCRIPTOR_COMPARATOR(NextCDCDataInterface)\r
+uint8_t DComp_NextCDCDataInterface(void* CurrentDescriptor)\r
 {\r
        if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface)\r
        {\r
@@ -205,11 +219,11 @@ DESCRIPTOR_COMPARATOR(NextCDCDataInterface)
                    (DESCRIPTOR_CAST(CurrentDescriptor, USB_Descriptor_Interface_t).SubClass == CDC_DATA_SUBCLASS) &&\r
                    (DESCRIPTOR_CAST(CurrentDescriptor, USB_Descriptor_Interface_t).Protocol == CDC_DATA_PROTOCOL))\r
                {\r
-                       return Descriptor_Search_Found;\r
+                       return DESCRIPTOR_SEARCH_Found;\r
                }\r
        }\r
        \r
-       return Descriptor_Search_NotFound;\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
@@ -222,7 +236,7 @@ DESCRIPTOR_COMPARATOR(NextCDCDataInterface)
  *\r
  *  \return A value from the DSEARCH_Return_ErrorCodes_t enum\r
  */\r
-DESCRIPTOR_COMPARATOR(NextInterfaceCDCDataEndpoint)\r
+uint8_t DComp_NextInterfaceCDCDataEndpoint(void* CurrentDescriptor)\r
 {\r
        if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint)\r
        {\r
@@ -230,12 +244,12 @@ DESCRIPTOR_COMPARATOR(NextInterfaceCDCDataEndpoint)
                                                        USB_Descriptor_Endpoint_t).Attributes & EP_TYPE_MASK);\r
        \r
                if ((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT))\r
-                 return Descriptor_Search_Found;\r
+                 return DESCRIPTOR_SEARCH_Found;\r
        }\r
        else if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface)\r
        {\r
-               return Descriptor_Search_Fail;\r
+               return DESCRIPTOR_SEARCH_Fail;\r
        }\r
 \r
-       return Descriptor_Search_NotFound;\r
+       return DESCRIPTOR_SEARCH_NotFound;\r
 }\r