forked from mfulz_github/qmk_firmware
Corrected new Pipe_IsEndpointBound() function.
Completed host CDC class driver enumeration code.
This commit is contained in:
parent
cbbd3d746a
commit
05fa6e0c43
|
@ -54,6 +54,7 @@ USB_ClassInfo_CDC_Host_t VirtualSerial_CDC_Interface =
|
||||||
// Leave all state values to their defaults
|
// Leave all state values to their defaults
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/** 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,16 +34,16 @@
|
||||||
#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;
|
||||||
uint8_t FoundEndpoints = 0;
|
uint8_t FoundEndpoints = 0;
|
||||||
|
|
||||||
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,12 +177,15 @@ 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)) &&
|
||||||
return DESCRIPTOR_SEARCH_Found;
|
!(Pipe_IsEndpointBound(CurrentEndpoint->EndpointAddress)))
|
||||||
|
{
|
||||||
|
return DESCRIPTOR_SEARCH_Found;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface)
|
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)
|
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…
Reference in New Issue