1
0
Fork 0

Re-fix the STM32 dual-bank bootloader stuff. (#9738)

* Re-fix the dual-bank bootloader stuff.

* Use wait_ms() instead of using nop's for a delay, as ChibiOS is actually running at the time of bootloader jump.
This commit is contained in:
Nick Brassel 2020-07-17 06:19:18 +10:00 committed by James Young
parent b0335b2731
commit 686a9d35ff

View file

@ -2,6 +2,7 @@
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "wait.h"
/* This code should be checked whether it runs correctly on platforms */ /* This code should be checked whether it runs correctly on platforms */
#define SYMVAL(sym) (uint32_t)(((uint8_t *)&(sym)) - ((uint8_t *)0)) #define SYMVAL(sym) (uint32_t)(((uint8_t *)&(sym)) - ((uint8_t *)0))
@ -31,25 +32,7 @@
extern uint32_t __ram0_end__; extern uint32_t __ram0_end__;
# define bootdelay(loopcount) \
do { \
for (int i = 0; i < loopcount; ++i) { \
__asm__ volatile("nop\n\t" \
"nop\n\t" \
"nop\n\t"); \
} \
} while (0)
void bootloader_jump(void) { void bootloader_jump(void) {
*MAGIC_ADDR = BOOTLOADER_MAGIC; // set magic flag => reset handler will jump into boot loader
NVIC_SystemReset();
}
void enter_bootloader_mode_if_requested(void) {
unsigned long *check = MAGIC_ADDR;
if (*check == BOOTLOADER_MAGIC) {
*check = 0;
// For STM32 MCUs with dual-bank flash, and we're incapable of jumping to the bootloader. The first valid flash // For STM32 MCUs with dual-bank flash, and we're incapable of jumping to the bootloader. The first valid flash
// bank is executed unconditionally after a reset, so it doesn't enter DFU unless BOOT0 is high. Instead, we do // bank is executed unconditionally after a reset, so it doesn't enter DFU unless BOOT0 is high. Instead, we do
// it with hardware...in this case, we pull a GPIO high/low depending on the configuration, connects 3.3V to // it with hardware...in this case, we pull a GPIO high/low depending on the configuration, connects 3.3V to
@ -63,12 +46,13 @@ void enter_bootloader_mode_if_requested(void) {
# endif # endif
// Wait for a while for the capacitor to charge // Wait for a while for the capacitor to charge
bootdelay(STM32_BOOTLOADER_DUAL_BANK_DELAY); wait_ms(100);
// Issue a system reset to get the ROM bootloader to execute, with BOOT0 high // Issue a system reset to get the ROM bootloader to execute, with BOOT0 high
NVIC_SystemReset(); NVIC_SystemReset();
} }
}
void enter_bootloader_mode_if_requested(void) {} // not needed at all, but if anybody attempts to invoke it....
#elif defined(STM32_BOOTLOADER_ADDRESS) // STM32_BOOTLOADER_DUAL_BANK #elif defined(STM32_BOOTLOADER_ADDRESS) // STM32_BOOTLOADER_DUAL_BANK