RK3568 Android13 千兆网口适配实战-RTL8211F

目录

前言

[一、Rockchip GMAC网口介绍](#一、Rockchip GMAC网口介绍)

[1.1 什么是GMAC](#1.1 什么是GMAC)

[1.2 接口模式](#1.2 接口模式)

[1.3 时钟方向](#1.3 时钟方向)

二、硬件原理分析

三、设备树配置

[3.1 完整的GMAC设备树节点](#3.1 完整的GMAC设备树节点)

[3.2 各属性详细说明](#3.2 各属性详细说明)

[3.3 引脚复用配置](#3.3 引脚复用配置)

[四. 调试](#四. 调试)

总结


前言

最近在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设备树节点

根据原理图,设备树配置如下:

bash 复制代码
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组

bash 复制代码
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是否出现,如下

bash 复制代码
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验证是否设置成功,我这里如下,

bash 复制代码
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通说明适配成功,

bash 复制代码
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中,相对会复杂很多。

相关推荐
恒锐丰科技韩生15 小时前
SS8844T|8.2‑40V 四通道独立半桥驱动 ETSSOP28 带散热焊盘 工业自动化机器人专用
嵌入式硬件·硬件工程
Hello_Damon_Nikola15 小时前
INMP441从入门到精通
单片机·嵌入式硬件·物联网
恒锐丰小瑞15 小时前
率能SS6810H 32V/1A/双通道H桥驱动芯片,PWM电流控制与混合衰减模式,用于POS打印机/安防相机/机器人
嵌入式硬件·数码相机·机器人·硬件工程
恒锐丰科技林技术员16 小时前
SS8812T 双通道 H 桥电机驱动芯片应用解析
经验分享·嵌入式硬件·硬件工程
hunterandroid16 小时前
Android WebView JSBridge 治理实战:从线上白屏崩溃到协议化通信
android·前端
ye1501277745516 小时前
12V转3V-5V2A电位器无极调光调速WT7027
stm32·单片机·嵌入式硬件
一个用户名i16 小时前
【Compose 系列】第 1 篇:认识 Compose,为什么要学它
android·android jetpack
恒锐丰-罗生17 小时前
国产电机驱动 SS6635E|宽压大电流单通道 H 桥芯片全面总结
驱动开发·嵌入式硬件·硬件工程
无损检测小白白17 小时前
STM32F407 串口3 DMA收发-标准库
stm32·单片机·嵌入式硬件
极客猴子17 小时前
iPhone实时转写软件推荐:会议录音功能真实体验
android·人工智能·飞书