首先明确一点是一个dtb是由一个dts文件生成的,每一个dts文件可以包含多个dtsi文件,或者再由dtsi文件继续包含。这一点是由scripts/Makefile.lib中的makefile命令决定的。该命令如下所示:
点击(此处)折叠或打开
- $(obj)/%.dtb: $(src)/%.dts FORCE
- $(call if_changed_dep,dtc)
- $(call if_changed_dep,dtc_s)
当我们执行make dtbs时,就会产生系统中制定的dtb文件。
具体的makefile调用关系为:
点击(此处)折叠或打开
- arch/arm/Makefile
- dtbs: scripts
- $(Q)$(MAKE) $(build)=$(boot)/dts MACHINE=$(MACHINE) dtbs
点击(此处)折叠或打开
- make -f scripts/Makefile.build obj=arch/arm/boot/dts MACHINE=arch/arm/mach-exynos dtbs
也即make dtbs就是make exynos5430-magiccube.dtb。
最后scripts/Makefile.build包含了scripts/Makefile.lib, scripts/Makefile.lib指导如何通过exynos5430-magiccube.dts生成exynos5430-magiccube.dtb,也就开始所说的为什么一个.dtb由一个.dts生成。
Samsung的代码中,将zImage和dtb文件合成一个刷机文件zImage-dtb,就是使用cat将zImage和*.dtb使用cat合并在了一起。但是每次make zImage-dtb的时候,总是调用2次scripts/dtc/dtc来产生了2次dtb文件。通过分析发现秘密在这里,首先看arch/arm/Makefile中
点击(此处)折叠或打开
- zImage-dtb: vmlinux scripts dtbs
- $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
点击(此处)折叠或打开
- make -f scripts/Makefile.build obj=arch/arm/boot MACHINE=arch/arm/mach-exynos arch/arm/boot/zImage-dtb
看到这个文件中,指定了$(obj)/zImage-dtb也即arch/arm/boot/zImage-dtb的依赖为$(DTB_OBJS),而DTB_OBJS同样为exynos5430-magiccube.dtb, 也即这里有需要make exynos5430-magiccube.dtb一次。