1 启动介绍

首先,让我们弄清楚这个概念,当我们启动 Linux 操作系统时,有很多启动阶段;

然后,我们需要知道 image 应该如何打包,image 位于何处;

最后,我们将解释如何写入不同的媒体和从那里 boot 。

以下是 Rockchip 预发布的二进制文件,稍后可能会提到:

​GitHub - rockchip-linux/rkbin: Firmware and Tool Binarys​

1.1 启动流程

本章介绍了 Rockchip 应用处理器的一般启动流程,包括在Rockchip平台上使用什么 image 作为启动路径的细节:

- 使用来自 Upstream 或 Rockchip U-Boot 的 U-Boot TPL/SPL ,它们完全是源代码;

- 使用 Rockchp idbLoader,它由 Rockchip ​​rkbin project​​ 的 Rockchip ddr init bin 和 miniloader bin 组合而成;

+--------+----------------+----------+-------------+---------+
| Boot | Terminology #1 | Actual | Rockchip | Image |
| stage | | program | Image | Location|
| number | | name | Name | (sector)|
+--------+----------------+----------+-------------+---------+
| 1 | Primary | ROM code | BootRom | |
| | Program | | | |
| | Loader | | | |
| | | | | |
| 2 | Secondary | U-Boot |idbloader.img| 0x40 | pre-loader
| | Program | TPL/SPL | | |
| | Loader (SPL) | | | |
| | | | | |
| 3 | - | U-Boot | u-boot.itb | 0x4000 | including u-boot and atf
| | | | uboot.img | | only used with miniloader
| | | | | |
| | | ATF/TEE | trust.img | 0x6000 | only used with miniloader
| | | | | |
| 4 | - | kernel | boot.img | 0x8000 |
| | | | | |
| 5 | - | rootfs | rootfs.img | 0x40000 |
+--------+----------------+----------+-------------+---------+

当我们谈到从 eMMC/SD/U-Disk/Net 启动时,它们的概念不同:

  • 阶段1总是在 boot rom 中,它加载阶段2并可能加载阶段3(当启用 SPL_BACK_TO_BROM 选项时)。
  • 从 SPI Flash 启动是指 SPI Flash 中的第2和第3阶段(仅限 SPL 和 U-Boot )的固件,在其他地方是指阶段4/5的固件;
  • 从 eMMC 启动是指 eMMC 中的所有固件(包括阶段2、3、4、5);
  • 从 SD Card 启动是指 SD Card 中的所有固件(包括阶段2、3、4、5);
  • 从 U-Disk 启动是指磁盘中第4阶段和第5阶段(不包括 SPL和 U-Boot )的固件,可选仅包括第5阶段;
  • 从 Net/Tftp 启动是指网络上第4阶段和第5阶段的固件(不包括 SPL 和 U-Boot );

Rockchip | 启动引导的各个阶段及其对应固件_linux

Boot Flow 1 是典型的使用 Rockchip miniloader 的 Rockchip 启动流程;

Boot Flow 2 用于大多数 SOCs,U-Boot TPL 用于 ddr 初始化,SPL用于 trust(ATF/OP-TEE)加载并运行到下一阶段;

注意1:若 loader1 有一个以上的阶段,程序将回到 bootrom 和 bootrom 加载并运行到下一个阶段。例如,如果 loader1 是 tpl 和 spl,bootrom 将首先运行到 tpl,tpl init ddr,然后返回 bootrom,然后加载并运行到 spl。

注意2:如果启用 trust ,loader1 需要同时加载 trust和 u-boot,然后在安全模式下运行 trust(armv8中为EL3),trust 执行初始化并在非安全模式下运行到 u-boot(armv8中的EL2)。

注意3:对于 trust 是 trust.img 或者 u-boot.itb,armv7 只有一个 tee.bin,而 armv8 有 bl31.elf 和 bl32 选项。

注意4:在 boot.img 中,内容可以是 zImage 及其Linux dtb,也可以是 grub.efi,也可以是AOSP boot.img,ramdisk为可选项;

1.2 打包选项

在我们知道启动阶段之后,

以下是第2~4阶段打包前的文件列表:

  • 源代码:
  • u-boot:u-boot-spl.binu-boot.bin(可使用 u-boot-nodtb.bin 和 u-boot.dtb 代替)
  • kernel:kernel Image/zImage 文件、kernel dtb,
  • ATF:bl31.elf
  • Rockchip binary:
  • ddr、usbplug、miniloader、bl31/op-tee(均带有“rkxx_”前缀和“_x.xx.bin”版本后缀);

我们为不同的解决方案提供了两种不同的 boot-loader 方法,它们的步骤和请求文件也完全不同。但并非所有平台都支持这两种引导加载程序方法。以下是要从这些文件打包 image 的类型:

1.2.1 The Pre-bootloader(idbloader)

什么是 idbloader?

idbloader.img文件是一个 Rockchip 格式的预加载程序,假设在SoC启动时工作,它包含:

- 由 Rockchip BootRom 知道的 IDBlock 头;

- DRAM init 程序,由 MaskRom 加载,运行在 SRAM 内部;

- 下一级加载程序,由 MaskRom 加载并在 DDR SDRAM 上运行;

您可以使用以下方法获取 idbloader。

从 Rockchip release loader 获取用于 eMMC 的 idbloader

对于eMMC,不需要打包 idbloader.img 文件,如果您使用的是 Rockchip release loader,则可以使用以下命令在 eMMC 上获取 idbloader:

rkdeveloptool db rkxx_loader_vx.xx.bin
rkdeveloptool ul rkxx_loader_vx.xx.bin

打包 idbloader.img 文件来自 Rockchip binary:

对于SD boot 或 eMMC(使用 rockusb wl 命令更新),您需要一个idbloader(与 ddr 和 miniloader 结合使用)。

tools/mkimage -n rkxxxx -T rksd -d rkxx_ddr_vx.xx.bin idbloader.img
cat rkxx_miniloader_vx.xx.bin >> idbloader.img

打包 idbloader.img 文件从 U-Boot TPL/SPL(它们完全开源):

tools/mkimage -n rkxxxx -T rksd -d tpl/u-boot-tpl.bin idbloader.img
cat spl/u-boot-spl.bin >> idbloader.img

下载 idbloader.img 到包含第2阶段的 0x40 地址偏移处,同时您需要一个 uboot.img 启动第3阶段。

1.2.2 U-Boot

1.2.2.1 uboot.img

使用 Rockchip miniloader 的 idbloader 时,需要软件包 u-boot.bin 通过Rockchip tool loaderimage转换为可加载的 miniloader 格式。

tools/loaderimage --pack --uboot u-boot.bin uboot.img $SYS_TEXT_BASE

其中 SoCs 可能有不同的 $SYS_TEXT_BASE。

1.2.2.2 u-boot.itb

使用 SPL 加载 ATF/OP-TEE 时,打包bl31.bin、u-boot-nodtb.bin 以及 uboot.dtb 为一个 FIT image。您可以跳过打包 Trust image 的步骤,并在下一节中下载该 image 。

make u-boot.itb

注意:请将 trust binary 复制到 u-boot 根目录并将其重命名为 tee.bin(armv7)或 bl31.elf(armv8)。

1.2.3 Trust

1.2.3.1 trust.img

使用 Rockchip miniloader 的 idbloader 时,需要使用 Rockchip tool trustmerge 将 bl31.bin 打包成可加载的 miniloader 格式。

tools/trustmerge tools/rk_tools/RKTRUST_RKXXXXTRUST.ini

下载 trust.img 到 0x6000 地址偏移处,用于使用Rockchip miniloader。

1.2.4 boot.img

此 image 将 kernel Image 和 dtb 文件打包到已知的文件系统(FAT 或 EXT2)image 中,以便进行启动发行版。

有关从 kernel zImage/Image、dtb 生成 boot.img 的详细信息,请参见的 ​​Install kernel​​ 。

下载 boot.img 到第4阶段的 0x8000 地址偏移处。

1.2.5 rootfs.img

下载 rootfs.img 到第5阶段的 0x40000 地址偏移处。只要您选择的 kernel 能够支持该文件系统,image 的格式就没有限制。

1.2.6 rkxx_loader_vx.xx.xxx.bin

这是 Rockchip 以 binary 方式提供的,用于使用 ​​rkdeveloptool​​ 升级固件到 eMMC,不能直接连接到媒体设备。

这是来自 ddr.bin, usbplug.bin, miniloader.bin 的包,Rockchip tool DB 命令将使 usbplug.bin 作为 Rockusb 设备在目标中运行。您可以跳过打包此 image,Rockchip 将在大多数时间提供此 image。


2 下载与从媒体设备启动

这里我们介绍如何将 image 写入不同的媒体设备。

准备好 image:

  • 使用 SPL:
  • idbloader.img
  • u-boot.itb
  • boot.img 或里面有 Image、dtb 与 exitlinux 的 boot 文件夹
  • rootfs.img
  • 使用 miniloader
  • idbloader.img
  • uboot.img
  • trust.img
  • boot.img 或里面有 Image、dtb 与 exitlinux 的 boot 文件夹
  • rootfs.img

2.1 从eMMC启动

eMMC在硬件板上,因此我们需要:

以下是下载 image 到目标的命令示例。

将 GPT 分区表下载到目标:

rkdeveloptool db rkxx_loader_vx.xx.bin
rkdeveloptool gpt parameter_gpt.txt
  • SPL:
rkdeveloptool db rkxx_loader_vx.xx.bin
rkdeveloptool wl 0x40 idbloader.img
rkdeveloptool wl 0x4000 u-boot.itb
rkdeveloptool wl 0x8000 boot.img
rkdeveloptool wl 0x40000 rootfs.img
rkdeveloptool rd
  • miniloader:
rkdeveloptool db rkxx_loader_vx.xx.bin
rkdeveloptool ul rkxx_loader_vx.xx.bin
rkdeveloptool wl 0x4000 uboot.img
rkdeveloptool wl 0x6000 trust.img
rkdeveloptool wl 0x8000 boot.img
rkdeveloptool wl 0x40000 rootfs.img
rkdeveloptool rd

2.2 从SD/TF Card启动

我们可以很容易地用 Linux-PC 的 dd 命令烧写 SD/TF card。

将 SD card 插入 PC,我们假设 /dev/sdb 是 SD card 设备。

  • SPL:
dd if=idbloader.img of=sdb seek=64
dd if=u-boot.itb of=sdb seek=16384
dd if=boot.img of=sdb seek=32768
dd if=rootfs.img of=sdb seek=262144
  • miniloader:
dd if=idbloader.img of=sdb seek=64
dd if=uboot.img of=sdb seek=16384
dd if=trust.img of=sdb seek=24576
dd if=boot.img of=sdb seek=32768
dd if=rootfs.img of=sdb seek=262144

为了确保拔出前所有东西都已写入 SD card ,建议运行以下命令:

sync

注意:使用从 SD card boot 时,需要更新 kernel 命令行到正确的 root 值(它位于 extlinux.conf)。

append  earlyprintk console=ttyS2,115200n8 rw root=/dev/mmcblk1p7 rootwait rootfstype=ext4 init=/sbin/init

在 u-boot 中将 GPT 分区表写入 SD card,u-boot 可以找到 boot 分区并运行到 kernel 中。

gpt write mmc 0 $partitions

2.3 从U-Disk启动

它与 ​​boot-from-sdcard​​​ 相同,但请注意 U-Disk 只支持第4阶段和第5阶段,有关详细信息,请参阅 ​​Boot Stage​​。

如果 U-Disk 用于第4阶段和第5阶段,请将 U-Disk 格式化为 GPT 格式,并且至少有2个分区,写入 boot.img 和 rootfs.img 到它们对应的分区;

如果 U-Disk 只用于第5阶段,我们可以直接 dd rootfs.img 到 U-Disk 设备。

注意:需要更新 kernel 命令行到正确的 root 值(它位于 extlinux.conf)。

append  earlyprintk console=ttyS2,115200n8 rw root=/dev/sda1 rootwait rootfstype=ext4 init=/sbin/init

2.4 从Network启动

To be continued.


3 更多参考

​rkdeveloptool​

​rockusb​

​Rockchip Linux partition definition​