DTS文件说明-别名



我正在尝试理解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
有人能简要介绍一下吗?

谢谢。

在DTS的aliases部分,我们可以看到格式的条目

property = &label;

每个条目包括:
a.property——此处定义的一个新的属性
b.&label-完成到label引用的node的DTS路径

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

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

例如,考虑以下DTS,
lxr.free-elections.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)

  • enet0
  • enet1
  • serial0
  • serial1
  • pci0

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


更新

  1. 为什么只为ethernet0serial0…定义别名?

    • 接下来,开发人员打算访问内核源代码中的这些节点。一旦在DTS中定义了别名,则只需在aliases节中搜索它,而不是在整个DTS中搜索它就可以获得它所指节点的句柄

      来源:函数find_node_by_alias()在Linux内核源代码中。

  2. 为什么NOT中的pci0节点在soc8313节点下?

    • 在MPC8133上,PCIDMA块通过IO序列器(IOS)进行接口连接。因此,与直接连接到系统总线的其他块(以太网、I2C、UART)相比,进行了特殊处理

最新更新