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,总结完毕。有问题,最好自己跟踪代码,最后都是可以搞定的。