Rockchip 系列启动流程解读
Soc启动流程
Soc在上电之后,第一个执行的代码是芯片是BootRom
,通常来说,SoC厂家都会做一个ROM
在SoC的内部,这个ROM
很小,里面固化了上电启动的代码(一经固化,永不能改,是芯片做的时候,做进去的);这部分代码呢,我们管它叫做BootROM
,也叫作一级启动程序
。
BootRom需要做的事情:初始化系统,CPU的配置,关闭看门狗,初始化时钟,初始化一些外设(比如 USB Controller
、MMC Controller
,Nand Controller
等);
BootROM
的代码除了去初始化硬件环境以外,还需要去外部存储器上面,将接下来可执行的程序读到内存来执行。
但此时dram
还没有初始化完成,所以并不能直接读取程序到dram
上执行,这时候芯片内部自带的sram
就派上用场了,但sram
造价高昂,所以通常内存容量较小,只能加载一小段程序到sram运行,这一小段程序只需要负责初始化dram
。
初始化好dram
之后将跳会到BootRom
,BootRom
再加载一段程序用以将uboot
和trust
复制到dram
并运行。
上文提到了一个专业名词叫做trust
,因为RK3399
是ARM64
,所以我们还需要编译·ATF (ARM Trust Firmware)
,ATF
主要负责在启动uboot
之前把CPU从安全的EL3
切换到EL2
,然后跳转到uboot
,并且在内核启动后负责启动其他的CPU。
开源方式
在开源方式中,初始化dram
的程序叫做TPL
; 将uboot
加载到dram
中的程序叫做SPL
.
在rockchip
移植好的uboot中开启以下选项即可编译出来TPL / SPL
文件:
# |
编译出来的文件如下:
❯ ls spl |
将这两个文件打包成loader镜像:
❯ tools/mkimage -n rk3399 -T rksd -d tpl/u-boot-tpl.bin idbloader.img |
闭源方式
在官方固件加载方式中,我们基于Rockchip rkbin
官方给的ddr.bin
、miniloader.bin
来实现的: https://github.com/Caesar-github/rkbin
1.通过tools/mkimage
将官方固件ddr
, miniloader
打包成BootROM
程序可识别的、带有ID Block header
的文件idbloader.img
;
ddr.bin
:等价于上面说的TPL
,用于初始化DDR
;
miniloader.bin:Rockchip修改的一个bootloader,等价于上面说的SPL,用于加载uboot;
这个文件打包出来实际上也是超过192KB的,因此也是分为二阶段执行的。
- 通过tools/loaderimage工具将u-boot.bin打包成u-boot.img;其中u-boot.bin是由uboot源码编译生成;
补充说明:使用Rockchip miniloader的 idbloader 时,需要将u-boot.bin通过tools/loaderimage转换为可加载的miniloader格式。
3.使用Rockchip工具tools/trust_merge将bl31.bin打包成trust.img;其中bl31.bin由ATF源码编译生成;
补充说明:使用Rockchip miniloader的idbloader 时,需要将bl31.bin通过tools/trust_merge转换为可加载的miniloader格式。
Ref
https://www.cnblogs.com/zyly/p/17380243.html
https://www.cnblogs.com/zyly/p/17389525.html#_label0
https://github.com/Caesar-github/docs/tree/master/Common/UBOOT