From 05fa6e0c43e542459000c7ebe0b10cbe24c7f5d9 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Sun, 26 Jul 2009 10:45:33 +0000 Subject: Corrected new Pipe_IsEndpointBound() function. Completed host CDC class driver enumeration code. --- LUFA/Drivers/USB/Class/Host/CDC.c | 37 +++++++++---------------------------- 1 file changed, 9 insertions(+), 28 deletions(-) (limited to 'LUFA/Drivers/USB/Class/Host/CDC.c') diff --git a/LUFA/Drivers/USB/Class/Host/CDC.c b/LUFA/Drivers/USB/Class/Host/CDC.c index 688143c08..fda47faf5 100644 --- a/LUFA/Drivers/USB/Class/Host/CDC.c +++ b/LUFA/Drivers/USB/Class/Host/CDC.c @@ -34,16 +34,16 @@ #define INCLUDE_FROM_CDC_CLASS_HOST_C #include "CDC.h" -static uint8_t CDC_Host_ProcessConfigDescriptor(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo) +uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, uint16_t MaxConfigBufferSize) { uint8_t* ConfigDescriptorData; uint16_t ConfigDescriptorSize; uint8_t FoundEndpoints = 0; - + if (USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful) return CDC_ENUMERROR_ControlError; - if (ConfigDescriptorSize > 512) + if (ConfigDescriptorSize > MaxConfigBufferSize) return CDC_ENUMERROR_DescriptorTooLarge; ConfigDescriptorData = alloca(ConfigDescriptorSize); @@ -64,10 +64,8 @@ static uint8_t CDC_Host_ProcessConfigDescriptor(USB_ClassInfo_CDC_Host_t* CDCInt if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, DComp_CDC_Host_NextInterfaceCDCDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) { - /* Check to see if the control interface's notification pipe has been found, if so search for the data interface */ if (FoundEndpoints & CDC_FOUND_DATAPIPE_NOTIFICATION) { - /* Get the next CDC data interface from the configuration descriptor (CDC class has two CDC interfaces) */ if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, DComp_CDC_Host_NextCDCDataInterface) != DESCRIPTOR_SEARCH_COMP_Found) { @@ -179,12 +177,15 @@ static uint8_t DComp_CDC_Host_NextInterfaceCDCDataEndpoint(void* CurrentDescript if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint) { USB_Descriptor_Endpoint_t* CurrentEndpoint = DESCRIPTOR_PCAST(CurrentDescriptor, - USB_Descriptor_Endpoint_t) + USB_Descriptor_Endpoint_t); uint8_t EndpointType = (CurrentEndpoint->Attributes & EP_TYPE_MASK); - if ((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT)) - return DESCRIPTOR_SEARCH_Found; + if (((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT)) && + !(Pipe_IsEndpointBound(CurrentEndpoint->EndpointAddress))) + { + return DESCRIPTOR_SEARCH_Found; + } } else if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface) { @@ -196,27 +197,7 @@ static uint8_t DComp_CDC_Host_NextInterfaceCDCDataEndpoint(void* CurrentDescript void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo) { - uint8_t ErrorCode; - switch (USB_HostState) - { - case HOST_STATE_Addressed: - if ((ErrorCode = CDC_Host_ProcessConfigDescriptor(CDCInterfaceInfo)) != CDC_ENUMERROR_NoError) - { - USB_HostState = HOST_STATE_WaitForDeviceRemoval; - } - - if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful) - { - USB_HostState = HOST_STATE_WaitForDeviceRemoval; - } - - USB_HostState = HOST_STATE_Configured; - break; - case HOST_STATE_Configured: - USB_HostState = HOST_STATE_Ready; - break; - } } #endif -- cgit v1.2.3