diff options
| -rw-r--r-- | LUFA/Drivers/USB/Class/Host/Printer.c | 60 | ||||
| -rw-r--r-- | LUFA/Drivers/USB/Class/Host/Printer.h | 48 | ||||
| -rw-r--r-- | LUFA/ManPages/ChangeLog.txt | 3 | 
3 files changed, 97 insertions, 14 deletions
| diff --git a/LUFA/Drivers/USB/Class/Host/Printer.c b/LUFA/Drivers/USB/Class/Host/Printer.c index 04de87aa8..99977e5a7 100644 --- a/LUFA/Drivers/USB/Class/Host/Printer.c +++ b/LUFA/Drivers/USB/Class/Host/Printer.c @@ -125,6 +125,11 @@ static uint8_t DCOMP_PRNT_NextPRNTInterfaceEndpoint(void* CurrentDescriptor)  	return DESCRIPTOR_SEARCH_NotFound;  } +void PRNT_Host_USBTask(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) +{ +	PRNT_Host_Flush(PRNTInterfaceInfo); +} +  uint8_t PRNT_Host_SetBidirectionalMode(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo)  {  	if (PRNTInterfaceInfo->State.AlternateSetting) @@ -182,6 +187,61 @@ uint8_t PRNT_Host_SoftReset(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo)  	return USB_Host_SendControlRequest(NULL);  } +uint8_t PRNT_Host_Flush(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(PRNTInterfaceInfo->State.IsActive)) +	  return PIPE_READYWAIT_DeviceDisconnected; +	   +	uint8_t ErrorCode; + +	Pipe_SelectPipe(PRNTInterfaceInfo->Config.DataOUTPipeNumber);	 +	Pipe_Unfreeze(); +	 +	if (!(Pipe_BytesInPipe())) +	  return PIPE_READYWAIT_NoError; + +	bool BankFull = !(Pipe_IsReadWriteAllowed()); + +	Pipe_ClearOUT(); + +	if (BankFull) +	{ +		if ((ErrorCode = Pipe_WaitUntilReady()) != PIPE_READYWAIT_NoError) +		  return ErrorCode; + +		Pipe_ClearOUT(); +	} + +	Pipe_Freeze(); +	 +	return PIPE_READYWAIT_NoError; +} + +uint8_t PRNT_Host_SendByte(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo, +                           const uint8_t Data) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(PRNTInterfaceInfo->State.IsActive)) +	  return PIPE_READYWAIT_DeviceDisconnected; +	   +	uint8_t ErrorCode; + +	Pipe_SelectPipe(PRNTInterfaceInfo->Config.DataOUTPipeNumber);	 +	Pipe_Unfreeze(); +	 +	if (!(Pipe_IsReadWriteAllowed())) +	{ +		Pipe_ClearOUT(); + +		if ((ErrorCode = Pipe_WaitUntilReady()) != PIPE_READYWAIT_NoError) +		  return ErrorCode; +	} + +	Pipe_Write_Byte(Data);	 +	Pipe_Freeze(); +	 +	return PIPE_READYWAIT_NoError; +} +  uint8_t PRNT_Host_SendString(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo,                               void* Buffer,                               const uint16_t Length) diff --git a/LUFA/Drivers/USB/Class/Host/Printer.h b/LUFA/Drivers/USB/Class/Host/Printer.h index 524547a47..01f88b9a2 100644 --- a/LUFA/Drivers/USB/Class/Host/Printer.h +++ b/LUFA/Drivers/USB/Class/Host/Printer.h @@ -114,6 +114,14 @@  			};  		/* Function Prototypes: */ +			/** General management task for a given Printer host class interface, required for the correct operation of +			 *  the interface. This should be called frequently in the main program loop, before the master USB management task +			 *  \ref USB_USBTask(). +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state. +			 */ +			void PRNT_Host_USBTask(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); +  			/** Host interface configuration routine, to configure a given Printer host interface instance using the  			 *  Configuration Descriptor read from an attached USB device. This function automatically updates the given Printer  			 *  instance's state values and configures the pipes required to communicate with the interface if it is found within @@ -159,6 +167,17 @@  			 */  			uint8_t PRNT_Host_SoftReset(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); +			/** Flushes any data waiting to be sent, ensuring that the send buffer is cleared. +			 * +			 *  \pre This function must only be called when the Host state machine is in the HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state. +			 * +			 *  \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum. +			 */ +			uint8_t PRNT_Host_Flush(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); +  			/** Sends the given raw data stream to the attached printer's input endpoint. This should contain commands that the  			 *  printer is able to understand - for example, PCL data. Not all printers accept all printer languages; see  			 *  \ref PRNT_Host_GetDeviceID() for details on determining acceptable languages for an attached printer. @@ -176,6 +195,22 @@  			                             void* Buffer,   			                             const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); +			/** Sends a given byte to the attached USB device, if connected. If a device is not connected when the function is called, the +			 *  byte is discarded. Bytes will be queued for transmission to the device until either the pipe bank becomes full, or the +			 *  \ref PRNT_Host_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be  +			 *  packed into a single pipe packet, increasing data throughput. +			 * +			 *  \pre This function must only be called when the Host state machine is in the HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state. +			 *  \param[in]     Data               Byte of data to send to the device. +			 * +			 *  \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum. +			 */ +			uint8_t PRNT_Host_SendByte(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo, +			                           const uint8_t Data) ATTR_NON_NULL_PTR_ARG(1); +  			/** Determines the number of bytes received by the printer interface from the device, waiting to be read. This indicates the number  			 *  of bytes in the IN pipe bank only, and thus the number of calls to \ref PRNT_Host_ReceiveByte() which are guaranteed to succeed  			 *  immediately. If multiple bytes are to be received, they should be buffered by the user application, as the pipe bank will not be @@ -220,19 +255,6 @@  			                              char* const DeviceIDString,  			                              const uint16_t BufferSize) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); -		/* Inline Functions: */ -			/** General management task for a given Printer host class interface, required for the correct operation of -			 *  the interface. This should be called frequently in the main program loop, before the master USB management task -			 *  \ref USB_USBTask(). -			 * -			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state. -			 */ -			static inline void PRNT_Host_USBTask(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); -			static inline void PRNT_Host_USBTask(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) -			{ -				(void)PRNTInterfaceInfo; -			} -  	/* Private Interface - For use in library only: */  	#if !defined(__DOXYGEN__)  		/* Macros: */ diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index 3120ad357..9b534bd51 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -16,7 +16,8 @@    *  - Added new USB_Device_GetFrameNumber() and USB_Host_GetFrameNumber() functions to retrieve the current USB frame number    *  - Added new USB_Host_EnableSOFEvents(), USB_Host_DisableSOFEvents() and EVENT_USB_Host_StartOfFrame() for the user application    *    handling of USB Start of Frame events while in USB Host mode -  *  - Added new PRNT_Host_BytesReceived() and PRNT_Host_ReceiveByte() functions to the Print Host Class driver +  *  - Added new PRNT_Host_BytesReceived(), PRNT_Host_ReceiveByte(), PRNT_Host_SendByte() and PRNT_Host_Flush() functions to the +  *    Print Host Class driver    *  - Added class specific descriptor type defines with standard USB-IF element naming    *  - Added new project makefile template to the library and moved board driver stub files into in a new "CodeTemplates" directory    * | 
