diff --git a/Demos/Host/ClassDriver/CDCHost/CDCHost.c b/Demos/Host/ClassDriver/CDCHost/CDCHost.c index 42fae013a3..4b08f7d57c 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 20fa65988d..ebd332c970 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 03b31d0edd..1873f55999 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 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 19ca8aa691..2862944242 100644 --- a/LUFA/Drivers/USB/HighLevel/StdDescriptors.h +++ b/LUFA/Drivers/USB/HighLevel/StdDescriptors.h @@ -43,6 +43,7 @@ /* Includes: */ #include #include + #include #include "../../../Common/Common.h" #include "USBMode.h" diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index 4b37995aff..05c74deca2 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 * * Changed: * - 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 249976350f..fcb0fdd3db 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