env: dataflash: fix env_init issue
As the SPI controller is not initialized before env_init(), it causes reading env in dataflash failed. So, although saveenv() successfully, it shows warning information when reboot the system as following: *** Warning - bad CRC, using default environment Let the env_relocate() to check env CRC and import it. Signed-off-by: Bo Shen <voice.shen@atmel.com>
This commit is contained in:
parent
47a4bea6af
commit
cca2011e62
|
@ -29,11 +29,25 @@ uchar env_get_char_spec(int index)
|
|||
|
||||
void env_relocate_spec(void)
|
||||
{
|
||||
ulong crc, new = 0;
|
||||
unsigned off;
|
||||
char buf[CONFIG_ENV_SIZE];
|
||||
|
||||
/* Read old CRC */
|
||||
read_dataflash(CONFIG_ENV_ADDR + offsetof(env_t, crc),
|
||||
sizeof(ulong), (char *)&crc);
|
||||
|
||||
/* Read whole environment */
|
||||
read_dataflash(CONFIG_ENV_ADDR, CONFIG_ENV_SIZE, buf);
|
||||
|
||||
env_import(buf, 1);
|
||||
/* Calculate the CRC */
|
||||
off = offsetof(env_t, data);
|
||||
new = crc32(new, (unsigned char *)(buf + off), ENV_SIZE);
|
||||
|
||||
if (crc == new)
|
||||
env_import(buf, 1);
|
||||
else
|
||||
set_default_env("!bad CRC");
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ENV_OFFSET_REDUND
|
||||
|
@ -67,37 +81,9 @@ int saveenv(void)
|
|||
*/
|
||||
int env_init(void)
|
||||
{
|
||||
ulong crc, len = ENV_SIZE, new = 0;
|
||||
unsigned off;
|
||||
uchar buf[64];
|
||||
|
||||
if (gd->env_valid)
|
||||
return 0;
|
||||
|
||||
AT91F_DataflashInit(); /* prepare for DATAFLASH read/write */
|
||||
|
||||
/* read old CRC */
|
||||
read_dataflash(CONFIG_ENV_ADDR + offsetof(env_t, crc),
|
||||
sizeof(ulong), (char *)&crc);
|
||||
|
||||
off = offsetof(env_t, data);
|
||||
while (len > 0) {
|
||||
int n = (len > sizeof(buf)) ? sizeof(buf) : len;
|
||||
|
||||
read_dataflash(CONFIG_ENV_ADDR + off, n, (char *)buf);
|
||||
|
||||
new = crc32(new, buf, n);
|
||||
len -= n;
|
||||
off += n;
|
||||
}
|
||||
|
||||
if (crc == new) {
|
||||
gd->env_addr = offsetof(env_t, data);
|
||||
gd->env_valid = 1;
|
||||
} else {
|
||||
gd->env_addr = (ulong)&default_environment[0];
|
||||
gd->env_valid = 0;
|
||||
}
|
||||
/* use default */
|
||||
gd->env_addr = (ulong)&default_environment[0];
|
||||
gd->env_valid = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue