Fixed HID Device Class Driver not allocating a temporary buffer when the host requests a report via the control endpoint and the user has set the PrevReportINBuffer driver configuration element to NULL (thanks to Lars Noschinski).
Clean up incomplete BluetoothHost debugging commands to use GCC extension to avoid NULL parameters when no formatting is required.
This commit is contained in:
		
							parent
							
								
									d03d6513d0
								
							
						
					
					
						commit
						8252b4febd
					
				
					 9 changed files with 55 additions and 48 deletions
				
			
		| 
						 | 
				
			
			@ -53,11 +53,15 @@ void HID_Device_ProcessControlRequest(USB_ClassInfo_HID_Device_t* const HIDInter
 | 
			
		|||
				uint16_t ReportINSize = 0;
 | 
			
		||||
				uint8_t  ReportID     = (USB_ControlRequest.wValue & 0xFF);
 | 
			
		||||
				uint8_t  ReportType   = (USB_ControlRequest.wValue >> 8) - 1;
 | 
			
		||||
				uint8_t  ReportINData[HIDInterfaceInfo->Config.PrevReportINBufferSize];
 | 
			
		||||
 | 
			
		||||
				memset(ReportINData, 0, sizeof(ReportINData));
 | 
			
		||||
 | 
			
		||||
				memset(HIDInterfaceInfo->Config.PrevReportINBuffer, 0, HIDInterfaceInfo->Config.PrevReportINBufferSize);
 | 
			
		||||
				
 | 
			
		||||
				CALLBACK_HID_Device_CreateHIDReport(HIDInterfaceInfo, &ReportID, ReportType,
 | 
			
		||||
				                                    HIDInterfaceInfo->Config.PrevReportINBuffer, &ReportINSize);
 | 
			
		||||
				
 | 
			
		||||
				if (HIDInterfaceInfo->Config.PrevReportINBuffer != NULL)
 | 
			
		||||
				  memcpy(HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINData, HIDInterfaceInfo->Config.PrevReportINBufferSize);
 | 
			
		||||
 | 
			
		||||
				Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
 | 
			
		||||
				Endpoint_Write_Control_Stream_LE(HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINSize);
 | 
			
		||||
| 
						 | 
				
			
			@ -169,7 +173,7 @@ void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo)
 | 
			
		|||
		if (HIDInterfaceInfo->Config.PrevReportINBuffer != NULL)
 | 
			
		||||
		{
 | 
			
		||||
			StatesChanged = (memcmp(ReportINData, HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINSize) != 0);
 | 
			
		||||
			memcpy(HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINData, ReportINSize);
 | 
			
		||||
			memcpy(HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINData, HIDInterfaceInfo->Config.PrevReportINBufferSize);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (ReportINSize && (ForceSend || StatesChanged || IdlePeriodElapsed))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -106,7 +106,8 @@
 | 
			
		|||
					uint8_t  PrevReportINBufferSize; /**< Size in bytes of the given input report buffer. This is used to create a
 | 
			
		||||
					                                  *  second buffer of the same size within the driver so that subsequent reports
 | 
			
		||||
					                                  *  can be compared. If the user app is to determine when reports are to be sent
 | 
			
		||||
					                                  *  exclusively (i.e. \ref PrevReportINBuffer is NULL) this value is ignored.
 | 
			
		||||
					                                  *  exclusively (i.e. \ref PrevReportINBuffer is NULL) this value must still be
 | 
			
		||||
													  *  set to the size of the largest report the device can issue to the host.
 | 
			
		||||
					                                  */
 | 
			
		||||
				} Config; /**< Config data for the USB class interface within the device. All elements in this section
 | 
			
		||||
				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue