《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记
文章目录
- 设备树简介
- 设备树编译
- 设备树语法
- 设备根节点
- 设备子节点
- 节点名称
- reg 属性
- #address-cell 和 #size-cells 属性
- model 属性
- status 属性
- compatible 属性
- aliases 节点
- chosen 节点
- device_type 属性
- 自定义属性
设备树简介
什么是设备树
设备树是保留着存在于系统中的设备信息,当机器引导时,OS通过使用驱动程序和其他组件获得的信息建立此树,并且当添加或删除设备时更新此树。
上一篇笔记提到了平台设备模型,它将设备和驱动区分开来,一份驱动可以与多份设备匹配,但随着 device (板级文件)的增多,Linux 内核代码变得越来越多,这些代码相对于内核来说都算是”垃圾代码“,为了解决这个问题,linux 就引入了设备树来替代 device 文件。
既然设备树是用来替代平台总线 device 文件的,那么设备树的运作原理还是基于平台总线模型,只是设备树采用的是文本格式,不像 device.c 一样每次修改都要重新编译内核。
设备树基本名词
名词 | 含义 |
---|---|
DT | Device Tree 设备树 |
FDT | Flattened Device Tree 展开设备树,起源 OpenFirmware(OF) |
dts | device tree source 设备树源码 |
dtsi | device tree source include 通用的设备树源码 |
dtb | devicedevice tree blob dts 编译生成的文件 |
dtc | device tree compiler 设备树编译器 |
设备树编译
编译设备树命令:
dtc -I dts -O dtb -o xxx.dtb xxx.dts
反编译设备树:
dtc -I dtb -O dts -o xxx.dts xxx.dtb
示例:
设备树语法
设备根节点
根节点是设备树必须添加的节点,节点名为 /。
示例:
/dts-v1/; // dts 版本
/{ // 根节点
};
设备子节点
子节点格式:
[label:] node-name[@unit-address] {
[properties definitions]
[child nodes]
}
Tip:同级节点下节点名称不能相同,不同级别节点名称可以相同。
示例:
节点名称
在对节点命名时,需要体现设备的特征,如串口一般命名为 uart 或 serial,
节点名称是必选项,标签和设备地址是可选项,标签是节点的别名,设备地址用于区分不同的设备。
reg 属性
reg 属性用来描述地址信息,如寄存器地址,格式为:
reg = <addr1 len1 addr2 len2 ...>
#address-cell 和 #size-cells 属性
reg 属性的长度是可变的,#address-cell 和 #size-cells 属性用来决定 reg 的长度,比如下面这个例子,#address-cell 为 1,表示有一个地址,#size-cells 为 0,表示有 0 个地址长度。
model 属性
model 属性是一个字符串,用来描述设备信息,例如:
status 属性
status 属性表示设备的状态,该属性值是一个字符串,可取值包括:
status 值 | 含义 |
---|---|
okay | 设备可用 |
disabled | 设备不可用 |
fail | 设备不可用且有错误 |
fail-sss | 设备不可用且有 sss 错误(sss 是错误内容) |
示例:
compatible 属性
compatible 是设备树与驱动进行匹配的属性,属性值为字符串,compatible 属性值的推荐格式:"manufacturer,model"
(“厂商名,模块驱动名”)。
该属性可以有多个值,驱动会从第一个值开始匹配,示例:
aliases 节点
aliases 用来定义节点的别名,它和节点标签类似,但它可以批量定义别名。
示例:
chosen 节点
chosen 节点用来 uboot 给内核传递参数(重点是 bootargs 参数),该节点必须是根节点的子节点。
示例:
device_type 属性
device_type 属性值为字符串,只用于 cpu 或 memory 节点。
示例:
自定义属性
设备树可以自定义一些属性,
比如 mipi 背光参数,