Commit 7d4bca50 authored by Scott Allen's avatar Scott Allen Committed by Martino Facchin

Always read key to check for new LUFA bootloader

Instead of checking for the NEW_LUFA_SIGNATURE once in program memory and then
setting a flag which is used for further checks, a function is used that always
checks program memory directly.

If a flag is used, there's a slight chance that its location in RAM could fall
on MAGIC_KEY_POS. In this case, an aborted USB auto-reset sequence may fail.
parent 31223160
...@@ -36,8 +36,6 @@ static volatile int32_t breakValue = -1; ...@@ -36,8 +36,6 @@ static volatile int32_t breakValue = -1;
static u8 wdtcsr_save; static u8 wdtcsr_save;
bool _updatedLUFAbootloader = false;
#define WEAK __attribute__ ((weak)) #define WEAK __attribute__ ((weak))
extern const CDCDescriptor _cdcInterface PROGMEM; extern const CDCDescriptor _cdcInterface PROGMEM;
...@@ -59,6 +57,11 @@ const CDCDescriptor _cdcInterface = ...@@ -59,6 +57,11 @@ const CDCDescriptor _cdcInterface =
D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_IN ),USB_ENDPOINT_TYPE_BULK,USB_EP_SIZE,0) D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_IN ),USB_ENDPOINT_TYPE_BULK,USB_EP_SIZE,0)
}; };
bool isLUFAbootloader()
{
return pgm_read_word(FLASHEND - 1) == NEW_LUFA_SIGNATURE;
}
int CDC_GetInterface(u8* interfaceNum) int CDC_GetInterface(u8* interfaceNum)
{ {
interfaceNum[0] += 2; // uses 2 interfaceNum[0] += 2; // uses 2
...@@ -108,7 +111,7 @@ bool CDC_Setup(USBSetup& setup) ...@@ -108,7 +111,7 @@ bool CDC_Setup(USBSetup& setup)
#if MAGIC_KEY_POS != (RAMEND-1) #if MAGIC_KEY_POS != (RAMEND-1)
// For future boards save the key in the inproblematic RAMEND // For future boards save the key in the inproblematic RAMEND
// Which is reserved for the main() return value (which will never return) // Which is reserved for the main() return value (which will never return)
if (_updatedLUFAbootloader) { if (isLUFAbootloader()) {
// horray, we got a new bootloader! // horray, we got a new bootloader!
magic_key_pos = (RAMEND-1); magic_key_pos = (RAMEND-1);
} }
......
...@@ -35,7 +35,6 @@ extern const u16 STRING_LANGUAGE[] PROGMEM; ...@@ -35,7 +35,6 @@ extern const u16 STRING_LANGUAGE[] PROGMEM;
extern const u8 STRING_PRODUCT[] PROGMEM; extern const u8 STRING_PRODUCT[] PROGMEM;
extern const u8 STRING_MANUFACTURER[] PROGMEM; extern const u8 STRING_MANUFACTURER[] PROGMEM;
extern const DeviceDescriptor USB_DeviceDescriptorIAD PROGMEM; extern const DeviceDescriptor USB_DeviceDescriptorIAD PROGMEM;
extern bool _updatedLUFAbootloader;
const u16 STRING_LANGUAGE[2] = { const u16 STRING_LANGUAGE[2] = {
(3<<8) | (2+2), (3<<8) | (2+2),
...@@ -819,12 +818,6 @@ void USBDevice_::attach() ...@@ -819,12 +818,6 @@ void USBDevice_::attach()
UDIEN = (1<<EORSTE) | (1<<SOFE) | (1<<SUSPE); // Enable interrupts for EOR (End of Reset), SOF (start of frame) and SUSPEND UDIEN = (1<<EORSTE) | (1<<SOFE) | (1<<SUSPE); // Enable interrupts for EOR (End of Reset), SOF (start of frame) and SUSPEND
TX_RX_LED_INIT; TX_RX_LED_INIT;
#if MAGIC_KEY_POS != (RAMEND-1)
if (pgm_read_word(FLASHEND - 1) == NEW_LUFA_SIGNATURE) {
_updatedLUFAbootloader = true;
}
#endif
} }
void USBDevice_::detach() void USBDevice_::detach()
......
...@@ -285,8 +285,7 @@ typedef struct ...@@ -285,8 +285,7 @@ typedef struct
// Old Caterina bootloader places the MAGIC key into unsafe RAM locations (it can be rewritten // Old Caterina bootloader places the MAGIC key into unsafe RAM locations (it can be rewritten
// by the running sketch before to actual reboot). // by the running sketch before to actual reboot).
// Newer bootloaders, recognizable by the LUFA "signature" at the end of the flash, can handle both // Newer bootloaders, recognizable by the LUFA "signature" at the end of the flash, can handle both
// the usafe and the safe location. Check once (in USBCore.cpp) if the bootloader in new, then set the global // the usafe and the safe location.
// _updatedLUFAbootloader variable to true/false and place the magic key consequently
#ifndef MAGIC_KEY #ifndef MAGIC_KEY
#define MAGIC_KEY 0x7777 #define MAGIC_KEY 0x7777
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment