diff options
author | Dean Camera <dean@fourwalledcubicle.com> | 2009-07-26 10:45:33 +0000 |
---|---|---|
committer | Dean Camera <dean@fourwalledcubicle.com> | 2009-07-26 10:45:33 +0000 |
commit | 05fa6e0c43e542459000c7ebe0b10cbe24c7f5d9 (patch) | |
tree | 76d4563fe63f97637e768471a10b9b6b51c5cf22 | |
parent | cbbd3d746acef02a4afd562652a2ba71b24dfd6f (diff) | |
download | lufa-05fa6e0c43e542459000c7ebe0b10cbe24c7f5d9.tar.gz lufa-05fa6e0c43e542459000c7ebe0b10cbe24c7f5d9.tar.bz2 lufa-05fa6e0c43e542459000c7ebe0b10cbe24c7f5d9.zip |
Corrected new Pipe_IsEndpointBound() function.
Completed host CDC class driver enumeration code.
-rw-r--r-- | Demos/Host/ClassDriver/CDCHost/CDCHost.c | 8 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Class/Host/CDC.c | 37 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Class/Host/CDC.h | 4 | ||||
-rw-r--r-- | 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 65f490f28..7881d3cb1 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 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
diff --git a/LUFA/Drivers/USB/Class/Host/CDC.h b/LUFA/Drivers/USB/Class/Host/CDC.h index 90ea3ab4b..9181aca03 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 0a32f183b..9c6a53e78 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;
}
|