[TOC]
编译烧写
前期准备
-
下载rkbin
这是一个工具包仓库,用于存放RK不开源的bin、脚本、打包工具。U-Boot 编译时会从该仓库索引相关文件,打包生成loader、trust、uboot固件。rkbin和U-Boot工程必须保持同级目录关系。
仓库下载:请参考附录章节。
-
下载GCC
GCC编译器使用gcc-linaro-6.3.1,放置于prebuilts目录之内。prebuilts和U-Boot保持同级目录关系。如下:
// 32位:
prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf
// 64位:
prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/GCC 下载:请参考附录章节
-
选择defconfig
芯片 defconfig 支持kernel dtb 说明 rv1108 evb-rv1108_defconfig N \ rk1808 rk1808_defconfig Y \ rk1806 rk1806_defconfig Y \ rk3036 rk3036_defconfig Y \ rk3128x rk3128x_defconfig Y \ rk3128 evb-rk3128_defconfig N \ rk3126 rk3126_defconfig Y \ rk322x rk322x_defconfig Y \ rk3288 rk3288_defconfig Y \ rk3368 rk3368_defconfig Y \ rk3328 rk3328_defconfig Y \ rk3399 rk3399_defconfig Y \ rk3399pro rk3399pro_defconfig Y \ rk3399pro-npu rknpu-lion_defconfig Y \ rk3308 rk3308_defconfig Y \ rk3308-aarch32 rk3308-aarch32_defconfig Y \ px30 px30_defconfig Y \ rk3326 rk3326_defconfig Y \ rk3326-aarch32 rk3326-aarch32_defconfig Y \ rv1126 rv1126_defconfig Y 通用版本 rv1126 rv1126-ab.config Y 通用版本+支持A/B rv1126 rv1126-emmc-tb.config
rv1126-lp3-emmc-tb.config
rv1126-spi-nor-tb.configY eMMC+DDR3 快速开机
eMMC+LP3 快速开机
Spi Nor+DDR3 快速开机rv1126 rv1126-spi-nor-tiny_defconfig
rv1126-ramboot.config
rv1126-usbplug.configY Spi Nor 小容量
无存储器件(内存启动)
usbplug功能rk3566 rk3566.config
rk3566-eink.configY 通用版本
电子书版本rk3568 rk3568_defconfig
rk3568-dfu.config
rk3568-nand.config
rk3568-spl-spi-nand_defconfig
rk3568-aarch32.config
rk3568-usbplug.configY 通用版本
支持dfu
支持MLC/TLC/ eMMC
SPI-nand专用SPL
支持aarch32模式
支持usbplug模式注意:如果表格和SDK发布的defconfig不同,请以SDK为准。
-
config fragment介绍
由于单个平台上产品的差异化需求,一个defconfig已经无法满足。所以从RV1126开始支持config fragment,即对defconfig进行overlay。
例如:rv1126-emmc-tb.config里指定了
CONFIG_BASE_DEFCONFIG="rv1126_defconfig",当执行./make.sh rv1126-emmc-tb命令时会先用rv1126_defconfig生成.config,然后再使用rv1126-emmc-tb.config里的配置对.config进行overlay。该命令可等效为:make rv1126_defconfig rv1126-emmc-tb.config && make如果要对config fragment文件进行更新,只需要借助
./scripts/sync-fragment.sh。例如:./scripts/sync-fragment.sh configs/rv1126-emmc-tb.config命令效果:把当前.config和rv1126_defconfig的配置差异项diff到rv1126-emmc-tb.config文件中。
固件编译
编译命令:
./make.sh [board] // [board]:configs/[board]_defconfig文件。
首次编译:无论32位或64位平台,第一次或想重新指定defconfig,则编译命令必须指定[board]。例如:
./make.sh rk3399 // build for rk3399_defconfig
./make.sh evb-rk3399 // build for evb-rk3399_defconfig
./make.sh firefly-rk3288 // build for firefly-rk3288_defconfig
二次编译:无论32位或64位平台,如果要基于当前".config"二次编译,则编译命令不用指定[board]:
./make.sh
注意:如果编译时出现奇怪的问题导致编译失败,请尝试
make distclean后重新编译。
固件生成:编译完成后会在U-Boot根目录下打包生成:trust、uboot、loader。如下是打包生成时的信息:
// 编译...
....
// uboot打包过程
load addr is 0x60000000!
pack input u-boot.bin
pack file size: 478737
crc = 0x840f163c
uboot version: v2017.12 Dec 11 2017
pack uboot.img success!
pack uboot okay! Input: u-boot.bin
// loader打包过程及引用的ini文件
out:rk3126_loader_v2.09.247.bin
fix opt:rk3126_loader_v2.09.247.bin
merge success(rk3126_loader_v2.09.247.bin)
pack loader okay! Input: /home/cjh/rkbin/RKBOOT/RK3126MINIALL.ini
// trust打包过程及引用的ini文件
load addr is 0x68400000!
pack file size: 602104
crc = 0x9c178803
trustos version: Trust os
pack ./trust.img success!
trust.img with ta is ready
pack trust okay! Input: /home/cjh/rkbin/RKTRUST/RK3126TOS.ini
// 提示编译成功。注意:即使上述的trust和loader打包失败也会提示这句话,说明至少生成了uboot.img
Platform RK3126 is build OK, with new .config(make rk3126_defconfig)
最终在根目录下生成可烧写的固件:
./uboot.img
./trust.img // 注意:如果是fit格式的固件,则没有trust.img。trust的二进制被打包在uboot.img里。
./rk3126_loader_v2.09.247.bin
固件打包工具:请参考工具章节。
固件烧写
烧写工具:
Windows/Linux的固件烧写工具建议使用SDK发布的工具版本或最新版本。
烧写模式:
RK平台一共有两种烧写模式:Maskrom模式、Loader模式(U-Boot)。
(1)进入Loader烧写模式的方法:
- 开机时,机器长按音量+
- 开机时,上位机长按ctrl+d组合键
- U-Boot命令行输入:download 或者 rockusb 0 $devtype $devnum
(2)进入Maskrom烧写模式的方法:
- 开机时,上位机长按ctrl+b组合键
- U-Boot命令行输入:rbrom
注意事项:
-
目前 U-Boot 支持两种分区表:RK parameter 分区表(旧)和 GPT 分区表(新)。如果想从当前的分区表替换成另外一种分区表类型,则 Nand 机器必须整套固件重新烧写;eMMC 机器可以支持单独替换分区表。
-
如果机器上同时存在两种分区表,则优先识别GPT分区表。可通过开机信息确认:
...
PartType: EFI // 当前为GPT分区表,否则打印"PartType: RKPARM"
...
固件大小
请参考章节:RK架构 => U-Boot固件。
特殊打包
./make.sh 除了编译代码,还集成了固件打包功能。提供了一些额外的独立打包命令供开发者使用。但是使用的前提是已经编译过一次 U-Boot。
非FIT格式:
./make.sh trust // 打包trust
./make.sh loader // 打包loader
./make.sh trust <ini-file> // 打包trust时指定ini文件,否则使用默认ini文件
./make.sh loader <ini-file> // 打包loader时指定ini文件,否则使用默认ini文件
FIT格式:
// 旧脚本:
./make.sh spl // 用tpl+spl替换ddr和miniloader,打包成loader
./make.sh spl-s // 用spl替换miniloader,打包成loader
// 新脚本:
./make.sh --spl // 用spl替换miniloader,打包成loader
./make.sh --tpl // 用tpl替换ddr,打包成loader
./make.sh --tpl --spl // 用tpl、spl替换ddr、miniloader,打包成loader
./make.sh --spl-new // ./make.sh --spl 命令只打包但不编译,此命令会重新编译再打包。
如何鉴别新旧脚本?如果新命令生效,make.sh就是新脚本。