1
0
Fork 0
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:
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
/MODELS
/FIRMWARES
/EEPROMS

View file

@ -949,7 +949,7 @@ endif
ifeq ($(SDCARD), YES)
CPPDEFS += -DSDCARD
CPPSRC += logs.cpp
CPPSRC += logs.cpp strhelpers.cpp
endif
RUN_FROM_FLASH = 1

View file

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

View file

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

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);
}
#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)

View file

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

View file

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

View file

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