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
|
||||
/MODELS
|
||||
/FIRMWARES
|
||||
/EEPROMS
|
||||
|
|
|
@ -949,7 +949,7 @@ endif
|
|||
|
||||
ifeq ($(SDCARD), YES)
|
||||
CPPDEFS += -DSDCARD
|
||||
CPPSRC += logs.cpp
|
||||
CPPSRC += logs.cpp strhelpers.cpp
|
||||
endif
|
||||
|
||||
RUN_FROM_FLASH = 1
|
||||
|
|
|
@ -169,6 +169,7 @@ CPPSRC = ../targets/taranis/lcd_driver.cpp \
|
|||
../lcd.cpp \
|
||||
../keys.cpp \
|
||||
../fonts.cpp \
|
||||
../strhelpers.cpp \
|
||||
boot.cpp
|
||||
|
||||
# List ASM source files here
|
||||
|
|
|
@ -91,7 +91,6 @@ enum BootLoaderStates {
|
|||
ST_FLASH_CHECK,
|
||||
ST_FLASHING,
|
||||
ST_FLASH_DONE,
|
||||
ST_BACKUP_EEPROM,
|
||||
ST_RESTORE_MENU,
|
||||
ST_USB,
|
||||
ST_REBOOT,
|
||||
|
@ -112,6 +111,8 @@ uint32_t firmwareWritten = 0;
|
|||
uint32_t eepromAddress = 0;
|
||||
uint32_t eepromWritten = 0;
|
||||
|
||||
TCHAR backupFilename[60];
|
||||
|
||||
uint32_t Master_frequency;
|
||||
volatile uint8_t Tenms;
|
||||
uint8_t EE_timer;
|
||||
|
@ -278,13 +279,6 @@ void hw_delay(uint16_t time)
|
|||
}
|
||||
#endif
|
||||
|
||||
char * cpystr(char * dest, const char * source)
|
||||
{
|
||||
while ((*dest++ = *source++))
|
||||
;
|
||||
return dest - 1;
|
||||
}
|
||||
|
||||
FRESULT readBinDir(DIR *dj, FILINFO *fno)
|
||||
{
|
||||
FRESULT fr;
|
||||
|
@ -297,7 +291,7 @@ FRESULT readBinDir(DIR *dj, FILINFO *fno)
|
|||
break;
|
||||
}
|
||||
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;
|
||||
if (len < 0) {
|
||||
|
@ -360,7 +354,7 @@ const char *getBinaryPath()
|
|||
FRESULT openBinaryFile(uint32_t index)
|
||||
{
|
||||
TCHAR filename[60];
|
||||
cpystr(cpystr(cpystr(filename, getBinaryPath()), "/"), Filenames[index]);
|
||||
strAppend(strAppend(strAppend(filename, getBinaryPath()), "/"), Filenames[index]);
|
||||
f_open(&FlashFile, filename, FA_READ);
|
||||
if (memoryType == MEM_FLASH)
|
||||
f_lseek(&FlashFile, BOOTLOADER_SIZE);
|
||||
|
@ -443,9 +437,6 @@ void writeEepromBlock()
|
|||
int main()
|
||||
{
|
||||
uint8_t index = 0;
|
||||
#if defined(PCBTARANIS)
|
||||
uint8_t TenCount = 2;
|
||||
#endif
|
||||
uint8_t maxhsize = DISPLAY_CHAR_WIDTH;
|
||||
FRESULT fr;
|
||||
uint32_t state = ST_START;
|
||||
|
@ -517,7 +508,6 @@ int main()
|
|||
wdt_reset();
|
||||
|
||||
if (Tenms) {
|
||||
wdt_reset(); // Retrigger hardware watchdog
|
||||
|
||||
if (EE_timer) {
|
||||
if (--EE_timer == 0) {
|
||||
|
@ -544,16 +534,15 @@ int main()
|
|||
|
||||
if (state == ST_START) {
|
||||
lcd_putsLeft(2*FH, "\010Write Firmware");
|
||||
lcd_putsLeft(3*FH, "\010Backup EEPROM");
|
||||
lcd_putsLeft(4*FH, "\010Restore EEPROM");
|
||||
lcd_putsLeft(5*FH, "\010Exit");
|
||||
lcd_putsLeft(3*FH, "\010Restore EEPROM");
|
||||
lcd_putsLeft(4*FH, "\010Exit");
|
||||
lcd_invert_line(2+vpos);
|
||||
lcd_putsLeft(7*FH, INDENT "Or plug in a USB cable for mass storage");
|
||||
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)) {
|
||||
vpos == 0 ? vpos = 3 : vpos = vpos-1;
|
||||
vpos == 0 ? vpos = 2 : vpos = vpos-1;
|
||||
}
|
||||
else if (event == EVT_KEY_BREAK(BOOT_KEY_MENU)) {
|
||||
switch (vpos) {
|
||||
|
@ -561,9 +550,6 @@ int main()
|
|||
state = ST_FLASH_MENU;
|
||||
break;
|
||||
case 1:
|
||||
state = ST_BACKUP_EEPROM;
|
||||
break;
|
||||
case 2:
|
||||
state = ST_RESTORE_MENU;
|
||||
break;
|
||||
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) {
|
||||
uint32_t limit = 6;
|
||||
if (nameCount < limit) {
|
||||
|
@ -759,10 +735,7 @@ int main()
|
|||
state = ST_REBOOT;
|
||||
}
|
||||
|
||||
if (--TenCount == 0) {
|
||||
TenCount = 2;
|
||||
lcdRefresh();
|
||||
}
|
||||
lcdRefresh();
|
||||
|
||||
if (PowerUpDelay < 20) { // 200 mS
|
||||
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);
|
||||
}
|
||||
|
||||
#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)
|
||||
void flashBootloader(const char * filename)
|
||||
{
|
||||
|
@ -696,6 +745,7 @@ void flashBootloader(const char * filename)
|
|||
lcd_clear();
|
||||
lcd_putsLeft(4*FH, STR_WRITING);
|
||||
lcd_rect(3, 6*FH+4, 204, 7);
|
||||
lcdRefresh();
|
||||
|
||||
static uint8_t unlocked = 0;
|
||||
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+8, (200*i)/BOOTLOADER_SIZE, FORCE);
|
||||
lcdRefresh();
|
||||
SIMU_SLEEP(30/*ms*/);
|
||||
}
|
||||
}
|
||||
|
||||
f_close(&file);
|
||||
}
|
||||
#endif
|
||||
|
@ -1131,6 +1183,13 @@ void menuGeneralVersion(uint8_t event)
|
|||
lcd_putsLeft(6*FH, PSTR("CoPr: ---"));
|
||||
}
|
||||
#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)
|
||||
|
|
|
@ -295,5 +295,7 @@ void lcdRefresh();
|
|||
#define LCD_BYTE_FILTER(p, keep, add) LCD_BYTE_FILTER_PLAN(p, keep, add)
|
||||
#endif
|
||||
|
||||
char * strAppend(char * dest, const char * source);
|
||||
char * strAppendDate(char * str, bool time=false);
|
||||
|
||||
#endif
|
||||
/*eof*/
|
||||
|
|
|
@ -95,28 +95,13 @@ const pm_char * openLogs()
|
|||
len = sizeof(LOGS_PATH) + PSIZE(TR_MODEL) + 2;
|
||||
}
|
||||
|
||||
char * tmp = &filename[len];
|
||||
|
||||
#if defined(RTCLOCK)
|
||||
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;
|
||||
tmp = strAppendDate(&filename[len]);
|
||||
#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);
|
||||
if (result != FR_OK) {
|
||||
|
|
|
@ -57,6 +57,7 @@
|
|||
#define SCRIPTS_EXT ".lua"
|
||||
#define TEXT_EXT ".txt"
|
||||
#define FIRMWARE_EXT ".bin"
|
||||
#define EEPROM_EXT ".bin"
|
||||
|
||||
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 ) ;
|
||||
}
|
||||
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)) {
|
||||
uint32_t address;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue