Edit online

功能描述

19 Nov 2024
Read time: 13 minute(s)

RMII 接口时钟选择

RMII 支持内部参考时钟和外部参考时钟:

  • 支持内部参考时钟,即 MAC 提供 50 MHz 时钟源至外部 PHY:
    • MAC 内部选通 PLL_EMAC_50M 作为 RMII 50 MHz 参考时钟源,通过 SYSCFG 的寄存器配置。

    • RMII_TX_CK 输出时钟,提供给外部 PHY 使用。

  • 支持外部参考时钟,即 MAC 接收 PHY 提供的 RMII 50 MHz 参考时钟源:
    • REF_CLK 时钟使能,并且选通作为 RMII 50 MHz 参考时钟源,通过 SYSCFG 的寄存器配置。

    • RMII_TX_CK 不使能,无需提供时钟信号。

MDIO

通过 Management Data In/Out (MDIO) 接口,GMAC 可以对 PHY 的寄存器进行读写操作,进而控制 PHY 的工作模式以及获取 PHY 的工作状态。操作寄存器 MDIO_CTL 和 MDIO_DAT 可实现操作 MDIO 接口。

MDIO 接口由 MDC 以及 MDIO 实现:
  • MDC:时钟输出信号,提供给 PHY。根据 AHB 总线的时钟来配置时钟分频系数获得,具体配置见寄存器 0x090 MDIO_CTL 描述。

  • MDIO:数据输入输出信号。

    MDIO 的帧的格式:Idle + Preamble + Start + Opcode + Phy Addr + Reg Addr + TA + Data。

    MDIO 帧域 描述
    IDLE IDLE 域
    PREAMBLE 32 个连续的 bit 1
    START 标志帧的起始位置,2'b10
    OPCODE 操作标识域,2'b10 表示读,2'b01 表示写
    PHY ADDR 5-bit 的 PHY 地址域
    REG ADDR PHY 寄存器地址
    TA Turnaround 域,读操作为 2'bZ0,写操作为 2'b10
    DATA 16 bit 数据,读操作 MAC 为接收数据,写操作 MAC 为发送数据。

MAC 发送功能

  1. SA 源地址自动插入或替换功能
    • 配置0x01C MAC_TX_FUNC 寄存器[14:12],MAC TX 支持自动插入或替换发送帧的源地址,源地址可通过寄存器 MAC_ADDR0 或 MAC_ADDR1 配置。

  2. TX Jabber Timer:MAC TX 支持 Jabber Timer,用于检测发送的帧长度。
    • 若关闭 Jabber Timer,发送帧的长度可以达到 16383 bytes。

    • 若未关闭 Jabber Timer 功能,最多只能发送 2048 bytes。使能 Frame 后,最大发送的长度为 10240 bytes),并且会在 TDES0 的 BIT14 置 1,指示发送的数据过长,发生 Jabber Timeout。

  3. CRC 插入/替换

    • 配置 TX DMA 描述符 TDES0 [27],可以对发送帧进行 CRC 的插入。

    • 配置 TX DMA 描述符 TDES0 [24],可以对发送帧进行 CRC 的替换。此时需要设置 TDES0[27] = 1,关闭 CRC 的插入功能。

  4. 自动补 0

    • 配置 TX DMA 描述符 TDES0 [27],可以对长度低于 64 bytes 的发送帧进行自动补 0,并且此时会强制产生 4 bytes 的 CRC,即 short frame + 0 pad + CRC = 64 bytes。

    • 若不需要进行自动补 0,可以设置 TDES0[27] = 1。

  5. TX IP 校验和插入:MAC 支持对发送帧的 IP 校验和进行计算和插入。
    1. 配置 MAC_CFG[7] = 1,打开 IP Offload 功能。

    2. 通过 TDES0[23:22] 选择 IP 检验和的计算类型。MAC 支持 IP header 校验和、IP Payload 校验和以及伪 header 校验的硬件加速计算。

    3. 打开 IP Offload 功能后,TDES0[16] 可以指示发送帧的 IP 校验和是否正确,置 1 表示发送帧存在 IP 校验和错误。

MAC 接收功能

  1. 地址过滤。对于接收帧,MAC 可以进行地址过滤,包括:
    • 单播地址过滤

      • 源地址过滤

      • 反向源地址过滤

      • 目的地址过滤

      • 反向目的地址过滤

    • 广播地址过滤

    • 多播帧过滤

    • 控制帧过滤

    RDES0[30]、[13] 分别指示接收帧的目的地址、源地址过滤是否成功。

  2. RX Watchdog:MAC RX 支持 RX Watchdog,用于检测接收的帧长度

    • 若关闭 RX Watchdog,发送帧的长度可以达到 16383 bytes

    • 若未关闭 RX Watchdog,最多只能接收 2048 bytes。使能 Jumbo Frame 后,最大接收的长度为 10240 bytes,并且会在 RDES0 [4] 置 1,指示接收的数据过长,发生 Watchdog Timeout。

  3. CRC/ PAD 剥离:MAC 支持对接收帧进行 CRC/ PAD 剥离。

    • 配置 EN_STRIP_FCS = 1,可以对长度 ≥ 1536 bytes 的接收帧进行 CRC 剥离。

    • 配置 EN_STRIP_NML = 1,可以对长度 < 1536 bytes 的接收帧进行 CRC 以及 PAD 剥离。

  4. RX IP 校验和计算:MAC 支持对接收帧的 IP 校验和进行计算。
    • 配置 MAC_CFG[7] = 1,打开 IP Offload 功能。此时需要设置 ALT_DES_SIZ = 0x1,激活 RDES4 的状态,软件通过 RDES4 可以获取接收帧 IP 检验和的校验结果,从而得知接收的 IP 帧的校验和结果。

流控

流控功能可通过寄存器 0x034 FLOW_CTL 控制,包括:

  1. TX 流控

    • 在全双工模式下,支持 Pause 帧的发送。

    • 在半双工模式下,支持背压操作。

  2. RX 流控

    • 支持 Pause 帧的解析,以及停止发送约定的 Pause 时间。

  3. 单播 Pause 帧

    • MAC 模块支持单播的 Pause 帧。

DMA 结构

GMAC 内部具有 DMA,用于将发送 BUFFER(DRAM 地址)的数据传送到 TXFIFO, RXFIFO 接收到的数据传送到接收 BUFFER(DRAM 地址)。DMA 可以支持两种结构,分别是环型结构和链型结构。
  • 环型结构 (Ring) 的描述符,可以通过 DES_SKIP_LEN 来配置设定两两描述符之间的跳跃长度。

    通过描述符的 START_DES 和 END_DES 来决定环形结构的第一个描述符和最后一个描述符,从而形成环路。



  • 链型结构 (Chain) 的描述符,则通过描述符的 Next Descriptor Address 来进行指向连接。

    在最后一个描述符的 Next Descriptor Address 域上设置为第一个描述符地址,可以形成环路。



DMA 发送描述符

发送描述符 TDES4~7 的应用,需要设置寄存器 0x004 DMA0_CONF 的 ALT_DES_SIZ = 1。其中,TDES4~5 Reserved,TDES6~7 时钟戳信息。
1. 发送描述符 TDES0
Bit 域描述
31 TX_PRC,Transmit in Process,发送进行中。
  • 0x0:DMA 空闲,DMA 完成当前的描述符的数据发送。
  • 0x1:DMA 发送进行中。
30 EN_TX_COMP_INT,Enable Transmit Complete Interrupt,使能发送完成中断,此位只有在 BIT29 有效时才有效。
  • 0x0:未使能。
  • 0x1:使能,此位只有在 BIT29 有效
29 END_DES,End Descriptor,最后一个描述符。
  • 0x0:无效。
  • 0x1:有效,表示此描述符为最后一个描述符
28 START_DES,Start Descriptor,第一个描述符。
  • 0x0:无效。
  • 0x1:有效,表示此描述符为第一个描述符
27 DIS_CRC,Disable CRC,禁止 CRC 功能时生效,只需在第一个描述符设置此位即可。
  • 0x0:无效。
  • 0x1:有效,禁止 CRC
26 DIS_PAD,Disable Padding,禁止补 0 功能时生效,只需在第一个描述符设置此位即可。
  • 0x0:无效。
  • 0x1:有效,禁止对帧长低于 64 bytes 进行补 0
25 EN_TX_TMSTMP,Enable Transmit Timestamp,使能发送添加时间戳功能,只需在第一个描述符设置此位即可。
  • 0x0:未使能
  • 0x1:使能
24 EN_CRC_REP,Enable CRC Replacement,使能 CRC 替代功能。

必须保证软件发送帧的内容包含了 CRC,使能 CRC 替代功能后,会进行 CRC 重新计算并替代。另外为了避免 CRC 重复,需要 DIS_CRC =1 禁止 CRC 插入。在第一个描述符设置此位即可。

  • 0x0:未使能
  • 0x1:使能
23:22 EN_CIC,Enable Checksum Insertion Control,使能校验和插入功能,只需在第一个描述符设置此位即可。
  • 0x0:禁止校验和插入。
  • 0x1:开启 Header 校验和计算以及插入功能。
  • 0x2:开启 Header、Payload 校验和的计算及插入功能,未开启伪 Header 的校验和计算。
  • 0x3:开启 Header、Payload 校验和的计算及插入功能,并且开启伪 Header 的校验和计算。
21 TX_END_RNG,Transmit End of Ring,DMA 发送环的末端,表示此描述符为 DMA 发送环的最后一个描述符,结束后跳回起始描述符。
  • 0x0:无效
  • 0x1:生效
20 EN_DMA_CHN_MOD,Enable DMA Chain Mode,使能 Chain 模式。
  • 0x0:未使能,采用 DMA Ring 模式
  • 0x1:使能,采用 DMA Chain 模式
19:18 VLAN_TAG_CTL,VLAN Tag Control,VLAN 标签控制,只需在第一个描述符设置此位即可。
  • 0x0:无效操作。
  • 0x1:删除发送帧中的 VLAN 标签内容。
  • 0x2:插入 VLAN 标签,标签内容。
  • 0x3:替代 VLAN 标签。
17 TX_TMSTMP_STS,Transmit Timestamp Status,发送时间戳状态,此域只有在最后一个描述符有效。
  • 0x0:无操作
  • 0x1:完成发送时间戳的捕捉,时间戳写入在 TDES6 和 TDES7。
16 IP_HD_ERR,IP Header Error

此位置 1 表示 MAC 检测发送的 IP 报文的 Header 存在错误,此域只有在最后一个描述符有效。

15 TXERR_STS,Transmit Error Status,发送错误状态指示位。
  • 0x0:无错误。
  • 0x1:出现错误,错误源可能由于 BIT16/14/13/12/11/10/9/8/2/1 相应的错误状态引起
14 JAB_TO_ERR,Jabber Timout Error,发送 Jabber 超时错误,此位只有在 Jabber 检测功能未禁止的情况下有效。
  • 0x0:无异常
  • 0x1:出现发送超时错误
13 TXFIFO_FLSH_ERR,TXFIFO Flush Error,清除错误,出现软件清除 TXFIFO 的帧数据的操作导致的错误。
  • 0x0:无异常
  • 0x1:出现错误状态
12 IP_PL_ERR,IP Payload Error,此位置 1 指示 MAC 检测到发送的 TCP、UDP、ICMP IP 数据包 payload 存在错误。
11 LOS_CR,Loss Carrier,此位置 1 指示在帧发送发生了载波丢失,此位只有在半双工模式下有效。
10 NO_CR,No Carrier,此位置 1 指示在发送的过程中,PHY 的载波侦听 CS 信号并没有生效,即没有检测到载波。
9 LT_COL,Late Collision,此位置 1 指示由于碰撞导致发送终止,此碰撞发生在碰撞窗口之后。此位在 TXFIFO_UF_ERR = 1 时无效。
8 EXS_COL,Excessive Collision,此位置 1 指示当前帧尝试发送的过程中,由于连续的 16 次碰撞的产生终止发送帧。如果取消重传(DIS_RETRY = 1),只要出现 1 次的碰撞,此位则立即置 1。
7 VLAN_STS,VLAN Status,VLAN 帧状态。
  • 0x0:发送帧为非 VLAN 帧
  • 0x1:发送帧为 VLAN 帧
6:3 COL_CNT,Collision Count,此域指示在发送前发生多少次碰撞。此域在 TDES0. Bit8 =1 的时候无效。
2 EX_DEF_ERR,Excessive Deferral Error,发送终止由于回退时间过长,此位只有在 EN_DEF_CHECK = 1 的情况下有效。
  • 0x0:未发生错误。
  • 0x1:出现回退过量错误
1 TXFIFO_UF_ERR,TXFIFO Underflow Error,TXFIFO 下溢出错误,DMA 从 Buffer 地址读取帧数据错误。
  • 0x0:未出现错误
  • 0x1:发生下溢出错误
0 DEF_STS,Defer Status,回退状态,在发送前检测到载波而引起的回退,此位只对于半双工模式有效。
  • 0x0:未出现回退
  • 0x1:发送时出现回退
2. 发送描述符 TDES1
Bit 域描述
31:29 TX_SA_CTL,Transmit Source Address Control,发送源地址控制。BIT31 = 1,表示采用 Address1 进行插入或替代。BIT31 = 0,表示采用 Address0 进行插入或替代。

Bit30:29

  • 0x0:无操作
  • 0x1:插入源地址
  • 0x2:替代源地址
  • 0x3:保留
28:16 TX_BUF2_SIZ,Transmit Buffer2 Size,发送缓存 2 的空间大小。
15:13 Reserved
12:0 TX_BUF1_SIZ,Transmit Buffer1 Size,接收缓存 1 的空间大小。
3. 发送描述符 TDES2
Bit 域描述
31:0 BUF1_ADDR,Buffer1 Address,Buffer1 地址指针,Buffer1 的物理地址。
4. 发送描述符 TDES3
Bit 域描述
31:0 BUF2_ADDR/NXT_DES_ADDR
  • DMA 采用 Ring 模式时,此域为 BUF2_ADDR

    BUF2_ADDR,Buffer2 Address,Buffer2 地址指针,Buffer2 的物理地址。

  • 采用 Chain 模式时,此域为 NXT_DES_ADDR。

    NXT_DES_ADDR,Next Descriptor Address,下一个描述符的地址,指向下一个描述符的物理地址,从而将描述符连接起来。

5. 发送描述符 TDES6
Bit 域描述
31:0 TX_STMP_LO,Transmit Timestamp Low 32bit,发送时间戳的低 32 位,此域由 DMA 自动填写,与 TDES7 的高 32bit 组成完整的时间戳。
6. 发送描述符 TDES7
Bit 域描述
31:0 TX_STMP_HI,Transmit Timestamp High 32bit,发送时间戳的高 32 位,此域由 DMA 自动填写,与 TDES6 的低 32bit 组成完整的时间戳。
注:

发送描述符 RDES4~7(RDES4 状态信息,RDES5 Reserved,RDES6~7 时钟戳信息)的应用,需要设置寄存器 DMA0/1_CONF 的 ALT_DES_SIZ = 1。

DMA 接收描述符

接收描述符 RDES4~7(RDES4 状态信息,RDES5 Reserved,RDES6~7 时钟戳信息)的应用,需要设置寄存器 DMA0/1_CONF 的 ALT_DES_SIZ = 1。

7. 接收描述符 RDES0
Bit 域描述
31 RX_PRC,Receive in Process,接收进行中。
  • 0x0:DMA 空闲,DMA 完成当前的描述符的数据接收
  • 0x1:DMA 接收进行中
30 DA_FLT,Destination Address Filter Fail,目的地址过滤失败。
  • 0x0:无效
  • 0x1:指示接收帧的目的地址过滤失败
29:16 RX_FRM_LEN,Receive Frame Length,接收到的帧的长度,此域在最后一个描述符有效,并且无异常发生。
15 RXERR_STS,Receive Error Status,接收错误状态指示位。
  • 0x0:无错误
  • 0x1:出现错误,错误源可能由于 RDES0 的 BIT14/11/7/6/4/3/1 或 RDES4 的[4:3] 相应的错误状态引起
14 RX_DES_ERR,Receive Descriptor Error,接收描述符错误,此域在最后一个描述符有效。
  • 0x0:无效
  • 0x1:由于描述符异常导致的接收中断
13 SA_FLT,Source Address Filter Fail,源地址过滤失败。
  • 0x0:无效
  • 0x1:指示接收帧的源地址过滤失败
12 RX_LEN_ERR,Receive Length Error,接收长度错误。
  • 0x0:无效
  • 0x1:指示接收长度错误,接收帧的实际长度与帧的长度域值不一致
11 RXFIFO_OF_ERR,RXFIFO Overflow Error,接收溢出错误。
  • 0x0:无效
  • 0x1:指示接收溢出错误,由于 RXFIFO 溢出,导致接收帧的损坏
10 VLAN_TAG,VLAN Tag,此位置 1 表示接收的帧位 VLAN 帧。
9 START_DES,Start Descriptor,第一个描述符。
  • 0x0:无效
  • 0x1:有效,表示此描述符为第一个描述符
8 END_DES,End Descriptor,最后一个描述符。
  • 0x0:无效
  • 0x1:有效,表示此描述符为最后一个描述符
7 TMSTMP_AVL/ IP_CHSM_ERR/ GNT_FRM
此位可指示三种状态:
  • TMSTMP_AVL,Timestamp Available,置 1 表示接收的帧已打时间戳,从 RDES6~7 可获得。
  • IP_CHSM_ERR,IP Checksum Error,置 1 表示 IP 校验和错误或表示接收帧位非 IPv4 帧。
  • GNT_FRM,Giant Frame,置 1 表示接收的帧位 Frame。
6 LT_COL_ERR,Late Collision Error,Late Collision 错误。
  • 0x0:无效
  • 0x1:接收发生 Collision 错误
5 RX_FRM_TYP,Receive Frame Type,接收帧的类型。
  • 0x0:接收帧为 IEEE 802.3 类型的帧
  • 0x1:接收帧为以太网类型的帧
4 RX_WD_TO_ERR,Receive Watchdog Timeout Error,接收看门狗的超时错误。
  • 0x0:无效
  • 0x1:发生接收看门狗的超时错误
3 RX_ERR,Receive Error,接收过程出现 ERR 信号。
  • 0x0:无效
  • 0x1:接收过程出现 ERR 信号
2 Reserved
1 RX_CRC_ER,RReceive CRC Error,接收 CRC 错误,此域只有在最后一个描述符有效。
  • 0x0:无效
  • 0x1:接收帧出现 CRC 错误
0 EXT_STS_AVA/ RX_MAC_ADDR
  • EXT_STS_AVA,Extend Status Available,当时钟戳或 IP 校验和 Offload 功能使能,此位置 1 表示 RDES4 生效。
  • RX_MAC_ADDR,Rx MAC Address,当时钟戳、IP 校验和 Offload 功能均未使能,此位置 1 表示接收帧的目的地址匹配 MAC Address1~7 之一。此位清 0 表示接收帧的目的地址匹配 Address0。
8. 接收描述符 RDES1
Bit 域描述
31 DIS_COMP_INT,Disable Complete Interrupt,禁止接收完成中断的产生。
  • 0x0:未禁止
  • 0x1:禁止
30:29 Reserved
28:16 RX_BUF2_SIZ,Receive Buffer2 Size,接收缓存 2 的空间大小。
15 RX_END_RNG,Receive End of Ring,指示在 DMA 的 Ring 模式下,此描述为最后的描述符,完成后跳转回起始描述符。
14 RX_DMA_MOD,Receive DMA Mode,接收 DMA 的模式。
  • 0x0:Ring 模式
  • 0x1:Chain 模式
13 Reserved
12:0 RX_BUF1_SIZ,Receive Buffer1 Size,接收缓存 1 的空间大小。
9. 接收描述符 RDES2
Bit 域描述
31:0 BUF1_ADDR,Buffer1 Address,Buffer1 地址指针,Buffer1 的物理地址。
10. 接收描述符 RDES3
Bit 域描述
31:0 BUF2_ADDR/NXT_DES_ADDR
  • DMA 采用 Ring 模式时,此域为 BUF2_ADDR

    BUF2_ADDR,Buffer2 Address,Buffer2 地址指针,Buffer2 的物理地址。

  • DMA 采用 Chain 模式时,此域为 NXT_DES_ADDR。NXT_DES_ADDR,

    Next Descriptor Address,下一个描述符的地址,指向下一个描述符的物理地址,从而将描述符连接起来。

11. 接收描述符 RDES4
Bit 域描述
31:21 Reserved
20:18 VLAN_TAG_PRI_V,VLAN Tag Priority Value,此域内容填入接收到的包的 TAG 用户值域。
17 AV_TAG_PKT_RCD,AV Tagged Packet Received,此位置 1 表示接收到带 AV 标签的数据包。
16 AV_PKT_RCD,AV Packet Received,此位置 1 表示接收到 AV 包。
15 Reserved
14 TMSTMP_DRP,Timestamp Dropped,时钟戳丢失,由于 RXFIFO 溢出,导致时钟戳丢失。
  • 0x0:无效
  • 0x1:时钟戳丢失
13 PTP_VER,PTP Version,PTP 版本。
  • 0x0:IEEE1588
  • 0x1:IEEE1588V2
12 RX_PTP_FRM,Received PTP Frame Type,接收到 PTP 帧的类型。
  • 0x0:接收到 PTP 报文通过 UDP-IPV4 或 IPV6 的形式传送
  • 0x1:接收到 PTP 报文直接通过以太网帧形式传送
11:8 PTP_RX_MSG_TYP,Received PTP Message Type,接收到的 PTP 消息报文类型。
  • 0x0:无 PTP 报文
  • 0x1:SYNC 报文
  • 0x2:Follow Up 报文
  • 0x3:Delay_Req 报文
  • 0x4:Delay_Resp 报文
  • 0x5:Pdelay_Req 报文
  • 0x6:Pdelay_Resp 报文
  • 0x7:Pdelay_Resp_Follow_Up 报文
  • 0x8:Announce 报文
  • 0x9:Management 报文
  • 0xA:Signaling 报文
  • 0xB~0xE:Reserved
  • 0xF:PTP Packet with Reserved message type
7 RX_IPV6_PKT,Received IPV6 Packet,接收到 IPV6 包。
  • 0x0:无效
  • 0x1:接收到的 IP 包为 IPV6 包
6 RX_IPV4_PKT,Received IPV4 Packet,接收到 IPV4 包。
  • 0x0:无效
  • 0x1:接收到的 IP 包为 IPV4 包
5 DIS_IP_CHSUM,Disable IP Checksum Function,关闭 IP 校验和功能。
  • 0x0:未关闭
  • 0x1:关闭 IP 校验和功能
4 IP_PL_ERR,IP Payload Error,IP 包校验错误,接收到的 IP 包的 TCP/UDP/ICMP 的校验和错误,或长度错误。
  • 0x0:无错误
  • 0x1:出现 IP 包校验和错误
3 IP_HD_ERR,IP Header Error,接收到的 IP 包的首部校验和与计算的校验和不一致,或者 IP 版本与 Ethernet Type 域值不一致。
  • 0x0:无错误
  • 0x1:出现首部校验和错误
2:0 IP_PKT_TYP,IP Packet Type,IP 包类型,此域只有在 BIT6/7 生效时才有效。
  • 0x0:未知类型
  • 0x1:UDP 包
  • 0x2:TCP 包
  • 0x3:ICMP 包
  • others:Reserved
12. 接收描述符 RDES6
Bit 域描述
31:0 RX_STMP_LO,Receive Timestamp Low 32bit,接收时间戳的低 32 位,此域由 DMA 自动填写,与 TDES7 的高 32bit 组成完整的时间戳。
13. 接收描述符 RDES7
Bit 域描述
31:0 RX_STMP_HI,Receive Timestamp High 32bit,发送时间戳的高 32 位,此域由 DMA 自动填写,与 TDES7 的低 32bit 组成完整的时间戳。