设备树快速入门

A devicetree is a data structure for describing hardware.

一个用于描述硬件的数据结构。

https://www.devicetree.org/

基本概念

Dtsi——类似于c语言的头文件

Dts——类似于c语言的源文件

Dtb——类似于c语言的编译产物、二进制文件

使用device tree,用户需要了解自己的硬件配置和系统运行参数,并把这些信息组织成device tree source file。DT是描述系统中的硬件信息,那些可以被动态探测到的硬件设备不需要描述。通过dtc(device tree compiler),可以将dts变成适合机器处理的dtb(device tree blob)。

Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离。在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写。

设备树主要有三个作用:

1、识别平台单板 2、运行参数配置 3、设备构建

语法

1、设备树语法格式

DT的基本单元是node(节点),这些node被组织成树状结构。每个node包含了若干个property/value,描述node的一些特性。一个设备树只能有一个root node(根节点),其名字必须是‘/’。引用设备树某个节点,可以使用全路径,也可以使用句柄等方式。

一个Node被定义为如下形式:

[label:] node-name[@unit-address] { 

[properties [= value] ] 

[child nodes] 

}

A.[]——表示可选项

B.label:——标签,方便dts文件的引用,通过符号‘&’进行引用

C.node-name——节点名字

D.@unit-addresss——如果node没有reg属性,不需要该选项;如果有就必须和reg第 一个地址相等(The unit-address must match the first address specified in the

reg property of the node——摘自Devicetree Specification Release v0.2,章节2.2.1 Node Names)。Unit-address具体格式和设备挂在哪个bus上相关。比如:对于cpu, 其unit-address就是从0开始编址;如果是串口控制器,其就是寄存器地址。

E.property——设备属性

非标准的属性名字应该以该公司或者组织名称开头,比如:fsl,channel-fifo-len=<?>; zrevmm,vdev = "proxy";

也定义了一些标准的属性:“compatible”,“model”,"device_type"都是用来表示 节点基本信息的,compatible = "virtio,mmio";

F.= value——属性的定义是多种多样的,可以是空值、整型或者字符串。

G.child nodes——和Node格式一样

2、常见属性实例

“compatible”属性是用来匹配驱动的,他的类型是字符串数组,每个字符串表示一种设备的类型,从具体到一般。举个例子就比较清楚了,比如某个串口控制器节点的属性”compatible = “fsl,mpc8641-uart”, “ns16550"“。第一个字符串“fsl,mpc8641-uart”前边部分是厂商(推测是frescale),后边部分是控制器具体型号,这个形式也是规范建议的标准写法。第二个字符串ns16550表示一类符合同一标准的串口控制器,比第一个字符串表示的范围更大。内核匹配驱动时首先看是否有匹配第一个字符串的驱动,如果没有的话再匹配第二个(如果有更多的,依次类推,所以优先匹配前边的)。

"model"属性用来表示设备的型号,用字符串表示,不像"compatible"用多个字符串,只需一个就够了。

"device_type"属性用来表示设备类型,用字符串表示。

@后地址和reg后第一个地址关系说明。它两数值必须得一致。

 

下面举一个实例节点分析:

对应的dts源码

/{

  cpus{

    cpu@0{

    };

    cpu@1{

    };

  };

  memory@0{

  };

  uart@fe001000{

  };

  ethernet@fe002000{

  };

  ethernet@fe003000{

  };

};

猜你喜欢

转载自blog.csdn.net/jqh_111/article/details/83212323