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来自错误信息):

&eth0 {
    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 = <&eth0>;
            };
        };
    };

它包括我们所有应用程序板的通用 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 可用。