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

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 的设备树源文件; dtsi可被 #include 的设备树源文件;
dts设备树源文件 dts设备树源文件,适合阅读
dtc编译 dts 和 dtsi 后得到的设备树文件dts 及 dtsi 中的内容被组合或覆盖该文件为源码形式Linux 内核无法识别; dtc编译 dts 和 dtsi 后得到的设备树文件dts 及 dtsi 中的内容被组合或覆盖该文件为源码形式Linux 内核无法识别;
dtb即 Device Tree Blob编译 dtc 后得到的二进制设备树文件Linux 内核可加载和识别其中的内容。 dtb即 Device Tree Blob编译 dtc 后得到的二进制设备树文件,适合内核进行处理,Linux 内核可加载和识别其中的内容。
如果谋 dts 文件引用了谋 dtsi 文件,可以在 dts 中覆盖 dtsi 中的部分内容。 如果谋 dts 文件引用了谋 dtsi 文件,可以在 dts 中覆盖 dtsi 中的部分内容。
@ -42,9 +42,11 @@ dtb即 Device Tree Blob编译 dtc 后得到的二进制设备树文件L
DTB(Devicetree Blob) 是 DTS 的二进制文件格式Kernel 使用 DTC 工具将 DTS 源文件编译成 DTBbootloader 再将 DTB 文件传递给 Kernel 解析。 DTB(Devicetree Blob) 是 DTS 的二进制文件格式Kernel 使用 DTC 工具将 DTS 源文件编译成 DTBbootloader 再将 DTB 文件传递给 Kernel 解析。
不遵守标准书写的 DTS 文件在编译的时候会报错。
### Bootloader ### 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 文件中加入 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 语法
设备树包含一个根节点和多个子节点,如果在 dts/dtsi 文件中写了多个根节点,则在编译后被组合成一个根节点。子节点可嵌套。 节点会被展开为 device其 compatible 属性用于与 driver 的 compatible 属性项匹配,如果匹配成功则调用该 driver 的 probe 函数。 ### 注释
DTS 中使用“//”进行行注释或“/**/”进行块注释。 DTS 中使用“//”进行行注释或“/**/”进行块注释。
### 节点 ### 节点
节点使用: 设备树包含一个根节点和多个子节点,子节点可嵌套,形成父子关系,这样就可以方便的描述设备间的关系。节点会被展开为 device其 compatible 属性用于与 driver 的 compatible 属性项匹配。
节点的使用:
```dts ```dts
[label]:<node-name>[@<unit-address>] {} [label]:<node-name>[@<unit-address>] {}
@ -72,13 +76,13 @@ DTS 中使用“//”进行行注释或“/**/”进行块注释。
### 属性 ### 属性
属性必须包含在节点中,使用: 属性必须包含在节点中,每个设备的属性都用一组 key-value 对(键值对)来描述,每个属性的描述用英文“;“结束。例如,使用:
```dts ```dts
<property-name>=<value> <property-name>=<value>;
``` ```
来定义。属性值可以为整数或字符串。如果为整数则用“<>”括起来,“<>”中可以有多个单元,称为 cellcell 间使用空格隔开,不同的 cell 可以有不同的含义。字符串使用英文双引号括起来。同一属性的多个值可以使用英文“,”进行分割,例如: 来定义一个属性。属性值可以为整数或字符串。如果为整数则用“<>”括起来,“<>”中可以有多个单元,称为 cellcell 间使用空格隔开,不同的 cell 可以有不同的含义。字符串使用英文双引号括起来。同一属性的多个值可以使用英文“,”进行分割,例如:
```dts ```dts
reg = <0 0x00000000 0x04000000>, reg = <0 0x00000000 0x04000000>,
@ -89,7 +93,11 @@ reg = <0 0x00000000 0x04000000>,
#### compatible #### compatible
“compatible”属性通常用来 device 和 driver 的适配推荐的格式为”manufacturer,model”。 “compatible”属性通常用来匹配 device 和 driver一旦 Device Tree 中 compatible 属性值与 driver 的 compatible 字段一致,则触发该 driver 的 probe 函数。推荐 compatible 属性值使用如下格式:
```dts
compatible = ”manufacturer,model”;
```
Value type: stringlist Value type: stringlist
@ -184,7 +192,9 @@ reg = <address1 size1 [address2 size2] [address3 size3]...>;
* Interrupt Controllers中断控制器处理中断 * Interrupt Controllers中断控制器处理中断
* Interrupt Nexus中断联结路由中断给中断控制器。 * Interrupt Nexus中断联结路由中断给中断控制器。
##### Interrupt Generating Devices Property ##### Interrupt Generating Devices
主要有如下属性:
* interrupt属性用来定义设备的中断解析一般包含中断号、触发方法等。 * interrupt属性用来定义设备的中断解析一般包含中断号、触发方法等。
* interrupts属性用来定义设备的中断解析一般包含中断号、触发方法等。 * interrupts属性用来定义设备的中断解析一般包含中断号、触发方法等。
@ -229,12 +239,18 @@ IPI、PPI、SPI、SGI 是 ARM 规范的中断,含义如下:
#define IRQ_TYPE_LEVEL_LOW 8 #define IRQ_TYPE_LEVEL_LOW 8
``` ```
##### Interrupt Controllers Property ##### Interrupt Controllers
主要有如下属性:
* #interrupt-cells用来规定连接到该中断控制器上的设备的”interrupts”属性的解析长度 * #interrupt-cells用来规定连接到该中断控制器上的设备的”interrupts”属性的解析长度
* interrupt-controller用来声明当前 node 为中断控制器。 * interrupt-controller用来声明当前 node 为中断控制器。
##### Interrupt Nexus Property 一个SoC中可能有不止一个中断控制器。
##### Interrupt Nexus
主要有如下属性:
* #interrupt-cells用来规定连接到该中断控制器上的设备的”interrupts”属性的解析长度。 * #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”指定。 * 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 #### 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; * #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; * #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: For example:
```dts ```dts
compatible = "fsl,mpc8572ds" /{
compatible = "fsl,mpc8572ds"
}
``` ```
#### aliases #### 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) * [Device Tree 详解](http://kernel.meizu.com/device-tree.html)
* [ARM Linux 3.x的设备树Device Tree](https://blog.csdn.net/21cnbao/article/details/8457546) * [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) * [Linux Kernel DT(Device Tree)](https://www.jianshu.com/p/923b380366bb)