目录
前言
最近在RK3568 Android13 SDK上进行网口适配工作,硬件上使用的PHY芯片为RTL8211F,RK官方已经适配好了相应驱动,只要修改设备树文件与自己原理图对应起来就可以了。本文将从GMAC硬件原理、设备树配置、调试常用命令三个方面详细讲解适配过程。
一、Rockchip GMAC网口介绍
1.1 什么是GMAC
Rockchip系列SoC内置了GMAC
(Gigabit Media Access Controller),也就是千兆以太网MAC控制器[ citation:4]。只要外接一颗PHY芯片,就能实现以太网功能。
SoC (GMAC) <--RGMII/RMII--> PHY芯片 <--RJ45--> 网线
1.2 接口模式
RK3568支持的PHY接口主要有两种:
| 接口 | 速率 | 数据线 | 时钟 |
|---|---|---|---|
| RGMII | 10/100/1000Mbps | 4根TX + 4根RX | TX_CLK + RX_CLK |
| RMII | 10/100Mbps | 2根TX + 2根RX | 50MHz REF_CLK |
千兆网必须使用RGMII模式,这也是最常见的配置。
1.3 时钟方向
RGMII模式下,时钟方向有两种配置:
-
clock_in_out = "input":125MHz时钟由PHY提供(推荐,更稳定) -
clock_in_out = "output":125MHz时钟由主控PLL提供
二、硬件原理分析

关键信号说明:
-
TXD/RXD:数据线,RGMII模式下共8根
-
TXCLK/RXCLK:125MHz时钟(千兆)或25MHz/2.5MHz(百兆/十兆)
-
MDC/MDIO:管理总线,用于读写PHY寄存器
-
RESET:PHY复位信号,低有效
-
REFCLK_OUT:主控输出25MHz给PHY作为参考时钟
三、设备树配置
3.1 完整的GMAC设备树节点
根据原理图,设备树配置如下:
kernel-5.10/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi
&gmac1 {
phy-mode = "rgmii";
clock_in_out = "input";
snps,reset-gpio = <&gpio3 RK_PB0 GPIO_ACTIVE_LOW>;
snps,reset-active-low;
snps,reset-delays-us = <0 20000 100000>;
assigned-clocks = <&cru SCLK_GMAC1_RX_TX>, <&cru SCLK_GMAC1>;
assigned-clock-parents = <&cru SCLK_GMAC1_RGMII_SPEED>, <&cru CLK_MAC1_2TOP>;
assigned-clock-rates = <0>, <125000000>;
pinctrl-names = "default";
pinctrl-0 = <&gmac1m1_miim
&gmac1m1_tx_bus2
&gmac1m1_rx_bus2
&gmac1m1_rgmii_clk
&gmac1m1_rgmii_bus>;
tx_delay = <0x4f>;
rx_delay = <0x26>;
phy-handle = <&rgmii_phy1>;
status = "okay";
};
&mdio1 {
rgmii_phy1: phy@1 {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <0x1>;
};
};
这里mdio1节点下的reg地址需要看RTL8211F的[PHYAD2:PHYAD0]引脚接线,我这里由下图看出是[001]。

对于clock_in_out 属性是 "output",还是“input”,需要去根据自己的原理图RTL8211F芯片是否外接晶振去判断,我这里如下,

结合上面的原理图看出RTL8211F的36(PHY1_XTALIN)和37(PHY1_XTALOUT)引脚接了一个25M的外部晶振,且35引脚CLKOUT接了rk3568。因此,我这里对于rk3568来说clock是input。但是我实测发现clock赋值为output,网口也能正常工作,大概是硬件上有,软件上可以选择怎么用。但对于RTL8211F外围没接晶振的时候,那就只能填output了。
3.2 各属性详细说明
| 属性 | 说明 | 取值 |
|---|---|---|
| phy-mode | PHY接口模式 | "rgmii" / "rmii" |
| clock_in_out | 时钟方向:"output"主控提供,"input"PHY提供 | "output" / "input" |
| snps,reset-gpio | PHY复位GPIO | GPIO引用 |
| snps,reset-active-low | 复位信号低有效 | 布尔值 |
| snps,reset-delays-us | 复位时序:<复位前延时, 拉低时间, 复位后延时> | 微秒数组 |
| assigned-clocks | 分配的时钟 | 时钟引用 |
| assigned-clock-parents | 时钟父级 | 时钟引用 |
| assigned-clock-rates | 时钟频率 | 125MHz (RGMII) |
| tx_delay / rx_delay | TX/RX延时值,范围0~0x7F | 0x00~0x7F |
| phy-handle | 引用PHY节点 | phandle |
| pinctrl-0 | 引脚复用配置 | pin状态引用 |
3.3 引脚复用配置
RK3568的GMAC1支持两组引脚(m0和m1)如下图设备树文件中,从原理图看出使用的是m1组:
kernel-5.10/arch/arm64/boot/dts/rockchip/rk3568-pinctrl.dtsi
gmac1 {
/omit-if-no-ref/
gmac1m0_miim: gmac1m0-miim {
rockchip,pins =
/* gmac1_mdcm0 */
<3 RK_PC4 3 &pcfg_pull_none>,
/* gmac1_mdiom0 */
<3 RK_PC5 3 &pcfg_pull_none>;
};
/omit-if-no-ref/
gmac1m0_clkinout: gmac1m0-clkinout {
rockchip,pins =
/* gmac1_mclkinoutm0 */
<3 RK_PC0 3 &pcfg_pull_none>;
};
/omit-if-no-ref/
gmac1m0_rx_er: gmac1m0-rx-er {
rockchip,pins =
/* gmac1_rxerm0 */
<3 RK_PB4 3 &pcfg_pull_none>;
};
/omit-if-no-ref/
gmac1m0_rx_bus2: gmac1m0-rx-bus2 {
rockchip,pins =
/* gmac1_rxd0m0 */
<3 RK_PB1 3 &pcfg_pull_none>,
/* gmac1_rxd1m0 */
<3 RK_PB2 3 &pcfg_pull_none>,
/* gmac1_rxdvcrsm0 */
<3 RK_PB3 3 &pcfg_pull_none>;
};
/omit-if-no-ref/
gmac1m0_tx_bus2: gmac1m0-tx-bus2 {
rockchip,pins =
/* gmac1_txd0m0 */
<3 RK_PB5 3 &pcfg_pull_none_drv_level_2>,
/* gmac1_txd1m0 */
<3 RK_PB6 3 &pcfg_pull_none_drv_level_2>,
/* gmac1_txenm0 */
<3 RK_PB7 3 &pcfg_pull_none>;
};
/omit-if-no-ref/
gmac1m0_rgmii_clk: gmac1m0-rgmii-clk {
rockchip,pins =
/* gmac1_rxclkm0 */
<3 RK_PA7 3 &pcfg_pull_none>,
/* gmac1_txclkm0 */
<3 RK_PA6 3 &pcfg_pull_none_drv_level_1>;
};
/omit-if-no-ref/
gmac1m0_rgmii_bus: gmac1m0-rgmii-bus {
rockchip,pins =
/* gmac1_rxd2m0 */
<3 RK_PA4 3 &pcfg_pull_none>,
/* gmac1_rxd3m0 */
<3 RK_PA5 3 &pcfg_pull_none>,
/* gmac1_txd2m0 */
<3 RK_PA2 3 &pcfg_pull_none_drv_level_2>,
/* gmac1_txd3m0 */
<3 RK_PA3 3 &pcfg_pull_none_drv_level_2>;
};
/omit-if-no-ref/
gmac1m1_miim: gmac1m1-miim {
rockchip,pins =
/* gmac1_mdcm1 */
<4 RK_PB6 3 &pcfg_pull_none>,
/* gmac1_mdiom1 */
<4 RK_PB7 3 &pcfg_pull_none>;
};
/omit-if-no-ref/
gmac1m1_clkinout: gmac1m1-clkinout {
rockchip,pins =
/* gmac1_mclkinoutm1 */
<4 RK_PC1 3 &pcfg_pull_none>;
};
/omit-if-no-ref/
gmac1m1_rx_er: gmac1m1-rx-er {
rockchip,pins =
/* gmac1_rxerm1 */
<4 RK_PB2 3 &pcfg_pull_none>;
};
/omit-if-no-ref/
gmac1m1_rx_bus2: gmac1m1-rx-bus2 {
rockchip,pins =
/* gmac1_rxd0m1 */
<4 RK_PA7 3 &pcfg_pull_none>,
/* gmac1_rxd1m1 */
<4 RK_PB0 3 &pcfg_pull_none>,
/* gmac1_rxdvcrsm1 */
<4 RK_PB1 3 &pcfg_pull_none>;
};
/omit-if-no-ref/
gmac1m1_tx_bus2: gmac1m1-tx-bus2 {
rockchip,pins =
/* gmac1_txd0m1 */
<4 RK_PA4 3 &pcfg_pull_none_drv_level_2>,
/* gmac1_txd1m1 */
<4 RK_PA5 3 &pcfg_pull_none_drv_level_2>,
/* gmac1_txenm1 */
<4 RK_PA6 3 &pcfg_pull_none>;
};
/omit-if-no-ref/
gmac1m1_rgmii_clk: gmac1m1-rgmii-clk {
rockchip,pins =
/* gmac1_rxclkm1 */
<4 RK_PA3 3 &pcfg_pull_none>,
/* gmac1_txclkm1 */
<4 RK_PA0 3 &pcfg_pull_none_drv_level_1>;
};
/omit-if-no-ref/
gmac1m1_rgmii_bus: gmac1m1-rgmii-bus {
rockchip,pins =
/* gmac1_rxd2m1 */
<4 RK_PA1 3 &pcfg_pull_none>,
/* gmac1_rxd3m1 */
<4 RK_PA2 3 &pcfg_pull_none>,
/* gmac1_txd2m1 */
<3 RK_PD6 3 &pcfg_pull_none_drv_level_2>,
/* gmac1_txd3m1 */
<3 RK_PD7 3 &pcfg_pull_none_drv_level_2>;
};
};
四. 调试
编译好的镜像下载到安卓板中去后,插好网线后,执行ifconfig命令查看eth0是否出现,如下
rk3568_t:/ # ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope: Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:61 errors:0 dropped:0 overruns:0 frame:0
TX packets:61 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:9113 TX bytes:9113
dummy0 Link encap:Ethernet HWaddr 1e:ff:ec:88:ae:f6
inet6 addr: fe80::1cff:ecff:fe88:aef6/64 Scope: Link
UP BROADCAST RUNNING NOARP MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:99 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 TX bytes:18902
eth0 Link encap:Ethernet HWaddr 5e:34:73:bf:f0:56 Driver rk_gmac-dwmac
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 TX bytes:0
Interrupt:45
rk3568_t:/ #
观看自己直连电脑的IP,设置rk3568为同网段IP,并ifconfig eth0验证是否设置成功,我这里如下,
1|rk3568_t:/ # ifconfig eth0 192.168.10.45 netmask 255.255.255.0
rk3568_t:/ # ifconfig eth0
eth0 Link encap:Ethernet HWaddr 5e:34:73:bf:f0:56 Driver rk_gmac-dwmac
inet addr:192.168.10.45 Bcast:192.168.10.255 Mask:255.255.255.0
inet6 addr: fe80::1f61:759f:48cb:6b7f/64 Scope: Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:103 errors:0 dropped:0 overruns:0 frame:0
TX packets:64 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:7282 TX bytes:14209
Interrupt:45
ping 自己电脑测试,若ping通说明适配成功,
rk3568_t:/ # ping 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
64 bytes from 192.168.10.10: icmp_seq=1 ttl=200 time=5.05 ms
64 bytes from 192.168.10.10: icmp_seq=2 ttl=200 time=2.58 ms
64 bytes from 192.168.10.10: icmp_seq=3 ttl=200 time=2.43 ms
64 bytes from 192.168.10.10: icmp_seq=4 ttl=200 time=3.06 ms
64 bytes from 192.168.10.10: icmp_seq=5 ttl=200 time=3.03 ms
64 bytes from 192.168.10.10: icmp_seq=6 ttl=200 time=3.63 ms
^C
--- 192.168.10.10 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5005ms
rtt min/avg/max/mdev = 2.431/3.300/5.056/0.875 ms
rk3568_t:/ #
总结
本文介绍了在rk3568安卓13 SDK中如何适配自己板子上的GMAC,如果用的是RK官方适配好的PHY芯片,那会很简单,只需要设备树文件和自己原理图对应起来即可,若选的PHY芯片RK官方未适配过,则需要找PHY芯片厂商要驱动,移植到SDK中,相对会复杂很多。
2733

被折叠的 条评论
为什么被折叠?



