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,⽤它的配置信息初始化外设。
NXP平台通过⽀持 kernel DTB 可以达到兼容板卡差异,如:display、regulator、pinctrl、clk等。
我们可以简单的理解为,一些基础的通用外设使用U-Boot的设备树来进行初始化,而不通用的部分通过在U-Boot阶段加载内核的设备树来初始化。 所以我们在修改设备树时,主要也是去修改内核的设备树。
11.1. 编译设备树¶
在SDK imx8mmini板级文件ebf-image-builder/configs/boards/ebf_imx_8m_mini.conf中定义了使用的设备树文件:LINUX_MMC_DTB=”freescale/imx8mm-ebf-basic.dtb”
设备树在内核源码具体目录为:ebf_linux_kernel/arch/arm64/boot/dts/freescale/imx8mm-ebf-basic.dts
借助SDK提供的编译环境,我们在编译kernel的同时,也会编译对应的设备树,或者我们手动直接编译内核或者编译内核deb包的同时,也会编译对应的设备树,但如果只是为了编译设备树而去编译内核就很浪费时间,因为我们可以单独编译设备树。
在内核源码顶层目录执行以下命令,单独编译设备树:
1 2 3 4 5 | #加载配置文件
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- imx_v8_defconfig
#指定dtbs参数,单独编译设备树
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- dtbs -j8
|
可见,单独编译设备树只是在直接编译内核的基础上,添加了dtbs参数,同理,如果需要单独编译内核模块,则只需要将dtbs参数改为modules,读者可自行尝试。
编译生成的ebf_linux_kernel/arch/arm64/boot/dts/freescale/imx8mm-ebf-basic.dtb 就是我们需要的设备树文件。
11.2. 烧录设备树¶
1、如果从已烧录系统的板卡修改:
将编译生成的设备树文件替换原来板卡的设备树/usr/lib/linux-image-5.4.47-imx8mm/freescale/imx8mm-ebf-basic.dtb,并重启开发板即可。
2、如果从镜像包进行修改:
如果是SD镜像包,请编译完整镜像然后烧录到SD卡进行启动,或者参考 修改img镜像内部的文件 章节,挂载文件系统分区,然后替换。
如果是usb镜像包,将usb烧录包目录下的xxx-arm64-rootfs-lubancat-xxx.tar解压到虚拟机,然后替换/usr/lib/linux-image-5.4.47-imx8mm/freescale/imx8mm-ebf-basic.dtb,最后打包并替换回usb烧录包的文件。