Added new HID_HOST_BOOT_PROTOCOL_ONLY compile time token to reduce the size of the HID Host Class driver when Report protocol is not needed.
This commit is contained in:
		
							parent
							
								
									baa1b22654
								
							
						
					
					
						commit
						2f643f6143
					
				
					 7 changed files with 86 additions and 29 deletions
				
			
		| 
						 | 
				
			
			@ -153,6 +153,7 @@ void HID_Host_USBTask(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo)
 | 
			
		|||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
 | 
			
		||||
uint8_t HID_Host_ReceiveReportByID(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo, const uint8_t ReportID, void* Buffer)
 | 
			
		||||
{
 | 
			
		||||
	USB_ControlRequest = (USB_Request_Header_t)
 | 
			
		||||
| 
						 | 
				
			
			@ -168,7 +169,8 @@ uint8_t HID_Host_ReceiveReportByID(USB_ClassInfo_HID_Host_t* const HIDInterfaceI
 | 
			
		|||
	
 | 
			
		||||
	return USB_Host_SendControlRequest(Buffer);
 | 
			
		||||
}											   
 | 
			
		||||
											   
 | 
			
		||||
#endif
 | 
			
		||||
										   
 | 
			
		||||
uint8_t HID_Host_ReceiveReport(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo, void* Buffer)
 | 
			
		||||
{
 | 
			
		||||
	if ((USB_HostState != HOST_STATE_Configured) || !(HIDInterfaceInfo->State.IsActive))
 | 
			
		||||
| 
						 | 
				
			
			@ -181,11 +183,8 @@ uint8_t HID_Host_ReceiveReport(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo,
 | 
			
		|||
	
 | 
			
		||||
	uint16_t ReportSize;
 | 
			
		||||
 | 
			
		||||
	if (HIDInterfaceInfo->State.UsingBootProtocol)
 | 
			
		||||
	{
 | 
			
		||||
		ReportSize = Pipe_BytesInPipe();
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
 | 
			
		||||
	if (!(HIDInterfaceInfo->State.UsingBootProtocol))
 | 
			
		||||
	{
 | 
			
		||||
		uint8_t ReportID = 0;
 | 
			
		||||
	
 | 
			
		||||
| 
						 | 
				
			
			@ -197,6 +196,11 @@ uint8_t HID_Host_ReceiveReport(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo,
 | 
			
		|||
		
 | 
			
		||||
		ReportSize = USB_GetHIDReportSize(HIDInterfaceInfo->Config.HIDParserData, ReportID, REPORT_ITEM_TYPE_In);
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
#endif
 | 
			
		||||
	{
 | 
			
		||||
		ReportSize = Pipe_BytesInPipe();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if ((ErrorCode = Pipe_Read_Stream_LE(Buffer, ReportSize, NO_STREAM_CALLBACK)) != PIPE_RWSTREAM_NoError)
 | 
			
		||||
	  return ErrorCode;
 | 
			
		||||
| 
						 | 
				
			
			@ -207,28 +211,17 @@ uint8_t HID_Host_ReceiveReport(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo,
 | 
			
		|||
	return PIPE_RWSTREAM_NoError;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t HID_Host_SendReportByID(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo, uint8_t ReportID, void* Buffer,
 | 
			
		||||
                                const uint16_t ReportSize)
 | 
			
		||||
uint8_t HID_Host_SendReportByID(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo,
 | 
			
		||||
#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
 | 
			
		||||
                                const uint8_t ReportID,
 | 
			
		||||
#endif
 | 
			
		||||
                                void* Buffer, const uint16_t ReportSize)
 | 
			
		||||
{
 | 
			
		||||
	if ((USB_HostState != HOST_STATE_Configured) || !(HIDInterfaceInfo->State.IsActive))
 | 
			
		||||
	  return false;
 | 
			
		||||
	  
 | 
			
		||||
	if (!(HIDInterfaceInfo->State.DeviceUsesOUTPipe))
 | 
			
		||||
	{
 | 
			
		||||
		USB_ControlRequest = (USB_Request_Header_t)
 | 
			
		||||
		{
 | 
			
		||||
			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
 | 
			
		||||
			.bRequest      = REQ_SetReport,
 | 
			
		||||
			.wValue        = ReportID,
 | 
			
		||||
			.wIndex        = HIDInterfaceInfo->State.InterfaceNumber,
 | 
			
		||||
			.wLength       = ReportSize,
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		Pipe_SelectPipe(PIPE_CONTROLPIPE);
 | 
			
		||||
		
 | 
			
		||||
		return USB_Host_SendControlRequest(Buffer);
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
 | 
			
		||||
	if (HIDInterfaceInfo->State.DeviceUsesOUTPipe)
 | 
			
		||||
	{
 | 
			
		||||
		uint8_t ErrorCode;
 | 
			
		||||
	
 | 
			
		||||
| 
						 | 
				
			
			@ -246,6 +239,26 @@ uint8_t HID_Host_SendReportByID(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo
 | 
			
		|||
		
 | 
			
		||||
		return PIPE_RWSTREAM_NoError;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
#endif
 | 
			
		||||
	{
 | 
			
		||||
		USB_ControlRequest = (USB_Request_Header_t)
 | 
			
		||||
		{
 | 
			
		||||
			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
 | 
			
		||||
			.bRequest      = REQ_SetReport,
 | 
			
		||||
#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
 | 
			
		||||
			.wValue        = ReportID,
 | 
			
		||||
#else
 | 
			
		||||
			.wValue        = 0,
 | 
			
		||||
#endif
 | 
			
		||||
			.wIndex        = HIDInterfaceInfo->State.InterfaceNumber,
 | 
			
		||||
			.wLength       = ReportSize,
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		Pipe_SelectPipe(PIPE_CONTROLPIPE);
 | 
			
		||||
		
 | 
			
		||||
		return USB_Host_SendControlRequest(Buffer);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool HID_Host_IsReportReceived(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo)
 | 
			
		||||
| 
						 | 
				
			
			@ -295,6 +308,7 @@ uint8_t HID_Host_SetBootProtocol(USB_ClassInfo_HID_Host_t* const HIDInterfaceInf
 | 
			
		|||
	return HOST_SENDCONTROL_Successful;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
 | 
			
		||||
uint8_t HID_Host_SetReportProtocol(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo)
 | 
			
		||||
{
 | 
			
		||||
	uint8_t ErrorCode;
 | 
			
		||||
| 
						 | 
				
			
			@ -346,5 +360,6 @@ uint8_t HID_Host_SetReportProtocol(USB_ClassInfo_HID_Host_t* const HIDInterfaceI
 | 
			
		|||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -77,8 +77,14 @@
 | 
			
		|||
													*   \ref HID_BOOT_KEYBOARD_PROTOCOL or \ref HID_NON_BOOT_PROTOCOL if any
 | 
			
		||||
													*   HID device should be enumerated by the interface
 | 
			
		||||
					                                */
 | 
			
		||||
					#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
 | 
			
		||||
					HID_ReportInfo_t* HIDParserData; /**< HID parser data to store the parsed HID report data, when boot protocol
 | 
			
		||||
					                                  *   is not used */
 | 
			
		||||
					                                  *   is not used
 | 
			
		||||
													  *
 | 
			
		||||
					                                  *  \note When the HID_HOST_BOOT_PROTOCOL_ONLY compile time token is defined,
 | 
			
		||||
					                                  *        this method is unavailable.
 | 
			
		||||
					                                  */
 | 
			
		||||
					#endif
 | 
			
		||||
				} 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.
 | 
			
		||||
				           */
 | 
			
		||||
| 
						 | 
				
			
			@ -157,7 +163,10 @@
 | 
			
		|||
			 */
 | 
			
		||||
			uint8_t HID_Host_ReceiveReport(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo, void* Buffer) ATTR_NON_NULL_PTR_ARG(1, 2);
 | 
			
		||||
 | 
			
		||||
			#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
 | 
			
		||||
			/** Received a HID IN report from the attached device, by the report ID.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note When the HID_HOST_BOOT_PROTOCOL_ONLY compile time token is defined, this method is unavailable.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class host configuration and state
 | 
			
		||||
			 *  \param[in] ReportID  Report ID of the received report if ControlRequest is false, set by the to the Report ID to fetch
 | 
			
		||||
| 
						 | 
				
			
			@ -167,10 +176,14 @@
 | 
			
		|||
			 */
 | 
			
		||||
			uint8_t HID_Host_ReceiveReportByID(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo, const uint8_t ReportID,
 | 
			
		||||
			                                   void* Buffer) ATTR_NON_NULL_PTR_ARG(1, 3);
 | 
			
		||||
 | 
			
		||||
			#endif
 | 
			
		||||
			
 | 
			
		||||
			/** Sends an OUT report to the currently attached HID device, using the device's OUT pipe if available or the device's
 | 
			
		||||
			 *  Control pipe if not.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note When the HID_HOST_BOOT_PROTOCOL_ONLY compile time token is defined, the ReportID parameter is removed
 | 
			
		||||
			 *        from the parameter list of this function.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class host configuration and state
 | 
			
		||||
			 *  \param[in] ReportID  Report ID of the report to send to the device, or 0 if the device does not use report IDs
 | 
			
		||||
			 *  \param[in] Buffer  Buffer containing the report to send to the attached device
 | 
			
		||||
| 
						 | 
				
			
			@ -179,8 +192,16 @@
 | 
			
		|||
			 *  \return An error code from the \ref USB_Host_SendControlErrorCodes_t enum if the DeviceUsesOUTPipe flag is set in
 | 
			
		||||
			 *          the interface's state structure, a value from the \ref Pipe_Stream_RW_ErrorCodes_t enum otherwise
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t HID_Host_SendReportByID(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo, const uint8_t ReportID,
 | 
			
		||||
			                                void* Buffer, const uint16_t ReportSize) ATTR_NON_NULL_PTR_ARG(1, 3);
 | 
			
		||||
			uint8_t HID_Host_SendReportByID(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo,
 | 
			
		||||
			#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
 | 
			
		||||
			                                const uint8_t ReportID,
 | 
			
		||||
			#endif
 | 
			
		||||
			                                void* Buffer, const uint16_t ReportSize)
 | 
			
		||||
			#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
 | 
			
		||||
			                                ATTR_NON_NULL_PTR_ARG(1, 3);
 | 
			
		||||
			#else
 | 
			
		||||
			                                ATTR_NON_NULL_PTR_ARG(1, 2);
 | 
			
		||||
			#endif
 | 
			
		||||
 | 
			
		||||
			/** Determines if a HID IN report has been received from the attached device on the data IN pipe.
 | 
			
		||||
			 *
 | 
			
		||||
| 
						 | 
				
			
			@ -191,6 +212,9 @@
 | 
			
		|||
			bool HID_Host_IsReportReceived(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
			
 | 
			
		||||
			/** Switches the attached HID device's reporting protocol over to the Boot Report protocol mode, on supported devices.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note When the HID_HOST_BOOT_PROTOCOL_ONLY compile time token is defined, this method must still be called
 | 
			
		||||
			 *        to explicitly place the attached device into boot protocol mode before use.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class host configuration and state
 | 
			
		||||
			 *
 | 
			
		||||
| 
						 | 
				
			
			@ -199,12 +223,15 @@
 | 
			
		|||
			 */
 | 
			
		||||
			uint8_t HID_Host_SetBootProtocol(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
 | 
			
		||||
			#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
 | 
			
		||||
			/** Switches the attached HID device's reporting protocol over to the standard Report protocol mode. This also retrieves
 | 
			
		||||
			 *  and parses the device's HID report descriptor, so that the size of each report can be determined in advance.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note Whether this function is used or not, the \ref CALLBACK_HIDParser_FilterHIDReportItem() callback from the HID
 | 
			
		||||
			 *        Report Parser this function references <b>must</b> be implemented in the user code.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note When the HID_HOST_BOOT_PROTOCOL_ONLY compile time token is defined, this method is unavailable.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class host configuration and state
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum if an error occurs while retrieving the HID
 | 
			
		||||
| 
						 | 
				
			
			@ -213,7 +240,8 @@
 | 
			
		|||
			 *          and a value from the \ref HID_Parse_ErrorCodes_t otherwise
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t HID_Host_SetReportProtocol(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
		
 | 
			
		||||
			#endif
 | 
			
		||||
			
 | 
			
		||||
	/* Private Interface - For use in library only: */
 | 
			
		||||
	#if !defined(__DOXYGEN__)
 | 
			
		||||
		/* Macros: */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue