调整组织结构,使条理更清晰.
Signed-off-by: rick.chan <chenyang@autoai.com>
This commit is contained in:
parent
6713147451
commit
4d878572c0
|
@ -26,11 +26,11 @@ linux 2.6 之后,引入了设备树。设备树源于 OpenFirmware,描述硬
|
|||
|
||||
dtsi:可被 #include 的设备树源文件;
|
||||
|
||||
dts:设备树源文件;
|
||||
dts:设备树源文件,适合阅读;
|
||||
|
||||
dtc:编译 dts 和 dtsi 后得到的设备树文件,dts 及 dtsi 中的内容被组合或覆盖,该文件为源码形式,Linux 内核无法识别;
|
||||
|
||||
dtb:即 Device Tree Blob,编译 dtc 后得到的二进制设备树文件,Linux 内核可加载和识别其中的内容。
|
||||
dtb:即 Device Tree Blob,编译 dtc 后得到的二进制设备树文件,适合内核进行处理,Linux 内核可加载和识别其中的内容。
|
||||
|
||||
如果谋 dts 文件引用了谋 dtsi 文件,可以在 dts 中覆盖 dtsi 中的部分内容。
|
||||
|
||||
|
@ -42,9 +42,11 @@ dtb:即 Device Tree Blob,编译 dtc 后得到的二进制设备树文件,L
|
|||
|
||||
DTB(Devicetree Blob) 是 DTS 的二进制文件格式,Kernel 使用 DTC 工具将 DTS 源文件编译成 DTB,bootloader 再将 DTB 文件传递给 Kernel 解析。
|
||||
|
||||
不遵守标准书写的 DTS 文件在编译的时候会报错。
|
||||
|
||||
### Bootloader
|
||||
|
||||
不遵守标准书写的 DTS 文件在编译的时候会报错。
|
||||
在系统启动的时候,bootloader(如 Uboot) 可以将保存在 flash 中的 DTB copy 到内存(还可以通过 bootloader 的交互式命令加载 DTB),并把 DTB 的起始地址传递给 kernel。
|
||||
|
||||
Uboot mainline 从 v1.1.3 开始支持 Device Tree,其对 ARM 的支持则是和 ARM 内核支持 Device Tree 同期完成。为了使能 Device Tree,需要编译 Uboot 的时候在 config 文件中加入
|
||||
|
||||
|
@ -56,13 +58,15 @@ Uboot mainline 从 v1.1.3 开始支持 Device Tree,其对 ARM 的支持则是
|
|||
|
||||
## DTS 语法
|
||||
|
||||
设备树包含一个根节点和多个子节点,如果在 dts/dtsi 文件中写了多个根节点,则在编译后被组合成一个根节点。子节点可嵌套。 节点会被展开为 device,其 compatible 属性用于与 driver 的 compatible 属性项匹配,如果匹配成功则调用该 driver 的 probe 函数。
|
||||
### 注释
|
||||
|
||||
DTS 中使用“//”进行行注释或“/**/”进行块注释。
|
||||
|
||||
### 节点
|
||||
|
||||
节点使用:
|
||||
设备树包含一个根节点和多个子节点,子节点可嵌套,形成父子关系,这样就可以方便的描述设备间的关系。节点会被展开为 device,其 compatible 属性用于与 driver 的 compatible 属性项匹配。
|
||||
|
||||
节点的使用:
|
||||
|
||||
```dts
|
||||
[label]:<node-name>[@<unit-address>] {}
|
||||
|
@ -72,13 +76,13 @@ DTS 中使用“//”进行行注释或“/**/”进行块注释。
|
|||
|
||||
### 属性
|
||||
|
||||
属性必须包含在节点中,使用:
|
||||
属性必须包含在节点中,每个设备的属性都用一组 key-value 对(键值对)来描述,每个属性的描述用英文“;“结束。例如,使用:
|
||||
|
||||
```dts
|
||||
<property-name>=<value>
|
||||
<property-name>=<value>;
|
||||
```
|
||||
|
||||
来定义。属性值可以为整数或字符串。如果为整数则用“<>”括起来,“<>”中可以有多个单元,称为 cell,cell 间使用空格隔开,不同的 cell 可以有不同的含义。字符串使用英文双引号括起来。同一属性的多个值可以使用英文“,”进行分割,例如:
|
||||
来定义一个属性。属性值可以为整数或字符串。如果为整数则用“<>”括起来,“<>”中可以有多个单元,称为 cell,cell 间使用空格隔开,不同的 cell 可以有不同的含义。字符串使用英文双引号括起来。同一属性的多个值可以使用英文“,”进行分割,例如:
|
||||
|
||||
```dts
|
||||
reg = <0 0x00000000 0x04000000>,
|
||||
|
@ -89,7 +93,11 @@ reg = <0 0x00000000 0x04000000>,
|
|||
|
||||
#### compatible
|
||||
|
||||
“compatible”属性通常用来 device 和 driver 的适配,推荐的格式为”manufacturer,model”。
|
||||
“compatible”属性通常用来匹配 device 和 driver,一旦 Device Tree 中 compatible 属性值与 driver 的 compatible 字段一致,则触发该 driver 的 probe 函数。推荐 compatible 属性值使用如下格式:
|
||||
|
||||
```dts
|
||||
compatible = ”manufacturer,model”;
|
||||
```
|
||||
|
||||
Value type: stringlist
|
||||
|
||||
|
@ -184,7 +192,9 @@ reg = <address1 size1 [address2 size2] [address3 size3]...>;
|
|||
* Interrupt Controllers,中断控制器,处理中断;
|
||||
* Interrupt Nexus,中断联结,路由中断给中断控制器。
|
||||
|
||||
##### Interrupt Generating Devices Property
|
||||
##### Interrupt Generating Devices
|
||||
|
||||
主要有如下属性:
|
||||
|
||||
* interrupt:属性用来定义设备的中断解析,一般包含中断号、触发方法等。
|
||||
* interrupts:属性用来定义设备的中断解析,一般包含中断号、触发方法等。
|
||||
|
@ -229,12 +239,18 @@ IPI、PPI、SPI、SGI 是 ARM 规范的中断,含义如下:
|
|||
#define IRQ_TYPE_LEVEL_LOW 8
|
||||
```
|
||||
|
||||
##### Interrupt Controllers Property
|
||||
##### Interrupt Controllers
|
||||
|
||||
主要有如下属性:
|
||||
|
||||
* #interrupt-cells:用来规定连接到该中断控制器上的设备的”interrupts”属性的解析长度;
|
||||
* interrupt-controller:用来声明当前 node 为中断控制器。
|
||||
|
||||
##### Interrupt Nexus Property
|
||||
一个SoC中可能有不止一个中断控制器。
|
||||
|
||||
##### Interrupt Nexus
|
||||
|
||||
主要有如下属性:
|
||||
|
||||
* #interrupt-cells:用来规定连接到该中断控制器上的设备的”interrupts”属性的解析长度。
|
||||
* interrupt-map:用来描述 interrupt nexus 设备对中断的路由。解析格式为 5 元素序列:child unit address, child interrupt specifier, interrupt-parent, parent unit address, parent interrupt specifier。其中:“child unit address”的 cells 长度由子节点的 “#address-cells” 指定; “child interrupt specifier”的 cells 长度由子节点的“#interrupt-cells”指定; “interrupt-parent” phandle 指向 interrupt controller 的引用; “parent unit address”的 cells 长度由父节点的“#address-cells”指定; “parent interrupt specifier”的 cells 长度由父节点的“#interrupt-cells”指定。
|
||||
|
@ -284,7 +300,7 @@ For example, the first row of the interrupt-map table specifies the mapping for
|
|||
|
||||
#### Root
|
||||
|
||||
每个 DeviceTree 只有一个根节点。根节点需要有以下必备属性:
|
||||
每个 Device Tree 只有一个根节点,用“/{}”表示,如果在 dts/dtsi 文件中写了多个根节点,则在编译后被组合成一个根节点。根节点需要有以下必备属性:
|
||||
|
||||
* #address-cells:u32, Specifies the number of \<u32\> cells to represent the address in the reg property in children of root;
|
||||
* #size-cells:u32, Specifies the number of \<u32\> cells to represent the size in the reg property in children of root;
|
||||
|
@ -294,7 +310,9 @@ For example, the first row of the interrupt-map table specifies the mapping for
|
|||
For example:
|
||||
|
||||
```dts
|
||||
compatible = "fsl,mpc8572ds"
|
||||
/{
|
||||
compatible = "fsl,mpc8572ds"
|
||||
}
|
||||
```
|
||||
|
||||
#### aliases
|
||||
|
@ -1863,6 +1881,7 @@ node:设备节点。
|
|||
|
||||
## 参考资料
|
||||
|
||||
* [Linux 驱动学习笔记 - 设备树常用 OF 函数(五)](https://blog.csdn.net/tyustli/article/details/105444648)
|
||||
* [Device Tree 详解](http://kernel.meizu.com/device-tree.html)
|
||||
* [ARM Linux 3.x的设备树(Device Tree)](https://blog.csdn.net/21cnbao/article/details/8457546)
|
||||
* [Linux Kernel DT(Device Tree)](https://www.jianshu.com/p/923b380366bb)
|
||||
|
|
Loading…
Reference in New Issue