mirror of
https://github.com/opentx/opentx.git
synced 2025-07-25 01:05:10 +03:00
Merge pull request #961 from opentx/kilrah/bl_eeprom_save_load
Kilrah/bl eeprom save load
This commit is contained in:
commit
af4f8e7f36
15 changed files with 261 additions and 109 deletions
|
@ -93,6 +93,7 @@ inline int geteepromsize() {
|
||||||
#include "radio/src/gui/view_text.cpp"
|
#include "radio/src/gui/view_text.cpp"
|
||||||
#include "radio/src/gui/view_about.cpp"
|
#include "radio/src/gui/view_about.cpp"
|
||||||
#include "radio/src/lcd.cpp"
|
#include "radio/src/lcd.cpp"
|
||||||
|
#include "radio/src/strhelpers.cpp"
|
||||||
#include "radio/src/logs.cpp"
|
#include "radio/src/logs.cpp"
|
||||||
#include "radio/src/rtc.cpp"
|
#include "radio/src/rtc.cpp"
|
||||||
#include "radio/src/targets/taranis/keys_driver.cpp"
|
#include "radio/src/targets/taranis/keys_driver.cpp"
|
||||||
|
|
1
radio/src/.gitignore
vendored
1
radio/src/.gitignore
vendored
|
@ -20,3 +20,4 @@
|
||||||
/traces
|
/traces
|
||||||
/MODELS
|
/MODELS
|
||||||
/FIRMWARES
|
/FIRMWARES
|
||||||
|
/EEPROMS
|
||||||
|
|
|
@ -949,7 +949,7 @@ endif
|
||||||
|
|
||||||
ifeq ($(SDCARD), YES)
|
ifeq ($(SDCARD), YES)
|
||||||
CPPDEFS += -DSDCARD
|
CPPDEFS += -DSDCARD
|
||||||
CPPSRC += logs.cpp
|
CPPSRC += logs.cpp strhelpers.cpp
|
||||||
endif
|
endif
|
||||||
|
|
||||||
RUN_FROM_FLASH = 1
|
RUN_FROM_FLASH = 1
|
||||||
|
|
|
@ -169,6 +169,7 @@ CPPSRC = ../targets/taranis/lcd_driver.cpp \
|
||||||
../lcd.cpp \
|
../lcd.cpp \
|
||||||
../keys.cpp \
|
../keys.cpp \
|
||||||
../fonts.cpp \
|
../fonts.cpp \
|
||||||
|
../strhelpers.cpp \
|
||||||
boot.cpp
|
boot.cpp
|
||||||
|
|
||||||
# List ASM source files here
|
# List ASM source files here
|
||||||
|
|
|
@ -54,6 +54,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "board_taranis.h"
|
#include "board_taranis.h"
|
||||||
|
#include "../eeprom_rlc.h"
|
||||||
#include "../pwr.h"
|
#include "../pwr.h"
|
||||||
#include "../lcd.h"
|
#include "../lcd.h"
|
||||||
#include "../keys.h"
|
#include "../keys.h"
|
||||||
|
@ -90,21 +91,32 @@ enum BootLoaderStates {
|
||||||
ST_FLASH_CHECK,
|
ST_FLASH_CHECK,
|
||||||
ST_FLASHING,
|
ST_FLASHING,
|
||||||
ST_FLASH_DONE,
|
ST_FLASH_DONE,
|
||||||
|
ST_RESTORE_MENU,
|
||||||
ST_USB,
|
ST_USB,
|
||||||
ST_REBOOT,
|
ST_REBOOT,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum MemoryTypes {
|
||||||
|
MEM_FLASH,
|
||||||
|
MEM_EEPROM
|
||||||
|
};
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------
|
/*----------------------------------------------------------------------------
|
||||||
* Local variables
|
* Local variables
|
||||||
*----------------------------------------------------------------------------*/
|
*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
uint32_t FirmwareSize;
|
uint32_t FirmwareSize;
|
||||||
|
uint32_t firmwareAddress = FIRMWARE_ADDRESS;
|
||||||
|
uint32_t firmwareWritten = 0;
|
||||||
|
uint32_t eepromAddress = 0;
|
||||||
|
uint32_t eepromWritten = 0;
|
||||||
|
|
||||||
|
TCHAR backupFilename[60];
|
||||||
|
|
||||||
uint32_t Master_frequency;
|
uint32_t Master_frequency;
|
||||||
volatile uint8_t Tenms;
|
volatile uint8_t Tenms;
|
||||||
uint8_t EE_timer;
|
uint8_t EE_timer;
|
||||||
|
|
||||||
TCHAR FlashFilename[60];
|
|
||||||
FIL FlashFile;
|
FIL FlashFile;
|
||||||
DIR Dj;
|
DIR Dj;
|
||||||
FILINFO Finfo;
|
FILINFO Finfo;
|
||||||
|
@ -121,6 +133,8 @@ uint32_t LockBits;
|
||||||
uint32_t Block_buffer[1024];
|
uint32_t Block_buffer[1024];
|
||||||
UINT BlockCount;
|
UINT BlockCount;
|
||||||
|
|
||||||
|
uint32_t memoryType;
|
||||||
|
|
||||||
#if defined(PCBSKY9X)
|
#if defined(PCBSKY9X)
|
||||||
extern int32_t EblockAddress;
|
extern int32_t EblockAddress;
|
||||||
#endif
|
#endif
|
||||||
|
@ -265,13 +279,6 @@ void hw_delay(uint16_t time)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint8_t *cpystr(uint8_t *dest, uint8_t *source)
|
|
||||||
{
|
|
||||||
while ((*dest++ = *source++))
|
|
||||||
;
|
|
||||||
return dest - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
FRESULT readBinDir(DIR *dj, FILINFO *fno)
|
FRESULT readBinDir(DIR *dj, FILINFO *fno)
|
||||||
{
|
{
|
||||||
FRESULT fr;
|
FRESULT fr;
|
||||||
|
@ -284,7 +291,7 @@ FRESULT readBinDir(DIR *dj, FILINFO *fno)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (*fno->lfname == 0) {
|
if (*fno->lfname == 0) {
|
||||||
cpystr((uint8_t *) fno->lfname, (uint8_t *) fno->fname); // Copy 8.3 name
|
strAppend(fno->lfname, fno->fname); // Copy 8.3 name
|
||||||
}
|
}
|
||||||
int32_t len = strlen(fno->lfname) - 4;
|
int32_t len = strlen(fno->lfname) - 4;
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
|
@ -336,46 +343,63 @@ uint32_t fillNames(uint32_t index)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
FRESULT openFirmwareFile(uint32_t index)
|
const char *getBinaryPath()
|
||||||
{
|
{
|
||||||
cpystr(cpystr((uint8_t *)FlashFilename, (uint8_t *)FIRMWARES_PATH "/"), (uint8_t *) Filenames[index]);
|
if (memoryType == MEM_FLASH)
|
||||||
f_open(&FlashFile, FlashFilename, FA_READ);
|
return FIRMWARES_PATH;
|
||||||
f_lseek(&FlashFile, BOOTLOADER_SIZE);
|
else
|
||||||
return f_read(&FlashFile, (BYTE *) Block_buffer, 4096, &BlockCount);
|
return EEPROMS_PATH;
|
||||||
|
}
|
||||||
|
|
||||||
|
FRESULT openBinaryFile(uint32_t index)
|
||||||
|
{
|
||||||
|
TCHAR filename[60];
|
||||||
|
strAppend(strAppend(strAppend(filename, getBinaryPath()), "/"), 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)
|
int menuFlashFile(uint32_t index, uint8_t event)
|
||||||
{
|
{
|
||||||
FRESULT fr;
|
FRESULT fr;
|
||||||
|
|
||||||
lcd_putsLeft(4*FH, "\012Hold [ENT] to start loading" );
|
lcd_putsLeft(4*FH, "\012Hold [ENT] to start writing");
|
||||||
|
|
||||||
if (Valid == 0) {
|
if (Valid == 0) {
|
||||||
// Validate file here
|
// Validate file here
|
||||||
// return 3 if invalid
|
// return 3 if invalid
|
||||||
fr = openFirmwareFile(index);
|
fr = openBinaryFile(index);
|
||||||
fr = f_close(&FlashFile);
|
fr = f_close(&FlashFile);
|
||||||
Valid = 1;
|
Valid = 1;
|
||||||
if (!isFirmwareStart(Block_buffer)) {
|
if (!isValidBufferStart(Block_buffer)) {
|
||||||
Valid = 2;
|
Valid = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Valid == 2) {
|
if (Valid == 2) {
|
||||||
lcd_putsLeft(4*FH, "\011No firmware found in the file!");
|
if (memoryType == MEM_FLASH)
|
||||||
if (event == EVT_KEY_FIRST(BOOT_KEY_EXIT) || event == EVT_KEY_FIRST(BOOT_KEY_MENU)) {
|
lcd_putsLeft(4*FH, "\011Not a valid firmware file! ");
|
||||||
|
else
|
||||||
|
lcd_putsLeft(4*FH, "\011Not a valid EEPROM file! ");
|
||||||
|
if (event == EVT_KEY_BREAK(BOOT_KEY_EXIT) || event == EVT_KEY_BREAK(BOOT_KEY_MENU)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event == EVT_KEY_LONG(BOOT_KEY_MENU)) {
|
if (event == EVT_KEY_LONG(BOOT_KEY_MENU)) {
|
||||||
fr = openFirmwareFile(index);
|
fr = openBinaryFile(index);
|
||||||
FirmwareSize = FileSize[index];
|
return (fr == FR_OK && isValidBufferStart(Block_buffer));
|
||||||
if (fr != FR_OK) {
|
|
||||||
return 0; // File open error
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
else if (event == EVT_KEY_FIRST(BOOT_KEY_EXIT)) {
|
else if (event == EVT_KEY_FIRST(BOOT_KEY_EXIT)) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -388,20 +412,37 @@ extern Key keys[];
|
||||||
|
|
||||||
static uint32_t PowerUpDelay;
|
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);
|
||||||
|
eepromAddress += BlockCount;
|
||||||
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
uint8_t index = 0;
|
uint8_t index = 0;
|
||||||
#if defined(PCBTARANIS)
|
|
||||||
uint8_t TenCount = 2;
|
|
||||||
#endif
|
|
||||||
uint8_t maxhsize = DISPLAY_CHAR_WIDTH;
|
uint8_t maxhsize = DISPLAY_CHAR_WIDTH;
|
||||||
FRESULT fr;
|
FRESULT fr;
|
||||||
uint32_t state = ST_START;
|
uint32_t state = ST_START;
|
||||||
uint32_t nameCount = 0;
|
uint32_t nameCount = 0;
|
||||||
uint32_t vpos = 0;
|
uint32_t vpos = 0;
|
||||||
uint32_t hpos = 0;
|
uint32_t hpos = 0;
|
||||||
uint32_t firmwareAddress = FIRMWARE_ADDRESS;
|
|
||||||
uint32_t firmwareWritten = 0;
|
|
||||||
|
|
||||||
#if defined(PCBTARANIS)
|
#if defined(PCBTARANIS)
|
||||||
wdt_reset();
|
wdt_reset();
|
||||||
|
@ -448,13 +489,6 @@ int main()
|
||||||
init_spi();
|
init_spi();
|
||||||
#endif
|
#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)
|
#if defined(PCBSKY9X)
|
||||||
LockBits = readLockBits();
|
LockBits = readLockBits();
|
||||||
if (LockBits) {
|
if (LockBits) {
|
||||||
|
@ -474,7 +508,6 @@ int main()
|
||||||
wdt_reset();
|
wdt_reset();
|
||||||
|
|
||||||
if (Tenms) {
|
if (Tenms) {
|
||||||
wdt_reset(); // Retrigger hardware watchdog
|
|
||||||
|
|
||||||
if (EE_timer) {
|
if (EE_timer) {
|
||||||
if (--EE_timer == 0) {
|
if (--EE_timer == 0) {
|
||||||
|
@ -501,17 +534,27 @@ int main()
|
||||||
|
|
||||||
if (state == ST_START) {
|
if (state == ST_START) {
|
||||||
lcd_putsLeft(2*FH, "\010Write Firmware");
|
lcd_putsLeft(2*FH, "\010Write Firmware");
|
||||||
lcd_putsLeft(3*FH, "\010Exit");
|
lcd_putsLeft(3*FH, "\010Restore EEPROM");
|
||||||
|
lcd_putsLeft(4*FH, "\010Exit");
|
||||||
lcd_invert_line(2+vpos);
|
lcd_invert_line(2+vpos);
|
||||||
lcd_putsLeft(6*FH, INDENT "Or plug in a USB cable for mass storage");
|
lcd_putsLeft(7*FH, INDENT "Or plug in a USB cable for mass storage");
|
||||||
if (event == EVT_KEY_FIRST(BOOT_KEY_DOWN) || event == EVT_KEY_FIRST(BOOT_KEY_UP)) {
|
if (event == EVT_KEY_FIRST(BOOT_KEY_DOWN)) {
|
||||||
vpos = (vpos+1) & 0x01;
|
vpos == 2 ? vpos = 0 : vpos = vpos+1;
|
||||||
|
}
|
||||||
|
else if (event == EVT_KEY_FIRST(BOOT_KEY_UP)) {
|
||||||
|
vpos == 0 ? vpos = 2 : vpos = vpos-1;
|
||||||
}
|
}
|
||||||
else if (event == EVT_KEY_BREAK(BOOT_KEY_MENU)) {
|
else if (event == EVT_KEY_BREAK(BOOT_KEY_MENU)) {
|
||||||
if (vpos == 0)
|
switch (vpos) {
|
||||||
state = ST_FLASH_MENU;
|
case 0:
|
||||||
else
|
state = ST_FLASH_MENU;
|
||||||
state = ST_REBOOT;
|
break;
|
||||||
|
case 1:
|
||||||
|
state = ST_RESTORE_MENU;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
state = ST_REBOOT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -526,19 +569,20 @@ int main()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state == ST_FLASH_MENU) {
|
if (state == ST_FLASH_MENU || state == ST_RESTORE_MENU) {
|
||||||
sdInit();
|
sdInit();
|
||||||
|
memoryType = (state == ST_RESTORE_MENU ? MEM_EEPROM : MEM_FLASH);
|
||||||
state = ST_DIR_CHECK;
|
state = ST_DIR_CHECK;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (state == ST_DIR_CHECK) {
|
else if (state == ST_DIR_CHECK) {
|
||||||
fr = f_chdir(FIRMWARES_PATH);
|
fr = f_chdir(getBinaryPath());
|
||||||
if (fr == FR_OK) {
|
if (fr == FR_OK) {
|
||||||
state = ST_OPEN_DIR;
|
state = ST_OPEN_DIR;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
lcd_putsLeft(2*FH, INDENT "No firmware in " FIRMWARES_PATH " directory");
|
lcd_putsLeft(2*FH, INDENT "Directory is missing!");
|
||||||
if (event == EVT_KEY_FIRST(BOOT_KEY_EXIT) || event == EVT_KEY_FIRST(BOOT_KEY_MENU)) {
|
if (event == EVT_KEY_BREAK(BOOT_KEY_EXIT) || event == EVT_KEY_BREAK(BOOT_KEY_MENU)) {
|
||||||
vpos = 0;
|
vpos = 0;
|
||||||
state = ST_START;
|
state = ST_START;
|
||||||
}
|
}
|
||||||
|
@ -640,46 +684,42 @@ int main()
|
||||||
// confirmed
|
// confirmed
|
||||||
firmwareAddress = FIRMWARE_ADDRESS + BOOTLOADER_SIZE;
|
firmwareAddress = FIRMWARE_ADDRESS + BOOTLOADER_SIZE;
|
||||||
firmwareWritten = 0;
|
firmwareWritten = 0;
|
||||||
|
eepromAddress = 0;
|
||||||
|
eepromWritten = 0;
|
||||||
state = ST_FLASHING;
|
state = ST_FLASHING;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state == ST_FLASHING) {
|
else if (state == ST_FLASHING) {
|
||||||
// Commit to flashing
|
// commit to flashing
|
||||||
uint32_t blockOffset = 0;
|
|
||||||
lcd_putsLeft(4*FH, "\032Writing...");
|
lcd_putsLeft(4*FH, "\032Writing...");
|
||||||
|
|
||||||
if (firmwareAddress == FIRMWARE_ADDRESS + BOOTLOADER_SIZE) {
|
int progress;
|
||||||
if (!isFirmwareStart(Block_buffer)) {
|
if (memoryType == MEM_FLASH) {
|
||||||
state = ST_FLASH_DONE;
|
writeFlashBlock();
|
||||||
}
|
firmwareWritten += sizeof(Block_buffer);
|
||||||
|
progress = (200*firmwareWritten) / FirmwareSize;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
while (BlockCount) {
|
writeEepromBlock();
|
||||||
writeFlash((uint32_t *)firmwareAddress, &Block_buffer[blockOffset]);
|
eepromWritten += sizeof(Block_buffer);
|
||||||
blockOffset += FLASH_PAGESIZE/4; // 32-bit words
|
progress = (200*eepromWritten) / EESIZE;
|
||||||
firmwareAddress += FLASH_PAGESIZE;
|
|
||||||
if (BlockCount > FLASH_PAGESIZE) {
|
|
||||||
BlockCount -= FLASH_PAGESIZE;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
BlockCount = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
firmwareWritten += 4; // 4K blocks
|
|
||||||
|
|
||||||
lcd_rect( 3, 6*FH+4, 204, 7);
|
lcd_rect( 3, 6*FH+4, 204, 7);
|
||||||
lcd_hline(5, 6*FH+6, (200*firmwareWritten*1024)/FirmwareSize, FORCE);
|
lcd_hline(5, 6*FH+6, progress, FORCE);
|
||||||
lcd_hline(5, 6*FH+7, (200*firmwareWritten*1024)/FirmwareSize, FORCE);
|
lcd_hline(5, 6*FH+7, progress, FORCE);
|
||||||
lcd_hline(5, 6*FH+8, (200*firmwareWritten*1024)/FirmwareSize, FORCE);
|
lcd_hline(5, 6*FH+8, progress, FORCE);
|
||||||
|
|
||||||
fr = f_read(&FlashFile, (BYTE *)Block_buffer, sizeof(Block_buffer), &BlockCount);
|
fr = f_read(&FlashFile, (BYTE *)Block_buffer, sizeof(Block_buffer), &BlockCount);
|
||||||
if (BlockCount == 0) {
|
if (BlockCount == 0) {
|
||||||
state = ST_FLASH_DONE;
|
state = ST_FLASH_DONE; // EOF
|
||||||
}
|
}
|
||||||
if (firmwareWritten >= FlashSize - 32) {
|
if (firmwareWritten >= FLASHSIZE - BOOTLOADER_SIZE) {
|
||||||
state = ST_FLASH_DONE; // Backstop
|
state = ST_FLASH_DONE; // Backstop
|
||||||
|
}
|
||||||
|
if (eepromWritten >= EESIZE) {
|
||||||
|
state = ST_FLASH_DONE; // Backstop
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -695,10 +735,7 @@ int main()
|
||||||
state = ST_REBOOT;
|
state = ST_REBOOT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (--TenCount == 0) {
|
lcdRefresh();
|
||||||
TenCount = 2;
|
|
||||||
lcdRefresh();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (PowerUpDelay < 20) { // 200 mS
|
if (PowerUpDelay < 20) { // 200 mS
|
||||||
PowerUpDelay += 1;
|
PowerUpDelay += 1;
|
||||||
|
|
|
@ -247,4 +247,13 @@ void loadGeneralSettings();
|
||||||
void loadModel(int index);
|
void loadModel(int index);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// For EEPROM backup/restore
|
||||||
|
#if defined(CPUARM)
|
||||||
|
inline bool isEepromStart(const void * buffer)
|
||||||
|
{
|
||||||
|
const EeFs * eeprom = (const EeFs *)buffer;
|
||||||
|
return (eeprom->version==EEFS_VERS && eeprom->mySize==sizeof(eeFs) && eeprom->bs==BS);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -685,6 +685,55 @@ inline bool isFilenameLower(bool isfile, const char * fn, const char * line)
|
||||||
return (!isfile && line[SD_SCREEN_FILE_LENGTH+1]) || (isfile==(bool)line[SD_SCREEN_FILE_LENGTH+1] && strcasecmp(fn, line) < 0);
|
return (!isfile && line[SD_SCREEN_FILE_LENGTH+1]) || (isfile==(bool)line[SD_SCREEN_FILE_LENGTH+1] && strcasecmp(fn, line) < 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(PCBTARANIS)
|
||||||
|
void backupEeprom()
|
||||||
|
{
|
||||||
|
char filename[60];
|
||||||
|
uint8_t buffer[1024];
|
||||||
|
FIL file;
|
||||||
|
|
||||||
|
lcd_clear();
|
||||||
|
lcd_putsLeft(4*FH, STR_WRITING);
|
||||||
|
lcd_rect(3, 6*FH+4, 204, 7);
|
||||||
|
lcdRefresh();
|
||||||
|
|
||||||
|
eeCheck(true);
|
||||||
|
|
||||||
|
// create the directory if needed...
|
||||||
|
DIR folder;
|
||||||
|
FRESULT result = f_opendir(&folder, EEPROMS_PATH);
|
||||||
|
if (result != FR_OK) {
|
||||||
|
if (result == FR_NO_PATH)
|
||||||
|
result = f_mkdir(EEPROMS_PATH);
|
||||||
|
if (result != FR_OK) {
|
||||||
|
POPUP_WARNING(SDCARD_ERROR(result));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// prepare the filename...
|
||||||
|
char * tmp = strAppend(filename, EEPROMS_PATH "/eeprom");
|
||||||
|
tmp = strAppendDate(tmp, true);
|
||||||
|
strAppend(tmp, EEPROM_EXT);
|
||||||
|
|
||||||
|
// open the file for writing...
|
||||||
|
f_open(&file, filename, FA_WRITE | FA_CREATE_ALWAYS);
|
||||||
|
|
||||||
|
for (int i=0; i<EESIZE; i+=1024) {
|
||||||
|
UINT count;
|
||||||
|
eeprom_read_block(buffer, i, 1024);
|
||||||
|
f_write(&file, buffer, 1024, &count);
|
||||||
|
lcd_hline(5, 6*FH+6, (200*i)/EESIZE, FORCE);
|
||||||
|
lcd_hline(5, 6*FH+7, (200*i)/EESIZE, FORCE);
|
||||||
|
lcd_hline(5, 6*FH+8, (200*i)/EESIZE, FORCE);
|
||||||
|
lcdRefresh();
|
||||||
|
SIMU_SLEEP(100/*ms*/);
|
||||||
|
}
|
||||||
|
|
||||||
|
f_close(&file);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(PCBTARANIS)
|
#if defined(PCBTARANIS)
|
||||||
void flashBootloader(const char * filename)
|
void flashBootloader(const char * filename)
|
||||||
{
|
{
|
||||||
|
@ -696,6 +745,7 @@ void flashBootloader(const char * filename)
|
||||||
lcd_clear();
|
lcd_clear();
|
||||||
lcd_putsLeft(4*FH, STR_WRITING);
|
lcd_putsLeft(4*FH, STR_WRITING);
|
||||||
lcd_rect(3, 6*FH+4, 204, 7);
|
lcd_rect(3, 6*FH+4, 204, 7);
|
||||||
|
lcdRefresh();
|
||||||
|
|
||||||
static uint8_t unlocked = 0;
|
static uint8_t unlocked = 0;
|
||||||
if (!unlocked) {
|
if (!unlocked) {
|
||||||
|
@ -719,8 +769,10 @@ void flashBootloader(const char * filename)
|
||||||
lcd_hline(5, 6*FH+7, (200*i)/BOOTLOADER_SIZE, FORCE);
|
lcd_hline(5, 6*FH+7, (200*i)/BOOTLOADER_SIZE, FORCE);
|
||||||
lcd_hline(5, 6*FH+8, (200*i)/BOOTLOADER_SIZE, FORCE);
|
lcd_hline(5, 6*FH+8, (200*i)/BOOTLOADER_SIZE, FORCE);
|
||||||
lcdRefresh();
|
lcdRefresh();
|
||||||
|
SIMU_SLEEP(30/*ms*/);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
f_close(&file);
|
f_close(&file);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1131,6 +1183,13 @@ void menuGeneralVersion(uint8_t event)
|
||||||
lcd_putsLeft(6*FH, PSTR("CoPr: ---"));
|
lcd_putsLeft(6*FH, PSTR("CoPr: ---"));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(PCBTARANIS)
|
||||||
|
lcd_putsLeft(7*FH, "\004[ENTER Long] to backup the EEPROM");
|
||||||
|
if (event == EVT_KEY_LONG(KEY_ENTER)) {
|
||||||
|
backupEeprom();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void displayKeyState(uint8_t x, uint8_t y, EnumKeys key)
|
void displayKeyState(uint8_t x, uint8_t y, EnumKeys key)
|
||||||
|
|
|
@ -295,5 +295,7 @@ void lcdRefresh();
|
||||||
#define LCD_BYTE_FILTER(p, keep, add) LCD_BYTE_FILTER_PLAN(p, keep, add)
|
#define LCD_BYTE_FILTER(p, keep, add) LCD_BYTE_FILTER_PLAN(p, keep, add)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
char * strAppend(char * dest, const char * source);
|
||||||
|
char * strAppendDate(char * str, bool time=false);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
/*eof*/
|
|
||||||
|
|
|
@ -95,28 +95,13 @@ const pm_char * openLogs()
|
||||||
len = sizeof(LOGS_PATH) + PSIZE(TR_MODEL) + 2;
|
len = sizeof(LOGS_PATH) + PSIZE(TR_MODEL) + 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char * tmp = &filename[len];
|
||||||
|
|
||||||
#if defined(RTCLOCK)
|
#if defined(RTCLOCK)
|
||||||
filename[len] = '-';
|
tmp = strAppendDate(&filename[len]);
|
||||||
struct gtm utm;
|
|
||||||
gettime(&utm);
|
|
||||||
div_t qr = div(utm.tm_year+1900, 10);
|
|
||||||
filename[len+4] = '0' + qr.rem;
|
|
||||||
qr = div(qr.quot, 10);
|
|
||||||
filename[len+3] = '0' + qr.rem;
|
|
||||||
qr = div(qr.quot, 10);
|
|
||||||
filename[len+2] = '0' + qr.rem;
|
|
||||||
filename[len+1] = '0' + qr.quot;
|
|
||||||
filename[len+5] = '-';
|
|
||||||
qr = div(utm.tm_mon+1, 10);
|
|
||||||
filename[len+7] = '0' + qr.rem;
|
|
||||||
filename[len+6] = '0' + qr.quot;
|
|
||||||
filename[len+8] = '-';
|
|
||||||
qr = div(utm.tm_mday, 10);
|
|
||||||
filename[len+10] = '0' + qr.rem;
|
|
||||||
filename[len+9] = '0' + qr.quot;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
strcpy_P(&filename[len+11], STR_LOGS_EXT);
|
strcpy_P(tmp, STR_LOGS_EXT);
|
||||||
|
|
||||||
result = f_open(&g_oLogFile, filename, FA_OPEN_ALWAYS | FA_WRITE);
|
result = f_open(&g_oLogFile, filename, FA_OPEN_ALWAYS | FA_WRITE);
|
||||||
if (result != FR_OK) {
|
if (result != FR_OK) {
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
#define BITMAPS_PATH ROOT_PATH "BMP"
|
#define BITMAPS_PATH ROOT_PATH "BMP"
|
||||||
#define SCRIPTS_PATH ROOT_PATH "SCRIPTS"
|
#define SCRIPTS_PATH ROOT_PATH "SCRIPTS"
|
||||||
#define FIRMWARES_PATH ROOT_PATH "FIRMWARES"
|
#define FIRMWARES_PATH ROOT_PATH "FIRMWARES"
|
||||||
|
#define EEPROMS_PATH ROOT_PATH "EEPROMS"
|
||||||
|
|
||||||
#define MODELS_EXT ".bin"
|
#define MODELS_EXT ".bin"
|
||||||
#define LOGS_EXT ".csv"
|
#define LOGS_EXT ".csv"
|
||||||
|
@ -56,6 +57,7 @@
|
||||||
#define SCRIPTS_EXT ".lua"
|
#define SCRIPTS_EXT ".lua"
|
||||||
#define TEXT_EXT ".txt"
|
#define TEXT_EXT ".txt"
|
||||||
#define FIRMWARE_EXT ".bin"
|
#define FIRMWARE_EXT ".bin"
|
||||||
|
#define EEPROM_EXT ".bin"
|
||||||
|
|
||||||
extern FATFS g_FATFS_Obj;
|
extern FATFS g_FATFS_Obj;
|
||||||
|
|
||||||
|
|
|
@ -674,6 +674,6 @@ FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG) { return RESET; }
|
||||||
ErrorStatus RTC_WaitForSynchro(void) { return SUCCESS; }
|
ErrorStatus RTC_WaitForSynchro(void) { return SUCCESS; }
|
||||||
void unlockFlash() { }
|
void unlockFlash() { }
|
||||||
void writeFlash(uint32_t *address, uint32_t *buffer) { SIMU_SLEEP(100); }
|
void writeFlash(uint32_t *address, uint32_t *buffer) { SIMU_SLEEP(100); }
|
||||||
uint32_t isBootloaderStart(uint32_t *block) { return 1; }
|
uint32_t isBootloaderStart(const uint32_t *block) { return 1; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
56
radio/src/strhelpers.cpp
Executable file
56
radio/src/strhelpers.cpp
Executable file
|
@ -0,0 +1,56 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
char * strAppend(char * dest, const char * source)
|
||||||
|
{
|
||||||
|
while ((*dest++ = *source++))
|
||||||
|
;
|
||||||
|
return dest - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(RTCLOCK)
|
||||||
|
#include "rtc.h"
|
||||||
|
|
||||||
|
char * strAppendDate(char * str, bool time)
|
||||||
|
{
|
||||||
|
str[0] = '-';
|
||||||
|
struct gtm utm;
|
||||||
|
gettime(&utm);
|
||||||
|
div_t qr = div(utm.tm_year+1900, 10);
|
||||||
|
str[4] = '0' + qr.rem;
|
||||||
|
qr = div(qr.quot, 10);
|
||||||
|
str[3] = '0' + qr.rem;
|
||||||
|
qr = div(qr.quot, 10);
|
||||||
|
str[2] = '0' + qr.rem;
|
||||||
|
str[1] = '0' + qr.quot;
|
||||||
|
str[5] = '-';
|
||||||
|
qr = div(utm.tm_mon+1, 10);
|
||||||
|
str[7] = '0' + qr.rem;
|
||||||
|
str[6] = '0' + qr.quot;
|
||||||
|
str[8] = '-';
|
||||||
|
qr = div(utm.tm_mday, 10);
|
||||||
|
str[10] = '0' + qr.rem;
|
||||||
|
str[9] = '0' + qr.quot;
|
||||||
|
|
||||||
|
if (time) {
|
||||||
|
str[11] = '-';
|
||||||
|
div_t qr = div(utm.tm_hour, 10);
|
||||||
|
str[13] = '0' + qr.rem;
|
||||||
|
str[12] = '0' + qr.quot;
|
||||||
|
str[14] = '-';
|
||||||
|
qr = div(utm.tm_min, 10);
|
||||||
|
str[16] = '0' + qr.rem;
|
||||||
|
str[15] = '0' + qr.quot;
|
||||||
|
str[17] = '-';
|
||||||
|
qr = div(utm.tm_sec, 10);
|
||||||
|
str[19] = '0' + qr.rem;
|
||||||
|
str[18] = '0' + qr.quot;
|
||||||
|
str[20] = '\0';
|
||||||
|
return &str[20];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
str[11] = '\0';
|
||||||
|
return &str[11];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -145,8 +145,8 @@ void delay_01us(uint16_t nb);
|
||||||
#define FLASH_PAGESIZE 256
|
#define FLASH_PAGESIZE 256
|
||||||
void unlockFlash();
|
void unlockFlash();
|
||||||
void writeFlash(uint32_t * address, uint32_t * buffer);
|
void writeFlash(uint32_t * address, uint32_t * buffer);
|
||||||
uint32_t isFirmwareStart(uint32_t *block);
|
uint32_t isFirmwareStart(const uint32_t *block);
|
||||||
uint32_t isBootloaderStart(uint32_t *block);
|
uint32_t isBootloaderStart(const uint32_t *block);
|
||||||
|
|
||||||
// Pulses driver
|
// Pulses driver
|
||||||
void init_no_pulses(uint32_t port);
|
void init_no_pulses(uint32_t port);
|
||||||
|
|
|
@ -98,7 +98,7 @@ void writeFlash(uint32_t *address, uint32_t *buffer) // page size is 256 bytes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t isFirmwareStart(uint32_t *block)
|
uint32_t isFirmwareStart(const uint32_t *block)
|
||||||
{
|
{
|
||||||
if ((block[0] & 0xFFFC0000) != 0x20000000) {
|
if ((block[0] & 0xFFFC0000) != 0x20000000) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -112,7 +112,7 @@ uint32_t isFirmwareStart(uint32_t *block)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t isBootloaderStart(uint32_t *block)
|
uint32_t isBootloaderStart(const uint32_t *block)
|
||||||
{
|
{
|
||||||
for (int i=0; i<256; i++) {
|
for (int i=0; i<256; i++) {
|
||||||
if (block[i] == 0x544F4F42/*BOOT*/) {
|
if (block[i] == 0x544F4F42/*BOOT*/) {
|
||||||
|
|
|
@ -697,7 +697,7 @@ int32_t fat12Read( uint8_t *buffer, uint16_t sector, uint16_t count )
|
||||||
memcpy(buffer, g_DIRroot, BLOCKSIZE ) ;
|
memcpy(buffer, g_DIRroot, BLOCKSIZE ) ;
|
||||||
}
|
}
|
||||||
else if (sector < 3 + (EESIZE/BLOCKSIZE)) {
|
else if (sector < 3 + (EESIZE/BLOCKSIZE)) {
|
||||||
eeprom_read_block (buffer, (sector-3)*BLOCKSIZE, BLOCKSIZE);
|
eeprom_read_block(buffer, (sector-3)*BLOCKSIZE, BLOCKSIZE);
|
||||||
}
|
}
|
||||||
else if (sector < 3 + (EESIZE/BLOCKSIZE) + (FLASHSIZE/BLOCKSIZE)) {
|
else if (sector < 3 + (EESIZE/BLOCKSIZE) + (FLASHSIZE/BLOCKSIZE)) {
|
||||||
uint32_t address;
|
uint32_t address;
|
||||||
|
@ -724,8 +724,7 @@ int32_t fat12Write(const uint8_t *buffer, uint16_t sector, uint32_t count )
|
||||||
}
|
}
|
||||||
else if (sector < 3 + (EESIZE/BLOCKSIZE)) {
|
else if (sector < 3 + (EESIZE/BLOCKSIZE)) {
|
||||||
while (count) {
|
while (count) {
|
||||||
const EeFs * test = (const EeFs *)buffer;
|
if (offset == 0 && isEepromStart(buffer)) {
|
||||||
if (offset == 0 && test->version==EEFS_VERS && test->mySize==sizeof(eeFs) && test->bs==BS) {
|
|
||||||
TRACE("EEPROM start found in sector %d", sector);
|
TRACE("EEPROM start found in sector %d", sector);
|
||||||
offset = sector;
|
offset = sector;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue