NXP MCU 技术论坛
直播中

乐侨珂

9年用户 1064经验值
擅长:控制/MCU
私信 关注
[问答]

如果没有为Micrel Phy配置U-Boot,Linux将无法从冷启动工作,怎么解决?

我们正在使用 Micrel Phy:
KSZ8091RNBCA
由于某种原因,如果没有为 Micrel Phy 配置 U-Boot,Linux 将无法从冷启动工作。此外,调试端口变得非常缓慢并且有很多错误。

fec 2188000.ethernet eth0:无法连接到 phy
RTNETLINK 回答:没有这样的设备

eth0 上的 SIOCGMIIPHY 失败:不支持作

我们使用的是具有单个以太网端口的 i.MX6ULL。

当配置 U-Boot 并且一切正常时,Linux 似乎可以识别我们的 phy。




Micrel KSZ8041 2188000.ethernet-1:01: attached PHY driver (mii_bus:phy_addr=2188000.ethernet-1:01, irq=POLL)fec 2188000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx


我们想消除 U-Boot 以太网驱动程序,因为我们从未使用它,我们认为如果我们没有它,它对安全性和启动简单性会更好。 什么可能导致 Linux 无法正确初始化以太网?


例如,如果没有 U-Boot 驱动程序,mii-diag 在冷启动时无法联系 Phy:


                                                                                                                                                                                                                                                                                                                                                                                                      

回帖(1)

马占云

2025-3-2 13:18:38

要解决在i.MX6ULL上未配置U-Boot时Linux无法识别Micrel KSZ8091RNBCA PHY的问题,请按照以下步骤操作:


1. 检查并配置U-Boot的PHY初始化



  • 确认U-Boot设备树配置:确保U-Boot的设备树(或环境变量)正确设置了PHY地址、接口模式(如RMII)和时钟。例如,在U-Boot的include/configs/板级头文件中,设置:
    CONFIG_FEC_MXC_PHYADDR=0  // PHY地址为0
    CONFIG_FEC_ENET_DEV=0     // 使用第一个ENET控制器

  • 添加PHY复位代码:在U-Boot的板级初始化函数中,添加PHY的复位逻辑:
    // 例如,使用GPIO5_IO08作为复位引脚
    gpio_request(IMX_GPIO_NR(5, 8), "eth_phy_reset");
    gpio_direction_output(IMX_GPIO_NR(5, 8), 0);
    udelay(10000); // 保持复位10ms
    gpio_set_value(IMX_GPIO_NR(5, 8), 1);
    udelay(1000);  // 释放复位后延迟1ms


2. 修正Linux设备树配置


在Linux设备树中(如arch/arm/boot/dts/imx6ull.dtsi),确保ENET节点正确配置PHY:


&fec1 {
    phy-mode = "rmii";
    phy-handle = <ðphy0>;
    status = "okay";

    mdio {
        ethphy0: ethernet-phy@0 {
            compatible = "ethernet-phy-id0022.1622"; // KSZ8091的ID
            reg = <0>; // PHY地址设为0
            reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
            reset-assert-us = <10000>; // 复位时间10ms
            reset-deassert-us = <1000>;
            clocks = <&clks IMX6UL_CLK_ENET_REF>;
            clock-names = "rmii-ref";
        };
    };
};

3. 确认内核驱动配置



  • 启用Micrel PHY驱动:在内核配置中确认CONFIG_MICREL_PHY=y
    make menuconfig
    # 进入 Device Drivers > Network device support > PHY Device support
    # 选中 "Micrel PHYs"

  • 检查驱动加载:启动后执行dmesg | grep -i phy,应显示类似:
    micrel phy 2188000.ethernet-1:01: attached PHY driver [Micrel KSZ8091] (mii_bus:phy_addr=2188000.ethernet-1:01, irq=POLL)


4. 调试硬件连接



  • 检查复位信号:测量复位引脚(如GPIO5_8)的波形,确保复位时序符合要求(低电平至少10ms)。

  • 验证时钟信号:使用示波器检查PHY的参考时钟(如25MHz)是否稳定。

  • 确认MDIO线路:检查MDIO和MDC引脚连接是否正确,无短路或断路。


5. 手动调试PHY寄存器


在U-Boot命令行中使用mdio命令验证PHY状态:


# 列出MDIO总线上的设备
mdio list
# 读取PHY ID寄存器(地址0x02和0x03)
mdio read ethernet 0x02 0x02  # 应返回0x0022
mdio read ethernet 0x02 0x03  # 应返回0x1622(KSZ8091的ID)
# 启用自动协商
mdio write ethernet 0x02 0x00 0x1200

6. 调整内核启动参数


在内核命令行中添加debugignore_loglevel,获取详细日志:


# 在U-Boot的bootargs中添加:
setenv bootargs ... debug ignore_loglevel
boot

7. 验证解决方案



  • 冷启动测试:断电后重新上电,观察Linux启动时的网络初始化日志。

  • 检查网络接口:使用ifconfig -a确认eth0已正确识别,并能正常连接。


常见问题处理



  • PHY地址错误:若reg属性设置错误,修改设备树中的PHY地址。

  • 驱动未加载:检查内核编译配置,确保CONFIG_MICREL_PHY已启用。

  • 复位时序不足:增加reset-assert-usreset-deassert-us的值。


通过以上步骤,应能解决因U-Boot未配置导致的PHY初始化问题,确保Linux冷启动时正确识别网络设备。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分