RK 的文档中有说到 其 Uboot 是给予 2014.10 官方版本进行开发的,同步更新了主分支的一些关键性更新。
一、Uboot 的编译
编译 Uboot 我们所采用的命令如下:
1 | make rk3399_defconfig |
我们从编译命令入手,分析 Uboot。
Uboot 配置文件 ×_defconfig
rk3399_defconfig
为 uboot 的配置文件,uboot 的配置文件都在 configs 中
1 | ➜ u-boot git:(fcfc325) ls configs/rk3399* |
可以看到一共有三种形态,BOX、MID、FPGA。
首先以 rk3399_defconfig 为例:
1 | CONFIG_SYS_EXTRA_OPTIONS="RKCHIP_RK3399,PRODUCT_MID,NORMAL_WORLD,SECOND_LEVEL_BOOTLOADER,BAUDRATE=1500000" |
该选项内的配置会被优先编译成宏定义并在相关的项前面自动添加 CONFIG_,可以在
U-BOOT 自动生成的配置文件 (include/config.h) 中看到生成的宏定义,会优先系统的配置文件,
可以支配系统的配置文件。
什么意思呢,比如说 PRODUCT_MID ,他会被加上 CONFIG_ 成为 CONFIG_PRODUCT_MID 被定义。
然后通过这个宏来控制一些功能的开关。
正好,我们也可以对比看看 BOX 形态的产品的 configs:
我们对比 BOX 和 MID 的 configs 可以发现
1 | ➜ configs git:(fcfc325) diff rk3399_box_defconfig rk3399_defconfig |
即在 CONFIG_SYS_EXTRA_OPTIONS 参数中的 PRODUCT_* 有差别
全局搜索 PRODUCT_BOX 根据 PRODUCT_BOX、PRODUCT_MID 的差别会影响部分功能的开关。
比如 ./include/configs/rk33plat.h:375 中
1 | /* if box product, undefine fg and battery */ |
比如 ./include/configs/rk_default_config.h: 中,BOX 形态不需要电源管理系统,需要 HDMI 和 TVE
1 | #ifndef CONFIG_PRODUCT_BOX |
Uboot 配置文件 rk33plat.h
其中有关键性的系统配置
1 | 55 * define uboot loader addr. |
交叉编译工具链
ARCHV=aarch64
指明了 rk3399 的平台架构,在 Makefile 中会根据其指定编译工具链。
交叉编译工具链的指定是由 CROSS_COMPILE 宏确定,可以在 make 的时候声明。
1 | ifeq ($(ARCHV),aarch64) |
因为 RK3399 ARCHV==aarch64, 所以编译工具链为 4.9 版本
1 | ifneq ($(wildcard ../toolchain/aarch64-linux-android-4.9),) |
二、Uboot 目录结构
1 | include/configs/rk_default_config.h: |
三、RK 平台 Uboot 生成方式
RK Uboot 有两种生成方式。参看 RK wiki。
一种是 Uboot 作 first level bootloader,比如原来的 RK3288 平台,这种情况下,uboot 生成的固件为单独的 .bin 文件, RK3288UbootLoader_V2.30.10.bin 。
另一种是 Uboot 作为 second level bootloader,比如 RK3399 平台,这种情况下,uboot 生成的固件为 .img,比如 uboot.img。
在 Uboot 的代码中,configs/rk3399_defconfig 中有定义
1 | CONFIG_SYS_EXTRA_OPTIONS="RKCHIP_RK3399,PRODUCT_MID,NORMAL_WORLD,SECOND_LEVEL_BOOTLOADER,BAUDRATE=1500000" |
我们可以通过设置 CMDLINE 中的 CONFIG_SECOND_LEVEL_BOOTLOADER 宏来控制是否将其作为 second level bootloader。
CONFIG_SECOND_LEVEL_BOOTLOADER 会打开 CONFIG_MERGER_MINILOADER 宏。
它控制的功能是合并 MINIALL.ini 配置文件(tools/rk_tools/RKBOOT/RK3399MINIALL.ini )与 miniloader.bin(tools/rk_tools/bin/rk33/rk3399_miniloader_v1.06.bin ),最终输出为 rk3399_loader_v1.08.106.bin。
代码逻辑如下:
1 | ifdef CONFIG_SECOND_LEVEL_BOOTLOADER |