====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系列**,请参考相关的文档以获取更详细资料:
* [[#cc6ul-partition|ConnectCore 6UL]]
* [[#cc6-partition|ConnectCore 6]]
* [[#cc8x-partition|ConnectCore 8,9系列]]
{{digi:arm-embedded:linux:dey:cc6ul-nand.png?500|}}
{{digi:arm-embedded:linux:dey:cc6-emmc-partition.png?500|}}
===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 [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