侧边栏壁纸
博主头像
HSM's Blog博主等级

hahahhahahahahah

  • 累计撰写 13 篇文章
  • 累计创建 1 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

RK3399快速上手 | 03-RK3399启动流程分析

HSM
HSM
2023-05-19 / 0 评论 / 0 点赞 / 20 阅读 / 8360 字

一、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处理器的启动流程分为不同的阶段:
824127267.png

3. 启动流程分析

Rockchip官方提供了一张非常经典的启动流程图,接下来配合第2小节的启动阶段,进行分析。

3.1. 图示

首先是图示,要看懂图里每个框是什么意思。
1548006959.png

  • 蓝色的虚线框表示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 选项使能也会直接加载第三阶段)。
2134870269.png

3.3. 第二阶段

第二阶段是loader1,在eMMC的扇区地址是0x40,两条启动路径的rockchip镜像都是idbloader.img,负责将第三阶段加载起来。
1364927089.png

在启动路径1中,idbloader.img主要是miniloader,由 Rockchip rkbin 项目中提供的Rockchip ddr初始化bin文件(rkxx_ddr_vx.xx.bin)和miniloader bin文件(rkxx_miniloader_vx.xx.bin)组成。
3740467509.png

447909333.png

在启动路径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的阶段
860402961.png

在启动路径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。
130281410.png

3.6. 第五阶段

第五阶段是kernel拉起来rootfs,rockchip镜像名称为rootfs.img,eMMC扇区地址在0x40000。
4159810614.png

完整的启动流程图如下:
3134278895.png

二、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

参考链接

0

评论区