11. 设备树的编译及烧录

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

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

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

我们可以简单的理解为,一些基础的通用外设使用U-Boot的设备树来进行初始化,而不通用的部分通过在U-Boot阶段加载内核的设备树来初始化。 所以我们在修改设备树时,主要也是去修改内核的设备树。

11.1. 编译设备树

在SDK MP157板级文件/ebf-image-builder/configs/boards/ebf_stm_mp157_star.conf中定义了使用的设备树文件:LINUX_MMC_DTB=”stm32mp157a-basic.dtb”

设备树在内核源码具体目录为:ebf_linux_kernel/arch/arm/boot/dts/stm32mp157a-basic.dts

借助SDK提供的编译环境,我们在编译kernel的同时,也会编译对应的设备树,或者我们手动直接编译内核或者编译内核deb包的同时,也会编译对应的设备树,但如果只是为了编译设备树而去编译内核就很浪费时间,因为我们可以单独编译设备树。

在内核源码顶层目录执行以下命令,单独编译设备树:

1
2
3
4
5
#加载配置文件
make ARCH=arm stm32mp157_ebf_defconfig

#指定dtbs参数,单独编译设备树
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8 dtbs

可见,单独编译设备树只是在直接编译内核的基础上,添加了dtbs参数,同理,如果需要单独编译内核模块,则只需要将dtbs参数改为modules,读者可自行尝试。

编译生成的ebf_linux_kernel/arch/arm/boot/dts/stm32mp157a-basic.dtb 就是我们需要的设备树文件。

11.2. 烧录设备树

1、如果从已烧录系统的板卡修改:

将编译生成的设备树文件替换原来板卡的设备树/boot/dtbs/stm32mp157a-basic.dtb,并重启开发板即可。

2、如果从镜像包进行修改:

如果是SD镜像包,请编译完整镜像然后烧录到SD卡进行启动,或者参考 修改img镜像内部的文件 章节,挂载boot分区,然后替换。

如果是usb镜像包,将usb烧录包stm32mp157_release_xxx/stm32mp157-cubeprogrammer/目录下的stm32mp157-lubancat-xxx-bootfs.img挂载到虚拟机,然后替换boot/dtbs/stm32mp157a-basic.dtb,同理如果修改文件系统,可挂载stm32mp157-lubancat-xxx-rootfs.img