From d3c2fe6fc5a59f8d9c6bd549c936b5b99fdad82c Mon Sep 17 00:00:00 2001 From: armink Date: Thu, 24 May 2018 22:38:48 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E5=A2=9E=E5=8A=A0=E3=80=91=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=9B=B4=E6=96=B0=20ENV=20=E7=9A=84=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E3=80=82=E5=BD=93=E5=9B=BA=E4=BB=B6=E5=8D=87=E7=BA=A7=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E5=8F=AF=E4=BB=A5=E5=9C=A8=E5=8E=9F=E4=BA=A7=E5=93=81?= =?UTF-8?q?=E4=B8=8A=E8=87=AA=E5=8A=A8=E8=BF=BD=E5=8A=A0=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E7=9A=84=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: armink --- easyflash/inc/easyflash.h | 11 ++++++- easyflash/inc/ef_cfg.h | 12 ++++++- easyflash/src/ef_env.c | 67 ++++++++++++++++++++++++++++++++++++--- easyflash/src/ef_env_wl.c | 67 +++++++++++++++++++++++++++++++++++---- 4 files changed, 144 insertions(+), 13 deletions(-) diff --git a/easyflash/inc/easyflash.h b/easyflash/inc/easyflash.h index 1f3fcdc..ddc9fd7 100644 --- a/easyflash/inc/easyflash.h +++ b/easyflash/inc/easyflash.h @@ -66,8 +66,17 @@ if (!(EXPR)) \ EF_DEBUG("(%s) has assert failed at %s.\n", #EXPR, __FUNCTION__); \ while (1); \ } + +/** + * ENV version number defined by user. + * Please change it when your firmware add a new ENV to default_env_set. + */ +#ifndef EF_ENV_VER_NUM +#define EF_ENV_VER_NUM 0 +#endif + /* EasyFlash software version number */ -#define EF_SW_VERSION "3.0.4" +#define EF_SW_VERSION "3.1.0" typedef struct _ef_env{ char *key; diff --git a/easyflash/inc/ef_cfg.h b/easyflash/inc/ef_cfg.h index 5692da2..b327ec4 100644 --- a/easyflash/inc/ef_cfg.h +++ b/easyflash/inc/ef_cfg.h @@ -37,8 +37,18 @@ /* using power fail safeguard mode for ENV */ /* #define EF_ENV_USING_PFS_MODE */ +#ifdef EF_USING_ENV +/* Auto update ENV to latest default when current ENV version number is changed. */ +/* #define EF_ENV_AUTO_UPDATE */ +/** + * ENV version number defined by user. + * Please change it when your firmware add a new ENV to default_env_set. + */ +#define EF_ENV_VER_NUM /* @note you must define it for a value, such as 0 */ +#endif /* EF_USING_ENV */ + /* using IAP function */ -#define EF_USING_IAP +/* #define EF_USING_IAP */ /* using save log function */ /* #define EF_USING_LOG */ diff --git a/easyflash/src/ef_env.c b/easyflash/src/ef_env.c index a554c08..5a51eac 100644 --- a/easyflash/src/ef_env.c +++ b/easyflash/src/ef_env.c @@ -56,6 +56,11 @@ enum { ENV_PARAM_INDEX_SAVED_COUNT, #endif +#ifdef EF_ENV_AUTO_UPDATE + /* current version number for ENV */ + ENV_PARAM_INDEX_VER_NUM, +#endif + /* data section CRC32 code index in system section */ ENV_PARAM_INDEX_DATA_CRC, /* flash ENV parameters word size */ @@ -96,6 +101,7 @@ static size_t get_env_user_used_size(void); static EfErrCode create_env(const char *key, const char *value); static uint32_t calc_env_crc(void); static bool env_crc_is_ok(void); +static EfErrCode env_auto_update(void); /** * Flash ENV initialize. @@ -145,10 +151,17 @@ EfErrCode ef_env_init(ef_env const *default_env, size_t default_env_size) { result = ef_load_env(); +#ifdef EF_ENV_AUTO_UPDATE + if (result == EF_NO_ERR) { + env_auto_update(); + } +#endif + if (result == EF_NO_ERR) { init_ok = true; } + return result; } @@ -158,6 +171,8 @@ EfErrCode ef_env_init(ef_env const *default_env, size_t default_env_size) { * @return result */ EfErrCode ef_env_set_default(void){ + extern EfErrCode ef_env_ver_num_set_default(void); + EfErrCode result = EF_NO_ERR; size_t i; @@ -175,6 +190,11 @@ EfErrCode ef_env_set_default(void){ env_cache[ENV_PARAM_INDEX_SAVED_COUNT] = 0; #endif +#ifdef EF_ENV_AUTO_UPDATE + /* initialize version number */ + env_cache[ENV_PARAM_INDEX_VER_NUM] = EF_ENV_VER_NUM; +#endif + /* create default ENV */ for (i = 0; i < default_env_set_size; i++) { create_env(default_env_set[i].key, default_env_set[i].value); @@ -193,7 +213,6 @@ EfErrCode ef_env_set_default(void){ } #endif - return result; } @@ -562,12 +581,17 @@ void ef_print_env(void) { } #ifndef EF_ENV_USING_PFS_MODE - ef_print("\nENV size: %ld/%ld bytes.\n", get_env_user_used_size(), ENV_USER_SETTING_SIZE); + ef_print("\nmode: normal\n"); + ef_print("size: %ld/%ld bytes.\n", get_env_user_used_size(), ENV_USER_SETTING_SIZE); #else - ef_print("\nENV size: %ld/%ld bytes, write bytes %ld/%ld, saved count: %ld, mode: power fail safeguard.\n", - get_env_user_used_size(), ENV_USER_SETTING_SIZE, ef_get_env_write_bytes(), - ENV_AREA_SIZE, env_cache[ENV_PARAM_INDEX_SAVED_COUNT]); + ef_print("\nmode: power fail safeguard\n"); + ef_print("size: %ld/%ld bytes, write bytes %ld/%ld.\n", get_env_user_used_size(), + ENV_USER_SETTING_SIZE, ef_get_env_write_bytes(), ENV_AREA_SIZE); + ef_print("saved count: %ld\n", env_cache[ENV_PARAM_INDEX_SAVED_COUNT]); +#endif +#ifdef EF_ENV_AUTO_UPDATE + ef_print("ver num: %d\n", env_cache[ENV_PARAM_INDEX_VER_NUM]); #endif } @@ -804,6 +828,39 @@ EfErrCode ef_set_and_save_env(const char *key, const char *value) { return result; } +#ifdef EF_ENV_AUTO_UPDATE +/** + * Auto update ENV to latest default when current EF_ENV_VER is changed. + * + * @return result + */ +static EfErrCode env_auto_update(void) +{ + size_t i; + + /* lock the ENV cache */ + ef_port_env_lock(); + + /* check version number */ + if (env_cache[ENV_PARAM_INDEX_VER_NUM] != EF_ENV_VER_NUM) { + env_cache_changed = true; + /* update version number */ + env_cache[ENV_PARAM_INDEX_VER_NUM] = EF_ENV_VER_NUM; + /* add a new ENV when it's not found */ + for (i = 0; i < default_env_set_size; i++) { + if (find_env(default_env_set[i].key) == NULL) { + create_env(default_env_set[i].key, default_env_set[i].value); + } + } + } + + /* unlock the ENV cache */ + ef_port_env_unlock(); + + return ef_save_env(); +} +#endif /* EF_ENV_AUTO_UPDATE */ + #endif /* EF_ENV_USING_WL_MODE */ #endif /* EF_USING_ENV */ diff --git a/easyflash/src/ef_env_wl.c b/easyflash/src/ef_env_wl.c index 4640a3d..7533cf1 100644 --- a/easyflash/src/ef_env_wl.c +++ b/easyflash/src/ef_env_wl.c @@ -63,6 +63,11 @@ enum { ENV_PARAM_PART_INDEX_SAVED_COUNT, #endif +#ifdef EF_ENV_AUTO_UPDATE + /* current version number for ENV */ + ENV_PARAM_INDEX_VER_NUM, +#endif + /* data section CRC32 code index */ ENV_PARAM_PART_INDEX_DATA_CRC, /* ENV parameters part word size */ @@ -108,6 +113,7 @@ static EfErrCode del_env(const char *key); static EfErrCode save_cur_using_data_addr(uint32_t cur_data_addr); static uint32_t calc_env_crc(void); static bool env_crc_is_ok(void); +static EfErrCode env_auto_update(void); /** * Flash ENV initialize. @@ -149,6 +155,12 @@ EfErrCode ef_env_init(ef_env const *default_env, size_t default_env_size) { result = ef_load_env(); +#ifdef EF_ENV_AUTO_UPDATE + if (result == EF_NO_ERR) { + env_auto_update(); + } +#endif + if (result == EF_NO_ERR) { init_ok = true; } @@ -179,6 +191,11 @@ EfErrCode ef_env_set_default(void){ env_cache[ENV_PARAM_PART_INDEX_SAVED_COUNT] = 0; #endif +#ifdef EF_ENV_AUTO_UPDATE + /* initialize version number */ + env_cache[ENV_PARAM_INDEX_VER_NUM] = EF_ENV_VER_NUM; +#endif + /* create default ENV */ for (i = 0; i < default_env_set_size; i++) { create_env(default_env_set[i].key, default_env_set[i].value); @@ -579,13 +596,18 @@ void ef_print_env(void) { } #ifndef EF_ENV_USING_PFS_MODE - ef_print("\nENV size: %ld/%ld bytes, write bytes %ld/%ld, mode: wear leveling.\n", - get_env_user_used_size(), ENV_USER_SETTING_SIZE, ef_get_env_write_bytes(), - ENV_AREA_SIZE); + ef_print("\nmode: wear leveling\n"); + ef_print("size: %ld/%ld bytes, write bytes %ld/%ld.\n", get_env_user_used_size(), ENV_USER_SETTING_SIZE, + ef_get_env_write_bytes(), ENV_AREA_SIZE); #else - ef_print("\nENV size: %ld/%ld bytes, write bytes %ld/%ld, saved count: %ld, mode: wear leveling and power fail safeguard.\n", - get_env_user_used_size(), ENV_USER_SETTING_SIZE, ef_get_env_write_bytes(), - ENV_AREA_SIZE/2, env_cache[ENV_PARAM_PART_INDEX_SAVED_COUNT]); + ef_print("\nmode: wear leveling and power fail safeguard\n"); + ef_print("size: %ld/%ld bytes, write bytes %ld/%ld.\n", get_env_user_used_size(), ENV_USER_SETTING_SIZE, + ef_get_env_write_bytes(), ENV_AREA_SIZE / 2); + ef_print("saved count: %ld\n", env_cache[ENV_PARAM_PART_INDEX_SAVED_COUNT]); +#endif + +#ifdef EF_ENV_AUTO_UPDATE + ef_print("ver num: %d\n", env_cache[ENV_PARAM_INDEX_VER_NUM]); #endif } @@ -967,6 +989,39 @@ EfErrCode ef_set_and_save_env(const char *key, const char *value) { return result; } +#ifdef EF_ENV_AUTO_UPDATE +/** + * Auto update ENV to latest default when current EF_ENV_VER is changed. + * + * @return result + */ +static EfErrCode env_auto_update(void) +{ + size_t i; + + /* lock the ENV cache */ + ef_port_env_lock(); + + /* check version number */ + if (env_cache[ENV_PARAM_INDEX_VER_NUM] != EF_ENV_VER_NUM) { + env_cache_changed = true; + /* update version number */ + env_cache[ENV_PARAM_INDEX_VER_NUM] = EF_ENV_VER_NUM; + /* add a new ENV when it's not found */ + for (i = 0; i < default_env_set_size; i++) { + if (find_env(default_env_set[i].key) == NULL) { + create_env(default_env_set[i].key, default_env_set[i].value); + } + } + } + + /* unlock the ENV cache */ + ef_port_env_unlock(); + + return ef_save_env(); +} +#endif /* EF_ENV_AUTO_UPDATE */ + #endif /* EF_ENV_USING_WL_MODE */ #endif /* EF_USING_ENV */