From 1b2cd16976207c21bbdfbd15852b0afa92c0f516 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Mon, 30 Nov 2009 02:20:26 +0000 Subject: Added CDC_Host_Flush() function to the CDC Host Class driver to flush sent data to the attached device. --- LUFA/Drivers/USB/Class/Host/CDC.c | 42 +++++++++++++++++++++++++++++++++++++++ LUFA/Drivers/USB/Class/Host/CDC.h | 8 ++++++++ 2 files changed, 50 insertions(+) (limited to 'LUFA/Drivers/USB/Class') 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 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. -- cgit v1.2.3