1.基础

  • .dts: device tree source
  • .dtsi:   device tree source include
  • .dts比作源文件,.dtsi比作头文件。
  • dtc是linux源码 /scripts/dtc 目录下的工具,它把.dts编译成 .dtb。
  • .dtb是.dts被DTC编译后的二进制格式的DeviceTree描述,可由Linux内核解析,bootloader在引导kernel的过程中,会先读取该.dtb到内存。

2.dts书写规范

http://blog.csdn.net/lichengtongxiazai/article/details/38941997

3.dts基本元素

  • 节点,
  • compatible
  • reg,
  • ranges,
  • 中断控制器等

3.1节点

  .dts(或者其include的.dtsi)基本元素为结点和属性。举例说明节点的概念:

 / {
node1 {
a-string-property = "A string";
a-string-list-property = "first string", "second string";
a-byte-data-property = [0x01 0x23 0x34 0x56];
child-node1 {
first-child-property;
second-child-property = <>;
a-string-property = "Hello, world";
};
child-node2 {
};
};
node2 {
an-empty-property;
a-cell-property = < >; /* each number (cell) is a uint32 */
child-node1 {
};
};
};

  1个root结点"/";root结点下面含一系列子结点,本例中为"node1"和 "node2";

结点"node1"下又含有一系列子结点,本例中为"child-node1"和 "child-node2";

  各结点都有一系列属性。这些属性可能为空,如"an-empty-property";可能为字符串,如"a-string-property";可能为字符串数组,如"a-string-list-property";可能为Cells(由u32整数组成),如"second-child-property",可能为二进制数,如"a-byte-data-property"。

  子结点的命名遵循的组织形式为:<name>[@<unit-address>],<>中的内容是必选项,[]中的则为可选项。name是一个ASCII字符串,用于描述结点对应的设备类型,如3comEthernet适配器对应的结点name宜为ethernet,而不是3com509。如果一个结点描述的设备有地址,则应该给出@unit-address。多个相同类型设备结点的name可以一样,只要unit-address不同即可。设备的unit-address地址也经常在其对应结点的reg属性中给出。

3.2 compatible

  在.dts文件的每个设备,都有一个compatible属性,compatible属性用户驱动和设备的绑定。compatible属性是一个字符串的列表,列表中的第一个字符串表征了结点代表的确切设备,形式为"<manufacturer>,<model>",其后的字符串表征可兼容的其他设备。可以说前面的是特指,后面的则涵盖更广的范围。

举例说明:FreescaleMPC8349 SoC含一个串口设备,它实现了国家半导体(NationalSemiconductor)的ns16550寄存器接口。则MPC8349串口设备的compatible属性为compatible= "fsl,mpc8349-uart","ns16550"。其中,fsl,mpc8349-uart指代了确切的设备,ns16550代表该设备与NationalSemiconductor 的16550UART保持了寄存器兼容。

3.3 reg

  可寻址的设备使用如下信息来在DeviceTree中编码地址信息:

  • reg

  • #address-cells

  • #size-cells

  其中reg的组织形式为reg= <address1 length1 [address2 length2] [address3 length3] ...>,其中的每一组addresslength表明了设备使用的一个地址范围。address为1个或多个32位的整型(即cell),而length则为cell的列表或者为空(若#size-cells= 0)。address和 length字段是可变长的,父结点的#address-cells和#size-cells分别决定了子结点的reg属性的address和length字段的长度。

3.4 ranges

  ranges是地址转换表,其中的每个项目是一个子地址、父地址以及在子地址空间的大小的映射。映射表中的子地址、父地址分别采用子地址空间的#address-cells和父地址空间的#address-cells大小。举例如下:

ranges = <   0x10100000   0x10000     // Chipselect 1, Ethernet
0x10160000 0x10000 // Chipselect 2, i2c controller
0x30000000 0x1000000>; // Chipselect 3, NOR Flash

  对于本例而言,子地址空间的#address-cells为2,父地址空间的#address-cells值为1,因此00 0x101000000x10000的前2个cell为external-bus后片选0上偏移0,第3个cell表示external-bus后片选0上偏移0的地址空间被映射到CPU的0x10100000位置,第4个cell表示映射的大小为0x10000。ranges的后面2个项目的含义可以类推。

3.5 中断控制器

  DeviceTree中还可以中断连接信息,对于中断控制器而言,它提供如下属性:interrupt-controller– 这个属性为空,中断控制器应该加上此属性表明自己的身份;#interrupt-cells– 与#address-cells和#size-cells相似,它表明连接此中断控制器的设备的interrupts属性的cell大小。

在整个DeviceTree中,与中断相关的属性还包括:interrupt-parent– 设备结点透过它来指定它所依附的中断控制器的phandle,当结点没有指定interrupt-parent时,则从父级结点继承。

interrupts–用到了中断的设备结点透过它指定中断号、触发方法等,具体这个属性含有多少个cell,由它依附的中断控制器结点的#interrupt-cells属性决定。而具体每个cell又是什么含义,一般由驱动的实现决定,而且也会在DeviceTree的binding文档中说明。值得注意的是,一个设备还可能用到多个中断号。除了中断以外,在ARMLinux中clock、GPIO、pinmux都可以透过.dts中的结点和属性进行描述。

3.6 Dts需注意的地方

  dts除了以上规则外,也可以自己加一些自定义的属性和子节点,但是一定要符合以下的几个规则:

  • 新的设备属性一定要以厂家名字做前缀,这样就可以避免他们会和当前的标准属性存在命名冲突问题;
  • 新加的属性具体含义以及子节点必须加以文档描述,这样设备驱动开发者就知道怎么解释这些数据了。描述文档中必须特别说明compatible的value的意义,应该有什么属性,可以有哪个(些)子节点,以及这代表了什么设备。每个独立的compatible都应该由单独的解释。
  • 新添加的这些要发送到devicetree-discuss@lists.ozlabs.org邮件列表中进行review,并且检查是否会在将来引发其他的问题。

  在一个树状结构的devicetree中,如何引用一个node呢?要想唯一指定一个node必须使用fullpath,例如/node-name-1/node-name-2/node-name-N。

  属性(property)值标识了设备的特性,它的值(value)是多种多样的:

  • 可能是空,也就是没有值的定义。例如上图中的64-bit,这个属性没有赋值。
  • 可能是一个u32、u64的数值(值得一提的是cell这个术语,在DeviceTree表示32bit的信息单位)。例如#address-cells= <1> 。当然,可能是一个数组。例如<0x000000000x00000000 0x00000000 0x20000000>
  • 可能是一个字符串。例如device_type= "memory" ,当然也可能是一个stringlist。例如"PowerPC,970"

  在描述DeviceTree的结构时,那些可以动态探测到的设备是不需要描述的,例如USBdevice。不过对于SOC上的usbhost controller,它是无法动态识别的,需要在devicetree中描述。同样的道理,在computersystem中,PCIdevice可以被动态探测到,不需要在devicetree中描述,但是PCIbridge如果不能被探测,那么就需要描述之。

.dtsi .dts dtc dtb 是什么的更多相关文章

  1. dts、dtb编译

    设备树(Device Tree)包括DTC(device tree compiler),DTS(device tree source和DTB(device tree blob). dtc编译器能够把 ...

  2. TX2 dts、dtb编译与反编译

    设备树(Device Tree)包括DTC(device tree compiler),DTS(device tree source和DTB(device tree blob). dtc编译器能够把 ...

  3. 2、设备树的规范(dts和dtb格式)

    第01节_DTS格式(1) 语法:Devicetree node格式:[label:] node-name[@unit-address] { [properties definitions]      ...

  4. 《linux设备驱动开发详解》笔记——18 ARM linux设备树

    18.1 设备树的起源 linux 2.6及之前,大量板级信息被硬编码到内核里,十分庞大,大量冗余代码: linux 2.6之前,引入了设备树: 设备树源于OpenFirmware,描述硬件的数据结构 ...

  5. 如何将dtb反编译成dts

    点击打开链接 由于device tree会将一个node的信息分布在各个文件里,查看起来很不方便,比如如下例子,ldb在三个文件中都有配置: imx6qdl-sabresd.dtsi: [plain] ...

  6. dtb和dtc文件浅析

    目录 dtb和dtc文件浅析 工具集 dts格式 dtb头部结构 dtb标识符 分析具体的文件 title: dtb和dtc文件浅析 date: 2019/4/25 20:09:38 toc: tru ...

  7. [device tree] How to decompile a compiled .dtb (device tree blog) into .dts (device tree source).

    $ ./out/target/product/project_name/obj/KERNEL_OBJ/scripts/dtc/dtc -I dtb -O dts -o decompiled.dts ~ ...

  8. linux下如何将dts转换成dtb?

    答: 使用dtc工具,如: <kernel source code dir>/scripts/dtc/dtc -I dts -O dtb -o <dtb filename> & ...

  9. device tree DTB DTC 相互转换

    DTB --> DTS ./dtc -I dtb -O dts *.dtb -o *.dts DTS -> DTB ./dtc -I dts -O dtb -o test.dtb test ...

随机推荐

  1. java获取到机器IP地址及MAC码

    import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.InetAddress; import java.ne ...

  2. DWR实现后台推送消息到web页面

    DWR简介 DWR(Direct Web Remoting)可用于实现javascript直接调用java函数和后台直接调用页面javascript代码,后者可用作服务端推送消息到Web前端. (服务 ...

  3. 解决Windows下网络原因Composer安装失败问题

    由于Composer镜像都在国外,所以直接在官网下载Windows Installer后安装很多情况下是无法成功安装的. 解决办法: 1,将php添加到系统环境变量,并开启openssl扩展. 2,点 ...

  4. IOS 支持HTTPS调用(AFNetWorking框架)

    1.ATS开关开启2.manager.securityPolicy.allowInvalidCertificates = YES; manager.securityPolicy.validatesDo ...

  5. python中的GIL(全局解释锁)多线程能够提升效率

    预启动的时候,应用程序仍然会调用 OnLaunched 方法的,在 OnLaunched 方法调用之后,会马上发生 Suspending 事件,随后应用就会暂停. 我先基于develop主分支拉出一个 ...

  6. U家面试prepare: Serialize and Deserialize Tree With Uncertain Children Nodes

    Like Leetcode 297, Serialize and Deserialize Binary Tree, the only difference, this is not a binary ...

  7. nodejs require//////////z

    背景 这篇文基本都是反对的,反对的很有道理,不是说我这篇文章的内容错误,因为这篇文章是我在健身房学习node的时候写的,这些知识都很粗糙,后来发现官方的稳定更详细:地址:http://nodejs.o ...

  8. mysql免安装方法

    在官网上下载了个mysql-installer-community-5.6.27.0.msi,需要安装环境,检测未通过,很麻烦.之后网上查了资料之后直接下载了个压缩包mysql-5.6.27-winx ...

  9. Struts2下载文件点取消出现的异常解决

    struts2点击下载,如果正常下载不会报错,可是如果点击取消就会报如下的错误: Java.lang.IllegalStateException: Cannot call sendError() af ...

  10. 使用Docker构建redis集群--最靠谱的版本

    1集群结构说明 集群中有三个主节点,三个从节点,一共六个结点.因此要构建六个redis的docker容器.在宿主机中将这六个独立的redis结点关联成一个redis集群.需要用到官方提供的ruby脚本 ...