理解u-boot的启动流程,是理解u-boot工作原理的基础,也是掌握u-boot移植
方法的必要知识。
u-boot源码结构
从网上下载得到u-boot源码包,此处使用的是u-boot-2009.11.tar.bz2
解压有30多个子目录,分别存放其规律,可以分为3类
第一类目录与处理器体系结构或者开发板硬件直接相关
第二类目录是一些通用的函数或驱动程序
第三类目录是u-boot的应用程序、工具或文档
目录 | 特 性 | 解释说明 |
---|---|---|
board | 平台依赖 | 存放电路板相关的目录文件,如RPXlinte(mpc8xx)、smdk2410(arm920t)、sc520_cdp(x86)等目录 |
cpu | 平台依赖 | 存放CPU相关的目录文件,如mpc8xx、ppc4xx、arm720t、arm920t、xscale、i386等目录 |
lib_xxx | 平台依赖 | 与体系解构相关的库文件,如与ARM相关的库放在lib_arm中 |
include | 通用 | u-boot使用的头文件,还有支持各种硬件平台的编译文件、系统的配置文件和支持文件系统的文件。该目录下的configs目录中有与开发板相关的配置文件 |
common | 通用 | 实现u-boot命令行下支持的命令,每一条命令都对应一个文件。例如bootm命令对应的就是cmd_bootm.c |
lib_generic | 通用 | 通用库函数的实现 |
net | 通用 | 与网络协议栈相关的代码,BOOTP、TFTP、RARP、和NFS文件系统的实现 |
fs | 通用 | 支持文件系统,如cramfs、fat、fdos、jffs2和registerfs |
drivers | 通用 | u-boot支持的设备驱动程序都放在该目中,如各种网卡、支持CFI的Flash、串口和USB等 |
disk | 通用 | 对磁盘的支持 |
doc | 通用 | 文件目录。uboot有非常完善的文档,推荐大家参考阅读 |
tools | 通用 | 生成u-boot的工具,如mkimage、crc等 |
examples | 通用 | 一些独立运行的应用程序的例子,如helloword |
编译结果
编译完成之后,可以得到u-boot各种个样式的映像文件和符号表。
文件名称 | 说 明 | 文件名称 | 说明 |
---|---|---|---|
system.map | u-boot映像的符号表 | u-boot.bin | u-boot映像原始的二进制格式 |
u-boot | u-boot映像的ELF格式 | u-boot.srec | u-boot映像的S-Record格式 |
u-boot的三种映像格式都可以烧写到Flash中,但需要看加载器能否识别这些格式。一般u-boot.bin最为常用,直接按照二进制格式下载,并且按照绝对地址烧写到Flash中即可。
u-boot工具
在tools目录下会生成u-boot工具,这些工具有时也经常用到。
工具名称 | 说明 | 工具名称 | 说明 |
---|---|---|---|
bmp_log | 制作logo的位图结构体 | img2srec | 转换S-Record格式映像 |
envcrc | 效验u-boot内部的环境变量 | mkimage | 制作uImage格式映像 |
gen_eth_addr | 生成以太网接口MAC地址 | updater | u-boot自动更新升级工具 |
这些工具都有源代码,可以参考改写它们。其中mkimage是很常用的一个工具,Linux的内核映像和initramfs文件系统映像都可以用该工具转换成u-boot所需的格式。
u-boot 常用命令与测试
在制作好u-boot镜像后,可以通过JTAG和JLINK将其烧写到Flash中。在u-boot上电启动后,敲任意键可以退出自动启动状态,进入命令行。
命令:help或者?
功能:查看当前u-boot版本中支持的所有命令
环境变量相关命令
和shell类似,u-boot也有环境变量。
环境变量 | 解释说明 |
---|---|
bootdelay | 执行自动启动(bootcmd中的命令) 的等候秒数 |
baudrate | 串口控制台的波特率 |
netmask | 以太网的网络掩码 |
ethaddr | 以太网的MAC地址 |
bootfile | 默认下载的文件名 |
bootargs | 传递给Linux内核的启动参数 |
bootcmd | 自动启动时执行命令 |
serverip | TFTP服务器端的IP地址 |
ipaddr | 本地的IP地址 |
stdin | 标准输入设备,一般是串口 |
stdout | 标准输出,一般是串口,也可是LCD(VGA) |
stderr | 标准出错,一般是串口,也可是LCD(VGA) |
要查看板子上的环境变量的值可使用printenv
命令,没有设置的环境变量不会打印出来。也可以自己定义环境变量,并在命令中使用${环境变量}来调用它,也可以删除这个环境变量。设置环境变量命令是setenv
。
其格式为:setenv name value
第一个参数是环境变量名称。
第二个参数是要设置的值,如果没有第2个参数,则表示删除这个环境变量。