Fix issue with CDC device demos causing broken communications when the device tries...
authorDean Camera <dean@fourwalledcubicle.com>
Tue, 4 Aug 2009 08:06:26 +0000 (08:06 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Tue, 4 Aug 2009 08:06:26 +0000 (08:06 +0000)
Demos/Device/LowLevel/CDC/CDC.c
LUFA/Drivers/USB/Class/Device/CDC.c
LUFA/ManPages/ChangeLog.txt

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