网卡调试
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是物理层,负责物理层上的数字编码。
MAC和PHY通过MII接口传输以太网数据,通过MDIO接口访问PHY的配置寄存器。
出现这个问题一般是硬件问题或者是驱动加载失败。
问题原因:板子功耗太高,2A的电源带不动,换成3A的能探测到PHY。
1.1.3 设备操作失败
错误打印:fail to reset dma,gmac相关的任何一个时钟不对,都会有这个现象
错误原因:硬件连接虚焊。
1.1.4 Uboot网卡驱动
修改fx6evb.h中CONFIG_PHY_ADDR 0x01。重新编译即可
1.1.5 概率性找不到网卡,提示:No PHY found
1、排查部分板卡检测不到PHY问题。
a、有些板子可以,有些板子不行。
b、正常板卡也有小概率遇到几次也是No PHY found。
c、跟踪代码,咨询次工,修改增加clk配置,没有效果。
d、使用仿真器,通过gmac操作PHY寄存器,读不到id。
调试命令:
1、set *0xa0582010=0x8805:写GMAC1控制器,bit 11-15是phy-addr(0x11) bit6-10是phy 寄存器的地址(0x00), bit0是读操作,bit2是设置mdio的clock。
2、x/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 同时打开GMAC0和GMAC1导致系统启动异常
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通网关。
3、route设置路由表失败,提示不可达。
问题原因:启动脚本/etc/systemd/network/10-dhcp.network里的dhcp配置错误
解决方式:将Name=eth0 改成Name=eth*
[Match]
Name=eth*
[Network]
DHCP=yes
1.1.8 SDK2.0,经过新的spl、uboot后,内核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的手册是不需要下拉的。