ETH功能调试记录

调试的目的

在uboot阶段实现ping和tftp功能。

调试的思路

  1. 步骤一
    查询PHY芯片手册,确定PHY芯片的基本信息。
  2. 步骤二
    确认PHY芯片与CPU的引脚对应关系。
  3. 步骤三
    配置网卡相关的设备树信息
  4. 步骤四
    修改uboot板级配置和网卡驱动程序。
  5. 步骤五
    在uboot阶段,通过日志分析eth是否初始化成功,并通过命令确定网络功能。

调试的过程

对上述关键步骤进行详细描述,尽量有理有据,讲清楚修改缘由。

步骤一

查询PHY芯片手册,确定PHY芯片的基本信息。

通过查阅原理图以及实物板,如下图,可以知道PHY芯片为SR8201F。
在这里插入图片描述

通过查阅SR8201F数据手册可知以下信息,SR8201F是国产CoreChips(和芯润德)的100M以太网PHY芯片,对标的是RTL8201F睿利的网卡,通信方案是内部MAC+外部PHY,PHY模式是RMII模式,时钟输入频率是25/50MHz,供电电压是3.3v,复位信号是低电平有效(选中寄存器之后要拉低至少10ms,此信号即位复位信号)。

注意,以上信息在配置设备树的mac节点时需要。

在这里插入图片描述在这里插入图片描述

步骤二

确认PHY芯片与CPU的引脚对应关系。

通过查阅原理图,如下图,可以知道PHY_ADDR是0x1(PHYAD0被拉高),复位引脚是GPIO1_A3、中断引脚是GPIO_C6,其他引脚均使用GMAC0默认引脚
在这里插入图片描述在这里插入图片描述在这里插入图片描述

步骤三

配置网卡相关的设备树信息

查阅板级设备树文件arch/arm/dts/rk3568-evb.dts,找到gmac0节点,如下图
在这里插入图片描述

根据步骤一和步骤二所知信息,修改gmac0节点的属性值,修改后如下,主要是修改引脚和RMII模式

&gmac0 {
	phy-mode = "rmii";    /*此处修改,修改之前是phy-mode = "rgmii"; */
	clock_in_out = "output";

	snps,reset-gpio = <&gpio1 RK_PA3 GPIO_ACTIVE_LOW>;    /*此处修改,修改之前是snps,reset-gpio = <&gpio2 RK_PD3 GPIO_ACTIVE_LOW>;*/
	snps,reset-active-low;
	/* Reset time is 20ms, 100ms for rtl8211f */
	snps,reset-delays-us = <0 20000 100000>;
	assigned-clocks = <&cru SCLK_GMAC0_RX_TX>, <&cru SCLK_GMAC0>;
	assigned-clock-parents = <&cru SCLK_GMAC0_RMII_SPEED>; /*此处修改,修改之前是assigned-clock-parents = <&cru SCLK_GMAC0_RGMII_SPEED>;*/
	assigned-clock-rates = <0>, <50000000>;    /*此处修改,修改之前是assigned-clock-rates = <0>, <125000000>;*/

	pinctrl-names = "default";
	// pinctrl-0 = <&gmac0_miim
	// 	     &gmac0_tx_bus2
	// 	     &gmac0_rx_bus2
	// 	     &gmac0_rgmii_clk
	// 	     &gmac0_rgmii_bus>;
   //	     此处修改,将以上代码注释,并添加以下代码
     
	pinctrl-0 = <&gmac0_miim
                &gmac0_tx_bus2
                &gmac0_rx_bus2
                &gmac0_clkinout
                &gmac0_rx_er>;

//	tx_delay = <0x3c>;
//	rx_delay = <0x2f>;
//	此处修改,将以上代码注释,这是RGMII模式需要的属性,RMII不需要。

	phy-handle = <&rmii_phy0>;/*此处修改,修改之前是phy-handle = <&rgmii_phy0>;*/
	status = "okay";/*此处修改,修改之前是status = "disabled"; */
};

查阅板级设备树文件arch/arm/dts/rk3568-evb.dts,找到mdio0节点,如下

&mdio0 {
	rgmii_phy0: phy@0 {
		compatible = "ethernet-phy-ieee802.3-c22";
		reg = <0x0>;
	};
};

根据步骤二所知信息,修改mdio0节点的属性值,修改后如下,主要是修改PHY地址和RMII模式名

&mdio0 {
 	rmii_phy0: phy@1 { //	rgmii_phy0: phy@0
 		compatible = "ethernet-phy-ieee802.3-c22";
 		reg = <0x1>;//		reg = <0x0>;
	};
};

查阅引脚命名设备树文件arch/arm/dts/rk3568-pinctrl.dtsi,找到gmac0节点,查阅对比gmac0引脚相关的定义如下图,这部分不需要修改,可对比原理图,看引脚是否对应正确。
在这里插入图片描述

步骤四

修改uboot板级配置和网卡驱动程序。

首先,取消CONFIG_OF_SPL_REMOVE_PROPS配置,禁止设备树属性被删除。
打开configs/rk3568_defconfig在文件末尾添加以下代码,或者在该文件中找到该配置项并清空。原因是这个配置的值,会导致设备树的属性被删除,出现网卡查找设备树节点属性失败的错误,比如clock-names。

CONFIG_OF_SPL_REMOVE_PROPS=""

然后,默认uboot网口0。
打开net/eth-uclass.c,找到函数int eth_initialize(void),添加以下代码实现默认网卡0

int eth_initialize(void)
{
	........
	printf("eth%d: %s", dev->seq, dev->name);
// 添加内容如下,其中两个宏定义可以移到 include/configs/rk3568_common.h
#define CONFIG_RK_ETH_CURNUM  0    
#define CONFIG_RK_ETH_CURNAME "ethernet@fe2a0000"  // eth0: ethernet@fe2a0000 和 eth1: ethernet@fe010000

#ifdef CONFIG_RK_ETH_CURNUM
	if (dev->seq == CONFIG_RK_ETH_CURNUM){
		eth_set_dev(dev);
		eth_current_changed();
	}
#endif // CONFIG_RK_ETH_CURNUM

#ifdef CONFIG_RK_ETH_CURNAME
	if (strcmp(dev->name, CONFIG_RK_ETH_CURNAME) == 0){
		eth_set_dev(dev);
		eth_current_changed();
	}
#endif // CONFIG_RK_ETH_CURNAME
	........
}

步骤五

在uboot阶段,通过日志分析eth是否初始化成功,并通过命令确定网络功能。

uboot启动时,有如下打印,则网卡初始化成功。
在这里插入图片描述

使用print ethact查询,如果ethact的值为ethernet@fe2a0000,则成功默认网卡0。
在这里插入图片描述

准备测试ping和tftp功能,使用以下命令设置网络相关环境变量。

setenv gatewayip 192.168.16.1
setenv ipaddr 192.168.16.194
setenv netmask 255.255.255.0
setenv serverip 192.168.16.192

在这里插入图片描述

ping 192.168.16.192

出现host 192.168.16.192 is alive打印,说明ping命令成功。
在这里插入图片描述

tftp 20000000 uboot.img

出现如下图###...,并且done打印,说明tftp下载成功。
在这里插入图片描述

可以使用内存打印命令查询内存地址的值。

md.b 20000000 200

在这里插入图片描述

遇到的问题

对遇到的问题,进行记录,如何重现问题的,现象是怎么样的,怎么解决或规避的,当时解决问题的思路是怎样的。
网络不可用

BUG1:网卡默认

在只修改设备树之后启动板子,然后执行网络功能的命令则会出现,比如ping、dhcp和tftp等。

现象或日志

描述问题产生的现象,可以附上关键日志,或截图(如果是日志尽量以文本方式呈现,尽量去除不重要的日志,方便搜索)

EQOS_DMA_MODE_SWR stuck
在这里插入图片描述

解决思路

描述对导致问题发生的原因,进行的合理猜测。(错误的猜测也记录,但不用在解决过程中详细描述,只需备注一下即可)

  1. 猜测一
    网卡驱动有错误。
  2. 猜测二 (已验证不是此原因)
  3. 猜测三 (已验证不是此原因)

解决过程

详细描述如何验证猜测,并最终解决问题(只记录正确的猜测验证就可)。

1、根据打印日志跟踪驱动代码,发现是因为RK官方板默认网卡1导致的问题,
2、而我们的板调试网口是eth0,关于eht1没有配置,所以在初始化eth1时出现段错误。
3、此问题通过默认网卡0可以解决

参考内容

调试过程中参考的文章(可以链接方式提供,也可以再次整理),需要重新梳理的一些概念,用到的调试技术。

知识点:【概述】网络驱动 网卡基本知识
Ethernet Quality-of-Service —— EQOS
Reduced Gigabit Media Independent Interface —— RGMII

网络驱动基本知识
第一大部分:原理图 + 模块数据手册 = 设备树
第二大部分:驱动程序

以太网模块的硬件相关的驱动代码主要包括 GMAC 和 PHY。
国际协议规定,所有的PHY芯片的前16个寄存器是固定的。也就是说,uboot源码里面的PHY芯片驱动基本不需要修改,或者修改很少,基本都使用默认驱动程序。
drivers/net/phy/,phy驱动所在目录

phy位于物理层,由mac(数据链路层)来与其相连。

MDIO
MDIO 接口有两个引脚,ENET_MDC 和 ENET_MDIO,ENET_MDC 提供时钟,ENET_MDIO 进行数据传输。
一个 MIDO 接口可以管理 32 个 PHY 芯片,同一个 MDIO 接口下的这些 PHY 使用不同的器件地址来做区分,MIDO 接口通过不同的器件地址即可访问到相应的 PHY 芯片。
mac接口支持RMII与RGMII二种模式,也就是百兆与千兆
mdio/mdc是manager控制脚;tx/rx是差分传输脚,此两个引脚只有RGMII模式才有。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值