RK356x-7:以太网RTL8211配置和调试指南
RK356x-7:以太网RTL8211配置和调试指南
本文将详细介绍RK356x-7系列芯片中以太网RTL8211的配置和调试过程。通过本文,读者将了解如何根据电路板原理图选择合适的接口模式,如何在dts文件中进行相应的配置,以及在遇到问题时如何进行调试。
相关文件
- 开发帮助文档
相关开发帮助文档位于目录docs/cn/Common/GMAC
下:
Rockchip_Developer_Guide_Linux_GMAC_CN.pdf
Rockchip_Developer_Guide_Linux_GMAC_Mode_Configuration_CN.pdf
Rockchip_Developer_Guide_Linux_GMAC_RGMII_Delayline_CN.pdf
这三个文件非常重要,将在后续配置过程中用到。
- 驱动文件
驱动文件分为GMAC(芯片接口)和PHY(以太网模块)两部分:
- GMAC驱动文件位于
drivers/net/ethernet/stmicro/stmmac/
目录下,具体文件为dwmac-rk.c
。其中的rk_gmac_dwmac_match
结构体用于匹配dts文件中的compatible字段。 - PHY驱动文件位于
drivers/net/phy/
目录下。在板级文件中配置CONFIG_NETDEVICES=y
后,drivers/net/phy/Kconfig
文件会默认打开REALTEK_PHY
,使得realtek.c
得以编译和应用,这就是RTL8211的驱动文件。
模式确认
以太网芯片通常支持MII、RMII、GMII、RGMII等接口模式。RK356x-7主要支持RMII和RGMII模式。通过查看电路板原理图,并对照Rockchip_Developer_Guide_Linux_GMAC_Mode_Configuration_CN.pdf
,可以确认需要配置的模式。
经过对比,电路图对应的是RGMII Crystal 25M for PHY, RGMII_CLK input 125M for TX_CLK,且接在芯片的GMAC1M0口。
dts配置
根据开发文档和原理图,需要对dts文件进行如下配置:
- 打开gmac1节点(设置状态为okay)。
- 将gmac1模式设为rgmii,input。
- 由于数据接口是GMAC1M0,因此pinctrl-0所有引脚必须是gmac1m0。
- 设置phy-handle为rgmii_phy1,并在节点&mdio1中修改rgmii_phy1协议为ethernet-phy-ieee802.3-c22。
- PHY(RTL8211)的复位引脚是PHYRSTB,原理图上接的芯片引脚GMAC1_RSTn是GPIO3_C6,因此需要配置
snps,reset-gpio
。
最终的dts配置如下:
&gmac1 {
phy-mode = "rgmii";
clock_in_out = "input";
snps,reset-gpio = <&gpio3 RK_PC6 GPIO_ACTIVE_LOW>;
snps,reset-active-low;
/* Reset time is 20ms, 100ms for rtl8211f */
snps,reset-delays-us = <0 100000 500000>;
assigned-clocks = <&cru SCLK_GMAC1_RX_TX>, <&cru SCLK_GMAC1>;
//assigned-clock-parents = <&cru SCLK_GMAC1_RGMII_SPEED>, <&cru CLK_MAC1_2TOP>;
assigned-clock-parents = <&cru SCLK_GMAC1_RGMII_SPEED>, <&gmac1_clkin>;
assigned-clock-rates = <0>, <125000000>;
pinctrl-names = "default";
pinctrl-0 = <&gmac1m0_miim
&gmac1m0_tx_bus2
&gmac1m0_rx_bus2
&gmac1m0_rgmii_clk
&gmac1m0_rgmii_bus
&gmac1m0_clkinout>;
tx_delay = <0x4f>;
rx_delay = <0x25>;
phy-handle = <&rgmii_phy1>;
status = "okay";
};
完成上述配置后,编译烧录运行,插上网线到以太网接口,运行命令ip a
,应该可以看到网络IP。
调试
如果在第3节运行系统后发现ip a
无法获取IP,但有一个eth0节点,这可能表示驱动不对。需要检查和修改驱动代码:
在驱动文件
kernel/drivers/net/phy/realtek.c
中,找到结构体realtek_drvs
。如果以太网芯片是RTL8211F,找到对应的ID(如0x001cc916),并将其添加到realtek_tbl
中:static const struct mdio_device_id __maybe_unused realtek_tbl[] = { ... { PHY_ID_MATCH_VENDOR(0x001cc916) }, {} };
如果仍然无法获取IP,检查驱动是否正常加载:
cd /sys/bus/platform/devices/fe010000.ethernet/net/eth0
如果不存在这个目录,说明驱动不正常,需要继续检查dts文件配置。
检查eth0是否打开:
cat /sys/devices/platform/fe010000.ethernet/net/eth0/carrier
如果结果是0,表示eth0没有打开,需要执行命令打开:
ifconfig eth0 up
此时再去执行
cat
结果应该是1了。确认eth0打开后,启动DHCP服务:
dhcpcd
再次执行
ip a
命令,应该可以看到IP地址。
一般的根文件系统会自动打开eth0并启动DHCP,但手动调试时需要确保这些步骤都正确执行。