From a87e1c6d15ef90b3ff7071abb86d3ef0d035b7fd Mon Sep 17 00:00:00 2001 From: Conor Patrick Date: Tue, 2 Feb 2021 22:26:31 -0800 Subject: [PATCH] fix init order to prevent reset loop in some cases --- targets/stm32l432/src/device.c | 17 ++++++++--------- targets/stm32l432/src/flash.c | 12 ++++++++---- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/targets/stm32l432/src/device.c b/targets/stm32l432/src/device.c index f244388..f681306 100644 --- a/targets/stm32l432/src/device.c +++ b/targets/stm32l432/src/device.c @@ -304,12 +304,6 @@ void device_init() hw_init(LOW_FREQUENCY); -#if BOOT_TO_DFU - flash_option_bytes_init(1); -#else - flash_option_bytes_init(0); -#endif - if (! tsc_sensor_exists()) { _NFC_status = nfc_init(); @@ -329,13 +323,18 @@ void device_init() device_init_button(); } + device_migrate(); + +#if BOOT_TO_DFU + flash_option_bytes_init(1); +#else + flash_option_bytes_init(0); +#endif + usbhid_init(); ctaphid_init(); ctap_init(); - device_migrate(); - - } int device_is_nfc(void) diff --git a/targets/stm32l432/src/flash.c b/targets/stm32l432/src/flash.c index 3a5c8d6..ab716da 100644 --- a/targets/stm32l432/src/flash.c +++ b/targets/stm32l432/src/flash.c @@ -47,7 +47,7 @@ void flash_option_bytes_init(int boot_from_dfu) val &= ~(1<<25); // SRAM2_RST = 1 (erase sram on reset) val &= ~(1<<24); // SRAM2_PE = 1 (parity check en) - if (FLASH->OPTR == val) + if ((FLASH->OPTR & 0xb3f77ff) == (val & 0xb3f77ff)) { return; } @@ -68,13 +68,17 @@ void flash_option_bytes_init(int boot_from_dfu) while (FLASH->SR & (1<<16)) ; - flash_lock(); - + if (FLASH->CR & (1<<30)) + { + FLASH->OPTKEYR = 0x08192A3B; + FLASH->OPTKEYR = 0x4C5D6E7F; + } /* Perform option byte loading which triggers a device reset. */ FLASH->CR |= FLASH_CR_OBL_LAUNCH; - while (true); + while (true) + ; } void flash_erase_page(uint8_t page)