Skip to content

Commit

Permalink
feat: only allow flash when target matches (#4770)
Browse files Browse the repository at this point in the history
  • Loading branch information
3djc authored Mar 25, 2024
1 parent d055b80 commit 4628ccc
Show file tree
Hide file tree
Showing 5 changed files with 94 additions and 51 deletions.
10 changes: 9 additions & 1 deletion radio/src/io/bootloader_flash.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
19 changes: 12 additions & 7 deletions radio/src/targets/horus/bootloader/boot_menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
}

Expand Down
47 changes: 26 additions & 21 deletions radio/src/targets/nv14/bootloader/boot_menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);

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 - 90, MESSAGE_TOP,
LV_SYMBOL_OK, BL_GREEN);
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 + 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);
}
}
}

Expand Down
46 changes: 25 additions & 21 deletions radio/src/targets/pl18/bootloader/boot_menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -187,27 +187,31 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char* str)
VersionTag tag;
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);

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(DOUBLE_PADDING, MESSAGE_TOP, LV_SYMBOL_OK, BL_GREEN);
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 + 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);
}
}
}

Expand Down
23 changes: 22 additions & 1 deletion radio/src/targets/taranis/bootloader/boot_menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit 4628ccc

Please sign in to comment.