From ad465aaf21c1a20242336c682d7a4d9ef330026b Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Tue, 8 Apr 2014 16:41:14 +0200 Subject: [PATCH 01/12] UI --- radio/src/bootloader/boot.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/radio/src/bootloader/boot.cpp b/radio/src/bootloader/boot.cpp index 0b7729179..f9292cc46 100644 --- a/radio/src/bootloader/boot.cpp +++ b/radio/src/bootloader/boot.cpp @@ -725,11 +725,16 @@ int main() if (state == ST_START) { lcd_putsLeft(2*FH, "\010Load Firmware"); - lcd_putsLeft(3*FH, "\010Exit"); + lcd_putsLeft(3*FH, "\010Backup EEPROM"); + lcd_putsLeft(4*FH, "\010Restore EEPROM"); + lcd_putsLeft(5*FH, "\010Exit"); lcd_invert_line(2+vpos); - lcd_putsLeft(6*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)) { - vpos = (vpos+1) & 0x01; + 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; + } + else if (event == EVT_KEY_FIRST(BOOT_KEY_UP)) { + vpos == 0 ? vpos = 3 : vpos = vpos-1; } else if (event == EVT_KEY_BREAK(BOOT_KEY_MENU)) { if (vpos == 0) From 5ee181dc093c359d29ccee6c5e624786782104e2 Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Tue, 8 Apr 2014 17:09:29 +0200 Subject: [PATCH 02/12] Some logic added --- radio/src/bootloader/boot.cpp | 58 +++++++++++++++++++++++++++++------ radio/src/sdcard.h | 1 + 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/radio/src/bootloader/boot.cpp b/radio/src/bootloader/boot.cpp index f9292cc46..0b095bb7c 100644 --- a/radio/src/bootloader/boot.cpp +++ b/radio/src/bootloader/boot.cpp @@ -99,6 +99,14 @@ enum BootLoaderStates { ST_FLASH_DONE, ST_USB, ST_REBOOT, + ST_BACKUP_EEPROM, + ST_RESTORE_MENU, + ST_EEPROM_CHECK, +}; + +enum MemoryTypes { + MEM_FLASH, + MEM_EEPROM }; /*---------------------------------------------------------------------------- @@ -572,6 +580,8 @@ int menuFlashFile(uint32_t index, uint8_t event) { FRESULT fr; + // TODO if (memoryType == MEM_EEPROM) + lcd_putsLeft(4*FH, "\012Hold [ENT] to start loading" ); if (Valid == 0) { @@ -626,6 +636,7 @@ int main() uint32_t hpos = 0; uint32_t firmwareAddress = FIRMWARE_ADDRESS; uint32_t firmwareWritten = 0; + uint32_t memoryType; #if defined(PCBTARANIS) wdt_reset(); @@ -724,7 +735,7 @@ int main() } if (state == ST_START) { - lcd_putsLeft(2*FH, "\010Load Firmware"); + lcd_putsLeft(2*FH, "\010Write Firmware"); lcd_putsLeft(3*FH, "\010Backup EEPROM"); lcd_putsLeft(4*FH, "\010Restore EEPROM"); lcd_putsLeft(5*FH, "\010Exit"); @@ -737,10 +748,19 @@ int main() vpos == 0 ? vpos = 3 : vpos = vpos-1; } else if (event == EVT_KEY_BREAK(BOOT_KEY_MENU)) { - if (vpos == 0) - state = ST_FLASH_MENU; - else - state = ST_REBOOT; + switch (vpos) { + case 0: + state = ST_FLASH_MENU; + break; + case 1: + state = ST_BACKUP_EEPROM; + break; + case 2: + state = ST_RESTORE_MENU; + break; + default: + state = ST_REBOOT; + } } } @@ -759,19 +779,23 @@ int main() #endif } - if (state == ST_FLASH_MENU) { + if ((state == ST_FLASH_MENU) || (state == ST_RESTORE_MENU)) { sdInit(); + state == ST_RESTORE_MENU ? memoryType = MEM_EEPROM : memoryType = MEM_FLASH; state = ST_DIR_CHECK; } else if (state == ST_DIR_CHECK) { - fr = f_chdir(FIRMWARES_PATH); + if (memoryType == MEM_FLASH) + fr = f_chdir(FIRMWARES_PATH); + else + fr = f_chdir(EEPROMS_PATH); if (fr == FR_OK) { state = ST_OPEN_DIR; } else { - lcd_putsLeft(2*FH, INDENT "No firmware in " FIRMWARES_PATH " directory"); - if (event == EVT_KEY_FIRST(BOOT_KEY_EXIT) || event == EVT_KEY_FIRST(BOOT_KEY_MENU)) { + lcd_putsLeft(2*FH, INDENT "Directory is missing!"); + if (event == EVT_KEY_BREAK(BOOT_KEY_EXIT) || event == EVT_KEY_BREAK(BOOT_KEY_MENU)) { vpos = 0; state = ST_START; } @@ -789,6 +813,17 @@ 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) { @@ -851,7 +886,10 @@ int main() #endif else if (event == EVT_KEY_BREAK(BOOT_KEY_MENU)) { // Select file to flash - state = ST_FLASH_CHECK; + if (memoryType == MEM_FLASH) + state = ST_FLASH_CHECK; + else + state = ST_EEPROM_CHECK; Valid = 0; } else if (event == EVT_KEY_FIRST(BOOT_KEY_EXIT)) { diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index 1a216562c..ca7d7f7f7 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -48,6 +48,7 @@ #define BITMAPS_PATH ROOT_PATH "BMP" #define SCRIPTS_PATH ROOT_PATH "SCRIPTS" #define FIRMWARES_PATH ROOT_PATH "FIRMWARES" +#define EEPROMS_PATH ROOT_PATH "EEPROMS" #define MODELS_EXT ".bin" #define LOGS_EXT ".csv" From 5dab6ef38f3440f02eafa18fee6ce969c608a693 Mon Sep 17 00:00:00 2001 From: bsongis Date: Wed, 9 Apr 2014 11:51:38 +0200 Subject: [PATCH 03/12] EEPROM Restore added in Bootloader --- radio/src/bootloader/boot.cpp | 156 ++++++++++-------- radio/src/eeprom_rlc.h | 9 + radio/src/targets/taranis/board_taranis.h | 4 +- radio/src/targets/taranis/flash_driver.cpp | 4 +- .../src/targets/taranis/usbd_storage_msd.cpp | 3 +- 5 files changed, 102 insertions(+), 74 deletions(-) diff --git a/radio/src/bootloader/boot.cpp b/radio/src/bootloader/boot.cpp index 8d1706905..60cd35a97 100644 --- a/radio/src/bootloader/boot.cpp +++ b/radio/src/bootloader/boot.cpp @@ -54,6 +54,7 @@ #include #include "board_taranis.h" +#include "../eeprom_rlc.h" #include "../pwr.h" #include "../lcd.h" #include "../keys.h" @@ -90,11 +91,10 @@ enum BootLoaderStates { ST_FLASH_CHECK, ST_FLASHING, ST_FLASH_DONE, - ST_USB, - ST_REBOOT, ST_BACKUP_EEPROM, ST_RESTORE_MENU, - ST_EEPROM_CHECK, + ST_USB, + ST_REBOOT, }; enum MemoryTypes { @@ -107,12 +107,15 @@ enum MemoryTypes { *----------------------------------------------------------------------------*/ uint32_t FirmwareSize; +uint32_t firmwareAddress = FIRMWARE_ADDRESS; +uint32_t firmwareWritten = 0; +uint32_t eepromAddress = 0; +uint32_t eepromWritten = 0; uint32_t Master_frequency; volatile uint8_t Tenms; uint8_t EE_timer; -TCHAR FlashFilename[60]; FIL FlashFile; DIR Dj; FILINFO Finfo; @@ -129,6 +132,8 @@ uint32_t LockBits; uint32_t Block_buffer[1024]; UINT BlockCount; +uint32_t memoryType; + #if defined(PCBSKY9X) extern int32_t EblockAddress; #endif @@ -344,35 +349,54 @@ uint32_t fillNames(uint32_t index) return i; } -FRESULT openFirmwareFile(uint32_t index) +const char *getBinaryPath() { - cpystr(cpystr((uint8_t *)FlashFilename, (uint8_t *)FIRMWARES_PATH "/"), (uint8_t *) Filenames[index]); - f_open(&FlashFile, FlashFilename, FA_READ); - f_lseek(&FlashFile, BOOTLOADER_SIZE); - return f_read(&FlashFile, (BYTE *) Block_buffer, 4096, &BlockCount); + if (memoryType == MEM_FLASH) + return FIRMWARES_PATH; + else + return EEPROMS_PATH; +} + +FRESULT openBinaryFile(uint32_t index) +{ + TCHAR filename[60]; + cpystr(cpystr(cpystr((uint8_t *)filename, (uint8_t *)getBinaryPath), (uint8_t *)"/"), (uint8_t *)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) { FRESULT fr; - // TODO if (memoryType == MEM_EEPROM) - lcd_putsLeft(4*FH, "\012Hold [ENT] to start loading" ); if (Valid == 0) { // Validate file here // return 3 if invalid - fr = openFirmwareFile(index); + fr = openBinaryFile(index); fr = f_close(&FlashFile); Valid = 1; - if (!isFirmwareStart(Block_buffer)) { + if (!isValidBufferStart(Block_buffer)) { Valid = 2; } } if (Valid == 2) { - lcd_putsLeft(4*FH, "\011No firmware found in the file!"); + if (memoryType == MEM_FLASH) + lcd_putsLeft(4*FH, "\011No firmware found in the file!"); + else + lcd_putsLeft(4*FH, "\011No EEPROM found in the file!"); if (event == EVT_KEY_FIRST(BOOT_KEY_EXIT) || event == EVT_KEY_FIRST(BOOT_KEY_MENU)) { return 0; } @@ -380,12 +404,8 @@ int menuFlashFile(uint32_t index, uint8_t event) } if (event == EVT_KEY_LONG(BOOT_KEY_MENU)) { - fr = openFirmwareFile(index); - FirmwareSize = FileSize[index]; - if (fr != FR_OK) { - return 0; // File open error - } - return 1; + fr = openBinaryFile(index); + return (fr == FR_OK && isValidBufferStart(Block_buffer)); } else if (event == EVT_KEY_FIRST(BOOT_KEY_EXIT)) { return 0; @@ -398,6 +418,27 @@ extern Key keys[]; 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); +} + int main() { uint8_t index = 0; @@ -410,9 +451,6 @@ int main() uint32_t nameCount = 0; uint32_t vpos = 0; uint32_t hpos = 0; - uint32_t firmwareAddress = FIRMWARE_ADDRESS; - uint32_t firmwareWritten = 0; - uint32_t memoryType; #if defined(PCBTARANIS) wdt_reset(); @@ -459,13 +497,6 @@ int main() init_spi(); #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) LockBits = readLockBits(); if (LockBits) { @@ -553,15 +584,12 @@ int main() if (state == ST_FLASH_MENU || state == ST_RESTORE_MENU) { sdInit(); - state == ST_RESTORE_MENU ? memoryType = MEM_EEPROM : memoryType = MEM_FLASH; + memoryType = (state == ST_RESTORE_MENU ? MEM_EEPROM : MEM_FLASH); state = ST_DIR_CHECK; } else if (state == ST_DIR_CHECK) { - if (memoryType == MEM_FLASH) - fr = f_chdir(FIRMWARES_PATH); - else - fr = f_chdir(EEPROMS_PATH); + fr = f_chdir(getBinaryPath()); if (fr == FR_OK) { state = ST_OPEN_DIR; } @@ -587,13 +615,12 @@ 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; - } + vpos = 0; + state = ST_START; + } } if (state == ST_FILE_LIST) { @@ -658,10 +685,7 @@ int main() #endif else if (event == EVT_KEY_BREAK(BOOT_KEY_MENU)) { // Select file to flash - if (memoryType == MEM_FLASH) - state = ST_FLASH_CHECK; - else - state = ST_EEPROM_CHECK; + state = ST_FLASH_CHECK; Valid = 0; } else if (event == EVT_KEY_FIRST(BOOT_KEY_EXIT)) { @@ -683,46 +707,42 @@ int main() // confirmed firmwareAddress = FIRMWARE_ADDRESS + BOOTLOADER_SIZE; firmwareWritten = 0; + eepromAddress = 0; + eepromWritten = 0; state = ST_FLASHING; } } if (state == ST_FLASHING) { - // Commit to flashing - uint32_t blockOffset = 0; + // commit to flashing lcd_putsLeft(4*FH, "\032Writing..."); - if (firmwareAddress == FIRMWARE_ADDRESS + BOOTLOADER_SIZE) { - if (!isFirmwareStart(Block_buffer)) { - state = ST_FLASH_DONE; - } + int progress; + if (memoryType == MEM_FLASH) { + writeFlashBlock(); + firmwareWritten += sizeof(Block_buffer); + progress = (200*firmwareWritten) / FirmwareSize; } - - 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; - } + else { + writeEepromBlock(); + eepromWritten += sizeof(Block_buffer); + progress = (200*eepromWritten) / EESIZE; } - firmwareWritten += 4; // 4K blocks - lcd_rect( 3, 6*FH+4, 204, 7); - lcd_hline(5, 6*FH+6, (200*firmwareWritten*1024)/FirmwareSize, FORCE); - lcd_hline(5, 6*FH+7, (200*firmwareWritten*1024)/FirmwareSize, FORCE); - lcd_hline(5, 6*FH+8, (200*firmwareWritten*1024)/FirmwareSize, FORCE); + lcd_hline(5, 6*FH+6, progress, FORCE); + lcd_hline(5, 6*FH+7, progress, FORCE); + lcd_hline(5, 6*FH+8, progress, FORCE); fr = f_read(&FlashFile, (BYTE *)Block_buffer, sizeof(Block_buffer), &BlockCount); if (BlockCount == 0) { - state = ST_FLASH_DONE; + state = ST_FLASH_DONE; // EOF } - if (firmwareWritten >= FlashSize - 32) { - state = ST_FLASH_DONE; // Backstop + if (firmwareWritten >= FLASHSIZE - BOOTLOADER_SIZE) { + state = ST_FLASH_DONE; // Backstop + } + if (eepromWritten >= EESIZE) { + state = ST_FLASH_DONE; // Backstop } } diff --git a/radio/src/eeprom_rlc.h b/radio/src/eeprom_rlc.h index 969670e97..b30b4077e 100644 --- a/radio/src/eeprom_rlc.h +++ b/radio/src/eeprom_rlc.h @@ -247,4 +247,13 @@ void loadGeneralSettings(); void loadModel(int index); #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 diff --git a/radio/src/targets/taranis/board_taranis.h b/radio/src/targets/taranis/board_taranis.h index 9c97cc5da..06b592c2a 100644 --- a/radio/src/targets/taranis/board_taranis.h +++ b/radio/src/targets/taranis/board_taranis.h @@ -145,8 +145,8 @@ void delay_01us(uint16_t nb); #define FLASH_PAGESIZE 256 void unlockFlash(); void writeFlash(uint32_t * address, uint32_t * buffer); -uint32_t isFirmwareStart(uint32_t *block); -uint32_t isBootloaderStart(uint32_t *block); +uint32_t isFirmwareStart(const uint32_t *block); +uint32_t isBootloaderStart(const uint32_t *block); // Pulses driver void init_no_pulses(uint32_t port); diff --git a/radio/src/targets/taranis/flash_driver.cpp b/radio/src/targets/taranis/flash_driver.cpp index 7e5be65ba..001b8e903 100644 --- a/radio/src/targets/taranis/flash_driver.cpp +++ b/radio/src/targets/taranis/flash_driver.cpp @@ -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) { return 0; @@ -112,7 +112,7 @@ uint32_t isFirmwareStart(uint32_t *block) return 1; } -uint32_t isBootloaderStart(uint32_t *block) +uint32_t isBootloaderStart(const uint32_t *block) { for (int i=0; i<256; i++) { if (block[i] == 0x544F4F42/*BOOT*/) { diff --git a/radio/src/targets/taranis/usbd_storage_msd.cpp b/radio/src/targets/taranis/usbd_storage_msd.cpp index 73d7b4887..042538b49 100644 --- a/radio/src/targets/taranis/usbd_storage_msd.cpp +++ b/radio/src/targets/taranis/usbd_storage_msd.cpp @@ -724,8 +724,7 @@ int32_t fat12Write(const uint8_t *buffer, uint16_t sector, uint32_t count ) } else if (sector < 3 + (EESIZE/BLOCKSIZE)) { while (count) { - const EeFs * test = (const EeFs *)buffer; - if (offset == 0 && test->version==EEFS_VERS && test->mySize==sizeof(eeFs) && test->bs==BS) { + if (offset == 0 && isEepromStart(buffer)) { TRACE("EEPROM start found in sector %d", sector); offset = sector; } From 6a3a245ed864d24fe15fb2776011c5f3560e7b2d Mon Sep 17 00:00:00 2001 From: bsongis Date: Wed, 9 Apr 2014 11:58:01 +0200 Subject: [PATCH 04/12] Compilation failure (Companion) --- radio/src/simpgmspace.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/simpgmspace.cpp b/radio/src/simpgmspace.cpp index 0d4b2eb3d..68917c791 100644 --- a/radio/src/simpgmspace.cpp +++ b/radio/src/simpgmspace.cpp @@ -674,6 +674,6 @@ FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG) { return RESET; } ErrorStatus RTC_WaitForSynchro(void) { return SUCCESS; } void unlockFlash() { } 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 From 498272bfd2d09f5902b092125ec2ee0bb971d3e7 Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Wed, 9 Apr 2014 12:14:02 +0200 Subject: [PATCH 05/12] Navigation --- radio/src/bootloader/boot.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/bootloader/boot.cpp b/radio/src/bootloader/boot.cpp index 60cd35a97..0eabd0654 100644 --- a/radio/src/bootloader/boot.cpp +++ b/radio/src/bootloader/boot.cpp @@ -397,7 +397,7 @@ int menuFlashFile(uint32_t index, uint8_t event) lcd_putsLeft(4*FH, "\011No firmware found in the file!"); else lcd_putsLeft(4*FH, "\011No EEPROM found in the file!"); - 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)) { return 0; } return -1; From de9e2a50bc6af6f20945ac9d5921b5f0677112fd Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 9 Apr 2014 13:27:28 +0200 Subject: [PATCH 06/12] Update boot.cpp --- radio/src/bootloader/boot.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/bootloader/boot.cpp b/radio/src/bootloader/boot.cpp index 0eabd0654..0446232b8 100644 --- a/radio/src/bootloader/boot.cpp +++ b/radio/src/bootloader/boot.cpp @@ -360,7 +360,7 @@ const char *getBinaryPath() FRESULT openBinaryFile(uint32_t index) { TCHAR filename[60]; - cpystr(cpystr(cpystr((uint8_t *)filename, (uint8_t *)getBinaryPath), (uint8_t *)"/"), (uint8_t *)Filenames[index]); + cpystr(cpystr(cpystr((uint8_t *)filename, (uint8_t *)getBinaryPath()), (uint8_t *)"/"), (uint8_t *)Filenames[index]); f_open(&FlashFile, filename, FA_READ); if (memoryType == MEM_FLASH) f_lseek(&FlashFile, BOOTLOADER_SIZE); From ff2eb36887a154ace747771fb5ea58a7dc760663 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 9 Apr 2014 13:30:15 +0200 Subject: [PATCH 07/12] Update boot.cpp --- radio/src/bootloader/boot.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/bootloader/boot.cpp b/radio/src/bootloader/boot.cpp index 0446232b8..b660f0794 100644 --- a/radio/src/bootloader/boot.cpp +++ b/radio/src/bootloader/boot.cpp @@ -278,7 +278,7 @@ void hw_delay(uint16_t time) } #endif -uint8_t *cpystr(uint8_t *dest, uint8_t *source) +char * cpystr(char * dest, const char * source) { while ((*dest++ = *source++)) ; @@ -297,7 +297,7 @@ FRESULT readBinDir(DIR *dj, FILINFO *fno) break; } if (*fno->lfname == 0) { - cpystr((uint8_t *) fno->lfname, (uint8_t *) fno->fname); // Copy 8.3 name + cpystr(fno->lfname, fno->fname); // Copy 8.3 name } int32_t len = strlen(fno->lfname) - 4; if (len < 0) { @@ -360,7 +360,7 @@ const char *getBinaryPath() FRESULT openBinaryFile(uint32_t index) { TCHAR filename[60]; - cpystr(cpystr(cpystr((uint8_t *)filename, (uint8_t *)getBinaryPath()), (uint8_t *)"/"), (uint8_t *)Filenames[index]); + cpystr(cpystr(cpystr(filename, getBinaryPath()), "/"), Filenames[index]); f_open(&FlashFile, filename, FA_READ); if (memoryType == MEM_FLASH) f_lseek(&FlashFile, BOOTLOADER_SIZE); From bef65d304bdc6e2360a5f9ccb2cb2b3684d03877 Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Wed, 9 Apr 2014 13:54:20 +0200 Subject: [PATCH 08/12] Don't always rewrite the same block... --- radio/src/bootloader/boot.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/bootloader/boot.cpp b/radio/src/bootloader/boot.cpp index b660f0794..e3e887cae 100644 --- a/radio/src/bootloader/boot.cpp +++ b/radio/src/bootloader/boot.cpp @@ -437,6 +437,7 @@ void writeFlashBlock() void writeEepromBlock() { eeWriteBlockCmp((uint8_t *)Block_buffer, eepromAddress, BlockCount); + eepromAddress += BlockCount; } int main() From f3f7fc31b4fca9fa071874eefc9c9743ecb8577c Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Wed, 9 Apr 2014 14:12:46 +0200 Subject: [PATCH 09/12] Reordering to force a display refresh --- radio/src/bootloader/boot.cpp | 38 +++++++++++++++++------------------ 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/radio/src/bootloader/boot.cpp b/radio/src/bootloader/boot.cpp index e3e887cae..037133cec 100644 --- a/radio/src/bootloader/boot.cpp +++ b/radio/src/bootloader/boot.cpp @@ -697,23 +697,6 @@ int main() lcd_invert_line(2 + vpos); } - else if (state == ST_FLASH_CHECK) { - int result = menuFlashFile(vpos, event); - FirmwareSize = FileSize[vpos] - BOOTLOADER_SIZE; - if (result == 0) { - // canceled - state = ST_FILE_LIST; - } - else if (result == 1) { - // confirmed - firmwareAddress = FIRMWARE_ADDRESS + BOOTLOADER_SIZE; - firmwareWritten = 0; - eepromAddress = 0; - eepromWritten = 0; - state = ST_FLASHING; - } - } - if (state == ST_FLASHING) { // commit to flashing lcd_putsLeft(4*FH, "\032Writing..."); @@ -746,8 +729,25 @@ int main() state = ST_FLASH_DONE; // Backstop } } - - if (state == ST_FLASH_DONE) { + + if (state == ST_FLASH_CHECK) { + int result = menuFlashFile(vpos, event); + FirmwareSize = FileSize[vpos] - BOOTLOADER_SIZE; + if (result == 0) { + // canceled + state = ST_FILE_LIST; + } + else if (result == 1) { + // confirmed + firmwareAddress = FIRMWARE_ADDRESS + BOOTLOADER_SIZE; + firmwareWritten = 0; + eepromAddress = 0; + eepromWritten = 0; + state = ST_FLASHING; + } + } + + if (state == ST_FLASH_DONE) { lcd_putsLeft(4*FH, "\024Writing Complete"); if (event == EVT_KEY_FIRST(BOOT_KEY_EXIT) || event == EVT_KEY_BREAK(BOOT_KEY_MENU)) { state = ST_START; From 7540768c1f7ad6b74865a89b5c3f047cc3045dab Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Wed, 9 Apr 2014 14:54:02 +0200 Subject: [PATCH 10/12] Invalid file now reported correctly --- radio/src/bootloader/boot.cpp | 46 +++++++++++++++++------------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/radio/src/bootloader/boot.cpp b/radio/src/bootloader/boot.cpp index 037133cec..aa2356266 100644 --- a/radio/src/bootloader/boot.cpp +++ b/radio/src/bootloader/boot.cpp @@ -379,7 +379,7 @@ int menuFlashFile(uint32_t index, uint8_t event) { FRESULT fr; - lcd_putsLeft(4*FH, "\012Hold [ENT] to start loading" ); + lcd_putsLeft(4*FH, "\012Hold [ENT] to start writing"); if (Valid == 0) { // Validate file here @@ -394,9 +394,9 @@ int menuFlashFile(uint32_t index, uint8_t event) if (Valid == 2) { if (memoryType == MEM_FLASH) - lcd_putsLeft(4*FH, "\011No firmware found in the file!"); + lcd_putsLeft(4*FH, "\011Not a valid firmware file! "); else - lcd_putsLeft(4*FH, "\011No EEPROM found in the file!"); + 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; } @@ -697,7 +697,24 @@ int main() lcd_invert_line(2 + vpos); } - if (state == ST_FLASHING) { + else if (state == ST_FLASH_CHECK) { + int result = menuFlashFile(vpos, event); + FirmwareSize = FileSize[vpos] - BOOTLOADER_SIZE; + if (result == 0) { + // canceled + state = ST_FILE_LIST; + } + else if (result == 1) { + // confirmed + firmwareAddress = FIRMWARE_ADDRESS + BOOTLOADER_SIZE; + firmwareWritten = 0; + eepromAddress = 0; + eepromWritten = 0; + state = ST_FLASHING; + } + } + + else if (state == ST_FLASHING) { // commit to flashing lcd_putsLeft(4*FH, "\032Writing..."); @@ -729,25 +746,8 @@ int main() state = ST_FLASH_DONE; // Backstop } } - - if (state == ST_FLASH_CHECK) { - int result = menuFlashFile(vpos, event); - FirmwareSize = FileSize[vpos] - BOOTLOADER_SIZE; - if (result == 0) { - // canceled - state = ST_FILE_LIST; - } - else if (result == 1) { - // confirmed - firmwareAddress = FIRMWARE_ADDRESS + BOOTLOADER_SIZE; - firmwareWritten = 0; - eepromAddress = 0; - eepromWritten = 0; - state = ST_FLASHING; - } - } - - if (state == ST_FLASH_DONE) { + + if (state == ST_FLASH_DONE) { lcd_putsLeft(4*FH, "\024Writing Complete"); if (event == EVT_KEY_FIRST(BOOT_KEY_EXIT) || event == EVT_KEY_BREAK(BOOT_KEY_MENU)) { state = ST_START; From d1f45951fc8dc2fef38621fa96063c75c586b713 Mon Sep 17 00:00:00 2001 From: bsongis Date: Wed, 9 Apr 2014 17:28:54 +0200 Subject: [PATCH 11/12] Whole EEPROM Backup --- radio/src/.gitignore | 1 + radio/src/Makefile | 2 +- radio/src/bootloader/Makefile | 1 + radio/src/bootloader/boot.cpp | 45 +++----------- radio/src/gui/menu_general.cpp | 59 +++++++++++++++++++ radio/src/lcd.h | 4 +- radio/src/logs.cpp | 23 ++------ radio/src/sdcard.h | 1 + radio/src/strhelpers.cpp | 56 ++++++++++++++++++ .../src/targets/taranis/usbd_storage_msd.cpp | 2 +- 10 files changed, 136 insertions(+), 58 deletions(-) create mode 100755 radio/src/strhelpers.cpp diff --git a/radio/src/.gitignore b/radio/src/.gitignore index 5bf38bf1f..e2ec3ddcd 100644 --- a/radio/src/.gitignore +++ b/radio/src/.gitignore @@ -20,3 +20,4 @@ /traces /MODELS /FIRMWARES +/EEPROMS diff --git a/radio/src/Makefile b/radio/src/Makefile index 056f04db0..110f03c04 100644 --- a/radio/src/Makefile +++ b/radio/src/Makefile @@ -949,7 +949,7 @@ endif ifeq ($(SDCARD), YES) CPPDEFS += -DSDCARD - CPPSRC += logs.cpp + CPPSRC += logs.cpp strhelpers.cpp endif RUN_FROM_FLASH = 1 diff --git a/radio/src/bootloader/Makefile b/radio/src/bootloader/Makefile index 0e178100f..1e5fa0730 100644 --- a/radio/src/bootloader/Makefile +++ b/radio/src/bootloader/Makefile @@ -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 diff --git a/radio/src/bootloader/boot.cpp b/radio/src/bootloader/boot.cpp index aa2356266..f5906bf55 100644 --- a/radio/src/bootloader/boot.cpp +++ b/radio/src/bootloader/boot.cpp @@ -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; diff --git a/radio/src/gui/menu_general.cpp b/radio/src/gui/menu_general.cpp index 329e59870..6e90a8ec3 100644 --- a/radio/src/gui/menu_general.cpp +++ b/radio/src/gui/menu_general.cpp @@ -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 + +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 diff --git a/radio/src/targets/taranis/usbd_storage_msd.cpp b/radio/src/targets/taranis/usbd_storage_msd.cpp index 042538b49..81b073ee0 100644 --- a/radio/src/targets/taranis/usbd_storage_msd.cpp +++ b/radio/src/targets/taranis/usbd_storage_msd.cpp @@ -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; From 471794a1dc8ec25b8808be84f335d6431ef2cede Mon Sep 17 00:00:00 2001 From: bsongis Date: Wed, 9 Apr 2014 17:49:56 +0200 Subject: [PATCH 12/12] Missing file --- companion/src/firmwares/opentx/opentxTaranisSimulator.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/companion/src/firmwares/opentx/opentxTaranisSimulator.cpp b/companion/src/firmwares/opentx/opentxTaranisSimulator.cpp index ed934036a..dfe271830 100644 --- a/companion/src/firmwares/opentx/opentxTaranisSimulator.cpp +++ b/companion/src/firmwares/opentx/opentxTaranisSimulator.cpp @@ -93,6 +93,7 @@ inline int geteepromsize() { #include "radio/src/gui/view_text.cpp" #include "radio/src/gui/view_about.cpp" #include "radio/src/lcd.cpp" +#include "radio/src/strhelpers.cpp" #include "radio/src/logs.cpp" #include "radio/src/rtc.cpp" #include "radio/src/targets/taranis/keys_driver.cpp"