phy调试

概述

MAC 和PHY 的关系

MAC 就是以太网控制器,属于OSI的数字链路层。 phy 属于OSI的物理层(Physical layer),所以叫phy. MAC主要处理的数字信号,PHY负责把MAC的数字信号进行编码,串行化等操作后,转化为模拟信号进行发送。PHY在数据接受时, 进行如上所述的逆操作,将模拟信号转化为数字信号,解码,并行化后,传给MAC。

PHY 有一个重要的功能就是 自协商。 什么是自协商? 就是PHY一旦连入网络,PHY 会和它相连接的端口的PHY进行协商,当前通信使用的速率是 1000M, 100M 还是10M? 他们相互沟通后,会确定一个 两个端口都支持的最大网络速率。

PHY还有个重要的功能就是实现CSMA/CD的部分功能.它可以检测到网络上是否有数据在传送,如果有数据在传送中就等待,一旦检测到网络空闲,再等待一个随机时间后将送数据出去。

PHY 还提供了自动控制LED 等的功能。根据当前网络的传输速率,是否有数据传输,来自动控制LED 灯的行为。至于如何控制LED,可以根据PHY的datasheet 进行相关配置。

MDC/MDIO接口定义

MDC/MDIO接口是为MII总线接口定义的,在802.3协议clause 22中有详细的介绍,MII用于连接MAC和PHY,包含两种信号:

  1. 数据接口,用于MAC和PHY之间接收和发送以太网数据

  2. 一个PHY管理接口,即MDIO接口,用于读写PHY的控制寄存器和状态寄存器。

本文主要描述PHY的管理接口,MDIO/MDC.

MDIO 总线只支持 MAC 作为主设备,PHY 作为从设备。MIDO 支持两种时序,分别为 Clause 22 和 Clause 45.

MDIO clause 22 是 MDIO 使用的一种信号时序,在这个信号时序模式,MAC 先向 MDIO 信号线上拍 32 个周期,接着传输 16 bit 的控制位。16 个信号位包含了两个开始位, 2 个访问控制位,5 bits 的 PHY 地址,5 bits 的寄存器地址,以及 2 bits 的翻转位。 当进行写操作的时候,MAC 在接下来的周期中提供地址和数据;当进行读操作的时候, PHY 会翻转 MDIO 之后向 MDIO 信号线上发送数据。

MDIO 也支持 Clause 45 时序,其是 Clause 22 的拓展协议。与 Clause 22 不同的是, 16 位中的起始位:Clause 22 是 00, 而 Clause 45 是 01.

MDC (Management Data Clock), MDC是由MAC管理实体输出给PHY,作为管理数据MDIO的参考时钟信号,在上升沿触发MDIO的读写。MDC是一个非周期性的信号,最小时钟周期为400ns,与MII中的TX_CLK和RX_CLK无关。

MDIO(Management Data Input Output),MDIO是一个双向信号线,用来传输PHY的控制和状态信息。控制信息由MAC驱动,状态信息有PHY驱动。MDIO信号线初始为三态,由MAC或者PHY来驱动信号。

PHY驱动分析

驱动文件

phy调试_第1张图片
在这里插入图片描述

phy调试_第2张图片

/**
 \* stmmac_mdio_register
 \* @ndev: net device structure
 \* Description: it registers the MII bus
 */

int stmmac_mdio_register(struct net_device *ndev)
{
​    int err = 0;
​    struct mii_bus *new_bus;
​    int *irqlist;
​    struct stmmac_priv *priv = netdev_priv(ndev);
​    struct stmmac_mdio_bus_data *mdio_bus_data = priv->plat->mdio_bus_data;
​    int addr, found;

​    if (!mdio_bus_data)
​        return 0;

​    new_bus = mdiobus_alloc();
​    if (new_bus == NULL)
​        return -ENOMEM;

​    if (mdio_bus_data->irqs) {
​        irqlist = mdio_bus_data->irqs;
​    } else {
​        for (addr = 0; addr < PHY_MAX_ADDR; addr++)
​            priv->mii_irq[addr] = PHY_POLL;
​        irqlist = priv->mii_irq;
​    }

#ifdef CONFIG_OF
​    if (priv->device->of_node)
​        mdio_bus_data->reset_gpio = -1;
#endif

​    new_bus->name = "stmmac";
​    new_bus->read = &stmmac_mdio_read;
​    new_bus->write = &stmmac_mdio_write;
​    new_bus-

你可能感兴趣的:(网络,网络)