Changed the parameters and behaviour of the USB_GetDeviceConfigDescriptor() function so that it now performs size checks and data validations internally, to simplify user code.
This commit is contained in:
		
							parent
							
								
									813e6f0318
								
							
						
					
					
						commit
						7fbb759287
					
				
					 19 changed files with 232 additions and 254 deletions
				
			
		| 
						 | 
				
			
			@ -47,29 +47,25 @@
 | 
			
		|||
 */
 | 
			
		||||
uint8_t ProcessConfigurationDescriptor(void)
 | 
			
		||||
{
 | 
			
		||||
	uint8_t* ConfigDescriptorData;
 | 
			
		||||
	uint16_t ConfigDescriptorSize;
 | 
			
		||||
	
 | 
			
		||||
	/* Get Configuration Descriptor size from the device */
 | 
			
		||||
	if (USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful)
 | 
			
		||||
	  return ControlError;
 | 
			
		||||
	
 | 
			
		||||
	/* Ensure that the Configuration Descriptor isn't too large */
 | 
			
		||||
	if (ConfigDescriptorSize > MAX_CONFIG_DESCRIPTOR_SIZE)
 | 
			
		||||
	  return DescriptorTooLarge;
 | 
			
		||||
	  
 | 
			
		||||
	/* Allocate enough memory for the entire config descriptor */
 | 
			
		||||
	ConfigDescriptorData = alloca(ConfigDescriptorSize);
 | 
			
		||||
	uint8_t  ConfigDescriptorData[512];
 | 
			
		||||
	uint8_t* CurrConfigLocation = ConfigDescriptorData;
 | 
			
		||||
	uint16_t CurrConfigBytesRem;
 | 
			
		||||
 | 
			
		||||
	/* Retrieve the entire configuration descriptor into the allocated buffer */
 | 
			
		||||
	USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData);
 | 
			
		||||
	
 | 
			
		||||
	/* Validate returned data - ensure first entry is a configuration header descriptor */
 | 
			
		||||
	if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
 | 
			
		||||
	  return InvalidConfigDataReturned;
 | 
			
		||||
	switch (USB_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
 | 
			
		||||
	{
 | 
			
		||||
		case HOST_GETCONFIG_Successful:
 | 
			
		||||
			break;
 | 
			
		||||
		case HOST_GETCONFIG_InvalidData:
 | 
			
		||||
			return InvalidConfigDataReturned;
 | 
			
		||||
		case HOST_GETCONFIG_BuffOverflow:
 | 
			
		||||
			return DescriptorTooLarge;
 | 
			
		||||
		default:
 | 
			
		||||
			return ControlError;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/* Get the keyboard interface from the configuration descriptor */
 | 
			
		||||
	if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
 | 
			
		||||
	if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
 | 
			
		||||
	                              DComp_NextKeyboardInterface) != DESCRIPTOR_SEARCH_COMP_Found)
 | 
			
		||||
	{
 | 
			
		||||
		/* Descriptor not found, error out */
 | 
			
		||||
| 
						 | 
				
			
			@ -77,7 +73,7 @@ uint8_t ProcessConfigurationDescriptor(void)
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	/* Get the keyboard interface's data endpoint descriptor */
 | 
			
		||||
	if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
 | 
			
		||||
	if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
 | 
			
		||||
	                              DComp_NextInterfaceKeyboardDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
 | 
			
		||||
	{
 | 
			
		||||
		/* Descriptor not found, error out */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue