|
|
|
|
@ -130,16 +130,16 @@ EfErrCode ef_env_init(ef_env const *default_env, size_t default_env_size) {
|
|
|
|
|
if (ENV_USER_SETTING_SIZE % EF_ERASE_MIN_SIZE == 0) {
|
|
|
|
|
EF_ASSERT(ENV_USER_SETTING_SIZE == ENV_AREA_SIZE);
|
|
|
|
|
} else {
|
|
|
|
|
EF_ASSERT((ENV_USER_SETTING_SIZE/EF_ERASE_MIN_SIZE + 1)*EF_ERASE_MIN_SIZE == ENV_AREA_SIZE);
|
|
|
|
|
EF_ASSERT((ENV_USER_SETTING_SIZE / EF_ERASE_MIN_SIZE + 1)*EF_ERASE_MIN_SIZE == ENV_AREA_SIZE);
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
/* total_size must be aligned with erase_min_size */
|
|
|
|
|
if (ENV_USER_SETTING_SIZE % EF_ERASE_MIN_SIZE == 0) {
|
|
|
|
|
/* it has double area when used power fail safeguard mode */
|
|
|
|
|
EF_ASSERT(2*ENV_USER_SETTING_SIZE == ENV_AREA_SIZE);
|
|
|
|
|
EF_ASSERT(2 * ENV_USER_SETTING_SIZE == ENV_AREA_SIZE);
|
|
|
|
|
} else {
|
|
|
|
|
/* it has double area when used power fail safeguard mode */
|
|
|
|
|
EF_ASSERT(2*(ENV_USER_SETTING_SIZE/EF_ERASE_MIN_SIZE + 1)*EF_ERASE_MIN_SIZE == ENV_AREA_SIZE);
|
|
|
|
|
EF_ASSERT(2 * (ENV_USER_SETTING_SIZE / EF_ERASE_MIN_SIZE + 1)*EF_ERASE_MIN_SIZE == ENV_AREA_SIZE);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
@ -170,7 +170,7 @@ EfErrCode ef_env_init(ef_env const *default_env, size_t default_env_size) {
|
|
|
|
|
*
|
|
|
|
|
* @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;
|
|
|
|
|
@ -433,7 +433,7 @@ static EfErrCode create_env(const char *key, const char *value) {
|
|
|
|
|
*
|
|
|
|
|
* @return result
|
|
|
|
|
*/
|
|
|
|
|
static EfErrCode del_env(const char *key){
|
|
|
|
|
static EfErrCode del_env(const char *key) {
|
|
|
|
|
EfErrCode result = EF_NO_ERR;
|
|
|
|
|
char *del_env = NULL;
|
|
|
|
|
size_t del_env_length, remain_env_length;
|
|
|
|
|
@ -466,7 +466,7 @@ static EfErrCode del_env(const char *key){
|
|
|
|
|
}
|
|
|
|
|
/* calculate remain ENV length */
|
|
|
|
|
remain_env_length = get_env_data_size()
|
|
|
|
|
- (((uint32_t) del_env + del_env_length) - ((uint32_t) env_cache + ENV_PARAM_BYTE_SIZE));
|
|
|
|
|
- (((uint32_t) del_env + del_env_length) - ((uint32_t) env_cache + ENV_PARAM_BYTE_SIZE));
|
|
|
|
|
/* remain ENV move forward */
|
|
|
|
|
memcpy(del_env, del_env + del_env_length, remain_env_length);
|
|
|
|
|
/* reset ENV end address */
|
|
|
|
|
@ -478,7 +478,7 @@ static EfErrCode del_env(const char *key){
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Set an ENV. If it value is empty, delete it.
|
|
|
|
|
* Set an ENV.If it value is NULL, delete it.
|
|
|
|
|
* If not find it in ENV table, then create it.
|
|
|
|
|
*
|
|
|
|
|
* @param key ENV name
|
|
|
|
|
@ -490,7 +490,7 @@ EfErrCode ef_set_env(const char *key, const char *value) {
|
|
|
|
|
EfErrCode result = EF_NO_ERR;
|
|
|
|
|
char *old_env, *old_value;
|
|
|
|
|
|
|
|
|
|
if(!init_ok) {
|
|
|
|
|
if (!init_ok) {
|
|
|
|
|
EF_INFO("ENV isn't initialize OK.\n");
|
|
|
|
|
return EF_ENV_INIT_FAILED;
|
|
|
|
|
}
|
|
|
|
|
@ -498,8 +498,8 @@ EfErrCode ef_set_env(const char *key, const char *value) {
|
|
|
|
|
/* lock the ENV cache */
|
|
|
|
|
ef_port_env_lock();
|
|
|
|
|
|
|
|
|
|
/* if ENV value is empty, delete it */
|
|
|
|
|
if ((value == NULL) || *value == '\0') {
|
|
|
|
|
/* if ENV value is NULL, delete it */
|
|
|
|
|
if (value == NULL) {
|
|
|
|
|
result = del_env(key);
|
|
|
|
|
} else {
|
|
|
|
|
old_env = find_env(key);
|
|
|
|
|
@ -519,6 +519,33 @@ EfErrCode ef_set_env(const char *key, const char *value) {
|
|
|
|
|
result = create_env(key, value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* unlock the ENV cache */
|
|
|
|
|
ef_port_env_unlock();
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Del an ENV.
|
|
|
|
|
*
|
|
|
|
|
* @param key ENV name
|
|
|
|
|
*
|
|
|
|
|
* @return result
|
|
|
|
|
*/
|
|
|
|
|
EfErrCode ef_del_env(const char *key) {
|
|
|
|
|
EfErrCode result = EF_NO_ERR;
|
|
|
|
|
|
|
|
|
|
if (!init_ok) {
|
|
|
|
|
EF_INFO("ENV isn't initialize OK.\n");
|
|
|
|
|
return EF_ENV_INIT_FAILED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* lock the ENV cache */
|
|
|
|
|
ef_port_env_lock();
|
|
|
|
|
|
|
|
|
|
result = del_env(key);
|
|
|
|
|
|
|
|
|
|
/* unlock the ENV cache */
|
|
|
|
|
ef_port_env_unlock();
|
|
|
|
|
|
|
|
|
|
@ -535,7 +562,7 @@ EfErrCode ef_set_env(const char *key, const char *value) {
|
|
|
|
|
char *ef_get_env(const char *key) {
|
|
|
|
|
char *env = NULL, *value = NULL;
|
|
|
|
|
|
|
|
|
|
if(!init_ok) {
|
|
|
|
|
if (!init_ok) {
|
|
|
|
|
EF_INFO("ENV isn't initialize OK.\n");
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
@ -559,12 +586,12 @@ char *ef_get_env(const char *key) {
|
|
|
|
|
*/
|
|
|
|
|
void ef_print_env(void) {
|
|
|
|
|
uint32_t *env_cache_data_addr = env_cache + ENV_PARAM_WORD_SIZE,
|
|
|
|
|
*env_cache_end_addr =
|
|
|
|
|
(uint32_t *) (env_cache + ENV_PARAM_WORD_SIZE + get_env_data_size() / 4);
|
|
|
|
|
*env_cache_end_addr =
|
|
|
|
|
(uint32_t *) (env_cache + ENV_PARAM_WORD_SIZE + get_env_data_size() / 4);
|
|
|
|
|
uint8_t j;
|
|
|
|
|
char c;
|
|
|
|
|
|
|
|
|
|
if(!init_ok) {
|
|
|
|
|
if (!init_ok) {
|
|
|
|
|
EF_INFO("ENV isn't initialize OK.\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
@ -586,7 +613,7 @@ void ef_print_env(void) {
|
|
|
|
|
#else
|
|
|
|
|
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);
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
@ -620,7 +647,7 @@ EfErrCode ef_load_env(void) {
|
|
|
|
|
ef_port_read(get_env_data_addr(), env_cache_bak, get_env_data_size());
|
|
|
|
|
/* read ENV CRC code from flash */
|
|
|
|
|
ef_port_read(get_env_system_addr() + ENV_PARAM_INDEX_DATA_CRC * 4,
|
|
|
|
|
&env_cache[ENV_PARAM_INDEX_DATA_CRC] , 4);
|
|
|
|
|
&env_cache[ENV_PARAM_INDEX_DATA_CRC] , 4);
|
|
|
|
|
/* if ENV CRC32 check is fault, set default for it */
|
|
|
|
|
if (!env_crc_is_ok()) {
|
|
|
|
|
EF_INFO("Warning: ENV CRC check failed. Set it to default.\n");
|
|
|
|
|
@ -633,7 +660,7 @@ EfErrCode ef_load_env(void) {
|
|
|
|
|
EfErrCode ef_load_env(void) {
|
|
|
|
|
EfErrCode result = EF_NO_ERR;
|
|
|
|
|
uint32_t area0_start_address = env_start_addr, area1_start_address = env_start_addr
|
|
|
|
|
+ ENV_AREA_SIZE / 2;
|
|
|
|
|
+ ENV_AREA_SIZE / 2;
|
|
|
|
|
uint32_t area0_end_addr, area1_end_addr, area0_crc, area1_crc, area0_saved_count, area1_saved_count;
|
|
|
|
|
bool area0_is_valid = true, area1_is_valid = true;
|
|
|
|
|
/* read ENV area end address from flash */
|
|
|
|
|
@ -675,11 +702,11 @@ EfErrCode ef_load_env(void) {
|
|
|
|
|
if (area0_is_valid && area1_is_valid) {
|
|
|
|
|
/* read ENV area saved count from flash */
|
|
|
|
|
ef_port_read(area0_start_address + ENV_PARAM_INDEX_SAVED_COUNT * 4,
|
|
|
|
|
&area0_saved_count, 4);
|
|
|
|
|
&area0_saved_count, 4);
|
|
|
|
|
ef_port_read(area1_start_address + ENV_PARAM_INDEX_SAVED_COUNT * 4,
|
|
|
|
|
&area1_saved_count, 4);
|
|
|
|
|
&area1_saved_count, 4);
|
|
|
|
|
/* the bigger saved count area is valid */
|
|
|
|
|
if ((area0_saved_count > area1_saved_count)||((area0_saved_count == 0)&&(area1_saved_count == 0xFFFFFFFF))) {
|
|
|
|
|
if ((area0_saved_count > area1_saved_count) || ((area0_saved_count == 0) && (area1_saved_count == 0xFFFFFFFF))) {
|
|
|
|
|
area1_is_valid = false;
|
|
|
|
|
} else {
|
|
|
|
|
area0_is_valid = false;
|
|
|
|
|
@ -828,6 +855,25 @@ EfErrCode ef_set_and_save_env(const char *key, const char *value) {
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Del and save an ENV. If del ENV is success then will save it.
|
|
|
|
|
*
|
|
|
|
|
* @param key ENV name
|
|
|
|
|
*
|
|
|
|
|
* @return result
|
|
|
|
|
*/
|
|
|
|
|
EfErrCode ef_del_and_save_env(const char *key) {
|
|
|
|
|
EfErrCode result = EF_NO_ERR;
|
|
|
|
|
|
|
|
|
|
result = ef_del_env(key);
|
|
|
|
|
|
|
|
|
|
if (result == EF_NO_ERR) {
|
|
|
|
|
result = ef_save_env();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef EF_ENV_AUTO_UPDATE
|
|
|
|
|
/**
|
|
|
|
|
* Auto update ENV to latest default when current EF_ENV_VER is changed.
|
|
|
|
|
|