|
SMI全称是串行管理接口(Serial
Management Interface)。是MII接口中的管理接口。
SMI接口包括两根信号线:MDC和MDIO,通过它,MAC层芯片(或其它控制芯片)可以访问物理层芯片的寄存器(前面100M物理层芯片中介绍的寄存器组,但不仅限于100M物理层芯片,10M物理层芯片也可以拥有这些寄存器),并通过这些寄存器来对物理层芯片进行控制和管理。SMI管理接口如下:
MDC:管理接口的时钟,它是一个非周期信号,信号的最小周期(实际是正电平时间和负电平时间之和)为400ns,最小正电平时间和负电平时间为160ns,最大的正负电平时间无限制。它与TX_CLK和RX_CLK无任何关系。
MDIO是一根双向的数据线。用来传送MAC层的控制信息和物理层的状态信息。MDIO数据与MDC时钟同步,在MDC上升沿有效。MDIO管理接口的数据帧结构如:
PRE:帧前缀域,为32个连续“1”比特,这帧前缀域不是必要的,某些物理层芯片的MDIO操作就没有这个域。
OP:帧操作码,比特“10”表示此帧为一读操作帧,比特“01”表示此帧为一写操作帧。
PHYAD:物理层芯片的地址,5个比特,每个芯片都把自己的地址与这5个比特进行比较,若匹配则响应后面的操作,若不匹配,则忽略掉后面的操作。
REGAD:用来选择物理层芯片的32个寄存器中的某个寄存器的地址。
TA:状态转换域,若为读操作,则第一比特时MDIO为高阻态,第二比特时由物理层芯片使MDIO置“0”。若为写操作,则MDIO仍由MAC层芯片控制,其连续输出“10”两个比特。
DATA:帧的寄存器的数据域,16比特,若为读操作,则为物理层送到MAC层的数据,若为写操作,则为MAC层送到物理层的数据。
IDLE:帧结束后的空闲状态,此时MDIO无源驱动,处高阻状态,但一般用上拉电阻使其处在高电平,即MDIO引脚需要上拉电阻。
1. 简介
The MDIO interface is a simple, two-wire,
serial interface to connect a management entity and a managed PHY for the
purposes of controlling the PHY and gathering status from the PHY.
The two lines include the MDC line
[Management Data Clock], and the MDIO line [Management Data Input/Output]. The
clock is point-to-point, while the data line is a bi-directional multi-drop
interface.
The data line is Tri-state able and
can drive 32 devices.
MDIO接口,MAC与PHY间的管理接口(MII是数据接口),有2根线:时钟线MDC,数据线MDIO(双向)
MDIO工作流程:
*
Preamle(PRE) 在没有传输数据的空闲状态时,数据线MDIO处于高阻态(一直为1)。
* Start of Frame(ST) MAC驱动MDIO线,出现一个2bit的开始标识码(01)。
* Operation Code(OP) MAC驱动MDIO线,出现一个2bit数据来标识是读操作(10)还是写操作(01)。
* PHY Address(PHYAD) MAC驱动MDIO线,出现一个5bit数据标识PHY的地址。
* Reg Address(REGAD) MAC驱动MDIO线,出现一个5bitPHY寄存器地址。
*
Turnaround(TA) 写操作的话,MAC驱动MDIO线,出现10
读操作的话,MDIO pin of MAC must be put in high-impedance
state
在第二个周期,PHY驱动MDIO线,出现0
*
Data
MDIO串行读出/写入16bit的寄存器数据。
* MDIO恢复成空闲状态,同时MDIO进入高阻状态。
下面是PHY芯片 BCM5461 的一个例子:
2. PowerPC对MDIO的支持
PowerPC操作MDIO时,涉及以下寄存器:
MIIMCFG 配置寄存器
MIIMCOM 命令寄存器
MIIMADD 地址寄存器
MIIMCON 控制寄存器
MIIMSTAT 状态寄存器
MIIMIND 指示寄存器
以MPC8560举例,这些寄存器在CCSR中的位置如下:
2.1 MIIMCFG:配置寄存器
ResetMgmt: 用于重置MDIO模块
MgmtClockSet:时钟设置,是CCB的 2的n次方之一
2.2 MIIMCOM 命令寄存器
ReadCycle: 0->1 触发MDIO读时序
2.3 MIIMADD 地址寄存器
PHYaddr:PHY地址,共5bit,系统最多联31个PHY(地址0为保留)
REGaddr:寄存器地址,共5bit,一个PHY上最多32个寄存器地址(可以使用shadow
value技术,访问更多的寄存器)
2.4 MIIMCON 控制寄存器
PHYcontrol:在写流程时,这里存放要写入寄存器的值
2.5 MIIMSTAT 状态寄存器
PHYstatus:读流程时,PHY reg的内容会放到此
2.6 MIIMIND 指示寄存器
NotVal:若置1,表示读流程结束,可以去读MIIMSTAT
Scan: 若置1,表示扫描流程进行中
Busy: 只有置0时,才能进行新的读写流程
3. linux中MDIO的实现
读写PHY寄存器时通过2个函数
phy_read()和phy_write(),
最终调用
int gfar_local_mdio_read(struct gfar_mii *regs,
int mii_id, int regnum)
int gfar_local_mdio_write(struct gfar_mii *regs,
int mii_id, int regnum, u16 value)
参数regs就是MDIO相关寄存器: