4. Marvell PHY寄存器与MDIO访问实战
Marvell以太网PHY(如88E1512、88E1510、88E6390系列)的绝大多数配置与状态都通过MDIO接口访问内部寄存器完成。理解MDIO/MDC的时序、掌握寄存器映射结构、熟悉扩展寄存器页切换机制,是后续链路调优、自协商控制、SerDes参数调整的基础。本节从接口时序出发,逐步深入到寄存器读写与状态读取的实际操作。
一、MDIO/MDC接口时序
MDIO(Management Data Input/Output)是IEEE 802.3定义的双线管理接口:MDC为管理时钟,由MAC或管理控制器驱动;MDIO为双向数据线,在MDC上升沿采样。一次完整的寄存器访问由32位前导码(Preamble)、2位起始码(ST)、2位操作码(OP)、5位PHY地址(PHYAD)、5位寄存器地址(REGAD)、2位转向位(TA)以及16位数据(DATA)组成,共64个MDC周期。
关键时序参数:MDC频率通常不超过2.5MHz(部分器件支持到12.5MHz甚至25MHz,需查数据手册);MDIO在MDC上升沿必须稳定,建立时间典型要求≥10ns,保持时间≥10ns。读操作时,TA阶段由PHY驱动MDIO,主机需在TA第二位释放总线;写操作时TA由主机驱动。若时序不满足,常见现象是读到全1(0xFFFF)或全0,或PHY地址扫描时全部响应。
二、寄存器映射结构
Marvell PHY的寄存器空间分为标准寄存器(0x00~0x1F)和扩展寄存器。标准寄存器遵循IEEE 802.3 Clause 22定义,包括:
- 0x00 控制寄存器(BMCR):自协商使能、重启自协商、速率/双工强制、掉电、隔离等。
- 0x01 状态寄存器(BMSR):链路状态、自协商完成、能力指示。
- 0x02/0x03 PHY标识符(PHYID1/PHYID2):用于识别具体型号,如88E1512的PHYID2通常为0x0152。
- 0x04 自协商通告寄存器(ANAR)。
- 0x05 自协商链路伙伴能力(ANLPAR)。
- 0x09 千兆控制寄存器(GBCR)。
- 0x0A 千兆状态寄存器(GBSR)。
- 0x11 特定状态寄存器(PHY Specific Status),Marvell常用此寄存器读取实际链路速率、双工和页状态。
扩展寄存器通过页切换机制访问,典型页包括:页0(铜口寄存器)、页1(光纤/SerDes寄存器)、页2(MAC接口与时钟)、页3(LED与中断)、页4(测试与调试)、页6(扩展状态)。每页内部仍使用0x00~0x1F的寄存器地址,但物理上映射到不同的寄存器组。
三、扩展寄存器页切换
Marvell PHY通过寄存器0x16(扩展寄存器地址)和0x1D(扩展寄存器数据)实现页内寄存器访问,通过寄存器0x1F或0x16写入页号实现页切换。以88E1512为例,切换到页1的典型序列为:
// 切换到页1(光纤/SerDes页)
MDIO_Write(PHY_ADDR, 0x16, 0x0001); // 写页号到0x16
// 读取页1内寄存器0x00
uint16_t val = MDIO_Read(PHY_ADDR, 0x00);
// 切回页0
MDIO_Write(PHY_ADDR, 0x16, 0x0000);
注意:部分Marvell PHY使用0x1F作为页寄存器,部分使用0x16,需根据具体型号确认。页切换后,标准寄存器0x00~0x1F的映射会改变,因此读写扩展寄存器后务必切回页0,否则后续对BMCR/BMSR的访问会出错。
四、读写与状态读取实战
以下以88E1512为例,演示完整的寄存器读写与状态读取流程。假设PHY地址为0x08,MDC频率为2.5MHz。
步骤1:识别PHY。读取寄存器0x02和0x03,确认PHYID。88E1512的PHYID1通常为0x0141,PHYID2为0x0152。若读到0xFFFF,检查MDC/MDIO连线、上拉电阻和PHY地址。
步骤2:软复位。向BMCR(0x00)写入0x8000,等待至少100ms,再读BMCR确认bit15自动清零。
步骤3:配置自协商。向BMCR写入0x1140(自协商使能、重启自协商、速率/双工由自协商决定),向ANAR(0x04)写入0x01E1(通告10/100/1000M全双工能力)。
步骤4:读取链路状态。轮询BMSR(0x01)的bit2(Link Status)和bit5(Auto-Negotiation Complete)。链路建立后,读取PHY Specific Status(0x11)获取实际速率和双工:bit14:13表示速率(00=10M,01=100M,10=1000M),bit12表示双工(1=全双工)。
步骤5:访问扩展页。切换到页1,读取SerDes状态寄存器,确认光纤侧链路状态;切回页0。
五、寄存器访问检查表
| 检查项 | 预期值/操作 | 异常处理 |
|---|---|---|
| PHYID1/PHYID2 | 0x0141/0x0152(88E1512) | 检查MDIO上拉、PHY地址、MDC频率 |
| BMCR bit15 | 写0x8000后自动清零 | 确认页0、等待≥100ms |
| BMSR bit2 | 链路建立后为1 | 连续读两次,或读0x11 |
| 页寄存器 | 0x16或0x1F写入页号 | 查数据手册确认;操作后切回页0 |
| MDC频率 | ≤2.5MHz(保守值) | 降低频率或检查建立/保持时间 |
掌握上述流程后,即可对Marvell PHY进行完整的寄存器级控制。实际调试中,建议先用MDIO扫描确认PHY地址,再读取PHYID验证型号,然后按“复位→配置→读状态”的顺序操作。每次页切换后记录当前页号,避免因页残留导致后续配置失效。对于88E6390等交换芯片内置PHY,页切换寄存器可能为0x1F,且部分扩展页需要先解锁,具体以数据手册为准。