bad CRC or NAND, using default environment(2)

2.如果你想特殊点,不想让别人改你的启动参数等env值,那么你可以去在头文件中,不要定义CONFIG_SYS_ENV_OVERWRITE,然后也不要定义类似于这样的CONFIG_ENV_IS_IN_NAND定义。

然后别人无法修改这些环境变量,同时,也会每次都提示你

*** Warning - bad CRC or NAND, using default environment,此时,你就再直接把那行打印注释掉,就可以了。。。,虽然做法不雅,但是还是可以实现目的的。。。

【总结】

一句话,只要有源码,就没有解决不了的问题。一切问题,参考源码,都能找到根本原因。

此处对于arm+nand来说,具体涉及的文件和函数,总结如下:

1. lib_arm\board.c

void start_armboot (void)
{

。。。

for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
   if ((*init_fnc_ptr)() != 0) { //此处会去调用env_init()
    hang ();
   }
}

。。。

/* initialize environment */
env_relocate ();

。。。

}

2.对于env_init(),此处因为指定的是CONFIG_ENV_IS_IN_NAND,所以对应着:

common\env_nand.c:

int env_init(void)
{

。。。

gd->env_valid = 1;

。。。

}

3.common\env_common.c:

void env_relocate (void)
{

。。。

if (gd->env_valid == 0) {
#if defined(CONFIG_GTH) || defined(CONFIG_ENV_IS_NOWHERE) /* Environment not changable */
   puts ("Using default environment\n\n");
#else
   puts ("*** Warning - bad CRC, using default environment\n\n");
   show_boot_progress (-60);
#endif
   set_default_env();
}
else {
   env_relocate_spec ();
}
。。。

}

4.此处的env_relocate_spec,这里对应的是common\env_nand.c:

void env_relocate_spec (void)
{
#if !defined(ENV_IS_EMBEDDED)
int ret;

ret = readenv(CONFIG_ENV_OFFSET, (u_char *) env_ptr);
if (ret)
   return use_default();

if (crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc)
   return use_default();
#endif /* ! ENV_IS_EMBEDDED */
}

5.对于数据读取有误或者读出来的数据crc32有误的话,都会调用common\env_nand.c:

static void use_default()
{
puts ("*** Warning - bad CRC or NAND, using default environment\n\n");
set_default_env();
}

因此才会提示有误。OK,总结完毕。有问题,最好自己跟踪代码,最后都是可以搞定的。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyjpzg.html