dts 编译过程_DTS结构及其编译方法

DTS结构及其编译方法 一:主要问题 1,需要了解dtsi与dts的关系 2,dts的结构模型 3,dts是如何被编译的,以及编译后会生成一个什么文件. 二:参考文字 1,DTS(device tree source) .dts文件是一种ASCII文本格式的DeviceTree描述。基本上,在ARMLinux内,一个.dts文件对应一个ARM的machine,一般放置在内核的arch/arm/boot/dts/目录。由于一个SoC可能对应多个machine(一个SoC可以对应多个产品和电路板),势必这些.dts文件需包含许多共同的部分。Linux内核为了简化,把SoC公用的部分或者多个machine共同的部分一般提炼为.dtsi,类似于C语言的头文件。其他的machine对应的.dts就include这个.dtsi。 2,dts的结构模型 为了了解DeviceTree的结构,我们首先给出一个DeviceTree的示例:     /o device-tree           |- name ="device-tree"           |- model ="MyBoardName"           |-compatible = "MyBoardFamilyName"          |- #address-cells = <2>           |-#size-cells = <2>           |-linux,phandle = <0>           |          o cpus           | | - name = "cpus"          | | - linux,phandle = <1>           | |- #address-cells = <1>           | | -#size-cells = <0>           | |          | o PowerPC,970@0           | |- name ="PowerPC,970"           | |-device_type = "cpu"           | |-reg = <0>           | |-clock-frequency = <0x5f5e1000>          | |- 64-bit           | |- linux,phandle =<2>           |          o memory@0           | |- name ="memory"           | |- device_type= "memory"           | |- reg =<0x00000000 0x00000000 0x00000000 0x20000000>          | |- linux,phandle = <3>          |           o chosen            |- name = "chosen"            |- bootargs = "root=/dev/sda2"            |- linux,phandle = <4> 从上图中可以看出,devicetree的基本单元是node。这些node被组织成树状结构,除了rootnode,每个node都只有一个parent。一个devicetree文件中只能有一个rootnode。每个node中包含了若干的property/value来描述该node的一些特性。每个node用节点名字(nodename)标识,节点名字的格式是node-name@unit-address。如果该node没有reg属性(后面会描述这个property),那么该节点名字中必须不能包括@和unit-address。unit-address的具体格式是和设备挂在那个bus上相关。例如对于cpu,其unit-address就是从0开始编址,以此加一。而具体的设备,例如以太网控制器,其unit-address就是寄存器地址。rootnode的nodename是确定的,必须是“/”。 3,dts是如何被编译的,以及编译后会生成一个什么文件。         DTC(device tree compiler) dtc是将.dts编译为.dtb的工具。DTC的源代码位于内核的scripts/dtc目录,在Linux内核使能了DeviceTree的情况下,编译内核时,主机工具dtc会被编译出来,对应scripts/dtc/Makefile中的“hostprogs-y:= dtc”这一hostprogs编译target。 在Linux内核的arch/arm/boot/dts/Makefile中,描述了当某种SoC被选中后,哪些.dtb文件会被编译出来。举例如下: 如与VEXPRESS对应的.dtb包括:     dtb-$(CONFIG_ARCH_VEXPRESS) += vexpress-v2p-ca5s.dtb \             vexpress-v2p-ca9.dtb \             vexpress-v2p-ca15-tc1.dtb \             vexpress-v2p-ca15_a7.dtb \             xenvm-4.2.dtb 在Linux下,我们可以单独编译DeviceTree文件。当我们在Linux内核下运行makedtbs时,若我们之前选择了ARCH_VEXPRESS,上述.dtb都会由对应的.dts编译出来。因为arch/arm/Makefile中含有一个dtbs编译target项目。         DeviceTree Blob (.dtb) .dtb是.dts被DTC编译后的二进制格式的DeviceTree描述,可由Linux内核解析。通常在我们为电路板制作NAND、SD启动image时,会为.dtb文件单独留下一个很小的区域以存放之,之后bootloader在引导kernel的过程中,会先读取该.dtb到内存。     源代码体现 有两种方式使用DT。第一种可包含多个dtb,编入dt.img,放入boot.img。第二种只包含一个dtb,直接追加到kernelimage后面,放入boot.img。 dtc编译在kernel/AndroidKernel.mk中定义。先用定义"DTS_NAMES"变量,它的每个entry(记为"DTS_NAME"变量,下面的$$arch)中可能有arch和rev两部分,和.config中相关配置有关,用下面方法找出。 while (<>) { $$a = $$1 if /CONFIG_ARCH_((?:MSM|QSD|MPQ)[a-zA-Z0-9]+)=y/; $$r = $$1 if /CONFIG_MSM_SOC_REV_(?!NONE)(\w+)=y/; $$arch = $$arch.lc("$$a$$r ") if /CONFIG_ARCH_((?:MSM|QSD|MPQ)[a-zA-Z0-9]+)=y/ } print $$arch; 得到上述"DTS_NAMES"变量,用"$(DTS_NAME)*.dts"方式去"kernel/arch/arm/boot/dts/"下匹配。见下面的定义,其中"cat"命令就是生成带DT的kernelimage。 define append-dtb mkdir -p $(KERNEL_OUT)/arch/arm/boot;\ $(foreach DTS_NAME, $(DTS_NAMES), \    $(foreach d, $(DTS_FILES), \       $(DTC) -p 1024 -O dtb -o $(call DTB_FILE,$(d)) $(d); \       cat $(KERNEL_ZIMG) $(call DTB_FILE,$(d)) > $(call ZIMG_FILE,$(d));)) endef 第二种方式没看到后续如何放入boot.img。对于第一种方式,会用"device/qcom/common/generate_extra_images.mk"中定义的下面规则编出"dt.img", $(INSTALLED_DTIMAGE_TARGET): $(DTBTOOL) $(INSTALLED_KERNEL_TARGET)         $(build-dtimage-target) 在"build/core/Makefile"中用下面语句使它被编入boot.img。 ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true)   INTERNAL_BOOTIMAGE_ARGS += --dt $(INSTALLED_DTIMAGE_TARGET)   BOOTIMAGE_EXTRA_DEPS   s:= $(INSTALLED_DTIMAGE_TARGET) endif

微信扫码订阅
UP更新不错过~
关注
  • 0
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_39634132

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值