Chinaunix首页 | 论坛 | 博客
  • 博客访问: 125347
  • 博文数量: 92
  • 博客积分: 535
  • 博客等级: 下士
  • 技术积分: 880
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-27 14:13
文章分类

全部博文(92)

文章存档

2019年(2)

2018年(5)

2017年(6)

2016年(10)

2015年(15)

2014年(16)

2013年(25)

2012年(9)

2010年(4)

我的朋友

分类: Android平台

2015-08-05 20:15:41

      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有下面的内容:
//根据内核配置的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中

点击(此处)折叠或打开

  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:
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一次。

阅读(4881) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册