之前配置完RTL8152后发现网卡link灯不亮,仔细阅读RTL8152B-VB Datasheet手册 6.2节,这里详细的含蓄的介绍了
link灯和act灯是如何配置的。
*****感谢网友《坊间故里》的指正;里面有些错误的东西,但是讲解部分勉强可以凑合着看;
我们常见的网卡,一般左边的是常亮的叫link灯,网线插上就会常亮,右边的叫act信号灯,在信号收发的时候会闪烁。
上述,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.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 进行配置;
直接上图,显示我怎么修改的:
本文结束;
…
分析过程
既然上文说是在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中写入上述我们的配置值。