文章目录
一、硬件连接概述
RK3588是一款高性能ARM处理器,支持多种以太网接口配置。RTL8211F是一款常用的千兆以太网PHY芯片,支持多种LED指示模式。在典型的RK3588平台上,RTL8211F通过RGMII接口与处理器相连,其LED信号通常连接到RK3588的GPIO引脚,用于指示网络状态。
1.1 典型连接方式
- RK3588的RGMII接口连接到RTL8211F的数据接口
- RTL8211F的LED1和LED2信号分别连接到网口座子
1.2 硬件原理图
二、RTL8211F LED控制原理
2.1 LED控制寄存器
RTL8211F通过特定寄存器控制LED的行为,主要涉及LCR(LED Control Register)。该寄存器位于扩展页0xd04中,通过MDIO接口访问。
2.2 LCR寄存器位定义
LCR寄存器的相关位定义如下(仅列出关键位):
Bit位置 | 名称 | 读写类型 | 默认值 | 功能描述 | 对LED的影响 |
---|---|---|---|---|---|
16.15 | RSVD | RO | 0 | 保留位,禁止修改 | - |
16.14 | LED2_ACT | RW | 1 | 控制LED2的数据活动指示功能 | 1=数据收发时闪烁 0=仅显示链路状态(常亮/灭) |
16.13 | LED2_LINK_1000 | RW | 1 | 控制LED2在1000Mbps链路速率下的点亮功能 | 1=1000Mbps链路时点亮 0=忽略1000Mbps链路状态 |
16.12 | RSVD | RO | 0 | 保留位,禁止修改 | - |
16.11 | LED2_LINK_100 | RW | 0 | 控制LED2在100Mbps链路速率下的点亮功能 | 1=100Mbps链路时点亮 0=忽略100Mbps链路状态 |
16.10 | LED2_LINK_10 | RW | 0 | 控制LED2在10Mbps链路速率下的点亮功能 | 1=10Mbps链路时点亮 0=忽略10Mbps链路状态 |
16.9 | LED1_ACT | RW | 1 | 控制LED1的数据活动指示功能 | 1=数据收发时闪烁 0=仅显示链路状态(常亮/灭) |
16.8 | LED1_LINK_1000 | RW | 0 | 控制LED1在1000Mbps链路速率下的点亮功能 | 1=1000Mbps链路时点亮 0=忽略1000Mbps链路状态 |
16.7 | RSVD | RO | 0 | 保留位,禁止修改 | - |
16.6 | LED1_LINK_100 | RW | 1 | 控制LED1在100Mbps链路速率下的点亮功能 | 1=100Mbps链路时点亮 0=忽略100Mbps链路状态 |
16.5 | LED1_LINK_10 | RW | 0 | 控制LED1在10Mbps链路速率下的点亮功能 | 1=10Mbps链路时点亮 0=忽略10Mbps链路状态 |
16.4 | LED0_ACT | RW | 1 | 控制LED0的数据活动指示功能 | 1=数据收发时闪烁 0=仅显示链路状态(常亮/灭) |
16.3 | LED0_LINK_1000 | RW | 0 | 控制LED0在1000Mbps链路速率下的点亮功能 | 1=1000Mbps链路时点亮 0=忽略1000Mbps链路状态 |
16.2 | RSVD | RO | 0 | 保留位,禁止修改 | - |
16.1 | LED0_LINK_100 | RW | 0 | 控制LED0在100Mbps链路速率下的点亮功能 | 1=100Mbps链路时点亮 0=忽略100Mbps链路状态 |
16.0 | LED0_LINK_10 | RW | 1 | 控制LED0在10Mbps链路速率下的点亮功能 | 1=10Mbps链路时点亮 0=忽略10Mbps链路状态 |
2.3 常见LED配置值及其效果
以下是几种常见的配置值及其对应的LED行为:
配置值 | 二进制表示 | LED2行为 | LED1行为 |
---|---|---|---|
0x6d00 | 0110 1101 0000 0000 | 10/100/1000Mbps链路状态+活动指示(闪烁) | 1000Mbps链路状态常亮,非则灭灯 |
0x2040 | 0010 0000 0100 0000 | 100Mbps链路状态常亮,非则灭灯 | 100Mbps链路状态常亮,非则灭灯 |
三、Linux内核中的RTL8211F LED控制实现
在RK3588平台的Linux内核中,可以通过以下方式实现对RTL8211F LED的控制。
3.1 驱动层LED控制代码
在内核驱动中,可以通过phy驱动的fixup函数来配置LED。以下是一个典型的实现示例:
驱动路径:drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
#define PHY_ID_RTL8211F 0x001cc916
#define PAGE_SELECT_ADDR 0x1f
#define RTL_8211F_PHY_ID_MASK 0x001fffff
#define RTL_8211F_LCR_ADDR 0x10
static int phy_rtl8211f_led_fixup(struct phy_device *phydev)
{
/* 切换到扩展页0xd04 */
phy_write(phydev, RTL_8211F_PAGE_SELECT, 0xd04);
/* 设置LCR寄存器值为0x6171 */
phy_write(phydev, RTL_8211F_LCR_ADDR, 0x6d00);
/* 切换回默认页 */
phy_write(phydev, RTL_8211F_PAGE_SELECT, 0xa42);
return 0;
}
//在stmmac_dvr_probe函数中调用:
/* register the PHY board fixup */
ret = phy_register_fixup_for_uid(PHY_ID_RTL8211F, RTL_8211F_PHY_ID_MASK, phy_rtl8211f_led_fixup);
if (ret) {
dev_warn(priv->device, "arunce Cannot register PHY board fixup, terry in :%s.\n", __func__);
}
四、通过ADB命令控制RTL8211F LED
在RK3588开发板上,可以通过ADB命令直接控制RTL8211F的LED。
4.1 切换到扩展页并配置LED
# 切换到扩展页0xd04
/sys/bus/mdio_bus/devices/stmmac-1:01# echo 0x1f 0xd04 > phy_registers
# 写入LED控制寄存器值(例如0x2d60 )
/sys/bus/mdio_bus/devices/stmmac-1:01# echo 0x10 0x2d60 > phy_registers
4.2 验证配置
# 读取LED控制寄存器值,确认配置成功
cat phy_registers
0x16的值:应返回0x2d60
# eth0 切换成百兆
mii-tool -F 100baseTx-FD eth0
# eth0 恢复自动协商
mii-tool -r eth0
# 查看eth0 的配置
mii-tool eth0
五、故障排除
5.1 LED不亮的可能原因
- 硬件连接问题:检查RTL8211F与rj45之间的线路连接是否正确
- 寄存器配置错误:确认LCR寄存器的值设置正确
- PHY地址问题:检查设备树中PHY地址配置是否与实际一致
- 电源问题:确保RTL8211F正常供电
- 检查RJ45网口的led 正 负 是否正确。规格书-硬件原理图,有概率会搞反导致灯不亮。
5.2 调试方法
- 使用ethtool工具检查以太网状态:
adb shell ethtool eth0
- 查看内核日志确认PHY驱动是否正常工作:
adb shell dmesg | grep eth0
- 使用示波器或逻辑分析仪检查LED信号引脚的电平变化
六、参考资料
- RTL8211F数据手册
- RK3588处理器规格说明书
- Linux内核文档中的MDIO和PHY驱动部分
- 设备树绑定文档中的以太网部分
通过以上配置和方法,可以在RK3588平台上灵活控制RTL8211F的LED指示灯,实现各种网络状态指示需求。