U-Boot

简介

U-Boot 分为几个阶段:

  • First stage bootloader
    • TPL(Tertiary Program Loader)属于这一阶段
      • Rockchip TPL 实现了额外的救砖模式
  • 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)
    • 基于设备树
    • 支持多文件
    • 每个条目可设置校验算法
    • 支持数字签名

引导内核

  1. 加载系统镜像到指定地址
  2. 加载设备树到指定地址
  3. 设置加载参数 bootargs,例如 console 的波特率可以在这里设置
  4. 使用 boot 命令,给出镜像地址和设备树地址
=> env set bootargs console=ttyS0,115200
=> load mmc 0:1 0x82000000 boot/Image-xxxx
=> kiad mmc