mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-11-04 07:12:33 +01:00 
			
		
		
		
	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			
 | 
			
		||||
			}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
/** 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;
 | 
			
		||||
		}
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user