(DT系列一)DTS结构及其编译方法

转载地址:https://blog.csdn.net/lichengtongxiazai/article/details/38941891

一:主要问题

1,需要了解dtsidts的关系

2,dts的结构模型

3,dts是如何被编译的,以及编译后会生成一个什么文件.


二:参考文字

1DTS(device tree source)

.dts文件是一种ASCII文本格式的DeviceTree描述。基本上,在ARMLinux内,一个.dts文件对应一个ARMmachine,一般放置在内核的arch/arm/boot/dts/目录。由于一个SoC可能对应多machine(一个SoC可以对应多个产品和电路板),势必这些.dts文件需包含许多共同的部分。Linux内核为了简化,把SoC公用的部分或者多个machine共同的部分一般提炼为.dtsi,类似于C语言的头文件。其他的machine对应的.dtsinclude这个.dtsi



2dts的结构模型

为了了解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-addressunit-address的具体格式是和设备挂在那个bus上相关。例如对于cpu,其unit-address就是从0开始编址,以此加一。而具体的设备,例如以太网控制器,其unit-address就是寄存器地址。rootnodenodename是确定的,必须是/”



3dts是如何被编译的,以及编译后会生成一个什么文件。

    1. 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项目。

    1. DeviceTree Blob (.dtb)

.dtb.dtsDTC编译后的二进制格式的DeviceTree描述,可由Linux内核解析。通常在我们为电路板制作NANDSD启动image时,会为.dtb文件单独留下一个很小的区域以存放之,之后bootloader在引导kernel的过程中,会先读取该.dtb到内存。

  1. 源代码体现

有两种方式使用DT。第一种可包含多个dtb,编入dt.img,放入boot.img。第二种只包含一个dtb,直接追加到kernelimage后面,放入boot.img
dtc
编译在kernel/AndroidKernel.mk中定义。先用定义"DTS_NAMES"变量,它的每个entry(记为"DTS_NAME"变量,下面的$$arch)中可能有archrev两部分,和.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"命令就是生成带DTkernelimage

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一种常用的HTML结构,用于表示一个列表或定义列表。具体的含义如下: - `<div>`:表示一个区域或容器,可以用于组织和布局页面中的元素。 - `<dl>`:表示一个定义列表,其中包含一个或多个术语和其对应的定义。 - `<dt>`:表示定义列表中的一个术语,通常用粗体或斜体显示。 - `<dd>`:表示定义列表中术语对应的定义,通常用普通文本显示。 例如,以下代码表示一个简单的定义列表: ``` <div> <dl> <dt>HTML</dt> <dd>HyperText Markup Language,超文本标记语言。</dd> <dt>CSS</dt> <dd>Cascading Style Sheets,层叠样式表。</dd> </dl> </div> ``` 在页面中,该结构将被渲染为一个包含两个术语和其对应定义的列表。其中,术语用粗体显示,定义用普通文本显示。 ### 回答2: div dl dt dd结构是一种在HTML中用于定义列表的标签结构。其中div代表着一个主体区块的容器,而dl则表示一个定义列表。dt标签用于定义列表中的项目,通常用于显示项目的标题或标签,而dd标签用于给出每个项目的具体描述或定义。 使用这种结构可以方便地展示出具有标题和描述的项目列表。例如,可以用div dl dt dd结构来展示商品的特点与说明。在dl标签中,dt标签可以表示商品的特点,而dd标签则用于给出详细的特点描述。这样,用户可以通过项目标题快速浏览特点,然后点击展开对应的描述内容。 除了用于商品特点的展示,div dl dt dd结构还可以用于展示其他类型的列表,如学校课程和下拉菜单等。通过使用这种结构,可以使信息的展示更加清晰、有序,并且可以为用户提供更好的浏览和查找体验。 总之,div dl dt dd结构是HTML中用于定义列表的一种标签结构,通过使用这种结构可以方便地展示具有标题和描述的项目列表,适用于各种信息展示和分类的需求。 ### 回答3: div、dl、dt、dd是HTML中常用的标签,用于创建一种结构化的列表。以下是对这些标签的解释: div:div是HTML中的一个块级元素,用于创建一个容器,可以用来组织和布局页面上的内容。它可以包含其他HTML元素,如文本、图片、列表等。 dl:dl是definition list的缩写,用于创建一个有序的定义列表。它通常与dt和dd标签配合使用。在dl标签中,dt用于定义术语(term),而dd用于提供关于术语的定义(definition)。 dtdt是definition term的缩写,用于定义一个术语。它通常位于dl标签中的第一行,并与之后的dd标签一起构成一个定义对。 dd:dd是definition description的缩写,用于提供关于术语的定义。它通常位于dt标签之后,并与之组成一个定义对。一个dt元素可以对应多个dd元素,表示多个定义。 使用div dl dt dd可以创建一种结构化的列表,使页面更加清晰和易读。例如,可以使用dl dt dd来呈现一个词汇表,dt元素表示术语,而dd元素表示术语的定义。另外,通过CSS样式可以自定义dl dt dd的外观,使其适应不同的设计需求。 总之,div、dl、dt、dd的结构可用于创建有序的定义列表,提供术语和定义对之间的关系,并能够根据需要进行样式化定制,以便更好地组织和呈现页面内容。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值