NXP MCU 技术论坛
直播中

李维嘉

8年用户 1513经验值
私信 关注
[问答]

T2081 VSC8572 phy:Ping不起作用的原因?

我有一个定制的 T2081板VSC8572我们使用地址0x1d的 phy 芯片。当我们遍历 u-boot 代码时,不支持这个 Phy。我们能够使用具有通用 phy 配置的 mii 命令访问 Phy。任何人都可以在 u-boot 级别做过 phy bringup,请帮忙。
我们可以看到,只有 10Mbps 时才能观察到链路连接。
连接电缆之前的 Reg dump:
=> mii dump 0x1d 0x00
0. (1040) -- PHY 控制寄存器 --
(8000:0000) 0.15 = 0 重置
(4000:0000) 0.14 = 0 环回
(2040:0040) 0.6,13 = b10 速度选择 = 1000 Mbps
(1000:1000) 0.12 = 1 A/N 启用
(0800:0000) 0.11 = 0 断电
(0400:0000) 0.10 = 0 隔离
(0200:0000) 0.9 = 0 重新启动 A/N
(0100:0000) 0.8 = 0 双工 = 半双工
(0080:0000) 0.7 = 0 碰撞测试启用
(003F:0000)0. 5- 0 = 0(保留)
=> mii dump 0x1d 0x01
1. (79c9) -- PHY 状态寄存器 --
(8000:0000) 1.15 = 0 100BASE-T4 支持
(4000:4000) 1.14 = 1 个 100BASE-X 全双工
(2000:2000) 1.13 = 1 100BASE-X 半双工
(1000:1000) 1.12 = 1 个 10 Mbps 全双工
(0800:0800) 1.11 = 1 个 10 Mbps 半双工
(0400:0000) 1.10 = 0 100BASE-T2 全双工
(0200:0000) 1.9 = 0 100BASE-T2 半双工
(0100:0100) 1.8 = 1 扩展状态
(0080:0080) 1.7 = 1(保留)
(0040:0040) 1.6 = 1 MF 前导码抑制
(0020:0000) 1.5 = 0 A/N 完成
(0010:0000) 1.4 = 0 远程故障
(0008:0008) 1.3 = 1 A/N 能力
(0004:0000) 1.2 = 0 链路状态
(0002:0000) 1.1 = 0 个 jabber 检测
(0001:0001) 1.0 = 1 扩展功能
连接电缆后的 Reg dump:
=> mii dump 0x1d 0x0
0. (1040) -- PHY 控制寄存器 --
(8000:0000) 0.15 = 0 重置
(4000:0000) 0.14 = 0 环回
(2040:0040) 0.6,13 = b10 速度选择 = 1000 Mbps
(1000:1000) 0.12 = 1 A/N 启用
(0800:0000) 0.11 = 0 断电
(0400:0000) 0.10 = 0 隔离
(0200:0000) 0.9 = 0 重新启动 A/N
(0100:0000) 0.8 = 0 双工 = 半双工
(0080:0000) 0.7 = 0 碰撞测试启用
(003F:0000)0. 5- 0 = 0(保留)

=> mii dump 0x1d 0x1
1. (79ed) -- PHY 状态寄存器 --
(8000:0000) 1.15 = 0 100BASE-T4 支持
(4000:4000) 1.14 = 1 个 100BASE-X 全双工
(2000:2000) 1.13 = 1 100BASE-X 半双工
(1000:1000) 1.12 = 1 个 10 Mbps 全双工
(0800:0800) 1.11 = 1 个 10 Mbps 半双工
(0400:0000) 1.10 = 0 100BASE-T2 全双工
(0200:0000) 1.9 = 0 100BASE-T2 半双工
(0100:0100) 1.8 = 1 扩展状态
(0080:0080) 1.7 = 1(保留)
(0040:0040) 1.6 = 1 MF 前导码抑制
(0020:0020) 1.5 = 1 个 A/N 完成
(0010:0000) 1.4 = 0 远程故障
(0008:0008) 1.3 = 1 A/N 能力
(0004:0004) 1.2 = 1 个链路状态
(0002:0000) 1.1 = 0 个 jabber 检测
(0001:0001) 1.0 = 1 扩展功能

当我 ping 时,我可以在控制台上看到以下日志。
=========================================
=> mii dev
MII 设备: 'FSL_MDIO0' 'FM_TGEC_MDIO' 'T2081QDS_MDIO_RGMII1' 'T2081QDS_MDIO_RGMII2' 'T2081QDS_MDIO_SLOT5' 'T2081QDS_MDIO_10GC'
当前设备:“FSL_MDIO0”
=> mii dev T2081QDS_MDIO_RGMII1
=> mii dev
MII 设备: 'FSL_MDIO0' 'FM_TGEC_MDIO' 'T2081QDS_MDIO_RGMII1' 'T2081QDS_MDIO_RGMII2' 'T2081QDS_MDIO_SLOT5' 'T2081QDS_MDIO_10GC'
当前设备:“T2081QDS_MDIO_RGMII1”
=> setenv ethact FM1@DTSEC3
=> setenv ipaddr 172.16.15.201
=> setenv netmask 255.255.192.0
=> setenv serverip 172.16.1.100
=> setenv gatewayip 172.16.1.0
=> ping "172.16.1.100"
MMDC : genphy_update_link
FM1@DTSEC3 正在等待PHY自动协商完成..做
MMDC:速度 = 0x10
使用 FM1@DTSEC3 设备

超出 ARP 重试计数;重新开始
ping 失败;主机 172.16.1.100 未处于活动状态
=> ping "172.16.1.100"
MMDC : genphy_update_link
MMDC:速度 = 0x10
使用 FM1@DTSEC3 设备
FM1@DTSEC3: Tx error, txbd->status = 0x8800
FM1@DTSEC3: Tx buffer not ready, txbd->status = 0x8800
FM1@DTSEC3: Tx buffer not ready, txbd->status = 0x8800
FM1@DTSEC3: Tx buffer not ready, txbd->status = 0x8800

超出 ARP 重试计数;重新开始
ping 失败;主机 172.16.1.100 未处于活动状态

回帖(1)

李刚

2025-4-2 18:15:53

针对您在使用T2081定制板搭配VSC8572 PHY时遇到的Ping不通及U-Boot驱动支持问题,以下是逐步分析和解决方案:




根本原因分析




  1. U-Boot驱动缺失

    VSC8572可能未被包含在U-Boot的默认PHY驱动列表中,导致初始化时无法正确识别和配置。




  2. 自动协商失败

    寄存器dump显示PHY默认配置为1000Mbps,但实际链路仅协商到10Mbps,可能由于:



    • 自动协商未正确启用或完成。

    • 硬件连接问题(线缆质量、对端设备支持)。

    • PHY硬件配置(时钟、电源、复位)异常。




  3. 寄存器配置冲突

    通用PHY配置可能未覆盖VSC8572的特有寄存器(如扩展页配置),导致功能异常。






解决方案步骤


1. 确认U-Boot驱动支持




  • 检查U-Boot版本

    确认当前U-Boot版本是否包含VSC8572驱动。查阅代码中drivers/net/phy/vitesse.c或类似文件,查找PHY_ID_VSC8572定义。


    // 示例:检查PHY ID宏定义
    #define PHY_ID_VSC8572          0x7044140

    若不存在,需手动移植驱动代码。




  • 添加PHY驱动(如缺失)

    参考U-Boot补丁或Linux内核驱动,实现以下函数:


    static struct phy_driver VSC8572_driver = {
    .name = "Vitesse VSC8572",
    .uid = PHY_ID_VSC8572,
    .mask = 0xfffffff0,
    .features = PHY_GBIT_FEATURES,
    .config = &vsc8572_config,
    .startup = &vitesse_startup,
    .shutdown = &genphy_shutdown,
    };



2. 验证PHY硬件连接




  • 检查硬件信号  



    • 确认MDC/MDIO时序符合PHY要求(时钟频率、上下拉电阻)。

    • 测量RESET引脚电平,确保PHY退出复位状态。

    • 确认电源电压(3.3V/2.5V)和参考时钟(25MHz)稳定。




  • 线缆与对端设备

    更换CAT5e/6线缆,并确保对端设备(交换机/路由器)支持千兆速率。




3. 手动配置PHY寄存器


通过U-Boot的mii命令强制配置关键寄存器:




  • 启用自动协商  


    # 设置控制寄存器(0x00)bit12=1(A/N使能)
    mii write 0x1d 0x00 0x1040 -> 0x1040 | (1 << 12) = 0x1840
    mii write 0x1d 0x00 0x1840



  • 检查状态寄存器(0x19)  


    mii read 0x1d 0x19

    确认bit5=1(自动协商完成),bit3:0指示实际速度(0b0010=1000Mbps)。




  • 配置扩展寄存器(如需)

    VSC8572可能需要配置扩展页:


    # 切换至扩展页1
    mii write 0x1d 0x1e 0x0001
    # 设置特定功能(如SGMII/SERDES模式)
    mii write 0x1d 0x17 0x0x01
    # 切回普通页
    mii write 0x1d 0x1e 0x0000



4. 修改U-Boot网络初始化代码


在板级文件(如board/freescale/t208xrdb/t208xrdb.c)中添加PHY初始化:


int board_eth_init(struct bd_info *bis)
{
    struct fsl_pq_mdio_info mdio_info;
    ...
    // 显式设置PHY地址和驱动
    phy_register(&VSC8572_driver);
    // 手动复位PHY
    miiphy_write("eth0", 0x1d, MII_BMCR, BMCR_RESET);
    udelay(1000);
    return 0;
}

5. 测试与调试




  • 连接线缆后重新Dump寄存器

    重点关注寄存器:



    • 0x00 (BMCR):确认自动协商启用。

    • 0x19 (BMSR):检查链路状态和协商结果。

    • 0x1C (PHYSPCR):VSC8572的特定状态寄存器。




  • 启用U-Boot调试信息

    在配置文件中启用CONFIG_PHY_DEBUGCONFIG_CMD_MII,观察PHY初始化日志。






关键代码示例


// 在U-Boot的phy初始化流程中强制配置VSC8572
int vsc8572_config(struct phy_device *phydev)
{
    // 启用自动协商
    phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_ANENABLE);
    // 配置扩展寄存器(示例)
    phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x0001); // 切到页1
    phy_write(phydev, MDIO_DEVAD_NONE, 0x17, 0x01);   // 配置SGMII
    phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x0000); // 切回页0
    return 0;
}



总结


问题根源可能在于U-Boot缺少VSC8572的专用驱动,或自动协商配置异常。通过添加驱动支持、手动配置关键寄存器,并验证硬件信号,应能恢复千兆链路。建议优先在U-Boot中实现PHY驱动,而非依赖通用配置。

举报

更多回帖

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