1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-15 12:25:12 +03:00

Whole EEPROM Backup

This commit is contained in:
bsongis 2014-04-09 17:28:54 +02:00
parent 7540768c1f
commit d1f45951fc
10 changed files with 136 additions and 58 deletions

View file

@ -20,3 +20,4 @@
/traces /traces
/MODELS /MODELS
/FIRMWARES /FIRMWARES
/EEPROMS

View file

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

View file

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

View file

@ -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) { lcdRefresh();
TenCount = 2;
lcdRefresh();
}
if (PowerUpDelay < 20) { // 200 mS if (PowerUpDelay < 20) { // 200 mS
PowerUpDelay += 1; PowerUpDelay += 1;

View file

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

View file

@ -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*/

View file

@ -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) {

View file

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

View file

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