DEY中的U-Boot命令和系统启动过程
- 版本
核心板上电时,Console口首先会输出Uboot的版本号,如:
U-Boot dub-2015.04-r12.1+g5ea79be (May 16 2018 - 12:45:15)
其中dub-2015.04-r12.1就是Digi的UBoot版本号,表明它是基于开源U-Boot v2015.04版本的基础上开发的Digi Uboot版本。注意,UBoot的版本不同平台略有不同,请参考官方文档获取新近的资料。
U-Boot定义了默认的一些参数,比如分区大小,默认的文件系统格式等。当U-Boot版本发生重大变化时,不同版本的U-Boot所支持的参数类型和值可能稍有区别。因此当您手动更新U-Boot之后,建议您恢复参数到默认值再进行其它操作。命令如下:
env default -a
如果您使用卡刷脚本进行固件更新,相关的操作已经包含在脚本中。
注意在DEY 2.4-r2起,U-Boot由dub-2015.04升级为dub-2017.03。使用DEY 2.4-r2之后的镜像,请使用相应的U-Boot版本。建议新用户选择DEY版本,都采用DEY 2.4之后的版本。
- 接口和启动方式支持
U-Boot一般支持这些接口,Uart Console, DDR和flash闪存(NAND或eMMC),uSD卡,以太网口,I2C, OTP位编程(eFuse),不同的平台所支持的启动方式略有不同,主要有NAND/eMMC/uSD,TFTP,USB(recovery)等方式启动。
- 闪存分区
低端SOM是工业级NAND,CC6/CC6+/CC8是工业级eMMC闪存,它们的默认分区稍有不同,本文成文较早,没包括双启动和后面的MP系列,请参考相关的文档以获取更详细资料:
NAND常用命令
- 读设备分区表 mtdparts
- 查看默认分区配置 printenv mtdparts
- 重置默认分区配置 mtdparts default
- 添加删除分区 mtdparts add / del / delall
U-Boot环境变量
U-Boot的环境变量参数可用于配置:串口,RAM/Flash,网口,内核命令,首次启动命令(比如清除用户分区),连接的显示屏配置等。这些参数存放于environment冗余分区以提高可靠性。在U-Boot中可以读取(printenv)和设置(setenv),操作系统也可以访问这些参数,用户还可以设置自定义参数。
常用的环境变量参数如下:
bootcmd | uboot启动时自动执行这个参数定义的命令,它用可用于自动或条件加载不同的操作系统 |
bootdelay | 在执行bootcmd之前的等待时间 |
ipaddr | 核心板默认IP |
serverip | 默认的TFTP服务器IP |
script | 自启动脚本名称 |
extra_args | 默认没有设置值,它可用于传递自定义值给操作系统,比如显示屏配置 |
ftd_file | 指定加载内核分区的设备树文件 |
设置参数命令用“setenv 环境变量名 值”,并不需要用等号。设置完成要用“saveenv”写入flash中。
以太网口和Wifi/Bluetooth的MAC地址也作为环境变量参数存于flash中,“env default -a”用于恢复所有环境变量为默认值,但对于Mac地址来说,如果你在flash中使用这个命令恢复默认环境变量,出厂就有的MAC地址并不会被清除。在外部存储中用这个命令可以重置MAC地址,但需要用“-f”选项强制写入。
常用U-Boot命令
help | 显示U-Boot命令帮助 |
version | 显示U-Boot版本 |
setenv | 设置一个环境变量参数 |
saveenv | 保存环境变量参数到flash,输入两次冗余拷贝 |
printenv | 显示所有环境变量 |
ping | ping某个IP |
mtdparts | 显示/改变flash分区 |
update | 更新/写入flash分区 |
updatefile | 更新eMMC的FAT分区文件 |
reset | 重启核心板 |
boot | 启动命令 |
source | 从RAM中执行脚本(需先从文件系统中加载脚本到RAM) |
文件系统相关命令 | |
ubi part 分区名 | 选择工作的UBI分区 |
ubi info 1 | 读取分区信息 |
ubifsmount ubi0 | 加载分区 |
ubifsls | 读取分区内容 |
ubifsload $loadaddr <filename> [bytes] | 加载脚本到RAM |
例:ubi part rootfs ubifsmount ubi0 ubifsls usr/bin |
|
ls mmc 0 | FAT或EXT4分区用ls命令列出内容,不需要先加载 |
pmic | 访问PMIC寄存器 |
在系统启动时,内核分区的boot.scr脚本被执行,其内容不同平台略有不同,如cc6ulsbc:
# U-Boot bootscript for NAND images created by Yocto. # # # Set device tree filename depending on the board ID (if defined) # if test -n "${board_id}"; then setenv fdt_file zImage-imx6ul-ccimx6ulsbc-id${board_id}.dtb else # # Set device tree filename depending on the hardware variant # if test "${module_variant}" = "0x02" || test "${module_variant}" = "0x04"; then setenv fdt_file zImage-imx6ul-ccimx6ulsbc-wb.dtb elif test "${module_variant}" = "0x03"; then setenv fdt_file zImage-imx6ul-ccimx6ulsbc.dtb else echo "------ Using default fdt_file: $fdt_file" fi fi if test "${mtdbootpart}" = "recovery"; then setenv boot_initrd true setenv initrd_file uramdisk-recovery.img else true fi dboot linux nand ${mtdbootpart}
我们可以更改并重新编译一个boot.scr,实际上,也可以直接绕过该脚本,而在u-boot中指定想要加载的设备树文件。
printenv bootcmd
可以看到“bootcmd= if run loadscript; then setexpr bs_ivt_offset ${filesize} - 0x4020;ifhab_auth_img ${loadaddr} ${bs_ivt_offset}; then source ${loadaddr};fi; fi;“
这里加载了boot.scr