之前配置完RTL8152后发现网卡link灯不亮,仔细阅读RTL8152B-VB Datasheet手册 6.2节,这里详细的含蓄的介绍了
link灯和act灯是如何配置的。
*****感谢网友《坊间故里》的指正;里面有些错误的东西,但是讲解部分勉强可以凑合着看;

0 网卡灯科普

我们常见的网卡,一般左边的是常亮的叫link灯,网线插上就会常亮,右边的叫act信号灯,在信号收发的时候会闪烁。
在这里插入图片描述

1 网卡灯配置-官方举了一个例子

上述,led的配置使用一个叫OCP的寄存器来完成。我们可以往这个偏移地址为0xDD90的地方写值,来配置LED灯;
1.1 那么这个是怎么配置的呢?
0-3位配置的是led0;
4-7位配置的是led1;
在这里插入图片描述
1.2 低八位分别代表的含义
在这里插入图片描述
1.3 官方手册举了个例子;
把0XDD90设置成0XA1;那么后八位为:1010 0001
如表11
led0配置成 ACT=0 LINK 为10M
led1配置成 ACT=1 LINK 为100M
官方给出的解释如下 感觉挺误导人的,(但肯定是正确的,正是犹豫给的太含蓄,所以显得难懂)
在这里插入图片描述

2 个人对该手册的理解

2.1 我想把link配置成100M常亮;act100M有信号亮。
我给出的参数为0x0CA2
在这里插入图片描述

2.2 低八位根据图10
led0: act=0 link=100m
led1: act=1 link=100m

手册没有对8-13位进行说明
*****官网给的配置也是0;

2.3 高4位,看表12
15位:选选项1
14位:rsvd
13位:led1低有效
12位:led0低有效
在这里插入图片描述

2.4 继续看led配置 表13
在这里插入图片描述
这个表13非常关键
根据之前低八位的配置,led0 的ACT=0 LINK>0 故选表10中的配置
led1 ACT=1 LINK>0 故选 表14中的option1 来重新配置link和act

2.5 继续看表14
led1是根据表14中进行配置的;
led1中
act=1
link bit 10M=0
link bit 100M=1
在这里插入图片描述

请注意: 参考4-7位的配置,根据表13的规则,led0 的act 和link 都重新由表14 进行配置;

3 RTL8152驱动中关于灯配置修改

直接上图,显示我怎么修改的:

在这里插入图片描述

本文结束;

分析过程
既然上文说是在0xDD90中进行配置,但是我在搜索8152.c的时候,仅有一行宏定义

#define PLA_LEDSEL  0xdd90

整篇无调用PLA_LEDSEL的地方。
猜测:可能在芯片内部或者驱动某个函数中进行定义了,只是我找不到而已;

找到类似一个初始化的函数:

static void r8152b_init(struct r8152 *tp) 

该函数中有对手册 6.2.1节灯闪烁进行重新赋值的函数

r8152b_disable_aldps(tp);
if (tp->version == RTL_VER_01) 
{
	ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE);
  	ocp_data &= ~LED_MODE_MASK;
 	 ocp_write_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE, ocp_data);
  }
 ocp_write_word(tp, MCU_TYPE_PLA, PLA_LEDSEL, 0x0CA2);//该行为我们比葫芦画瓢添加
 r8152_power_cut_en(tp, false);
 .......

上述函数明显是在一个锁内 进行了(对芯片版本判断),对0xdd92进行了重新赋值
在附近我们往0xdd90中写入上述我们的配置值。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐