Fixed race condition in the DFU class bootloader causing failed device reprogramming in some circumstances (thanks to Luis Mendes).

This commit is contained in:
Dean Camera 2013-03-27 18:55:30 +00:00
parent f2e974954b
commit 4ba4097716
3 changed files with 29 additions and 2 deletions

View 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);