移植uboot-2012.04.01到JZ2440(七,设置默认环境变量)

一、定位问题

目前移植的uboot支持SDRAM、Nor Flash、Nand Flash、DM9000网卡,但是还有一行警告没有处理:
移植uboot-2012.04.01到JZ2440(七,设置默认环境变量)
通过搜索这行日志内容找到所在位置:
移植uboot-2012.04.01到JZ2440(七,设置默认环境变量)
该函数中主要使用的 default_environment 数组,接着查看该数组内容,同样定义在该文件中,该数组的功能是根据我们定义的宏定义来设置默认环境变量参数。
移植uboot-2012.04.01到JZ2440(七,设置默认环境变量)

二、设置默认参数

在单板配置文件include/configs/smdk2440.h中配置这些相关宏定义:

2.1. 内核启动相关

移植uboot-2012.04.01到JZ2440(七,设置默认环境变量)
编译,下载到开发板,查看串口输出:
移植uboot-2012.04.01到JZ2440(七,设置默认环境变量)
修改默认配置成功,但是启动时还是会输出这行提示信息:
移植uboot-2012.04.01到JZ2440(七,设置默认环境变量)

三、设置saveenv命令

这是因为只修改了代码中的宏定义,而没有将这些环境变量参数save到Flash中,所以uboot启动时,去读取flash中的参数发生错误,然后使用默认环境变量,也就是在第2节中配置的那些宏定义。

在uboot的命令列表中可以看到saveenv命令表示将环境变量值存储到当前存储器中:
全局查找saveenv命令的实现,找到了两个定义:

在common/env_nand.c文件中:saveenv会将环境变量存入nand flash中;
在common/env_flash.c文件中:saveenv会将环境变量存入nor flash中;
两个文件中的定义冲突,肯定不会同时加入工程中编译,所以查看这两个文件同目录下的makefile:
移植uboot-2012.04.01到JZ2440(七,设置默认环境变量)
可以看到,结果为:

配置宏定义CONFIG_ENV_IS_IN_FLASH:加入common/env_flash.c文件;
配置宏定义CONFIG_ENV_IS_IN_NAND:加入common/env_nand.c文件;
接下来测试将环境变量存入nand flash。

首先在单板配置文件中配置宏定义,注意和另一个宏定义的冲突:
移植uboot-2012.04.01到JZ2440(七,设置默认环境变量)
进入common/env_nand.c文件中找到 saveenv 定义:
移植uboot-2012.04.01到JZ2440(七,设置默认环境变量)
在定义中可以看到主要有三个宏定义,表示存入内存的地址,大小,擦除范围,在单板文件中添加配置(注意去掉原有宏定义的冲突):移植uboot-2012.04.01到JZ2440(七,设置默认环境变量)

接着编译,烧写到开发板中,在串口终端中进行测试:
移植uboot-2012.04.01到JZ2440(七,设置默认环境变量)
saveenv成功,重启开发板,可以看到uboot从nand flash中默认读取出了环境变量,警告消失:
移植uboot-2012.04.01到JZ2440(七,设置默认环境变量)