Linux设备树可以';找不到在其正上方声明的元素

Linux设备树可以';找不到在其正上方声明的元素,linux,embedded,embedded-linux,yocto,device-tree,Linux,Embedded,Embedded Linux,Yocto,Device Tree,我正在为I.MX6处理器编写一个新的设备树,试图添加一个微芯片KSZ9893千兆设备,但设备树似乎找不到正上方的blob。我添加了一个eth0设备,它是一个固定链接设备,并尝试将其连接到Microchip交换机上的端口3,但当我尝试在交换机上添加端口分配时,我发现它找不到节点eth0 错误文本: | DTC arch/arm/boot/dts/imx6dl-fhab.dtb | Error: /home/gen-ccm-root/workdir/kernel/arch/arm/boo

我正在为I.MX6处理器编写一个新的设备树,试图添加一个微芯片KSZ9893千兆设备,但设备树似乎找不到正上方的blob。我添加了一个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=“默认”;
pinctrl-0=;
phy重置gpios=;
物理层重置持续时间=;
phy重置后延迟=;
status=“好”;
固定链路{
速度=;
全双工;
};
};
&ecspi1{
ads7868:adc{
compatible=“mi,shab adc”;
reg=;
spi最大频率=;
};
ksz9477:ksz9477@1 {
compatible=“microchip,ksz9893”;
reg=;
spi最大频率=;
spi-cpha;
spi-cpol;
港口{
#地址单元=;
#大小单元格=;
port@0 {
reg=;
label=“lan1”;
};
port@1 {
reg=;
label=“lan2”;
};
port@2 {
reg=;
label=“cpu”;
以太网=;
};
};
};
它包括一个用于所有应用程序板的通用dtsi。这是一个用于设置SPI设备和RGMII引脚的dtsi。如果需要,我可以发布它

我尝试了几个不同的名字,没有设置固定链接的状态,删除了重置行,还有一些类似的事情都没有用

我正在运行YoctoZeus和一个4.14.149内核。我已经从5.1内核中向后移植了驱动程序(我不知道它是否成功)


有什么想法吗?

由帕提班在对原始问题的评论中提供:

设备树中的名称具有含义,显然在i.MX6上,以太网设备是一个名为fec的节点,因此以太网需要与名称匹配。因此,我无法将其命名为eth0(来自内核文档)


如果我想把它命名为eth0,我需要设置一个别名。

我只想添加一些东西:

这些名称在某种程度上确实有意义。请看一下imx6 SoM的核心。此文件描述了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:ethernet@2188000 {
compatible=“fsl,imx6q fec”;
reg=;
中断名称=“int0”、“pps”;
中断扩展=
,
;
时钟=,
,
;
时钟名称=“ipg”、“ahb”、“ptp”;
status=“disabled”;
};
因此,这个设备“fec”描述了地址2188000处的这个特定节点,imx6q fec驱动程序将为其加载(稍后,您将把它称为eth0,正如您前面在别名部分中提到的那样,它可以定义)

在引用现有节点时,您始终可以覆盖这些节点并向其添加新属性(&-在名称前签名)。引用不存在的节点会导致我所知的问题中的错误

但回到主题:

您可以为上面链接的imx6qdl.dtsi文件编写补丁,并将第1038行中的fec节点重命名为eth0。从这一点开始,要引用此特定以太网NIC的每个组件都必须引用ð0而不是&fec(这将导致imx6生态系统中的dts编译器错误)

另一个值得注意的事情:我必须要努力学习:例如,你想使用UART并把你的硬件连接到UART2的PIN,你需要把PUMUX组添加到正确的UART的PcTrTr0节点。让我们看看文件(第226行):

&uart2{
pinctrl names=“默认”;
pinctrl-0=;
status=“好”;
};
这里,pinmux部分中的&pinctrl_uart2节点描述了连接到芯片本身的uart2接口的引脚(第345行):

pinctrl\u uart2:uart2grp{
fsl,引脚=<
MX6QDL焊盘EIM D26 UART2发送数据0x1b0b1
MX6QDL焊盘EIM D27 UART2接收数据0x1b0b1
>;
};

如果您尝试将UART2信号的引脚连接到另一个uart设备,通信将无法工作,因为您只能对同一设备的PAD进行多路复用(如果有意义的话)。总是有多个UART2焊盘可用。

imx6中的以太网控制器是FEC,因此您应该使用
&fec1
或相应的以太网控制器。如果您想使用as
eth0
,则需要别名。我不知道这些名称有含义,我以为它们只是名称。如果您将此作为响应编写,我可以选择它。我从较新的内核文档中复制了eth0。
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";
};
&uart2 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_uart2>;
    status = "okay";
};
pinctrl_uart2: uart2grp {
    fsl,pins = <
        MX6QDL_PAD_EIM_D26__UART2_TX_DATA   0x1b0b1
        MX6QDL_PAD_EIM_D27__UART2_RX_DATA   0x1b0b1
    >;
};