1、根据硬件修改设备树
gmac0_pins_a: gmac@0 {
allwinner,pins = "PG0", "PG1", "PG2", "PG3", "PG4",
"PG5", "PG11", "PG12", "PG13", "PG14", "PG15";
allwinner,function = "gmac0";
allwinner,muxsel = <4>;
allwinner,drive = <1>;
allwinner,pull = <0>;
};
gmac0_pins_b: gmac@1 {
allwinner,pins = "PG0", "PG1", "PG2", "PG3", "PG4",
"PG5", "PG11", "PG12", "PG13", "PG14", "PG15";
allwinner,function = "gpio_in";
allwinner,muxsel = <0>;
allwinner,drive = <1>;
allwinner,pull = <0>;
};
&gmac0 {
pinctrl-0 = <&gmac0_pins_a>;
pinctrl-1 = <&gmac0_pins_b>;
pinctrl-names = "default", "sleep";
phy-mode = "rmii";
use_ephy25m = <1>; /* 这里我用的是cpu提供的25M时钟给LAN8720使用 */
tx-delay = <7>;
rx-delay = <31>;
phy-rst = <&pio PE 1 GPIO_ACTIVE_HIGH>;
status = "okay";
};
加上复位引脚总共用到了12个引脚,如果不使用CPU提供的25M时钟则只要11个引脚,功能引脚定义如下图所示(不包含复位引脚):
2、修改以太网驱动代码
将kernel/linux-5.4/drivers/net/ethernet/allwinner/sunxi-gmac.c文件的第779行注释掉。
注释这行代码的原因是我用的这版本的SDK编译以太网驱动有BUG,不改的话移植LAN8720会出现了错误,错误信息为“/# Generic PHY 4500000.eth-0:00: Master/Slave resolution failed, maybe conflicting manual settings?”,排查内核代码发现错误产生在phy_device.c文件的genphy_read_lpa函数,这个函数的作用是读取LPA寄存器的值,错误原因是is_gigabit_capable变量置1了,导致程序一直读取千兆口才有的寄存器,进而报错,进一步排查发现is_gigabit_capable变量在phy初始化的时候都还是0,但是经过 sunxi-gmac.c文件中的geth_phy_init函数就变为1了,函数中显式的将该变量置为1了。最后注释掉这个语句,网口通信正常了,移植时可以先不修改代码,看看运行报不报错,可能后续版本的SDK不存在该问题。
3、修改内核驱动配置文件
把make kernel_menuconfig -> Device Drivers -> Network device support的PHY Device support and infrastructure->SMSC PHYs选上,重新编译内核就可以
问题排查方法:
1、首先排查25M的时钟和50M的时钟,正常情况下这两个时钟会一直输出。
2、排查设备树配置,每个引脚都需要配置。
3、检查硬件LAN8720的功能配置引脚