项目开源地址:https://github.com/Mculover666/uboot-jz2440
0. 教程完整目录 00 - 嵌入式Linux系统中Bootloader的作用和基本运行原理 01 - 下载uboot源码并使用VSCode远程查看源码、编译uboot(2012.04.01版本) 02 - 详细探索uboot启动过程(基于S3C2410处理器) 03 - 初步移植uboot 2012.04到JZ2440(修改时钟,配置串口) 04 - 移植uboot 2012.04到JZ2440(支持Nor Flash读写) 05 - 移植uboot 2012.04到JZ2440(支持Nand Flash读写) 06 - 移植uboot 2012.04到JZ2440(支持DM9000C网卡) 07 - 移植uboot 2012.04到JZ2440(裁剪uboot大小) 08 - 移植uboot 2012.04到JZ2440(设置mtd分区表) 09 - 移植uboot 2012.04到JZ2440(设置默认环境变量参数) 10 - 移植uboot 2012.04到JZ2440(烧写Linux内核、烧写yaffs2文件系统) 11 - 移植uboot 2012.04到JZ2440(移植完成,制作uboot补丁) 1. 定位环境变量问题目前移植的uboot支持SDRAM、Nor Flash、Nand Flash、DM9000网卡,但是还有一行警告没有处理:
这行警告的原因是没有设置环境变量参数,所以uboot启动时读取校验参数失败,使用默认的参数。
通过搜索这行日志内容找到所在位置:
在common/env_common.c
文件中找到该行代码所在函数:
该函数中主要使用的 default_environment
数组,接着查看该数组内容,同样定义在该文件中,该数组的功能是根据我们定义的宏定义来设置默认环境变量参数。
在单板配置文件include/configs/smdk2440.h
中配置这些相关宏定义:
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)按下任意一个键,才能进入命令行,否则直接传递配置的内核参数,使用配置的命令启动内核。
此处按下按键,进入命令行模式,查看网络配置信息是否是自己配置的:
修改默认配置成功,但是启动时还是会输出这行提示信息:
这是因为只修改了代码中的宏定义,而没有将这些环境变量参数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中默认读取出了环境变量,警告消失:
可以使用print
查看所有环境变量的值:
这些环境变量可以使用uboot命令set来修改,比如:
set ipaddr 192.168.1.8
然后保存环境变量到Flash即可:
saveenv
重新上电时候,uboot自动读取flash中的环境变量,可以看到已经是新设置的值。
接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』。