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
有人可以请一下吗?
谢谢.
在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被定义.
更新:
为什么只定义别名ethernet0,serial0...?
接下来,开发人员打算在内核源代码中访问这些节点.一旦在DTS中定义了别名,它所引用的节点的句柄就是通过在该aliases部分中搜索它而不是在整个DTS中搜索它来获得的.
来源:Linux内核源代码中的函数find_node_by_alias().
为什么pci0节点NOT下soc8313的节点?