From 9c04f564df5bb4e5cfc217201d55233bdacfd351 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 13 May 2019 14:20:44 +0200 Subject: [PATCH] [X7] Bootloader fix --- .../common/arm/stm32/bootloader/boot.cpp | 226 +++++++++--------- radio/src/targets/sky9x/CMakeLists.txt | 2 +- ...c_driver.cpp => rotary_encoder_driver.cpp} | 0 .../targets/taranis/bootloader/boot_menu.cpp | 118 +++++---- 4 files changed, 166 insertions(+), 180 deletions(-) rename radio/src/targets/sky9x/{rotenc_driver.cpp => rotary_encoder_driver.cpp} (100%) diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp index c4a0ba33f..000836721 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp +++ b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp @@ -47,17 +47,13 @@ typedef void (*voidFunction)(void); // Bootloader marker: // -> used to detect valid bootloader files const uint8_t bootloaderVersion[] __attribute__ ((section(".version"), used)) = -{ 'B', 'O', 'O', 'T', '1', '0' }; + {'B', 'O', 'O', 'T', '1', '0'}; #if defined(ROTARY_ENCODER_NAVIGATION) volatile rotenc_t rotencValue = 0; #endif -/*---------------------------------------------------------------------------- - * Local variables - *----------------------------------------------------------------------------*/ - -uint32_t FirmwareSize; +uint32_t firmwareSize; uint32_t firmwareAddress = FIRMWARE_ADDRESS; uint32_t firmwareWritten = 0; @@ -66,16 +62,16 @@ uint32_t eepromAddress = 0; uint32_t eepromWritten = 0; #endif -volatile uint8_t Tenms = 1; +volatile uint8_t tenms = 1; -FlashCheckRes Valid; +FlashCheckRes valid; MemoryType memoryType; -uint32_t unlocked = 0; +uint32_t unlocked = 0; void interrupt10ms(void) { - Tenms |= 1; // 10 mS has passed + tenms |= 1; // 10 mS has passed uint8_t index = 0; uint8_t in = readKeys(); @@ -129,26 +125,25 @@ uint32_t isValidBufferStart(const uint8_t * buffer) FlashCheckRes checkFlashFile(unsigned int index, FlashCheckRes res) { if (res != FC_UNCHECKED) - return res; + return res; if (openBinFile(memoryType, index) != FR_OK) - return FC_ERROR; + return FC_ERROR; if (closeBinFile() != FR_OK) - return FC_ERROR; + return FC_ERROR; if (!isValidBufferStart(Block_buffer)) - return FC_ERROR; + return FC_ERROR; return FC_OK; } int menuFlashFile(uint32_t index, event_t event) { - Valid = checkFlashFile(index, Valid); - - if (Valid == FC_ERROR) { + valid = checkFlashFile(index, valid); + if (valid == FC_ERROR) { if (event == EVT_KEY_BREAK(KEY_EXIT) || event == EVT_KEY_BREAK(KEY_ENTER)) return 0; @@ -211,7 +206,7 @@ int main() SERIAL_RCC_APB1Periph | SD_RCC_APB1Periph, ENABLE); - RCC_APB2PeriphClockCmd(LCD_RCC_APB2Periph | BACKLIGHT_RCC_APB2Periph, ENABLE); + RCC_APB2PeriphClockCmd(LCD_RCC_APB2Periph | BACKLIGHT_RCC_APB2Periph | RCC_APB2Periph_SYSCFG, ENABLE); keysInit(); @@ -259,7 +254,7 @@ int main() #if defined(PWR_BUTTON_PRESS) // wait until power button is released - while(pwrPressed()) { + while (pwrPressed()) { wdt_reset(); } #endif @@ -267,8 +262,8 @@ int main() for (;;) { wdt_reset(); - if (Tenms) { - Tenms = 0; + if (tenms) { + tenms = 0; if (state != ST_USB) { if (usbPlugged()) { @@ -283,16 +278,16 @@ int main() } if (state == ST_USB) { - if (usbPlugged() == 0) { - vpos = 0; - usbStop(); - if (unlocked) { - lockFlash(); - unlocked = 0; - } - state = ST_START; + if (usbPlugged() == 0) { + vpos = 0; + usbStop(); + if (unlocked) { + lockFlash(); + unlocked = 0; } - bootloaderDrawScreen(state, 0); + state = ST_START; + } + bootloaderDrawScreen(state, 0); } lcdRefreshWait(); @@ -300,60 +295,58 @@ int main() if (state == ST_START) { - bootloaderDrawScreen(state, vpos); + bootloaderDrawScreen(state, vpos); - if (event == EVT_KEY_FIRST(KEY_DOWN)) { - vpos = (vpos + 1) % MAIN_MENU_LEN; - continue; - } - else if (event == EVT_KEY_FIRST(KEY_UP)) { - vpos = (vpos + MAIN_MENU_LEN - 1) % MAIN_MENU_LEN; - continue; - } - else if (event == EVT_KEY_BREAK(KEY_ENTER)) { - switch (vpos) { - case 0: - memoryType = MEM_FLASH; - state = ST_DIR_CHECK; - break; + if (event == EVT_KEY_FIRST(KEY_DOWN)) { + vpos = (vpos + 1) % MAIN_MENU_LEN; + continue; + } + else if (event == EVT_KEY_FIRST(KEY_UP)) { + vpos = (vpos + MAIN_MENU_LEN - 1) % MAIN_MENU_LEN; + continue; + } + else if (event == EVT_KEY_BREAK(KEY_ENTER)) { + switch (vpos) { + case 0: + memoryType = MEM_FLASH; + state = ST_DIR_CHECK; + break; #if defined(EEPROM) - case 1: - memoryType = MEM_EEPROM; - state = ST_DIR_CHECK; - break; + case 1: + memoryType = MEM_EEPROM; + state = ST_DIR_CHECK; + break; #endif - default: - state = ST_REBOOT; - break; - } - - // next loop - continue; + default: + state = ST_REBOOT; + break; } + + // next loop + continue; + } } else if (state == ST_DIR_CHECK) { + fr = openBinDir(memoryType); - fr = openBinDir(memoryType); + if (fr == FR_OK) { + index = vpos = 0; + state = ST_FILE_LIST; + nameCount = fetchBinFiles(index); + continue; + } + else { + bootloaderDrawScreen(state, fr); - if (fr == FR_OK) { - index = vpos = 0; - state = ST_FILE_LIST; - nameCount = fetchBinFiles(index); - continue; - } - else { - bootloaderDrawScreen(state, fr); - - if (event == EVT_KEY_BREAK(KEY_EXIT) || event == EVT_KEY_BREAK(KEY_ENTER)) { - vpos = 0; - state = ST_START; - continue; - } + if (event == EVT_KEY_BREAK(KEY_EXIT) || event == EVT_KEY_BREAK(KEY_ENTER)) { + vpos = 0; + state = ST_START; + continue; } + } } if (state == ST_FILE_LIST) { - uint32_t limit = MAX_NAMES_ON_SCREEN; if (nameCount < limit) { limit = nameCount; @@ -384,47 +377,46 @@ int main() bootloaderDrawScreen(state, 0); - for (uint32_t i=0; i= FLASHSIZE - BOOTLOADER_SIZE)) { + else if (memoryType == MEM_FLASH && firmwareWritten >= FLASHSIZE - BOOTLOADER_SIZE) { state = ST_FLASH_DONE; // Backstop } #if defined(EEPROM) - else if ((memoryType == MEM_EEPROM) && - (eepromWritten >= EEPROM_SIZE)) { + else if (memoryType == MEM_EEPROM && eepromWritten >= EEPROM_SIZE) { state = ST_FLASH_DONE; // Backstop } #endif @@ -481,9 +471,8 @@ int main() } if (event == EVT_KEY_LONG(KEY_EXIT)) { - // Start the main application - - state = ST_REBOOT; + // Start the main application + state = ST_REBOOT; } lcdRefresh(); @@ -508,20 +497,19 @@ int main() } if (state == ST_REBOOT) { - - lcdClear(); - lcdRefresh(); - lcdRefreshWait(); + lcdClear(); + lcdRefresh(); + lcdRefreshWait(); #if !defined(EEPROM) - // Use jump on radios with emergency mode - // to avoid triggering it with a soft reset + // Use jump on radios with emergency mode + // to avoid triggering it with a soft reset - // Jump to proper application address - jumpTo(APP_START_ADDRESS); + // Jump to proper application address + jumpTo(APP_START_ADDRESS); #else - // Use software reset everywhere else - NVIC_SystemReset(); + // Use software reset everywhere else + NVIC_SystemReset(); #endif } } diff --git a/radio/src/targets/sky9x/CMakeLists.txt b/radio/src/targets/sky9x/CMakeLists.txt index 39ac01741..478eeebf3 100644 --- a/radio/src/targets/sky9x/CMakeLists.txt +++ b/radio/src/targets/sky9x/CMakeLists.txt @@ -41,7 +41,7 @@ else() set(TARGET_SRC ${TARGET_SRC} coproc_driver.cpp - rotenc_driver.cpp + rotary_encoder_driver.cpp rtc_driver.cpp ) set(OPENRC_BOOTLOADER bootflash4.lbm) diff --git a/radio/src/targets/sky9x/rotenc_driver.cpp b/radio/src/targets/sky9x/rotary_encoder_driver.cpp similarity index 100% rename from radio/src/targets/sky9x/rotenc_driver.cpp rename to radio/src/targets/sky9x/rotary_encoder_driver.cpp diff --git a/radio/src/targets/taranis/bootloader/boot_menu.cpp b/radio/src/targets/taranis/bootloader/boot_menu.cpp index 1d7835569..09261ab7d 100644 --- a/radio/src/targets/taranis/bootloader/boot_menu.cpp +++ b/radio/src/targets/taranis/bootloader/boot_menu.cpp @@ -8,84 +8,82 @@ void bootloaderInitScreen() { } -static void bootloaderDrawMsg(unsigned int x, const char* str, uint8_t line, bool inverted) +static void bootloaderDrawMsg(unsigned int x, const char *str, uint8_t line, bool inverted) { - lcdDrawSizedText(x, (line + 2) * FH, str, DISPLAY_CHAR_WIDTH, inverted ? INVERS : 0); + lcdDrawSizedText(x, (line + 2) * FH, str, DISPLAY_CHAR_WIDTH, inverted ? INVERS : 0); } -void bootloaderDrawFilename(const char* str, uint8_t line, bool selected) +void bootloaderDrawFilename(const char *str, uint8_t line, bool selected) { - bootloaderDrawMsg(INDENT_WIDTH, str, line, selected); + bootloaderDrawMsg(INDENT_WIDTH, str, line, selected); } -void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) +void bootloaderDrawScreen(BootloaderState st, int opt, const char *str) { - lcdClear(); - lcdDrawText(0, 0, BOOTLOADER_TITLE, INVERS); - - if (st == ST_START) { - lcdDrawTextAlignedLeft(2*FH, "\010Write Firmware"); - lcdDrawTextAlignedLeft(3*FH, "\010Restore EEPROM"); - lcdDrawTextAlignedLeft(4*FH, "\010Exit"); + lcdClear(); + lcdDrawText(0, 0, BOOTLOADER_TITLE, INVERS); + + if (st == ST_START) { + lcdDrawTextAlignedLeft(2*FH, "\010Write Firmware"); + lcdDrawTextAlignedLeft(3 * FH, "\010Restore EEPROM"); + lcdDrawTextAlignedLeft(4 * FH, "\010Exit"); #if LCD_W >= 212 - lcdDrawTextAlignedLeft(6*FH, "\001Curr FW:"); - lcdDrawText(50, 6*FH, getOtherVersion(nullptr)); + lcdDrawTextAlignedLeft(6*FH, "\001Curr FW:"); + lcdDrawText(50, 6*FH, getOtherVersion(nullptr)); #else - lcdDrawTextAlignedLeft(6*FH, "\001FW:"); + lcdDrawTextAlignedLeft(6 * FH, "\001FW:"); - // Remove opentx- from string - const char* other_ver = getOtherVersion(nullptr); - if (strstr(other_ver, "opentx-")) - other_ver = other_ver+7; - lcdDrawText(20, 6*FH, other_ver); + // Remove opentx- from string + const char *other_ver = getOtherVersion(nullptr); + if (strstr(other_ver, "opentx-")) + other_ver = other_ver + 7; + lcdDrawText(20, 6 * FH, other_ver); #endif - lcdInvertLine(2+opt); - lcdDrawTextAlignedLeft(7*FH, STR_OR_PLUGIN_USB_CABLE); + lcdInvertLine(2 + opt); + lcdDrawTextAlignedLeft(7 * FH, STR_OR_PLUGIN_USB_CABLE); + } + else if (st == ST_USB) { + lcdDrawTextAlignedLeft(4 * FH, STR_USB_CONNECTED); + } + else if (st == ST_DIR_CHECK) { + if (opt == FR_NO_PATH) { + bootloaderDrawMsg(INDENT_WIDTH, "Directory is missing!", 1, false); + bootloaderDrawMsg(INDENT_WIDTH, getBinaryPath(memoryType), 2, false); } - else if (st == ST_USB) { - lcdDrawTextAlignedLeft(4*FH, STR_USB_CONNECTED); + else { + bootloaderDrawMsg(INDENT_WIDTH, "Directory is empty!", 1, false); } - else if (st == ST_DIR_CHECK) { - if (opt == FR_NO_PATH) { - bootloaderDrawMsg(INDENT_WIDTH, "Directory is missing!", 1, false); - bootloaderDrawMsg(INDENT_WIDTH, getBinaryPath(memoryType), 2, false); - } - else { - bootloaderDrawMsg(INDENT_WIDTH, "Directory is empty!", 1, false); - } - } - else if (st == ST_FLASH_CHECK) { - if (opt == FC_ERROR) { + } + else if (st == ST_FLASH_CHECK) { + if (opt == FC_ERROR) { - if (memoryType == MEM_FLASH) - bootloaderDrawMsg(0, STR_INVALID_FIRMWARE, 2, false); - else - bootloaderDrawMsg(0, STR_INVALID_EEPROM, 2, false); - } - else if (opt == FC_OK) { - - const char* vers = getOtherVersion((char*)Block_buffer); + if (memoryType == MEM_FLASH) + bootloaderDrawMsg(0, STR_INVALID_FIRMWARE, 2, false); + else + bootloaderDrawMsg(0, STR_INVALID_EEPROM, 2, false); + } + else if (opt == FC_OK) { + const char *vers = getOtherVersion((char *) Block_buffer); #if LCD_W < 212 - // Remove opentx- from string - if (strstr(vers, "opentx-")) - vers = vers+7; + // Remove opentx- from string + if (strstr(vers, "opentx-")) + vers = vers + 7; #endif - bootloaderDrawMsg(INDENT_WIDTH, vers, 0, false); - bootloaderDrawMsg(0, STR_HOLD_ENTER_TO_START, 2, false); - } + bootloaderDrawMsg(INDENT_WIDTH, vers, 0, false); + bootloaderDrawMsg(0, STR_HOLD_ENTER_TO_START, 2, false); } - else if (st == ST_FLASHING) { - lcdDrawTextAlignedLeft(4*FH, CENTER "\015Writing..."); + } + else if (st == ST_FLASHING) { + lcdDrawTextAlignedLeft(4 * FH, CENTER "\015Writing..."); - lcdDrawRect(3, 6*FH+4, (LCD_W-8), 7); - lcdDrawSolidHorizontalLine(5, 6*FH+6, (LCD_W-12) * opt / 100, FORCE); - lcdDrawSolidHorizontalLine(5, 6*FH+7, (LCD_W-12) * opt / 100, FORCE); - lcdDrawSolidHorizontalLine(5, 6*FH+8, (LCD_W-12) * opt / 100, FORCE); - } - else if (st == ST_FLASH_DONE) { - - lcdDrawTextAlignedLeft(4*FH, CENTER "\007Writing complete"); - } + lcdDrawRect(3, 6 * FH + 4, (LCD_W - 8), 7); + lcdDrawSolidHorizontalLine(5, 6 * FH + 6, (LCD_W - 12) * opt / 100, FORCE); + lcdDrawSolidHorizontalLine(5, 6 * FH + 7, (LCD_W - 12) * opt / 100, FORCE); + lcdDrawSolidHorizontalLine(5, 6 * FH + 8, (LCD_W - 12) * opt / 100, FORCE); + } + else if (st == ST_FLASH_DONE) { + lcdDrawTextAlignedLeft(4 * FH, CENTER "\007Writing complete"); + } }