T536 网卡调试

问题简述

使用命令 udhcpc -i ethx 无法获取动态 IPv4 。

给当前网卡添加静态 IPv4(已确认该 IPv4 没有被占用),无法去 ping 通同一网段下的其它主机。

问题定位

更换 PHY 芯片

由于 T536 Demo 板是能正常通信的,它用的 PHY 芯片是 rtl8211 ,而我们自己的 T536 的 PHY 芯片是 yt8531H。尝试更换为 rtl8211 后,发现能正常通信。

这时就把问题定位到 PHY 芯片。

双网卡对测
不同板子对测

把我司的 T536 和原厂的 Demo 板对测(已确认 Demo 板的所以网卡都能正常通信)。

下面用板 A 代表我司的 T536 ,板 B 代表原厂的 Demo 板。

板 A 和板 B 的 eth0 连接彼此。

设置板 A 的 eth0 :

root@T536:~# ifconfig eth0 192.168.1.11
[  212.664547] sunxi:sound-mach:[WARN]: 372 asoc_simple_parse_ucfmt(): set data late to default
[  212.674095] sunxi:sound-mach:[ERR]: 488 simple_parse_of(): simple_dai_link_of failed
[  212.822861] dwmac-sunxi 4500000.ethernet eth0: PHY [stmmac-0:01] driver [Generic PHY] (irq=POLL)
[  212.843105] dwmac4: Master AXI performs fixed burst length
[  212.849408] dwmac-sunxi 4500000.ethernet eth0: Enabling Safety Features
[  212.867340] dwmac-sunxi 4500000.ethernet eth0: IEEE 1588-2008 Advanced Timestamp supported
[  212.877403] dwmac-sunxi 4500000.ethernet eth0: configuring for phy/rgmii link mode
[  215.957540] dwmac-sunxi 4500000.ethernet eth0: Link is Up - 1Gbps/Full - flow control off
[  215.967218] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready

设置板 B 的 eth0 :

root@T536:~# ifconfig eth0 192.168.1.22
[  417.033317] dwmac-sunxi 4500000.ethernet eth0: PHY [stmmac-0:01] driver [RTL8211F Gigabit Ethernet] (irq=POLL)
[  417.046276] dwmac4: Master AXI performs fixed burst length
[  417.052574] dwmac-sunxi 4500000.ethernet eth0: Enabling Safety Features
[  417.060348] dwmac-sunxi 4500000.ethernet eth0: IEEE 1588-2008 Advanced Timestamp supported
[  417.071640] dwmac-sunxi 4500000.ethernet eth0: configuring for phy/rgmii link mode
[  420.179643] dwmac-sunxi 4500000.ethernet eth0: Link is Up - 1Gbps/Full - flow control rx/tx
[  420.189161] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready

板 B PING 板 A ,在板 B 使用tcpdump -i eth0 去抓包:

在板 A 使用tcpdump -i eth0 去抓包:

通过对比可知,板 B 往板 A 发送数据,板 A 是能正常接收的。同时也发现板 A 发出 reply 包给板 B ,但这是 tcpdump 从软件驱动层面上捕获的数据包,我们并不清楚这个数据包是否传输给对端。看板 B ,它接收不到来自板 A 的 reply 包,而且先前已确认板 B 的 eth0 能正常通信,所以可确定板 A 的 eth0 的 TX 有问题。

为了再次定位问题,我重新给板 A 的 eth0 与交换机连接,使用 tcpdump -i eth0 去抓包:

发现是能正常接收的,结合以上总总原因和结果,确定 TX 通信有问题。

同一块板子

如果一块板子有两个及以上的网卡,可参考以下文章去对测:

双网口回环测试(亲自测试有效)_多网口回环测试-CSDN博客

检查 RX 和 TX 的波形

在我司的 T536 硬件原理图,看 TX 和 RX 的时钟:

使用示波器看它们两的时钟波形(当前网卡的模式是 100M FULL ):

RX:

TX:

发现 RX 的时钟频率为 25M ,是正常的。但是 TX 的时钟频率仅有 5M ,正常来说,TX 的时钟频率是 25M 。

所以从硬件上定位到问题,就是 TX 的时钟频率过低,导致根据 5M 时钟频率从 TX 发出的数据,对端 RX(时钟频率 25M )无法正常接收。

解决问题

查看 EPHY0-CLKOUT-125M

与裕太工程师沟通后,去检查 PHY 芯片的 Pin 35 引脚,即 EPHY0-CLKOUT-125M :

以下是它引出部分:

使用示波器检查该引脚发现时钟频率仅有 25M 。

再次与裕太工程师沟通后,得知需要检查 PHY 芯片的 ext 0xa012寄存器,以下是该寄存器的作用:

在终端输入以下命令:

root@T536:~# phytool write eth0/0/30 0xa012
root@T536:~# phytool eth0/0/31
ieee-phy: reg:0x1f val:0x00c8

可知现在 ext 0xa012寄存器的值为 0x00c8 ,现在的状态为:25M reference clk 、clk 输出 25M 、link down 时也允许 clk 输出和 enable clk 输出。

然后我尝试把 25M reference clk 改为 from PLL 125M clk 输出 25M 改为 clk 输出 125M 。

root@T536:~# phytool write eth0/0/30 0xa012
root@T536:~# phytool write eth0/0/31 0x00d0

再次查看:

root@T536:~# phytool write eth0/0/30 0xa012
root@T536:~# phytool eth0/0/31
ieee-phy: reg:0x1f val:0x00d0

使用示波器去看时钟波形,发现 PHY 芯片的 Pin 35 已输出 125M 。

同时,TX 和 RX 的时钟频率都是 25M 。然后使用 udhcpc -i ethx 去获取动态 IPv4 ,发现获取成功,说明现在能正常通信了。

核心板上的 PHY1 的操作步骤和以上的一致。

在终端操作 PHY 寄存器

以下是给 yt8531 设置 125M 时钟输出的脚本:

#!/bin/bash

ETH=$1

point_synce_reg() {
    phytool write ${ETH}/0/30 0xa012
}

ifconfig ${ETH} up

point_synce_reg
echo "before (`phytool ${ETH}/0/31`)"

point_synce_reg
phytool write ${ETH}/0/31 0x00d0

point_synce_reg
echo "after (`phytool ${ETH}/0/31`)"
 

在 PHY 驱动操作寄存器

在通用 PHY 驱动内修改不方便,所以在裕太的 PHY 驱动内修改。

每次启动网卡时,会启动对应的 PHY 芯片,期间会调用 struct phy_driver 内定义的 .config_init(),来初始化 PHY 芯片。在裕太 PHY 驱动中,有对 yt8531 的 .config_init() ,即 yt8531_config_init() 。在该函数内添加以下代码,把 0x00d0 写入到 ext 0xa012 寄存器:

static int yt8531_config_init(struct phy_device *phydev)
{
    int ret = 0, val = 0;

    ...

+   ret = ytphy_write_ext(phydev, 0xa012, 0x00d0);
+   if (ret < 0)
+       return ret;

    ytphy_soft_reset(phydev);

    return 0;
}
 

 

### 解决1000BASE-T网络连接问题的方法 对于108E1512芯片,在配置SGMII至1000BASE-T模式的过程中,如果遇到网络连接问题,可以采取如下措施来排查并解决问题。 #### 使用诊断工具检测物理层状态 利用内置自检(BIST, Built-In Self Test)功能或其他专用硬件测试设备验证PHY(Physical Layer)的工作状况。这一步骤有助于确认是否存在底层硬件缺陷或环境干扰因素影响正常通信[^1]。 #### 检查链路伙伴兼容性 确保两端设备均支持相同的速率协商协议(Auto-Negotiation Protocol)。不匹配可能导致握手失败进而引起连通性障碍。查阅双方厂商提供的数据手册以获取具体参数说明,并调整设置使之相互适配。 #### 验证软件驱动版本 过时的操作系统补丁包或者网卡固件更新不足也会引发异常情况。建议定期访问制造商网站下载最新发布的稳定版程序文件完成升级操作,从而减少因软件层面引起的错误几率。 #### 排除外部电磁干扰源的影响 当周围存在强功率无线发射装置或是大型电机运转时产生的磁场辐射会对传输线路造成不利作用。尝试改变布线路径远离上述潜在威胁区域;另外也可以考虑采用屏蔽性能更优的数据缆线产品替代原有材料。 ```bash ethtool eth0 # 查看当前接口的状态信息 mii-tool eth0 # 显示介质独立接口(MII)的状态报告 ``` 以上命令可以帮助快速了解Linux环境下对应端口的具体运行情形,便于进一步分析定位故障所在位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值