diff --git a/flash/inc/flash.h b/flash/inc/flash.h index a9f7ffe..aa44e1d 100644 --- a/flash/inc/flash.h +++ b/flash/inc/flash.h @@ -44,7 +44,7 @@ if (!(EXPR)) \ while (1); \ } /* EasyFlash software version number */ -#define FLASH_SW_VERSION "1.02.12" +#define FLASH_SW_VERSION "1.03.10" typedef struct _flash_env{ char *key; diff --git a/flash/src/flash_env.c b/flash/src/flash_env.c index 5d1d96f..2557d19 100644 --- a/flash/src/flash_env.c +++ b/flash/src/flash_env.c @@ -484,8 +484,8 @@ void flash_load_env(void) { /* read environment variables end address from flash */ flash_read(get_env_system_addr() + FLASH_ENV_SYSTEM_INDEX_END_ADDR * 4, &env_end_addr, 4); - /* if environment variables is not initialize, set default for it */ - if (env_end_addr == 0xFFFFFFFF) { + /* if environment variables is not initialize or flash has dirty data, set default for it */ + if ((env_end_addr == 0xFFFFFFFF) || (env_end_addr > env_start_addr + env_total_size)) { flash_env_set_default(); } else { /* set environment variables end address */ diff --git a/flash/src/flash_env_wl.c b/flash/src/flash_env_wl.c index ed39c66..ce6f67f 100644 --- a/flash/src/flash_env_wl.c +++ b/flash/src/flash_env_wl.c @@ -517,8 +517,8 @@ void flash_load_env(void) { /* read current using data section address */ flash_read(get_env_start_addr(), &using_data_addr, 4); - /* if environment variables is not initialize, set default for it */ - if (using_data_addr == 0xFFFFFFFF) { + /* if environment variables is not initialize or flash has dirty data, set default for it */ + if ((using_data_addr == 0xFFFFFFFF) || (using_data_addr > env_start_addr + env_total_size)) { /* initialize current using data section address */ set_cur_using_data_addr(get_env_start_addr() + flash_erase_min_size); /* save current using data section address to flash*/ @@ -530,22 +530,27 @@ void flash_load_env(void) { set_cur_using_data_addr(using_data_addr); /* read environment variables detail part end address from flash */ flash_read(get_cur_using_data_addr() + ENV_PARAM_PART_INDEX_END_ADDR * 4, &env_end_addr, 4); - /* set environment variables detail part end address */ - set_env_detail_end_addr(env_end_addr); + /* if environment variables end address has error, set default for environment variables */ + if (env_end_addr > env_start_addr + env_total_size) { + flash_env_set_default(); + } else { + /* set environment variables detail part end address */ + set_env_detail_end_addr(env_end_addr); - env_cache_bak = env_cache + ENV_PARAM_PART_WORD_SIZE; - /* read all environment variables from flash */ - flash_read(get_env_detail_addr(), env_cache_bak, get_env_detail_size()); + env_cache_bak = env_cache + ENV_PARAM_PART_WORD_SIZE; + /* read all environment variables from flash */ + flash_read(get_env_detail_addr(), env_cache_bak, get_env_detail_size()); #ifdef FLASH_ENV_USING_CRC_CHECK - /* read environment variables CRC code from flash */ - flash_read(get_cur_using_data_addr() + ENV_PARAM_PART_INDEX_DATA_CRC * 4, - &env_cache[ENV_PARAM_PART_INDEX_DATA_CRC] , 4); - - /* if environment variables CRC32 check is fault, set default for it */ - if (!env_crc_is_ok()) { - FLASH_INFO("Warning: Environment variables CRC check failed. Set it to default.\n"); - flash_env_set_default(); + /* read environment variables CRC code from flash */ + flash_read(get_cur_using_data_addr() + ENV_PARAM_PART_INDEX_DATA_CRC * 4, + &env_cache[ENV_PARAM_PART_INDEX_DATA_CRC], 4); + + /* if environment variables CRC32 check is fault, set default for it */ + if (!env_crc_is_ok()) { + FLASH_INFO("Warning: Environment variables CRC check failed. Set it to default.\n"); + flash_env_set_default(); + } } #endif