diff --git a/radio/src/bootloader/boot.cpp b/radio/src/bootloader/boot.cpp index 3a7a2bb5e..67210e8c6 100644 --- a/radio/src/bootloader/boot.cpp +++ b/radio/src/bootloader/boot.cpp @@ -137,6 +137,8 @@ UINT BlockCount; uint32_t memoryType; +uint32_t unlocked = 0; + #if defined(PCBSKY9X) extern int32_t EblockAddress; #endif @@ -520,7 +522,6 @@ int main() #if defined(PCBTARANIS) // SD card detect pin sdInit(); - unlockFlash(); usbInit(); usbStart(); #endif @@ -714,7 +715,12 @@ int main() else if (state == ST_FLASHING) { // commit to flashing lcd_putsLeft(4*FH, "\032Writing..."); - + + if (!unlocked && (memoryType == MEM_FLASH)) { + unlocked = 1; + unlockFlash(); + } + int progress; if (memoryType == MEM_FLASH) { writeFlashBlock(); @@ -745,6 +751,10 @@ int main() } if (state == ST_FLASH_DONE) { + if (unlocked) { + lockFlash(); + unlocked = 0; + } lcd_putsLeft(4*FH, "\024Writing Complete"); if (event == EVT_KEY_FIRST(BOOT_KEY_EXIT) || event == EVT_KEY_BREAK(BOOT_KEY_MENU)) { state = ST_START; diff --git a/radio/src/gui/menu_general.cpp b/radio/src/gui/menu_general.cpp index 7341fef8a..35dfdc987 100644 --- a/radio/src/gui/menu_general.cpp +++ b/radio/src/gui/menu_general.cpp @@ -773,6 +773,11 @@ void flashBootloader(const char * filename) } } + if (unlocked) { + lockFlash(); + unlocked = 0; + } + f_close(&file); } #endif diff --git a/radio/src/simpgmspace.cpp b/radio/src/simpgmspace.cpp index eff6026b6..d22716f8a 100644 --- a/radio/src/simpgmspace.cpp +++ b/radio/src/simpgmspace.cpp @@ -674,6 +674,7 @@ void RCC_LSEConfig(uint8_t RCC_LSE) { } FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG) { return RESET; } ErrorStatus RTC_WaitForSynchro(void) { return SUCCESS; } void unlockFlash() { } +void lockFlash() { } void writeFlash(uint32_t *address, uint32_t *buffer) { SIMU_SLEEP(100); } uint32_t isBootloaderStart(const void *block) { return 1; } #endif diff --git a/radio/src/targets/taranis/board_taranis.h b/radio/src/targets/taranis/board_taranis.h index a66004edf..195dc3e3e 100644 --- a/radio/src/targets/taranis/board_taranis.h +++ b/radio/src/targets/taranis/board_taranis.h @@ -144,6 +144,7 @@ void delay_01us(uint16_t nb); // Flash Write driver #define FLASH_PAGESIZE 256 void unlockFlash(); +void lockFlash(); void writeFlash(uint32_t * address, uint32_t * buffer); uint32_t isFirmwareStart(const void * buffer); uint32_t isBootloaderStart(const void * buffer); diff --git a/radio/src/targets/taranis/flash_driver.cpp b/radio/src/targets/taranis/flash_driver.cpp index a57aac087..cca4f7e27 100644 --- a/radio/src/targets/taranis/flash_driver.cpp +++ b/radio/src/targets/taranis/flash_driver.cpp @@ -16,6 +16,12 @@ void unlockFlash() FLASH->KEYR = 0xCDEF89AB; } +void lockFlash() +{ + while (!FLASH->SR & FLASH_SR_BSY); + FLASH->CR |= FLASH_CR_LOCK; +} + void waitFlashIdle() { while (FLASH->SR & FLASH_FLAG_BSY) {