Linux 设备树找不到在其正上方声明的元素
Linux device tree can't find an element declared right above it
我正在为 i.MX6 处理器编写一个新的设备树,试图添加一个 Microchip KSZ9893 千兆位设备,但设备树似乎无法在其上方找到一个 blob。我添加了一个固定 link 设备的 eth0 设备,并尝试将它连接到 Microchip 交换机上的端口 3,但是当我尝试在交换机上添加端口分配时,我发现它找不到节点 eth0。
错误文本:
| DTC arch/arm/boot/dts/imx6dl-fhab.dtb
| Error: /home/gen-ccm-root/workdir/kernel/arch/arm/boot/dts/imx6qdl-fhab-common.dtsi:131.1-6 Label or path eth0 not found
| FATAL ERROR: Syntax error parsing input tree
| scripts/Makefile.lib:317: recipe for target 'arch/arm/boot/dts/imx6dl-fhab.dtb' failed
| make[3]: *** [arch/arm/boot/dts/imx6dl-fhab.dtb] Error 1
| arch/arm/Makefile:343: recipe for target 'imx6dl-fhab.dtb' failed
这里是设备树源的相关部分:
具体应用板dtsi(imx6qdl-fhab-common.dtsi来自错误信息):
ð0 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_enet>;
phy-reset-gpios = <&gpio1 25 1>;
phy-reset-duration = <1000>;
phy-reset-post-delay = <10>;
status = "okay";
fixed-link {
speed = <1000>;
full-duplex;
};
};
&ecspi1 {
ads7868: adc {
compatible = "mi,shab-adc";
reg = <0>;
spi-max-frequency = <2000000>;
};
ksz9477: ksz9477@1 {
compatible = "microchip,ksz9893";
reg = <1>;
spi-max-frequency = <4000000>;
spi-cpha;
spi-cpol;
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
label = "lan1";
};
port@1 {
reg = <1>;
label = "lan2";
};
port@2 {
reg = <2>;
label = "cpu";
ethernet = <ð0>;
};
};
};
它包括我们所有应用程序板的通用 dtsi。这是设置 SPI 设备和 RGMII 引脚的那个。如果需要,我可以 post。
我尝试了几个不同的名称,没有在固定 link 上设置状态,删除重置线,以及类似的一些事情都无济于事。
我是 运行 Yocto Zeus 和 4.14.149 内核。我已经从 5.1 内核向后移植了驱动程序(我不知道它是否成功)。
有什么想法吗?
由 Parthiban 在对原始问题的评论中提供。:
设备树中的名称有意义,显然在 i.MX6 上,以太网设备是一个名为 fec 的节点,因此以太网需要匹配名称。因此,我无法将其命名为 eth0(来自内核文档)。
如果我想将它命名为 eth0,我需要设置一个别名。
我只想补充几点:
这些名字在某种程度上确实有含义。看看imx6 SoM的核心devicetree file。此文件描述了 imx6 系列的共同特征。 SoM 像 imq6q(四核)和 imx6dl(双核)包括并进一步指定硬件。在 imx6qdl.dtsi 文件的第 1038 行,有一个名为 fec 的设备节点声明了兼容标志 "fsl,imx6q-fec" 和一些中断 + 总线描述:
fec: ethernet@2188000 {
compatible = "fsl,imx6q-fec";
reg = <0x02188000 0x4000>;
interrupt-names = "int0", "pps";
interrupts-extended =
<&intc 0 118 IRQ_TYPE_LEVEL_HIGH>,
<&intc 0 119 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clks IMX6QDL_CLK_ENET>,
<&clks IMX6QDL_CLK_ENET>,
<&clks IMX6QDL_CLK_ENET_REF>;
clock-names = "ipg", "ahb", "ptp";
status = "disabled";
};
所以这个设备"fec"在地址2188000处描述了这个特定的节点,imx6q-fec驱动程序将被加载(稍后,你将把它称为eth0,它可以被定义,正如你提到的之前,在别名部分)。
当您引用现有节点时,您总是可以覆盖现有节点并将新属性添加到它们(在名称前加上 &- 符号)。据我所知,引用不存在的节点会导致您的问题出错。
言归正传:
您可以为我上面链接的 imx6qdl.dtsi 文件编写一个补丁,并将第 1038 行的 fec 节点重命名为 eth0。从这一点开始,每个想要引用这个特定以太网 NIC 的组件都必须引用 ð0 而不是 &fec(这将导致 imx6 生态系统周围的 dts 编译器错误)。
另一个值得注意的事情我必须通过艰苦的方式学习:例如,你想使用 UART 并将你的硬件连接到 UART2 的引脚,你需要将 pinmux 组添加到 pinctrl-0 节点正确的串口。让我们看一下 imx6qdl-phytec-mira.dtsi 文件(第 226 行):
&uart2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart2>;
status = "okay";
};
此处 pinmux 部分中的 &pinctrl_uart2 节点描述了连接到芯片本身的 uart2 接口的引脚(第 345 行):
pinctrl_uart2: uart2grp {
fsl,pins = <
MX6QDL_PAD_EIM_D26__UART2_TX_DATA 0x1b0b1
MX6QDL_PAD_EIM_D27__UART2_RX_DATA 0x1b0b1
>;
};
如果您尝试将 UART2 信号的引脚连接到另一个 uart 设备,通信将无法进行,因为您只能为同一设备多路复用焊盘(如果有意义的话)。总是有多个 UART2 pad 可用。
我正在为 i.MX6 处理器编写一个新的设备树,试图添加一个 Microchip KSZ9893 千兆位设备,但设备树似乎无法在其上方找到一个 blob。我添加了一个固定 link 设备的 eth0 设备,并尝试将它连接到 Microchip 交换机上的端口 3,但是当我尝试在交换机上添加端口分配时,我发现它找不到节点 eth0。
错误文本:
| DTC arch/arm/boot/dts/imx6dl-fhab.dtb
| Error: /home/gen-ccm-root/workdir/kernel/arch/arm/boot/dts/imx6qdl-fhab-common.dtsi:131.1-6 Label or path eth0 not found
| FATAL ERROR: Syntax error parsing input tree
| scripts/Makefile.lib:317: recipe for target 'arch/arm/boot/dts/imx6dl-fhab.dtb' failed
| make[3]: *** [arch/arm/boot/dts/imx6dl-fhab.dtb] Error 1
| arch/arm/Makefile:343: recipe for target 'imx6dl-fhab.dtb' failed
这里是设备树源的相关部分:
具体应用板dtsi(imx6qdl-fhab-common.dtsi来自错误信息):
ð0 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_enet>;
phy-reset-gpios = <&gpio1 25 1>;
phy-reset-duration = <1000>;
phy-reset-post-delay = <10>;
status = "okay";
fixed-link {
speed = <1000>;
full-duplex;
};
};
&ecspi1 {
ads7868: adc {
compatible = "mi,shab-adc";
reg = <0>;
spi-max-frequency = <2000000>;
};
ksz9477: ksz9477@1 {
compatible = "microchip,ksz9893";
reg = <1>;
spi-max-frequency = <4000000>;
spi-cpha;
spi-cpol;
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
label = "lan1";
};
port@1 {
reg = <1>;
label = "lan2";
};
port@2 {
reg = <2>;
label = "cpu";
ethernet = <ð0>;
};
};
};
它包括我们所有应用程序板的通用 dtsi。这是设置 SPI 设备和 RGMII 引脚的那个。如果需要,我可以 post。
我尝试了几个不同的名称,没有在固定 link 上设置状态,删除重置线,以及类似的一些事情都无济于事。
我是 运行 Yocto Zeus 和 4.14.149 内核。我已经从 5.1 内核向后移植了驱动程序(我不知道它是否成功)。
有什么想法吗?
由 Parthiban 在对原始问题的评论中提供。:
设备树中的名称有意义,显然在 i.MX6 上,以太网设备是一个名为 fec 的节点,因此以太网需要匹配名称。因此,我无法将其命名为 eth0(来自内核文档)。
如果我想将它命名为 eth0,我需要设置一个别名。
我只想补充几点:
这些名字在某种程度上确实有含义。看看imx6 SoM的核心devicetree file。此文件描述了 imx6 系列的共同特征。 SoM 像 imq6q(四核)和 imx6dl(双核)包括并进一步指定硬件。在 imx6qdl.dtsi 文件的第 1038 行,有一个名为 fec 的设备节点声明了兼容标志 "fsl,imx6q-fec" 和一些中断 + 总线描述:
fec: ethernet@2188000 {
compatible = "fsl,imx6q-fec";
reg = <0x02188000 0x4000>;
interrupt-names = "int0", "pps";
interrupts-extended =
<&intc 0 118 IRQ_TYPE_LEVEL_HIGH>,
<&intc 0 119 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clks IMX6QDL_CLK_ENET>,
<&clks IMX6QDL_CLK_ENET>,
<&clks IMX6QDL_CLK_ENET_REF>;
clock-names = "ipg", "ahb", "ptp";
status = "disabled";
};
所以这个设备"fec"在地址2188000处描述了这个特定的节点,imx6q-fec驱动程序将被加载(稍后,你将把它称为eth0,它可以被定义,正如你提到的之前,在别名部分)。
当您引用现有节点时,您总是可以覆盖现有节点并将新属性添加到它们(在名称前加上 &- 符号)。据我所知,引用不存在的节点会导致您的问题出错。
言归正传:
您可以为我上面链接的 imx6qdl.dtsi 文件编写一个补丁,并将第 1038 行的 fec 节点重命名为 eth0。从这一点开始,每个想要引用这个特定以太网 NIC 的组件都必须引用 ð0 而不是 &fec(这将导致 imx6 生态系统周围的 dts 编译器错误)。
另一个值得注意的事情我必须通过艰苦的方式学习:例如,你想使用 UART 并将你的硬件连接到 UART2 的引脚,你需要将 pinmux 组添加到 pinctrl-0 节点正确的串口。让我们看一下 imx6qdl-phytec-mira.dtsi 文件(第 226 行):
&uart2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart2>;
status = "okay";
};
此处 pinmux 部分中的 &pinctrl_uart2 节点描述了连接到芯片本身的 uart2 接口的引脚(第 345 行):
pinctrl_uart2: uart2grp {
fsl,pins = <
MX6QDL_PAD_EIM_D26__UART2_TX_DATA 0x1b0b1
MX6QDL_PAD_EIM_D27__UART2_RX_DATA 0x1b0b1
>;
};
如果您尝试将 UART2 信号的引脚连接到另一个 uart 设备,通信将无法进行,因为您只能为同一设备多路复用焊盘(如果有意义的话)。总是有多个 UART2 pad 可用。