Fixed race condition in the DFU class bootloader causing failed device reprogramming...
authorDean Camera <dean@fourwalledcubicle.com>
Wed, 27 Mar 2013 18:55:30 +0000 (18:55 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Wed, 27 Mar 2013 18:55:30 +0000 (18:55 +0000)
Bootloaders/DFU/BootloaderDFU.c
Bootloaders/Printer/BootloaderPrinter.c
LUFA/DoxygenPages/ChangeLog.txt

index 0ac9af9..f19fa03 100644 (file)
@@ -132,7 +132,7 @@ void Application_Jump_Check(void)
        {
                /* Turn off the watchdog */
                MCUSR &= ~(1<<WDRF);
-               wdt_disable(); 
+               wdt_disable();
 
                /* Clear the boot key and jump to the user application */
                MagicBootKey = 0;
@@ -197,7 +197,7 @@ static void ResetHardware(void)
        /* Shut down the USB and other board hardware drivers */
        USB_Disable();
        LEDs_Disable();
-       
+
        /* Disable Bootloader active LED toggle timer */
        TIMSK1 = 0;
        TCCR1B = 0;
@@ -489,6 +489,12 @@ void EVENT_USB_Device_ControlRequest(void)
                case DFU_REQ_GETSTATUS:
                        Endpoint_ClearSETUP();
 
+                       while (!(Endpoint_IsINReady()))
+                       {
+                               if (USB_DeviceState == DEVICE_STATE_Unattached)
+                                 return;
+                       }
+
                        /* Write 8-bit status value */
                        Endpoint_Write_8(DFU_Status);
 
@@ -517,6 +523,12 @@ void EVENT_USB_Device_ControlRequest(void)
                case DFU_REQ_GETSTATE:
                        Endpoint_ClearSETUP();
 
+                       while (!(Endpoint_IsINReady()))
+                       {
+                               if (USB_DeviceState == DEVICE_STATE_Unattached)
+                                 return;
+                       }
+
                        /* Write the current device state to the endpoint */
                        Endpoint_Write_8(DFU_State);
 
index 9a6a8c2..c459e03 100644 (file)
@@ -380,6 +380,13 @@ void EVENT_USB_Device_ControlRequest(void)
                                        "CLS:PRINTER";
 
                                Endpoint_ClearSETUP();
+
+                               while (!(Endpoint_IsINReady()))
+                               {
+                                       if (USB_DeviceState == DEVICE_STATE_Unattached)
+                                         return;
+                               }
+
                                Endpoint_Write_16_BE(sizeof(PrinterIDString));
                                Endpoint_Write_Control_Stream_LE(PrinterIDString, strlen(PrinterIDString));
                                Endpoint_ClearStatusStage();
@@ -390,6 +397,13 @@ void EVENT_USB_Device_ControlRequest(void)
                        if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
                                Endpoint_ClearSETUP();
+
+                               while (!(Endpoint_IsINReady()))
+                               {
+                                       if (USB_DeviceState == DEVICE_STATE_Unattached)
+                                         return;
+                               }
+
                                Endpoint_Write_8(PRNT_PORTSTATUS_NOTERROR | PRNT_PORTSTATUS_SELECT);
                                Endpoint_ClearStatusStage();
                        }
index cd4310a..e7615fd 100644 (file)
@@ -24,6 +24,7 @@
   *     unknown SCSI command
   *   - Fixed incorrect HID report descriptor generated for 16-bit axis ranges by the HID_DESCRIPTOR_MOUSE() and HID_DESCRIPTOR_JOYSTICK()
   *     macros (thanks to Armory)
+  *   - Fixed race condition in the DFU class bootloader causing failed device reprogramming in some circumstances (thanks to Luis Mendes)
   *
   *  \section Sec_ChangeLog130303 Version 130303
   *  <b>New:</b>