Linux 内核 DTS ( Device Tree System ) 详解 — 基础篇


Linux Device Tree System (简称dts系统)是Linux社区的大牛们参考了PowerPC等体系架构中使用的Flattened Device Tree( FDT )采用Linux Device Tree System结构,许多硬件的细节可以直接透过它传递给Linux,而不再需要在kernel中进行大量的冗余编码。

Linux Device Tree System是一种描述硬件的数据结构,由一系列被命名的节点(node)和属性(property)组成,而结点本身可包含子结点。所谓属性,其实就是成对出现的名称和值,在Linux Device Tree System中,可描述的信息包括:CPU的数量和类别,内存基地址和大小,总线和桥,外设连接,中断控制器和中断使用情况,GPIO控制器和GPIO使用情况,Clock控制器和Clock使用情况。

通常由.dts文件以文本方式对系统设备树进行描述,经过Device Tree Compiler(dtc)将dts文件转换成二进制文件binary device tree blob(dtb),.dtb文件可由Linux内核解析,有了device tree就可以在不改动Linux内核的情况下,对不同的平台实现无差异的支持,只需更换相应的dts文件,即可满足。

基础说明:

1 、节点 Node 、属性 property 后续文字都采用中文描述,有必要代码时才采用英文描述。

2 、设备树结构块是一个线性化的结构体,以节点形式保存了目标单板上的设备信息。

3 、每个dts文件只有一个根节点,但可以 include 其他dtsi文件,dts文件在编译后会展开,同一节点的数据以最后一个定义的为准,具体可以参看编译后的.*.dtsi文件,dts文件也可以include *.h文件,使用h文件中定义好的宏来标示数和字符串等。

4 、每个节点只有一个父节点 ( parent node ) ,节点本身用节点名 ( node name ) 来标识,具体参看第二节节点的定义。

5 、 节点文件一般存在路径:arch/<cpu>/boot/dts/ 文件夹中,各平台分别对应。

节点的定义

节点的定义格式:

[标签: ] 节点名 [@unit-address(唯一地址)] {
     [属性 = 值]
     [子节点]
}

说明:
1、 CPU的unit-address (唯一地址) 为自编,其他的为reg值,若无reg属性,unit-address可不填写。

2、 根节点的节点名固定为’/’,且最后编译到系统的dts文件中必须存在此节点。

3、节点由属性和子节点组成,节点的命名参看以下几点:

  • 节点名是一个简单的ascii字符串,最长为31个字符
  • 同级节点的命名原则上必须是唯一,但多个节点的通用名称可以相同,只要地址不同就行。
  • 节点描述的设备有地址的话,就应该加上unit-address,unit-address通常是用来访问设备的主地址,并在节点的reg属性中被列出。

属性

属性是一些简单的键值对(key-value pairs):值可以为空也可以包含任意的字节流。以下为基本数据表示可以在device tree源文件中表示:

  • 文本字符串(null 终止)用双引号来表示:string-property = “a string”
  • Cells 是由尖括号分隔的32位无符号整数:cell-property = <0xbeef 123 0xabcd1234>
  • 二进制数据是用方括号分隔:binary-property = [0x01 0x23 0x45 0x67];
  • 不同格式的数据可以用逗号连接在一起:mixed-property = “a string”, [0x01 0x23 0x45 0x67], <0x12345678>;
  • 创建字符串列表用逗号创建,如:string-list = “red fish”, “blue fish”;

关键属性值说明:

1) compatible 此属性每个节点有且仅有一个,其值为字符串,用来标示此节点,系统依据此值来判断并调用的节点的其他值,此属性具有唯一性。

2) #address-cells  #size-cells 此2个属性是成对使用,用来表示此节点的子节点的reg值的数量,address-cells表示地址的数量,size-cells表示对应地址的值的数量。且cells表示32位无符号整数。

3) reg 如果一个节点有reg属性,则节点名称必须包含unit-address属性,unit-address属性值是reg属性中的第一个地址值。

4) aliases  此节点是用来给其他节点重命名的,增加文件的可读性。


后续增加具体项目的 dts 解析及dts系统的调用。

版权所有丨如未注明,均为原创,转载请注明转自:https://whonee.net/linux-device-tree-system-base.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注