首页 > 其他分享 >GMAC网卡相关介绍与分析

GMAC网卡相关介绍与分析

时间:2023-10-18 21:34:35浏览次数:45  
标签:MAC SGMII PHY 介绍 stmmac 网卡 phy 寄存器 GMAC

GMAC网卡相关介绍与分析

来源 https://www.cnblogs.com/forwards/p/17101438.html

环境描述

环境

UTP

这里指MDI连接RJ45接口,UTP对网线来讲为非屏蔽双绞线。

SDS

SERDES是英文SERializer(串行器)/DESerializer(解串器)的简称 ,SerDes的主要特点包括:

1) 在数据线中时钟内嵌,不需要传送时钟信号。
2) 通过加重/均衡技术可以实现高速长距离传输,如背板。
3) 使用了较少的芯片引脚.

SGMII和FIBER都属于SDS,UTP\SDS指PHY与RJ45或光口的连接方式。MII、RGMII等表示PHY与MAC之间的硬件连接方式。

MII

本节信息来源

MII

MII

MII共16根线,数据位宽4(tx rx各4根信号线),TX_CLK RX_CLK均是PHY提供的。

TX_ER(Transmit Error): 发送数据错误提示信号,同步于TX_CLK,高电平有效,表示TX_ER有效期内传输的数据无效。对于10Mbps速率下,TX_ER不起作用;
    TX_EN(Transmit Enable): 发送使能信号,只有在TX_EN有效期内传的数据才有效;
    TX_CLK:发送参考时钟,100Mbps速率下,时钟频率为25MHz,10Mbps速率下,时钟频率为2.5MHz。注意,TX_CLK时钟的方向是从PHY侧指向MAC侧的,因此此时钟是由PHY提供的。
    TXD(Transmit Data)[3:0]:数据发送信号,共4根信号线;
    RX_ER(Receive Error): 接收数据错误提示信号,同步于RX_CLK,高电平有效,表示RX_ER有效期内传输的数据无效。对于10Mbps速率下,RX_ER不起作用;
    RX_DV(Reveive Data Valid): 接收数据有效信号,作用类型于发送通道的TX_EN;
    RXD(Receive Data)[3:0]:数据接收信号,共4根信号线;
    RX_CLK:接收数据参考时钟,100Mbps速率下,时钟频率为25MHz,10Mbps速率下,时钟频率为2.5MHz。RX_CLK也是由PHY侧提供的。
    CRS:Carrier Sense,载波侦测信号,不需要同步于参考时钟,只要有数据传输,CRS就有效,另外,CRS只有PHY在半双工模式下有效;
    COL:Collision Detectd,冲突检测信号,不需要同步于参考时钟,只有PHY在半双工模式下有效。
    MII接口一共有16根线。

RMII

RMII

RMII即 Reduced MII,是MII的简化板,共8根线,数据位宽2。

CLK_REF:是由外部时钟源提供的50MHz参考时钟,与MII接口不同,MII接口中的接收时钟和发送时钟是分开的,而且都是由PHY芯片提供给MAC芯片的。这里需要注意的是,由于数据接收时钟是由外部晶振提供而不是由载波信号提取的,所以在PHY层芯片内的数据接收部分需要设计一个FIFO,用来协调两个不同的时钟,在发送接收的数据时提供缓冲。PHY层芯片的发送部分则不需要FIFO,它直接将接收到的数据发送到MAC就可以了。

GMII

GMII

同MII,但数据位宽8位,共24根信号线,其中GTX_CLK由MAC侧提供,大多数GMII兼容MII。

RGMII

phy 如果工作在含有RGMII 接口的模式,按照业内惯例,tx clk delay 由MAC 来完成;rx clk delay 由phy 来完成。所以一般PHY芯片的rx clk delay默认是 2ns, tx clk delay默认是750ps。
来源https://blog.csdn.net/fangye945a/article/details/121109158

RGMII

RGMII即Reduced GMII,是GMII的简化版本,共14根信号线,位宽为4,该时钟上升沿下降沿均采集数据。

SGMII

SGMII

SGMII即Serial GMII,串行GMII,收发各一对差分信号线,时钟频率625MHz,在时钟信号的上升沿和下降沿均采样,参考时钟RX_CLK由PHY提供,是可选的,主要用于MAC侧没有时钟的情况,一般情况下,RX_CLK不使用。收发都可以从数据中恢复出时钟。大多数MAC芯片的SGMII接口都可以配置成SerDes接口(在物理上完全兼容,只需配置寄存器即可),直接外接光模块,而不需要PHY层芯片,此时时钟速率仍旧是625MHz。

GMAC网卡信息获取方法

获取GMAC网卡信息

 xqzhang@greatwall:~$ sudo find /sys/ -name "*stmmac*"
/sys/bus/platform/drivers/stmmaceth
/sys/bus/mdio_bus/devices/stmmac-0:04
/sys/bus/mdio_bus/drivers/Atheros 8035 ethernet/stmmac-0:04
/sys/devices/platform/FTGM0001:00/mdio_bus/stmmac-0
/sys/devices/platform/FTGM0001:00/mdio_bus/stmmac-0/stmmac-0:04
/sys/class/mdio_bus/stmmac-0
/sys/kernel/debug/stmmaceth
/sys/module/dwmac_generic/drivers/platform:stmmaceth
/sys/module/stmmac
/sys/module/stmmac/holders/stmmac_platform
/sys/module/stmmac_platform

由上述信息可知,phy驱动为Atheros 8035 ethernet,该设备为平台设备,设备目录为/sys/devices/platform/FTGM0001:00/

查看PHY工作接口模式

cat /sys/devices/platform/FTGM0001:00/mdio_bus/stmmac-0/stmmac-0:04/phy_interface
rgmii

获取PHY ID

cat /sys/devices/platform/FTGM0001\:00/mdio_bus/stmmac-0/stmmac-0\:04/phy_id
0x004dd072

MAC芯片

读写MAC寄存器的方法

devmem2: https://gitee.com/Lematin_SZ/ARM_Linux_Debug_Tools/blob/master/devmem2/devmem2.c

Usage:  devmem2 { address } [ type [ data ] ]
        address : memory address to act upon
        type    : access operation type : [b]yte, [h]alfword, [w]ord
        data    : data to be written

对于FT2000/4核,MAC芯片是包含在CPU核内的,因此根据FT-2000/4+软件编程手册.pdf手册可以拿到MAC芯片的物理地址,用户态直接映射该物理地址可直接进行读写。
此外该物理地址也可以从设备树 ACPI固件中读取。

FT-2000/4+软件编程手册.pdf

读MAC寄存器

MAC0地址寄存器

读mac地址0寄存器

xqzhang@greatwall:~$ ifconfig enaftgm1i0
enaftgm1i0 Link encap:以太网  硬件地址 00:07:3e:9a:79:d6  
          inet 地址:172.25.83.26  广播:172.25.87.255  掩码:255.255.248.0
xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x40))  h
[sudo] xqzhang 的密码:
/dev/mem opened.
Memory mapped at address 0x7fabbb3000.
Value at address 0x2820C040 (0x7fabbb3040): 0xD679
xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x44))  h                                                          
/dev/mem opened.
Memory mapped at address 0x7f974b8000.
Value at address 0x2820C044 (0x7f974b8044): 0x700
xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x46))  h                                                          
/dev/mem opened.
Memory mapped at address 0x7fa3e7c000.
Value at address 0x2820C046 (0x7fa3e7c046): 0x9A3E
写MAC寄存器

写0x48寄存器

xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x48))  h 0x0001
/dev/mem opened.
Memory mapped at address 0x7f9e52e000.
Value at address 0x2820C048 (0x7f9e52e048): 0xFFFF
Written 0x1; readback 0x1
xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x48))  h 
/dev/mem opened.
Memory mapped at address 0x7facc88000.
Value at address 0x2820C048 (0x7facc88048): 0x1

MAC环回配置

环回寄存器在MAC控制寄存器0第12bit.

环回寄存器

读mac控制寄存器

xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x0))  w
[sudo] xqzhang 的密码:
/dev/mem opened.
Memory mapped at address 0x7f855a9000.
Value at address 0x2820C000 (0x7f855a9000): 0x614C8C
xqzhang@greatwall:~$ 0000 0000 1010 0001 0100 1100 1000 1100

配置bit12为1

xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x0))  w 0x615c8c
/dev/mem opened.
Memory mapped at address 0x7f9b982000.
Value at address 0x2820C000 (0x7f9b982000): 0x614C8C
Written 0x615C8C; readback 0x615C8C

arp配置不存在的ip MAC地址为本机MAC,注意该mac地址必须与mac芯片的mac一致

sudo arp -s 172.25.82.241 00:07:3e:9a:79:d6

抓包并用ping验证

验证结果

PHY芯片

CPU读写phy方法(待更新)

mdio读写phy寄存器

phytoolhttps://github.com/wkz/phytool.git 该方式需要网卡驱动提供支持

phytool read  IFACE/ADDR/REG
phytool write IFACE/ADDR/REG <0-0xffff>
phytool print IFACE/ADDR[/REG]

Clause 22:

ADDR := <0-0x1f>
REG  := <0-0x1f>

Clause 45 (not supported by all MDIO drivers):

ADDR := PORT:DEV
PORT := <0-0x1f>
DEV  := <0-0x1f>
REG  := <0-0xffff>

其中ADDR的获取方式可参考获取GMAC网卡信息章节,或者使用如下命令获取ethtool enaftgm1i0 | grep PHYAD

xqzhang@greatwall:/sys/devices/platform/FTGM0001:00$ ethtool  enaftgm1i0  | grep PHYAD
        PHYAD: 4
读phy设备基础信息
xqzhang@greatwall:~/phytool$ sudo ./phytool enaftgm1i0/00:04/
ieee-phy: id:0x004dd072

   ieee-phy: reg:BMCR(0x00) val:0x1000
      flags:          -reset -loopback +aneg-enable -power-down -isolate -aneg-restart -collision-test
      speed:          10-half

   ieee-phy: reg:BMSR(0x01) val:0x796d
      capabilities:   -100-b4 +100-f +100-h +10-f +10-h -100-t2-f -100-t2-h
      flags:          +ext-status +aneg-complete -remote-fault +aneg-capable +link -jabber +ext-register

xqzhang@greatwall:~/phytool$ sudo ./phytool enaftgm1i0/0x4/
ieee-phy: id:0x004dd072

   ieee-phy: reg:BMCR(0x00) val:0x1000
      flags:          -reset -loopback +aneg-enable -power-down -isolate -aneg-restart -collision-test
      speed:          10-half

   ieee-phy: reg:BMSR(0x01) val:0x796d
      capabilities:   -100-b4 +100-f +100-h +10-f +10-h -100-t2-f -100-t2-h
      flags:          +ext-status +aneg-complete -remote-fault +aneg-capable +link -jabber +ext-register

ar8035_ds_(atheros)_mar2011.pdf  phy id reg

读PHY设备寄存器
xqzhang@greatwall:~/phytool$ sudo ./phytool read enaftgm1i0/0x04/0x02
ieee-phy: reg:0x02 val:0x004d
xqzhang@greatwall:~/phytool$ sudo ./phytool read enaftgm1i0/0x4/0x03
ieee-phy: reg:0x03 val:0xd072
写PHY设备寄存器
root@greatwall:/home/xqzhang/phytool# sudo ./phytool write  enaftgm1i0/0x04/0x04 0x1de1                                
root@greatwall:/home/xqzhang/phytool# sudo ./phytool read enaftgm1i0/0x04/0x04
ieee-phy: reg:0x04 val:0x1de1

Atheros 8035 强制千兆百兆十兆配置方式

phy控制寄存器1

phy控制寄存器2

首先需要bit12=0关闭自协商,然后根据bit6 bit13强制配置速率。
千兆配置sudo ./phytool write enaftgm1i0/0x4/0x0 0x0140
百兆配置sudo ./phytool write enaftgm1i0/0x4/0x0 0x2100
十兆配置sudo ./phytool write enaftgm1i0/0x4/0x0 0x0100
实际测试 强制千兆无法up,百兆千兆需要等很久才能ping通。

PHY环回配置

环回寄存器在phy控制寄存器0第14bit.

环回寄存器

10M 速率环回

sudo ./phytool write enaftgm1i0/0x4/0x0 0x4100

经测试在本节环境下,只有10M 环回才能正常UP

GMAC网卡驱动分析

查看Kconfig文件,发现该驱动支持Platform和多种SOC以及PCI等方式。

kylin@kylin-GW-001M1A-FTF:~/Workspace/xqzhang/ShangHai-GFSY-klinux/drivers/net/ethernet/stmicro/stmmac$ grep -nr support Kconfig 
21:     tristate "STMMAC Platform bus support"
26:       This selects the platform specific bus support for the stmmac driver.
45:     tristate "QCA IPQ806x DWMAC support"
52:       This selects the IPQ806x SoC glue layer support for the stmmac
58:     tristate "NXP LPC18xx/43xx DWMAC support"
66:     tristate "Amlogic Meson dwmac support"
72:       This selects the Amlogic Meson SoC glue layer support for
77:     tristate "Rockchip dwmac support"
84:       This selects the Rockchip RK3288 SoC glue layer support for
88:     tristate "SOCFPGA dwmac support"
95:       This selects the Altera SOCFPGA SoC glue layer support
100:    tristate "STi GMAC support"
107:      This selects STi SoC glue layer support for the stmmac
112:    tristate "Allwinner GMAC support"
118:      This selects Allwinner SoC glue layer support for the
124:    tristate "STMMAC PCI bus support"
130:      This PCI support is tested on XLINX XC2V3000 FF1152AMT0221

lsmod查看当前设备所加载的驱动模块

xqzhang@greatwall:~$ lsmod | grep stmmac
stmmac_platform         9705  1 dwmac_generic
stmmac                 72158  3 dwmac_generic,stmmac_platform

其中dwmac_generic属于驱动匹配入口,支持设备树、ACPI、Platform等匹配方式。
stmmac_platform则是提供设备树、ACPI、Platform等资源信息的获取方式,并提供了PM电源管理的ops。
stmmac为网卡驱动本体,负责probe配置、网卡open等。

stmmac_dvr_probe

在GMAC驱动probe过程中会先读取0x1058硬件功能寄存器,并将其复制给dma_cap,若mac芯片不支持PCS(TBI / SGMII / RTBI PHY 接口))则会遍历phy设备找到对应的phy id然后注册mdio bus.
当CONFIG_DEBUG_FS宏打开时,可通过cat /sys/kernel/debug/stmmaceth/eth0/dma_cap查看硬件功能寄存器中的内容。

stmmac_open

在GMAC的open函数中,如果不支持PCS(TBI / SGMII / RTBI PHY 接口)则先进行phy芯片的初始化工作,在phy初始化的过程中(stmmac_init_phy)如果设备树有定义phy_node(phy_node是通过device tree中的phy_handle构造的)则进行of_phy_connect连接,否则进行phy_connect连接。of_phy_connect和phy_connect差异在于前者已经找到的phy_device,后者需要先通过mdio bus找到phy_device。连接phy的实现主要在phy_connect_direct函数中,该函数共做了以下几步:

  1. phy_attach_direct(attach a network device to a given PHY device pointer)
  2. 赋值adjust_link = stmmac_adjust_link,该函数负责监控phy链路状态
  3. phy_start_machine启动PHY状态机跟踪
  4. 如果是中断模式,则启用中断
    连接过程重点在phy_attach_direct函数中,其会先判断是否匹配到具体的phy driver,若phy driver不存在则会调用通用genphy_driver进行probe和bind操作。之后会调用phy_init_hw进行phy config配置,配置完成后执行phy_resume启用phy设备。phy_init_hw函数中将对phy设备做soft_reset、fixup、config_init等操作,这些操作涉及一系列的phy寄存器操作。在stmmac_init_phy函数的最后会根据接口模式MII或RMII(GMII)设置不同的advertising带宽属性。

无论是否支持PCS,open函数中都要做的是alloc tx rx desc环形缓冲区、配置MAC芯片寄存器stmmac_hw_setup、创建1个stmmac_tx_timer定时器(用于定时清理环形缓冲区)、phy_start启动phy设备、request_irq注册相关中断。

stmmac_hw_setup函数中stmmac_init_dma_engine初始化dma引擎、set_umac_addr配置MAC addr、bus_setup总线配置(可选)、core_init MAC core的初始化、rx_ipc RX IPC Checksum offload启用、stmmac_set_mac启用MAC收发队列、stmmac_dma_operation_mode设置DMA模式、stmmac_mmc_setup设置mac管理计数器、stmmac_init_ptp初始化PTP硬件时钟驱动、start_tx start_rx 启用dma收发队列、rx_watchdog、ctrl_ane。

根据上述分析,在GMAC probe流程中主要对硬件功能寄存器进行读取,驱动根据具体的功能支持情况进行配置。GMAC open流程中phy_init_hw函数中包含了大量phy寄存器的配置,stmmac_hw_setup函数中包含了大量mac寄存器的配置。

stmmac_hw_setup配置解读

初始化DMA引擎

  • 读 总线模式寄存器 0x1000
  • 设置0x1000_bit0=1,复位MAC DMA控制器
  • 当0x1000_bit0 == 0时,复位完成
  • 配置0x1000_bit24 8xPBL , 0x1000_bit22-17 RPBL , 0x1000_bit8 PBL
  • 配置固定突发FB、混合突发MB、配置ATDS(告知dma描述符表为32字节还是16字节)
  • 配置AXI 总线模式寄存器 0x1028
  • 状态寄存器中断使能0x101c
    中断状态包含以下模式:
 /* DMA Normal interrupt */                                                       
 #define DMA_INTR_ENA_NIE        0x00010000      /* Normal Summary */             
 #define DMA_INTR_ENA_AIE        0x00008000      /* Abnormal Summary */           
 #define DMA_INTR_ENA_ERE        0x00004000      /* Early Receive */              
 #define DMA_INTR_ENA_FBE        0x00002000      /* Fatal Bus Error */            
 #define DMA_INTR_ENA_ETE        0x00000400      /* Early Transmit */             
 #define DMA_INTR_ENA_RWE        0x00000200      /* Receive Watchdog */           
 #define DMA_INTR_ENA_RSE        0x00000100      /* Receive Stopped */            
 #define DMA_INTR_ENA_RUE        0x00000080      /* Receive Buffer Unavailable */ 
 #define DMA_INTR_ENA_RIE        0x00000040      /* Receive Interrupt */          
 #define DMA_INTR_ENA_UNE        0x00000020      /* Tx Underflow */               
 #define DMA_INTR_ENA_OVE        0x00000010      /* Receive Overflow */           
 #define DMA_INTR_ENA_TJE        0x00000008      /* Transmit Jabber */            
 #define DMA_INTR_ENA_TUE        0x00000004      /* Transmit Buffer Unavail */    
 #define DMA_INTR_ENA_TSE        0x00000002      /* Transmit Stopped */           
 #define DMA_INTR_ENA_TIE        0x00000001      /* Transmit Interrupt */         
  • 配置0x1010发送描述符列表地址寄存器,0x100c接收描述符列表地址寄存器

PHY驱动分析

ar8035_probe

该函数仅从固件获取资源并做基本初始化工作,仅针对ft2000a4关闭了hibernate NLP脉冲电缆检测功能。

phy_init_hw配置解读

phy_init_hw函数中主要做了3步

  1. soft_reset,如果匹配到了phy driver则调用特定的soft_reset否则调用genphy_soft_reset做通用处理。
  2. scan_fixups,扫描并调用phy修复函数,该函数需要mac驱动主动注册相关服务后生效,该功能使用的频率很少,现有内核中仅有两个以太网驱动使用。
  3. config_init,以ar8035_config_init为例,该函数首先调用genphy_config_init,然后根据是否是GPIO地址模式以及PHY INTERFACE模式去配置不同的rx 、tx delay。
  • genphy_config_init中为读取两个base寄存器,分别是0x01基本模式状态寄存器、0x0f扩展状态寄存器,用于判断PHY设备的速率支持情况(advertising、advertising)
  • 在GPIO地址模式下,先关闭rx delay,再配置gtx clk为2.4ns,并使能tx delay。
  • 在非GPIO地址模式下,如果phy interface为 rgmii txid则,直接使能tx delay。

附:根据phy.h可知phy interface mode 有以下几种:

        case PHY_INTERFACE_MODE_NA:
                return "";
        case PHY_INTERFACE_MODE_MII:
                return "mii";
        case PHY_INTERFACE_MODE_GMII:
                return "gmii";
        case PHY_INTERFACE_MODE_SGMII:
                return "sgmii";
        case PHY_INTERFACE_MODE_TBI:
                return "tbi";
        case PHY_INTERFACE_MODE_REVMII:
                return "rev-mii";
        case PHY_INTERFACE_MODE_RMII:
                return "rmii";
        case PHY_INTERFACE_MODE_RGMII:
                return "rgmii";
        case PHY_INTERFACE_MODE_RGMII_ID:
                return "rgmii-id";
        case PHY_INTERFACE_MODE_RGMII_RXID:
                return "rgmii-rxid";
        case PHY_INTERFACE_MODE_RGMII_TXID:
                return "rgmii-txid";
        case PHY_INTERFACE_MODE_RTBI:
                return "rtbi";
        case PHY_INTERFACE_MODE_SMII:
                return "smii";
        case PHY_INTERFACE_MODE_XGMII:
                return "xgmii";
        case PHY_INTERFACE_MODE_MOCA:
                return "moca";
        case PHY_INTERFACE_MODE_QSGMII:
                return "qsgmii";
        default:
                return "unknown";

针对RGMII类型的接口,如果phy interface为PHY_INTERFACE_MODE_RGMII,则应该由MAC提供tx rx delay,PHY不需要提供,反之如果phy interface不是PHY_INTERFACE_MODE_RGMII,则应该禁用MAC时延,相关时延由PHY提供。

PHY标准寄存器解读

phy标准寄存器解读

ETHX日志级别设置

日志级别信息

 enum {                                                                           
         NETIF_MSG_DRV           = 0x0001,                                        
         NETIF_MSG_PROBE         = 0x0002,                                        
         NETIF_MSG_LINK          = 0x0004,                                        
         NETIF_MSG_TIMER         = 0x0008,                                        
         NETIF_MSG_IFDOWN        = 0x0010,                                        
         NETIF_MSG_IFUP          = 0x0020,                                        
         NETIF_MSG_RX_ERR        = 0x0040,                                        
         NETIF_MSG_TX_ERR        = 0x0080,                                        
         NETIF_MSG_TX_QUEUED     = 0x0100,                                        
         NETIF_MSG_INTR          = 0x0200,                                        
         NETIF_MSG_TX_DONE       = 0x0400,                                        
         NETIF_MSG_RX_STATUS     = 0x0800,                                        
         NETIF_MSG_PKTDATA       = 0x1000,                                        
         NETIF_MSG_HW            = 0x2000,                                        
         NETIF_MSG_WOL           = 0x4000,                                        
 };                                    
 默认的消息级别: 0x0063
 static const u32 default_msg_level = (NETIF_MSG_DRV | NETIF_MSG_PROBE |          
                                       NETIF_MSG_LINK | NETIF_MSG_IFUP |          
                                       NETIF_MSG_IFDOWN | NETIF_MSG_TIMER);       

打印rx ring desc
sudo ethtool -s enaftgm1i0 msglvl   0x0800
关闭日志打印
sudo ethtool -s enaftgm1i0 msglvl   0x0000
恢复默认的日志级别
sudo ethtool -s enaftgm1i0 msglvl   0x0063

该日志信息可通过dmesg -w查看。

收发队列描述符查看

通过cat /sys/kernel/debug/stmmaceth/eth0/descriptors_status

以太网层图例

以太网图例

简单图解OSI七层网络模型

体系结构

LINUX 内核官方文档

https://www.kernel.org/doc/html/latest/networking/phy.html
https://www.kernel.org/doc/html/latest/networking/sfp-phylink.html
https://www.kernel.org/doc/html/latest/networking/index.html

 

=========== 

SGMII

来源 https://zhuanlan.zhihu.com/p/393030791

什么是SGMII?

先说什么是GMII/MII。 MII是ethernet协议里面MAC层和PHY层之间的接口标准。MII是4bits的数据位宽,支持10/100M的数据传输。GMII前面G表示Gigabit,代表支持1000M的传输速率。需要说明的是MII是GMII的子集,也即是说支持GMII标准的设备,同时支持10/100/1000M三种模式。

SGMII前面的S代表Serial,即串行的意思。前面说了MII的数据位宽是4bits,GMII是8bits,SGMII则是1bit。

需要澄清的是SGMII是否只支持1G速率?答案是:错误!同时支持三种速率。具体速率是通过自协商来决定的,如果某个厂商的设备只做了1种速率支持,其实是实现了协议的一个子集,在某种场景下也是可以工作,而不是说协议只规定了一种速率模式。

为什么需要用SGMII?

SGMII协议是CISCO公司提出来的,可以减少芯片间互联的管脚。传统的GMII前面说了是8bits数据线,此外还需要时钟,和一些控制线,双向加起来要20根线左右。而SGMII接口是1根数据线加1根时钟线,双向共4根。如果去掉时钟线(采用CDR),那么2根线就可以实现互联了。

SGMII接口如何与PHY芯片互联?

 

SGMII的时序与电气特性也是有规定的,时序上采用类似DDR的接口,电平采用LVDS标准。

协议里规定了输出信号需要提供一个半速率、90度相移的时钟信号。同时也允许接收端采用CDR恢复时钟的方式。

 

既然已经串行化了是不是不用接PHY芯片了?答案是否定的。因为常用ethernet介质为双绞线。而802.3协议里的物理层定义的信号为PAM5。而PCS输出的信号为NRZ信号。当然如果用sgmii实现两个芯片的mac层短距互联也是可以的,这就超出了802.3协议的定义了。

SGMII如何实施?

SGMII本质上并没有对以太网协议的分层做改动,还是MAC层,PCS层和PMA层。原来GMII模式下,MAC层一般做在SOC侧,PHY层包括PCS+PMA做在另一个单独的芯片上。而SGMII的实施是将PCS层也同时放在了原来的MAC侧。这样SOC芯片和PHY芯片各有一个PCS层。

对于SOC发送来说,数据包有MAC层过来,经过tx 的pcs,从SGMII接口发送出去。在PHY芯片上,有一个rx的pcs先将SGMII的信号解出GMII信号,然后再经过传统的PHY层处理发送到介质上。对于SOC接收来说,则反过来。

SGMII如何自协商?

SGMII的自协商从功能角度来说采用1G以太(802.3z)的自协商功能。即pcs和phy之间传递参数。但发送的内容和802.3z协议里定义的参数格式不同。

从上表可以看到SGMII的自协商参数内容。流程上是PHY将配置发给PCS,PCS发送确认信息。值得注意的是此处的自协商是指802.3中第37章节里定义的PCS自协商,是不包括链路信息的。

以上信息解读来自于Serial-GMII Specification version 1.8。

 

============ End

 

标签:MAC,SGMII,PHY,介绍,stmmac,网卡,phy,寄存器,GMAC
From: https://www.cnblogs.com/lsgxeva/p/17773386.html

相关文章

  • 204 K8S API资源对象介绍03 (Job CronJob Endpoint ConfigMap Secret) 2.12-2.16
    一、API资源对象Job一次性运行后就退出的Pod1.1使用kubect生成YAML文件#kubectlcreatejobjob01--image=busybox--dry-run=client-oyaml>job01.yaml#vimjob01.yaml#catjob01.yamlapiVersion:batch/v1kind:Jobmetadata:creationTimestamp:nullnam......
  • PHPGGC的使用介绍和安装
    PHPGGC的使用介绍和安装PHPGGC:PHPGGC是一个unserialize()有效负载库,以及从命令行或编程方式生成它们的工具。当您在没有代码的网站上遇到反序列化时,或者只是在尝试构建漏洞时,此工具允许您生成有效负载,而无需经历查找小工具并组合它们的繁琐步骤。它可以被视为相当于frohoff的y......
  • PHPGGC的使用介绍和安装
    PHPGGC的使用介绍和安装PHPGGC:PHPGGC是一个unserialize()有效负载库,以及从命令行或编程方式生成它们的工具。当您在没有代码的网站上遇到反序列化时,或者只是在尝试构建漏洞时,此工具允许您生成有效负载,而无需经历查找小工具并组合它们的繁琐步骤。它可以被视为相当于frohoff的y......
  • JAVA IO 详细介绍
                  ......
  • AutoTools、Libtool介绍
    目录AutoTools1.简介2.configure.ac文件编写规则3.Makefile.am文件编写规则1.常用的变量4.案例1.示例1Libtool1.简介2.常用参数AutoTools1.简介Autotools是一个代码打包和发布工具,它包含很多工具,比如说:autoconf:一个工具,从configure.ac文件生成configure脚本automake:一个工......
  • 注册功能, 前端登录注册页面,前端登录功能,前端注册功能, redis介绍和安装
    1注册功能......
  • 关于一款软硬一体的RTSP/Onvif协议视频平台EasyNVR安防视频监控平台的介绍
    EasyNVR是一种网络视频录像机(NetworkVideoRecorder),属于软硬一体的产品,支持RTSP/ONVIF协议接入,体积小巧,通电连网即可成功运行,部署操作简单,低功耗,支持7x24小时不间断运行,省去自建视频服务器的高额费用,专属视频服务,免除了与其他硬件的相互影响,可云端运维。作为一种专业的视频监......
  • 零基础快速上手HarmonyOS ArkTS开发1---运行Hello World、ArkTS开发语言介绍
    概述:在华为开发者大会2023年8月4日(HDC.Together)大会上,HarmonyOS 4正式发布,其实在2021年那会学习了一点鸿蒙的开发:不过因为现在的鸿蒙手机完全兼容Android应用,所以学习动力也不是很足,一直就搁置了,直到今年华为官方出了这么一则消息才让我对于学习它有一种紧迫感了,如下:所以......
  • 计算机中的文本、图片、音频的存储规则介绍
    计算机中的文本、图片、音频的存储规则介绍从一个大的角度来说,计算机中存储的就只有文本和图片还有音频(视频就是图片和音频的集合体),本文旨在对这三种的存储规则做些介绍。在计算机中,任意数据都是以二进制的形式来存储的‍计算机中的文本是怎么进行存储的:什么是二进制?为什么用......
  • 计算机中的文本、图片、音频的存储规则介绍
    计算机中的文本、图片、音频的存储规则介绍从一个大的角度来说,计算机中存储的就只有文本和图片还有音频(视频就是图片和音频的集合体),本文旨在对这三种的存储规则做些介绍。在计算机中,任意数据都是以二进制的形式来存储的‍计算机中的文本是怎么进行存储的:什么是二进制?为什么用......