网卡调试


0、贮备知识

一般网卡由MAC和PHY两部分组成,两者通过两个总线相连:MII/RMII/RGMII和MDIO,前者负责数据传输,后者负责控制phy中的寄存器配置。

详细接口介绍参见:以太网详解(一)-MAC/PHY/MII/RMII/GMII/RGMII基本介绍_sternlycore的博客-CSDN博客_rgmii

1、调试经验

1.1.1 地址配置

错误信息:

[    3.484000] stmmaceth a0580000.ethernet eth0: stmmac_hw_setup: DMA engine initialization failed

[    3.488000] stmmaceth a0580000.ethernet eth0: stmmac_open: Hw setup failed

dts中修改和硬件连接相同的PHY地址。

1.1.2 匹配PHY失败

问题现象:

错误打印No PHY found

问题分析:

网卡分为两个层次:MAC+PHY

一般说来,MAC就是网络控制器,PHY是物理层,负责物理层上的数字编码。

MACPHY通过MII接口传输以太网数据,通过MDIO接口访问PHY的配置寄存器。

出现这个问题一般是硬件问题或者是驱动加载失败。

问题原因:板子功耗太高,2A的电源带不动,换成3A的能探测到PHY

1.1.3 设备操作失败

错误打印:fail to reset dmagmac相关的任何一个时钟不对,都会有这个现象

错误原因:硬件连接虚焊。

1.1.4 Uboot网卡驱动

修改fx6evb.hCONFIG_PHY_ADDR 0x01。重新编译即可

1.1.5 概率性找不到网卡,提示:No PHY found

1、排查部分板卡检测不到PHY问题。

a、有些板子可以,有些板子不行。

    b、正常板卡也有小概率遇到几次也是No PHY found

    c、跟踪代码,咨询次工,修改增加clk配置,没有效果。

d、使用仿真器,通过gmac操作PHY寄存器,读不到id

调试命令:

1set *0xa0582010=0x8805:写GMAC1控制器,bit 11-15phy-addr0x11  bit6-10phy 寄存器的地址0x00 bit0是读操作,bit2是设置mdioclock

2x/xw 0xa0582014:这样在0x14偏移的寄存器的值就是读到phy地址为0x11,寄存器0的值。

调试结果:

把正常板子的程序擦除,保证两个板子的软件状态一致,分别读取PHY的状态和id如下:

正常的板子:能读到正确的状态和id

异常的板子:读取不到状态和id

PHY地址配置错误的打印。

问题原因:88E1512的复位时间需要比较长,硬件复位不够,需要软件控制启动复位时序,手册说明如下:

dtsi中增加配置如下:

因为需要使用到port6组管脚,所以还需要再dts中打开gpio6

追加:有的板卡加了reset后还是会出现“ PHY stmmac-1:01 not found”,短接晶振的匹配电阻可以解决,具体原因还不明?

 

1.1.6 同时打开GMAC0GMAC1导致系统启动异常

1、单独开启时均正常的。

2、同时开启两个,会导致系统卡死,进入不了shell

解决方式:在dts文件中增加如下配置

原因分析:代码里需要知道这个编号来确定文件系统节点的名字,如果不区分的话,所有名字的编号都是0,会冲突。

drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c 中的stmmac_probe_config_dt函数

1.1.7 同时支持两个网口,其中一个dhcp失败。

1、同时两个网口,其中一个获取ip失败。

2、手动配置ip,还是不能ping通网关。

3route设置路由表失败,提示不可达。

问题原因:启动脚本/etc/systemd/network/10-dhcp.network里的dhcp配置错误

解决方式:将Name=eth0 改成Name=eth*

[Match]

Name=eth*

[Network]

DHCP=yes

1.1.8 SDK2.0,经过新的spluboot后,内核gmac不通问题。

   内核不行的原因是,spl中默认开启了gmac的延时配置(SYSCTRL_BASEADDR + 0x570),一般情况下不需要配置:

int board_early_init_f(void)

#if defined(CONFIG_SPL_BUILD)

spi_cs_soft_manage();

/* adjust reference voltage in 3x usb host disconnect detect circuit */

clrbits_le32((SYSCTRL_BASEADDR + 0x240), (0x07 << 4));

clrbits_le32((SYSCTRL_BASEADDR + 0x244), (0x07 << 4));

clrbits_le32((SYSCTRL_BASEADDR + 0x248), (0x07 << 4));

/* adjust reference voltage in eth circuit */

__raw_writel(0xffffffff, SYSCTRL_BASEADDR + 0x144);

__raw_writel(0xffffffff, SYSCTRL_BASEADDR + 0x148);

__raw_writel(0xffffffff, SYSCTRL_BASEADDR + 0x14c);

__raw_writel(0xffffffff, SYSCTRL_BASEADDR + 0x164);

__raw_writel(0xffffffff, SYSCTRL_BASEADDR + 0x168);

__raw_writel(0xffffffff, SYSCTRL_BASEADDR + 0x16c);

//__raw_writel(0x202020, SYSCTRL_BASEADDR + 0x570);

#endif

return 0;

1.1.9 SDK2.0 Uboot支持多个gmac后,ping不通问题。

uboot默认使用的是gmac0,如果要使用指定的gmac,可以通过环境变量控制:ethact=ethernet@a0582000

1.1.10 使用RMII接口出现能发不能收问题。

RGMII修改为RMII接口后,修改MAC模式为RMII模式,出现能发不能收的情况,最后确定是CRS_DV焊错了下拉电阻导致,按照PHY的手册是不需要下拉的。