Linux驱动开发之设备树(一)

2次阅读

设备树(一)

来源

在没有设备树之前Linux内核源码中有着大量的板级描述信息,这些.c和.h文件被硬编码进了Linux内核中,导致内核臃肿,因此,为了将这些板级描述信息从Linux中分离出来,用一个专属的文件格式来描述,这个专属文件就叫做设备树,文件扩展名为.dts

将各种不同的描述信息里面相同的部分抽取出来,类似于.h文件,这个文件的后缀名为.dtsi

DTS 是设备树源码文件, DTB 是将DTS 编译以后得到的二进制文件。将.c 文件编译为.o 需要用到 gcc 编译器,那么将.dts 编译为.dtb 需要用到 DTC 工具

DTS语法

.dtsi 头文件

因此在.dts 设备树文件中,可以通过“#include”来引用.h,.dtsi.dts 文件。只是,我们在编写设备树头文件的时候最好选择.dtsi 后缀。

设备树是采用树形结构来描述板子上的设备信息的文件,每个设备都是一个节点,叫做设备节点,每个节点都通过一些属性信息来描述节点信息,属性就是键—值对。

在设备树中节点命名格式如下:[label][:]node-name@unit-address

其中node-name是节点名字,为ASCII字符串,unit-address一般表示设备的地址或者寄存器首地址,如果某个节点没有地址或者寄存器的话unit-address可以不要。

引入 label 的目的就是为了方便访问节点,可以直接通过&label 来访问这个节点,比如通过&cpu0 就可以访问“cpu@0”这个节点,而不需要输入完整的节点名字 。

标准属性
compatiable属性

compatiable属性也叫兼容性属性,其值是一个字符串列表,compatiable属性用于将设备和驱动绑定起来。字符串列表用于选择设备所要使用的驱动程序 .

compatiable属性的值格式如下:

manufacturer,model

其中manufacturer表示厂商,model一般是模块对应的驱动名字

这个属性值可以是字符串列表,比如 compatible = "cirrus,my_cs42l51","cirrus,cs42l51";

这样我们的设备就有两个属性值,这个设备首先使用第一个兼容值在 Linux 内核里面查找,看看能不能找到与之匹配的驱动文件,如果没有找到的话就使用第二个兼容值查,以此类推,直到查找完 compatible 属性中的所有值

model属性

model 属性值也是一个字符串,一般 model 属性描述开发板的名字或者设备模块信息

status属性

status属性是和设备状态有关的,可选值如下

描述
“okay”表明设备是可操作的。
“disabled”表明设备当前是不可操作的,但是在未来可以变为可操作的,比如热插拔设备 插入以后。至于 disabled 的具体含义还要看设备的绑定文档。
“fail”表明设备不可操作,设备检测到了一系列的错误,而且设备也不大可能变得可 操作。
“fail-sss”含义和“fail”相同,后面的 sss 部分是检测到的错误内容。
#address-cells#size-cells 属性

这两个属性的值都是无符号32位整型,

#address-cells #size-cells 这两个属性可以用在任何拥有子节点的设备中,用于描述子节点的地址信息。 #address-cells 属性值决定了子节点 reg 属性中地址信息所占用的字长(32 位), #size-cells 属性值决定了子节点 reg 属性中长度信息所占的字长(32 位)

#address-cells#size-cells 表明了子节点应该如何编写 reg 属性值,一般 reg 属性都是和地址有关的内容,和地址相关的信息有两种:起始地址和地址长度, reg 属性的格式为:reg = <address1 length1 address2 length2 address3 length3……>每个“address length”组合表示一个地址范围,其中 address 是起始地址, length 是地址长度, #address-cells 表明 address 这个数据所占用的字长, #size-cells 表明 length 这个数据所占用的字长

reg属性

reg 属性的值一般是(address, length)对。 reg 属性一般用于描述设备地址空间资源信息或者设备地址信息, 比如某个外设的寄存器地址范围信息, 或者 IIC器件的设备地址等

range属性

ranges属性值可以为空或者按照(child-bus-address,parent-bus-address,length)格式编写的数字矩阵, ranges 是一个地址映射/转换表, ranges 属性每个项目由子地址、父地址和地址空间长度这三部分组成:

  • child-bus-address:子总线地址空间的物理地址,由父节点的#address-cells 确定此物理地址所占用的字长。
  • parent-bus-address: 父总线地址空间的物理地址,同样由父节点的#address-cells 确定此物理地址所占用的字长。
  • length: 子地址空间的长度,由父节点的#size-cells 确定此地址长度所占用的字长。如果 ranges 属性值为空值,说明子地址空间和父地址空间完全相同,不需要进行地址转换
name 属性

name属性值为字符串,name属性用于记录节点名字,name属性已经被弃用

device_type属性

device_type 属性值为字符串, IEEE 1275 会用到此属性,用于描述设备的 FCode,但是设备树没有 FCode,所以此属性也被抛弃了。此属性只能用于 cpu 节点或者 memory 节点。

向节点追加或者修改内容

一种方法是直接在对应节点下添加节点,但是如果有其他dts引用了这个文件,那么这里的修改也会被引用到,但这里的修改对于其他dts来说是多余的,因此,不能直接添加。

我们可以使用&节点名来引用到我们想要添加到的节点,然后进行修改。

liubobo
版权声明:本站原创文章,由 liubobo2022-05-10发表,共计2402字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。