Rockchip Uboot 基础简介
- U-Boot:Universal Boot Loader,主要用于嵌入式系统的引导加载程序,可以支持多种不同的计算机系统结构,其主要作用为引导系统的启动。
- Rockchip Uboot:基于
U-Boot
正式版v2017.09
进行开发,添加了大量新特性,目前已经支持 RK 所有主流在售芯片。
源码获取
- Rockchip U-Boot
- FireFly SDK。
- 开发板厂商提供的
SDK
。
特性
- 支持
RK Android
固件启动; - 支持
Linux Distro
固件启动; - 支持
Rockchip miniloader
和SPL/TPL
两种Pre-loader
引导; - 支持
LVDS、EDP、MIPI、HDMI、RGB
等显示设备; - 支持
eMMC、Nand Flash、SPI Nand flash、SPI NOR flash、SD 卡、 U 盘
等存储设备启动; - 支持
FAT、EXT2、EXT4
文件系统; - 支持
GPT
分区表; - 支持
I2C、PMIC、CHARGE、FUEL GUAGE、USB、GPIO、PWM、GMAC、eMMC、NAND、Interrupt
等; - 支持
Vendor storage
保存用户的数据和配置;
启动顺序
-
RK平台根据前级
Loader
代码是否开源,目前支持两套启动方式(只列出了我使用过的芯片):// 前级loader闭源,rk3399,rk3399pro BOOTROM => ddr bin => Miniloader => TRUST => U-BOOT => KERNEL // 前级loader开源,rv1126,rk3588s,rk3588 BOOTROM => TPL => SPL => TRUST => U-BOOT => KERNEL
-
TPL 相当于 ddr bin,SPL 相当于 miniloader。TPL+SPL 的组合实现了跟 RK 闭源 ddr.bin+miniloader 一致的功能,可相互替换。
启动命令
- RK U-Boot 通过宏
RKIMG_BOOTCOMMAND
定义的启动命令引导内核,该宏一般定义在文件include/configs/rockchip-common.h
或者文件include/configs/rkxx_common.h
中。 - 官方 U-Boot 通过
CONFIG_BOOTCOMMAND
定义的启动命令引导 kernel。在执行CONFIG_BOOTCMD
之前还会执行CONFIG_PREBOOT
预启动命令,通常这个命令定义为空。 - 在文件
include/configs/evb_rkxx.h
中会执行以下语句#define CONFIG_BOOTCOMMAND RKIMG_BOOTCOMMAND
定义启动命令,其实还是和官方一样。
前级 Loader
TPL(Tiny Program Loader)
、DDR BIN
、SPL(Secondary Program Loader)
、Miniloader
是比U-Boot
更早阶段的Loader
。TPL
和DDR BIN
:运行在sram
中,负责完成ddr
初始化。SPL
和Miniloader
:运行在ddr
中,负责完成系统的 lowlevel 初始化、后级固件加载(trust.img 和 uboot.img)。U-Boot
:运行在ddr
中,负责引导kernel。
Environment Variables
-
ENV(Environment-Variables)
是 U-Boot 支持的一种全局数据管理和传递方式,原理是构建一张HASH映射表,把用户的数据以"键值-数据"作为表项进行管理。 -
ENV 通常用于定义平台配置参数:固件加载地址、网络配置(ipaddr、serverip)、bootcmd、bootargs等,用户可以在命令行下使用
printenv
命令打印出来。 -
用户可选择是否把 ENV 数据保存到本地存储上。
-
ENV 数据仅限于 U-Boot 使用,无法直接传递给内核、内核也无法直接解析。
-
用户层可以通过 U-Boot 提供的
fw_printenv
工具访问 ENV 数据。 -
RK 平台上 ENV 数据的存储地址和大小定义如下(单位:字节):
config ENV_OFFSET hex default 0x3f8000 help Offset from the start of the device config ENV_SIZE hex default 0x80000 help Size of the environment storage area
-
RK 平台以文件
include/configs/rkxx_common.h
中宏CONFIG_EXTRA_ENV_SETTINGS
定义的值作为默认的环境变量,修改该宏即可修改环境变量。每一条环境变量都以\0
结尾。
DTS
- U-Boot 有自己的 DTS 文件,编译时会自动生成相应的 DTB 文件,被添加在 u-boot.bin 末尾。
- 各平台具体使用的 DTS 文件,通过 xxx_defconfig 中的
CONFIG_DEFAULT_DEVICE_TREE
指定。
编译输出
-
开启 TPL/SPL 编译后才有 TPL/SPL 的生成文件。
// U-Boot阶段 ./u-boot.map // MAP表文件 ./u-boot.sym // SYMBOL表文件 ./u-boot // ELF文件,类同内核的vmlinux(重要!) ./u-boot.dtb // u-boot自己的dtb文件 ./u-boot.bin // 可执行二进制文件,会被打包成uboot.img用于烧写 // SPL阶段 ./spl/u-boot-spl.map // MAP表文件 ./spl/u-boot-spl.sym // SYMBOL表文件 ./spl/u-boot-spl // ELF文件,类同内核的vmlinux(重要!) ./spl/u-boot-spl.dtb // spl自己的dtb文件 ./spl/u-boot-spl.bin // 可执行二进制文件,会被打包成loader用于烧写 // TPL阶段 ./tpl/u-boot-tpl.map // MAP表文件 ./tpl/u-boot-tpl.sym // SYMBOL表文件 ./tpl/u-boot-tpl // ELF文件,类同内核的vmlinux(重要!) ./tpl/u-boot-tpl.dtb // tpl自己的dtb文件 .//tpl/u-boot-tpl.bin // 可执行二进制文件,会被打包成loader用于烧写