Be doubly-certain that the incomming CDC class driver's endpoint/pipe is flushed only once when the bank is empty.

This commit is contained in:
Dean Camera 2010-01-28 06:37:26 +00:00
parent cec699ac59
commit d26a9ed5fd
2 changed files with 26 additions and 10 deletions

View File

@ -190,11 +190,18 @@ uint16_t CDC_Device_BytesReceived(USB_ClassInfo_CDC_Device_t* const CDCInterface
Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataOUTEndpointNumber); Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataOUTEndpointNumber);
if (Endpoint_IsOUTReceived() && !(Endpoint_BytesInEndpoint())) if (Endpoint_IsOUTReceived())
{
if (!(Endpoint_BytesInEndpoint()))
Endpoint_ClearOUT(); Endpoint_ClearOUT();
return Endpoint_BytesInEndpoint(); return Endpoint_BytesInEndpoint();
} }
else
{
return 0;
}
}
uint8_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo) uint8_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo)
{ {

View File

@ -309,7 +309,9 @@ uint16_t CDC_Host_BytesReceived(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo
Pipe_SetPipeToken(PIPE_TOKEN_IN); Pipe_SetPipeToken(PIPE_TOKEN_IN);
Pipe_Unfreeze(); Pipe_Unfreeze();
if (Pipe_IsINReceived() && !(Pipe_BytesInPipe())) if (Pipe_IsINReceived())
{
if (!(Pipe_BytesInPipe()))
Pipe_ClearIN(); Pipe_ClearIN();
BytesInPipe = Pipe_BytesInPipe(); BytesInPipe = Pipe_BytesInPipe();
@ -317,6 +319,13 @@ uint16_t CDC_Host_BytesReceived(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo
return BytesInPipe; return BytesInPipe;
} }
else
{
Pipe_Freeze();
return 0;
}
}
uint8_t CDC_Host_ReceiveByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) uint8_t CDC_Host_ReceiveByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
{ {