mirror of
https://github.com/opentx/opentx.git
synced 2025-07-15 20:35:17 +03:00
Whole EEPROM Backup
This commit is contained in:
parent
7540768c1f
commit
d1f45951fc
10 changed files with 136 additions and 58 deletions
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
|
||||||
|
|
|
@ -91,7 +91,6 @@ enum BootLoaderStates {
|
||||||
ST_FLASH_CHECK,
|
ST_FLASH_CHECK,
|
||||||
ST_FLASHING,
|
ST_FLASHING,
|
||||||
ST_FLASH_DONE,
|
ST_FLASH_DONE,
|
||||||
ST_BACKUP_EEPROM,
|
|
||||||
ST_RESTORE_MENU,
|
ST_RESTORE_MENU,
|
||||||
ST_USB,
|
ST_USB,
|
||||||
ST_REBOOT,
|
ST_REBOOT,
|
||||||
|
@ -112,6 +111,8 @@ uint32_t firmwareWritten = 0;
|
||||||
uint32_t eepromAddress = 0;
|
uint32_t eepromAddress = 0;
|
||||||
uint32_t eepromWritten = 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;
|
||||||
|
@ -278,13 +279,6 @@ void hw_delay(uint16_t time)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char * cpystr(char * dest, const char * source)
|
|
||||||
{
|
|
||||||
while ((*dest++ = *source++))
|
|
||||||
;
|
|
||||||
return dest - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
FRESULT readBinDir(DIR *dj, FILINFO *fno)
|
FRESULT readBinDir(DIR *dj, FILINFO *fno)
|
||||||
{
|
{
|
||||||
FRESULT fr;
|
FRESULT fr;
|
||||||
|
@ -297,7 +291,7 @@ FRESULT readBinDir(DIR *dj, FILINFO *fno)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (*fno->lfname == 0) {
|
if (*fno->lfname == 0) {
|
||||||
cpystr(fno->lfname, 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) {
|
||||||
|
@ -360,7 +354,7 @@ const char *getBinaryPath()
|
||||||
FRESULT openBinaryFile(uint32_t index)
|
FRESULT openBinaryFile(uint32_t index)
|
||||||
{
|
{
|
||||||
TCHAR filename[60];
|
TCHAR filename[60];
|
||||||
cpystr(cpystr(cpystr(filename, getBinaryPath()), "/"), Filenames[index]);
|
strAppend(strAppend(strAppend(filename, getBinaryPath()), "/"), Filenames[index]);
|
||||||
f_open(&FlashFile, filename, FA_READ);
|
f_open(&FlashFile, filename, FA_READ);
|
||||||
if (memoryType == MEM_FLASH)
|
if (memoryType == MEM_FLASH)
|
||||||
f_lseek(&FlashFile, BOOTLOADER_SIZE);
|
f_lseek(&FlashFile, BOOTLOADER_SIZE);
|
||||||
|
@ -443,9 +437,6 @@ void writeEepromBlock()
|
||||||
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;
|
||||||
|
@ -517,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) {
|
||||||
|
@ -544,16 +534,15 @@ 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, "\010Backup EEPROM");
|
lcd_putsLeft(3*FH, "\010Restore EEPROM");
|
||||||
lcd_putsLeft(4*FH, "\010Restore EEPROM");
|
lcd_putsLeft(4*FH, "\010Exit");
|
||||||
lcd_putsLeft(5*FH, "\010Exit");
|
|
||||||
lcd_invert_line(2+vpos);
|
lcd_invert_line(2+vpos);
|
||||||
lcd_putsLeft(7*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)) {
|
if (event == EVT_KEY_FIRST(BOOT_KEY_DOWN)) {
|
||||||
vpos == 3 ? vpos = 0 : vpos = vpos+1;
|
vpos == 2 ? vpos = 0 : vpos = vpos+1;
|
||||||
}
|
}
|
||||||
else if (event == EVT_KEY_FIRST(BOOT_KEY_UP)) {
|
else if (event == EVT_KEY_FIRST(BOOT_KEY_UP)) {
|
||||||
vpos == 0 ? vpos = 3 : vpos = vpos-1;
|
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)) {
|
||||||
switch (vpos) {
|
switch (vpos) {
|
||||||
|
@ -561,9 +550,6 @@ int main()
|
||||||
state = ST_FLASH_MENU;
|
state = ST_FLASH_MENU;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
state = ST_BACKUP_EEPROM;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
state = ST_RESTORE_MENU;
|
state = ST_RESTORE_MENU;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -614,16 +600,6 @@ 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state == ST_FILE_LIST) {
|
if (state == ST_FILE_LIST) {
|
||||||
uint32_t limit = 6;
|
uint32_t limit = 6;
|
||||||
if (nameCount < limit) {
|
if (nameCount < limit) {
|
||||||
|
@ -759,10 +735,7 @@ int main()
|
||||||
state = ST_REBOOT;
|
state = ST_REBOOT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (--TenCount == 0) {
|
|
||||||
TenCount = 2;
|
|
||||||
lcdRefresh();
|
lcdRefresh();
|
||||||
}
|
|
||||||
|
|
||||||
if (PowerUpDelay < 20) { // 200 mS
|
if (PowerUpDelay < 20) { // 200 mS
|
||||||
PowerUpDelay += 1;
|
PowerUpDelay += 1;
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -57,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;
|
||||||
|
|
||||||
|
|
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
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue