Commit eff07bb8 authored by Dean Camera's avatar Dean Camera
Browse files

Fix issue with CDC device demos causing broken communications when the device...

Fix issue with CDC device demos causing broken communications when the device tries to send data before the host has set the line encoding.
parent 5c069f90
......@@ -49,6 +49,12 @@ CDC_Line_Coding_t LineCoding = { .BaudRateBPS = 9600,
.CharFormat = OneStopBit,
.ParityType = Parity_None,
.DataBits = 8 };
/** Indicates if the host has set the device line encoding. Until the line encoding is set by the host, the device should
* not attempt to send any bytes.
*/
bool LineEncodingSet = false;
#if 0
/* NOTE: Here you can set up a standard stream using the created virtual serial port, so that the standard stream functions in
......@@ -59,6 +65,9 @@ static int CDC_putchar(char c, FILE *stream)
{
Endpoint_SelectEndpoint(CDC_TX_EPNUM);
if (!(LineEncodingSet))
return -1;
while (!(Endpoint_IsReadWriteAllowed()))
{
if (USB_DeviceState != DEVICE_STATE_Configured)
......@@ -74,7 +83,10 @@ static int CDC_putchar(char c, FILE *stream)
static int CDC_getchar(FILE *stream)
{
int c;
if (!(LineEncodingSet))
return -1;
Endpoint_SelectEndpoint(CDC_RX_EPNUM);
for (;;)
......@@ -216,6 +228,9 @@ void EVENT_USB_UnhandledControlPacket(void)
/* Read the line coding data in from the host into the global struct */
Endpoint_Read_Control_Stream_LE(LineCodingData, sizeof(CDC_Line_Coding_t));
/* Indicate that the line encoding has been set, and the device may now send data */
LineEncodingSet = true;
/* Finalize the stream transfer to clear the last packet from the host */
Endpoint_ClearIN();
......@@ -299,7 +314,7 @@ void CDC_Task(void)
{
ActionSent = false;
}
else if (ActionSent == false)
else if ((ActionSent == false) && LineEncodingSet)
{
ActionSent = true;
......
......@@ -139,16 +139,16 @@ void CDC_Device_USBTask(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo)
void CDC_Device_SendString(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, char* const Data, const uint16_t Length)
{
if (USB_DeviceState != DEVICE_STATE_Configured)
if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
return;
Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpointNumber);
Endpoint_Write_Stream_LE(Data, Length, NO_STREAM_CALLBACK);
}
void CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, const uint8_t Data)
{
if (USB_DeviceState != DEVICE_STATE_Configured)
if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
return;
Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpointNumber);
......
......@@ -58,6 +58,8 @@
* internal control
* - Interrupts are no longer disabled during the processing of Control Requests on the default endpoint while in device mode
* - AudioOutput demos now always output to board LEDs, regardless of output mode (removed AUDIO_OUT_LEDS project option)
* - Removed SINGLE_DEVICE_CONFIGURATION compile time option in favour of the new FIXED_NUM_CONFIGURATIONS option so that the exact number
* of device configurations can be defined statically
*
* <b>Fixed:</b>
* - Changed bootloaders to use FLASHEND rather than the existence of RAMPZ to determine if far FLASH pointers are needed to fix
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment