1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-19 14:25:11 +03:00

[X7] Bootloader fix

This commit is contained in:
Bertrand Songis 2019-05-13 14:20:44 +02:00
parent 8f6fc7cd50
commit 9c04f564df
4 changed files with 166 additions and 180 deletions

View file

@ -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;
void interrupt10ms(void)
{
Tenms |= 1; // 10 mS has passed
tenms |= 1; // 10 mS has passed
uint8_t index = 0;
uint8_t in = readKeys();
@ -145,10 +141,9 @@ FlashCheckRes checkFlashFile(unsigned int index, FlashCheckRes res)
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()) {
@ -332,7 +327,6 @@ int main()
}
}
else if (state == ST_DIR_CHECK) {
fr = openBinDir(memoryType);
if (fr == FR_OK) {
@ -353,7 +347,6 @@ int main()
}
if (state == ST_FILE_LIST) {
uint32_t limit = MAX_NAMES_ON_SCREEN;
if (nameCount < limit) {
limit = nameCount;
@ -384,14 +377,14 @@ int main()
bootloaderDrawScreen(state, 0);
for (uint32_t i=0; i<limit; i++) {
for (uint32_t i = 0; i < limit; i++) {
bootloaderDrawFilename(binFiles[i].name, i, (vpos == i));
}
if (event == EVT_KEY_BREAK(KEY_ENTER)) {
// Select file to flash
state = ST_FLASH_CHECK;
Valid = FC_UNCHECKED;
valid = FC_UNCHECKED;
continue;
}
else if (event == EVT_KEY_BREAK(KEY_EXIT)) {
@ -401,8 +394,7 @@ int main()
}
}
else if (state == ST_FLASH_CHECK) {
bootloaderDrawScreen(state, Valid, binFiles[vpos].name);
bootloaderDrawScreen(state, valid, binFiles[vpos].name);
int result = menuFlashFile(vpos, event);
if (result == 0) {
@ -413,7 +405,7 @@ int main()
// confirmed
if (memoryType == MEM_FLASH) {
FirmwareSize = binFiles[vpos].size - BOOTLOADER_SIZE;
firmwareSize = binFiles[vpos].size - BOOTLOADER_SIZE;
firmwareAddress = FIRMWARE_ADDRESS + BOOTLOADER_SIZE;
firmwareWritten = 0;
}
@ -438,13 +430,13 @@ int main()
if (memoryType == MEM_FLASH) {
flashWriteBlock();
firmwareWritten += sizeof(Block_buffer);
progress = (100*firmwareWritten) / FirmwareSize;
progress = (100 * firmwareWritten) / firmwareSize;
}
#if defined(EEPROM)
else {
writeEepromBlock();
eepromWritten += sizeof(Block_buffer);
progress = (100*eepromWritten) / EEPROM_SIZE;
progress = (100 * eepromWritten) / EEPROM_SIZE;
}
#endif
@ -454,13 +446,11 @@ int main()
if (BlockCount == 0) {
state = ST_FLASH_DONE; // EOF
}
else if ((memoryType == MEM_FLASH) &&
(firmwareWritten >= 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
@ -482,7 +472,6 @@ int main()
if (event == EVT_KEY_LONG(KEY_EXIT)) {
// Start the main application
state = ST_REBOOT;
}
@ -508,7 +497,6 @@ int main()
}
if (state == ST_REBOOT) {
lcdClear();
lcdRefresh();
lcdRefreshWait();

View file

@ -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)

View file

@ -8,44 +8,44 @@ 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);
}
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);
}
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");
lcdDrawTextAlignedLeft(3 * FH, "\010Restore EEPROM");
lcdDrawTextAlignedLeft(4 * FH, "\010Exit");
#if LCD_W >= 212
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);
const char *other_ver = getOtherVersion(nullptr);
if (strstr(other_ver, "opentx-"))
other_ver = other_ver+7;
lcdDrawText(20, 6*FH, other_ver);
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);
lcdDrawTextAlignedLeft(4 * FH, STR_USB_CONNECTED);
}
else if (st == ST_DIR_CHECK) {
if (opt == FR_NO_PATH) {
@ -65,27 +65,25 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char* str)
bootloaderDrawMsg(0, STR_INVALID_EEPROM, 2, false);
}
else if (opt == FC_OK) {
const char* vers = getOtherVersion((char*)Block_buffer);
const char *vers = getOtherVersion((char *) Block_buffer);
#if LCD_W < 212
// Remove opentx- from string
if (strstr(vers, "opentx-"))
vers = vers+7;
vers = vers + 7;
#endif
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...");
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);
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");
lcdDrawTextAlignedLeft(4 * FH, CENTER "\007Writing complete");
}
}