linux使用dts来描述设备信息,dts文件通过scripts/dtc/dtc命令产生dtb文件来给内核zImage使用。但是如何通过dts来生成一个dtb文件呢?
首先明确一点是一个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)
这个makefile规则,指定了dtb依赖与dts,同时文件只是扩展名不同。例如sss.dtb的依赖文件为sss.dts。
当我们执行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
这个命令首先包含了arch/arm/boot/dts下面的Makefile,这个makefile有下面的内容:
//根据内核配置的CONFIG_BUILD_ARM_APPENDED_DTB_IMAGE_NAMES来决定dtb的名字,这里就是exynos5430-magiccube,所以这里的DTB_LIST就是exynos5430-magiccube.dtb
DTB_NAMES := $(subst $\",,$(CONFIG_BUILD_ARM_APPENDED_DTB_IMAGE_NAMES))
ifneq ($(DTB_NAMES),)
DTB_LIST := $(addsuffix .dtb,$(DTB_NAMES))
else
DTB_LIST := $(dtb-y)
endif
dtbs: $(addprefix $(obj)/, $(DTB_LIST)) //依赖于DTB_LIST变量的内容
也即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)/$@
首先zImage-dtb是一个dummy,它依赖与vmlinux, scripts,dtbs。这里看到dtbs所以会调用上面make dtbs的流程,来解决dtbs的依赖。解决完dtbs的依赖后,会调用makefile的规则,实际就是:
-
make -f scripts/Makefile.build obj=arch/arm/boot MACHINE=arch/arm/mach-exynos arch/arm/boot/zImage-dtb
需要注意这里的目标已经改变为实际存在的目标文件arch/arm/boot/zImage-dtb.该文件怎么产生呢,则在obj制定的目录的makefile中指定了。也即arch/arm/boot/Makefile:
DTB_NAMES := $(subst $\",,$(CONFIG_BUILD_ARM_APPENDED_DTB_IMAGE_NAMES))
ifneq ($(DTB_NAMES),)
DTB_LIST := $(addsuffix .dtb,$(DTB_NAMES)) ss.dtb
else
DTB_LIST := $(dtb-y)
endif
DTB_OBJS := $(addprefix $(obj)/dts/,$(DTB_LIST))
$(obj)/zImage-dtb: $(obj)/zImage $(DTB_OBJS) FORCE
$(call if_changed,cat)
@echo ' Kernel: $@ is ready'
看到这个文件中,指定了$(obj)/zImage-dtb也即arch/arm/boot/zImage-dtb的依赖为$(DTB_OBJS),而DTB_OBJS同样为exynos5430-magiccube.dtb, 也即这里有需要make exynos5430-magiccube.dtb一次。
阅读(11533) | 评论(0) | 转发(0) |