uboot研读笔记 | 09 - 移植uboot 2012.04到JZ2440(设置默认环境变量参数)

╄→尐↘猪︶ㄣ 提交于 2020-03-01 10:40:29

1. 定位环境变量问题

目前移植的uboot支持SDRAM、Nor Flash、Nand Flash、DM9000网卡,但是还有一行警告没有处理:

这行警告的原因是没有设置环境变量参数,所以uboot启动时读取校验参数失败,使用默认的参数。

通过搜索这行日志内容找到所在位置:

common/env_common.c文件中找到该行代码所在函数:

该函数中主要使用的 default_environment 数组,接着查看该数组内容,同样定义在该文件中,该数组的功能是根据我们定义的宏定义来设置默认环境变量参数

2. 设置默认参数

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

2.1. 内核启动相关

CONFIG_BOOTARGS 宏定义是启动内核时要传入的参数,添加配置如下:

/* 内核启动相关ENV */
#define CONFIG_BOOTARGS		"console=ttySAC0,115200 root=/dev/mtdblock3"
#define	CONFIG_BOOTCOMMAND	"nand read 30000000 kernel 0x200000;bootm 30000000"

2.2. 网络相关

/* 网络相关ENV */
#define CONFIG_NETMASK		255.255.255.0
#define CONFIG_IPADDR		192.168.1.6
#define CONFIG_SERVERIP		192.168.1.3
#define CONFIG_ETHADDR		52:54:00:7c:df:b7
#define CONFIG_GATEWAYIP	192.168.1.1


编译,下载到开发板,查看串口输出:

因为我们配置了CONFIG_BOOTCOMMAND 这个宏定义,所以uboot启动时开始有倒数计时,必须要配置时间内(默认5s)按下任意一个键,才能进入命令行,否则直接传递配置的内核参数,使用配置的命令启动内核。

此处按下按键,进入命令行模式,查看网络配置信息是否是自己配置的:

修改默认配置成功,但是启动时还是会输出这行提示信息:

3. 设置saveenv命令

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

在uboot的命令列表中可以看到saveenv命令表示将环境变量值存储到当前存储器中:

全局查找saveenv命令的实现,找到了两个定义:

  • common/env_nand.c文件中:saveenv会将环境变量存入nand flash中;
  • common/env_flash.c文件中:saveenv会将环境变量存入nor flash中;

两个文件中的定义冲突,肯定不会同时加入工程中编译,所以查看这两个文件同目录下的makefile:
在这里插入图片描述

可以看到,结果为:

  • 配置宏定义CONFIG_ENV_IS_IN_FLASH:加入common/env_flash.c文件;
  • 配置宏定义CONFIG_ENV_IS_IN_NAND:加入common/env_nand.c文件;

接下来测试将环境变量存入nand flash

首先在单板配置文件中配置宏定义,注意和另一个宏定义的冲突:

进入common/env_nand.c文件中找到 saveenv 定义:

在定义中可以看到主要有三个宏定义,表示存入内存的地址,大小,擦除范围,在单板文件中添加配置(注意去掉原有宏定义的冲突):

接着编译,烧写到开发板中,在串口终端中进行测试:

saveenv成功,重启开发板,可以看到uboot从nand flash中默认读取出了环境变量,警告消失

4. 动态修改环境变量并保存

可以使用print查看所有环境变量的值:

这些环境变量可以使用uboot命令set来修改,比如:

set ipaddr 192.168.1.8

然后保存环境变量到Flash即可:

saveenv

重新上电时候,uboot自动读取flash中的环境变量,可以看到已经是新设置的值。

接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!