设备树详讲
一. DTS 语法
1.1. dts 头文件
1.1.1. 可以使用#include来引用
1.2. 关于/dts-v1/;
1.2.1. 用于dts的版本信息,一般使用/dts-v1/版本
1.3. 设备节点
1.3.1. 分析下图节点
<1>. “/”是跟节点,每个设备树只有一个根节点
<2>.设备树中节点命名格式如下 :
node-name@unit-address
有时我们看到的是:label: node-name@unit-address;引入 label 的目的就是为了方便访问节点 比如通过&cpu0 就可以访问“cpu@0”这个节点,上图的chosen,memory都属于label。
<3>. 每个节点都有不同属性,不同的属性又有不同的内容,属性都是键值对,值可以为空或任意的字节流。设备树源码中常用的几种数据形式:字符串,u32,数组
1.3.2. 标准属性
1.3.2.1. compatible 属性
compatible 属性也叫做“兼容性”属性,这是非常重要的一个属性! compatible 属性的值是 一个字符串列表, compatible 属性用于将设备和驱动绑定起来。字符串列表用于选择设备所要使用的驱动程序 ,compatible 属性的值格式 :"manufacturer,model" ,例如:
compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull"; //此compatible是有两个属性,用分号隔开
PS:根节点“/” 下的compatible 属性 用于查看是否支持此设备 ,取代设备ID。在没有使用设备树以前, uboot 会向 Linux 内核传递一个叫做 machine id 的值, machine id
也就是设备 ID
1.3.2.2. model属性
model 属性值也是一个字符串,一般 model 属性描述设备模块信息,比如名字什么的,例如:model = "wm8960-audio";
1.3.2.3. status属性
status 属性看名字就知道是和设备状态有关的, status 属性值也是字符串,字符串是设备的状态信息,可选的状态如下
1.3.2.4. #address-cells和#size-cells属性
这两个属性的值都是无符号 32 位整形, #address-cells 和#size-cells 这两个属性可以用在 任何拥有子节点的设备中,用于描述子节点的地址信息,直接上示例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/ { #address-cells = <0x2>; // 在root node下使用2个u32来代表address。 #size-cells = <0x1>; // 在root node下使用1个u32来代表size。 ... ... memory { // memory device ... reg = <0x90000000 00000000 0x800000>; // 0x90000000 00000000 是存取memory的address // 0x800000 是memory的size。 ... }; ... ... }
1.3.2.5. reg属性
reg 属性前面已经提到过了, reg 属性的值一般是(address, length)对。 reg 属性一般用于描述设备地址空间资源信息,一般都是某个外设的寄存器地址范围信息
1.3.2.6. device_type属性
device_type 属性值为字符串, IEEE 1275 会用到此属性,用于描述设备的 FCode,但是设备树没有 FCode,所以此属性也被抛弃了。此属性只能用于 cpu 节点或者 memory 节点。imx6ull.dtsi 的 cpu0 节点用到了此属性
1.3.3. 向节点追加或修改
1.3.3.1. 先看一下 I2C1 接口对应的节点,打开文件 imx6ull.dtsi 文件,找到如下所示内容:
1.3.3.2. 如果我们要添加直接的具体设备(mag311)以及修改参数,我们可以定义自己的dts文件,只要文件中#include “imx6ull.dtsi ”,
1.3.4. 特殊节点
在根节点“/”中有两个特殊的子节点: aliases 和 chosen
1.3.4.1. aliases 节点
单词 aliases 的意思是“别名”,因此 aliases 节点的主要功能就是定义别名,定义别名的目的就是为了方便访问节点。不过我们一般会在节点命名的时候会加上 label,然后通过&label来访问节点,这样也很方便,而且设备树里面大量的使用&label 的形式来访问节点
1.3.4.2. chosen 子节点
chosen 并不是一个真实的设备, chosen 节点主要是为了 uboot 向 Linux 内核传递数据,重点是 bootargs 参数。一般.dts 文件中 chosen 节点通常为空或者内容很少 。但是我们查看设备如下,东西属性不是kernal解析dts得到的,而是在核, bootargs 会作为 Linux 内核的命令行参数, Linux 内核启动的时候会打印出命令行参数(也uboot设置的。前面讲解 uboot 的时候说过,uboot 在启动 Linux 内核的时候会将 bootargs 的值传递给 Linux就是 uboot 传递进来的 bootargs 的值),此节点就是桥梁
chosen也可以设置参数:参考https://www.cnblogs.com/liushuhe1990/p/9704045.html
1.4. 文件系统中查看设备树属性
1.4.1. 进入设备查看设备树根目录
<1>. 设备树根位于/proc/device-tree
<2>. 可以进入相应子设备以及查看属性
1.5. 设备树常用of操作函数
常用操作函数位于include/linux/of.h