diff --git a/Software/Development/OperatingSystem/Linux/Kernel/Modules/DeviceTree/DeviceTree.md b/Software/Development/OperatingSystem/Linux/Kernel/Modules/DeviceTree/DeviceTree.md index 4ab66cf..d7bb378 100644 --- a/Software/Development/OperatingSystem/Linux/Kernel/Modules/DeviceTree/DeviceTree.md +++ b/Software/Development/OperatingSystem/Linux/Kernel/Modules/DeviceTree/DeviceTree.md @@ -32,11 +32,46 @@ dtb:编译 dtc 后得到的二进制设备树文件,Linux 内核可加载和 包含一个根节点和多个子节点,如果在 dts/dtsi 中写了多个根节点,则在编译后被组合成一个根节点。子节点可嵌套。 节点会被展开为 device,其 compatible 属性用于与 driver 的 compatible 属性项匹配,如果匹配成功则调用该 driver 的 probe 函数。 -属性值可以为整数或字符串。使用“//”进行行注释或“/**/”进行块注释。一个简单的 dts 文件示例如下: +属性值可以为整数或字符串。如果为整数则用“<>”括起来,“<>”中可以有多个单元,称为 cell,cell 间使用空格隔开,不同的 cell 可以有不同的含义。字符串使用英文双引号括起来。 + +DTS 中使用“//”进行行注释或“/**/”进行块注释。 + +### 设备节点 + +设备节点采用: + +```dts +[label]:[@] +``` + +的格式来标识。挂到内存空间的设备,其 unit-address 一般是内存地址。别的地方可以通过标签来引用该节点。 + +### reg 属性和 address-cells、size-cells + +子节点的“reg”属性由“address”字段和“size”字段构成,如: + +```dts +reg = ; +``` + +属性“#address-cells”描述了子节点的“reg”属性的“address”字段为几个 32bit 的整型数据。 + +属性“#size-cells”描述了子节点的“reg”属性的“size”字段为几个 32bit 整型数据,如果为 0,则没有 lenth 字段。 + +### 中断连接 + +* interrutt-controller:属性为空,表明“我是中断控制器”; +* #interrupt-cells:表明连接此中断控制器的设备的中断属性的 cell 大小,也就是 interrupt = <> 属性的 cell 大小; +* interrupt-parent:设备节点通过这个关键字指定其依附的中断控制器 phandle,如果没有指定,则继承父节点的 interrupt-parent 配置; +* interrupt:设备节点里使用,一般包含中断号、触发方法等。具体有多少个 cell,由 #interrupt-cells 决定,每个 cell 的具体含义,一般由驱动的实决定,一般会在绑定文件里说明。 + +### DTS 示例 + +一个简单的 dts 文件示例如下: ```dts / { -     compatible = "acme,coyotes-rev +     compatible = "acme,coyotes-rev"     #address-cells = <1>;  // 描述下一级子节点的数据属性     #size-cells = <1>;     interrupt-parent = <&intc>;