1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-13 11:29:51 +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;
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<limit; i++) {
bootloaderDrawFilename(binFiles[i].name, i, (vpos == 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;
continue;
// Select file to flash
state = ST_FLASH_CHECK;
valid = FC_UNCHECKED;
continue;
}
else if (event == EVT_KEY_BREAK(KEY_EXIT)) {
state = ST_START;
vpos = 0;
continue;
state = ST_START;
vpos = 0;
continue;
}
}
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) {
// canceled
state = ST_FILE_LIST;
}
else if (result == 1) {
// confirmed
int result = menuFlashFile(vpos, event);
if (result == 0) {
// canceled
state = ST_FILE_LIST;
if (memoryType == MEM_FLASH) {
firmwareSize = binFiles[vpos].size - BOOTLOADER_SIZE;
firmwareAddress = FIRMWARE_ADDRESS + BOOTLOADER_SIZE;
firmwareWritten = 0;
}
else if (result == 1) {
// confirmed
if (memoryType == MEM_FLASH) {
FirmwareSize = binFiles[vpos].size - BOOTLOADER_SIZE;
firmwareAddress = FIRMWARE_ADDRESS + BOOTLOADER_SIZE;
firmwareWritten = 0;
}
#if defined(EEPROM)
else {
eepromAddress = 0;
eepromWritten = 0;
}
#endif
state = ST_FLASHING;
else {
eepromAddress = 0;
eepromWritten = 0;
}
#endif
state = ST_FLASHING;
}
}
else if (state == ST_FLASHING) {
@ -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
@ -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
}
}