diff --git a/Demos/Host/ClassDriver/CDCHost/CDCHost.c b/Demos/Host/ClassDriver/CDCHost/CDCHost.c index 42fae013a3bbeb084f65798817a740829d31b430..4b08f7d57cd3fca1c53f4b40e8b98587f8221d76 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 20fa65988d04eed14d22013275ae17a651ba1cda..ebd332c9709e4751296ff300ad39359696b4f534 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 03b31d0eddc1b2416f981b5ed227a1ae07949c20..1873f55999dac4cb808273ac5a50318c715c232b 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 19ca8aa69161789e33a2e1301fe372985ffce7bf..28629442421ab49d82e766dc89b1fff1d684fa5a 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 4b37995aff9d8785b1a2ca1af16a7d50836f8b7a..05c74deca243d04ab69bbe71a6e40321c3019db9 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 249976350f2b916ca306b0ab6113235be356e45e..fcb0fdd3db2501fecff44d28f9006703eb4098fa 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