一、Rockchip处理器通用启动流程
1. 启动路径
Rockchip处理器有两种启动路径:
(1)典型的基于rockchip miniloader的启动流程:使用 Rockchip提供的idbLoader,由 Rockchip rkbin 项目中提供的Rockchip ddr初始化bin文件和miniloader bin文件组成。
(2)大多数SoC的通用启动流程:使用上游或者rockchip的U-Boot TPL/SPL启动,TPL用来初始化ddr,SPL 用来加载 trust固件(ATF/OP-TEE)。
2. 启动阶段
Rockchip处理器的启动流程分为不同的阶段:
3. 启动流程分析
Rockchip官方提供了一张非常经典的启动流程图,接下来配合第2小节的启动阶段,进行分析。
3.1. 图示
首先是图示,要看懂图里每个框是什么意思。
蓝色的虚线框表示Rockchp提供的工具,比如loaderimage、trustmerge
灰色的虚线框表示u-boot提供的工具,比如mkimage
蓝色框表示Rockchip rkbin提供的固件
绿色框表示ARM TF-A提供的固件
紫色框表示u-boot提供的固件
粉色框表示kernel提供的固件
3.2. 第一阶段
第一阶段是Boot Code,此代码已经固化在RK3399内部的Boot ROM中了,所以当板子上eMMC或者SD卡都没有固件时,就会进入MaskROM模式,可以通过USB烧写固件。
Boot Code会加载第二阶段的固件(如果 SPL_BACK_TO_BROM 选项使能也会直接加载第三阶段)。
3.3. 第二阶段
第二阶段是loader1,在eMMC的扇区地址是0x40,两条启动路径的rockchip镜像都是idbloader.img,负责将第三阶段加载起来。
在启动路径1中,idbloader.img主要是miniloader,由 Rockchip rkbin 项目中提供的Rockchip ddr初始化bin文件(rkxx_ddr_vx.xx.bin)和miniloader bin文件(rkxx_miniloader_vx.xx.bin)组成。
在启动路径2中,idbloader.img主要是uboot的TPL和SPL,由 uboot编译出的u-boot-tpl.bin和u-boot-spl.bin组成。
3.4. 第三阶段
第三阶段是loader2,在eMMC的扇区地址是0x4000,启动路径1的rockchip镜像是uboot.img,启动路径2的rockchip镜像是u-boot.itb,是运行u-boot和tf-a的阶段。
在启动路径1中分为两部分:uboot.img中主要包含u-boot.bin,而TF-A相关的固件打包为trust.img,放在trust分区(0x6000)。
但在启动路径2中,u-boot.itb将uboot和tf-a放在一起,包含以下三部分的文件:
来自uboot:u-boot-nodtb.bin、u-boot.dtb
来自ATM TF-A:bl31_dram.bin、bl31_sram.bin、bl31_m0.bin
来自rkbin:bl31.elf、bl32.bin、tee.bin
3.5. 第四阶段
第四阶段是uboot拉起来kernel开始运行,所以两条启动流程合并到一起,启动内核,rockchip镜像名称为boot.img,eMMC扇区地址在0x8000。
3.6. 第五阶段
第五阶段是kernel拉起来rootfs,rockchip镜像名称为rootfs.img,eMMC扇区地址在0x40000。
完整的启动流程图如下:
二、rockchip固件打包方法
1. 启动流程需要的文件
源码编译
U-Boot: u-boot-spl.bin, u-boot.bin(may use u-boot-nodtb.bin and u-boot.dtb instead)
kernel: kernel Image/zImage file, kernel dtb
ATF: bl31.elf;
Rockchip提供的二进制固件(以rkxx_开头和版本信息_x.xx.bin结束):
ddr
usbplug
miniloader
bl31/op-tee
2. idbloader.img
基于miniloader进行打包,适用于启动流程1:
tools/mkimage -n rkxxxx -T rksd -d rkxx_ddr_vx.xx.bin idbloader.img
cat rkxx_miniloader_vx.xx.bin >> idbloader.img
基于uboot tpl/spl打包,适用于启动流程2:
tools/mkimage -n rkxxxx -T rksd -d tpl/u-boot-tpl.bin idbloader.img
cat spl/u-boot-spl.bin >> idbloader.img
3. uboot.img
基于miniloader启动,适用于启动流程1,打包为miniloader可加载的格式:
tools/loaderimage --pack --uboot u-boot.bin uboot.img 0x200000
基于spl启动,适用于启动流程2,直接使用uboot编译出即可,不用打包,但需要先将trust固件拷贝到uboot根目录中,并重命名为bl31.elf:
make u-boot.itb CROSS_COMPILE=aarch64-linux-gnu-
4. trust.img
当使用Rockchip miniloader中的idbLoader时,需要使用Rockchip工具trustmerge将bl31.bin打包成miniloader可加载格式。
tools/trustmerge RKTRUST_RKXXXXTRUST.ini
三、烧写到启动介质
1. 不同启动方式需要的镜像
基于miniloader的启动流程
idbloader.img
uboot.img
trust.img
boot.img or boot folder with Image, dtb and exitlinulx inside
rootfs.img
基于uboot SPL的启动流程
idbloader.img
u-boot.itb
boot.img or boot folder with Image, dtb and exitlinulx inside
rootfs.img
2. 烧写到eMMC
首先让RK3399进入loader模式或者maskrom模式,然后使用 rkdeveloptool 烧写或者Android Tool烧写。
(1)对eMMC烧写GPT分区
rkdeveloptool db rkxx_loader_vx.xx.bin
rkdeveloptool gpt parameter_gpt.txt
(2)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
(3)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. 烧写到SD卡
(1)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
(2)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
烧写完之后同步:
sync
评论区