aboutsummaryrefslogtreecommitdiffstats
path: root/Bootloaders
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2013-03-27 18:55:30 +0000
committerDean Camera <dean@fourwalledcubicle.com>2013-03-27 18:55:30 +0000
commit4ba40977162ef46f328d49c4d48d7d8a0c6cddf0 (patch)
tree64b89cdabe81d691bc7bd891674386e498578499 /Bootloaders
parentf2e974954bcc02bb39e3bf2e142a08c9243c654d (diff)
downloadlufa-4ba40977162ef46f328d49c4d48d7d8a0c6cddf0.tar.gz
lufa-4ba40977162ef46f328d49c4d48d7d8a0c6cddf0.tar.bz2
lufa-4ba40977162ef46f328d49c4d48d7d8a0c6cddf0.zip
Fixed race condition in the DFU class bootloader causing failed device reprogramming in some circumstances (thanks to Luis Mendes).
Diffstat (limited to 'Bootloaders')
-rw-r--r--Bootloaders/DFU/BootloaderDFU.c16
-rw-r--r--Bootloaders/Printer/BootloaderPrinter.c14
2 files changed, 28 insertions, 2 deletions
diff --git a/Bootloaders/DFU/BootloaderDFU.c b/Bootloaders/DFU/BootloaderDFU.c
index 0ac9af9f7..f19fa03ed 100644
--- a/Bootloaders/DFU/BootloaderDFU.c
+++ b/Bootloaders/DFU/BootloaderDFU.c
@@ -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);
diff --git a/Bootloaders/Printer/BootloaderPrinter.c b/Bootloaders/Printer/BootloaderPrinter.c
index 9a6a8c27f..c459e031a 100644
--- a/Bootloaders/Printer/BootloaderPrinter.c
+++ b/Bootloaders/Printer/BootloaderPrinter.c
@@ -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();
}