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

Karli ·
更新时间:2024-11-13
· 809 次阅读

项目开源地址: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 数组,接着查看该数组内容,同样定义在该文件中,该数组的功能是根据我们定义的宏定义来设置默认环境变量参数

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』


作者:Mculover666



uboot 环境 默认 参数 环境变量 变量

需要 登录 后方可回复, 如果你还没有账号请 注册新账号