Linux设备树:了解对已删除节点的引用是如何工作的



上下文

我已经查看了一个正在工作的基于I.MX6的开发板所使用的设备树。我注意到,在以太网配置的情况下,会出现令人困惑的指令组合。即:

  1. 节点fec1包含一个指令,用于删除节点mdio
  2. 节点fec2包含对节点ethphy1的引用
  3. 节点ethphy1位于已删除节点mdio

代码段

&fec1 {
pinctrl-0 = <&pinctrl_enet1>, <&pinctrl_enet1_gpio>;
/delete-node/ mdio;
};
&fec2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_enet2>, <&pinctrl_enet2_gpio>, <&pinctrl_enet2_mdio>;
phy-mode = "rmii";
/* Reference */
phy-handle = <&ethphy1>;
phy-reset-gpios=<&gpio5 5 GPIO_ACTIVE_LOW>;
phy-reset-duration=<100>;
status = "okay";
/* Deleted node */
mdio {
#address-cells = <1>;
#size-cells = <0>;
/* Referenced node */
ethphy1: ethernet-phy@3 {
compatible = "ethernet-phy-ieee802.3-c22";
micrel,rmii-reference-clock-select-25-mhz;
micrel,led-mode = <0>;
clocks = <&rmii_ref_clk>;
clock-names = "rmii-ref";
reg = <3>;
};
};
};

问题

删除引用了子节点的节点的最终效果是什么?引用是否已损坏。是否只删除了父节点?

TL;DR版本

/delete-node/ mdio;指令正在删除在imx6ul-imx6ull-var-som.dtsi或imx6ul-imx6ull-var-dart.dtsi中添加的mdio节点。

完整版

OP指出imx6ul-imx6ull-var-som-concerto-board.dtsi是片段的来源。这包括在以下内容中:

  • imx6ul-var-som-concerto-board.dtsi
  • imx6ull-var-som-concerto-board.dtsi
  • imx6ulz-var-som-concerto-board.dtsi

根据它们的imx6ulimx6ullimx6ulz前缀,其中一个至少包含在以下内容中:

ims6ul:

  • imx6ul-var-som-concerto-board-emmc-sd-card.dts
  • imx6ul-var-som-concerto-board-emmc-wifi.dts
  • imx6ul-var-som-concerto-board-nand-sd-card.dts
  • imx6ul-var-som-concerto-board-nameand-wifi.dts

imx6ull:

  • imx6ull-var-som-concerto-board-emmc-sd-card.dts
  • imx6ull-var-som-concerto-board-emmc-wifi.dts
  • imx6ull-var-som-concerto-board-nand-sd-card.dts
  • imx6ull-var-som-concerto-board-nameand-wifi.dts

imx6ulz:

  • imx6ulz-var-som-concerto-board-emmc-sd-card.dts
  • imx6ulz-var-som-concerto-board-emmc-wifi.dts
  • imx6ulz-var-som-concerto-board-nand-sd-card.dts
  • imx6ulz-var-som-concerto-board-nameand-wifi.dts

根据它们的imx6ulimx6ullimx6ulz前缀,这些都包括以下之一:

imx6ul:

  • imx6ul-var-som.dtsi,包括imx6ul-imx6ull-var-som.dtsi

imx6ull:

  • imx6ul-var-som.dtsi,其中包括imx6ul-imx6ull-var-som.dtsi

imx6ulz:

  • imx6ulz-var-som.dtsi,其中包括imx6ul-imx6ull-var-dart.dtsi

imx6ul-imx6ull-var-som.dtsi和imx6ul-imx6ull-var-dart.dtsi都包含以下部分:

&fec1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_enet1>, <&pinctrl_enet1_gpio>, <&pinctrl_enet1_mdio>;
phy-mode = "rmii";
phy-reset-gpios=<&gpio5 0 GPIO_ACTIVE_LOW>;
phy-reset-duration=<100>;
phy-handle = <&ethphy0>;
status = "okay";
mdio {
#address-cells = <1>;
#size-cells = <0>;
ethphy0: ethernet-phy@1 {
compatible = "ethernet-phy-ieee802.3-c22";
micrel,rmii-reference-clock-select-25-mhz;
micrel,led-mode = <1>;
clocks = <&rmii_ref_clk>;
clock-names = "rmii-ref";
reg = <1>;
};
};
};

这修改了&fec1引用的节点(在imx6ul.dtsi中定义(,并添加了一个名为mdio的子节点。但是OP引用的imx6ul-imx6ull-var-som-concerto-board.dtsi包含以下部分:

&fec1 {
pinctrl-0 = <&pinctrl_enet1>, <&pinctrl_enet1_gpio>;
/delete-node/ mdio;
};

这也修改了引用为&fec1的节点。/delete-node/ mdio;指令删除先前添加的mdio子节点。

/delete-node/在设备树编译器中的作用

删除具有/delete-node/的节点将删除该节点、附加到该节点的任何标签、该节点中包含的任何属性,以及递归地删除该节点中所包含的任何节点。如果/delete-node/正在删除的节点不存在,则该指令将被静默忽略。

如果一个节点被删除,则设备树源中其他地方对该节点的任何引用(或对附加到该节点的标签的引用(都将不再有效,因此设备树编译器将产生错误"em";引用不存在的节点或标签"编译源代码时。

/delete-node/在设备树覆盖中的作用

/delete-node/指令只影响正在编译的源。如果它在设备树覆盖的源中使用,/delete-node/指令将不会对应用覆盖的活动设备树产生影响。编译后的dtbo输出中没有任何内容表明在应用覆盖时应该从活动树中删除节点。

/delete-property/

/delete-property/指令与/delete-node/类似,不同之处在于它用于删除属性和附加到该属性的任何标签。

最新更新