{\r
if (Pipe_IsEndpointBound(EndpointData->EndpointAddress))\r
{\r
- BidirectionalDataEndpoints = true;\r
+ CDCInterfaceInfo->State.BidirectionalDataEndpoints = true;\r
Pipe_DisablePipe();\r
}\r
\r
{\r
if (Pipe_IsEndpointBound(EndpointData->EndpointAddress))\r
{\r
- BidirectionalDataEndpoints = true;\r
+ CDCInterfaceInfo->State.BidirectionalDataEndpoints = true;\r
}\r
else\r
{\r
uint8_t CDC_Host_SendString(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, char* Data, const uint16_t Length)\r
{\r
if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive))\r
- return PIPE_READYWAIT_NoError;\r
+ return PIPE_READYWAIT_DeviceDisconnected;\r
\r
uint8_t ErrorCode;\r
\r
if (CDCInterfaceInfo->State.BidirectionalDataEndpoints)\r
{\r
Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber);\r
- Pipe_SetPipeToken(PIPE_TOKEN_IN);\r
+ Pipe_SetPipeToken(PIPE_TOKEN_OUT);\r
}\r
else\r
{\r
uint8_t CDC_Host_SendByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, const uint8_t Data)\r
{\r
if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive))\r
- return PIPE_READYWAIT_NoError;;\r
+ return PIPE_READYWAIT_DeviceDisconnected;\r
\r
uint8_t ErrorCode;\r
\r
if (CDCInterfaceInfo->State.BidirectionalDataEndpoints)\r
{\r
Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber);\r
- Pipe_SetPipeToken(PIPE_TOKEN_IN);\r
+ Pipe_SetPipeToken(PIPE_TOKEN_OUT);\r
}\r
else\r
{\r
uint16_t BytesInPipe = 0;\r
\r
if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive))\r
- return BytesInPipe;\r
+ return 0;\r
\r
Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber);\r
Pipe_SetPipeToken(PIPE_TOKEN_IN);\r
uint8_t ReceivedByte = 0;\r
\r
if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive))\r
- return ReceivedByte;\r
+ return 0;\r
\r
Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber);\r
Pipe_SetPipeToken(PIPE_TOKEN_IN);\r
return ReceivedByte;\r
}\r
\r
+uint8_t CDC_Host_Flush(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)\r
+{\r
+ if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive))\r
+ return PIPE_READYWAIT_DeviceDisconnected;\r
+ \r
+ uint8_t ErrorCode;\r
+\r
+ if (CDCInterfaceInfo->State.BidirectionalDataEndpoints)\r
+ {\r
+ Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber);\r
+ Pipe_SetPipeToken(PIPE_TOKEN_OUT);\r
+ }\r
+ else\r
+ {\r
+ Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipeNumber); \r
+ }\r
+ \r
+ Pipe_Unfreeze();\r
+ \r
+ if (!(Pipe_BytesInPipe()))\r
+ return PIPE_READYWAIT_NoError;\r
+\r
+ bool BankFull = !(Pipe_IsReadWriteAllowed());\r
+\r
+ Pipe_ClearOUT();\r
+\r
+ if (BankFull)\r
+ {\r
+ if ((ErrorCode = Pipe_WaitUntilReady()) != PIPE_READYWAIT_NoError)\r
+ return ErrorCode;\r
+\r
+ Pipe_ClearOUT();\r
+ }\r
+\r
+ Pipe_Freeze();\r
+\r
+ if (CDCInterfaceInfo->State.BidirectionalDataEndpoints)\r
+ Pipe_SetPipeToken(PIPE_TOKEN_IN);\r
+ \r
+ return PIPE_READYWAIT_NoError;\r
+}\r
+\r
void CDC_Host_CreateStream(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, FILE* Stream)\r
{\r
*Stream = (FILE)FDEV_SETUP_STREAM(CDC_Host_putchar, CDC_Host_getchar, _FDEV_SETUP_RW);\r