Linux 设备树:了解对已删除节点的引用如何工作?
Linux Device Tree: Understanding how a reference to a deleted node works?
上下文
我查看了用于工作的基于 i.MX6 的开发板的设备树。我注意到在以太网配置的情况下,存在令人困惑的指令组合。即:
- 节点
fec1
包含 删除 节点 mdio
的指令
- 节点
fec2
包含对节点 ethphy1
的引用
- 节点
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 = <ðphy1>;
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 or 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
根据它们的 imx6ul
、imx6ull
或 imx6ulz
前缀,其中至少包含以下内容之一:
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-nand-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-nand-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-nand-wifi.dts
根据它们的 imx6ul
、imx6ull
或 imx6ulz
前缀,它们都包含以下内容之一:
imx6ul
:
- imx6ul-var-som.dtsi, which includes imx6ul-imx6ull-var-som.dtsi
imx6ull
:
- imx6ull-var-som.dtsi, which includes imx6ul-imx6ull-var-som.dtsi
imx6ulz
:
- imx6ulz-var-som.dtsi, which includes imx6ul-imx6ull-var-dart.dtsi
imx6ul-imx6ull-var-som.dtsi and 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 = <ðphy0>;
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/
删除的节点不存在,则该指令将被静默忽略。
如果删除节点,设备树源中其他地方对节点的任何引用(或对附加到节点的任何标签的引用)将不再有效,因此设备树编译器将生成一个编译源代码时出现错误 “引用了不存在的节点或标签”。
/delete-node/
在设备树覆盖层中的影响
/delete-node/
指令只影响正在编译的源代码。如果它在设备树覆盖的源中使用,则 /delete-node/
指令将不会影响应用覆盖的实时设备树。编译后的 dtbo 输出中没有任何内容表明应用覆盖时应从活动树中删除节点。
/delete-property/
呢?
/delete-property/
指令与 /delete-node/
类似,不同之处在于它用于删除 属性 和任何附加到 属性 的标签。
上下文
我查看了用于工作的基于 i.MX6 的开发板的设备树。我注意到在以太网配置的情况下,存在令人困惑的指令组合。即:
- 节点
fec1
包含 删除 节点mdio
的指令
- 节点
fec2
包含对节点ethphy1
的引用
- 节点
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 = <ðphy1>;
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 or 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
根据它们的 imx6ul
、imx6ull
或 imx6ulz
前缀,其中至少包含以下内容之一:
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-nand-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-nand-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-nand-wifi.dts
根据它们的 imx6ul
、imx6ull
或 imx6ulz
前缀,它们都包含以下内容之一:
imx6ul
:
- imx6ul-var-som.dtsi, which includes imx6ul-imx6ull-var-som.dtsi
imx6ull
:
- imx6ull-var-som.dtsi, which includes imx6ul-imx6ull-var-som.dtsi
imx6ulz
:
- imx6ulz-var-som.dtsi, which includes imx6ul-imx6ull-var-dart.dtsi
imx6ul-imx6ull-var-som.dtsi and 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 = <ðphy0>;
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/
删除的节点不存在,则该指令将被静默忽略。
如果删除节点,设备树源中其他地方对节点的任何引用(或对附加到节点的任何标签的引用)将不再有效,因此设备树编译器将生成一个编译源代码时出现错误 “引用了不存在的节点或标签”。
/delete-node/
在设备树覆盖层中的影响
/delete-node/
指令只影响正在编译的源代码。如果它在设备树覆盖的源中使用,则 /delete-node/
指令将不会影响应用覆盖的实时设备树。编译后的 dtbo 输出中没有任何内容表明应用覆盖时应从活动树中删除节点。
/delete-property/
呢?
/delete-property/
指令与 /delete-node/
类似,不同之处在于它用于删除 属性 和任何附加到 属性 的标签。