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

目录

前言

一、Rockchip GMAC网口介绍

1.1 什么是GMAC

1.2 接口模式

1.3 时钟方向

二、硬件原理分析

三、设备树配置

3.1 完整的GMAC设备树节点

3.2 各属性详细说明

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接口主要有两种:

接口速率数据线时钟
RGMII10/100/1000Mbps4根TX + 4根RXTX_CLK + RX_CLK
RMII10/100Mbps2根TX + 2根RX50MHz 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-modePHY接口模式"rgmii" / "rmii"
clock_in_out时钟方向:"output"主控提供,"input"PHY提供"output" / "input"
snps,reset-gpioPHY复位GPIOGPIO引用
snps,reset-active-low复位信号低有效布尔值
snps,reset-delays-us复位时序:<复位前延时, 拉低时间, 复位后延时> 微秒数组
assigned-clocks分配的时钟时钟引用
assigned-clock-parents时钟父级时钟引用
assigned-clock-rates时钟频率125MHz (RGMII)
tx_delay / rx_delayTX/RX延时值,范围0~0x7F0x00~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中,相对会复杂很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

又见情义

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值