1
0
Fork 0
mirror of https://github.com/EdgeTX/edgetx.git synced 2025-07-26 09:45:16 +03:00

EEPROM on Sky9x

This commit is contained in:
Bertrand Songis 2015-04-14 08:57:25 +02:00 committed by bsongis
parent c6cf0f915e
commit 1964ac207c
14 changed files with 476 additions and 571 deletions

View file

@ -81,3 +81,29 @@ void eeLoadModelHeaders()
} }
} }
#endif #endif
void eeReadAll()
{
// TODO merge eepromOpen and eepromCheck
if (!eepromOpen() || eepromCheck() < 0 || !eeLoadGeneral()) {
eeErase(true);
}
else {
eeLoadModelHeaders();
}
stickMode = g_eeGeneral.stickMode;
#if defined(CPUARM)
for (uint8_t i=0; languagePacks[i]!=NULL; i++) {
if (!strncmp(g_eeGeneral.ttsLanguage, languagePacks[i]->id, 2)) {
currentLanguagePackIdx = i;
currentLanguagePack = languagePacks[i];
}
}
#endif
#if !defined(CPUARM)
eeLoadModel(g_eeGeneral.currModel);
#endif
}

View file

@ -55,7 +55,6 @@ void eeDirty(uint8_t msk);
void eeCheck(bool immediately); void eeCheck(bool immediately);
void eeReadAll(); void eeReadAll();
bool eeModelExists(uint8_t id); bool eeModelExists(uint8_t id);
void eeLoadModelName(uint8_t id, char *name);
void eeLoadModel(uint8_t id); void eeLoadModel(uint8_t id);
bool eeConvert(); bool eeConvert();
void eeErase(bool warn); void eeErase(bool warn);

File diff suppressed because it is too large Load diff

View file

@ -40,69 +40,48 @@
#include <inttypes.h> #include <inttypes.h>
#include <stdint.h> #include <stdint.h>
// States in Eeprom32_process_state bool eeLoadGeneral( void ) ;
#define E32_IDLE 1 void eeDeleteModel( uint8_t id ) ;
#define E32_ERASESENDING 2 bool eeCopyModel(uint8_t dst, uint8_t src);
#define E32_ERASEWAITING 3 void eeSwapModels(uint8_t id1, uint8_t id2);
#define E32_WRITESENDING 4
#define E32_WRITEWAITING 5
#define E32_READSENDING 6
#define E32_READWAITING 7
#define E32_BLANKCHECK 8
#define E32_WRITESTART 9
extern uint8_t Eeprom32_process_state ;
extern uint8_t *Eeprom32_source_address ;
extern uint8_t Eeprom32_file_index ;
extern uint32_t Eeprom32_data_size ;
extern void end_spi(); // TODO not public
extern void ee32_process( void ) ;
extern bool eeLoadGeneral( void ) ;
extern void eeWaitFinished();
extern void eeDeleteModel( uint8_t id ) ;
extern bool eeModelExists(uint8_t id) ;
extern bool eeCopyModel(uint8_t dst, uint8_t src);
extern void eeSwapModels(uint8_t id1, uint8_t id2);
#define DISPLAY_PROGRESS_BAR(x) #define DISPLAY_PROGRESS_BAR(x)
struct t_file_entry
{
uint32_t block_no ;
uint32_t sequence_no ;
uint16_t size ;
uint8_t flags ;
} ;
struct t_eeprom_header
{
uint32_t sequence_no ; // sequence # to decide which block is most recent
uint16_t data_size ; // # bytes in data area
uint8_t flags ;
uint8_t hcsum ;
};
extern struct t_file_entry File_system[] ;
extern EEGeneral g_eeGeneral;
extern ModelData g_model;
extern uint8_t Spi_tx_buf[] ;
extern uint8_t Spi_rx_buf[] ;
void eeprom_write_enable();
uint32_t eeprom_read_status();
void read32_eeprom_data(uint32_t eeAddress, register uint8_t *buffer, uint32_t size);
uint32_t spi_PDC_action( register uint8_t *command, register uint8_t *tx, register uint8_t *rx, register uint32_t comlen, register uint32_t count );
#if defined(SDCARD) #if defined(SDCARD)
const pm_char * eeBackupModel(uint8_t i_fileSrc); const pm_char * eeBackupModel(uint8_t i_fileSrc);
const pm_char * eeRestoreModel(uint8_t i_fileDst, char *model_name); const pm_char * eeRestoreModel(uint8_t i_fileDst, char *model_name);
#endif #endif
void loadGeneralSettings(); uint32_t loadGeneralSettings();
void loadModel(int index); uint32_t loadModel(uint32_t index);
enum EepromWriteState {
EEPROM_IDLE = 0,
EEPROM_START_WRITE,
EEPROM_ERASING_FILE_BLOCK1,
EEPROM_ERASING_FILE_BLOCK1_WAIT,
EEPROM_ERASE_FILE_BLOCK2,
EEPROM_ERASING_FILE_BLOCK2,
EEPROM_ERASING_FILE_BLOCK2_WAIT,
EEPROM_WRITE_BUFFER,
EEPROM_WRITING_BUFFER,
EEPROM_WRITING_BUFFER_WAIT,
EEPROM_WRITE_NEXT_BUFFER,
EEPROM_ERASING_FAT_BLOCK,
EEPROM_ERASING_FAT_BLOCK_WAIT,
EEPROM_WRITE_NEW_FAT,
EEPROM_WRITING_NEW_FAT,
EEPROM_WRITING_NEW_FAT_WAIT,
EEPROM_OVERWRITE_OLD_FAT,
EEPROM_OVERWRITING_OLD_FAT,
EEPROM_OVERWRITING_OLD_FAT_WAIT,
EEPROM_END_WRITE
};
extern EepromWriteState eepromWriteState;
void eepromWriteProcess();
void eepromWriteWait(EepromWriteState state = EEPROM_IDLE);
bool eepromOpen();
bool eepromCheck();
#endif #endif

View file

@ -203,7 +203,7 @@ static void EeFsFree(blkid_t blk)
EeFsFlushFreelist(); EeFsFlushFreelist();
} }
int8_t EeFsck() int8_t eepromCheck()
{ {
ENABLE_SYNC_WRITE(true); ENABLE_SYNC_WRITE(true);
@ -266,7 +266,7 @@ int8_t EeFsck()
return 0; return 0;
} }
void EeFsFormat() void eepromFormat()
{ {
ENABLE_SYNC_WRITE(true); ENABLE_SYNC_WRITE(true);
@ -288,7 +288,7 @@ void EeFsFormat()
ENABLE_SYNC_WRITE(false); ENABLE_SYNC_WRITE(false);
} }
inline bool EeFsOpen() bool eepromOpen()
{ {
eeprom_read_block((uint8_t *)&eeFs, 0, sizeof(eeFs)); eeprom_read_block((uint8_t *)&eeFs, 0, sizeof(eeFs));
@ -550,7 +550,6 @@ bool RlcFile::copy(uint8_t i_fileDst, uint8_t i_fileSrc)
} }
#if defined(SDCARD) #if defined(SDCARD)
extern FIL g_oLogFile;
const pm_char * eeBackupModel(uint8_t i_fileSrc) const pm_char * eeBackupModel(uint8_t i_fileSrc)
{ {
char *buf = reusableBuffer.modelsel.mainname; char *buf = reusableBuffer.modelsel.mainname;
@ -1025,41 +1024,12 @@ void eeErase(bool warn)
} }
MESSAGE(STR_EEPROMWARN, STR_EEPROMFORMATTING, NULL, AU_EEPROM_FORMATTING); MESSAGE(STR_EEPROMWARN, STR_EEPROMFORMATTING, NULL, AU_EEPROM_FORMATTING);
EeFsFormat(); eepromFormat();
theFile.writeRlc(FILE_GENERAL, FILE_TYP_GENERAL, (uint8_t*)&g_eeGeneral, sizeof(EEGeneral), true); theFile.writeRlc(FILE_GENERAL, FILE_TYP_GENERAL, (uint8_t*)&g_eeGeneral, sizeof(EEGeneral), true);
modelDefault(0); modelDefault(0);
theFile.writeRlc(FILE_MODEL(0), FILE_TYP_MODEL, (uint8_t*)&g_model, sizeof(g_model), true); theFile.writeRlc(FILE_MODEL(0), FILE_TYP_MODEL, (uint8_t*)&g_model, sizeof(g_model), true);
} }
// TODO merge this code with eeprom_arm.cpp one
void eeReadAll()
{
if (!EeFsOpen() ||
EeFsck() < 0 ||
!eeLoadGeneral())
{
eeErase(true);
}
else {
eeLoadModelHeaders();
}
stickMode = g_eeGeneral.stickMode;
#if defined(CPUARM)
for (uint8_t i=0; languagePacks[i]!=NULL; i++) {
if (!strncmp(g_eeGeneral.ttsLanguage, languagePacks[i]->id, 2)) {
currentLanguagePackIdx = i;
currentLanguagePack = languagePacks[i];
}
}
#endif
#if !defined(CPUARM)
eeLoadModel(g_eeGeneral.currModel);
#endif
}
void eeCheck(bool immediately) void eeCheck(bool immediately)
{ {
if (immediately) { if (immediately) {

View file

@ -116,8 +116,8 @@ extern EeFs eeFs;
#define BLOCKS_OFFSET (RESV-BS) #define BLOCKS_OFFSET (RESV-BS)
#endif #endif
int8_t EeFsck(); int8_t eepromCheck();
void EeFsFormat(); void eepromFormat();
uint16_t EeFsGetFree(); uint16_t EeFsGetFree();
#if !defined(CPUARM) #if !defined(CPUARM)
@ -247,6 +247,10 @@ void loadGeneralSettings();
void loadModel(int index); void loadModel(int index);
#endif #endif
bool eepromOpen();
void eeLoadModelName(uint8_t id, char *name);
bool eeLoadGeneral();
// For EEPROM backup/restore // For EEPROM backup/restore
#if defined(CPUARM) #if defined(CPUARM)
inline bool isEepromStart(const void * buffer) inline bool isEepromStart(const void * buffer)

View file

@ -244,10 +244,10 @@ void menuModelFlightModesAll(uint8_t event)
uint8_t att; uint8_t att;
for (uint8_t i=0; i<MAX_FLIGHT_MODES; i++) { for (uint8_t i=0; i<MAX_FLIGHT_MODES; i++) {
#if defined(CPUARM) #if defined(CPUARM)
coord_t y = MENU_HEADER_HEIGHT + 1 + (i-s_pgOfs)*FH; int8_t y = 1 + (1+i-s_pgOfs)*FH;
if (y<MENU_HEADER_HEIGHT+1 || y>(LCD_LINES-1)*FH+MENU_HEADER_HEIGHT-FH) continue; if (y<1*FH+1 || y>(LCD_LINES-1)*FH+1) continue;
#else #else
coord_t y = MENU_HEADER_HEIGHT + 1 + i*FH; uint8_t y = 1 + (i+1)*FH;
#endif #endif
att = (i==sub ? INVERS : 0); att = (i==sub ? INVERS : 0);
FlightModeData *p = flightModeAddress(i); FlightModeData *p = flightModeAddress(i);
@ -269,9 +269,9 @@ void menuModelFlightModesAll(uint8_t event)
#endif #endif
} }
if (p->fadeIn || p->fadeOut) if (p->fadeIn || p->fadeOut) {
lcd_putc(LCD_W-FW-MENUS_SCROLLBAR_WIDTH, y, (p->fadeIn && p->fadeOut) ? '*' : (p->fadeIn ? 'I' : 'O')); lcd_putc(LCD_W-FW-MENUS_SCROLLBAR_WIDTH, y, (p->fadeIn && p->fadeOut) ? '*' : (p->fadeIn ? 'I' : 'O'));
}
} }
#if defined(CPUARM) #if defined(CPUARM)

View file

@ -170,7 +170,7 @@ void displayTimers()
// Main timer // Main timer
if (g_model.timers[0].mode) { if (g_model.timers[0].mode) {
TimerState & timerState = timersStates[0]; TimerState & timerState = timersStates[0];
uint8_t att = DBLSIZE | (timerState.val<0 ? BLINK|INVERS : 0); LcdFlags att = DBLSIZE | (timerState.val<0 ? BLINK|INVERS : 0);
putsTimer(12*FW+2+10*FWNUM-4, FH*2, timerState.val, att, att); putsTimer(12*FW+2+10*FWNUM-4, FH*2, timerState.val, att, att);
uint8_t xLabel = (timerState.val >= 0 ? MAINTMR_LBL_COL : MAINTMR_LBL_COL-7); uint8_t xLabel = (timerState.val >= 0 ? MAINTMR_LBL_COL : MAINTMR_LBL_COL-7);
#if defined(CPUARM) #if defined(CPUARM)

View file

@ -83,8 +83,8 @@ void checkEeprom()
if (!usbPlugged()) { if (!usbPlugged()) {
// TODO merge these 2 branches // TODO merge these 2 branches
#if defined(PCBSKY9X) #if defined(PCBSKY9X)
if (Eeprom32_process_state != E32_IDLE) if (eepromWriteState != EEPROM_IDLE)
ee32_process(); eepromWriteProcess();
else if (TIME_TO_WRITE()) else if (TIME_TO_WRITE())
eeCheck(false); eeCheck(false);
#else #else

View file

@ -131,18 +131,18 @@
#define NUM_XPOTS 3 #define NUM_XPOTS 3
#endif #endif
#define TELEM_VALUES_MAX 32 #define TELEM_VALUES_MAX 32
#elif defined(CPUARM) #elif defined(PCBSKY9X)
#define MAX_MODELS 60 #define MAX_MODELS 60
#define NUM_CHNOUT 32 // number of real output channels CH1-CH32 #define NUM_CHNOUT 32 // number of real output channels CH1-CH32
#define MAX_FLIGHT_MODES 9 #define MAX_FLIGHT_MODES 9
#define MAX_MIXERS 60 #define MAX_MIXERS 64
#define MAX_EXPOS 32 #define MAX_EXPOS 64
#define NUM_LOGICAL_SWITCH 32 // number of custom switches #define NUM_LOGICAL_SWITCH 32 // number of custom switches
#define NUM_CFN 60 // number of functions assigned to switches #define NUM_CFN 64 // number of functions assigned to switches
#define NUM_TRAINER 16 #define NUM_TRAINER 16
#define NUM_POTS 3 #define NUM_POTS 3
#define NUM_XPOTS 0 #define NUM_XPOTS 0
#define TELEM_VALUES_MAX 16 #define TELEM_VALUES_MAX 32
#elif defined(CPUM2560) || defined(CPUM2561) #elif defined(CPUM2560) || defined(CPUM2561)
#define MAX_MODELS 30 #define MAX_MODELS 30
#define NUM_CHNOUT 16 // number of real output channels CH1-CH16 #define NUM_CHNOUT 16 // number of real output channels CH1-CH16

View file

@ -68,6 +68,7 @@
#define SPORT_FIRMWARE_EXT ".frk" #define SPORT_FIRMWARE_EXT ".frk"
extern FATFS g_FATFS_Obj; extern FATFS g_FATFS_Obj;
extern FIL g_oLogFile;
extern uint8_t logDelay; extern uint8_t logDelay;
const pm_char *openLogs(); const pm_char *openLogs();

View file

@ -275,6 +275,7 @@ uint32_t pwrCheck();
// EEPROM driver // EEPROM driver
void eepromInit(); void eepromInit();
uint32_t eepromReadStatus();
// Rotary Encoder driver // Rotary Encoder driver
void rotencInit(); void rotencInit();

View file

@ -36,7 +36,9 @@
#include "../../opentx.h" #include "../../opentx.h"
extern volatile uint32_t Spi_complete; // TODO in the driver ? volatile uint32_t Spi_complete;
uint8_t Spi_tx_buf[24] ;
uint8_t Spi_rx_buf[24] ;
uint32_t spi_PDC_action( register uint8_t *command, register uint8_t *tx, register uint8_t *rx, register uint32_t comlen, register uint32_t count ) uint32_t spi_PDC_action( register uint8_t *command, register uint8_t *tx, register uint8_t *rx, register uint32_t comlen, register uint32_t count )
{ {
@ -186,9 +188,13 @@ void eeprom_write_enable()
eeprom_write_one(6, 0); eeprom_write_one(6, 0);
} }
uint32_t eeprom_read_status() uint32_t eepromReadStatus()
{ {
#if defined(SIMU)
return 0;
#else
return eeprom_write_one(5, 1); return eeprom_write_one(5, 1);
#endif
} }
// SPI i/f to EEPROM (4Mb) // SPI i/f to EEPROM (4Mb)

View file

@ -44,7 +44,7 @@ TEST(EEPROM, 100_random_writes)
uint8_t buf[1000]; uint8_t buf[1000];
uint8_t buf2[1000]; uint8_t buf2[1000];
EeFsFormat(); eepromFormat();
for(int i=0; i<100; i++) { for(int i=0; i<100; i++) {
int size = rand()%800; int size = rand()%800;
@ -66,7 +66,7 @@ TEST(EEPROM, test2)
RlcFile f; RlcFile f;
uint8_t buf[1000]; uint8_t buf[1000];
EeFsFormat(); eepromFormat();
for(int i=0; i<1000; i++) buf[i]='6'+i%4; for(int i=0; i<1000; i++) buf[i]='6'+i%4;
@ -89,7 +89,7 @@ TEST(EEPROM, eeCheckImmediately)
// RlcFile f; // RlcFile f;
uint8_t buf[1000]; uint8_t buf[1000];
EeFsFormat(); eepromFormat();
for(int i=0; i<1000; i++) buf[i]='6'+i%4; for(int i=0; i<1000; i++) buf[i]='6'+i%4;
@ -114,7 +114,7 @@ TEST(EEPROM, copy)
uint8_t buf[1000]; uint8_t buf[1000];
EeFsFormat(); eepromFormat();
for(int i=0; i<1000; i++) buf[i]='6'+i%4; for(int i=0; i<1000; i++) buf[i]='6'+i%4;
@ -139,7 +139,7 @@ TEST(EEPROM, rm)
uint8_t buf[1000]; uint8_t buf[1000];
EeFsFormat(); eepromFormat();
for(int i=0; i<1000; i++) buf[i]='6'+i%4; for(int i=0; i<1000; i++) buf[i]='6'+i%4;