RK356x RTL8211F PHY调试记录

1、环境介绍

硬件:飞凌ok3568-c开发板

软件:原厂rk356x sdk

2、PHY原理图查看

这里调试使用的是realtek rtl8211fsi-cf。

2.1、收发器接口

PHY与RJ45连接的接口。

2.2、时钟

PHY 25M 时钟由晶振提供。

2.3、RGMII

PHY的RGMII接口连接到主控的GMAC0。

2.4、RESET

PHY复位引脚连接到主控的GPIO3_A4。

2.5、模式选择(通过硬件配置)

2.5.1、PHY地址配置

PHY地址为:001

2.5.2、RGMII I/O 电压配置

RGMII IO电压配置为1.8V,对应的GMAC0接口电压也要配置为1.8V。

2.5.3、操作模式配置

配置为UTP RGMII模式。

2.5.4、RXDLY

硬件启用了PHY的Rx delay。

3、dts配置

如果有两个PHY,建议先调通一个,再下一个,避免过多的配置导致问题不容易发现。

&gmac0 {
	phy-mode = "rgmii-rxid";	/* 因为硬件启用了PHY的RX delay,所以这里要改成“rgmii-rxid” */
	clock_in_out = "output";

	snps,reset-gpio = <&gpio3 RK_PA4 GPIO_ACTIVE_LOW>;
	snps,reset-active-low;
	/* Reset time is 20ms, 100ms for rtl8211f */
	snps,reset-delays-us = <0 20000 100000>;

	assigned-clocks = <&cru SCLK_GMAC0_RX_TX>, <&cru SCLK_GMAC0>, <&cru CLK_MAC0_OUT>;
	assigned-clock-parents = <&cru SCLK_GMAC0_RGMII_SPEED>;
	assigned-clock-rates = <0>, <125000000>, <25000000>;

	pinctrl-names = "default";
	pinctrl-0 = <&gmac0_miim
		     &gmac0_tx_bus2
		     &gmac0_rx_bus2
		     &gmac0_rgmii_clk
		     &gmac0_rgmii_bus
			 &eth0_pins>;

	tx_delay = <0x36>;
/*	rx_delay = <0x00>;  */	/* 因为硬件启用了PHY的RX delay,所以rx_delay不用填写 */

	phy-handle = <&rgmii_phy0>;
	status = "okay";
};

&mdio0 {
	rgmii_phy0: phy@0 {
		compatible = "ethernet-phy-ieee802.3-c22";
		reg = <0x0>;
		clocks = <&cru CLK_MAC0_OUT>;
	};
};

关于设备树配置可以参考官方手册《Rockchip Developer Guide Linux GMAC Mode Configuration》

4、kernel配置

CONFIG_REALTEK_PHY=y

5、扫描delayline窗口

查看相关启动日志:

root@rk3568-buildroot:/# dmesg | grep mac
[    3.397712] dma-pl330 fe530000.dmac: Loaded driver for PL330 DMAC-241330
[    3.397735] dma-pl330 fe530000.dmac:         DBUFF-128x8bytes Num_Chans-8 Num_Peri-32 Num_Events-16
[    3.399406] dma-pl330 fe550000.dmac: Loaded driver for PL330 DMAC-241330
[    3.399421] dma-pl330 fe550000.dmac:         DBUFF-128x8bytes Num_Chans-8 Num_Peri-32 Num_Events-16
[    3.439002] rk_gmac-dwmac fe2a0000.ethernet: IRQ eth_lpi not found
[    3.439251] rk_gmac-dwmac fe2a0000.ethernet: supply phy not found, using dummy regulator
[    3.439393] rk_gmac-dwmac fe2a0000.ethernet: clock input or output? (output).
[    3.439407] rk_gmac-dwmac fe2a0000.ethernet: TX delay(0x36).
[    3.439416] rk_gmac-dwmac fe2a0000.ethernet: Can not read property: rx_delay.
[    3.439423] rk_gmac-dwmac fe2a0000.ethernet: set rx_delay to 0xffffffff
[    3.439438] rk_gmac-dwmac fe2a0000.ethernet: integrated PHY? (no).
[    3.439715] rk_gmac-dwmac fe2a0000.ethernet: init for RGMII_RXID
[    3.439965] rk_gmac-dwmac fe2a0000.ethernet: User ID: 0x30, Synopsys ID: 0x51
[    3.439979] rk_gmac-dwmac fe2a0000.ethernet:         DWMAC4/5
[    3.439990] rk_gmac-dwmac fe2a0000.ethernet: DMA HW capability register supported
[    3.439998] rk_gmac-dwmac fe2a0000.ethernet: RX Checksum Offload Engine supported
[    3.440005] rk_gmac-dwmac fe2a0000.ethernet: TX Checksum insertion supported
[    3.440012] rk_gmac-dwmac fe2a0000.ethernet: Wake-Up On Lan supported
[    3.440068] rk_gmac-dwmac fe2a0000.ethernet: TSO supported
[    3.440077] rk_gmac-dwmac fe2a0000.ethernet: Enable RX Mitigation via HW Watchdog Timer
[    3.440085] rk_gmac-dwmac fe2a0000.ethernet: TSO feature enabled
[    3.440093] rk_gmac-dwmac fe2a0000.ethernet: Using 32 bits DMA width

查看eth0节点:

root@rk3568-buildroot:/# ifconfig -a
eth0      Link encap:Ethernet  HWaddr D2:A6:C0:C3:C9:1D
          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 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:59

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:74 errors:0 dropped:0 overruns:0 frame:0
          TX packets:74 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:4888 (4.7 KiB)  TX bytes:4888 (4.7 KiB)

使能eth0(如果出现类似phy not found的错误,建议检查设备树配置):

root@rk3568-buildroot:/# ifconfig eth0 up
[  152.194458] rk_gmac-dwmac fe2a0000.ethernet eth0: PHY [stmmac-0:00] driver [RTL8211F Gigabit Ethernet] (irq=POLL)
[  152.198510] dwmac4: Master AXI performs any burst length
[  152.198574] rk_gmac-dwmac fe2a0000.ethernet eth0: No Safety Features support found
[  152.198625] rk_gmac-dwmac fe2a0000.ethernet eth0: IEEE 1588-2008 Advanced Timestamp supported
[  152.199185] rk_gmac-dwmac fe2a0000.ethernet eth0: registered PTP clock
[  152.199884] rk_gmac-dwmac fe2a0000.ethernet eth0: configuring for phy/rgmii-rxid link mode
[  154.261389] rk_gmac-dwmac fe2a0000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
[  154.261566] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready

扫描delayline窗口,确认tx_delay值:

root@rk3568-buildroot:/# ehco 1000 > 

这里不知道为什么不会扫描,不知道是不是启用了硬件rx_delay的原因,把0x3e替换到设备树里:

重新编译kernel,更新镜像。

6、联网测试

网口插上网线,连接至路由器。

root@rk3568-buildroot:/# ifconfig eth0 up
root@rk3568-buildroot:/# dhcpcd eth0
dhcpcd-9.4.1 starting
DUID 00:01:00:01:2f:01:29:c0:d2:a6:c0:c3:c9:1d
eth0: IAID c0:c3:c9:1d
eth0: soliciting an IPv6 router
eth0: soliciting a DHCP lease
eth0: offered 192.168.2.100 from 192.168.2.1
eth0: probing address 192.168.2.100/24
eth0: leased 192.168.2.100 for 7200 seconds
eth0: adding route to 192.168.2.0/24
eth0: adding default route via 192.168.2.1
forked to background, child pid 1087
root@rk3568-buildroot:/# ifconfig
eth0      Link encap:Ethernet  HWaddr D2:A6:C0:C3:C9:1D
          inet addr:192.168.2.100  Bcast:192.168.2.255  Mask:255.255.255.0
          inet6 addr: fe80::d0a6:c0ff:fec3:c91d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:59 errors:0 dropped:0 overruns:0 frame:0
          TX packets:33 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:7666 (7.4 KiB)  TX bytes:2882 (2.8 KiB)
          Interrupt:59

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:224 errors:0 dropped:0 overruns:0 frame:0
          TX packets:224 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:13888 (13.5 KiB)  TX bytes:13888 (13.5 KiB)
root@rk3568-buildroot:/# ping baidu.com -I eth0
PING baidu.com (39.156.66.10) from 192.168.2.100 eth0: 56(84) bytes of data.
64 bytes from 39.156.66.10: icmp_seq=1 ttl=51 time=43.5 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=2 ttl=51 time=43.6 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=3 ttl=51 time=43.0 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=4 ttl=51 time=43.3 ms
64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=5 ttl=51 time=43.3 ms

7、PHY网灯配置

7.1、配置目标

RTL8211FSI-CF有3个LED控制脚,分别是LED0、LED1、LED2。其中LED0被用作PHY的地址配置:

所以实际只用到了LED1、LED2脚来控制LED。其中LED1控制绿灯,LED2控制橙灯:

每个LED的配置围绕两个指标:

  1. 物理链路正常连接时,你想亮还是不亮?
  2. 在物理连接正常的情况下,有数据活动时,你想闪烁还是不闪烁?

所以,现在制定LED配置目标:

  1. LED1绿灯:1000M物理链路正常连接时,灯亮。有数据活动时,灯闪烁。
  2. LED2橙灯:10/100M物理链路正常连接时,灯亮。有数据活动时,灯闪烁。

7.2、确认寄存器配置值

最终是通过配置PHY的某个寄存器来实现网灯的控制。

下图可以看出,要配置LED1、LED2就是控制寄存器16,其中是0xd04页的寄存器16。

LED1:配置寄存器16的Bit5(10Mbps)、Bit6(100Mbps)、Bit8(1000Mbps)、Bit9(Active)。

LED2:配置寄存器16的Bit10(10Mbps)、Bit11(100Mbps)、Bit13(1000Mbps)、Bit14(Active)。

下图是LED状态真值表:

根据我们的配置目标,LED1绿灯配置为,Bit5(0)、Bit6(0)、Bit8(1)、Bit9(1):

LED2橙灯配置为,Bit10(1)、Bit11(1)、Bit13(0)、Bit14(1):

最终寄存器16用二进制表示为:0b0100 1111 0000 0000,16进制表示为:0x4F00

7.3、寄存器配置值临时验证

# 切换到Page 0xd04
root@rk3568-buildroot:/# echo 0x1f 0xd04 > /sys/bus/mdio_bus/devices/stmmac-0:00/phy_registers

# 查看修改前的寄存器16
root@rk3568-buildroot:/# cat /sys/bus/mdio_bus/devices/stmmac-0:00/phy_registers

# 设置配置值
root@rk3568-buildroot:/# echo 0x10 0x4F00 > /sys/bus/mdio_bus/devices/stmmac-0:00/phy_registers

# 查看修改后的寄存器16
root@rk3568-buildroot:/# cat /sys/bus/mdio_bus/devices/stmmac-0:00/phy_registers

我目前是连接到路由器,自协商后的速率为100Mbps,只亮橙灯并在数据活动时闪烁,所以配置正确。

7.4、驱动程序中配置寄存器值

上面只是临时验证,现在修改驱动程序,在程序中配置LED寄存器。

驱动文件为:/kernel/drivers/net/phy/realtek.c

/* <sdk>/kernel/drivers/net/phy/realtek.c */ 

static int rtl8211f_config_init(struct phy_device *phydev)
{
    
    ...

    phy_write(phydev, 0x1f, 0xd04);
    phy_write(phydev, 0x10, 0x4f00);

    return 0}

8、总结

嵌入式Linux学习交流群:424571391
参考文章:

《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》

Rockchip平台GMAC网卡(RTL8211FD)Phy网灯调试——RK3568 Android13平台_realtek led 0 1 2-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值