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