调整组织结构,使条理更清晰.

Signed-off-by: rick.chan <chenyang@autoai.com>
This commit is contained in:
rick.chan 2020-06-08 15:32:14 +08:00
parent 6713147451
commit 4d878572c0
1 changed files with 33 additions and 14 deletions

View File

@ -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 源文件编译成 DTBbootloader 再将 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>;
```
来定义。属性值可以为整数或字符串。如果为整数则用“<>”括起来,“<>”中可以有多个单元,称为 cellcell 间使用空格隔开,不同的 cell 可以有不同的含义。字符串使用英文双引号括起来。同一属性的多个值可以使用英文“,”进行分割,例如:
来定义一个属性。属性值可以为整数或字符串。如果为整数则用“<>”括起来,“<>”中可以有多个单元,称为 cellcell 间使用空格隔开,不同的 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-cellsu32, Specifies the number of \<u32\> cells to represent the address in the reg property in children of root;
* #size-cellsu32, 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)