我正在尝试理解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
的行上定义的节点。
更新:
为什么只为
ethernet0
、serial0
…定义别名?接下来,开发人员打算访问内核源代码中的这些节点。一旦在DTS中定义了别名,则只需在
aliases
节中搜索它,而不是在整个DTS中搜索它就可以获得它所指节点的句柄。来源:函数find_node_by_alias()在Linux内核源代码中。
为什么NOT中的
pci0
节点在soc8313
节点下?- 在MPC8133上,PCI和DMA块通过IO序列器(IOS)进行接口连接。因此,与直接连接到系统总线的其他块(以太网、I2C、UART)相比,进行了特殊处理