在进行软件修复前,需首先确认开发板搭载的 PHY 芯片型号。辨别方式如下:
硬件观察: 查看开发板上网口附近的芯片丝印,查找 RTL8211F 或 YT8531H 字样。
原理图确认: 查阅对应版本的硬件原理图,核对网络部分的芯片型号。
注意: 不同型号的芯片寄存器定义不同,必须使用对应的初始化代码。
一、RTL8211F 版本修复
如果在使用官方lwip模板时出现自动协商失败,请先查看该帖子:https://www.corecourse.cn/forum.php?mod=viewthread&tid=29166
也可以用本帖提供的源文件直接替换,也可解决自动协商失败问题
xilinx官方提供的 LWIP_ECHO 的demo(vivado2018.3版本),在使用的过程中还发现一些小问题,在此提供解决方法
1、以太网设置固定速率的时候,会频繁打印link up/link down
2、开发板网口与电脑端连接时,会出现绿灯不亮
3、网线先不插,等待自协商结束后,再插上会无反应
这里针对上面3个bug,在这里提供一些解决方法:
(1)报错现象与分析
问题1:固定速率问题
现象如下图所示,设置固定速率为1000M后,插上网线就会不断提示link up/link down
分析:
① 笔者观察到在以太网物理层链路建立过程中,每次网线重新插入后,PHY状态寄存器的bit2(通常表示链路状态)初始会持续一段时间为0,然后才稳定为1。
在xemacpsif_physpeed.c文件下面configure_IEEE_phy_speed函数中,存在PHY复位操作(在828行左右,IEEE_CTRL_RESET_MASK是用于将bit15写入1)
根据数据手册的描述可见,在复位操作后,会导致链路的不稳定;例程中,在复位后,添加了延时操作,等待链路回复正常,但是这个时间是不够的;这也就是导致持续发送link up、link down的原因。
所以我们需要给它增加延时,如下图所示
② 经过修改后,如下图所示,插上网线后会提示一次Ethernet Link !
如下图所示,拔出网线会提示一次Ethernet Link down,不再重复打印
问题2:绿灯不亮问题
现象如下图所示,开发板网口与电脑端连接时,会出现绿灯不亮问题;
分析:
① 这里主要是EEE寄存器和Reg16寄存器配置不对
② 先关闭LED1、LED2的 EEE 指示,再配置Reg 16寄存器;(代码位于xemacpsif_physpeed.c文件,phy_setup_emacps函数中)
③ 设置Reg16寄存器
问题3:网线先不插,自协商结束后,插入会无反应
现象如下图所示,网线先不插,等待自协商结束后,再插上会无反应;
分析:
①笔者在调试中发现xemacps_control.c文件中,XEmacPs_SetOperatingSpeed函数里面有速率相关的断言;这里将其屏蔽即可。
②自协商失败后,再插入网线,也会尝试连接
(2)快速解决方法
① 将帖子下方提供的RTL8211F_code.zip压缩包解压(其中包含三个C文件)
② 打开工程下的bsp文件夹,找到对应的文件目录,进行替换即可
二、YT8531H 版本修复
问题1:绿灯不亮问题
问题分析: 裕太(YT)芯片需要通过配置 LED1_CFG 寄存器来强制定义绿灯的显示逻辑。
修复逻辑: 修改xemacpsif_physpeed.c文件中的phy_setup_emacps函数(可删除原函数,然后粘贴下方函数)。
代码实现:
[C] 纯文本查看 复制代码 u32_t phy_setup_emacps (XEmacPs *xemacpsp, u32_t phy_addr)
{
u32_t link_speed;
u32_t conv_present = 0;
u32_t convspeeddupsetting = 0;
u32_t convphyaddr = 0;
#if 1//控制LED1和LED2闪烁或常亮
u16 led_val;
// 1、设置扩展寄存器地址偏移为 LED1 的配置寄存器 0xA00D
XEmacPs_PhyWrite(xemacpsp, phy_addr, 0x1E, 0xA00D);
// 2、从 0x1F读取 LED1 当前的配置值
XEmacPs_PhyRead(xemacpsp, phy_addr, 0x1F, &led_val);
// 3、修改配置,这里主要将 Bit 6 (Led_gt_on_en_1) 置为 1,使能千兆常亮
led_val |= 0x0040;
// 4、再次写入地址偏移以防被改变
XEmacPs_PhyWrite(xemacpsp, phy_addr, 0x1E, 0xA00D);
// 5、将修改后的值写回 0x1F
XEmacPs_PhyWrite(xemacpsp, phy_addr, 0x1F, led_val);
#endif
#ifdef XPAR_GMII2RGMIICON_0N_ETH0_ADDR
convphyaddr = XPAR_GMII2RGMIICON_0N_ETH0_ADDR;
conv_present = 1;
#endif
#ifdef XPAR_GMII2RGMIICON_0N_ETH1_ADDR
convphyaddr = XPAR_GMII2RGMIICON_0N_ETH1_ADDR;
conv_present = 1;
#endif
#ifdef CONFIG_LINKSPEED_AUTODETECT
link_speed = get_IEEE_phy_speed(xemacpsp, phy_addr);
if (link_speed == 1000) {
SetUpSLCRDivisors(xemacpsp->Config.BaseAddress,1000);
convspeeddupsetting = XEMACPS_GMII2RGMII_SPEED1000_FD;
} else if (link_speed == 100) {
SetUpSLCRDivisors(xemacpsp->Config.BaseAddress,100);
convspeeddupsetting = XEMACPS_GMII2RGMII_SPEED100_FD;
} else if (link_speed != XST_FAILURE){
SetUpSLCRDivisors(xemacpsp->Config.BaseAddress,10);
convspeeddupsetting = XEMACPS_GMII2RGMII_SPEED10_FD;
} else {
xil_printf("Phy setup error \r\n");
return XST_FAILURE;
}
#elif defined(CONFIG_LINKSPEED1000)
SetUpSLCRDivisors(xemacpsp->Config.BaseAddress,1000);
link_speed = 1000;
configure_IEEE_phy_speed(xemacpsp, phy_addr, link_speed);
convspeeddupsetting = XEMACPS_GMII2RGMII_SPEED1000_FD;
sleep(1);
#elif defined(CONFIG_LINKSPEED100)
SetUpSLCRDivisors(xemacpsp->Config.BaseAddress,100);
link_speed = 100;
configure_IEEE_phy_speed(xemacpsp, phy_addr, link_speed);
convspeeddupsetting = XEMACPS_GMII2RGMII_SPEED100_FD;
sleep(1);
#elif defined(CONFIG_LINKSPEED10)
SetUpSLCRDivisors(xemacpsp->Config.BaseAddress,10);
link_speed = 10;
configure_IEEE_phy_speed(xemacpsp, phy_addr, link_speed);
convspeeddupsetting = XEMACPS_GMII2RGMII_SPEED10_FD;
sleep(1);
#endif
if (conv_present) {
XEmacPs_PhyWrite(xemacpsp, convphyaddr,
XEMACPS_GMII2RGMII_REG_NUM, convspeeddupsetting);
}
xil_printf("link speed for phy address %d: %d\r\n", phy_addr, link_speed);
return link_speed;
}
更新记录
24.10.24 更新固定速率,频繁打印link up/link down解决方法
26.3.10 添加YT8531H版本,以太网通信时绿灯不亮问题解决方案
文件下载:
RTL8211F_code.zip
(18.28 KB, 下载次数: 69)
|