针对您在使用T2081定制板搭配VSC8572 PHY时遇到的Ping不通及U-Boot驱动支持问题,以下是逐步分析和解决方案:
U-Boot驱动缺失
VSC8572可能未被包含在U-Boot的默认PHY驱动列表中,导致初始化时无法正确识别和配置。
自动协商失败
寄存器dump显示PHY默认配置为1000Mbps,但实际链路仅协商到10Mbps,可能由于:
寄存器配置冲突
通用PHY配置可能未覆盖VSC8572的特有寄存器(如扩展页配置),导致功能异常。
检查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,
};检查硬件信号
MDC/MDIO时序符合PHY要求(时钟频率、上下拉电阻)。RESET引脚电平,确保PHY退出复位状态。线缆与对端设备
更换CAT5e/6线缆,并确保对端设备(交换机/路由器)支持千兆速率。
通过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在板级文件(如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;
}连接线缆后重新Dump寄存器
重点关注寄存器:
启用U-Boot调试信息
在配置文件中启用CONFIG_PHY_DEBUG和CONFIG_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驱动,而非依赖通用配置。
举报
更多回帖