diff options
author | Justin Waters <justin.waters@timesys.com> | 2009-06-17 10:09:00 -0400 |
---|---|---|
committer | Justin Waters <justin.waters@timesys.com> | 2009-06-17 10:09:00 -0400 |
commit | 4e35d9f7af6cb5d553511d6064f224885fd905f4 (patch) | |
tree | 7ae0aec6dffc515af7c84c1d25f9c4ec6d0bc9f6 /common/env_flash.c | |
parent | 180a90abdae72587c0f679edf8991455e559440d (diff) |
Add omapl137 support1.3.3-omapl137-evm-200906171409
Diffstat (limited to 'common/env_flash.c')
-rw-r--r-- | common/env_flash.c | 58 |
1 files changed, 50 insertions, 8 deletions
diff --git a/common/env_flash.c b/common/env_flash.c index a92160ddfb..b0994d1929 100644 --- a/common/env_flash.c +++ b/common/env_flash.c @@ -88,6 +88,13 @@ static ulong end_addr_new = CFG_ENV_ADDR_REDUND + CFG_ENV_SECT_SIZE - 1; extern uchar default_environment[]; extern int default_environment_size; +static env_t tmp_env; + +/* local functions */ +#if !defined(ENV_IS_EMBEDDED) +static void use_default(void); +#endif + uchar env_get_char_spec (int index) { @@ -248,15 +255,9 @@ Done: #else /* ! CFG_ENV_ADDR_REDUND */ int env_init(void) -{ - if (crc32(0, env_ptr->data, ENV_SIZE) == env_ptr->crc) { - gd->env_addr = (ulong)&(env_ptr->data); - gd->env_valid = 1; - return(0); - } - +{ gd->env_addr = (ulong)&default_environment[0]; - gd->env_valid = 0; + gd->env_valid = 1; return (0); } @@ -336,6 +337,28 @@ int saveenv(void) void env_relocate_spec (void) { + + flash_info_t *info; + int count = CFG_ENV_SIZE; + u_char *src = (u_char*) flash_addr, *dst = (u_char*)env_ptr; + + if(!(info = addr2info(flash_addr))) { + return; + } + + while (count--) { + *dst++ = info->read8(src++); + } + + if (crc32(0, env_ptr->data, ENV_SIZE) == env_ptr->crc) { + gd->env_addr = (ulong)&(env_ptr->data); + gd->env_valid = 1; + return(0); + } else { + return use_default(); + } + + #if !defined(ENV_IS_EMBEDDED) || defined(CFG_ENV_ADDR_REDUND) #ifdef CFG_ENV_ADDR_REDUND if (gd->env_addr != (ulong)&(flash_addr->data)) { @@ -384,4 +407,23 @@ void env_relocate_spec (void) #endif /* ! ENV_IS_EMBEDDED || CFG_ENV_ADDR_REDUND */ } +#if !defined(ENV_IS_EMBEDDED) +static void use_default() +{ + puts ("*** Warning - bad CRC or FLASH, using default environment\n\n"); + + if (default_environment_size > CFG_ENV_SIZE){ + puts ("*** Error - default environment is too large\n\n"); + return; + } + + memset (env_ptr, 0, sizeof(env_t)); + memcpy (env_ptr->data, + default_environment, + default_environment_size); + env_ptr->crc = crc32(0, env_ptr->data, ENV_SIZE); + gd->env_valid = 1; +} +#endif + #endif /* CFG_ENV_IS_IN_FLASH */ |