设备树是什么树?

摸鱼写点东西

大家玩单片机的时候经常会遇到这样的情况,当我外设换个GPIO的时候,我又要改驱动代码,又要重新编译,

又要重新烧录。后来,在kernel中,越来越多人在代码中添加代码,去让gpio驱动支持多个引脚,人只要在代码中指定引脚就行。比较轻量化的平台还好,当手机芯片这种复杂的平台,这样做无疑是在shi山上加shi。

this whole ARM thing is a f*cking pain in the ass

所以,大佬们大手一挥,在kernel中引入了设备树这个神奇的东西。

在设备树中,用DTS文件,以树状图的形式去描述外设,无论是I2C、SPI还是GPIO控制器,他们就像是大树的主要枝干,从他们上再长出枝条,最终挂上一个又一个的果实(外设)。

当我们用ADB去控制手机的时候 我们cd 到SYS目录 我们会发现 有很多的文件夹 他们都以树状图的形式去衍生,并最终定义到某个设备的具体属性。

/sys/firmware/devicetree 目录下 可以看到对应的DTB文件去对应目录。

在linux启动启动时候,会先跑u boot (lk和preload),他们会去把设备树文件去读入内存,在启动内核的时候,告诉内核外设的地址和一些信息。

当然我们在开发过程中一般不会直接用dtb,而是DTS或者DTSI。什么是DTS呢?

DTS 是设备树源码文件, DTB 是将DTS 编译以后得到的二进制文件。

一般放在/arch/arm/boot/dts目录下。

而DTSI则是一种特殊的DTSI。我们知道手机的SOC可能有多个主板,那就有了多个DTS,而这些DTS肯定有很多

公共的部分,于是就用DTSI去把公共部分放一起,用在多个DTS中。只需要include *XX.dtsi就行。

而DTS和DTSI的代码,也是很有趣的。他们的结构一般为:

[label:] node-name[@unit-address] {
[properties definitions]
[child nodes]
};


image.png

reg中就是他的slave地址,外设手册里会写出来。

compatible表示兼容。一般根节点下也有compatible属性,用来选择哪一个“machine desc”。

一个内核可以支持多个machine,内核启动后节点会更具你的compatible,去寻找对应的初始化代码。

当然有的设备还有model,他可以具体表示你支持哪些硬件。

还有status,一般表示配置你用不用这个设备树,有disable和enable,在bring UP外设的时候,我就有忘了改这个浪费很多时间的时候。

其他的为一些初始化配置和描述。这个就是需要内核去解析的内容。在这些文件中,你可以将所以的外设去放进去,这样方便了我们的统一管理。

GOOD GOOD CODE DAYDAY UP