【增加】自动更新 ENV 的功能。当固件升级时,可以在原产品上自动追加新增的环境变量。

Signed-off-by: armink <armink.ztl@gmail.com>
pull/38/head
armink 8 years ago
parent 149c6f0073
commit d3c2fe6fc5

@ -66,8 +66,17 @@ if (!(EXPR)) \
EF_DEBUG("(%s) has assert failed at %s.\n", #EXPR, __FUNCTION__); \ EF_DEBUG("(%s) has assert failed at %s.\n", #EXPR, __FUNCTION__); \
while (1); \ 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 */ /* EasyFlash software version number */
#define EF_SW_VERSION "3.0.4" #define EF_SW_VERSION "3.1.0"
typedef struct _ef_env{ typedef struct _ef_env{
char *key; char *key;

@ -37,8 +37,18 @@
/* using power fail safeguard mode for ENV */ /* using power fail safeguard mode for ENV */
/* #define EF_ENV_USING_PFS_MODE */ /* #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 */ /* using IAP function */
#define EF_USING_IAP /* #define EF_USING_IAP */
/* using save log function */ /* using save log function */
/* #define EF_USING_LOG */ /* #define EF_USING_LOG */

@ -56,6 +56,11 @@ enum {
ENV_PARAM_INDEX_SAVED_COUNT, ENV_PARAM_INDEX_SAVED_COUNT,
#endif #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 */ /* data section CRC32 code index in system section */
ENV_PARAM_INDEX_DATA_CRC, ENV_PARAM_INDEX_DATA_CRC,
/* flash ENV parameters word size */ /* 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 EfErrCode create_env(const char *key, const char *value);
static uint32_t calc_env_crc(void); static uint32_t calc_env_crc(void);
static bool env_crc_is_ok(void); static bool env_crc_is_ok(void);
static EfErrCode env_auto_update(void);
/** /**
* Flash ENV initialize. * 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(); result = ef_load_env();
#ifdef EF_ENV_AUTO_UPDATE
if (result == EF_NO_ERR) {
env_auto_update();
}
#endif
if (result == EF_NO_ERR) { if (result == EF_NO_ERR) {
init_ok = true; init_ok = true;
} }
return result; return result;
} }
@ -158,6 +171,8 @@ EfErrCode ef_env_init(ef_env const *default_env, size_t default_env_size) {
* @return result * @return result
*/ */
EfErrCode ef_env_set_default(void){ EfErrCode ef_env_set_default(void){
extern EfErrCode ef_env_ver_num_set_default(void);
EfErrCode result = EF_NO_ERR; EfErrCode result = EF_NO_ERR;
size_t i; size_t i;
@ -175,6 +190,11 @@ EfErrCode ef_env_set_default(void){
env_cache[ENV_PARAM_INDEX_SAVED_COUNT] = 0; env_cache[ENV_PARAM_INDEX_SAVED_COUNT] = 0;
#endif #endif
#ifdef EF_ENV_AUTO_UPDATE
/* initialize version number */
env_cache[ENV_PARAM_INDEX_VER_NUM] = EF_ENV_VER_NUM;
#endif
/* create default ENV */ /* create default ENV */
for (i = 0; i < default_env_set_size; i++) { for (i = 0; i < default_env_set_size; i++) {
create_env(default_env_set[i].key, default_env_set[i].value); create_env(default_env_set[i].key, default_env_set[i].value);
@ -193,7 +213,6 @@ EfErrCode ef_env_set_default(void){
} }
#endif #endif
return result; return result;
} }
@ -562,12 +581,17 @@ void ef_print_env(void) {
} }
#ifndef EF_ENV_USING_PFS_MODE #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 #else
ef_print("\nENV size: %ld/%ld bytes, write bytes %ld/%ld, saved count: %ld, mode: power fail safeguard.\n", ef_print("\nmode: power fail safeguard\n");
get_env_user_used_size(), ENV_USER_SETTING_SIZE, ef_get_env_write_bytes(), ef_print("size: %ld/%ld bytes, write bytes %ld/%ld.\n", get_env_user_used_size(),
ENV_AREA_SIZE, env_cache[ENV_PARAM_INDEX_SAVED_COUNT]); 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 #endif
} }
@ -804,6 +828,39 @@ EfErrCode ef_set_and_save_env(const char *key, const char *value) {
return result; 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_ENV_USING_WL_MODE */
#endif /* EF_USING_ENV */ #endif /* EF_USING_ENV */

@ -63,6 +63,11 @@ enum {
ENV_PARAM_PART_INDEX_SAVED_COUNT, ENV_PARAM_PART_INDEX_SAVED_COUNT,
#endif #endif
#ifdef EF_ENV_AUTO_UPDATE
/* current version number for ENV */
ENV_PARAM_INDEX_VER_NUM,
#endif
/* data section CRC32 code index */ /* data section CRC32 code index */
ENV_PARAM_PART_INDEX_DATA_CRC, ENV_PARAM_PART_INDEX_DATA_CRC,
/* ENV parameters part word size */ /* 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 EfErrCode save_cur_using_data_addr(uint32_t cur_data_addr);
static uint32_t calc_env_crc(void); static uint32_t calc_env_crc(void);
static bool env_crc_is_ok(void); static bool env_crc_is_ok(void);
static EfErrCode env_auto_update(void);
/** /**
* Flash ENV initialize. * 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(); result = ef_load_env();
#ifdef EF_ENV_AUTO_UPDATE
if (result == EF_NO_ERR) {
env_auto_update();
}
#endif
if (result == EF_NO_ERR) { if (result == EF_NO_ERR) {
init_ok = true; init_ok = true;
} }
@ -179,6 +191,11 @@ EfErrCode ef_env_set_default(void){
env_cache[ENV_PARAM_PART_INDEX_SAVED_COUNT] = 0; env_cache[ENV_PARAM_PART_INDEX_SAVED_COUNT] = 0;
#endif #endif
#ifdef EF_ENV_AUTO_UPDATE
/* initialize version number */
env_cache[ENV_PARAM_INDEX_VER_NUM] = EF_ENV_VER_NUM;
#endif
/* create default ENV */ /* create default ENV */
for (i = 0; i < default_env_set_size; i++) { for (i = 0; i < default_env_set_size; i++) {
create_env(default_env_set[i].key, default_env_set[i].value); 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 #ifndef EF_ENV_USING_PFS_MODE
ef_print("\nENV size: %ld/%ld bytes, write bytes %ld/%ld, mode: wear leveling.\n", ef_print("\nmode: wear leveling\n");
get_env_user_used_size(), ENV_USER_SETTING_SIZE, ef_get_env_write_bytes(), ef_print("size: %ld/%ld bytes, write bytes %ld/%ld.\n", get_env_user_used_size(), ENV_USER_SETTING_SIZE,
ENV_AREA_SIZE); ef_get_env_write_bytes(), ENV_AREA_SIZE);
#else #else
ef_print("\nENV size: %ld/%ld bytes, write bytes %ld/%ld, saved count: %ld, mode: wear leveling and power fail safeguard.\n", ef_print("\nmode: wear leveling and power fail safeguard\n");
get_env_user_used_size(), ENV_USER_SETTING_SIZE, ef_get_env_write_bytes(), ef_print("size: %ld/%ld bytes, write bytes %ld/%ld.\n", get_env_user_used_size(), ENV_USER_SETTING_SIZE,
ENV_AREA_SIZE/2, env_cache[ENV_PARAM_PART_INDEX_SAVED_COUNT]); 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 #endif
} }
@ -967,6 +989,39 @@ EfErrCode ef_set_and_save_env(const char *key, const char *value) {
return result; 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_ENV_USING_WL_MODE */
#endif /* EF_USING_ENV */ #endif /* EF_USING_ENV */

Loading…
Cancel
Save