Rockchip Uboot 单独编译烧写
- 本文主要介绍 RK Uboot 的编译烧写以及相关构建脚本。
准备工作
-
源码准备:
- 从官方获取:
git clone https://github.com/rockchip-linux/u-boot.git
- 从开发板厂商提供的 SDK 中拷贝:
cp -rfp sdk/u-boot .
- 从官方获取:
-
rkbin
准备(U-Boot依赖):- 从官方获取:
git clone https://github.com/rockchip-linux/rkbin.git
- 从开发板厂商提供的 SDK 中拷贝:
cp -rfp sdk/rkbin .
- 从官方获取:
-
工具链准备(以 gcc 10.3 64 位为例):
- 从
arm
官网获取:gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz - gcc 10.3 以下的版本可从 linaro 获取
- 从开发板厂商提供的 SDK 中拷贝:
cp -rfp prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/ .
- 从
-
目录准备:
mv rkbin u-boot/ mkdir -p u-boot/toolchain mv gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/ u-boot/toolchain/
make.sh
-
make.sh既是一个编译脚本,也是一个打包、调试工具。可用于反汇编、打包固件。
// 帮助命令 ./make.sh help // 编译 ./make.sh board // 根据 board_defconfig 配置构建固件 ./make.sh env // 生成 fw_printenv 工具 // 输出 在当前目录输出构建产物,包括 uboot/trust/loader images // 打包固件 ./make.sh uboot // 打包 uboot ./make.sh trust // 打包 trust ./make.sh loader // 打包 loader // 反汇编 ./make.sh elf // 反汇编 elf 文件,默认使用-D参数 ./make.sh map // 打开u-boot.map ./make.sh sym // 打开u-boot.sym
修改 make.sh
- 修改
RKBIN_TOOLS
为RKBIN_TOOLS=rkbin/tools
- 如果存在
TOOLCHAIN_ARM64
,则修改TOOLCHAIN_ARM64
为toolchain/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin
- 如果存在
CROSS_COMPILE_ARM64
,则修改CROSS_COMPILE_ARM64
为toolchain/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin
make.sh 与 rkbin 的联系
- rkbin:用于存放 RK 不开源的 bin、脚本、打包工具。U-Boot 编译时会从该仓库索引相关文件,打包生成 loader、trust、uboot 固件。
rkbin/RKBOOT/xxx.ini
文件以及rkbin/RKTRUST/xxx.ini
文件指定了需要打包的固件。- make.sh 中通过语句
${RKBIN}/RKBOOT/${RKCHIP_LOADER}MINIALL.ini
指定要使用的 ini 文件,RKCHIP_LOADER
一般为平台名。以 rk3588 为例,使用的 ini 文件即为rkbin/RKBOOT/RK3588MINIALL.ini
。
固件编译
- 以 rv1126 为例,执行命令
./make.sh rv1126
,实际使用的配置文件为./configs/rv1126_defconfig
。
编译产物
-
编译输出,以 rv1126 为例:
// fit 格式固件打包过程以及引用的 ini 文件 FIT description: FIT Image with U-Boot/OP-TEE/MCU Created: Wed Oct 18 15:43:39 2023 Image 0 (uboot) Description: U-Boot (32-bit) Image 1 (optee) Description: OP-TEE Image 2 (fdt) Description: U-Boot dtb Default Configuration: 'conf' Configuration 0 (conf) Description: rv1126-evb pack loader ok.(rv1126_spl_loader_v1.08.108.bin)(0.01) pack loader okay! Input: /home/ubuntu/rv1126/uboot/rv1126_uboot_v2017.9/rkbin/RKBOOT/RV1126MINIALL.ini /home/ubuntu/rv1126/uboot/rv1126_uboot_v2017.9 // uboot打包过程以及引用的 ini 文件 Image(no-signed, version=0): uboot.img (FIT with uboot, trust...) is ready Image(no-signed): rv1126_spl_loader_v1.08.108.bin (with spl, ddr, usbplug) is ready pack uboot.img okay! Input: /home/ubuntu/rv1126/uboot/rv1126_uboot_v2017.9/rkbin/RKTRUST/RV1126TOS.ini
-
对于前级 loader 闭源的 uboot,以 rk3399pro 为例,其输出产物为:
rk3399pro_loader_vx.xx.xxx.bin
idbloader.img
uboot.img
trust.img
- 一般将
rk3399pro_loader_vx.xx.xxx.bin
重命名为MiniLoaderAll.bin
- idbloader.img 与 rk3399pro_loader_vx.xx.xxx.bin 为同样的产物,只是打包的方式不同。
-
对于前级 loader 开源的 uboot,以 rv1126 为例,其输出产物为:
rv1126_spl_loader_vx.xx.xxx.bin
uboot.img
,fit 格式的固件,没有 trust.img。trust 的二进制被打包在 uboot.img 里。- 一般将
rv1126_spl_loader_vx.xx.xxx.bin
重命名为MiniLoaderAll.bin
固件烧写
使用烧写工具
-
SDK中提供的
RKDevTool
工具, 目录为sdk/tools/windows/RKDevTool
。 -
打开烧写工具,通过
usb
将开发板与电脑链接。 -
使开发板进入
Maskrom
模式或者Loader模式(U-Boot)
。此时该工具左下角会提示发现一个设备。 -
导入配置,在下载配置区右击,选择“导入配置”, 在"文件类型"中选择 ParameterFile,找到 parameter 文件。
-
选择需要烧录的分区以及文件(loader分区必选),第一次烧录,分区文件(parameter.txt)必选,然后点击执行,即可完成烧录。
-
rk3399pro parameter.txt 示例:
FIRMWARE_VER: 8.1 MACHINE_MODEL: RK3399PRO MACHINE_ID: 007 MANUFACTURER: RK3399PRO MAGIC: 0x5041524B ATAG: 0x00200800 MACHINE: 3399PRO CHECK_MASK: 0x80 PWR_HLD: 0,0,A,0,1 TYPE: GPT CMDLINE: mtdparts=rk29xxnand:0x1f80@0x40(miniloader),0x400@0x1fc0(ubootenv),0x2000@0x4000(uboot),0x2000@0x6000(trust),0x10000@0x8000(boot),0x300000@0x18000(recovery),-@0x318000(rootfs:grow)
-
rk3399pro uboot 需要烧写的文件与分区对应关系:
分区 文件 miniloader MiniLoaderAll.bin uboot uboot.img trust trust.img -
rv1126 parameter.txt 示例:
FIRMWARE_VER: 8.1 MACHINE_MODEL: RV1126 MACHINE_ID: 007 MANUFACTURER: RV1126 MAGIC: 0x5041524B ATAG: 0x00200800 MACHINE: 0xffffffff CHECK_MASK: 0x80 PWR_HLD: 0,0,A,0,1 TYPE: GPT CMDLINE: mtdparts=rk29xxnand:0x1f80@0x40(miniloader),0x400@0x1fc0(ubootenv),0x2000@0x4000(uboot),0x10000@0x6000(boot),0x100000@0x16000(recovery),-@0x116000(rootfs:grow)
-
rv1126 uboot 需要烧写的文件与分区对应关系:
分区 文件 miniloader MiniLoaderAll.bin uboot uboot.img
使用 dd 命令
-
前提要求:可以登入开发板。
-
对于前级 loader 闭源的 uboot,以 rk3399pro 为例,执行以下命令:
dd if=idbloader.img of=/dev/mmcblk0 bs=1M seek=64 dd if=uboot.img of=/dev/mmcblk0 bs=1M seek=16384 dd if=trust.img of=/dev/mmcblk0 bs=1M seek=24576
-
对于前级 loader 开源的 uboot,以 rv1126 为例,执行以下命令:
dd if=MiniLoaderAll.bin of=/dev/mmcblk0 bs=1M seek=64 dd if=uboot.img of=/dev/mmcblk0 bs=1M seek=16384