diff --git a/radio/src/io/bootloader_flash.cpp b/radio/src/io/bootloader_flash.cpp index a6ee58194..c820d728b 100644 --- a/radio/src/io/bootloader_flash.cpp +++ b/radio/src/io/bootloader_flash.cpp @@ -43,7 +43,15 @@ bool isBootloader(const char * filename) return false; } - return isBootloaderStart(buffer); + // Check firmware is for this radio + for (int i = 0; i < 1024; i++) { + if (memcmp(buffer + i, FLAVOUR, sizeof(FLAVOUR) - 1) == 0) { + if (buffer[i + sizeof(FLAVOUR) - 1] == '-') + return isBootloaderStart(buffer);; + return false; + } + } + return false; } void BootloaderFirmwareUpdate::flashFirmware(const char * filename, ProgressHandler progressHandler) diff --git a/radio/src/targets/horus/bootloader/boot_menu.cpp b/radio/src/targets/horus/bootloader/boot_menu.cpp index 2a22a2cef..499a09ea5 100644 --- a/radio/src/targets/horus/bootloader/boot_menu.cpp +++ b/radio/src/targets/horus/bootloader/boot_menu.cpp @@ -140,16 +140,21 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) memset(&tag, 0, sizeof(tag)); extractFirmwareVersion(&tag); - lcd->drawText(168, 138, TR_BL_FORK, RIGHT | BL_FOREGROUND); - lcd->drawSizedText(174, 138, tag.fork, 6, BL_FOREGROUND); + if (strcmp(tag.flavour, FLAVOUR)) { + lcd->drawText(94, 168, LV_SYMBOL_CLOSE " " TR_BL_INVALID_FIRMWARE, + BL_FOREGROUND); + } else { + lcd->drawText(168, 138, TR_BL_FORK, RIGHT | BL_FOREGROUND); + lcd->drawSizedText(174, 138, tag.fork, 6, BL_FOREGROUND); - lcd->drawText(168, 158, TR_BL_VERSION, RIGHT | BL_FOREGROUND); - lcd->drawText(174, 158, tag.version, BL_FOREGROUND); + lcd->drawText(168, 158, TR_BL_VERSION, RIGHT | BL_FOREGROUND); + lcd->drawText(174, 158, tag.version, BL_FOREGROUND); - lcd->drawText(168, 178, TR_BL_RADIO, RIGHT | BL_FOREGROUND); - lcd->drawText(174, 178, tag.flavour, BL_FOREGROUND); + lcd->drawText(168, 178, TR_BL_RADIO, RIGHT | BL_FOREGROUND); + lcd->drawText(174, 178, tag.flavour, BL_FOREGROUND); - lcd->drawText(78, 158, LV_SYMBOL_OK, BL_GREEN); + lcd->drawText(78, 158, LV_SYMBOL_OK, BL_GREEN); + } } } diff --git a/radio/src/targets/nv14/bootloader/boot_menu.cpp b/radio/src/targets/nv14/bootloader/boot_menu.cpp index 7017e2f37..482ba4e7c 100644 --- a/radio/src/targets/nv14/bootloader/boot_menu.cpp +++ b/radio/src/targets/nv14/bootloader/boot_menu.cpp @@ -167,27 +167,32 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) memset(&tag, 0, sizeof(tag)); extractFirmwareVersion(&tag); - lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, - MESSAGE_TOP - DEFAULT_PADDING, - TR_BL_FORK, RIGHT | BL_FOREGROUND); - lcd->drawSizedText(LCD_W / 4 + 6 + DEFAULT_PADDING, - MESSAGE_TOP - DEFAULT_PADDING, tag.fork, 6, - BL_FOREGROUND); + if (strcmp(tag.flavour, FLAVOUR)) { + lcd->drawText(20, MESSAGE_TOP, LV_SYMBOL_CLOSE " " TR_BL_INVALID_FIRMWARE, + BL_FOREGROUND); + } else { + lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, + MESSAGE_TOP - DEFAULT_PADDING, + TR_BL_FORK, RIGHT | BL_FOREGROUND); + lcd->drawSizedText(LCD_W / 4 + 6 + DEFAULT_PADDING, + MESSAGE_TOP - DEFAULT_PADDING, tag.fork, 6, + BL_FOREGROUND); - lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, MESSAGE_TOP, - TR_BL_VERSION, RIGHT | BL_FOREGROUND); - lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING, MESSAGE_TOP, - tag.version, BL_FOREGROUND); + lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, MESSAGE_TOP, + TR_BL_VERSION, RIGHT | BL_FOREGROUND); + lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING, MESSAGE_TOP, + tag.version, BL_FOREGROUND); - lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, - MESSAGE_TOP + DEFAULT_PADDING, - TR_BL_RADIO, RIGHT | BL_FOREGROUND); - lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING, - MESSAGE_TOP + DEFAULT_PADDING, tag.flavour, - BL_FOREGROUND); + lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, + MESSAGE_TOP + DEFAULT_PADDING, + TR_BL_RADIO, RIGHT | BL_FOREGROUND); + lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING, + MESSAGE_TOP + DEFAULT_PADDING, tag.flavour, + BL_FOREGROUND); - lcd->drawText(LCD_W / 4 + DEFAULT_PADDING - 90, MESSAGE_TOP, - LV_SYMBOL_OK, BL_GREEN); + lcd->drawText(LCD_W / 4 + DEFAULT_PADDING - 90, MESSAGE_TOP, + LV_SYMBOL_OK, BL_GREEN); + } } } diff --git a/radio/src/targets/pl18/bootloader/boot_menu.cpp b/radio/src/targets/pl18/bootloader/boot_menu.cpp index 9e8d914d9..b8093d6d2 100644 --- a/radio/src/targets/pl18/bootloader/boot_menu.cpp +++ b/radio/src/targets/pl18/bootloader/boot_menu.cpp @@ -187,27 +187,31 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) VersionTag tag; memset(&tag, 0, sizeof(tag)); extractFirmwareVersion(&tag); + if (strcmp(tag.flavour, FLAVOUR)) { + lcd->drawText(20, MESSAGE_TOP, LV_SYMBOL_CLOSE " " TR_BL_INVALID_FIRMWARE, + BL_FOREGROUND); + } else { + lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, + MESSAGE_TOP - DEFAULT_PADDING, + TR_BL_FORK, RIGHT | BL_FOREGROUND); + lcd->drawSizedText(LCD_W / 4 + 6 + DEFAULT_PADDING, + MESSAGE_TOP - DEFAULT_PADDING, tag.fork, 6, + BL_FOREGROUND); - lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, - MESSAGE_TOP - DEFAULT_PADDING, - TR_BL_FORK, RIGHT | BL_FOREGROUND); - lcd->drawSizedText(LCD_W / 4 + 6 + DEFAULT_PADDING, - MESSAGE_TOP - DEFAULT_PADDING, tag.fork, 6, - BL_FOREGROUND); + lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, MESSAGE_TOP, + TR_BL_VERSION, RIGHT | BL_FOREGROUND); + lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING, MESSAGE_TOP, + tag.version, BL_FOREGROUND); - lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, MESSAGE_TOP, - TR_BL_VERSION, RIGHT | BL_FOREGROUND); - lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING, MESSAGE_TOP, - tag.version, BL_FOREGROUND); + lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, + MESSAGE_TOP + DEFAULT_PADDING, + TR_BL_RADIO, RIGHT | BL_FOREGROUND); + lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING, + MESSAGE_TOP + DEFAULT_PADDING, tag.flavour, + BL_FOREGROUND); - lcd->drawText(LCD_W / 4 + DEFAULT_PADDING, - MESSAGE_TOP + DEFAULT_PADDING, - TR_BL_RADIO, RIGHT | BL_FOREGROUND); - lcd->drawText(LCD_W / 4 + 6 + DEFAULT_PADDING, - MESSAGE_TOP + DEFAULT_PADDING, tag.flavour, - BL_FOREGROUND); - - lcd->drawText(DOUBLE_PADDING, MESSAGE_TOP, LV_SYMBOL_OK, BL_GREEN); + lcd->drawText(DOUBLE_PADDING, MESSAGE_TOP, LV_SYMBOL_OK, BL_GREEN); + } } } diff --git a/radio/src/targets/taranis/bootloader/boot_menu.cpp b/radio/src/targets/taranis/bootloader/boot_menu.cpp index d23eb5b89..e2a7d0a7c 100644 --- a/radio/src/targets/taranis/bootloader/boot_menu.cpp +++ b/radio/src/targets/taranis/bootloader/boot_menu.cpp @@ -52,6 +52,19 @@ void bootloaderDrawFilename(const char *str, uint8_t line, bool selected) bootloaderDrawMsg(INDENT_WIDTH, str, line, selected); } +bool checkFirmwareFlavor(const char * vers) +{ + if (strncmp(vers,FLAVOUR, sizeof(FLAVOUR) - 1) != 0) + return false; + + char * tmp = (char *) vers; + while (*tmp != '-') tmp++; + if ((tmp - vers) != (sizeof(FLAVOUR) - 1)) + return false; + + return true; +} + void bootloaderDrawScreen(BootloaderState st, int opt, const char *str) { lcdClear(); @@ -98,16 +111,24 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char *str) bootloaderDrawMsg(0, TR_BL_INVALID_EEPROM, 2, false); } else if (opt == FC_OK) { + bool flavorCheck = false; if (memoryType == MEM_FLASH) { const char * vers = getFirmwareVersion((const char *)Block_buffer); #if LCD_W < 212 // Remove "edgetx-" from string if (strncmp(vers, "edgetx-", 7) == 0) vers += 7; + flavorCheck = checkFirmwareFlavor(vers); +#else + flavorCheck = checkFirmwareFlavor(vers + 7); #endif + bootloaderDrawMsg(INDENT_WIDTH, vers, 0, false); } - bootloaderDrawMsg(0, TR_BL_HOLD_ENTER_TO_START, 2, false); + if (flavorCheck) + bootloaderDrawMsg(0, TR_BL_HOLD_ENTER_TO_START, 2, false); + else + bootloaderDrawMsg(0, TR_BL_INVALID_FIRMWARE, 2, false); } } else if (st == ST_FLASHING) {