mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-06-09 23:36:03 +09:00
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)
|
void env_relocate_spec(void)
|
||||||
{
|
{
|
||||||
|
ulong crc, new = 0;
|
||||||
|
unsigned off;
|
||||||
char buf[CONFIG_ENV_SIZE];
|
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);
|
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
|
#ifdef CONFIG_ENV_OFFSET_REDUND
|
||||||
|
@ -67,37 +81,9 @@ int saveenv(void)
|
||||||
*/
|
*/
|
||||||
int env_init(void)
|
int env_init(void)
|
||||||
{
|
{
|
||||||
ulong crc, len = ENV_SIZE, new = 0;
|
/* use default */
|
||||||
unsigned off;
|
gd->env_addr = (ulong)&default_environment[0];
|
||||||
uchar buf[64];
|
gd->env_valid = 1;
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user