调试的目的
在uboot阶段实现ping和tftp功能。
调试的思路
- 步骤一
查询PHY芯片手册,确定PHY芯片的基本信息。 - 步骤二
确认PHY芯片与CPU的引脚对应关系。 - 步骤三
配置网卡相关的设备树信息 - 步骤四
修改uboot板级配置和网卡驱动程序。 - 步骤五
在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、根据打印日志跟踪驱动代码,发现是因为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模式才有。