MII.h 和 MII.c
这是MII协议。里面有MII协议的PHY寄存器地址,及MII通信接口库

Linux的mdio主要是为了管理PHY芯片寄存器的,跟踪代码发现,它会进行创建PHY设备及一些初始化工作。

Linux内核有很多的PHY驱动。

PHY一般和具体的MAC控制驱动联系一起,这里以TI的MAC驱动为例,由它切入到PHY驱动。Linux内核通过mdio总线访问、控制PHY,源码实现在driver/net/phy/mdio_bus.c中

Linux Ethernet PHY 驱动:
http://www.voidcn.com/article/p-nhdqyqlp-h.html

Ethernet PHY芯片AR8035驱动:http://www.voidcn.com/article/p-pvwtfenz-ug.html

PHY Linux 驱动

Linux 4.6 phy驱动调试

linux Phy 设备驱动

linux Phy 设备驱动

linux PHY驱动

MII接口简介

MII接口及应用

Linux PHY 几个状态的跟踪

Linux phy驱动介绍

以太网芯片MAC和PHY的关系

MII PHY 寄存器简介:
https://www.jianshu.com/p/d539c41816e7

phy 寄存器简介

kernel里面include\uapi\linux\mii.h

分别对应的是PHY寄存器

而其中的control register 寄存器有这些配置

也即

Reset:Bit15控制的是PHY复位功能,在该位置写入1实现对PHY的复位操作。复位后该端口PHY的其他控制、状态寄存器将恢复到默认值,每次PHY复位应该在0.5s的时间内完成,复位过程中Bit15保持为1,复位完成之后该位应该自动清零。一般要改变端口的工作模式(如速率、双工、流控或协商信息等)时,在设置完相应位置的寄存器之后,需要通过Reset位复位PHY来使配置生效。

Loopback:Loopback是一个调试以及故障诊断中常用的功能,Bit14置1之后,PHY和外部MDI的连接在逻辑上将被断开,从MAC经过MII/GMII(也可能是其他的MAC/PHY接口)发送过来的数据将不会被发送到MDI上,而是在PHY内部(一般在PCS)回环到本端口的MII/GMII接收通道上,通过Loopback功能可以检查MII/GMII以及PHY接口部分是否工作正常,对于端口不通的情况可用于故障定位。需要注意的是,很多时候PHY设置Loopback后端口可能就Link down了,MAC无法向该端口发帧,这时就需要通过设置端口Force Link up才能使用Loopback功能。

Speed Selection:Bit13和Bit6两位联合实现对端口的速率控制功能,具体的对应关系见表2。需要注意的是Speed Selection只有在自动协商关闭的情况下才起作用,如果自动协商设置为Enable状态,则该设置不起作用;并且,对Speed Selection的修改设置,往往需要复位端口才能配置生效。因此在设置该位置的时候需要检查自动协商的设置并通过Bit15复位端口。

Auto-Negotiation Enable:自动协商(AN)开关。设置为1表示打开AN功能,端口的工作模式通过和连接对端进行AN来确定。如果设置为0则AN功能关系,端口的工作模式通过Control Register相应位置的配置决定。必须注意的是,对于1000BASE-T接口,自动协商必须打开。

Power Down:端口工作开关。设置为1将使端口进入Power Down模式,正常情况下PHY在Power Down模式其MII和MDI均不会对外发送数据。Power Down模式一般在软件shut down端口的时候使用,需要注意的是端口从Power Down模式恢复,需要复位端口以保证端口可靠的连接。

Isolate:隔离状态开关。该位置1将导致PHY和MII接口之间处于电气隔离状态,除了MDC/MDIO接口的信号外,其他MII引脚处于高阻态。IEEE802.3没有对Isolate 时MDI接口的状态进行规范,此时MDI端可能还在正常运行。Isolate在实际应用中并没有用到。并且,值得注意的是,由于目前很多百兆的PHY芯片其MAC接口主流的都是SMII/S3MII,8个端口的接口是相互关联的,一个端口设置Isolate可能会影响其他端口的正常使用,因此在使用中注意不要随意更改bit10的状态。

Restart Auto-Negotiation :重新启动自动协商开关。Bit9置1将重新启动端口的自动协商进程,当然前提是Auto-Negotiation Enable是使能的。一般在修改端口的自动协商能力信息之后通过Bit9置1重新启动自动协商来使端口按照新的配置建立link。

Duplex Mode:双工模式设置。Bit8置1端口设置为全双工,置0则端设置为半双工,和Speed Selection的设置一样,Duplex Mode的设置只有在自动协商关闭的情况下才起作用,如果自动协商设置为Enable状态,则该设置不起作用,端口的双工模式根据AN结果来定。对Duplex Mode的修改配置也需要复位端口才能生效。

Collision Test:冲突信号(COL)测试开关。在需要对COL信号进行测试时,可以通过Bit7置1,这时PHY将输出一个COL脉冲以供测试。实际测试操作中也可以将端口配置为半双工状态,通过发帧冲突来测试COL信号,因此该配置实用价值不大。

status register 有这些配置

Auto-Negotiation Complete:AN完成状态指示位。Bit5指示的是端口AN进程是否完成的状态位。在AN Enable的情况下,Bit5=1表示自动协商进程已经成功结束,此时PHY的其他和Link状态相关的寄存器才是正确可靠的。如果AN进程没有完成,则这些状态信息可能是错误的。在调试以及异常故障处理时,可以通过该位寄存器的状态判断AN是否成功,从而进一步的检查AN相关的设置是否正确,或者芯片的AN功能是否正常等。

Remote Fault:远端错误指示位。Bit4=1代表连接对端(Link Partner)出错,至于出错的具体类型以及错误检测机制在规范中并没有定义,由PHY的制造商自由发挥,一般的厂商都会在其他的寄存器(Register16-31由厂商自行定义)指示比较详细的错误类型。在与端口相关的故障查证中,Remote Fault是一个重要的指示信息,通过互联双方的Remote Fault信息(可能要加上其他的具体错误指示),可以帮助定位故障原因。

Link Status:Link状态指示位。Bit2=1代表端口Link up,0则代表端口Link down。实际应用中一般都是通过Bit2来判断端口的状态。而且,一般的MAC芯片也是通过轮询PHY的这个寄存器值来判断端口的Link状态的(这个过程可能有不同的名称,比如BCM叫做Link Scan,而Marvell叫做PHY Polling。)如前所述,在AN Enable的情况下,Link Status的信息只有在Auto-Negotiation Complete指示已经完成的情况下才是正确可靠的,否则有可能出错。

Jabber Detect:Jabber 检测指示位。IEEE802.3对Jabber的解释是"A condition wherein a station transmits for a period of time longer than the maximum permissible packet length, usually due to a fault condition"。这一位指示的是Link Partner发送的时间超过了规定的最大长度。值得注意的是,Jabber Detect只有在10BASE-T模式下才有意义,100和1000M模式是没有定义Jabber这一功能的。

更多寄存器配置说明查看文件MII.h

/** linux/mii.h: definitions for MII-compatible transceivers* Originally drivers/net/sunhme.h.** Copyright (C) 1996, 1999, 2001 David S. Miller (davem@redhat.com)*/#ifndef _UAPI__LINUX_MII_H__
#define _UAPI__LINUX_MII_H__#include <linux/types.h>
#include <linux/ethtool.h>/* Generic MII registers. */
#define MII_BMCR        0x00    /* Basic mode control register */
#define MII_BMSR        0x01    /* Basic mode status register  */
#define MII_PHYSID1     0x02    /* PHYS ID 1                   */
#define MII_PHYSID2     0x03    /* PHYS ID 2                   */
#define MII_ADVERTISE       0x04    /* Advertisement control reg   */
#define MII_LPA         0x05    /* Link partner ability reg    */
#define MII_EXPANSION       0x06    /* Expansion register          */
#define MII_CTRL1000        0x09    /* 1000BASE-T control          */
#define MII_STAT1000        0x0a    /* 1000BASE-T status           */
#define MII_MMD_CTRL        0x0d    /* MMD Access Control Register */
#define MII_MMD_DATA        0x0e    /* MMD Access Data Register */
#define MII_ESTATUS     0x0f    /* Extended Status             */
#ifdef CONFIG_MP_GEMAC_MII_PHY_STAT
#define MII_PHYSR       0x11    /* PHY specific status register */
#endif /* End of CONFIG_MP_GEMAC_MII_PHY_STAT */
#define MII_DCOUNTER        0x12    /* Disconnect counter          */
#define MII_FCSCOUNTER      0x13    /* False carrier counter       */
#define MII_NWAYTEST        0x14    /* N-way auto-neg test reg     */
#define MII_RERRCOUNTER     0x15    /* Receive error counter       */
#define MII_SREVISION       0x16    /* Silicon revision            */
#define MII_RESV1       0x17    /* Reserved...                 */
#define MII_LBRERROR        0x18    /* Lpback, rx, bypass error    */
#define MII_PHYADDR     0x19    /* PHY address                 */
#define MII_RESV2       0x1a    /* Reserved...                 */
#define MII_TPISTATUS       0x1b    /* TPI status for 10mbps       */
#define MII_NCONFIG     0x1c    /* Network interface config    *//* Basic mode control register. */
#define BMCR_RESV       0x003f  /* Unused...                   */
#define BMCR_SPEED1000      0x0040  /* MSB of Speed (1000)         */
#define BMCR_CTST       0x0080  /* Collision test              */
#define BMCR_FULLDPLX       0x0100  /* Full duplex                 */
#define BMCR_ANRESTART      0x0200  /* Auto negotiation restart    */
#define BMCR_ISOLATE        0x0400  /* Isolate data paths from MII */
#define BMCR_PDOWN      0x0800  /* Enable low power state      */
#define BMCR_ANENABLE       0x1000  /* Enable auto negotiation     */
#define BMCR_SPEED100       0x2000  /* Select 100Mbps              */
#define BMCR_LOOPBACK       0x4000  /* TXD loopback bits           */
#define BMCR_RESET      0x8000  /* Reset to default state      */
#define BMCR_SPEED10        0x0000  /* Select 10Mbps               *//* Basic mode status register. */
#define BMSR_ERCAP      0x0001  /* Ext-reg capability          */
#define BMSR_JCD        0x0002  /* Jabber detected             */
#define BMSR_LSTATUS        0x0004  /* Link status                 */
#define BMSR_ANEGCAPABLE    0x0008  /* Able to do auto-negotiation */
#define BMSR_RFAULT     0x0010  /* Remote fault detected       */
#define BMSR_ANEGCOMPLETE   0x0020  /* Auto-negotiation complete   */
#define BMSR_RESV       0x00c0  /* Unused...                   */
#define BMSR_ESTATEN        0x0100  /* Extended Status in R15      */
#define BMSR_100HALF2       0x0200  /* Can do 100BASE-T2 HDX       */
#define BMSR_100FULL2       0x0400  /* Can do 100BASE-T2 FDX       */
#define BMSR_10HALF     0x0800  /* Can do 10mbps, half-duplex  */
#define BMSR_10FULL     0x1000  /* Can do 10mbps, full-duplex  */
#define BMSR_100HALF        0x2000  /* Can do 100mbps, half-duplex */
#define BMSR_100FULL        0x4000  /* Can do 100mbps, full-duplex */
#define BMSR_100BASE4       0x8000  /* Can do 100mbps, 4k packets  *//* Advertisement control register. */
#define ADVERTISE_SLCT      0x001f  /* Selector bits               */
#define ADVERTISE_CSMA      0x0001  /* Only selector supported     */
#define ADVERTISE_10HALF    0x0020  /* Try for 10mbps half-duplex  */
#define ADVERTISE_1000XFULL 0x0020  /* Try for 1000BASE-X full-duplex */
#define ADVERTISE_10FULL    0x0040  /* Try for 10mbps full-duplex  */
#define ADVERTISE_1000XHALF 0x0040  /* Try for 1000BASE-X half-duplex */
#define ADVERTISE_100HALF   0x0080  /* Try for 100mbps half-duplex */
#define ADVERTISE_1000XPAUSE    0x0080  /* Try for 1000BASE-X pause    */
#define ADVERTISE_100FULL   0x0100  /* Try for 100mbps full-duplex */
#define ADVERTISE_1000XPSE_ASYM 0x0100  /* Try for 1000BASE-X asym pause */
#define ADVERTISE_100BASE4  0x0200  /* Try for 100mbps 4k packets  */
#define ADVERTISE_PAUSE_CAP 0x0400  /* Try for pause               */
#define ADVERTISE_PAUSE_ASYM    0x0800  /* Try for asymetric pause     */
#define ADVERTISE_RESV      0x1000  /* Unused...                   */
#define ADVERTISE_RFAULT    0x2000  /* Say we can detect faults    */
#define ADVERTISE_LPACK     0x4000  /* Ack link partners response  */
#define ADVERTISE_NPAGE     0x8000  /* Next page bit               */#define ADVERTISE_FULL     (ADVERTISE_100FULL | ADVERTISE_10FULL | \ADVERTISE_CSMA)
#define ADVERTISE_ALL       (ADVERTISE_10HALF | ADVERTISE_10FULL | \ADVERTISE_100HALF | ADVERTISE_100FULL)/* Link partner ability register. */
#define LPA_SLCT        0x001f  /* Same as advertise selector  */
#define LPA_10HALF      0x0020  /* Can do 10mbps half-duplex   */
#define LPA_1000XFULL       0x0020  /* Can do 1000BASE-X full-duplex */
#define LPA_10FULL      0x0040  /* Can do 10mbps full-duplex   */
#define LPA_1000XHALF       0x0040  /* Can do 1000BASE-X half-duplex */
#define LPA_100HALF     0x0080  /* Can do 100mbps half-duplex  */
#define LPA_1000XPAUSE      0x0080  /* Can do 1000BASE-X pause     */
#define LPA_100FULL     0x0100  /* Can do 100mbps full-duplex  */
#define LPA_1000XPAUSE_ASYM 0x0100  /* Can do 1000BASE-X pause asym*/
#define LPA_100BASE4        0x0200  /* Can do 100mbps 4k packets   */
#define LPA_PAUSE_CAP       0x0400  /* Can pause                   */
#define LPA_PAUSE_ASYM      0x0800  /* Can pause asymetrically     */
#define LPA_RESV        0x1000  /* Unused...                   */
#define LPA_RFAULT      0x2000  /* Link partner faulted        */
#define LPA_LPACK       0x4000  /* Link partner acked us       */
#define LPA_NPAGE       0x8000  /* Next page bit               */#define LPA_DUPLEX     (LPA_10FULL | LPA_100FULL)
#define LPA_100         (LPA_100FULL | LPA_100HALF | LPA_100BASE4)/* Expansion register for auto-negotiation. */
#define EXPANSION_NWAY      0x0001  /* Can do N-way auto-nego      */
#define EXPANSION_LCWP      0x0002  /* Got new RX page code word   */
#define EXPANSION_ENABLENPAGE   0x0004  /* This enables npage words    */
#define EXPANSION_NPCAPABLE 0x0008  /* Link partner supports npage */
#define EXPANSION_MFAULTS   0x0010  /* Multiple faults detected    */
#define EXPANSION_RESV      0xffe0  /* Unused...                   */#define ESTATUS_1000_TFULL 0x2000  /* Can do 1000BT Full          */
#define ESTATUS_1000_THALF  0x1000  /* Can do 1000BT Half          *//* N-way test register. */
#define NWAYTEST_RESV1      0x00ff  /* Unused...                   */
#define NWAYTEST_LOOPBACK   0x0100  /* Enable loopback for N-way   */
#define NWAYTEST_RESV2      0xfe00  /* Unused...                   *//* 1000BASE-T Control register */
#define ADVERTISE_1000FULL  0x0200  /* Advertise 1000BASE-T full duplex */
#define ADVERTISE_1000HALF  0x0100  /* Advertise 1000BASE-T half duplex */
#define CTL1000_AS_MASTER   0x0800
#define CTL1000_ENABLE_MASTER   0x1000/* 1000BASE-T Status register */
#define LPA_1000LOCALRXOK   0x2000  /* Link partner local receiver status */
#define LPA_1000REMRXOK     0x1000  /* Link partner remote receiver status */
#define LPA_1000FULL        0x0800  /* Link partner 1000BASE-T full duplex */
#define LPA_1000HALF        0x0400  /* Link partner 1000BASE-T half duplex *//* Flow control flags */
#define FLOW_CTRL_TX        0x01
#define FLOW_CTRL_RX        0x02/* MMD Access Control register fields */
#define MII_MMD_CTRL_DEVAD_MASK 0x1f    /* Mask MMD DEVAD*/
#define MII_MMD_CTRL_ADDR   0x0000  /* Address */
#define MII_MMD_CTRL_NOINCR 0x4000  /* no post increment */
#define MII_MMD_CTRL_INCR_RDWT  0x8000  /* post increment on reads & writes */
#define MII_MMD_CTRL_INCR_ON_WT 0xC000  /* post increment on writes only */#ifdef CONFIG_MP_GEMAC_MII_PHY_STAT
/* PHY specific status register  */
#define PHYSR_SPEED_MASK    0xc000  /* Speed mask*/
#define PHYSR_RESERVED      0xc000  /* Reserved*/
#define PHYSR_1000      0x8000  /* 1000Mbps*/
#define PHYSR_100       0x4000  /* 100Mbps*/
#define PHYSR_10        0x0000  /* 10Mbps*/
#define PHYSR_DUPLEX_MASK   0x2000  /* Duplex mask*/
#define PHYSR_FULL_DUPLEX   0x2000  /* Full duplex*/
#define PHYSR_HALF_DUPLEX   0x0000  /* Half duplex*/
#endif /* End of CONFIG_MP_GEMAC_MII_PHY_STAT *//* This structure is used in all SIOCxMIIxxx ioctl calls */
struct mii_ioctl_data {__u16        phy_id;__u16        reg_num;__u16       val_in;__u16        val_out;
};#endif /* _UAPI__LINUX_MII_H__ */

mstar 平台phy 相关文件:
kernel\linaro\mstar2\hal\m7221\emac\mhal_emac.c
kernel\linaro\mstar2\drv\emac\mdrv_emac.c
kernel\linaro\mstar2\hal\m7221\emac\mhal_emac.h
kernel\linaro\mstar2\drv\emac\mdrv_emac.h
kernel\linaro\drivers\net\mii.c
kernel\linaro\drivers\net\phy\phy_device.c
kernel\linaro\drivers\net\phy\phy.c

mstar 平台网卡属性操作:
接口有MHal_EMAC_read_phy ,MHal_EMAC_write_phy

  • Auto-negotiation complete
     u32  bmsr;MHal_EMAC_read_phy(phyaddr, MII_BMSR, &bmsr);MHal_EMAC_read_phy(phyaddr, MII_BMSR, &bmsr);if (bmsr & BMSR_ANEGCOMPLETE) {/* For Link Parterner adopts force mode and EPHY used,* EPHY LPA reveals all zero value.* EPHY would be forced to Full-Duplex mode.*/......}

MII_BMSR 为寄存器id,BMSR_ANEGCOMPLETE 为Auto-negotiation complete对应的bit 位。

  • Link partner ability
        MHal_EMAC_read_phy (phyaddr, MII_LPA, &LocPtrA);if ((LocPtrA & LPA_100FULL) || (LocPtrA & LPA_100HALF)){uRegStatus |= ETHERNET_TEST_SPEED_100M; //SPEED_100//}else{uRegStatus &= ~ETHERNET_TEST_SPEED_100M; //SPEED_10//}if ((LocPtrA & LPA_100FULL) || (LocPtrA & LPA_10FULL)){uRegStatus |= ETHERNET_TEST_DUPLEX_FULL; //DUPLEX_FULL//}else{uRegStatus &= ~ETHERNET_TEST_DUPLEX_FULL; //DUPLEX_HALF//}

MII_LPA 为“Link partner ability ” 寄存器索引id,LPA_100HALF 为bit 7 ,为1 则表示可以做可以做100M bps半双工,LPA_100FULL 为bit 8 ,为1 则表示可以做100M bps全双工。

MHal_EMAC_read_phy

//-------------------------------------------------------------------------------------------------
// Read value stored in a PHY register.
// Note: MDI interface is assumed to already have been enabled.
//-------------------------------------------------------------------------------------------------
void MHal_EMAC_read_phy( unsigned char phy_addr, unsigned char address, u32* value )
{#if CONFIG_ETHERNET_ALBANYphys_addr_t uRegBase  = INTERNEL_PHY_REG_BASE;u32 tempvalue ;phy_addr =0;tempvalue = *(volatile unsigned int *)(INTERNEL_PHY_REG_BASE + 0x04UL);tempvalue |= 0x0004UL;*(volatile unsigned int *)(INTERNEL_PHY_REG_BASE + 0x04UL) = tempvalue;udelay( 1 );*value = *(volatile unsigned int *)(uRegBase + address*4);
#elseu32 uRegVal = 0, uCTL = 0;uRegVal = (EMAC_HIGH | EMAC_CODE_802_3 | EMAC_RW_R)| ((phy_addr & 0x1fUL) << PHY_ADDR_OFFSET) | (address << PHY_REGADDR_OFFSET) | (0) ;uCTL = MHal_EMAC_Read_CTL();MHal_EMAC_enable_mdi();MHal_EMAC_Write_MAN(uRegVal);//Wait until IDLE bit in Network Status register is cleared //uRegVal = MHal_EMAC_ReadReg32( REG_ETH_SR );  //Must read Low 16 bit.while ( !( uRegVal & EMAC_IDLE ) ){uRegVal = MHal_EMAC_ReadReg32( REG_ETH_SR );barrier();}*value = ( MHal_EMAC_Read_MAN() & 0x0000ffffUL );MHal_EMAC_Write_CTL(uCTL);
#endif
}

MHal_EMAC_write_phy

//-------------------------------------------------------------------------------------------------
// Write value to the a PHY register
// Note: MDI interface is assumed to already have been enabled.
//-------------------------------------------------------------------------------------------------
void MHal_EMAC_write_phy( unsigned char phy_addr, unsigned char address, u32 value )
{#if CONFIG_ETHERNET_ALBANYphys_addr_t uRegBase = INTERNEL_PHY_REG_BASE;phy_addr =0;*(volatile unsigned int *)(uRegBase + address*4) = value;udelay( 1 );
#elseu32 uRegVal = 0, uCTL = 0;uRegVal =  ( EMAC_HIGH | EMAC_CODE_802_3 | EMAC_RW_W) | (( phy_addr & 0x1FUL ) << PHY_ADDR_OFFSET )| ( address << PHY_REGADDR_OFFSET ) | (value & 0xFFFFUL);uCTL = MHal_EMAC_Read_CTL();MHal_EMAC_enable_mdi();MHal_EMAC_Write_MAN( uRegVal );// Wait until IDLE bit in Network Status register is cleared //uRegVal = MHal_EMAC_ReadReg32( REG_ETH_SR );  //Must read Low 16 bit.while ( !( uRegVal & EMAC_IDLE ) ){uRegVal = MHal_EMAC_ReadReg32( REG_ETH_SR );barrier();}MHal_EMAC_Write_CTL(uCTL);
#endif
}

两个函数用法差不多,主要是查清楚,寄存器 id 及其bit 对应的功能,这就需要对协议比较了解。

eth mac 中断

其中emac 中断ID为

dev->irq = E_IRQ_EMAC;

E_IRQ_EMAC 在kernel\linaro\mstar2\hal\m7221\cpu\arm64\chip_int.h定义

当然,如果能拿到原厂驱动设备在cpu 的映射地址,则可以接获取对应寄存器的信息:

例如,某方案的bank 34 对应的寄存器14 ,寄存器 15 储存网卡的状态信息,其中reg 15 的bit0,bit3 都为1 时,网线物理连接;都为零时,网线物理断开。

BOOL xxxxxxxxxx::function()
{BOOL     bRet = false;MS_U8  u8RegL = 0x00;MS_U8  u8RegH = 0x00;MS_U16 detRes = 0x0000;u8RegL = MApi_XC_ReadByte(0x003414);u8RegH = MApi_XC_ReadByte(0x003414 + 1);detRes = (u8RegH << 8 | u8RegL);printf("[Alex] detect res: 0x%04x .\n",detRes);if( detRes == 0x0000 || detRes == 0x0020){bRet = false;}else if(u8RegH == 0x09){bRet = true;}return bRet;
}

又如T9632 ,新加的RJ45 座子,其中灯不是直连主芯片,而是直连网络芯片,而网线的连接状态在网络芯片的emac模块被检测到,这个时候可以在这里控制了。

--- a/drv/emac/mdrv_emac_v3.c
+++ b/drv/emac/mdrv_emac_v3.c
@@ -116,6 +116,10 @@#include <random.h>#include "mhal_rng_reg.h"#endif
+
+#include "mdrv_gpio.h"
+#include "mhal_gpio_reg.h"
+//-------------------------------------------------------------------------------------------------//  Data structure//-------------------------------------------------------------------------------------------------
@@ -1398,11 +1402,13 @@ static int MDev_EMAC_open (struct net_device *dev){netif_carrier_off(dev);LocPtr->ThisBCE.connected = 0;
+        MDrv_GPIO_Set_High(PAD_GPIO9_PM);}else if(0 == ret){netif_carrier_on(dev);LocPtr->ThisBCE.connected = 1;
+        MDrv_GPIO_Set_Low(PAD_GPIO9_PM);}return 0;
@@ -4759,6 +4765,7 @@ static void MDev_EMAC_timer_callback(unsigned long value){LocPtr->ThisBCE.connected = 1;netif_carrier_on(emac_dev);
+            MDrv_GPIO_Set_Low(PAD_GPIO9_PM);}// Link status is latched, so read twice to get current value //
@@ -4776,6 +4783,7 @@ static void MDev_EMAC_timer_callback(unsigned long value)if(LocPtr->ThisBCE.connected) {LocPtr->ThisBCE.connected = 0;netif_carrier_off(emac_dev);
+            MDrv_GPIO_Set_High(PAD_GPIO9_PM);}// If disconnected is over 3 Sec, the real value of PHY's status register will report to application.if(time_count > CONFIG_DISCONNECT_DELAY_S*10) {@@ -4788,6 +4796,7 @@ static void MDev_EMAC_timer_callback(unsigned long value)// Report to kernel.netif_carrier_off(emac_dev);LocPtr->ThisBCE.connected = 0;
+            MDrv_GPIO_Set_High(PAD_GPIO9_PM);// Normally, time out is set 1 Sec.LocPtr->Link_timer.expires = jiffies + EMAC_CHECK_LINK_TIME;}

网线接入时,emac 驱动会将/sys/class/net/eth0/carrier 节点就行刷新,netif_carrier_off 时为0 也即网线断开,netif_carrier_on 时为1 也即网线连着的,在对应状态控灯就可以了。

Mstar Mac Phy 驱动学习相关推荐

  1. Linux驱动学习笔记

    驱动学习笔记 1.字符设备驱动 Linux 驱动有两种运行方式 第一种就是将驱动编译进 Linux 内核中,这样当 Linux 内核启 动的时候就会自动运行驱动程序. 第二种就是将驱动编译成模块(Li ...

  2. 高通SDX55平台:R8168 PHY驱动适配

    高通SDX55平台 R8168 PHY驱动适配 1. SDX55 CPE应用场景 高通5G平台SDX55支持5G独立组网(SA)和非独立组网(NSA)两种网络架构,同时兼容LTE和WCDMA制式,拥有 ...

  3. RV1126 Linux 以太网MAC PHY 芯片8201f gmac dts配置

    RK 系列的 SoC 中内置了以太网 MAC 控制器,所以只需要搭配一颗以太网 PHY芯片, 即可实现以太网卡功能. 按照规范, 即使是不同厂家的 PHY,同样有一部分寄 存器的定义是通用的, 只要配 ...

  4. 以太网芯片mac/phy的关系

    问:如何实现单片以太网微控制器? 答:诀窍是将微控制器.以太网媒体接入控制器(MAC)和物理接口收发器(PHY)整合进同一芯片,这样能去掉许多外接元器件.这种方案可使MAC和PHY实现很好的匹配,同时 ...

  5. phy 驱动与 switch 驱动

    phy 驱动与 switch 驱动 phy 驱动 phy 与 cpu 的硬件连接 一般为 MAC-PHY 模式: ----------- | CPU | RGMII/| ------| MII --- ...

  6. Linux Ethernet PHY 驱动

    今年在FPGA上和IC那边一起验证了MAC/PHY, 基于linux 3.6.4, 这边小结一下代码. phy的初始化顺序 第一步 phy_init   mdio_bus_init     bus_r ...

  7. PHY驱动调试之 --- PHY控制器驱动(二)

    1. 前言 内核版本:linux 4.9.225,以freescale为例. 2. 概述 PHY芯片为OSI的最底层-物理层(Physical Layer),通过MII/GMII/RMII/SGMII ...

  8. Linux eth phy驱动框架分析

    Linux中,对于eth phy的驱动,是依附于 mdiobus的,物理上,soc内部会有 mac控制器,要想实现以太网数据收发,需要外挂一颗 phy芯片,然后 soc内部的mac控制器驱动,一般都由 ...

  9. Linux驱动开发(十八)---网络(网卡)驱动学习

    前文回顾 <Linux驱动开发(一)-环境搭建与hello world> <Linux驱动开发(二)-驱动与设备的分离设计> <Linux驱动开发(三)-设备树> ...

最新文章

  1. 特征工程之离散变量处理
  2. python自学什么书比较好-有什么好的自学 Python 的书籍推荐?
  3. cmake交叉编译android,CMake Android 交叉编译
  4. [翻译] ASP.NET Core 3.0 的新增功能
  5. c++中RTTI的观念和使用
  6. 优秀的测试网站(转载)
  7. 命名问题导致的一个bug
  8. “一寺一墓”的典型格局
  9. 前端 psd切片生成html.css,1个将PSD网页模板切片输出为DIV+CSS架构网页教程
  10. 百度地图 InfoWindow上添加点击事件
  11. 【Swift】图片裁剪
  12. 初中计算机表格处理教案,初中信息技术Excel教案设计
  13. python pip 安装失败问题解决
  14. unbuntu下 sudo apt-get update 更新软件源列表
  15. 电信号、模拟型号、图像声音储存原理及傅里叶转换的粗浅理解
  16. LabVIEW编程LabVIEW开发Andor CCD例程与相关资料
  17. Unable to create the django_migrations table 迁移文件时报错
  18. Jenkins CI服务器搭建及Maven私服Nexus
  19. [教程]Magic Mouse 频繁失去连接解决方法
  20. 哈希表查找——成功和不成功时的平均查找长度

热门文章

  1. SEO技术:外链建设操作要点
  2. shell-------数组遍历、切片、替换等操作
  3. 全面认识MOS管,一篇文章就够了
  4. twitter如何以图搜图_没有完整图时,如何使用图深度学习?你需要了解流形学习2.0版本...
  5. 解析xml文件的几种方法和原理
  6. java web 有什么区别吗_web和java一样吗?有什么区别?
  7. 【深度学习】数据扩充 (Data Augmentation)
  8. cv2绘图 cv.line(),cv.circle(),cv.rectangle(),cv.ellipse(),cv.putText() python
  9. EXCELL XLToolbox科研作图插件
  10. 使用ESP8266数据上onenet云平台