linux使用dts来描述设备信息,dts文件通过scripts/dtc/dtc命令产生dtb文件来给内核zImage使用。但是如何通过dts来生成一个dtb文件呢?
      首先明确一点是一个dtb是由一个dts文件生成的,每一个dts文件可以包含多个dtsi文件,或者再由dtsi文件继续包含。这一点是由scripts/Makefile.lib中的makefile命令决定的。该命令如下所示:

点击(此处)折叠或打开

  1. $(obj)/%.dtb: $(src)/%.dts FORCE
  2. $(call if_changed_dep,dtc)
  3. $(call if_changed_dep,dtc_s)
      这个makefile规则,指定了dtb依赖与dts,同时文件只是扩展名不同。例如sss.dtb的依赖文件为sss.dts。
      当我们执行make dtbs时,就会产生系统中制定的dtb文件。
      具体的makefile调用关系为:

点击(此处)折叠或打开

  1. arch/arm/Makefile
  2. dtbs: scripts
  3. $(Q)$(MAKE) $(build)=$(boot)/dts MACHINE=$(MACHINE) dtbs
      其中相当与执行了命令:

点击(此处)折叠或打开

  1. make -f scripts/Makefile.build obj=arch/arm/boot/dts MACHINE=arch/arm/mach-exynos dtbs
     这个命令首先包含了arch/arm/boot/dts下面的Makefile,这个makefile有下面的内容:
      也即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中

点击(此处)折叠或打开

  1. zImage-dtb: vmlinux scripts dtbs
  2. $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
      首先zImage-dtb是一个dummy,它依赖与vmlinux, scripts,dtbs。这里看到dtbs所以会调用上面make dtbs的流程,来解决dtbs的依赖。解决完dtbs的依赖后,会调用makefile的规则,实际就是:

点击(此处)折叠或打开

  1. 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:
       看到这个文件中,指定了$(obj)/zImage-dtb也即arch/arm/boot/zImage-dtb的依赖为$(DTB_OBJS),而DTB_OBJS同样为exynos5430-magiccube.dtb, 也即这里有需要make exynos5430-magiccube.dtb一次。

10-21 13:31