[TOC]
工具
本章节相关的开发工具路径(以U-Boot根目录为参考点):
./scripts/mkbootimg
./scripts/unpack_bootimg
./scripts/repack-bootimg
./scripts/unpack_resource.sh
./scripts/stacktrace.sh
./tools/patman/patman
./tools/buildman/buildman
../rkbin/tools/resource_tool
../rkbin/tools/loaderimage
../rkbin/tools/trust_merger
../rkbin/tools/boot_merger
trust_merger
功能:根据ini配置文件打包64位平台的 bl30、bl31、bl32 bin文件,生成 trust.img。
ini 文件:
以 RK3368TRUST.ini 为例:
[VERSION]
MAJOR=0 ----主版本号
MINOR=1 ----次版本号
[BL30_OPTION] ----bl30,目前设置为mcu bin
SEC=1 ----存在BL30 bin
PATH=tools/rk_tools/bin/rk33/rk3368bl30_v2.00.bin ----指定bin路径
ADDR=0xff8c0000 ----固件DDR中的加载和运行地址
[BL31_OPTION] ----bl31,目前设置为多核和电源管理相关的bin
SEC=1 ----存在BL31 bin
PATH=tools/rk_tools/bin/rk33/rk3368bl31-20150401-v0.1.bin----指定bin路径
ADDR=0x00008000 ----固件DDR中的加载和运行地址
[BL32_OPTION]
SEC=0 ----不存在BL32 bin
[BL33_OPTION]
SEC=0 ----不存在BL33 bin
[OUTPUT]
PATH=trust.img [OUTPUT] ----输出固件名字
打包命令:
/*
* @<sha>:可选。sha相关,参考make.sh
* @<rsa>:可选。rsa相关,参考make.sh
* @<size>:可选,格式:--size [KB] [count]。输出文件大小,省略时默认单份2M,打包2份
* @[ini file]: 必选。ini文件
*/
./tools/trust_merger <sha> <rsa> <size> [ini file]
范例:
./tools/trust_merger --rsa 3 --sha 2 ./ RKTRUST/RK3399TRUST.ini
out:trust.img
merge success(trust.img)
解包命令:
// @[input image]: 必选。用于解包的固件,一般是trust.img
./tools/trust_merger --unpack [input image]
范例:
./tools/trust_merger --unpack trust.img
File Size = 4194304
Header Tag:BL3X
Header version:256
Header flag:35
SrcFileNum:4
SignOffset:992
Component 0:
ComponentID:BL31
StorageAddr:0x4
ImageSize:0x1c0
LoadAddr:0x10000
Component 1:
ComponentID:BL31
StorageAddr:0x1c4
ImageSize:0x10
LoadAddr:0xff8c0000
Component 2:
ComponentID:BL31
StorageAddr:0x1d4
ImageSize:0x48
LoadAddr:0xff8c2000
Component 3:
ComponentID:BL32
StorageAddr:0x21c
ImageSize:0x2e0
LoadAddr:0x8400000
unpack success
boot_merger
功能:根据ini配置文件打包 miniloader + ddr + usb plug,生成 loader固件。
ini 文件:
以 RK3288MINIALL.ini 文件为例:
[CHIP_NAME]
NAME=RK320A ----芯片名称:”RK”加上与maskrom约定的4B芯片型号
[VERSION]
MAJOR=2 ----主版本号
MINOR=36 ----次版本号
[CODE471_OPTION] ----code471,目前设置为ddr bin
NUM=1
Path1=tools/rk_tools/bin/rk32/rk3288_ddr_400MHz_v1.06.bin
[CODE472_OPTION] ----code472,目前设置为usbplug bin
NUM=1
Path1=tools/rk_tools/bin/rk32/rk3288_usbplug_v2.36.bin
[LOADER_OPTION]
NUM=2
LOADER1=FlashData ----flash data,目前设置为ddr bin
LOADER2=FlashBoot ----flash boot,目前设置为miniloader bin
FlashData=tools/rk_tools/bin/rk32/rk3288_ddr_400MHz_v1.06.bin
FlashBoot=tools/rk_tools/bin/rk32/rk3288_miniloader_v2.36.bin
[OUTPUT] ----输出文件名
PATH=rk3288_loader_v1.06.236.bin
打包命令:
// @[ini file]: 必选。ini文件
./tools/boot_merger [ini file]
范例:
./tools/boot_merger ./RKBOOT/RK3399MINIALL.ini
out:rk3399_loader_v1.17.115.bin
fix opt:rk3399_loader_v1.17.115.bin
merge success(rk3399_loader_v1.17.115.bin)
解包命令:
// @[input image]: 必选。用于解包的固件,一般是loader文件
./tools/boot_merger --unpack [input image]
范例:
./tools/boot_merger --unpack rk3399_loader_v1.17.115.bin
unpack entry(rk3399_ddr_800MHz_v1.17)
unpack entry(rk3399_usbplug_v1.15)
unpack entry(FlashData)
unpack entry(FlashBoot)
unpack success
loaderimage
功能:
- 打包u-boot.bin生成uboot.img
- 打包32位平台的的 tee bin 生成 trust.img
打包u-boot:
/*
* @[input bin]: 必选。bin源文件
* @[output image]:必选。输出文件
* @[load_addr]:必选。加载地址
* @<size>:可选,格式:--size [KB] [count]。输出文件大小,省略时默认单份1M,打包4份
*/
./tools/loaderimage --pack --uboot [input bin] [output image] [load_addr] <size>
范例:
./tools/loaderimage --pack --uboot ./u-boot.bin uboot.img 0x60000000 --size 1024 2
load addr is 0x60000000!
pack input u-boot.bin
pack file size: 701981
crc = 0xc595eb85
uboot version: U-Boot 2017.09-02593-gb6e59d9 (Feb 18 2019 - 13:58:53)
pack uboot.img success!
解包u-boot:
/*
* @[input image]: 必选。解包源文件
* @[output bin]: 必选。解包输出文件,任意名字均可
*/
./tools/loaderimage --unpack --uboot [input image] [output bin]
范例:
./tools/loaderimage --unpack --uboot uboot.img uboot.bin
unpack input uboot.img
unpack uboot.bin success!
打包trust:
/*
* @[input bin]: 必选。bin文件
* @[output image]:必选。输出文件
* @[load_addr]:必选。加载地址
* @<size>:可选。格式:--size [KB] [count],输出文件大小,省略时默认单份1M,打包4份
*/
./tools/loaderimage --pack --trustos [input bin] [output image] [load_addr] <size>
范例:
./tools/loaderimage --pack --trustos ./bin/rk32/rk322x_tee_v2.00.bin trust.img \
0x80000000 --size 1024 2
load addr is 0x80000000!
pack input bin/rk32/rk322x_tee_v2.00.bin
pack file size: 333896
crc = 0x2de93b46
pack trust.img success!
解包trust:
/*
* @[input image]: 必选。解包源文件
* @[output bin]: 必选。解包输出文件,任意名均可
*/
./tools/loaderimage --unpack --trustos [input image] [output bin]
范例:
./tools/loaderimage --unpack --trustos trust.img tee.bin
unpack input trust.img
unpack tee.bin success!
resource_tool
功能: 用于打包任意资源文件,生成 resource.img。
打包命令:
./tools/resource_tool [--pack] [--image=<resource.img>] <file list>
范例:
./scripts/resource_tool ./arch/arm/boot/dts/rk3126-evb.dtb logo.bmp logo_kernel.bmp
Pack to resource.img successed!
解包命令:
./tools/resource_tool --unpack --image=<resource.img> [output dir]
范例:
./tools/resource_tool --unpack --image=resource.img ./out/
Dump header:
partition version:0.0
header size:1
index tbl:
offset:1 entry size:1 entry num:3
Dump Index table:
entry(0):
path:rk-kernel.dtb
offset:4 size:33728
entry(1):
path:logo.bmp
offset:70 size:170326
entry(2):
path:logo_kernel.bmp
offset:403 size:19160
Unack resource.img to ./out successed!
mkimage
功能:生成 SPL 模式下的Loader固件。
例如:通过下面的命令生成 Rockchip 的 bootrom 所需 IDBLOCK 格式,这个命令会同时修改 u-boot-tpl.bin 的头 4 个 byte 为 Bootrom 所需校验的 ID:
./tools/mkimage -n rk3328 -T rksd -d tpl/u-boot-tpl.bin idbloader.img
详细参考:
./doc/mkimage.1
stacktrace.sh
功能:解析调用栈信息,请参考RK架构章节。
mkbootimg
功能:打包固件生成boot和recovery.img,源文件来在android工程。
范例:
./scripts/mkbootimg --kernel zImage --second resource.img --ramdisk ramdisk.img --out boot.img
unpack_bootimg
功能:用于boot和recovery.img解包,源文件来在android工程。
范例:
./scripts/unpack_bootimg --boot_img boot.img --out out/
repack-bootimg
功能:替换boot和recovery.img中的固件。
范例:
// 例如:只替换kernel
./scripts/repack-bootimg --boot_img boot.img --kernel zImage -o boot_repack.img
// 例如:只替换resource
./scripts/repack-bootimg --boot_img boot.img --second resource.img -o boot_repack.img
pack_resource.sh
功能:打包./tools/images/ 目录下的充电图片进resource.img。
范例:
./scripts/pack_resource.sh resource.img
Pack ./tools/images/ & resource.img to resource.img ...
Unpacking old image(resource.img):
rk-kernel.dtb 1
Pack to resource.img successed!
Packed resources:
rk-kernel.dtb battery_1.bmp battery_2.bmp battery_3.bmp battery_4.bmp battery_5.bmp battery_fail.bmp battery_0.bmp 8
resource.img is packed ready
buildman
功能:批量编译代码,非常适合用于验证当前平台的提交是否影响到其他平台。详细参考:
./tools/buildman/README
使用 buildman 需要提前设置好 toolchain 路径,编辑'~/.buildman'文件:
[toolchain]
arm: ~/prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/
aarch64: ~/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/
典型用例,如编译所有 Rockchip 平台的 U-Boot 代码:
./tools/buildman/buildman rockchip
理想结果如下:
$ ./tools/buildman/buildman rockchip
boards.cfg is up to date. Nothing to do.
Building current source for 34 boards (4 threads, 1 job per thread)
34 0 0 /34 evb-rk3326
显示的结果中,第一个是完全 pass 的平台数量(绿色),第二个是含 warning 输出的平台数量(黄色),第三个是有 error 无法编译通过的平台数量(红色)。如果编译过程中有 warning 或者 error 会在终端上显示出来。
patman
功能:python 写的工具,通过调用其他工具完成 patch 的检查提交,是做 patch Upstream(U-Boot、Kernel)非常好用的必备工具。主要功能:
- 根据参数自动 format 补丁;
- 调用 checkpatch 进行检查;
- 从 commit 信息提取并转换成 upstream mailing list 所需的 Cover-letter、patch version、version changes 等信息;
- 自动去掉 commit 中的 change-id;
- 自动根据 Maintainer 和文件提交信息提取每个 patch 所需的收件人;
- 根据'~/.gitconfig'或者'./.gitconfig'配置把所有 patch 发送出去。
详细参考:
./tools/patman/README
使用'-h'选项查看所有命令选项:
$ patman -h
Usage: patman [options]
Create patches from commits in a branch, check them and email them as
specified by tags you place in the commits. Use -n to do a dry run first.
Options:
-h, --help show this help message and exit
-H, --full-help Display the README file
-c COUNT, --count=COUNT
Automatically create patches from top n commits
-i, --ignore-errors Send patches email even if patch errors are found
-m, --no-maintainers Don't cc the file maintainers automatically
-n, --dry-run Do a dry run (create but don't email patches)
-p PROJECT, --project=PROJECT
Project name; affects default option values and
aliases [default: u-boot]
-r IN_REPLY_TO, --in-reply-to=IN_REPLY_TO
Message ID that this series is in reply to
-s START, --start=START
Commit to start creating patches from (0 = HEAD)
-t, --ignore-bad-tags
Ignore bad tags / aliases
--test run tests
-v, --verbose Verbose output of errors and warnings
--cc-cmd=CC_CMD Output cc list for patch file (used by git)
--no-check Don't check for patch compliance
--no-tags Don't process subject tags as aliaes
-T, --thread Create patches as a single thread
典型用例:提交最新的 3 个 patch
patman -t -c3
命令运行后 checkpatch 如果有 error 或者 warning 会自动 abort,需要修改解决 patch 解决问题后重新运行。
其他常用选项
- '-t' 标题中":"前面的都当成 TAG,大部分无法被 patman 识别,需要使用'-t'选项;
- '-i' 如果有些 warning(如超过 80 个字符)我们认为无需解决,可以直接加'-i'选项提交补丁;
- '-s' 如果要提交的补丁并不是在当前 tree 的 top,可以通过'-s'跳过 top 的 N 个补丁;
- '-n' 如果并不是想提交补丁,只是想校验最新补丁是否可以通过 checkpatch,可以使用'-n'选项;
patchman 配合 commit message 中的关键字,生成 upstream mailing list 所需的信息。 典型的 commit:
commit 72aa9e3085e64e785680c3fa50a28651a8961feb
Author: Kever Yang <kever.yang@rock-chips.com>
Date: Wed Sep 6 09:22:42 2017 +0800
spl: add support to booting with OP-TEE
OP-TEE is an open source trusted OS, in armv7, its loading and
running are like this:
loading:
- SPL load both OP-TEE and U-Boot
running:
- SPL run into OP-TEE in secure mode;
- OP-TEE run into U-Boot in non-secure mode;
More detail:
<https://github.com/OP-TEE/optee_os>
and search for 'boot arguments' for detail entry parameter in:
core/arch/arm/kernel/generic_entry_a32.S
Cover-letter:
rockchip: add tpl and OPTEE support for rk3229
Add some generic options for TPL support for arm 32bit, and then
and TPL support for rk3229(cortex-A7), and then add OPTEE support
in SPL.
Tested on latest u-boot-rockchip master.
END
Series-version: 4
Series-changes: 4
- use NULL instead of '0'
- add fdt_addr as arg2 of entry
Series-changes: 2
- Using new image type for op-tee
Change-Id: I3fd2b8305ba8fa9ea687ab7f3fd1ffd2fac9ece6
Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
这个 patch 通过 patman 命令发送的时候,会生成一份 Cover-letter:
[PATCH v4 00/11] rockchip: add tpl and OPTEE support for rk3229
对应 patch 的标题如下, 包含 version 信息和当前 patch 是整个 series 的第几封:
[PATCH v4,07/11] spl: add support to booting with OP-TEE
Patch 的 commit message 已经被处理过了,change-id 被去掉、 Cover-letter 被去掉、version-changes 信息被转换成非正文信息:
OP-TEE is an open source trusted OS, in armv7, its loading and
running are like this:
loading:
- SPL load both OP-TEE and U-Boot
running:
- SPL run into OP-TEE in secure mode;
- OP-TEE run into U-Boot in non-secure mode;
More detail:
<https://github.com/OP-TEE/optee_os>
and search for 'boot arguments' for detail entry parameter in:
core/arch/arm/kernel/generic_entry_a32.S
Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
---
Changes in v4:
- use NULL instead of '0'
- add fdt_addr as arg2 of entry
Changes in v3: None
Changes in v2:
- Using new image type for op-tee
common/spl/Kconfig | 7 +++++++
common/spl/Makefile | 1 +
common/spl/spl.c | 9 +++++++++
common/spl/spl_optee.S | 13 +++++++++++++
include/spl.h | 13 +++++++++++++
5 files changed, 43 insertions(+)
create mode 100644 common/spl/spl_optee.S
更多关键字使用,如"Series-prefix"、 "Series-cc"等请参考 README。