DTS文件说明 - 别名

New*_*ils 5 embedded operating-system embedded-linux systems-programming device-tree

我试图从DTS文件中了解以下代码段.

/dts-v1/;

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

    aliases {
        ethernet0 = &enet0;
        serial0 = &serial0;
        serial1 = &serial1;
        pci0 = &pci0;
    };
Run Code Online (Sandbox Code Playgroud)

别名的作用是什么?
我的理解如下.
对于ethernet0,我们可以使用enet0.
但为什么serial0 =&serial0?
和serial1 =&serial1
有人可以请一下吗?

谢谢.

The*_*ist 8

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

property = &label;

每个条目包括:
a.property- 这里定义的新属性.
&label- 完成node引用的DTS路径label.

它基本上的值赋给b一个.此后,label可以使用速记来访问由所识别的节点的长名称property.

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

例如,考虑以下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         };
Run Code Online (Sandbox Code Playgroud)

新定义的属性(LHS)

  • ethernet0
  • ethernet1
  • serial0
  • serial1
  • pci0

参考相应的标签(RHS)

例如,该属性ethernet0现在设置为"/soc8313@e0000000/ethernet@24000"即上定义的节点,其中所述标签的线路enet0被定义.


更新:

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

    • 接下来,开发人员打算在内核源代码中访问这些节点.一旦在DTS中定义了别名,它所引用的节点句柄就是通过在该aliases部分中搜索它而不是在整个DTS中搜索它来获得的.

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

  2. 为什么pci0节点NOTsoc8313的节点?

    • 在MPC8313上,PCIDMA块通过IO-Sequencer(IOS)连接.因此,与直接连接到系统总线的其他模块(以太网,I2C,UART)相比,可以进行特殊处理.