DTS文件说明 - 别名

时间:2013-07-19 05:28:29

标签: operating-system embedded 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;
    };

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

感谢。

1 个答案:

答案 0 :(得分:8)

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

  

<强> property = &label;

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

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

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

例如,考虑以下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" ,即the line where the label enet0 is defined上定义的节点。


更新

  1. 为什么仅为ethernet0serial0定义别名??

    • 接下来,开发人员打算在内核源代码中访问这些节点。在DTS中定义别名后,只需在aliases部分搜索别名,即可获取句柄适用于整个DTS。

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

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

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