当前位置:   article > 正文

RK3588的u-boot编译和镜像生成_rk3588编译过程分析

rk3588编译过程分析

说明

设备:firefly RK3588Q
SDK: Firefly提供的SDK uboot源码

前言

之前我有写过RK3588上电一文带你了解了RK3588,有需要可以看下之前的文章。本篇带着大家获取RK3588Q源码的获取以及u-boot源码单独编译的方法,uboot镜像说明,uboot镜像如何生成。让大家对uboot编译出来的镜像有个整体认识。

源码获取

RK3588的开发板资料我选用的是firefly,大家可去官网资料下载iCore 3588Q SDK源码百度网盘链接进行下载

参考下面wiki文档进行解压同步rk3588 Android12 sdk源码

https://wiki.t-firefly.com/zh_CN/iCore-3588Q/android_compile_android12.0_firmware.html#bian-yi-android12-0-gu-jian

解压后

uboot编译

进入到u-boot目录下,执行下面命令进行整体编译u-boot

RK3588_Android12.0/u-boot$ ./make.sh rk3588
  • 1

若出现以下日志则表示已经编译通过

********boot_merger ver 1.31********
Info:Pack loader ok.
pack loader okay! Input: /home/book/rkbin/RKBOOT/RK3588MINIALL.ini
/home/book/u-boot

Image(no-signed, version=0): uboot.img (FIT with uboot, trust...) is ready
Image(no-signed): rk3588_spl_loader_v1.13.112.bin (with spl, ddr...) is ready
pack uboot.img okay! Input: /home/book/rkbin/RKTRUST/RK3588TRUST.ini

Platform RK3588 is build OK, with new .config(make rk3588_defconfig -j8)
/home/book/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
Sun Feb 25 02:23:39 EST 2024
Running build_uboot succeeded.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

uboot镜像说明

uboot编译出来的目标文件

说明以下几个文件:

  • u-boot : elf格式的uboot镜像文件

  • u-boot.bin : u-boot.elf可执行程序通过objcopy生成的二进制可执行镜像文件

  • u-boot-nodtb.bin : u-boot.bin复制文件

  • u-boot.srec : S-Record格式的镜像文件

  • u-boot.map : uboot内存映射文件

  • u-boot.sym : uboot符号文件

  • uboot.img : 在u-boot.bin文件上增加了一些头部信息的文件例如加载地址

  • rk3588_spl_loader_v1.05.107.bin : 第一级loader,由bootrom代码加载到soc内部sram中执行, 负责初始化soc,以及外部DDR, 是由rk3588_ddr_lp4_2112MHz_lp5_2736MHz_v1.05.bin和rk3588_usbplug_v1.07.bin和rk3588_spl_v1.07.bin合并成rk3588_spl_loader_v1.05.107.bin,一般这三部分固件代码不开源

  • bl31.elf: bl31实现的代码, 由rk3588_bl31_v1.17.elf拷贝过来, 一般这部分代码不开源.

  • tee.bin: bl32实现的代码, OPTEE实现的,由rk3588_bl32_v1.06.bin拷贝过来, 一般这部分代码不开源。

而在整个RK3588的源码编译出来的镜像中,下面两个镜像是比较重要的

uboot.img,rk3588_spl_loader_v1.05.107.bin
  • 1

接下来说下这两个镜像是如何生成的

u-boot镜像生成

RK3588_Android12.0/u-boot$ ./make.sh -h

Usage:
	./make.sh [board|sub-command]

	 - board:        board name of defconfig
	 - sub-command:  elf*|loader|trust|uboot|--spl|--tpl|itb|map|sym|<addr>
	 - ini:          ini file to pack trust/loader

Output:
	 When board built okay, there are uboot/trust/loader images in current directory

Example:

1. Build:
	./make.sh evb-rk3399               --- build for evb-rk3399_defconfig
	./make.sh firefly-rk3288           --- build for firefly-rk3288_defconfig
	./make.sh EXT_DTB=rk-kernel.dtb    --- build with exist .config and external dtb
	./make.sh                          --- build with exist .config
	./make.sh env                      --- build envtools

2. Pack:
	./make.sh uboot                    --- pack uboot.img
	./make.sh trust                    --- pack trust.img
	./make.sh trust <ini>              --- pack trust img with assigned ini file
	./make.sh loader                   --- pack loader bin
	./make.sh loader <ini>             --- pack loader img with assigned ini file
	./make.sh --spl                    --- pack loader with u-boot-spl.bin
	./make.sh --tpl                    --- pack loader with u-boot-tpl.bin
	./make.sh --tpl --spl              --- pack loader with u-boot-tpl.bin and u-boot-spl.bin

3. Debug:
	./make.sh elf                      --- dump elf file with -D(default)
	./make.sh elf-S                    --- dump elf file with -S
	./make.sh elf-d                    --- dump elf file with -d
	./make.sh elf-*                    --- dump elf file with -*
	./make.sh <no reloc_addr>          --- unwind address(no relocated)
	./make.sh <reloc_addr-reloc_off>   --- unwind address(relocated)
	./make.sh map                      --- cat u-boot.map
	./make.sh sym                      --- cat u-boot.sym

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

loader镜像生成

实际调用fit.sh脚本里的下面指令来完成

file: scripts/fit.sh
./make.sh loader ../rkbin/RKBOOT/RK3588MINIALL.ini
 =>./tools/boot_merge ../rkbin/RKBOOT/RK3588MINIALL.ini (scripts/loader.sh)
  • 1
  • 2
  • 3


而…/rkbin/RKBOOT/RK3588MINIALL.ini配置文件内容:

[CHIP_NAME]
NAME=RK3588
[VERSION]
MAJOR=1
MINOR=1
[CODE471_OPTION]
NUM=1
Path1=bin/rk35/rk3588_ddr_lp4_2112MHz_lp5_2736MHz_v1.05.bin
Sleep=1
[CODE472_OPTION]
NUM=1
Path1=bin/rk35/rk3588_usbplug_v1.07.bin
[LOADER_OPTION]
NUM=2
LOADER1=FlashData
LOADER2=FlashBoot
FlashData=bin/rk35/rk3588_ddr_lp4_2112MHz_lp5_2736MHz_v1.05.bin
FlashBoot=bin/rk35/rk3588_spl_v1.07.bin
[OUTPUT]
PATH=rk3588_spl_loader_v1.05.107.bin
[SYSTEM]
NEWIDB=true
[FLAG]
471_RC4_OFF=true
RC4_OFF=true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

可以得知依赖的文件有:

1、DDR相关的bin/rk35/rk3588_ddr_lp4_2112MHz_lp5_2736MHz_v1.05.bin

2、USB相关的bin/rk35/rk3588_usbplug_v1.07.bin

3、miniloader(瑞芯微自己写的不开源的bootloader)相关的bin/rk35/rk3588_spl_v1.07.bin

最后用boot_merge工具将这三个bin文件合并输出成rk3588_spl_loader_v1.05.107.bin

uboot.itb镜像生成

有人会问不应该是uboot.img镜像生成,怎么是uboot.itb?

从fit.sh脚本看其实是先生成uboot.itb镜像然后再生成的uboot.img, 是mkimage工具根据u-boot.its文件做成uboot.itb

file: scripts/fit.sh
./make.sh itb ../rkbin/RKTRUST/RK3588TRUST.ini
file: make.sh
=> arch/arm/mach-rockchip/make_fit_atf.sh -t 0x8400000 > u-boot.its
=> ./tool/mkimage -f u-boot.its -E uboot.itb 
  • 1
  • 2
  • 3
  • 4
  • 5

uboot.img镜像生成

实际调用fit.sh脚本里的

file: make.sh
for ((i = 0; i < ${ITB_MAX_NUM}; i++));
do
	cat uboot.itb >> uboot.img
	truncate -s %${ITB_MAX_KB}K uboot.img
done
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

其中ITB_MAX_NUM是2, ITB_MAX_KB是2048, 也就是uboot.img最后固定在4MB大小,ITB_MAX_NUM和ITB_MAX_KB的默认取值是在Kconfig写死得

有人会问ITB_MAX_KB为啥是2048不是1024 ,因为uboot.itb是1777664bytes大小 ,所以ITB_MAX_KB要大于1777664bytes大小 ,不然打包uboot.itb时会有退出脚本 而且大小要是1024倍数所以是2048 。

至于ITB_MAX_NUM为啥是2 ,这里我查资料也不是很清楚 ,我改成1也是可以编译过去 .如果有人知道的话可以后台联系我。

make.sh脚本分析执行步骤

上面我已经总结fit.sh脚本主要做了哪些事情,接下来截取的是make.sh主要执行的步骤

process_args $*
prepare
select_toolchain
select_chip_info
fixup_platform_configure
select_ini_file
handle_args_late
sub_commands
clean_files
make PYTHON=python2 CROSS_COMPILE=${TOOLCHAIN} all --jobs=${JOB}
pack_images
finish
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

第一步指令: process_args $*

实际就是process_args rk3588,就是分析参数,同时执行make rk3588_defconfig -j8,配置.config

第二步指令: prepare

就是获取 rkbin工具路径, 并且根据是否64位设置对应的ARM64_TRUSTZONE=y,设置PLAT_TYPE=“FIT”

第三步指令:select_toolchain

设置32位和64位工具链

第四条指令:select_chip_info

从.config文件CHIP_PATTERN关键字内容获取芯片信息

第五条指令:fixup_platform_configure

使用默认的uboot镜像大小,trust镜像大小

第六条指令:select_ini_file

选择RK3588的ini配置文件

minloader的配置文件是…/rkbin/RKBOOT/RK3588MINALL.ini

trust的配置文件是…/rkbin/RKBOOT/RK3588TRUST.ini

第七条指令:handle_args_late

补充部分额外的编译参数

第八条指令:sub_commands

处理其他参数命令,如./make.sh itb, ./make.sh loader

第九条指令:clean_files

删除目标文件如u-boot, u-boot.dtb

第十条指令:make PYTHON=python2 CROSS_COMPILE= T O O L C H A I N a l l − − j o b s = {TOOLCHAIN} all --jobs= TOOLCHAINalljobs={JOB}

编译uboot源码

第十一条指令:pack_images

主要是打包uboot.img,rk3588_spl_loader_v1.05.107.bin

第十二条指令:finish

结束只是打印信息

总结

本篇大体上了解一下在uboot.img, rk3588_spl_loader_v1.05.107.bin从哪里来的,make.sh做了哪些事情, 这样后面如果需要改代码, 就知道那些镜像会被重新编译。


作者潘小帅, 是一名Linux底层爱好者,平时写写技术原创文章,徒步,旅游,看电影的爱好,喜欢我的文章可以点赞收藏+关注,感谢你的支持,微信公众号【Linux随笔录】

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/640545
推荐阅读
相关标签
  

闽ICP备14008679号