diff options
author | Dean Camera <dean@fourwalledcubicle.com> | 2013-03-27 18:55:30 +0000 |
---|---|---|
committer | Dean Camera <dean@fourwalledcubicle.com> | 2013-03-27 18:55:30 +0000 |
commit | 4ba40977162ef46f328d49c4d48d7d8a0c6cddf0 (patch) | |
tree | 64b89cdabe81d691bc7bd891674386e498578499 /Bootloaders/DFU | |
parent | f2e974954bcc02bb39e3bf2e142a08c9243c654d (diff) | |
download | lufa-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/DFU')
-rw-r--r-- | Bootloaders/DFU/BootloaderDFU.c | 16 |
1 files changed, 14 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); |