Moved calls to Device mode Class Driver events to after the request has been acknowle...
authorDean Camera <dean@fourwalledcubicle.com>
Sun, 22 Aug 2010 02:45:20 +0000 (02:45 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Sun, 22 Aug 2010 02:45:20 +0000 (02:45 +0000)
Fixed USBtoSerial and Benito project SetLineEncoding calls failing if the USART is busy, due to the RX ISR delaying the control request handler.

LUFA/Drivers/USB/Class/Device/CDC.c
LUFA/Drivers/USB/Class/Device/RNDIS.c
LUFA/ManPages/ChangeLog.txt
Projects/Benito/makefile
Projects/USBtoSerial/USBtoSerial.c
Projects/USBtoSerial/makefile

index 3915460..bf852c7 100644 (file)
@@ -64,21 +64,24 @@ void CDC_Device_ProcessControlRequest(USB_ClassInfo_CDC_Device_t* const CDCInter
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
                                Endpoint_ClearSETUP();
+
                                Endpoint_Read_Control_Stream_LE(&CDCInterfaceInfo->State.LineEncoding, sizeof(CDCInterfaceInfo->State.LineEncoding));
-                               EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo);
                                Endpoint_ClearIN();
+
+                               EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo);
                        }
        
                        break;
                case REQ_SetControlLineState:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
                        {                               
-                               Endpoint_ClearSETUP();
-                               
+                               Endpoint_ClearSETUP();                          
+
                                CDCInterfaceInfo->State.ControlLineStates.HostToDevice = USB_ControlRequest.wValue;
-                               EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo);
 
                                Endpoint_ClearStatusStage();
+
+                               EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo);
                        }
        
                        break;
@@ -86,10 +89,9 @@ void CDC_Device_ProcessControlRequest(USB_ClassInfo_CDC_Device_t* const CDCInter
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
                        {                               
                                Endpoint_ClearSETUP();
-                               
-                               EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue);
-
                                Endpoint_ClearStatusStage();
+
+                               EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue);
                        }
 
                        break;
index ff790b7..da1e450 100644 (file)
@@ -83,8 +83,9 @@ void RNDIS_Device_ProcessControlRequest(USB_ClassInfo_RNDIS_Device_t* const RNDI
                                Endpoint_ClearSETUP();
 
                                Endpoint_Read_Control_Stream_LE(RNDISInterfaceInfo->State.RNDISMessageBuffer, USB_ControlRequest.wLength);
-                               RNDIS_Device_ProcessRNDISControlMessage(RNDISInterfaceInfo);
                                Endpoint_ClearIN();
+
+                               RNDIS_Device_ProcessRNDISControlMessage(RNDISInterfaceInfo);
                        }
                        
                        break;
index f37117a..8fc0711 100644 (file)
@@ -20,6 +20,8 @@
   *    SCSI_Codes.h file as these values are part of the MassStorage Class Driver
   *  - Added compile time error to the AVRISP-MKII project when built for the U4 chips, as the default VTARGET detection ADC channel
   *    does not exist on these chips (thanks to Marco)
+  *  - Moved calls to Device mode Class Driver events to after the request has been acknowledged, so that long event handlers do
+  *    do skew the timing of the control requests
   *
   *  <b>Fixed:</b>
   *  - Fixed USB_GetHIDReportItemInfo() function modifying the given report item's data when the report item does not exist
@@ -28,6 +30,8 @@
   *    missed SCSI sense values when the host retrieves the sense key (thanks to Martin Degelsegger)
   *  - Fixed critical pipe/endpoint memory allocation issue where the bank memory address space could be silently overlapped
   *    in the USB controller if the endpoints or pipes were allocated in anything other than ascending order (thanks to Martin Degelsegger)
+  *  - Fixed USBtoSerial and Benito project SetLineEncoding calls failing if the USART is busy, due to the RX ISR delaying the control
+  *    request handler
   *
   *  \section Sec_ChangeLog100807 Version 100807
   *  <b>New:</b>
index d8babd8..23b9ed1 100644 (file)
@@ -121,6 +121,7 @@ LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8
 LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
 LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
 LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT
 
 LUFA_OPTS += -D AVR_RESET_LINE_PORT="PORTD"
 LUFA_OPTS += -D AVR_RESET_LINE_DDR="DDRD"
index b50537e..845c2a5 100644 (file)
@@ -207,6 +207,6 @@ void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCI
        
        /* Reconfigure the USART in double speed mode for a wider baud rate range at the expense of accuracy */
        UCSR1C = ConfigMask;
-       UCSR1A = (1 << U2X1);   
+       UCSR1A = (1 << U2X1);
        UCSR1B = ((1 << RXCIE1) | (1 << TXEN1) | (1 << RXEN1));
 }
index a87f303..b77b6b6 100644 (file)
@@ -121,6 +121,7 @@ LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8
 LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
 LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
 LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT
 
 
 # Create the LUFA source path variables by including the LUFA root makefile