Commit 357ccc57 authored by Dean Camera's avatar Dean Camera
Browse files

Better fix for LowLevel CDC demo issue where sending data before the line...

Better fix for LowLevel CDC demo issue where sending data before the line encoding is set will cause a failure of the host to open the port. Added fix to the DualCDC and USBtoSerial LowLevel demos.
parent eff07bb8
......@@ -45,16 +45,10 @@
* It is possible to completely ignore these value or use other settings as the host is completely unaware of the physical
* serial link characteristics and instead sends and receives data in endpoint streams.
*/
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;
CDC_Line_Coding_t LineEncoding = { .BaudRateBPS = 0,
.CharFormat = OneStopBit,
.ParityType = Parity_None,
.DataBits = 8 };
#if 0
/* NOTE: Here you can set up a standard stream using the created virtual serial port, so that the standard stream functions in
......@@ -65,7 +59,7 @@ static int CDC_putchar(char c, FILE *stream)
{
Endpoint_SelectEndpoint(CDC_TX_EPNUM);
if (!(LineEncodingSet))
if (!(LineEncoding.BaudRateBPS))
return -1;
while (!(Endpoint_IsReadWriteAllowed()))
......@@ -84,7 +78,7 @@ static int CDC_getchar(FILE *stream)
{
int c;
if (!(LineEncodingSet))
if (!(LineEncoding.BaudRateBPS))
return -1;
Endpoint_SelectEndpoint(CDC_RX_EPNUM);
......@@ -201,8 +195,6 @@ void EVENT_USB_ConfigurationChanged(void)
*/
void EVENT_USB_UnhandledControlPacket(void)
{
uint8_t* LineCodingData = (uint8_t*)&LineCoding;
/* Process CDC specific control requests */
switch (USB_ControlRequest.bRequest)
{
......@@ -213,7 +205,7 @@ void EVENT_USB_UnhandledControlPacket(void)
Endpoint_ClearSETUP();
/* Write the line coding data to the control endpoint */
Endpoint_Write_Control_Stream_LE(LineCodingData, sizeof(CDC_Line_Coding_t));
Endpoint_Write_Control_Stream_LE(&LineEncoding, sizeof(CDC_Line_Coding_t));
/* Finalize the stream transfer to send the last packet or clear the host abort */
Endpoint_ClearOUT();
......@@ -227,10 +219,7 @@ void EVENT_USB_UnhandledControlPacket(void)
Endpoint_ClearSETUP();
/* 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;
Endpoint_Read_Control_Stream_LE(&LineEncoding, sizeof(CDC_Line_Coding_t));
/* Finalize the stream transfer to clear the last packet from the host */
Endpoint_ClearIN();
......@@ -314,7 +303,7 @@ void CDC_Task(void)
{
ActionSent = false;
}
else if ((ActionSent == false) && LineEncodingSet)
else if ((ActionSent == false) && LineEncoding.BaudRateBPS)
{
ActionSent = true;
......
......@@ -45,10 +45,10 @@
* It is possible to completely ignore these value or use other settings as the host is completely unaware of the physical
* serial link characteristics and instead sends and receives data in endpoint streams.
*/
CDC_Line_Coding_t LineCoding1 = { .BaudRateBPS = 9600,
.CharFormat = OneStopBit,
.ParityType = Parity_None,
.DataBits = 8 };
CDC_Line_Coding_t LineEncoding1 = { .BaudRateBPS = 0,
.CharFormat = OneStopBit,
.ParityType = Parity_None,
.DataBits = 8 };
/** Contains the current baud rate and other settings of the second virtual serial port. While this demo does not use
* the physical USART and thus does not use these settings, they must still be retained and returned to the host
......@@ -58,10 +58,10 @@ CDC_Line_Coding_t LineCoding1 = { .BaudRateBPS = 9600,
* It is possible to completely ignore these value or use other settings as the host is completely unaware of the physical
* serial link characteristics and instead sends and receives data in endpoint streams.
*/
CDC_Line_Coding_t LineCoding2 = { .BaudRateBPS = 9600,
.CharFormat = OneStopBit,
.ParityType = Parity_None,
.DataBits = 8 };
CDC_Line_Coding_t LineEncoding2 = { .BaudRateBPS = 0,
.CharFormat = OneStopBit,
.ParityType = Parity_None,
.DataBits = 8 };
/** Main program entry point. This routine configures the hardware required by the application, then
* starts the scheduler to run the application tasks.
......@@ -172,7 +172,7 @@ void EVENT_USB_ConfigurationChanged(void)
void EVENT_USB_UnhandledControlPacket(void)
{
/* Determine which interface's Line Coding data is being set from the wIndex parameter */
uint8_t* LineCodingData = (USB_ControlRequest.wIndex == 0) ? (uint8_t*)&LineCoding1 : (uint8_t*)&LineCoding2;
uint8_t* LineEncodingData = (USB_ControlRequest.wIndex == 0) ? (uint8_t*)&LineEncoding1 : (uint8_t*)&LineEncoding2;
/* Process CDC specific control requests */
switch (USB_ControlRequest.bRequest)
......@@ -184,7 +184,7 @@ void EVENT_USB_UnhandledControlPacket(void)
Endpoint_ClearSETUP();
/* Write the line coding data to the control endpoint */
Endpoint_Write_Control_Stream_LE(LineCodingData, sizeof(CDC_Line_Coding_t));
Endpoint_Write_Control_Stream_LE(LineEncodingData, sizeof(CDC_Line_Coding_t));
/* Finalize the stream transfer to send the last packet or clear the host abort */
Endpoint_ClearOUT();
......@@ -198,7 +198,7 @@ void EVENT_USB_UnhandledControlPacket(void)
Endpoint_ClearSETUP();
/* Read the line coding data in from the host into the global struct */
Endpoint_Read_Control_Stream_LE(LineCodingData, sizeof(CDC_Line_Coding_t));
Endpoint_Read_Control_Stream_LE(LineEncodingData, sizeof(CDC_Line_Coding_t));
/* Finalize the stream transfer to clear the last packet from the host */
Endpoint_ClearIN();
......@@ -256,7 +256,7 @@ void CDC1_Task(void)
{
ActionSent = false;
}
else if (ActionSent == false)
else if ((ActionSent == false) && LineEncoding1.BaudRateBPS)
{
ActionSent = true;
......
......@@ -36,10 +36,10 @@
* These values are set by the host via a class-specific request, and the physical USART should be reconfigured to match the
* new settings each time they are changed by the host.
*/
CDC_Line_Coding_t LineCoding = { .BaudRateBPS = 9600,
.CharFormat = OneStopBit,
.ParityType = Parity_None,
.DataBits = 8 };
CDC_Line_Coding_t LineEncoding = { .BaudRateBPS = 0,
.CharFormat = OneStopBit,
.ParityType = Parity_None,
.DataBits = 8 };
/** Ring (circular) buffer to hold the RX data - data from the host to the attached device on the serial port. */
RingBuff_t Rx_Buffer;
......@@ -145,8 +145,6 @@ void EVENT_USB_ConfigurationChanged(void)
*/
void EVENT_USB_UnhandledControlPacket(void)
{
uint8_t* LineCodingData = (uint8_t*)&LineCoding;
/* Process CDC specific control requests */
switch (USB_ControlRequest.bRequest)
{
......@@ -157,7 +155,7 @@ void EVENT_USB_UnhandledControlPacket(void)
Endpoint_ClearSETUP();
/* Write the line coding data to the control endpoint */
Endpoint_Write_Control_Stream_LE(LineCodingData, sizeof(LineCoding));
Endpoint_Write_Control_Stream_LE(&LineEncoding, sizeof(LineEncoding));
/* Finalize the stream transfer to send the last packet or clear the host abort */
Endpoint_ClearOUT();
......@@ -171,7 +169,7 @@ void EVENT_USB_UnhandledControlPacket(void)
Endpoint_ClearSETUP();
/* Read the line coding data in from the host into the global struct */
Endpoint_Read_Control_Stream_LE(LineCodingData, sizeof(LineCoding));
Endpoint_Read_Control_Stream_LE(&LineEncoding, sizeof(LineEncoding));
/* Finalize the stream transfer to clear the last packet from the host */
Endpoint_ClearIN();
......@@ -259,7 +257,7 @@ void CDC_Task(void)
Endpoint_SelectEndpoint(CDC_TX_EPNUM);
/* Check if the Tx buffer contains anything to be sent to the host */
if (Tx_Buffer.Elements)
if ((Tx_Buffer.Elements) && LineEncoding.BaudRateBPS)
{
/* Wait until Serial Tx Endpoint Ready for Read/Write */
while (!(Endpoint_IsReadWriteAllowed()))
......@@ -304,7 +302,7 @@ void CDC_Task(void)
ISR(USART1_RX_vect, ISR_BLOCK)
{
/* Only store received characters if the USB interface is connected */
if (USB_DeviceState != DEVICE_STATE_Configured)
if ((USB_DeviceState != DEVICE_STATE_Configured) && LineEncoding.BaudRateBPS)
Buffer_StoreElement(&Tx_Buffer, UDR1);
}
......@@ -314,21 +312,21 @@ void ReconfigureUSART(void)
uint8_t ConfigMask = 0;
/* Determine parity - non odd/even parity mode defaults to no parity */
if (LineCoding.ParityType == Parity_Odd)
if (LineEncoding.ParityType == Parity_Odd)
ConfigMask = ((1 << UPM11) | (1 << UPM10));
else if (LineCoding.ParityType == Parity_Even)
else if (LineEncoding.ParityType == Parity_Even)
ConfigMask = (1 << UPM11);
/* Determine stop bits - 1.5 stop bits is set as 1 stop bit due to hardware limitations */
if (LineCoding.CharFormat == TwoStopBits)
if (LineEncoding.CharFormat == TwoStopBits)
ConfigMask |= (1 << USBS1);
/* Determine data size - 5, 6, 7, or 8 bits are supported */
if (LineCoding.DataBits == 6)
if (LineEncoding.DataBits == 6)
ConfigMask |= (1 << UCSZ10);
else if (LineCoding.DataBits == 7)
else if (LineEncoding.DataBits == 7)
ConfigMask |= (1 << UCSZ11);
else if (LineCoding.DataBits == 8)
else if (LineEncoding.DataBits == 8)
ConfigMask |= ((1 << UCSZ11) | (1 << UCSZ10));
/* Enable double speed, gives better error percentages at 8MHz */
......@@ -341,5 +339,5 @@ void ReconfigureUSART(void)
UCSR1C = ConfigMask;
/* Set the USART baud rate register to the desired baud rate value */
UBRR1 = SERIAL_2X_UBBRVAL((uint16_t)LineCoding.BaudRateBPS);
UBRR1 = SERIAL_2X_UBBRVAL((uint16_t)LineEncoding.BaudRateBPS);
}
......@@ -68,6 +68,7 @@
* to only unfreeze and check one data pipe at a time) to prevent incorrect device enumerations and freezes while trasferring data
* - Make Pipe_ConfigurePipe() mask the given endpoint number against PIPE_EPNUM_MASK to ensure the endpoint IN direction bit is
* cleared to prevent endpoint type corruption
* - Fixed issue opening CDC-ACM ports on hosts when the CDC device tries to send data before the host has set the line encoding
* - Fixed USB_OPT_MANUAL_PLL option being ignored during device disconnects on some models (thanks to Brian Dickman)
* - Fixed documentation mentioning Pipe_GetCurrentToken() function when correct function name is Pipe_GetPipeToken()
* - Fixed ADC driver for the ATMEGA32U4 and ATMEGA16U4 (thanks to Opendous Inc.)
......
Markdown is supported
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