U-Boot
简介
U-Boot 分为几个阶段:
- First stage bootloader
- TPL(Tertiary Program Loader)属于这一阶段
- Rockchip TPL 实现了额外的救砖模式
- TPL(Tertiary Program Loader)属于这一阶段
- U-Boot SPL(Secondary Program Loader)
- 用户可控制
- 额外硬件的初始化
- 加载 U-Boot 或直接加载 Linux
- 较为稳定,不常改变
- 完整的 U-Boot
- 交互式 Shell
- 引导监控器
- 调试命令
- 时常变化
- Linux 内核
U-Boot Shell
两个 shell
- 旧的集成 shell
- Busybox 移植过来的 HUSH
实用指令
指令 | 描述 | 备注 |
---|---|---|
help | --- | --- |
echo | --- | \c 换行 |
bdinfo | 查看系统信息 | --- |
mw | 写内存 | --- |
md | 读内存 | 后面加 .b .w .l .q 转换格式 |
mm | 交互式修改内存 | 按q 来推出,按- 返回上个位置,按enter 跳过 |
nm | 交互式修改内存(不递增地址) | --- |
cp | 复制内存 | --- |
cmp | 对比内存 | --- |
printenv | 打印环境变量 | --- |
env | 环境变量操作 | --- |
saveenv | 持久化环境变量 | --- |
run | 解释环境变量 | --- |
setexpr | 求值 | 能进行取址运算,能使用正则表达式修改字符串 |
true,false | 设置布尔量 | 修改 $? 的值 |
test | 检查表达式的布尔值 | --- |
mmc,usb,sata,nand | 处理存储设备 | --- |
ls,load | 通用fs操作 | 支持 X/Y 调制每,输入 loady,然后从另一台电脑使用 GNU Sceen 发送 bin 文件 |
ubi | --- | --- |
boot | 启动 | --- |
iminfo | 查看镜像信息 | --- |
imxtract | 提取镜像内容 | --- |
fdt | 检查、修改设备树 | --- |
gpio | 操作 GPIO | --- |
i2c | i2c控制指令 | --- |
环境变量
U-Boot 使用环境变量来持久化脚本。
必须注意逃逸字符:
=> env set foo bar
=> env set quux echo $foo <-- wrong: quux is set to `bar`
=> env set foo bzz
=> run quux
bar
=> env print quux
quux=echo bar <-- quux is expansed to `echo bar`
=> env set quux echo \$foo <-- correct: quux is set to `echo $foo`
=> run quux
bzz
=> env print quux
quux=echo $foo
特殊环境变量:
名称 | 描述 |
---|---|
ver | --- |
stdin,stdout,stderr | --- |
loadaddr | 默认加载地址 |
filesize | 加载的文件大小 |
bootargs | 传递给 Linux 的命令行参数 |
bootcmd | 默认启动命令 |
preboot | autoboot前执行的脚本 |
ipaddr,netmask,serverip,gatewayip | --- |
ethaddr,eth1addr | --- |
表达式
- 条件表达式:
if <expr> ; then <stmt> ; else <command> ; fi
- for 循环:
for i in a b c d; do <stmt> ; done
- while 循环:
while <bool>; do <stmt> ; done
系统镜像
镜像格式:
- (z)Image
- Linux 二进制
- 没有位腐烂(bitrot)保护
- 只是设置寄存器然后跳转
- 可选的分离设备树
- uImage
- 不再使用的旧格式
- crc 校验
- 单文件
- 可选的分离设备树
- fitImage(Flattened-Image-Tree Image)
- 基于设备树
- 支持多文件
- 每个条目可设置校验算法
- 支持数字签名
引导内核
- 加载系统镜像到指定地址
- 加载设备树到指定地址
- 设置加载参数
bootargs
,例如 console 的波特率可以在这里设置 - 使用
boot
命令,给出镜像地址和设备树地址
=> env set bootargs console=ttyS0,115200
=> load mmc 0:1 0x82000000 boot/Image-xxxx
=> kiad mmc