GMAC
概述
本文提供 Rockchip 平台以太网 GMAC 接口的使用文档,用于解决大部分以太网问题。
产品版本
读者对象
本文档(本指南)主要适用于以下工程师:
- 技术支持工程师
- 软件开发工程师
1. 代码位置
以太网模块的硬件相关的驱动代码主要包括 GMAC 和 PHY。其中 PHY 驱动一般使用通用 PHY 驱动,如果有需要修改特殊寄存器,请使用对应的 PHY 驱动,代码都在 drivers/net/phy
。另外,RK322x/RK3328 自带有一个百兆的 PHY 芯片。
- Linux3.10 GMAC 驱动代码:
driver/net/ethernet/rockchip/gmac/*
- 其它内核 GMAC 驱动代码(高于3.10的内核版本):
drivers/net/ethernet/stmicro/stmmac/*
- RK 内部 EPHY 驱动代码:
drivers/net/phy/rockchip.c
2. DTS
DTS 的配置参考 Documentation/devicetree/bindings/net/rockchip-dwmac.txt
。
gmac: ethernet@ff290000 {
compatible = "rockchip,rk3288-gmac";
reg = <0xff290000 0x10000>;
interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "macirq";
rockchip,grf = <&grf>;
clocks = <&cru SCLK_MAC>,
<&cru SCLK_MAC_RX>, <&cru SCLK_MAC_TX>,
<&cru SCLK_MACREF>, <&cru SCLK_MACREF_OUT>,
<&cru ACLK_GMAC>, <&cru PCLK_GMAC>;
clock-names = "stmmaceth",
"mac_clk_rx", "mac_clk_tx",
"clk_mac_ref", "clk_mac_refout",
"aclk_mac", "pclk_mac";
phy-mode = "rgmii";
pinctrl-names = "default";
pinctrl-0 = <&rgmii_pins /*&rmii_pins*/>;
clock_in_out = "input";
snps,reset-gpio = <&gpio4 7 0>;
snps,reset-active-low;
snps,reset-delays-us = <0 10000 1000000>;
assigned-clocks = <&cru SCLK_MAC>;
assigned-clock-parents = <&ext_gmac>;
tx_delay = <0x30>;
rx_delay = <0x10>;
status = "ok";
};
板级配置需要关注的部分有以下几部分:
phy-mode
:主要分为 RMII 和 RGMII 模式。snps,reset-gpio
:PHY 的硬件复位脚。snps,reset-delays-us
:PHY 的复位时序,三个时间分别表示 PHY 的不同阶段的复位时序,不同的 PHY 的复位时序是不一样的。如果是snps,reset-active-low
属性,则表示三个时间分别表示 Reset pin 脚拉高,拉低,再拉高的时间;如果是snps,reset-active-high
属性,则反之。phy-supply
:如果 PHY 的电源是常供方式,可以不用配置;否则,需要配置对应的 regulator。- 时钟配置:请参考本文的第三章节。
pinctrl
:RGMII 和 RMII 模式下配置不一样,另外对于时钟方式,如果是输出时钟的 pin 脚,该 pin 脚驱动强度一般也是不一样的,例如 RMII 模式下 ref_clock pin 脚输出时钟时,驱动强度也会配置更大。tx_delay
/rx_delay
:RGMII 模式下需要配置该属性,请参考本文的 RGMII Delayline 第八章节。
因为不同芯片下的不同模式配置比较多,请参考另一份文档《Rockchip_Developer_Guide_Linux_GMAC_Mode_Configuration_CN.pdf》。
3. PHY 寄存器读写调试
驱动提供了读写寄存器的接口,目前在不同内核版本上有两套接口。路径:/sys/bus/mdio_bus/devices/stmmac-0:00
,其中 stmmac-0:00
表示 PHY 地址是 0。
3.1 Linux 3.10
/sys/bus/mdio_bus/devices/stmmac-0:00/phy_reg
/sys/bus/mdio_bus/devices/stmmac-0:00/phy_regValue
-
写入: 例如,往 Reg0 写入 0xabcd
echo 0x00 > /sys/bus/mdio_bus/devices/stmmac-0:00/phy_reg
echo 0xabcd > /sys/bus/mdio_bus/devices/stmmac-0:00/phy_regValue -
读取:例如,读取 Reg0 值
echo 0x00 > /sys/bus/mdio_bus/devices/stmmac-0:00/phy_reg
cat /sys/bus/mdio_bus/devices/stmmac-0:00/phy_regValue
3.2 其它版本
/sys/bus/mdio_bus/devices/stmmac-0:00/phy_registers
- 写入:
例如, 往 Reg0 写入 0xabcd
echo 0x00 0xabcd > /sys/bus/mdio_bus/devices/stmmac-0:00/phy_registers
- 读取:
该命令会读取 0~31 的所有寄存器,所以可以查看对应的寄存器值。
cat /sys/bus/mdio_bus/devices/stmmac-0:00/phy_registers
4. MAC 地址
目前对 MAC 地址的读取策略是,优先使用 DTB 里面的 MAC 地址(uboot 也会写入),之后是烧写在 IDB 中的 MAC 地址,若该地址符合规范,则使用,若不符合或没有烧写,则使用随机生成的地址(重启开机 MAC 地址会变化)。在 RK3399、RK3328/RK3228H 及以后的版本中,对策略进行了完善:优先使用烧写在 IDB 或 vendor Storage 中的 MAC 地址,若该地址符合规范,则使用,若不符合或没有烧写,则随机生成 MAC 地址保存到 Vendor 分区中并使用,重启或恢复出厂设置不会丢失。
MAC 地址烧写工具参考文档《Rockchip_User_Guide_RKDevInfoWriteTool_CN.pdf》。
5. 回环测试
回环测试主要有 MAC 和 PHY 两种回环,具体可参考《Rockchip_Developer_Guide_Linux_GMAC_RGMII_Delayline_CN.pdf》文档里面,对 phy_lb
和 mac_lb
节点的说明。
6. RGMII Delayline
RGMII 接口提供了 tx 和 rx 的 delayline,用于调整 RGMII 时序,如何获取合适的 RGMII Delayline,请参考文档《Rockchip_Developer_Guide_Linux_GMAC_RGMII_Delayline_CN.pdf》。
7. LED 灯
PHY 有各自的 LED 控制,下面是 RK3228 和 RK3328 里面的 macphy,其它外部 PHY 请参考其 datasheet。下面是 RK3228 和 RK3328 LED 配置:
- RK3228:需要打上补丁
kernel_4.4_rk322x_phy_led_control.patch
。 - RK3328:通过配置 dts 上的 iomux,例如通过 rx 和 link 控制 led,则配置上对应的 pinctrl。
phy: phy@0 {
compatible = "ethernet-phy-id1234.d400", "ethernet-phy-ieee802.3-c22";
reg = <0>;
clocks = <&cru SCLK_MAC2PHY_OUT>;
resets = <&cru SRST_MACPHY>;
pinctrl-names = "default";
pinctrl-0 = <&fephyled_rxm1 &fephyled_linkm1>;
phy-is-integrated;
};
8. WOL
Wake On Lan 功能,对于每个 PHY 来说配置的寄存器是不一样的。目前收录的补丁,包含了 RTL8211E/F,RTL8201F。
9. MAC To MAC 直连
参考文档《Rockchip_Developer_Guide_Linux_MAC_TO_MAC_CN.pdf》。