瑞芯微Rockchip开发者社区
直播中

雅博电子科技

12年用户 548经验值
擅长:2223
私信 关注
[问答]

如何分析RK3399这个芯片的启动方式呢

RK3399启动流程是怎样的?

如何分析RK3399这个芯片的启动方式呢?

回帖(1)

牛晓渊

2022-3-9 10:39:21
RK3399启动


1.RK3399上电后,会从0xffff0000获取romcode并运行;
2.然后依次从Nor Flash、Nand Flash、eMMC、SD/MMC获取ID BLOCK,ID BLOCK正确则启动,都不正确则从USB端口下载;
3.如果emmc启动,则先读取SDRAM(DDR)初始化代码到内部SRAM,然后初始化DDR,再将emmc上的代码(剩下的用户代码)复制到DDR运行;
4.如果从USB下载,则先获取DDR初始化代码,下载到内部SRAM中,然后运行代码初始化DDR,再获取loader代码(用户代码),放到DDR中并运行;
5.无论是何种方式,都需要DDR的初始化代码,结合前面RK3288的经验,就是向自己写的代码加上"头部信息",这个"头部信息"就包含DDR初始化操作;
2.1 官方启动分析
如何分析一款芯片的启动方式?
前面的一篇博客iMX6ULL上手体验,里面已经分析过了,大致就是先用厂家提供的资料,配置相关环境、编译、烧写,运行起来。然后就有了U-boot源码,从U-boot就可以几乎提取出所有的裸机代码,本文也是这样做的。


分析U-Boot的编译流程,可以看到如下内容:


./tools/boot_merger ./tools/rk_tools/RKBOOT/RK3399MINIALL.ini
out:rk3399_loader_v1.09.109.bin
fix opt:rk3399_loader_v1.09.109.bin
merge success(rk3399_loader_v1.09.109.bin)
./tools/trust_merger  ./tools/rk_tools/RKTRUST/RK3399TRUST.ini
out:trust.img
merge success(trust.img)
./tools/loaderimage --pack --uboot u-boot.bin uboot.img
pack input u-boot.bin
pack file size: 315128
crc = 0xb4d13cd6
uboot version: U-Boot 2014.10-RK3399-06 (Aug 16 2018 - 04:00:27)
pack uboot.img success!
/work/firefly-rk3399
Firefly-RK3399 make images finish!


可以看出这里使用了三个工具,产生了三个文件:
①:使用boot_merger,参数为RK3399MINIALL.ini,得到loader文件rk3399_loader_v1.09.109.bin,打开RK3399MINIALL.ini内容为:


[CHIP_NAME]
NAME=RK330C
[VERSION]
MAJOR=1
MINOR=09
[CODE471_OPTION]
NUM=1
Path1=tools/rk_tools/bin/rk33/rk3399_ddr_800MHz_v1.09.bin
Sleep=1
[CODE472_OPTION]
NUM=1
Path1=tools/rk_tools/bin/rk33/rk3399_u***plug_v1.09.bin
[LOADER_OPTION]
NUM=2
LOADER1=FlashData
LOADER2=FlashBoot
FlashData=tools/rk_tools/bin/rk33/rk3399_ddr_800MHz_v1.09.bin
FlashBoot=tools/rk_tools/bin/rk33/rk3399_miniloader_v1.09.bin
[OUTPUT]
PATH=rk3399_loader_v1.09.109.bin


得知依赖的文件有:DDR相关的rk3399_ddr_800MHz_v1.09.bin、USB相关的rk3399_u***plug_v1.09.bin、miniloader(瑞芯微修改的一个bootloader)相关的rk3399_miniloader_v1.09.bin。
boot_merger将这三个bin文件最后合并成rk3399_loader_v1.09.109.bin。


②:使用trust_merger,参数为RK3399TRUST.ini,生成trust.img;


③:使用loaderimage将u-boot.bin变成uboot.img;


最后使用Android Tools,烧写rk3399_loader_v1.09.109.bin、trust.img和uboot.img即可启动U-Boot。


对以上过程进行分析,再加上实验测试和结合RK3288的经验,得出裸机启动文件的制作结论如下:
使用boot_merger将rk3399_ddr_800MHz_v1.09.bin、rk3399_u***plug_v1.09.bin和自己的裸机文件rk3399.bin合并出新文件即可。


2.2 制作裸机启动文件
经过分析和测试,现实现了emmc和TF卡启动裸机程序,并把整个过程整理了一个工程模板。
工程模板见GitHub,里面包含两个文件夹和两个文件。


code文件夹存放裸机源码;
tools存放制作“头部”的工具和配置文件;
rk3399_hardware_tool.sh是一个shell脚本,用于自动生成加“头部”后的裸机文件;
README.txt是操作说明;


以后只需要先进入code文件夹修改裸机源码,然后执行make生成rk399.bin,再退出到工程目录下,执行脚本rk3399_hardware_tool.sh即可生成rk3288_emmc.bin和rk3288_sd.bin;


rk3288_emmc.bin用于emmc启动:Windows下使用AndroidTool.exe,开发板进入MaskRom模式,烧入Loader位置;
rk3288_sd.bin用于SD卡启动:Linux下,插上SD卡,执行sudo dd if=rk3399_sd.bin of=/dev/sdb seek=$(((0x000040)))(其中/dev/sdb为SD卡)
举报

更多回帖

发帖
×
20
完善资料,
赚取积分