From 05fa6e0c43e542459000c7ebe0b10cbe24c7f5d9 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Sun, 26 Jul 2009 10:45:33 +0000 Subject: [PATCH] Corrected new Pipe_IsEndpointBound() function. Completed host CDC class driver enumeration code. --- Demos/Host/ClassDriver/CDCHost/CDCHost.c | 8 ++--- LUFA/Drivers/USB/Class/Host/CDC.c | 37 ++++++------------------ LUFA/Drivers/USB/Class/Host/CDC.h | 4 ++- LUFA/Drivers/USB/LowLevel/Pipe.c | 4 +-- 4 files changed, 18 insertions(+), 35 deletions(-) diff --git a/Demos/Host/ClassDriver/CDCHost/CDCHost.c b/Demos/Host/ClassDriver/CDCHost/CDCHost.c index 65f490f28f..7881d3cb17 100644 --- a/Demos/Host/ClassDriver/CDCHost/CDCHost.c +++ b/Demos/Host/ClassDriver/CDCHost/CDCHost.c @@ -54,6 +54,7 @@ USB_ClassInfo_CDC_Host_t VirtualSerial_CDC_Interface = // Leave all state values to their defaults } }; + /** Main program entry point. This routine configures the hardware required by the application, then * starts the scheduler to run the application tasks. @@ -71,7 +72,9 @@ int main(void) switch (USB_HostState) { case HOST_STATE_Addressed: - if (!(CDC_Host_ConfigurePipes(&VirtualSerial_CDC_Interface))) + LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); + + if (CDC_Host_ConfigurePipes(&VirtualSerial_CDC_Interface, 512) != CDC_ENUMERROR_NoError) { LEDs_SetAllLEDs(LEDMASK_USB_ERROR); USB_HostState = HOST_STATE_WaitForDeviceRemoval; @@ -88,9 +91,6 @@ int main(void) USB_HostState = HOST_STATE_Configured; break; case HOST_STATE_Configured: - USB_HostState = HOST_STATE_Ready; - break; - case HOST_STATE_Ready: break; } diff --git a/LUFA/Drivers/USB/Class/Host/CDC.c b/LUFA/Drivers/USB/Class/Host/CDC.c index 688143c08c..fda47faf5c 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 diff --git a/LUFA/Drivers/USB/Class/Host/CDC.h b/LUFA/Drivers/USB/Class/Host/CDC.h index 90ea3ab4b4..9181aca03d 100644 --- a/LUFA/Drivers/USB/Class/Host/CDC.h +++ b/LUFA/Drivers/USB/Class/Host/CDC.h @@ -136,12 +136,14 @@ /* Function Prototypes: */ #if defined(INCLUDE_FROM_CDC_CLASS_HOST_C) - static uint8_t CDC_Host_ProcessConfigDescriptor(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo); static uint8_t DComp_CDC_Host_NextCDCControlInterface(void* CurrentDescriptor); static uint8_t DComp_CDC_Host_NextCDCDataInterface(void* CurrentDescriptor); static uint8_t DComp_CDC_Host_NextInterfaceCDCDataEndpoint(void* CurrentDescriptor); #endif + uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, uint16_t MaxConfigBufferSize); + void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo); + void EVENT_CDC_Host_ControLineStateChanged(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo); uint8_t CDC_Host_SetLineEncoding(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo); diff --git a/LUFA/Drivers/USB/LowLevel/Pipe.c b/LUFA/Drivers/USB/LowLevel/Pipe.c index 0a32f183b5..9c6a53e780 100644 --- a/LUFA/Drivers/USB/LowLevel/Pipe.c +++ b/LUFA/Drivers/USB/LowLevel/Pipe.c @@ -72,13 +72,13 @@ void Pipe_ClearPipes(void) bool Pipe_IsEndpointBound(uint8_t EndpointAddress) { - uint8_t PrevPipeNumber = Pipe_GetPipeNumber(); + uint8_t PrevPipeNumber = Pipe_GetCurrentPipe(); for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++) { Pipe_SelectPipe(PNum); - if (Pipe_IsConfigured() && (Pipe_BoundEndpointAddress() == EndpointAddress)) + if (Pipe_IsConfigured() && (Pipe_BoundEndpointNumber() == EndpointAddress)) return true; }