diff --git a/Software/Development/OperatingSystem/Linux/Kernel/Modules/DeviceTree/DeviceTree.md b/Software/Development/OperatingSystem/Linux/Kernel/Modules/DeviceTree/DeviceTree.md index 9f86ecc..5dd8c5b 100644 --- a/Software/Development/OperatingSystem/Linux/Kernel/Modules/DeviceTree/DeviceTree.md +++ b/Software/Development/OperatingSystem/Linux/Kernel/Modules/DeviceTree/DeviceTree.md @@ -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]:[@] {} @@ -72,13 +76,13 @@ DTS 中使用“//”进行行注释或“/**/”进行块注释。 ### 属性 -属性必须包含在节点中,使用: +属性必须包含在节点中,每个设备的属性都用一组 key-value 对(键值对)来描述,每个属性的描述用英文“;“结束。例如,使用: ```dts -= +=; ``` -来定义。属性值可以为整数或字符串。如果为整数则用“<>”括起来,“<>”中可以有多个单元,称为 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 = ; * 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 \ cells to represent the address in the reg property in children of root; * #size-cells:u32, Specifies the number of \ 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)