5

我试图从 DTS 文件中理解以下代码段。

/dts-v1/;

/ {
    model = "MPC8313ERDB";
    compatible = "MPC8313ERDB", "MPC831xRDB", "MPC83xxRDB";
    #address-cells = <1>;
    #size-cells = <1>;

    aliases {
        ethernet0 = &enet0;
        serial0 = &serial0;
        serial1 = &serial1;
        pci0 = &pci0;
    };

别名部分有什么作用?
我的理解如下。
对于ethernet0,我们可以使用enet0。
但是为什么serial0=&serial0?
和serial1 = &serial1
谁能简要介绍一下?

谢谢。

4

1 回答 1

10

aliasesDTS 部分,我们看到格式的条目

property = &label;

每个条目包括
property-- 此处定义的新属性
湾。&label--完整的 DTS 路径nodelabel.

它基本上将b的值分配给alabel从此以后,可以使用简写来访问由 标识的节点的长名称property

请注意,此分配的 RHS 使用的是labels 而不是各个节点的短名称。就像labelC 代码中的 a 指的是定义它的行上的指令一样label,DTS 中的 a 指的是在该行上定义的单个节点(使用其完整的长路径)。

例如,考虑以下 DTS, lxr.free-electrons.com/source/arch/powerpc/boot/dts/
mpc8313erdb.dts

aliases部分包括以下内容:

 20         aliases {
 21                 ethernet0 = &enet0;
 22                 ethernet1 = &enet1;
 23                 serial0 = &serial0;
 24                 serial1 = &serial1;
 25                 pci0 = &pci0;
 26         };

新定义的属性 (LHS)

  • ethernet0
  • ethernet1
  • serial0
  • serial1
  • pci0

参考相应的标签(RHS)

例如,ethernet0现在将属性设置为"/soc8313@e0000000/ethernet@24000"ie 在定义标签的行上enet0定义的节点。


更新

  1. 为什么只为ethernet0, serial0... 定义别名?

    • 更进一步,开发人员打算在内核源代码中访问这些节点。一旦在 DTS 中定义了别名,它所引用的节点的句柄就可以通过简单地在aliases节中搜索而不是在整个 DTS 中搜索来获得。

      来源:Linux内核源码中的函数find_node_by_alias()

  2. 为什么pci0节点不在节点下soc8313

    • 在 MPC8313 上,PCIDMA模块通过 IO-Sequencer (IOS) 连接。因此,与直接连接到系统总线的其他模块(以太网、I2C、UART)相比,需要进行特殊处理。
于 2013-07-19T10:23:47.607 回答