Zephyr Devicetree详解 Devicetree绑定

由于Devicetree本身是一种相对非结构化的格式,它只能描述硬件设备的基本信息,缺乏严格的结构和语义约束,而缺乏的部分需要由Devicetree绑定来补齐。 Devicetree 绑定描述了对节点内容的要求,并提供有关节点内容的语义信息。与Linux Kernel使用dt-schema不同 Zephyr Devicetree 绑定是自定义格式的 YAML 文件。 Devicetree 节点使用compatible属性与绑定进行匹配。在配置阶段,构建系统尝试将Devicetree中的每个节点与绑定文件相匹配。成功后,构建系统在验证节点内容和为节点生成宏时都会使用绑定文件中的信息。

如何绑定 链接到标题

以下是dts和绑定文件的示例

dts中的一个节点

/* Node in a DTS file */
bar-device {
    compatible = "foo-company,bar-device";
    num-foos = <3>;
};

绑定文件

# A YAML binding matching the node

compatible: "foo-company,bar-device"

properties:
num-foos:
    type: int
    required: true

绑定的过程 链接到标题

  • 构建系统通过 bar-device compatible 属性与绑定的 compatible: 相匹配。来确认节点应该用哪个绑定文件。
  • 构建系统将使用上述绑定来检查 bar-device 节点中是否存在所需的 num-foos 属性,以及其值 <3> 是正确的int类型。 当绑定文件中没有num-foos构建将会报错。
  • 构建系统将为 bar-device 节点的 num-foos 属性生成一个宏,该宏的值为整型数字 3,该宏可以在C/C++ source code中被访问

compatible属性如何绑定 链接到标题

如果节点的 compatible 属性中有多个字符串,则构建系统会按列出的顺序查找兼容的绑定并使用第一个匹配项

baz-device {
    compatible = "foo-company,baz-device", "generic-baz-device";
};

如果构建系统找不到带有 compatible: “foo-company,baz-device” 行的绑定,则 baz-device 节点将与带有 compatible: “generic-baz-device” 行的绑定匹配

没有compatible属性的节点 链接到标题

没有compatible属性的节点按照下面方式进行绑定

  • 将匹配其父节点关联的绑定。称为“子绑定”。
  • on-bus:如果节点描述总线上的硬件(例如 I2C 或 SPI),则在将节点与绑定匹配时也会考虑总线类型。
  • /zephyr,user 节点不需要绑定

绑定文件的查找 链接到标题

绑定文件存在的目录必须是dts/bindings,构建过程将从下面目录去找dts/bindings子目录中yaml或者yml文件

  • zephyr所在目录:zephyr/dts/bindings
  • app所在目录: my_app/dts/bindings
  • board所在目前: my_board/dts/bindings
  • shield所在目录: my_shield/dts/bindings
  • DTS_ROOT变量中包含的路径
  • 模块构建中指定的dts_root

参考 链接到标题

https://docs.zephyrproject.org/latest/build/dts/bindings-intro.html