diff options
author | Dean Camera <dean@fourwalledcubicle.com> | 2009-11-30 02:20:26 +0000 |
---|---|---|
committer | Dean Camera <dean@fourwalledcubicle.com> | 2009-11-30 02:20:26 +0000 |
commit | 1b2cd16976207c21bbdfbd15852b0afa92c0f516 (patch) | |
tree | 8e29d5c4e1b680790b358331e26d68e4ed3c4b10 /LUFA/Drivers/USB/Class/Host/CDC.c | |
parent | b7f6a65c258cafc3111d77502b491f223b886a33 (diff) | |
download | lufa-1b2cd16976207c21bbdfbd15852b0afa92c0f516.tar.gz lufa-1b2cd16976207c21bbdfbd15852b0afa92c0f516.tar.bz2 lufa-1b2cd16976207c21bbdfbd15852b0afa92c0f516.zip |
Added CDC_Host_Flush() function to the CDC Host Class driver to flush sent data to the attached device.
Diffstat (limited to 'LUFA/Drivers/USB/Class/Host/CDC.c')
-rw-r--r-- | LUFA/Drivers/USB/Class/Host/CDC.c | 42 |
1 files changed, 42 insertions, 0 deletions
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);
|