Corrected new Pipe_IsEndpointBound() function.
authorDean Camera <dean@fourwalledcubicle.com>
Sun, 26 Jul 2009 10:45:33 +0000 (10:45 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Sun, 26 Jul 2009 10:45:33 +0000 (10:45 +0000)
Completed host CDC class driver enumeration code.

Demos/Host/ClassDriver/CDCHost/CDCHost.c
LUFA/Drivers/USB/Class/Host/CDC.c
LUFA/Drivers/USB/Class/Host/CDC.h
LUFA/Drivers/USB/LowLevel/Pipe.c

index 65f490f..7881d3c 100644 (file)
@@ -54,6 +54,7 @@ USB_ClassInfo_CDC_Host_t VirtualSerial_CDC_Interface =
                                // Leave all state values to their defaults                     \r
                        }\r
        };\r
                                // Leave all state values to their defaults                     \r
                        }\r
        };\r
+\r
        \r
 /** Main program entry point. This routine configures the hardware required by the application, then\r
  *  starts the scheduler to run the application tasks.\r
        \r
 /** Main program entry point. This routine configures the hardware required by the application, then\r
  *  starts the scheduler to run the application tasks.\r
@@ -71,7 +72,9 @@ int main(void)
                switch (USB_HostState)\r
                {\r
                        case HOST_STATE_Addressed:\r
                switch (USB_HostState)\r
                {\r
                        case HOST_STATE_Addressed:\r
-                               if (!(CDC_Host_ConfigurePipes(&VirtualSerial_CDC_Interface)))\r
+                               LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);\r
+                       \r
+                               if (CDC_Host_ConfigurePipes(&VirtualSerial_CDC_Interface, 512) != CDC_ENUMERROR_NoError)\r
                                {\r
                                        LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
                                        USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                {\r
                                        LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
                                        USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
@@ -88,9 +91,6 @@ int main(void)
                                USB_HostState = HOST_STATE_Configured;\r
                                break;\r
                        case HOST_STATE_Configured:\r
                                USB_HostState = HOST_STATE_Configured;\r
                                break;\r
                        case HOST_STATE_Configured:\r
-                               USB_HostState = HOST_STATE_Ready;\r
-                               break;\r
-                       case HOST_STATE_Ready:\r
                                break;\r
                }\r
        \r
                                break;\r
                }\r
        \r
index 688143c..fda47fa 100644 (file)
 #define  INCLUDE_FROM_CDC_CLASS_HOST_C\r
 #include "CDC.h"\r
 \r
 #define  INCLUDE_FROM_CDC_CLASS_HOST_C\r
 #include "CDC.h"\r
 \r
-static uint8_t CDC_Host_ProcessConfigDescriptor(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo)\r
+uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, uint16_t MaxConfigBufferSize)\r
 {\r
        uint8_t* ConfigDescriptorData;\r
        uint16_t ConfigDescriptorSize;\r
        uint8_t  FoundEndpoints = 0;\r
 {\r
        uint8_t* ConfigDescriptorData;\r
        uint16_t ConfigDescriptorSize;\r
        uint8_t  FoundEndpoints = 0;\r
-       \r
+\r
        if (USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful)\r
          return CDC_ENUMERROR_ControlError;\r
        \r
        if (USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful)\r
          return CDC_ENUMERROR_ControlError;\r
        \r
-       if (ConfigDescriptorSize > 512)\r
+       if (ConfigDescriptorSize > MaxConfigBufferSize)\r
          return CDC_ENUMERROR_DescriptorTooLarge;\r
          \r
        ConfigDescriptorData = alloca(ConfigDescriptorSize);\r
          return CDC_ENUMERROR_DescriptorTooLarge;\r
          \r
        ConfigDescriptorData = alloca(ConfigDescriptorSize);\r
@@ -64,10 +64,8 @@ static uint8_t CDC_Host_ProcessConfigDescriptor(USB_ClassInfo_CDC_Host_t* CDCInt
                if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,\r
                                              DComp_CDC_Host_NextInterfaceCDCDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)\r
                {\r
                if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,\r
                                              DComp_CDC_Host_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 & CDC_FOUND_DATAPIPE_NOTIFICATION)\r
                        {\r
                        if (FoundEndpoints & CDC_FOUND_DATAPIPE_NOTIFICATION)\r
                        {\r
-                               /* Get the next CDC data interface from the configuration descriptor (CDC class has two CDC interfaces) */\r
                                if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, \r
                                                              DComp_CDC_Host_NextCDCDataInterface) != DESCRIPTOR_SEARCH_COMP_Found)\r
                                {\r
                                if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, \r
                                                              DComp_CDC_Host_NextCDCDataInterface) != DESCRIPTOR_SEARCH_COMP_Found)\r
                                {\r
@@ -179,12 +177,15 @@ static uint8_t DComp_CDC_Host_NextInterfaceCDCDataEndpoint(void* CurrentDescript
        if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint)\r
        {\r
                USB_Descriptor_Endpoint_t* CurrentEndpoint = DESCRIPTOR_PCAST(CurrentDescriptor,\r
        if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint)\r
        {\r
                USB_Descriptor_Endpoint_t* CurrentEndpoint = DESCRIPTOR_PCAST(CurrentDescriptor,\r
-                                                                             USB_Descriptor_Endpoint_t)\r
+                                                                             USB_Descriptor_Endpoint_t);\r
        \r
                uint8_t EndpointType = (CurrentEndpoint->Attributes & EP_TYPE_MASK);\r
        \r
        \r
                uint8_t EndpointType = (CurrentEndpoint->Attributes & EP_TYPE_MASK);\r
        \r
-               if ((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT))\r
-                 return DESCRIPTOR_SEARCH_Found;\r
+               if (((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT)) &&\r
+                   !(Pipe_IsEndpointBound(CurrentEndpoint->EndpointAddress)))\r
+               {\r
+                       return DESCRIPTOR_SEARCH_Found;\r
+               }\r
        }\r
        else if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface)\r
        {\r
        }\r
        else if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface)\r
        {\r
@@ -196,27 +197,7 @@ static uint8_t DComp_CDC_Host_NextInterfaceCDCDataEndpoint(void* CurrentDescript
 \r
 void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo)\r
 {\r
 \r
 void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo)\r
 {\r
-       uint8_t ErrorCode;\r
 \r
 \r
-       switch (USB_HostState)\r
-       {\r
-               case HOST_STATE_Addressed:\r
-                       if ((ErrorCode = CDC_Host_ProcessConfigDescriptor(CDCInterfaceInfo)) != CDC_ENUMERROR_NoError)\r
-                       {\r
-                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
-                       }\r
-\r
-                       if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)\r
-                       {\r
-                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
-                       }\r
-                               \r
-                       USB_HostState = HOST_STATE_Configured;\r
-                       break;\r
-               case HOST_STATE_Configured:\r
-                       USB_HostState = HOST_STATE_Ready;\r
-                       break;\r
-       }\r
 }\r
 \r
 #endif\r
 }\r
 \r
 #endif\r
index 90ea3ab..9181aca 100644 (file)
 \r
                /* Function Prototypes: */\r
                        #if defined(INCLUDE_FROM_CDC_CLASS_HOST_C)\r
 \r
                /* Function Prototypes: */\r
                        #if defined(INCLUDE_FROM_CDC_CLASS_HOST_C)\r
-                               static uint8_t CDC_Host_ProcessConfigDescriptor(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo);\r
                                static uint8_t DComp_CDC_Host_NextCDCControlInterface(void* CurrentDescriptor);\r
                                static uint8_t DComp_CDC_Host_NextCDCDataInterface(void* CurrentDescriptor);\r
                                static uint8_t DComp_CDC_Host_NextInterfaceCDCDataEndpoint(void* CurrentDescriptor);\r
                        #endif\r
 \r
                                static uint8_t DComp_CDC_Host_NextCDCControlInterface(void* CurrentDescriptor);\r
                                static uint8_t DComp_CDC_Host_NextCDCDataInterface(void* CurrentDescriptor);\r
                                static uint8_t DComp_CDC_Host_NextInterfaceCDCDataEndpoint(void* CurrentDescriptor);\r
                        #endif\r
 \r
+                       uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, uint16_t MaxConfigBufferSize);\r
+                       void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo);\r
+\r
                        void EVENT_CDC_Host_ControLineStateChanged(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo);\r
                        \r
                        uint8_t CDC_Host_SetLineEncoding(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo);\r
                        void EVENT_CDC_Host_ControLineStateChanged(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo);\r
                        \r
                        uint8_t CDC_Host_SetLineEncoding(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo);\r
index 0a32f18..9c6a53e 100644 (file)
@@ -72,13 +72,13 @@ void Pipe_ClearPipes(void)
 \r
 bool Pipe_IsEndpointBound(uint8_t EndpointAddress)\r
 {\r
 \r
 bool Pipe_IsEndpointBound(uint8_t EndpointAddress)\r
 {\r
-       uint8_t PrevPipeNumber = Pipe_GetPipeNumber();\r
+       uint8_t PrevPipeNumber = Pipe_GetCurrentPipe();\r
 \r
        for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)\r
        {\r
                Pipe_SelectPipe(PNum);\r
                \r
 \r
        for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)\r
        {\r
                Pipe_SelectPipe(PNum);\r
                \r
-               if (Pipe_IsConfigured() && (Pipe_BoundEndpointAddress() == EndpointAddress))\r
+               if (Pipe_IsConfigured() && (Pipe_BoundEndpointNumber() == EndpointAddress))\r
                  return true;\r
        }\r
        \r
                  return true;\r
        }\r
        \r