每一个PHY芯片都是一个拦路虎,不管是硬件还是软件。上次说到KSZ,这次我们来说说RTL8211这个芯片。
硬件设计
设计同样是参考的开发板上的设计,硬件设计同样是有问题的。这次的是参考的小梅哥的设计,先看下图:
我们关注一下这里的两个网口灯的电路设计。按照此电路设计,在最后驱动的时候,当不插网线的时候,以太网连接器上的黄色灯常亮,也就是这里的LED2驱动的灯。可以看到是因为这里有个ETH_DVDDH
的电源。
那么我们看下芯片的数据手册上的设计:
说的很明确,针对上拉和下拉的pin脚,外接LED时的电路是不一样的。因此需要改正,我们重新修改电路后,两个灯就正常了。改正如下:
软件驱动
这里我主要关注的是怎么控制LED灯的状态,所以先来看下几个LED的工作状态:
上面这张图,列举出来RTL8211支持的3个LED灯,每个灯都可以支持Link
指示或者Active
指示。但是我们设计中使用了其中的两个,即LED1
和LED2
。
通常来说,网络的连接状态我们需要一个常量的灯来指示,当网线插上时应该有一个常量的灯来指示已连接;当有数据交互的时候应该有一个灯闪烁来指示有数据在传输。
在我们设计中,定义LED1为连接指示灯(绿色);LED2为数据传输指示灯(黄色)。所以我们的工作就是配置寄存器,使这两个灯工作在其正确的状态。
上图中的红框中的内容是最重要的,它告诉我们怎么去配置寄存器,来实现我们的目的。这个不需要分析了。
直接来看寄存器配置吧
LED_MODE
:1 关于这里MODE的配置,建议去看一下手册中的MODEA和MODEB对比一下。
LED2_ACT
:1 上面已经定义了LED2是用来指示数据传输的,也就是用来闪烁的,所以这里使能
LED2_LINK_1000
:0 LED2的功能是ACT,所以这里的LINK就不使能了
RSVD
:0 预留的直接为0
LED2_LINK_100
:0 LED2的功能是ACT,所以这里的LINK就不使能了
LED2_LINK_10
:0 LED2的功能是ACT,所以这里的LINK就不使能了
LED1_ACT
:0 LED1的功能是LINK,所以这里的ACT就不使能了
LED1_LINK_1000
:1 LED1的功能是LINK,所以这里的LINK使能
RSVD
:0 预留的直接为0
LED1_LINK_100
:1 LED1的功能是LINK,所以这里的LINK使能
LED1_LINK_10
:1 LED1的功能是LINK,所以这里的LINK使能
以下LED0的功能都不需要使用的,都默认为0。这里配置需要注意的是:比如配置LED1为LINK功能的时候,它里面有各个速率下的配置,我们都要同时使能,而且,同一个LED不要配置成不同的功能,这样很难分辨。
还有个需要关注的点就是配置节能模式Engrgy-efficient Ethernet,节能以太网:
根据手册上描述和实际测试,当节能模式设置为1时,灯会间歇性闪烁,因此实际使用中要把对应的LED的节能模式对应位配置为0,即不开启节能模式。建议所有的都直接关掉,因为看网上说是有问题的
示例代码
static u32_t get_Realtek_phy_speed(XEmacPs *xemacpsp, u32_t phy_addr)
{
u16_t control;
u16_t status;
u16_t status_speed;
u32_t timeout_counter = 0;
u32_t temp_speed;
u16_t led_mod;