mirror of
https://github.com/EdgeTX/edgetx.git
synced 2025-07-20 14:55:09 +03:00
EEPROM Restore added in Bootloader
This commit is contained in:
parent
ab7218e5cf
commit
5dab6ef38f
5 changed files with 102 additions and 74 deletions
|
@ -54,6 +54,7 @@
|
|||
#include <string.h>
|
||||
|
||||
#include "board_taranis.h"
|
||||
#include "../eeprom_rlc.h"
|
||||
#include "../pwr.h"
|
||||
#include "../lcd.h"
|
||||
#include "../keys.h"
|
||||
|
@ -90,11 +91,10 @@ enum BootLoaderStates {
|
|||
ST_FLASH_CHECK,
|
||||
ST_FLASHING,
|
||||
ST_FLASH_DONE,
|
||||
ST_USB,
|
||||
ST_REBOOT,
|
||||
ST_BACKUP_EEPROM,
|
||||
ST_RESTORE_MENU,
|
||||
ST_EEPROM_CHECK,
|
||||
ST_USB,
|
||||
ST_REBOOT,
|
||||
};
|
||||
|
||||
enum MemoryTypes {
|
||||
|
@ -107,12 +107,15 @@ enum MemoryTypes {
|
|||
*----------------------------------------------------------------------------*/
|
||||
|
||||
uint32_t FirmwareSize;
|
||||
uint32_t firmwareAddress = FIRMWARE_ADDRESS;
|
||||
uint32_t firmwareWritten = 0;
|
||||
uint32_t eepromAddress = 0;
|
||||
uint32_t eepromWritten = 0;
|
||||
|
||||
uint32_t Master_frequency;
|
||||
volatile uint8_t Tenms;
|
||||
uint8_t EE_timer;
|
||||
|
||||
TCHAR FlashFilename[60];
|
||||
FIL FlashFile;
|
||||
DIR Dj;
|
||||
FILINFO Finfo;
|
||||
|
@ -129,6 +132,8 @@ uint32_t LockBits;
|
|||
uint32_t Block_buffer[1024];
|
||||
UINT BlockCount;
|
||||
|
||||
uint32_t memoryType;
|
||||
|
||||
#if defined(PCBSKY9X)
|
||||
extern int32_t EblockAddress;
|
||||
#endif
|
||||
|
@ -344,35 +349,54 @@ uint32_t fillNames(uint32_t index)
|
|||
return i;
|
||||
}
|
||||
|
||||
FRESULT openFirmwareFile(uint32_t index)
|
||||
const char *getBinaryPath()
|
||||
{
|
||||
cpystr(cpystr((uint8_t *)FlashFilename, (uint8_t *)FIRMWARES_PATH "/"), (uint8_t *) Filenames[index]);
|
||||
f_open(&FlashFile, FlashFilename, FA_READ);
|
||||
f_lseek(&FlashFile, BOOTLOADER_SIZE);
|
||||
return f_read(&FlashFile, (BYTE *) Block_buffer, 4096, &BlockCount);
|
||||
if (memoryType == MEM_FLASH)
|
||||
return FIRMWARES_PATH;
|
||||
else
|
||||
return EEPROMS_PATH;
|
||||
}
|
||||
|
||||
FRESULT openBinaryFile(uint32_t index)
|
||||
{
|
||||
TCHAR filename[60];
|
||||
cpystr(cpystr(cpystr((uint8_t *)filename, (uint8_t *)getBinaryPath), (uint8_t *)"/"), (uint8_t *)Filenames[index]);
|
||||
f_open(&FlashFile, filename, FA_READ);
|
||||
if (memoryType == MEM_FLASH)
|
||||
f_lseek(&FlashFile, BOOTLOADER_SIZE);
|
||||
return f_read(&FlashFile, (BYTE *)Block_buffer, 4096, &BlockCount);
|
||||
}
|
||||
|
||||
uint32_t isValidBufferStart(const uint32_t * buffer)
|
||||
{
|
||||
if (memoryType == MEM_FLASH)
|
||||
return isFirmwareStart(buffer);
|
||||
else
|
||||
return isEepromStart(buffer);
|
||||
}
|
||||
|
||||
int menuFlashFile(uint32_t index, uint8_t event)
|
||||
{
|
||||
FRESULT fr;
|
||||
|
||||
// TODO if (memoryType == MEM_EEPROM)
|
||||
|
||||
lcd_putsLeft(4*FH, "\012Hold [ENT] to start loading" );
|
||||
|
||||
if (Valid == 0) {
|
||||
// Validate file here
|
||||
// return 3 if invalid
|
||||
fr = openFirmwareFile(index);
|
||||
fr = openBinaryFile(index);
|
||||
fr = f_close(&FlashFile);
|
||||
Valid = 1;
|
||||
if (!isFirmwareStart(Block_buffer)) {
|
||||
if (!isValidBufferStart(Block_buffer)) {
|
||||
Valid = 2;
|
||||
}
|
||||
}
|
||||
|
||||
if (Valid == 2) {
|
||||
lcd_putsLeft(4*FH, "\011No firmware found in the file!");
|
||||
if (memoryType == MEM_FLASH)
|
||||
lcd_putsLeft(4*FH, "\011No firmware found in the file!");
|
||||
else
|
||||
lcd_putsLeft(4*FH, "\011No EEPROM found in the file!");
|
||||
if (event == EVT_KEY_FIRST(BOOT_KEY_EXIT) || event == EVT_KEY_FIRST(BOOT_KEY_MENU)) {
|
||||
return 0;
|
||||
}
|
||||
|
@ -380,12 +404,8 @@ int menuFlashFile(uint32_t index, uint8_t event)
|
|||
}
|
||||
|
||||
if (event == EVT_KEY_LONG(BOOT_KEY_MENU)) {
|
||||
fr = openFirmwareFile(index);
|
||||
FirmwareSize = FileSize[index];
|
||||
if (fr != FR_OK) {
|
||||
return 0; // File open error
|
||||
}
|
||||
return 1;
|
||||
fr = openBinaryFile(index);
|
||||
return (fr == FR_OK && isValidBufferStart(Block_buffer));
|
||||
}
|
||||
else if (event == EVT_KEY_FIRST(BOOT_KEY_EXIT)) {
|
||||
return 0;
|
||||
|
@ -398,6 +418,27 @@ extern Key keys[];
|
|||
|
||||
static uint32_t PowerUpDelay;
|
||||
|
||||
void writeFlashBlock()
|
||||
{
|
||||
uint32_t blockOffset = 0;
|
||||
while (BlockCount) {
|
||||
writeFlash((uint32_t *)firmwareAddress, &Block_buffer[blockOffset]);
|
||||
blockOffset += FLASH_PAGESIZE/4; // 32-bit words
|
||||
firmwareAddress += FLASH_PAGESIZE;
|
||||
if (BlockCount > FLASH_PAGESIZE) {
|
||||
BlockCount -= FLASH_PAGESIZE;
|
||||
}
|
||||
else {
|
||||
BlockCount = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void writeEepromBlock()
|
||||
{
|
||||
eeWriteBlockCmp((uint8_t *)Block_buffer, eepromAddress, BlockCount);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
uint8_t index = 0;
|
||||
|
@ -410,9 +451,6 @@ int main()
|
|||
uint32_t nameCount = 0;
|
||||
uint32_t vpos = 0;
|
||||
uint32_t hpos = 0;
|
||||
uint32_t firmwareAddress = FIRMWARE_ADDRESS;
|
||||
uint32_t firmwareWritten = 0;
|
||||
uint32_t memoryType;
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
wdt_reset();
|
||||
|
@ -459,13 +497,6 @@ int main()
|
|||
init_spi();
|
||||
#endif
|
||||
|
||||
#if defined(PCBSKY9X)
|
||||
uint32_t chip_id = CHIPID->CHIPID_CIDR;
|
||||
FlashSize = ( (chip_id >> 8 ) & 0x000F ) == 9 ? 256 : 512;
|
||||
#elif defined(PCBTARANIS)
|
||||
FlashSize = 512;
|
||||
#endif
|
||||
|
||||
#if defined(PCBSKY9X)
|
||||
LockBits = readLockBits();
|
||||
if (LockBits) {
|
||||
|
@ -553,15 +584,12 @@ int main()
|
|||
|
||||
if (state == ST_FLASH_MENU || state == ST_RESTORE_MENU) {
|
||||
sdInit();
|
||||
state == ST_RESTORE_MENU ? memoryType = MEM_EEPROM : memoryType = MEM_FLASH;
|
||||
memoryType = (state == ST_RESTORE_MENU ? MEM_EEPROM : MEM_FLASH);
|
||||
state = ST_DIR_CHECK;
|
||||
}
|
||||
|
||||
else if (state == ST_DIR_CHECK) {
|
||||
if (memoryType == MEM_FLASH)
|
||||
fr = f_chdir(FIRMWARES_PATH);
|
||||
else
|
||||
fr = f_chdir(EEPROMS_PATH);
|
||||
fr = f_chdir(getBinaryPath());
|
||||
if (fr == FR_OK) {
|
||||
state = ST_OPEN_DIR;
|
||||
}
|
||||
|
@ -587,13 +615,12 @@ int main()
|
|||
|
||||
if (state == ST_BACKUP_EEPROM) {
|
||||
// TODO Get RTC date/time, dump EEPROM to EEPROMS_PATH/EEPROM_yy-mm-dd-hh-mm-ss.BIN
|
||||
|
||||
lcd_putsLeft(2*FH, INDENT "Backup successful!");
|
||||
// lcd_putsLeft(3*FH, filename);
|
||||
if (event == EVT_KEY_BREAK(BOOT_KEY_EXIT) || event == EVT_KEY_BREAK(BOOT_KEY_MENU)) {
|
||||
vpos = 0;
|
||||
state = ST_START;
|
||||
}
|
||||
vpos = 0;
|
||||
state = ST_START;
|
||||
}
|
||||
}
|
||||
|
||||
if (state == ST_FILE_LIST) {
|
||||
|
@ -658,10 +685,7 @@ int main()
|
|||
#endif
|
||||
else if (event == EVT_KEY_BREAK(BOOT_KEY_MENU)) {
|
||||
// Select file to flash
|
||||
if (memoryType == MEM_FLASH)
|
||||
state = ST_FLASH_CHECK;
|
||||
else
|
||||
state = ST_EEPROM_CHECK;
|
||||
state = ST_FLASH_CHECK;
|
||||
Valid = 0;
|
||||
}
|
||||
else if (event == EVT_KEY_FIRST(BOOT_KEY_EXIT)) {
|
||||
|
@ -683,46 +707,42 @@ int main()
|
|||
// confirmed
|
||||
firmwareAddress = FIRMWARE_ADDRESS + BOOTLOADER_SIZE;
|
||||
firmwareWritten = 0;
|
||||
eepromAddress = 0;
|
||||
eepromWritten = 0;
|
||||
state = ST_FLASHING;
|
||||
}
|
||||
}
|
||||
|
||||
if (state == ST_FLASHING) {
|
||||
// Commit to flashing
|
||||
uint32_t blockOffset = 0;
|
||||
// commit to flashing
|
||||
lcd_putsLeft(4*FH, "\032Writing...");
|
||||
|
||||
if (firmwareAddress == FIRMWARE_ADDRESS + BOOTLOADER_SIZE) {
|
||||
if (!isFirmwareStart(Block_buffer)) {
|
||||
state = ST_FLASH_DONE;
|
||||
}
|
||||
int progress;
|
||||
if (memoryType == MEM_FLASH) {
|
||||
writeFlashBlock();
|
||||
firmwareWritten += sizeof(Block_buffer);
|
||||
progress = (200*firmwareWritten) / FirmwareSize;
|
||||
}
|
||||
|
||||
while (BlockCount) {
|
||||
writeFlash((uint32_t *)firmwareAddress, &Block_buffer[blockOffset]);
|
||||
blockOffset += FLASH_PAGESIZE/4; // 32-bit words
|
||||
firmwareAddress += FLASH_PAGESIZE;
|
||||
if (BlockCount > FLASH_PAGESIZE) {
|
||||
BlockCount -= FLASH_PAGESIZE;
|
||||
}
|
||||
else {
|
||||
BlockCount = 0;
|
||||
}
|
||||
else {
|
||||
writeEepromBlock();
|
||||
eepromWritten += sizeof(Block_buffer);
|
||||
progress = (200*eepromWritten) / EESIZE;
|
||||
}
|
||||
|
||||
firmwareWritten += 4; // 4K blocks
|
||||
|
||||
lcd_rect( 3, 6*FH+4, 204, 7);
|
||||
lcd_hline(5, 6*FH+6, (200*firmwareWritten*1024)/FirmwareSize, FORCE);
|
||||
lcd_hline(5, 6*FH+7, (200*firmwareWritten*1024)/FirmwareSize, FORCE);
|
||||
lcd_hline(5, 6*FH+8, (200*firmwareWritten*1024)/FirmwareSize, FORCE);
|
||||
lcd_hline(5, 6*FH+6, progress, FORCE);
|
||||
lcd_hline(5, 6*FH+7, progress, FORCE);
|
||||
lcd_hline(5, 6*FH+8, progress, FORCE);
|
||||
|
||||
fr = f_read(&FlashFile, (BYTE *)Block_buffer, sizeof(Block_buffer), &BlockCount);
|
||||
if (BlockCount == 0) {
|
||||
state = ST_FLASH_DONE;
|
||||
state = ST_FLASH_DONE; // EOF
|
||||
}
|
||||
if (firmwareWritten >= FlashSize - 32) {
|
||||
state = ST_FLASH_DONE; // Backstop
|
||||
if (firmwareWritten >= FLASHSIZE - BOOTLOADER_SIZE) {
|
||||
state = ST_FLASH_DONE; // Backstop
|
||||
}
|
||||
if (eepromWritten >= EESIZE) {
|
||||
state = ST_FLASH_DONE; // Backstop
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue