Corrected new Pipe_IsEndpointBound() function.

Completed host CDC class driver enumeration code.
pull/1469/head
Dean Camera 16 years ago
parent cbbd3d746a
commit 05fa6e0c43

@ -55,6 +55,7 @@ USB_ClassInfo_CDC_Host_t VirtualSerial_CDC_Interface =
} }
}; };
/** Main program entry point. This routine configures the hardware required by the application, then /** Main program entry point. This routine configures the hardware required by the application, then
* starts the scheduler to run the application tasks. * starts the scheduler to run the application tasks.
*/ */
@ -71,7 +72,9 @@ int main(void)
switch (USB_HostState) switch (USB_HostState)
{ {
case HOST_STATE_Addressed: 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); LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
USB_HostState = HOST_STATE_WaitForDeviceRemoval; USB_HostState = HOST_STATE_WaitForDeviceRemoval;
@ -88,9 +91,6 @@ int main(void)
USB_HostState = HOST_STATE_Configured; USB_HostState = HOST_STATE_Configured;
break; break;
case HOST_STATE_Configured: case HOST_STATE_Configured:
USB_HostState = HOST_STATE_Ready;
break;
case HOST_STATE_Ready:
break; break;
} }

@ -34,7 +34,7 @@
#define INCLUDE_FROM_CDC_CLASS_HOST_C #define INCLUDE_FROM_CDC_CLASS_HOST_C
#include "CDC.h" #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; uint8_t* ConfigDescriptorData;
uint16_t ConfigDescriptorSize; uint16_t ConfigDescriptorSize;
@ -43,7 +43,7 @@ static uint8_t CDC_Host_ProcessConfigDescriptor(USB_ClassInfo_CDC_Host_t* CDCInt
if (USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful) if (USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful)
return CDC_ENUMERROR_ControlError; return CDC_ENUMERROR_ControlError;
if (ConfigDescriptorSize > 512) if (ConfigDescriptorSize > MaxConfigBufferSize)
return CDC_ENUMERROR_DescriptorTooLarge; return CDC_ENUMERROR_DescriptorTooLarge;
ConfigDescriptorData = alloca(ConfigDescriptorSize); ConfigDescriptorData = alloca(ConfigDescriptorSize);
@ -64,10 +64,8 @@ static uint8_t CDC_Host_ProcessConfigDescriptor(USB_ClassInfo_CDC_Host_t* CDCInt
if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
DComp_CDC_Host_NextInterfaceCDCDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) 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) 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, if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
DComp_CDC_Host_NextCDCDataInterface) != DESCRIPTOR_SEARCH_COMP_Found) DComp_CDC_Host_NextCDCDataInterface) != DESCRIPTOR_SEARCH_COMP_Found)
{ {
@ -179,13 +177,16 @@ static uint8_t DComp_CDC_Host_NextInterfaceCDCDataEndpoint(void* CurrentDescript
if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint) if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint)
{ {
USB_Descriptor_Endpoint_t* CurrentEndpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t* CurrentEndpoint = DESCRIPTOR_PCAST(CurrentDescriptor,
USB_Descriptor_Endpoint_t) USB_Descriptor_Endpoint_t);
uint8_t EndpointType = (CurrentEndpoint->Attributes & EP_TYPE_MASK); uint8_t EndpointType = (CurrentEndpoint->Attributes & EP_TYPE_MASK);
if ((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT)) if (((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT)) &&
!(Pipe_IsEndpointBound(CurrentEndpoint->EndpointAddress)))
{
return DESCRIPTOR_SEARCH_Found; return DESCRIPTOR_SEARCH_Found;
} }
}
else if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface) else if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface)
{ {
return DESCRIPTOR_SEARCH_Fail; return DESCRIPTOR_SEARCH_Fail;
@ -196,27 +197,7 @@ static uint8_t DComp_CDC_Host_NextInterfaceCDCDataEndpoint(void* CurrentDescript
void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo) 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 #endif

@ -136,12 +136,14 @@
/* Function Prototypes: */ /* Function Prototypes: */
#if defined(INCLUDE_FROM_CDC_CLASS_HOST_C) #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_NextCDCControlInterface(void* CurrentDescriptor);
static uint8_t DComp_CDC_Host_NextCDCDataInterface(void* CurrentDescriptor); static uint8_t DComp_CDC_Host_NextCDCDataInterface(void* CurrentDescriptor);
static uint8_t DComp_CDC_Host_NextInterfaceCDCDataEndpoint(void* CurrentDescriptor); static uint8_t DComp_CDC_Host_NextInterfaceCDCDataEndpoint(void* CurrentDescriptor);
#endif #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); void EVENT_CDC_Host_ControLineStateChanged(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo);
uint8_t CDC_Host_SetLineEncoding(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo); uint8_t CDC_Host_SetLineEncoding(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo);

@ -72,13 +72,13 @@ void Pipe_ClearPipes(void)
bool Pipe_IsEndpointBound(uint8_t EndpointAddress) 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++) for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)
{ {
Pipe_SelectPipe(PNum); Pipe_SelectPipe(PNum);
if (Pipe_IsConfigured() && (Pipe_BoundEndpointAddress() == EndpointAddress)) if (Pipe_IsConfigured() && (Pipe_BoundEndpointNumber() == EndpointAddress))
return true; return true;
} }

Loading…
Cancel
Save