9. 设备树的编译

在U-boot和kernel的源码中都有设备树文件。按照U-Boot 的原⽣架构要求⼀块板卡必须对应⼀份 U-Boot dts, 并且U-Boot dts⽣成的dtb是打包到U-Boot⾃⼰的镜像中的。这样就会出现各SoC平台上,N块板卡需要N份U-Boot镜像。

我们不难发现,其实⼀个SoC平台不同的板卡之间主要是外设的差异,SoC核⼼部分是⼀致的。RK平台 为了实现⼀个SoC平台仅需要⼀份U-Boot镜像,因此增加了 kernel DTB 机制。 本质就是在较早的阶段切到kernel DTB,⽤它的配置信息初始化外设。

RK平台通过⽀持 kernel DTB 可以达到兼容板卡差异,如:display、pmic/regulator、pinctrl、clk等。

我们可以简单的理解为,一些基础的通用外设使用U-Boot的设备树来进行初始化,而不通用的部分通过在U-Boot阶段加载内核的设备树来初始化。 所以我们在修改设备树时,主要也是去修改内核的设备树。例如在LubanCat-RK系列的开发过程中, 就没有修改过U-Boot的设备树,直接使用了rk3568-evb板卡的设备树。

9.1. 编译设备树文件

借助LubanCat-SDK提供的编译环境,我们在编译kernel镜像的同时,也会编译对应的设备树。

在LubanCat-SDK根目录下运行以下命令开编译内核:

1
2
3
4
5
# 编译kerneldeb文件
./build.sh kerneldeb

# 编译extboot分区
./build.sh extboot

编译生成的设备树文件和设备树源文件在同一目录下,如LubanCat-2板卡, 其设备树源文件是arch/arm64/boot/dts/rockchip/rk3568-lubancat-2.dts, 编译后生成的设备树文件是arch/arm64/boot/dts/rockchip/rk3568-lubancat-2.dtb。

9.2. 同一板卡更换设备树文件

9.2.1. extboot分区更换设备树文件

对于使用extboot分区的镜像而言,在生成extboot镜像时就已经将所有Makefile中指定的设备树都打包了进去, 板卡第一次启动时使用一个基础设备树,并在第一次系统启动以后根据板卡硬件ID自动切换为对应板卡的设备树。

系统的boot分区默认挂载在/boot目录下,如果我们要切换显示设备的话, 可以使用配置工具或直接修改/boot/rk-kernel.dtb软链接到的实际设备树的文件地址。

具体的切换方法请查看: 《设备树和设备树插件》

如果想要自己添加设备树的话,可以按以下流程进行:

  1. 在kernel/arch/arm64/boot/dts/rockchip下新建一个设备树源文件,如名称为rk3568-lubancat-2-xxx.dts

  2. 修改同一目录下的Makefile,在 dtb-$(CONFIG_CPU_RK3568) += 后添加rk3568-lubancat-2-xxx.dtb \

  3. 使用./build.sh kerneldeb命令构建内核deb包

  4. 使用./build.sh extboot命令构建extboot分区

  5. 使用./mkfirmware.sh命令重新打包固件

  6. 在rockdev目录下查看boot.img分区镜像文件

  7. 使用分区烧录工具进行烧录