具有 GPIO 控制器和连接器的硬件配置的备树(Device Tree)代码讲解
背景
-学习Linux设备树
代码
soc {soc_gpio1: gpio-controller1 {#gpio-cells = <2>;};soc_gpio2: gpio-controller2 {#gpio-cells = <2>;};
};connector: connector {#gpio-cells = <2>;gpio-map = <0 0 &soc_gpio1 1 0>,<1 0 &soc_gpio2 4 0>,<2 0 &soc_gpio1 3 0>,<3 0 &soc_gpio2 2 0>;gpio-map-mask = <0xf 0x0>;gpio-map-pass-thru = <0x0 0x1>;
};expansion_device {reset-gpios = <&connector 2 GPIO_ACTIVE_LOW>;
};
代码讲解
- soc 节点
这个节点定义了两个 GPIO 控制器,soc_gpio1 和 soc_gpio2,每个控制器都有一个 #gpio-cells 属性:
soc_gpio1: gpio-controller1 和 soc_gpio2: gpio-controller2: 这两个节点代表两个不同的 GPIO 控制器。
#gpio-cells = <2>: 这个属性指定了每个 GPIO 的描述需要两个单元(通常是一个 GPIO 编号和一个标志)。
- connector 节点
这个节点定义了一个连接器,它将 GPIO 映射到不同的 GPIO 控制器上:
#gpio-cells = <2>: 这个属性与之前的 GPIO 控制器节点一致,表示每个 GPIO 描述需要两个单元。
gpio-map: 这个属性定义了 GPIO 映射的规则。每个条目表示一个 GPIO 映射:
<0 0 &soc_gpio1 1 0>: GPIO 0 映射到 soc_gpio1 控制器的 GPIO 1。
<1 0 &soc_gpio2 4 0>: GPIO 1 映射到 soc_gpio2 控制器的 GPIO 4。
<2 0 &soc_gpio1 3 0>: GPIO 2 映射到 soc_gpio1 控制器的 GPIO 3。
❤️ 0 &soc_gpio2 2 0>: GPIO 3 映射到 soc_gpio2 控制器的 GPIO 2。
gpio-map-mask: 这个属性指定了用于 GPIO 映射的掩码:
<0xf 0x0>: 这意味着只对前四个 GPIO 引脚应用映射规则。
gpio-map-pass-thru: 这个属性定义了 GPIO 的直通模式:
<0x0 0x1>: 这表示仅对 GPIO 1 启用直通模式。
3. expansion_device 节点
这个节点定义了一个扩展设备,使用连接器中的 GPIO 进行复位控制:
reset-gpios: 这个属性定义了设备的复位 GPIO:
<&connector 2 GPIO_ACTIVE_LOW>: 这表示使用 connector 节点中的第 2 个 GPIO,且该 GPIO 在低电平时有效 (GPIO_ACTIVE_LOW)。
总结
这段代码配置了两个 GPIO 控制器,并通过 connector 节点将这些控制器的 GPIO 通过映射规则连接起来。expansion_device 节点使用 connector 节点中的一个 GPIO 来控制设备的复位。此配置允许灵活地管理 GPIO,并且能够适配不同的 GPIO 控制器和设备需求。