mirror of
https://github.com/qmk/qmk_firmware.git
synced 2025-07-16 04:41:28 +00:00
Fixed race condition in the DFU class bootloader causing failed device reprogramming in some circumstances (thanks to Luis Mendes).
This commit is contained in:
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…
Reference in New Issue
Block a user