From 1b2cd16976207c21bbdfbd15852b0afa92c0f516 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Mon, 30 Nov 2009 02:20:26 +0000
Subject: [PATCH] Added CDC_Host_Flush() function to the CDC Host Class driver
 to flush sent data to the attached device.

---
 Demos/Host/ClassDriver/CDCHost/CDCHost.c    |  2 +
 LUFA/Drivers/USB/Class/Host/CDC.c           | 42 +++++++++++++++++++++
 LUFA/Drivers/USB/Class/Host/CDC.h           |  8 ++++
 LUFA/Drivers/USB/HighLevel/StdDescriptors.h |  1 +
 LUFA/ManPages/ChangeLog.txt                 |  5 ++-
 Projects/AVRISP/AVRISP.txt                  |  1 +
 6 files changed, 57 insertions(+), 2 deletions(-)

diff --git a/Demos/Host/ClassDriver/CDCHost/CDCHost.c b/Demos/Host/ClassDriver/CDCHost/CDCHost.c
index 42fae013a..4b08f7d57 100644
--- a/Demos/Host/ClassDriver/CDCHost/CDCHost.c
+++ b/Demos/Host/ClassDriver/CDCHost/CDCHost.c
@@ -111,6 +111,8 @@ int main(void)
 					/* Echo received bytes from the attached device through the USART */
 					while (CDC_Host_BytesReceived(&VirtualSerial_CDC_Interface))
 					  putchar(CDC_Host_ReceiveByte(&VirtualSerial_CDC_Interface));
+					  
+					CDC_Host_Flush(&VirtualSerial_CDC_Interface);  
 				}
 			
 				break;
diff --git a/LUFA/Drivers/USB/Class/Host/CDC.c b/LUFA/Drivers/USB/Class/Host/CDC.c
index 20fa65988..ebd332c97 100644
--- a/LUFA/Drivers/USB/Class/Host/CDC.c
+++ b/LUFA/Drivers/USB/Class/Host/CDC.c
@@ -374,6 +374,48 @@ uint8_t CDC_Host_ReceiveByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
 	return ReceivedByte;
 }
 
+uint8_t CDC_Host_Flush(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive))
+	  return PIPE_READYWAIT_DeviceDisconnected;
+	  
+	uint8_t ErrorCode;
+
+	if (CDCInterfaceInfo->State.BidirectionalDataEndpoints)
+	{
+		Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber);
+		Pipe_SetPipeToken(PIPE_TOKEN_OUT);
+	}
+	else
+	{
+		Pipe_SelectPipe(CDCInterfaceInfo->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();
+
+	if (CDCInterfaceInfo->State.BidirectionalDataEndpoints)
+	  Pipe_SetPipeToken(PIPE_TOKEN_IN);
+	
+	return PIPE_READYWAIT_NoError;
+}
+
 void CDC_Host_CreateStream(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, FILE* Stream)
 {
 	*Stream = (FILE)FDEV_SETUP_STREAM(CDC_Host_putchar, CDC_Host_getchar, _FDEV_SETUP_RW);
diff --git a/LUFA/Drivers/USB/Class/Host/CDC.h b/LUFA/Drivers/USB/Class/Host/CDC.h
index 03b31d0ed..1873f5599 100644
--- a/LUFA/Drivers/USB/Class/Host/CDC.h
+++ b/LUFA/Drivers/USB/Class/Host/CDC.h
@@ -214,6 +214,14 @@
 			 */
 			uint8_t CDC_Host_ReceiveByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
 			
+			/** Flushes any data waiting to be sent, ensuring that the send buffer is cleared.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state
+			 *
+			 *  \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum
+			 */
+			uint8_t CDC_Host_Flush(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
 			/** Creates a standard characer stream for the given CDC Device instance so that it can be used with all the regular
 			 *  functions in the avr-libc <stdio.h> library that accept a FILE stream as a destination (e.g. fprintf). The created
 			 *  stream is bidirectional and can be used for both input and output functions.
diff --git a/LUFA/Drivers/USB/HighLevel/StdDescriptors.h b/LUFA/Drivers/USB/HighLevel/StdDescriptors.h
index 19ca8aa69..286294424 100644
--- a/LUFA/Drivers/USB/HighLevel/StdDescriptors.h
+++ b/LUFA/Drivers/USB/HighLevel/StdDescriptors.h
@@ -43,6 +43,7 @@
 	/* Includes: */
 		#include <avr/pgmspace.h>
 		#include <stdbool.h>
+		#include <stddef.h>
 
 		#include "../../../Common/Common.h"
 		#include "USBMode.h"
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 4b37995af..05c74deca 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -12,9 +12,10 @@
   *  - Added activity LED indicators to the AVRISP project to indicate when the device is busy processing a command
   *  - The USB target family and allowable USB mode tokens are now public and documented (USB_CAN_BE_*, USB_SERIES_*_AVR)
   *  - Added new XPLAIN USB to Serial Bridge project (thanks to John Steggall)
-  *  - Added new RNDISHost Host LowLevel demo
+  *  - Added new RNDIS Ethernet Host LowLevel demo
   *  - Added new RNDIS Ethernet Host Class Driver
-  *  - Added new RNDISEthernet Host ClassDriver demo
+  *  - Added new RNDIS Ethernet Host ClassDriver demo
+  *  - Added CDC_Host_Flush() function to the CDC Host Class driver to flush sent data to the attached device
   *
   *  <b>Changed:</b>
   *  - Removed code in the Keyboard demos to send zeroed reports between two reports with differing numbers of keycodes
diff --git a/Projects/AVRISP/AVRISP.txt b/Projects/AVRISP/AVRISP.txt
index 249976350..fcb0fdd3d 100644
--- a/Projects/AVRISP/AVRISP.txt
+++ b/Projects/AVRISP/AVRISP.txt
@@ -56,6 +56,7 @@
  *  Note that this design currently has several limitations:
  *    - Minimum target clock speed of 500KHz due to hardware SPI used
  *    - No reversed/shorted target connector detection and notification
+ *    - PDI programming is not supported for XMEGA targets
  *
  *  On AVR models with an ADC converter, ACC should be tied to 5V (e.g. VBUS) and the VTARGET_ADC_CHANNEL token should be
  *  set to an appropriate ADC channel number in the project makefile for VTARGET detection to operate correctly. On models
-- 
GitLab