产品上网口没有显示?无法进行ping命令?速度拉跨?还经常丢包?那一定是漏掉了什么细节了,看看下面操作,说不定能够帮到你。
网口驱动移植的准备
本次我们使用的平台是致远电子M3568系列核心板,网口模块是致远电子ePort系列的ePort-G型号产品,速率可达千兆,而且简化硬件设计,缩短开发时间。
配置网口驱动时,我们得先了解原理图中网口对应的模式以及地址,确认好用到的引脚,方便之后的设备树配置,如下图参考:
可以看到我们要使用的物理地址及PHY的工作模式,同时也要注意电压的配置,与硬件工程师确认网口模块所需要的IO电压,根据需求不同去配置电源域(3.3V或1.8V)。
驱动程序的移植及设备树的修改
调试之前需要根据官方说明去修改drivers/net/phy下的Makefile和Kconfig,然后将官方的驱动拷贝到该目录下。或者直接修改Makefile将该驱动文件编译到内核,不修改Kconfig,这样就不用make menuconfig去勾选上网口驱动。之后在RK平台下调整设备树部分,由于ePort-G该网口型号支持千兆,官方说明千兆时钟应设为125M,如下参考(注:其他如复位引脚和设置pinctrl的引脚未写出),根据原理图实际配置来修改设备树。
&gmac1 {
phy-mode = "rgmii"; //PHY接口模式
clock_in_out = "output"; //时钟输入输出方向,该为MAC输出给PHY,input则相反
//设置千兆所需要的时钟
assigned-clocks = <&cru SCLK_GMAC0_RX_TX>, <&cru SCLK_GMAC0>;
assigned-clock-parents = <&cru SCLK_GMAC0_RGMII_SPEED>, <&cru CLK_MAC0_2TOP>;
assigned-clock-rates = <0>, <125000000>;
//根据PCB布线不同修改值
tx_delay = <0x21>;
rx_delay = <0x2f>;
phy-handle = <&rgmii_phy0>;
status = "okay";
};
&mdio1 {
rgmii_phy1: phy@2 {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <7>; //PHY的物理地址,原理图上有标出
};
}
之后编译内核,查看drivers/net/phy下有无生成对应驱动的.o文件,若驱动程序在编译过程出现报错,可能要根据自己内核版本去修改官方的驱动程序,将一些没有的函数屏蔽或替换。编译完成后将boot.img烧录到开发板上(内核和设备树)。
查看网口是否配置成功及网口调试
1. 配置检查
进入开发板,查看sys/bus/mdio_bus/下面的drivers和devices,分别进入查看是否在devices中生成对应节点以及查看devices下的phy_id是否与驱动程序中自己网口型号的phy_id一致,如果没有出现对应节点情况检查设备树中compatible的属性,如果还不一致则将iee部分改成id+网口型号的phy_id。如下图:
输入命令ifconfig ethx dowm和ifconfig ethx up(x为网口号)检查是否能正常起来,尝试更改设置ip地址,连接网线进行ping命令查看可否通同一网段下的网线另一端地址。
2. 网口调试
在ping通外网之后可以尝试使用iperf3来进行网络测试,测试通过iperf3功能从板子做服务器接收速度和板子做客户端发送速度的数据来观测是否达到要求。如下图:
当然,也可能存在丢包情况,这种情况需要适当的调整MAC的tx_delay和rx_delay,也可以通过在驱动程序中调整寄存器值的方式来控制phy的tx_delay和rx_delay,一般调整MAC。通过RK平台下中/sys/device/platform/fe….ethernet/rgmii_delay可以调试修改tx_delay和rx_delay,输入命令echo 0x2a 0x26 > rgmii_delay(第一个延迟参数为tx,第二个为rx),修改的数值可以根据该目录下的phy_ld_scan工具来查看。拔掉网线,输入命令echo 1000 > phy_ld_scan后,如下图所示:
有0的表示通路,根据横(TX的延时)纵(RX的延时)坐标来观察出TX和RX的延时应设置为多少。如果根本没有0或者0很少的情况则考虑下硬件走线是否过长导致。