1. 从MAC-PHY到MAC-MAC架构的转变
在嵌入式网络设备开发中,我们经常会遇到需要调整网络架构的场景。这次我遇到的情况比较典型:原本的主控芯片AST1520通过MAC控制器连接PHY芯片,现在需要改为连接RTL8367交换芯片,实现MAC-MAC架构。这种改动看似简单,实际操作中却有不少坑要踩。
首先得理解这两种架构的本质区别。传统的MAC-PHY架构中,MAC控制器负责数据链路层,PHY芯片负责物理层,两者分工明确。而改用交换芯片后,相当于在MAC控制器和外部网络之间插入了一个"智能交换机"。RTL8367这类交换芯片内部集成了多个MAC和PHY模块,可以看作是一个网络子系统。
硬件连接上,我们需要将AST1520的RGMII接口直接连接到交换芯片的MAC端口。这里有个关键点:RGMII的时序要求非常严格。我刚开始用飞线连接时,千兆模式下完全无法通信,后来降到10M模式才勉强能工作。实测发现,在低速模式下时序容错性更好,这对调试初期很有帮助。
2. MDIO协议与交换芯片控制
要让Linux内核和uboot能够控制RTL8367,必须先搞定通信接口。这颗交换芯片支持I2C、SPI和MDIO三种控制接口,考虑到AST1520的uboot已经内置了MDIO操作命令(phyw/phyr),我们优先选择MDIO方案。
MDIO协议是管理PHY设备的标准接口,但用在交换芯片上有些特殊之处。标准的PHY芯片只有16个基础寄存器,而RTL8367这样的交换芯片需要通过特殊方式访问扩展寄存器。具体来说,它的寄存器访问分为两层:
- 通过标准MDIO命令访问PHY伪寄存器
- 通过特定的伪寄存器间接访问芯片的实际控制寄存器
在uboot中测试MDIO读写时,我发现一个实用技巧:使用phyr命令读取PHY的BASIC CONTROL寄存器(地址0x00),这个寄存器包含了链路状态、自动协商等基本信息。如果连这个都读不出来,说明MDIO通信根本没建立。
3. 硬件调试实战经验
在实际硬件调试中,我遇到了几个典型问题,这里分享下排查过程:
首先是时钟问题。RTL8367需要125MHz参考时钟,这个时钟必须稳定。我用示波器测量时发现,飞线引入的干扰导致时钟抖动很大。临时解决方案是在uboot中将时钟频率降到25MHz(对应100Mbps模式),等PCB改版后再恢复。
其次是数据信号完整性问题。在ping测试失败时,我通过示波器抓取了RGMII数据线波形,发现TX数据有但RX无响应。仔细检查发现一根RX数据线虚焊,重新焊接后问题解决。这里有个经验:千兆模式下,数据眼图必须清晰完整,任何微小的信号质量问题都会导致通信失败。
最后是延时参数调整。RTL8367支持RX/TX延时调整,在硬件布线不理想时特别有用。通过修改以下寄存器可以优化时序:
# 设置RX延时(单位0.1ns) phyw mac 0x1e 0x1234 # 设置TX延时 phyw mac 0x1f 0x56784. Linux内核驱动适配要点
将uboot的调试成果移植到Linux 2.4.6内核时,需要注意几个关键点:
首先是MDIO驱动框架。2.4.6内核的MDIO支持比较原始,需要手动实现mii_bus结构体操作。下面是一个基本的读写函数示例:
static int rtl8367_mdiobus_read(struct mii_bus *bus, int phy_id, int regnum) { /* 实现具体的MDIO读取 */ return val; } static int rtl8367_mdiobus_write(struct mii_bus *bus, int phy_id, int regnum, u16 value) { /* 实现MDIO写入 */ return 0; }其次是网络设备注册。由于采用了MAC-MAC架构,我们需要修改网络驱动,让它识别交换芯片的存在。关键修改点在eth_open函数中,需要跳过PHY检测环节。
最后是速度/双工模式设置。在ethtool_ops中实现自定义的设置函数,因为标准PHY设置不适用于交换芯片。实测发现,直接操作以下寄存器可以强制设置速率:
# 强制100M全双工 phyw mac 0x04 0x21005. 常见问题排查指南
根据我的调试经验,整理了几个常见问题及解决方法:
- MDIO通信失败
- 检查MDIO引脚配置是否正确
- 测量MDC时钟是否正常(典型频率2.5MHz)
- 尝试降低通信速率测试
- 网络不通但链路灯亮
- 检查RGMII时序参数
- 验证交换芯片的端口映射是否正确
- 抓取RGMII数据线波形分析
- 性能不稳定
- 检查PCB布线长度是否匹配
- 调整RX/TX延时参数
- 验证时钟抖动是否在允许范围内
在调试交换芯片时,我强烈建议准备一个已知正常的参考设计(比如厂商demo板),通过对比测试可以快速定位问题。比如我发现RTL8367的PORT5 LED指示灯闪烁模式异常,通过对比demo板的行为,最终发现是端口映射寄存器配置错误。
调试网络设备最考验耐心,有时候一个小问题可能要排查好几天。我的经验是:先确保硬件连接可靠,再验证底层通信正常,最后才考虑软件配置问题。按照这个顺序排查,可以少走很多弯路。