forked from mfulz_github/qmk_firmware
		
	Change Host mode class driver Pipe configuration routines -- better to let the application fetch the configuration descriptors once, and then pass them to each class driver in turn.
This commit is contained in:
		
							parent
							
								
									5251bc6e4e
								
							
						
					
					
						commit
						84c3c4a3d9
					
				@ -74,10 +74,31 @@ int main(void)
 | 
				
			|||||||
			case HOST_STATE_Addressed:
 | 
								case HOST_STATE_Addressed:
 | 
				
			||||||
				LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
 | 
									LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
				if (CDC_Host_ConfigurePipes(&VirtualSerial_CDC_Interface, 512) != CDC_ENUMERROR_NoError)
 | 
									uint16_t ConfigDescriptorSize;
 | 
				
			||||||
				{
 | 
									uint8_t  ConfigDescriptorData[512];
 | 
				
			||||||
					printf("Attached device is not a valid CDC device.\r\n");
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										printf("Error Retrieving Device Descriptor.\r\n");
 | 
				
			||||||
 | 
										LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 | 
				
			||||||
 | 
										USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									if (ConfigDescriptorSize > 512)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										printf("Device Descriptor Too Large To Process.\r\n");
 | 
				
			||||||
 | 
										LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 | 
				
			||||||
 | 
										USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									  
 | 
				
			||||||
 | 
									USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (CDC_Host_ConfigurePipes(&VirtualSerial_CDC_Interface,
 | 
				
			||||||
 | 
									                            ConfigDescriptorSize, ConfigDescriptorData) != CDC_ENUMERROR_NoError)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										printf("Attached Device Not a Valid CDC Class Device.\r\n");
 | 
				
			||||||
					LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 | 
										LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 | 
				
			||||||
					USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 | 
										USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 | 
				
			||||||
					break;
 | 
										break;
 | 
				
			||||||
@ -86,7 +107,6 @@ int main(void)
 | 
				
			|||||||
				if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)
 | 
									if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					printf("Error Setting Device Configuration.\r\n");
 | 
										printf("Error Setting Device Configuration.\r\n");
 | 
				
			||||||
 | 
					 | 
				
			||||||
					LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 | 
										LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 | 
				
			||||||
					USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 | 
										USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 | 
				
			||||||
					break;
 | 
										break;
 | 
				
			||||||
 | 
				
			|||||||
@ -76,10 +76,31 @@ int main(void)
 | 
				
			|||||||
			case HOST_STATE_Addressed:
 | 
								case HOST_STATE_Addressed:
 | 
				
			||||||
				LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
 | 
									LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
				if (HID_Host_ConfigurePipes(&Mouse_HID_Interface, 512) != HID_ENUMERROR_NoError)
 | 
									uint16_t ConfigDescriptorSize;
 | 
				
			||||||
				{
 | 
									uint8_t  ConfigDescriptorData[512];
 | 
				
			||||||
					printf("Attached device is not a valid Mouse.\r\n");
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										printf("Error Retrieving Device Descriptor.\r\n");
 | 
				
			||||||
 | 
										LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 | 
				
			||||||
 | 
										USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									if (ConfigDescriptorSize > 512)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										printf("Device Descriptor Too Large To Process.\r\n");
 | 
				
			||||||
 | 
										LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 | 
				
			||||||
 | 
										USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									  
 | 
				
			||||||
 | 
									USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (HID_Host_ConfigurePipes(&Mouse_HID_Interface,
 | 
				
			||||||
 | 
									                            ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										printf("Attached Device Not a Valid Mouse.\r\n");
 | 
				
			||||||
					LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 | 
										LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 | 
				
			||||||
					USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 | 
										USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 | 
				
			||||||
					break;
 | 
										break;
 | 
				
			||||||
@ -88,7 +109,6 @@ int main(void)
 | 
				
			|||||||
				if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)
 | 
									if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					printf("Error Setting Device Configuration.\r\n");
 | 
										printf("Error Setting Device Configuration.\r\n");
 | 
				
			||||||
 | 
					 | 
				
			||||||
					LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 | 
										LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 | 
				
			||||||
					USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 | 
										USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 | 
				
			||||||
					break;
 | 
										break;
 | 
				
			||||||
 | 
				
			|||||||
@ -34,24 +34,13 @@
 | 
				
			|||||||
#define  INCLUDE_FROM_CDC_CLASS_HOST_C
 | 
					#define  INCLUDE_FROM_CDC_CLASS_HOST_C
 | 
				
			||||||
#include "CDC.h"
 | 
					#include "CDC.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, uint16_t MaxConfigBufferSize)
 | 
					uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, uint16_t ConfigDescriptorSize,
 | 
				
			||||||
 | 
					                                uint8_t* ConfigDescriptorData)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	uint8_t* ConfigDescriptorData;
 | 
					 | 
				
			||||||
	uint16_t ConfigDescriptorSize;
 | 
					 | 
				
			||||||
	uint8_t  FoundEndpoints = 0;
 | 
						uint8_t  FoundEndpoints = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful)
 | 
					 | 
				
			||||||
	  return CDC_ENUMERROR_ControlError;
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	if (ConfigDescriptorSize > MaxConfigBufferSize)
 | 
					 | 
				
			||||||
	  return CDC_ENUMERROR_DescriptorTooLarge;
 | 
					 | 
				
			||||||
	  
 | 
					 | 
				
			||||||
	ConfigDescriptorData = alloca(ConfigDescriptorSize);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData);
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
 | 
						if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
 | 
				
			||||||
	  return CDC_ENUMERROR_InvalidConfigDataReturned;
 | 
						  return CDC_ENUMERROR_InvalidConfigDescriptor;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
 | 
						if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
 | 
				
			||||||
	                              DComp_CDC_Host_NextCDCControlInterface) != DESCRIPTOR_SEARCH_COMP_Found)
 | 
						                              DComp_CDC_Host_NextCDCControlInterface) != DESCRIPTOR_SEARCH_COMP_Found)
 | 
				
			||||||
 | 
				
			|||||||
@ -108,16 +108,15 @@
 | 
				
			|||||||
			enum
 | 
								enum
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				CDC_ENUMERROR_NoError                    = 0, /**< Configuration Descriptor was processed successfully */
 | 
									CDC_ENUMERROR_NoError                    = 0, /**< Configuration Descriptor was processed successfully */
 | 
				
			||||||
				CDC_ENUMERROR_ControlError               = 1, /**< A control request to the device failed to complete successfully */
 | 
									CDC_ENUMERROR_InvalidConfigDescriptor    = 1, /**< The device returned an invalid Configuration Descriptor */
 | 
				
			||||||
				CDC_ENUMERROR_DescriptorTooLarge         = 2, /**< The device's Configuration Descriptor is too large to process */
 | 
									CDC_ENUMERROR_NoCDCInterfaceFound        = 2, /**< A compatible CDC interface was not found in the device's Configuration Descriptor */
 | 
				
			||||||
				CDC_ENUMERROR_InvalidConfigDataReturned  = 3, /**< The device returned an invalid Configuration Descriptor */
 | 
									CDC_ENUMERROR_EndpointsNotFound          = 3, /**< Compatible CDC endpoints were not found in the device's CDC interface */
 | 
				
			||||||
				CDC_ENUMERROR_NoCDCInterfaceFound        = 4, /**< A compatible CDC interface was not found in the device's Configuration Descriptor */
 | 
					 | 
				
			||||||
				CDC_ENUMERROR_EndpointsNotFound          = 5, /**< Compatible CDC endpoints were not found in the device's CDC interface */
 | 
					 | 
				
			||||||
			} CDCHost_EnumerationFailure_ErrorCodes_t;
 | 
								} CDCHost_EnumerationFailure_ErrorCodes_t;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
		/* Function Prototypes: */
 | 
							/* Function Prototypes: */
 | 
				
			||||||
			void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo);
 | 
								void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo);
 | 
				
			||||||
			uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, uint16_t MaxConfigBufferSize);
 | 
								uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, uint16_t ConfigDescriptorLength,
 | 
				
			||||||
 | 
								                                uint8_t* DeviceConfigDescriptor);
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			void EVENT_CDC_Host_ControLineStateChanged(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo);
 | 
								void EVENT_CDC_Host_ControLineStateChanged(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo);
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
 | 
				
			|||||||
@ -34,24 +34,13 @@
 | 
				
			|||||||
#define INCLUDE_FROM_HID_CLASS_HOST_C
 | 
					#define INCLUDE_FROM_HID_CLASS_HOST_C
 | 
				
			||||||
#include "HID.h"
 | 
					#include "HID.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint16_t MaxConfigBufferSize)
 | 
					uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint16_t ConfigDescriptorSize,
 | 
				
			||||||
 | 
					                                uint8_t* ConfigDescriptorData)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	uint8_t* ConfigDescriptorData;
 | 
					 | 
				
			||||||
	uint16_t ConfigDescriptorSize;
 | 
					 | 
				
			||||||
	uint8_t  FoundEndpoints = 0;
 | 
						uint8_t  FoundEndpoints = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful)
 | 
					 | 
				
			||||||
	  return HID_ENUMERROR_ControlError;
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	if (ConfigDescriptorSize > MaxConfigBufferSize)
 | 
					 | 
				
			||||||
	  return HID_ENUMERROR_DescriptorTooLarge;
 | 
					 | 
				
			||||||
	  
 | 
					 | 
				
			||||||
	ConfigDescriptorData = alloca(ConfigDescriptorSize);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData);
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
 | 
						if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
 | 
				
			||||||
	  return HID_ENUMERROR_InvalidConfigDataReturned;
 | 
						  return HID_ENUMERROR_InvalidConfigDescriptor;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	do
 | 
						do
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@ -62,7 +51,7 @@ uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	} while (HIDInterfaceInfo->Config.MatchInterfaceProtocol &&
 | 
						} while (HIDInterfaceInfo->Config.MatchInterfaceProtocol &&
 | 
				
			||||||
	         DESCRIPTOR_PCAST(ConfigDescriptorData,
 | 
						         DESCRIPTOR_PCAST(ConfigDescriptorData,
 | 
				
			||||||
	                          USB_Descriptor_Interface_t)->HIDInterfaceProtocol != HIDInterfaceInfo->Config.Protocol);
 | 
						                          USB_Descriptor_Interface_t)->Protocol != HIDInterfaceInfo->Config.HIDInterfaceProtocol);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (FoundEndpoints != ((1 << HID_FOUND_DATAPIPE_IN) | (1 << HID_FOUND_DATAPIPE_OUT)))
 | 
						while (FoundEndpoints != ((1 << HID_FOUND_DATAPIPE_IN) | (1 << HID_FOUND_DATAPIPE_OUT)))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
				
			|||||||
@ -85,16 +85,15 @@
 | 
				
			|||||||
			enum
 | 
								enum
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				HID_ENUMERROR_NoError                    = 0, /**< Configuration Descriptor was processed successfully */
 | 
									HID_ENUMERROR_NoError                    = 0, /**< Configuration Descriptor was processed successfully */
 | 
				
			||||||
				HID_ENUMERROR_ControlError               = 1, /**< A control request to the device failed to complete successfully */
 | 
									HID_ENUMERROR_InvalidConfigDescriptor    = 1, /**< The device returned an invalid Configuration Descriptor */
 | 
				
			||||||
				HID_ENUMERROR_DescriptorTooLarge         = 2, /**< The device's Configuration Descriptor is too large to process */
 | 
									HID_ENUMERROR_NoHIDInterfaceFound        = 2, /**< A compatible HID interface was not found in the device's Configuration Descriptor */
 | 
				
			||||||
				HID_ENUMERROR_InvalidConfigDataReturned  = 3, /**< The device returned an invalid Configuration Descriptor */
 | 
									HID_ENUMERROR_EndpointsNotFound          = 3, /**< Compatible HID endpoints were not found in the device's CDC interface */
 | 
				
			||||||
				HID_ENUMERROR_NoHIDInterfaceFound        = 4, /**< A compatible HID interface was not found in the device's Configuration Descriptor */
 | 
					 | 
				
			||||||
				HID_ENUMERROR_EndpointsNotFound          = 5, /**< Compatible HID endpoints were not found in the device's CDC interface */
 | 
					 | 
				
			||||||
			} CDCHost_EnumerationFailure_ErrorCodes_t;
 | 
								} CDCHost_EnumerationFailure_ErrorCodes_t;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
		/* Function Prototypes: */
 | 
							/* Function Prototypes: */
 | 
				
			||||||
			void HID_Host_USBTask(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo);
 | 
								void HID_Host_USBTask(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo);
 | 
				
			||||||
			uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint16_t MaxConfigBufferSize);
 | 
								uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint16_t ConfigDescriptorLength,
 | 
				
			||||||
 | 
								                                uint8_t* DeviceConfigDescriptor);
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
	/* Private Interface - For use in library only: */
 | 
						/* Private Interface - For use in library only: */
 | 
				
			||||||
	#if !defined(__DOXYGEN__)
 | 
						#if !defined(__DOXYGEN__)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user