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

pull/1469/head
Dean Camera 12 years ago
parent f2e974954b
commit 4ba4097716

@ -132,7 +132,7 @@ void Application_Jump_Check(void)
{ {
/* Turn off the watchdog */ /* Turn off the watchdog */
MCUSR &= ~(1<<WDRF); MCUSR &= ~(1<<WDRF);
wdt_disable(); wdt_disable();
/* Clear the boot key and jump to the user application */ /* Clear the boot key and jump to the user application */
MagicBootKey = 0; MagicBootKey = 0;
@ -197,7 +197,7 @@ static void ResetHardware(void)
/* Shut down the USB and other board hardware drivers */ /* Shut down the USB and other board hardware drivers */
USB_Disable(); USB_Disable();
LEDs_Disable(); LEDs_Disable();
/* Disable Bootloader active LED toggle timer */ /* Disable Bootloader active LED toggle timer */
TIMSK1 = 0; TIMSK1 = 0;
TCCR1B = 0; TCCR1B = 0;
@ -489,6 +489,12 @@ void EVENT_USB_Device_ControlRequest(void)
case DFU_REQ_GETSTATUS: case DFU_REQ_GETSTATUS:
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
while (!(Endpoint_IsINReady()))
{
if (USB_DeviceState == DEVICE_STATE_Unattached)
return;
}
/* Write 8-bit status value */ /* Write 8-bit status value */
Endpoint_Write_8(DFU_Status); Endpoint_Write_8(DFU_Status);
@ -517,6 +523,12 @@ void EVENT_USB_Device_ControlRequest(void)
case DFU_REQ_GETSTATE: case DFU_REQ_GETSTATE:
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
while (!(Endpoint_IsINReady()))
{
if (USB_DeviceState == DEVICE_STATE_Unattached)
return;
}
/* Write the current device state to the endpoint */ /* Write the current device state to the endpoint */
Endpoint_Write_8(DFU_State); Endpoint_Write_8(DFU_State);

@ -380,6 +380,13 @@ void EVENT_USB_Device_ControlRequest(void)
"CLS:PRINTER"; "CLS:PRINTER";
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
while (!(Endpoint_IsINReady()))
{
if (USB_DeviceState == DEVICE_STATE_Unattached)
return;
}
Endpoint_Write_16_BE(sizeof(PrinterIDString)); Endpoint_Write_16_BE(sizeof(PrinterIDString));
Endpoint_Write_Control_Stream_LE(PrinterIDString, strlen(PrinterIDString)); Endpoint_Write_Control_Stream_LE(PrinterIDString, strlen(PrinterIDString));
Endpoint_ClearStatusStage(); Endpoint_ClearStatusStage();
@ -390,6 +397,13 @@ void EVENT_USB_Device_ControlRequest(void)
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
{ {
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();
while (!(Endpoint_IsINReady()))
{
if (USB_DeviceState == DEVICE_STATE_Unattached)
return;
}
Endpoint_Write_8(PRNT_PORTSTATUS_NOTERROR | PRNT_PORTSTATUS_SELECT); Endpoint_Write_8(PRNT_PORTSTATUS_NOTERROR | PRNT_PORTSTATUS_SELECT);
Endpoint_ClearStatusStage(); Endpoint_ClearStatusStage();
} }

@ -24,6 +24,7 @@
* unknown SCSI command * unknown SCSI command
* - Fixed incorrect HID report descriptor generated for 16-bit axis ranges by the HID_DESCRIPTOR_MOUSE() and HID_DESCRIPTOR_JOYSTICK() * - Fixed incorrect HID report descriptor generated for 16-bit axis ranges by the HID_DESCRIPTOR_MOUSE() and HID_DESCRIPTOR_JOYSTICK()
* macros (thanks to Armory) * 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 * \section Sec_ChangeLog130303 Version 130303
* <b>New:</b> * <b>New:</b>

Loading…
Cancel
Save