.. _ip_hs_intf_eth: 以太网 (GMAC) ======================= 以太网简介 ------------- 借助以太网外设,器件可以通过以太网按照 IEEE 802.3-2002 标准发送和接收数据。 以太网提供了可配置、灵活的外设,用以满足客户的各种应用需求。它支持与外部物理层 (PHY) 相连的两个工业标准接口:默认情况下使用的介质独立接口 (MII)(在 IEEE 802.3 规 范中定义)和简化介质独立接口 (RMII)。它有多种应用领域,例如交换机和网络接口卡。 除了 IEEE 802.3 规范中定义的默认接口外,以太网外设还支持多个与 PHY 相连的工业标准 接口。它符合以下标准: * IEEE 802.3-2008,用于以太网 MAC 和介质独立接口 (MII) * IEEE 1588-2008,用于精密网络时钟同步协议 (PTP) * IEEE 802.1AS-2011 和 802.1-Qav-2009,用于音频视频 (AV) 通信 * IEEE 802.3az-2010,用于节能型以太网 (EEE) * RMII 联盟的 RMII 规范第 1.2 版 GMAC 简介 ------------------------ GMAC 是一款高性能 1000M/100M/10M 以太网控制器。它支持 GMII/RGMII/MII/RMII MAC-PHY 接口,以及支持 AXI 和 AHB 的系统总线。 GMAC 内核特性 --------------------- GMAC 的主要特性如下: * 支持 10/100/1000M 全双工和 10/100M 半双工。客户在配置 IP 时可选择仅支持 10/100M。 * 支持 GMII/RGMII/MII/RMII 接口。 * 支持 AXI/AHB 系统接口。客户在配置 IP 时可选择 AXI 或 AHB 接口。 * 符合 IEEE 802.3-2008 标准和 IEEE 802.3az 标准。 * 支持配置接收和发送 SRAM 总大小,可选值为 8KB、12KB、16KB 和 24KB。客户在配置 IP 时可选择大小。 * 最多 32 个额外的 48 位 MAC 源地址过滤器,每个字节带有掩码。客户在配置 IP 时可选择 0 到 32 之间的数字。 * 最多 32 个额外的 48 位 MAC 目标地址过滤器,每个字节都带有掩码。客户可以在配置 IP 时选择0 到 32 之间的数字。 * 支持接收数据包和发送数据包的 MIB 统计信息。 * 非对称/对称流量控制。 * SVLAN 和 VLAN 检测。 * CVLAN 标签插入/移除。 * 魔术包检测。 * 多播帧、广播帧和单播地址过滤。 * 支持最大 4KB 的巨型数据包。 * 支持第 22 条和第 45 条 MDIO 操作。 * 接收路径支持 IPv4、IPv6、TCP、UDP、ICMP 校验和验证。 * 发送路径支持 IPv4、IPv6、TCP、UDP、ICMP 校验和卸载。 * 支持动态时钟门控以节省功耗。 * 支持 1588 PTP 协议。客户可以在配置 IP 时选择此功能。 * 支持 PPS_OUT 功能,可将本地 RTC 值输出至外部 PPS_OUT 引脚。 * 作为 1588 主站时,支持将本地 RTC 与外部 PPS_IN 引脚同步。客户可在配置 IP 时选择此功能。 GMAC 架构 ------------ .. figure:: /assets/images/eth_arch.png :alt: GMAC arch :height: 320px :align: center 图5.1 GMAC架构图 各模块功能如下: * CSR_REG 模块为内部配置寄存器,可通过外部 APB 总线进行读写。 * MAC 模块用于处理 802.3-2008 标准。 * SRAM 模块用于存储 RX 数据包和 TX 数据包。SRAM 模块可由客户端生成并实例化。SRAM 大小可配置为 8KB、12KB、16KB 和 24KB。考虑到 AXI/AHB 的非连续读写带宽,更大的 SRAM 大小将有利于 RX 和 TX XMII 性能。默认情况下,我们分配约 2/3 的 SRAM 作为 RX SRAM 来存储接收的数据包,并分配约 1/3 的 SRAM 作为 TX SRAM 来存储发送的数据包。Rx 和 Tx SRAM 的大小比例可以通过 SRAM_CTRL_REG_X 寄存器进行调整。如果您确实希望根据应用调整比例,请联系 nucleisys 的 AE。 * DMA 模块使用描述环结构将接收的数据包 DMAW 到主机内存中,并将发送的数据包 DMAR 出主机内存。 功能描述 ----------- MAC 源地址过滤 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ * IEEE802.3 协议中,MAC 源地址匹配过滤功能并不强制要求,但某些应用需要 MAC 进行 MAC 源地址过滤。 (注意:MAC 源地址可以是广播地址、多播地址或单播地址,这取决于 SA_FILTER 的配置,硬件对地址类型没有任何限制。) * GMAC 支持 MAC 源地址过滤,并提供两种模式(白名单和黑名单),以适应更多场景,需硬件配置支持。 白名单模式: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 将 SA_FILTER_WHITE_BLACK_SEL 控制位设置为 0,即可选择白名单模式。在此模式下,只有符合 SA 过滤器的地址才被允许上传到系统。对于每个过滤器,都有一个相应的 SA_FILTER_EN 启用位, 用于控制是否启用该过滤器。SA_FILTER_EN[0] 对应 SA_FILTER0,以此类推。如果 SA_FILTER_EN[N] 为 0, 则表示我们不会将 MAC SA 与相应的 SA_FILTERN 进行比较。对于每个过滤器, 都有一个 SA_MASK 控制位,SA_MASK[0] 对应字节 0,以此类推。当 MASK 位为 1 时,表示我们不会将相应的字节与过滤器的相应字节进行比较。 以下是一些示例: 接收数据包的 SA 为 00-11-22-33-44-55-66(00 是网络上出现的第一个字节,66 是网络上出现的最后一个字节),我们将该 SA 与所有已启用的过滤器进行比较。以下是比较流程: * 如果 SA_FILTER N 的使能位为 0,则视为比较失败,直接进入下一个 SA_FILTER N + 1 的比较。 * 如果 SA_FILTER N 的使能位为 1: - 将第一个字节 00 与 SA_FILTERN[47:40] 进行比较,如果 (00 == SA_FILTER[47:40]) 或 (SA_MASK[5] == 1),则字节 0 的比较结果为通过。 - 如果字节 0 的比较结果为失败,则中止下一个字节的比较,SA_FILTER N 比较失败,直接进入下一个 SA_FILTER N + 1 的比较。 - 如果字节 0 的比较结果为通过,则继续进行下一个字节的比较。 - 如果 SA_FILTER N 的比较结果为通过(所有 6 个字节的比较结果均为通过)。则中止以下 SA_FILTER 的比较,MAC 源地址合法,则允许数据包上传到系统。 * 如果 SA_FILTER N 的比较失败(任何字节的比较失败),则继续进行下一个 SA_FILTER N + 1 的比较,直到完成所有 SA_FILTER 的比较。如果所有 SA_FILTER 的比较都失败,则 MAC 源地址非法,数据包将被硬件自动丢弃。 黑名单模式: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 将 SA_FILTER_WHITE_BLACK_SEL 控制位设置为 1 以选择黑名单模式。在此模式下,只有符合 SA 过滤器的地址才会被视为非法 MAC 源地址,并禁止上传到系统。否则, 数据包将允许上传到系统。对于每个过滤器,都有一个相应的 SA_FILTER_EN 控制位来控制是否启用该过滤器。 SA_FILTER_EN[0] 控制 SA_FILTER0,以此类推。如果 SA_FILTER_EN[N] 为 0, 则表示我们不会将 MAC SA 与相应的 SA_FILTERN 进行比较。对于每个过滤器,都有一个 SA_MASK 控制位, SA_MASK[0] 控制 byte0,以此类推。当 MASK 位为 1 时,表示我们不会将相应的字节与过滤器的相应字节进行比较。 以下是一些示例: 接收数据包的 SA 为 00-11-22-33-44-55-66(00 是网络上出现的第一个字节,66 是网络上出现的最后一个字节), 我们将该 SA 与所有已启用的过滤器进行比较。 以下是比较流程: * 如果 SA_FILTER N 的使能位为 0,则视为比较失败,直接进入下一个 SA_FILTER N + 1 的比较。 * 如果 SA_FILTER N 的使能位为 1: - 将第一个字节 00 与 SA_FILTERN[47:40] 进行比较,如果 (00 == SA_FILTER[47:40]) 或 (SA_MASK[5] == 1),则字节 0 的比较结果为通过。 - 如果字节 0 的比较结果为失败,则中止下一个字节的比较,SA_FILTER N 比较失败,直接进入下一个 SA_FILTER N + 1 的比较。 - 如果字节 0 的比较结果为通过,则继续进行下一个字节的比较。 - 如果 SA_FILTER N 的比较通过(所有 6 个字节的比较都通过),则中止接下来的 SA_FILTER 比较,MAC 源地址非法,禁止数据包上传到系统。 - 如果 SA_FILTER N 的比较失败(任何字节的比较都失败),则继续进行下一个 SA_FILTER N + 1 的比较,直到完成所有 SA_FILTER 的比较。 - 如果所有 SA_FILTER 的比较都失败,则 MAC 源地址合法,数据包被允许上传到系统。 MAC 目标地址过滤 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GMAC 支持对传入数据包进行目标地址过滤。目标地址有三种类型: * 单播地址,由寄存器 STAD 定义,当目标地址与 STAD 匹配时,如果数据包没有错误,则允许数据包上传到系统。否则,如果目标地址是单播地址,但与 STAD 不匹配,则数据包将被丢弃。 *注意:* 目标地址域中出现的第一个字节对应STAD的最高字节,目标地址域中出现的最后一位字节对应STAD的最低字节。 * 广播地址,配置寄存器 BROAD_EN 用于定义 GMAC 是否接受广播地址(目标地址为 FF-FF-FF-FF-FF-FF)数据包。当该寄存器设置为1时,广播数据包在无错误的情况下可以上传到系统;当该寄存器设置为0时,数据包将被丢弃。 * 多播地址,当 MULTI_ALL 寄存器位设置为 1 时,允许所有多播地址(目标地址第一个字节的 LSB 位为 1)数据包在无错误的情况下上传到系统。如果驱动程序只想上传特定多播地址数据包(而非所有多播地址数据包),则应将 MULTI_ALL 设置为 0,并将 RX_HASH_EN 设置为 1。这样,只有命中多播哈希表 RX_HASH_TABLE 的多播数据包才能上传到系统。 计算 RX_HASH_TABLE 的算法如下: * 使用所需的多播目标地址(6 字节)计算 CRC32 值,CRC 校验码为 0x04C11DB7,初始值为 FFFF_FFFF。 – x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x^1 + 1 * 首先计算互联网上看到的第一个字节,直到遍历整个目标地址(6 个字节)。然后我们可以得到最终的 32 位 CRC 值。选择该值的 6 个最低有效位 (LSB),将其记为“X”,软件驱动程序应将 hash_table[X] 设置为 1'b1。 * 重复上述操作,使用下一个需要的多播地址计算哈希值,并设置相应的哈希表位。 例如,DA 为 “a3-0a-39-24-38-75”,计算出的 CRC32 应为 “E16DBA1D”,CRC32 的低六位为 6’b01_1101(6’d29),驱动程序应将 hash_table[29] 设置为 1’b1。当 MAC 接收到 DA 为 “a3-0a-39-24-38-75”的数据包时,它将使用相同的 CRC 算法计算 CRC32 值,并选择低六位(6’d29)。然后硬件 将检查 hash_table[29],如果值为 1,则表示哈希命中,数据包可以被接收;如果值为 0,则表示哈希未命中,应丢弃该数据包。软件可以使用这种方式为所有需要上传到系统的多播数据包设置 hash_table。对于哈希表,不可避免地会存在哈希冲突。例如,如果一个多播数据包的 DA 地址不是 “a3-0a-39-24-38-75”,但 CRC32 的低 6 位也为 6’d29,则该数据包也会被哈希命中并上传到系统。 .. note:: * 1:如果 PROM 位设置为 1,MAC 将不会进行地址过滤。如果 DEBUG_MODE 位设置为 1,MAC 将不会进行地址过滤,并且无论数据包是否有错误,它都会将数据包上传到系统。 * 2:DA 地址 01-80-c2-00-00-0e 用于 LLDP 或 PTP 协议,因此 GMAC 始终将此 DA 地址视为合法地址,因为我们支持 802.3AZ,它将使用 LLDP 进行信息交换。 * 3:DA 地址 01-1B-19-00-00-00 用于 PTP 协议,因此GMAC始终将此 DA 地址视为合法地址,因为我们支持 1588 PTP 协议。 MAC 附加目标地址过滤器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 除了默认 MAC 目标地址 (STAD) 外,GMAC 还支持附加 MAC 目标地址过滤器功能(需硬件配置支持)。(注意:MAC 地址可以是多播地址还是单播地址,取决于 DA_FILTER 的配置,硬件对地址类型没有任何限制。)每个过滤器都有一个相应的 DA_FILTER_EN 使能位来控制是否启用该过滤器, DA_FILTER_EN[0] 对应 DA_FILTER0,以此类推。如果 DA_FILTER_EN[N] 为 0,则表示不会将 MAC DA 与相应的 DA_FILTERN 进行比较。每个过滤器都有一个 DA_MASK 控制位,DA_MASK[0] 对应字节 0,以此类推。当 MASK 位为 1 时,表示不会将相应的字节与过滤器的相应字节进行比较。 以下是一些示例: 接收数据包的 DA 为 00-11-22-33-44-55-66(00 是网络上出现的第一个字节,66 是网络上出现的最后一个字节),我们将把该 DA 与所有已启用的过滤器进行比较。以下是比较流程。将 MAC DA 与 STAD 进行比较,如果匹配,则 MAC DA 合法,并中止接下来的 DA_FILTER 比较。 如果不匹配,则继续进行下一个 DA_FILTER 比较。 如果 DA_FILTER N 的使能位为 0,我们可以将其视为比较失败,直接进入下一个 DA_FILTER N+1 的比较。 如果 DA_FILTER N 的使能位为 1: * 将第一个字节 00 与 DA_FILTERN[47:40] 进行比较,如果 (00 ==DA_FILTER[47:40]) 或 (DA_MASK[5] == 1),则字节 0 的比较结果为通过。 * 如果字节 0 的比较结果为失败,则中止后续字节的比较,DA_FILTER N 比较失败,并直接进行下一个 DA_FILTER N + 1 的比较。 * 如果字节 0 的比较结果为通过,则继续进行下一个字节的比较。 如果 DA_FILTER N 的比较结果为通过(所有 6 个字节的比较均通过),则中止后续 DA_FILTER 的比较,MAC 目标地址合法,数据包可以上传到系统。如果 DA_FILTER N 的比较失败(任何字节的比较失败),则转到下一个 DA_FILTER N + 1 的比较,直到完成所有 DA_FILTER 的比较。 如果所有过滤器的比较都失败,则 MAC 目标地址非法,数据包应由硬件自动丢弃。 .. note:: * 1:DA 地址 01-80-c2-00-00-0e 用于 LLDP 或 PTP 协议,因此无论 DA_FILTER 的配置如何,GMAC 始终将此 DA 地址视为合法地址。 * 2:DA 地址 01-1B-19-00-00-00 用于 PTP 协议,因此无论 DA_FILTER 的配置如何,GMAC 始终将此 DA 地址视为合法地址。 支持 PHY-MAC 接口 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GMAC 支持 MAC 和 PHY 之间的 GMII、RGMII、MII 和 RMII 接口。MII_MODE、SPEED 位以及FULL_DUPLEX 位需要进行相应的配置。MAC 和 PHY 必须工作在相同的 MII_MODE、SPEED 和 FULL_DUPLEX 模式下。 * GMAC 支持 GMII 1000M 全双工模式和 RGMII 1000M 全双工模式。 * GMAC 支持 RGMII、MII 和 RMII 100M 全双工模式、RGMII、MII 和 RMII 100M 半双工模式、RGMII、MII 和RMII 10M 全双工模式以及 RGMII、MII 和 RMII 10M 半双工模式。 在 RGMII 模式下工作时,由于工作在 DDR 模式下,因此需要一条 RX 延迟线和一条 TX 延迟线来调整 RX 时序和 TX 时序。 GMAC 可以配置 RXC_DELAY_SEL 和 TXC_DELAY_SEL,在输入 RXC 时钟和输出 TXC 时钟中添加延迟,以获得更好的时序裕度。GMAC 使用一系列缓冲区树和多路复用器 (MUX) 来构建延迟线。RXC_DELAY_SEL/TXC_DELAY_SEL 用于选择在延迟线中使用多少个缓冲区,值越大,延迟越多。 由于单个缓冲区的延迟不是恒定值,它会在不同工艺和不同角落发生漂移,因此客户应根据工艺选择合适的值以覆盖不同的工艺角落。此外,客户还可以选择在 RXC 和 TXC PAD中使用额外的外部 PCB 板延迟或 PHY 侧的延迟线(如果 PHY 有延迟线),以达到与使用 MAC 延迟线相同的目标。 关键点如下: * 当工作在 RGMII 100M/10M 模式下时,在 TX 路径中,GMAC 可以将 TXC_DELAY_SEL 设置为 0,以选择 TXC 时钟无延迟。在 RX 路径中,由于整个延迟线的延迟远小于半个时钟周期,因此 GMAC 可以将 RXC_DELAY_SEL 设置为最大值,以获得最大的设置裕度。 * 当工作在 RMII 模式下时,有一个寄存器 RMII_MODE 用于定义内部 50M RMII 参考时钟的源。如果 RMII_MODE 为 1,即 RMII 主模式,则 rmii_clk_ref 引脚必须连接到 SoC 提供的 50M 时钟。同时,MAC 也会通过 TXC 引脚将此参考时钟输出到 PHY。 .. note:: TXC 引脚表示 xmii_gtxc 引脚将用于在 rgmii 模式下输出 txclk。当 RMII_MODE 为 0 时,表示参考时钟由 PHY 从 gmii_rxc 引脚提供。rmii_clk_ref 引脚的输入值无需关心。 GMAC 支持第 22 条 (IEEE 802.3 第 22 条) 和第 45 条 (IEEE 802.3 第 45 条) 规定的 MAC 和 PHY 之间的 MDIO 接口。MAC 将用作 MDIO 主设备来写入或读取 PHY 的寄存器。首先应配置 MDIO_CLK_SEL 位,以使 MDC 时钟频率不超过 802.3 标准要求的 2.5MHz。不同模式下寄存器的配置如下: * 如果选择第 22 条模式进行 MDIO 写入,需要将 MDIO_MODE 设置为 0 以选择第 22 条模式,并设置 PHY_ADDR 寄存器(映射到 MDIO 的 PHYAD)和 MDIO_REG_ADDR 寄存器(映射到 MDIO 的 REGAD),将 MDIO_RD_WR 设置为 0 以指示这是一次写入操作,MDIO_DATA 值为要写入 PHY 的值,最后,将 MDIO_START 位设置为 1 以触发写入操作。轮询 MDIO_BUSY 位,直到其为 0,表示写入操作完成。 * 如果选择第 22 条模式进行 MDIO 读取,需要将 MDIO_MODE 设置为 0 以选择第 22 条模式,并设置 PHY_ADDR 寄存器(映射到 MDIO 的 PHYAD)和 MDIO_REG_ADDR 寄存器(映射到 MDIO 的 REGAD),并将 MDIO_RD_WR 设置为 1 以指示这是读取操作,最后将 MDIO_START 位设置为 1 以触发读取操作。轮询 MDIO_BUSY 位,直到该位为 0(表示 MDIO 操作完成),然后读取 MDIO_READOUT_DATA 的值,即 PHY 寄存器的读取值。 * 如果选择 Clause 45 模式进行 MDIO 写入,需要将 MDIO_MODE 设置为 1 以选择 Clause 45 模式,并设置 PRTAD 寄存器(映射到 MDIO 的 PRTAD)和 DEVAD 寄存器(映射到 MDIO 的 DEVAD),将 MDIO_RD_WR 设置为 0,并将 EX_REG_ADDR 设置为 MDIO ADDR 值。将 MDIO_DATA 设置为将要写入 PHY 的值。然后将 MDIO_START 位设置为 1 以触发写入操作。轮询 MDIO_BUSY 位,直到其为 0,表示写入操作完成。 * 如果选择 Clause 45 模式进行 MDIO 读取,需要将 MDIO_MODE 设置为 1,以选择 Clause 45 模式,并设置 PRTAD 寄存器(映射到 MDIO 的 PRTAD)和 DEVAD 寄存器(映射到 MDIO 的 DEVAD),将 MDIO_RD_WR 设置为 1,并将 EX_REG_ADDR 设置为 MDIO ADDR 值。然后将 MDIO_START 位设置为 1,以触发读取操作。轮询 MDIO_BUSY 位,直到该位为 0(表示 MDIO 操作完成),然后读取 MDIO_READOUT_DATA 的值,即 PHY 寄存器的读取值。 * 如果选择第 45 条模式进行后读 MDIO 操作,则在完成上述第 45 条 MDIO 读取操作后,将 MDIO_POST_RD_INC 设置为 1,并将 MDIO_START 位设置为 1,以触发后读操作。轮询 MDIO_BUSY 位,直到该位为 0(表示 MDIO 操作完成),然后读取 MDIO_READOUT_DATA 的值,该值即为下一个增量 PHY 寄存器的读出值。重复上述操作,直到读出所有需要读取的 PHY 后续寄存器的值。 支持 10/100M 半双工 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 在半双工模式下,FULL_DUPLEX 位应设置为 0。在半双工模式下,GMAC 支持: * CSMA/CD 协议。 * 冲突时延迟、退避和重试。 * 延迟冲突、过度冲突、过度延迟。 * 使用背压支持的流量控制。 寄存器 BACKOFF_EN 用于定义发生冲突时是否进行退避。寄存器 RETRY 定义发生冲突时的重试次数。如果冲突发生在 512 位时间之前,则称为早期冲突,MAC 将重试,直到重试次数等于 RETRY 寄存器的值,然后中止当前数据包传输。如果冲突发生在 512 位时间之后,则称为晚期冲突,MAC 将立即中止当前数据包传输。 支持流量控制 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 当 RX SRAM 的已用线路数(每线路 8 个字节)超过 RXF_UOF_THRESHOLD 时,如果工作在全双工模式,将发出暂停帧,让发送方停止发送数据包;如果工作在半双工模式,将使用 背压机制让发送方停止发送数据包。 当 RX SRAM 的已用线路数(每线路 8 个字节)小于 RXF_DOF_THRESHOLD 时,如果工作在全双工模式,将发出暂停帧,让发送方恢复发送数据包;如果工作在半双工模式,将 取消背压机制,让发送方恢复发送数据包。 MAC 将在暂停帧的量子时间到期之前重新发送暂停帧。 * 当 MAC 收到暂停帧时,它将暂停 TX 数据包的发送,直到收到暂停帧或暂停帧的量子时间到期。然后恢复 TX 数据包的发送。 * 当 MAC 在半双工模式下接收到背压时,它将暂停 TX 数据包的发送,直到背压消除。 TXFC 和 RXFC 位应设置为 1 以支持流量控制。 VLAN 支持 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 在 RX 路径中,IP 支持 2 个 VLAN:SVLAN (88a8) 和 CVLAN (8100)。RX 数据包可以不包含 VLAN,或者仅包含 SVLAN,或者仅包含 CVLAN,或者两者兼有。 寄存器 VLAN_STRIP 用于定义是否允许 MAC 剥离 CVLAN,如果设置为 1,则可以从传入数据包中剥离 CVLAN。SVLAN 不受 VLAN_STRIP 位的影响,SVLAN 永远不会被剥离。 在 TX 路径中,发送数据包描述 (TPD) 可允许 MAC 附加 CVLAN。因此,在发送路径中,IP 支持以下 6 种情况: * 主机内存中的数据包没有任何 VLAN,且发送数据包描述不希望 MAC 附加 CVLAN(TPD 中的 CVTAG 和 SVTAG 以及 INST_VLAN_TAG 均为 0)。 * 主机内存中的数据包没有任何 VLAN,且发送数据包描述希望 MAC 附加发送数据包中的 CVLAN(TPD 中的 CVTAG 和 SVTAG 均为 0,且 INST_VLAN_TAG 为 1)。 * 主机内存中的数据包已具有 CVLAN,且发送数据包描述不需要 MAC 附加 CVLAN(TPD 中的 CVTAG 为 1,SVTAG 为 0,INST_VLAN_TAG 为 0)。 * 主机内存中的数据包已具有 SVLAN,并且发送数据包描述不需要 MAC 附加 CVLAN(TPD 中的 CVTAG 为 0,SVTAG 为 1,INST_VLAN_TAG 为 0)。 * 主机内存中的数据包已具有 SVLAN,并且发送数据包描述需要 MAC 附加 CVLAN(TPD 中的 SVTAG 为 1,CVTAG 为 0,INST_VLAN_TAG 为 1)。 * 主机内存中的数据包已具有 SVLAN 和 CVLAN(TPD 中的 CVTAG 和 SVTAG 均为 1,INST_VLAN_TAG 均为 0)。 802.3 AZ 支持 ~~~~~~~~~~~~~~~~~~~~~~~~~ 802.2AZ 定义的节能以太网 (Efficient Efficient) 功能用于使 PHY 进入 LPI 模式以节省功耗。 MAC 的 LPI 功能由控制寄存器 LPI_EN 启用。该功能由 MAC 和 PHY 共同参与。如果 PHY 不支持 LPI,则 MAC 端不得启用该功能。 如果连接到 MAC 的 PHY 也支持 LPI,则在链路建立后,软件驱动程序需要与链路伙伴协商,通过 LLDP 数据包交换 LPI 的功能和唤醒时间。如果链路伙伴不支持 LPI,则不得启用 LPI_EN。 LPI_ENTER_CNT 用于控制进入 LPI 模式的定时器,当 MAC 空闲时间超过此值时,MAC 将通知 PHY 进入 LPI 模式。LPI_ENTER_CNT 应大于或等于 LPI_WT,以便在功耗和性能之间取得良好的平衡。 LPI_WT 用于控制 LPI 退出定时器,它应该大于或等于本地 PHY 的 TX LPI 退出时间(可在 PHY 的数据手册中找到)。通常情况下,LPI_WI 大约为 40us。 .. list-table:: 表 5.1: LPI 的传输操作码 :widths: 25 20 20 35 :header-rows: 1 :align: center * - **XMII** - **gmii_txen pad** - **gmii_txer pad** - **gmii_txd pad** * - GMII 1000M - ``1'b0`` - ``1'b1`` - ``8'h01`` * - RGMII 1000M - R(0) F(1) - NC - R(4'h1) F(4'h0) * - MII - ``1'b0`` - ``1'b1`` - ``4'h1`` * - RGMII 100/10M - R(0) F(1) - NC - R(4'h1) F(4'h1) * - RMII - ``1'b0`` - NC - ``2'b0, 2'b0, 2'b0, 2'b01`` .. note:: NC 表示无关,R 表示 CLK 的高脉冲,F 表示 CLK 的低脉冲。“2'b0, 2'b0, 2'b0, 2'b01”表示连续 4 个周期内的 TXD 模式。 对于 RMII 接口,由于 RMII 接口中没有 TX_ER 信号,并且 802.3 规范没有定义 在 RMII 模式下 TX LPI 序列。因此,MAC 中定义的发送操作码可能与 PHY 中的定义不兼容。因此,如果在 RMII 模式下工作,并且 MAC 和 PHY 中的发送操作码定义不匹配,则 不得启用 LPI_EN。并且 RMII 模式下 RX_IN_LPI 状态寄存器位将始终为 0。 自动时钟门控支持 ~~~~~~~~~~~~~~~~~~~~~~~~~ GMAC 支持空闲时自动时钟门控,以节省功耗。空闲意味着没有数据传输。 魔法模式检测支持 ~~~~~~~~~~~~~~~~~~~~~~~~~ 当控制位 MAGIC_FRAME_EN 为 1 时,传入数据包将与魔法数据包模式进行比较。魔法数据包模式是 AMD 定义的特殊数据模式, 由 6 个字节的 0xFF 后跟 16 次设备 MAC 地址迭代组成, 可位于有效载荷内的任意位置。当找到这样的数据序列时,MAGIC_FRAME_INT 位将置位, top_intr 也将置位。 接收数据包必须具有有效的目标地址才能进行魔法数据包检测。 当控制位 MAGIC_FRAME_EN 为 1 时,所有传入数据包将被 MAC 丢弃,所有中断 将被硬件自动屏蔽,MAGIC_FRAME_INT 除外,因此 SoC 可以使用 top_intr 作为唤醒信号。 CRC 支持 ~~~~~~~~~~~~~~~~~~~~~~~~~ 在 RX 路径中,我们支持对 RX 数据包进行 CRC 校验。如果数据包不是巨型数据包,但存在 CRC 错误,则 MAC 会丢弃该数据包。 对于巨型数据包,CRC 错误的数据包将被上传到主机内存,RRD 的error_flag 将指示错误状态。 * 在 TX 路径中,如果 MAC 控制寄存器的 CRCE 位为 0,则软件驱动程序必须计算 CRC,并且系统内存中的发送数据包必须在数据包末尾包含 CRC。 * 在 TX 路径中,如果 MAC 控制寄存器的 CRCE 位为 1,则 MAC 将计算发送数据包的 CRC 并将其附加到数据包末尾,因此系统内存中的发送数据包不能包含 CRC。 .. note:: 如果驱动程序希望硬件连接 VLAN、连接 PAD 或执行 TX 校验和卸载,则驱动程序必须将 CRCE 设置为1。 PAD 支持 ~~~~~~~~~~~~~~~~~~~~~~~~~ 最小数据包大小为 64 字节。如果主机内存中的发送数据包小于 64 字节,硬件可以自动执行 PAD 操作。 .. note:: 如果软件驱动程序希望硬件自动附加 PAD,则必须将 MAC 控制寄存器中的 CRCE 位设置为 1。 TX IPG 和 RX IPG ~~~~~~~~~~~~~~~~~~~~~~~~~ 802.3 标准规定,连续发送数据包之间的最小间隔应为 96 位。IPGT 寄存器定义了最小 TX 数据包间隔。 MIFG 寄存器定义了 RX 数据包之间的最小间隔。如果 RX 数据包中的间隔小于 MIFG,则该数据包被视为无效数据包并被丢弃。 校验和 ~~~~~~~~~~~~~~~~~~~~~~~~~ 如果分片数据包跨越多个数据包,则不支持 TCP/UDP/ICMP 校验和。这是因为如果分片数据包中的 TCP/UDP/ICMP 数据跨越多个数据包,则无法在单个数据包内计算校验和。 .. note:: 如果分片数据包并非跨越多个数据包,而是在单个数据包内计算,则仍然支持接收和发送校验和。 支持对接收数据包进行校验和验证,包括 IPv4 的 IP 校验和、IPv4 的 TCP 校验和、IPv4 的 UDP 校验和、IPv4 的 ICMP 校验和、IPv6 的 TCP 校验和、IPv6 的 UDP 校验和以及 IPv6 的 ICMP 校验和(IPv6 没有 IP 校验和)。 接收和发送数据包的 IP 报头均支持 IPv4 选项字段,这意味着 IPv4 IP 报头可以大于 20 个字节。 对于 IPv6 数据包,IP 支持在接收和发送路径中解析 RFC2460 要求的扩展报头: * 逐跳选项报头 * 目标选项报头 * 路由报头 * 分片报头 .. note:: 硬件会解析分片报头以确定分片数据包是否跨越多个数据包。如果它不跨越多个数据包,硬件将执行 RX 校验和验证和 TX 校验和卸载。如果它跨越多个数据包,硬件将不执行 RX 校验和验证或 TX 校验和卸载。 * 身份验证报头。 * 封装安全有效载荷报头。 .. note:: ESP 报头用于 IPsec,并且有效载荷已加密。因此,如果检测到 ESP 报头,硬件将不执行 RX 校验和验证或 TX 校验和卸载。 RX_CHKSUM_EN 寄存器用于启用 RX 校验和功能。如果启用 RX_CHKSUM_EN,则包含 IP、TCP、UDP 或 ICMP 校验和错误的 RX 数据包将被丢弃。如果禁用 RX_CHKSUM_EN,则包含 IP、TCP、UDP 或 ICMP 校验和错误的数据包仍会上传到主机内存,但校验和错误会在数据包的接收返回描述中指示,以便软件驱动程序进一步处理。支持 IPv4 出站数据包的 IP/TCP/UDP/ICMP 校验和卸载,以及 IPv6 出站数据包的 TCP/UDP/ICMP 校验和卸载。硬件计算校验和并将其附加到出站数据包中。 校验和卸载支持两种模式: * 模式 1:软硬件协同模式(MAC 寄存器中的 TX_PARSER_EN 控制位为 0)。 * 当操作系统为 Linux 内核或 Windows 操作系统时使用此模式。内核将出站数据包信息传递给驱动程序,驱动程序随后可以通过 TPD 通知硬件。 * 对于 TCP/UDP 校验和,Microsoft 传输层或 Linux 内核将计算 IP 伪报头校验和,并将该值放入 TCP/UDP 校验和字段中,因此 GMAC 硬件无需触及 IP 报头即可计算正确的 TCP/UDP 校验和。因此,在硬件方面,它始终假设 IP 伪报头校验和已生成并已放入 TCP/UDP 校验和域中。 * 在此模式下,硬件和软件协同工作,以支持 IPV4/IPV6 IP/TCP/UDP 校验和卸载。 * 模式 2:纯硬件模式(MAC 寄存器 TX_PARSER_EN 控制位为 1)。 * 当操作系统是轻量级嵌入式系统时使用这种方式。驱动程序无法获取必要的发送数据包信息。因此,如果发送数据包是 IP/TCP/UDP/ICMP 数据包,则硬件将对其进行解析,然后计算校验和。 * MAC 控制寄存器 TX_IP_SUM_EN 用于控制在此模式下是否执行 IP 校验和卸载。 MAC 控制寄存器 TX_TCP_ICMP_SUM_EN 用于控制在此模式下是否执行 TCP/ICMP 校验和卸载。MAC 控制寄存器 TX_UDP_SUM_EN 用于控制是否执行 UDP 校验和卸载。如果 TX_TCP_ICMP_SUM_EN 或 TX_UDP_SUM_EN 设置为 1,则 TX_IP_SUM_EN 也必须设置为 1。 * 在此模式下,操作系统上层无需计算 IP 伪报头校验和并将其值放入 TCP/UDP 校验和字段。硬件会在计算 TCP/UDP 校验和时自行计算 IP 伪报头校验和。 * 在此模式下,我们支持 IPV4/IPV6 IP/TCP/UDP/ICMP 校验和卸载。 .. note:: 如果软件希望硬件执行 TX 校验和卸载(无论模式 1 还是模式 2),驱动程序必须将 MAC 控制寄存器的 CRCE 位设置为 1。 接收方丢包算法 ~~~~~~~~~~~~~~~~~~~~~~~~~ 为了减轻软件负担,MAC 系统会自动丢弃以下数据包: * MAC 目标地址不匹配。 * MAC 源地址不匹配。 * 接收到的数据包为 PAUSE 帧,PAUSE 帧将不会上传到主机内存。 * 接收到的数据包字节数小于 64 字节或大于 MTU。 * 当 CUT_THRU_EN 为 0 时,如果 XMII 接口的 RX_ER 为 1,则接收到的数据包将被丢弃;当 CUT_THRU_EN 为 1 时,数据包也可能被丢弃。 * 当 CUT_THRU_EN 为 0 时,接收到的数据包如果存在 CRC 错误,则将被丢弃;当 CUT_THRU_EN 为 1 时,接收到的数据包如果存在 CRC 错误,则可能被丢弃。 * 当 CUT_THRU_EN 为 0 时,在 10/100M 模式下,接收到的数据包如果存在半字节错误,将被丢弃;当 CUT_THRU_EN 为 1 时,在 10/100M 模式下,接收到的数据包如果存在半字节错误,则可能会被丢弃。 * 当 CUT_THRU_EN 为 0 且 RX_CHKSUM_EN 为 1 时,如果 IP、TCP 或 UDP 校验和存在错误,将被丢弃。当 RX_CHKSUM_EN 为 0 时,如果数据包存在校验和错误,则不会被丢弃。 * 当 CUT_THRU_EN 为 1 时,如果数据包存在校验和错误,则可能会被丢弃。 .. note:: 当 DEBUG_MODE 为 1 时,MAC 不会丢弃上述列表中的数据包;当 PROM_MODE 为 1 时,MAC 不会丢弃目的地址或源地址不匹配的数据包。当 CUT_THRU_EN 为 1 时,数据包在仅接收到部分数据包时才会上传到主机内存。因此,如果在数据包开始上传到主机内存之前发生错误,则该数据包将被丢弃;否则,即使数据包有错误,也会上传到主机内存。 MAC 环回功能 ~~~~~~~~~~~~~~~~~~~~~~~~~ MAC_LP_EN 用于执行内部 MAC 环回,以进行调试或测试。如果使用 MAC 环回功能,FULL_DUPLEX 必须设置为 1,并且软件驱动程序需要确保环回数据包的目标地址为有效的 DA,否则 MAC 会丢弃环回数据包。 当 MAC 控制寄存器的 CRCE 位为 1 时,由于硬件会附加 CRC 值,因此环回数据包将比发送数据包多 4 个字节。 当 MAC 控制寄存器的 CRCE 位为 0 时,软件必须计算发送数据包中的 CRC,否则,如果 CRC 错误,则硬件会丢弃环回数据包。 巨型数据包支持 ~~~~~~~~~~~~~~~~~~~~~~~~~ IP 支持最大 4K 字节的巨型数据包,如果需要支持巨型数据包,CUT_THRU_EN 控制位必须设置为 1, 并且 MTU 控制寄存器应配置为大于或等于巨型数据包的大小。 关键点如下: * 网络上的所有设备都必须配置为能够处理发送和接收的最大帧大小,否则巨型帧将被阻塞。 * 请务必注意,仅当网络上所有设备都支持巨型帧且配置为使用相同帧大小时,才可启用巨型帧。 * 巨型数据包不支持 TX TCP/UDP 校验和卸载。 * 巨型帧功能仅在全双工模式下启用。 * 当 CUT_THRU_EN 控制位设置为 1 时,必须确保 AXI/AHB 总线有效带宽大于 XMII 带宽,否则将发生欠载错误。如果发生欠载错误,RX 数据包或 TX 数据包将被丢弃。 DMA 环 ~~~~~~~~~~~~~~~~~~~~~~~~~ 使用环结构进行 DMA 传输。主机内存中有 3 个环。每个环的结构如下: .. figure:: /assets/images/eth_ring.png :alt: GMAC dma arch :height: 320px :align: center 图5.2 环形结构图 对于环,它有一个消费者索引,即消费者的读取地址,还有一个生产者索引,即生产者的写入地址。环存储在主机内存中的连续内存空间中,因此在主机内存中会有一个基地址,该基地址是元素 0 在主机内存中的地址。 例如,如果基地址为 0x8000,每个环元素为 8 字节,则元素 1 的地址为 0x8008,元素 2 的地址为 0x8010,以此类推,元素 11 的地址为 0x8058。 环大小是环中元素的数量,应配置为 2 的 n 次方值,例如 256、512、1024 等等。 接收空闲描述环 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 接收空闲描述 (RFD) 环表示分配给接收入口数据包的内存块。它由软件驱动程序生成,并由硬件使用。该环必须占用连续的内存空间,且不跨越 32 位字节地址边界。RFD 中的每个元素都是 8 字节,因此 RFD 环的基地址应为 8 字节对齐(低 3 位应为 0)。 RFD 元素如下所示: .. list-table:: 表 5.2: RFD 元素描述 :widths: 15 15 70 :header-rows: 1 :align: center * - **word 位序** - **位** - **描述** * - 0 - 31:0 - 主机内存中接收缓冲区低 32 位地址 * - 1 - 63:32 - 主机内存中接收缓冲区高 32 位地址 如果是 32 位系统,驱动程序只需将RFD中的高32位地址配置为全零即可 接收返回描述环 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 接收返回描述环 (RRD) 表示接收到的数据包的摘要信息。它由 GMAC 生成并 由驱动程序使用。该环必须占用连续的内存空间,且不跨越 32 位字节地址边界。 驱动程序可以先检查 RRD,然后再检查接收到的数据包。每个 RRD 元素为 8 字节,因此 RRD 环的基地址应为 8 字节对齐(最低 3 位应为 0)。 RRD 元素如下所示: .. list-table:: 表 5.3: RRD 元素描述 :widths: 10 15 20 55 :header-rows: 1 :align: center * - **word 位序** - **位** - **助记符** - **描述** * - 0 - 11:0 - RFD_START_INDEX - 启动接收数据包的 RFD 消费者索引 * - - 15:12 - CONSUME_RFD_NUM - 此接收数据包使用的 RFD 数量,单个数据包最多消耗 8 个 RFD * - - 18:16 - PKT_ID - 1588 事件数据包 ID,驱动程序可使用此 pkt_id 在本地寄存器中检索接收时间戳。若 pkt_id = 0,则接收时间戳存储于 RX_PTP_0 寄存器中。 * - - 19 - RSV - 保留 * - - 20 - CVLAN_DET - 检测到 TPID 8100 CVLAN * - - 21 - ETH_TYPE - * ``1'b0``: 以太网 II 数据包; * ``1'b1``: 802.3数据包 * - - 22 - BROAD - 接收到了广播地址数据包 * - - 23 - MULTI - 接收到了组播地址数据包 * - - 25:24 - MAC_LAYER_ERR_FLAG - * ``00``: 无错误 * ``2'b01``: 检测XMII接口中的接收错误 * ``2'b10``: 10/100M, 接收数据未按字节对齐错误 * ``2'b11``: CRC 错误 * - - 26 - IP_CHKSUM_ERR - IP 校验和错误, ``1`` 表示有该错误 * - - 27 - L4_CHKSUM_ERR - TCP or UDP or ICMP 校验和错误, ``1`` 表示有该错误 * - - 31:28 - PKT TYPE - * ``4'b0001``: 仅 IPV4 * ``4'b0010``: IPV4 和 TCP * ``4'b0011``: IPV4 和 UDP * ``4'b0100``: 仅 IPV6 * ``4'b0101``: IPV6 和 TCP * ``4'b0110``: IPV6 和 UDP * ``4'b0111``: LLDP * ``4'b1000``: 1588 事件消息 * ``4'b1001``: 1588 通用消息 * ``4'b1010``: IPV4 和 ICMP * ``4'b1011``: IPV6 和 ICMP * ``4'b0000``: 不属于以上任何类型 * - 1 - 15:0 - VLAN_TAG - CVLAN 的 802.1Q VLAN 标签 * - - 29:16 - PKT_SIZE - 接收数据包的大小(单位:字节) * - - 30 - SVLAN_DET - 检测到 TPID 88a8 SVLAN * - - 31 - UPDT - - 当设置为 1 时,表示该描述符由 XEC 硬件更新 - 当清零时,表示该描述符无效 - 驱动程序在读取 RRD 时可将此位设为0,硬件在写入RRD时将此位设为 1。通过这种方式,可确保驱动程序的读取操作永远不会领先于硬件的写入操作 .. note:: * 对于 MAC_LAYER_ERR_FLAG,数据包可能包含多种错误类型,MAC_LAYER_ERR_FLAG 只会指示一种错误类型。 * 对于接收的数据包,寄存器 VLAN_STRIP 定义是否剥离数据包中的 CVLAN。如果设置为1,则 CVLAN 将被剥离,VLAN 标签将存储在接收返回描述中。对于 SVLAN,它不受 VLAN_STRIP 控制位的影响,它将始终随数据包一起上传到主机内存。 发送数据包描述环 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 发送数据包描述 (TPD) 表示发送数据包的信息,它由驱动程序生成并由 GMAC 硬件使用。该环必须占用连续的内存空间,且不跨越 32 位字节地址边界。 每个 TPD 元素为 16 字节,因此 TPD 环的基地址应为 16 字节对齐(4 LSB 应为 0)。 如果 TX_PARSER_EN 控制位为 0,驱动程序可以通知硬件是否执行校验和卸载,并在 TPD 中提供 必要的发送数据包信息。 如果 TX_PARSER_EN 控制位为 1,硬件将自动解析发送数据包,因此 TPD 中的某些域 可以用 “0” 填充。是否进行校验和卸载由控制寄存器 TX_IP_SUM_EN、TX_TCP_ICMP_SUM_EN 和 TX_UDP_SUM_EN 定义。 .. list-table:: 表 5.4: TPD 元素描述 :widths: 10 15 20 55 :header-rows: 1 :align: center * - **word 位序** - **位** - **助记符** - **描述** * - 0 - 15:0 - BUF_LEN - 需要从 BUFFER_ADDR 获取的字节数 * - 0 - 31:16 - VLAN_TAG - 如果设置了 INS_VLAN_TAG,则插入的 VLAN 标签 * - 1 - 7:0 - L4_HEAD_OFFSET - TCP 头或 UDP 头相对于数据包第一个字节的偏移量。如果 TX_PARSER_EN 为 1,则该字段应全为 0 * - 1 - 8 - IP_CHKSUM_OFFLOAD - IP 校验和卸载,当设置时,让 GMAC 卸载 IPv4 校验和。如果 TX_PARSER_EN 为 1,则该字段应全为 0 * - 1 - 9 - TCP_CHKSUM_OFFLOAD - TCP 校验和卸载,当设置时,让 GMAC 卸载 TCP 校验和。如果 TX_PARSER_EN 为 1,则该字段应全为 0 * - 1 - 10 - UDP_CHKSUM_OFFLOAD - UDP 校验和卸载,当设置时,让 GMAC 卸载 UDP 校验和。如果 TX_PARSER_EN 为 1,则该字段应全为 0 * - 1 - 11 - SVTAG - 当设置时,表示主机内存中的该数据包已包含一个 SVLAN 标签(四字节) * - 1 - 12 - CVTAG - 当设置时,表示主机内存中的该数据包已包含一个 CVLAN 标签(四字节) * - 1 - 13 - INST_VLAN_TAG - 插入 VLAN 标签:当设置时,让硬件在发送的数据包中插入 CVLAN * - 1 - 14 - IPV4 - 当设置时,表示这是一个IPv4数据包。如果 TX_PARSER_EN 为 1,则该字段应全为 0 * - 1 - 15 - ETH_II - 当设置时,表示这是一个 Ethernet_II 数据包;当清除时,表示这是一个 802.3 SNAP 数据包。如果 TX_PARSER_EN 为 1,则该字段应全为 0 * - 1 - 18:16 - PKT_ID - 当 TX_TIMESTAMP 为 1 时,这 3 位表示当前 1588 事件数据包的数据包 ID,GMAC 将把发送时间戳记录到 TX_TIMESTAMP_$PKT_ID 寄存器的 CSR寄存器中 * - 1 - 29:19 - RSV - 保留 * - 1 - 30 - TX_TIMESTAMP - 让 GMAC 记录发送的1588事件数据包的时间戳 * - 1 - 31 - LAST - 当设置时,表示这是发送数据包的最后一个段。当一个数据包消耗多个 TPD 时,最后一个 TPD 的 LAST 位应为 1;当一个数据包消耗一个 TPD 时,LAST 位也应为 1 * - 2 - 31:0 - BUFFER_ADDR_LO - 发送数据包的低 32 位缓冲区起始地址 * - 3 - 31:0 - BUFFER_ADDR_HI - 发送数据包的高 32 位缓冲区起始地址。如果是 32 位系统,该字段应全为0。 支持一个数据包占用一个或多个 TPD,如多 TPD 示意图所示。 .. figure:: /assets/images/eth_tpd.png :align: center :figclass: align-center 图 5.3: 多 TPD 示意图 .. note:: 图中展示了三种情况: - 情况1:数据包完全在一个TPD中 - 情况2:数据包跨两个TPD - 情况3:数据包跨三个TPD 如果 TX_PARSER_EN 为 1,发送数据包的第一个 TPD 应包含 MAC 头 + IP 头(如果存在)+ TCP/UDP/ICMP 头(如果存在)。 如果 TX_PARSER_EN 为 0,则可以取消对多 TPD 的上述要求,这意味着甚至数据包头也可以在不同的 TPD 中。 命令字管理功能 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 命令字管理(CMB)用于通过 DMAW 操作将 TPD 消费索引上传到主机内存,因此软件驱动程序无需通过 APB 轮询 tpd_cons_idx,可以直接从主机内存获取该值。上传频率由寄存器 CMB_TIMER 和 CMB_THRESHOLD 定义。在 CMB DMA 操作后,当经过的时间超过 CMB_TIMER 定义的值或消耗的 TPD 索引超过 CMB_THRESHOLD 时,将触发新的 CMB DMAW。 CMB DMAW 地址由寄存器 CMB_BASE_ADDR 定义。由于 CMB 数据是 16 位的,因此 CMB_BASE_ADDR 应 2 字节对齐(最低有效位应为 0)。 发送数据流 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 发送数据流的处理过程如下: - **软件驱动** 将发送数据放入发送缓冲区。发送缓冲区位于操作系统的存储设备中,如 DRAM。 - **设备驱动** 更新传输包描述符(TPD),以指示发送缓冲区地址、帧长度和其他信息。一个帧可以有一个发送缓冲区或多个由多个 TPD 表示的发送缓冲区。 - **设备驱动** 更新 TPD 环的 TPD_PROD_IDX 寄存器,通知 GMAC 发送数据已就绪。 - **GMAC** 从发送缓冲区读取发送数据,然后将数据发送到 PHY,并通过 DMA 将 TPD_CONS_IDX 传输到主机内存地址(CMB_BASE_ADDR)。 - 发送一些数据包后,GMAC 将生成 top_intr,然后驱动程序读取中断状态寄存器 INT_STA_REG。如果设置了 CMB_INT 位,驱动程序应从 CMB_BASE_ADDR 读取 TPD 消费者索引并更新 TPD 生产者索引(驱动程序应确保生产者索引不会回绕消费者索引)。 接收数据流 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 接收数据流的处理过程如下: - **软件驱动** 为接收数据包分配内存空间(由 RFD 定义)。然后驱动程序更新 RFD 生产者索引(RFD_PROD_IDX),通知 GMAC 接收缓冲区可用。 - **MAC** 接收数据包,然后通过 DMA 将数据包传输到由 RFD 分配的主机内存地址。然后将数据包状态 DMA 到接收返回描述符(RRD)。 - **GMAC** 将生成 top_intr,然后驱动程序读取中断状态寄存器 INT_STA_REG,RX_PKT_INT 位通知驱动程序有新数据包到达。 - **软件驱动** 读取 RRD,读取 RRD 后,软件驱动将主机内存中 RRD 的 UPDT 位设置为 0。在读取的 RRD 中,包含此数据包的 RFD_START_INDEX 和 CONSUME_RFD_NUM 信息,软件驱动可以使用这些信息了解数据包在主机内存中的位置。 - **软件驱动** 逐个读取 RRD,直到 RRD 中的 UPDT 位为 0。 软重置 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 软件驱动程序可以通过向 SOFT_RST 寄存器写入 1 来执行软重置,该寄存器会自动清零为 0。 - **1588 模块不受影响**:SOFT_RST 不会重置 1588 模块,因为 RTC 的累加不应中断。其他功能模块将被重置。 - **应用场景**:当 MAC 速度更改或工作模式更改时,软件驱动程序可以写入 SOFT_RST 执行软重置。 RTC 功能 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ IP 中有一个 RTC(实时时钟)。RTC 具有以下功能: - **预加载RTC** :设置 RTC_PRELOAD 位,将整个 RTC_OFFSET 值(RTC_OFFSET_SH、RTC_OFFSET_SL、RTC_OFFSET_NS)加载为当前 RTC 值。 - **RTC重置** :设置 RTC_RESET 位将 RTC 值重置为全0。 - **偏移取消** :使用 RTC_OFFSET_LOAD 让当前RTC增加或减少RTC_OFFSET值(RTC_OFFSET_SL、RTC_OFFSET_NS)以获得新的RTC值。 - **RTC累积** :RTC 值将在 ptp_ref_clk 的上升沿以 RTC_INC_DELTA 为步长累积,初始 RTC_INC_DELTA 应根据 ptp_ref_clk 的周期进行配置。 .. note:: RTC 的 MSB 16位不受偏移取消操作的影响,RTC MSB 16位的1位约等于136年,在实际应用中不应受到影响。 .. note:: RTC 的 MSB 16位不受RTC累积操作的影响,RTC MSB 16位的1位约等于136年,在实际应用中不应受到影响。 PPS_IN 和 PPS_OUT 硬件同步 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ IP 支持通过硬件自动将 RTC 同步到 PPS_IN 并输出 PPS_OUT。 .. figure:: /assets/images/eth_pps.png :align: center :alt: PPS 输入/输出示意图 :figclass: align-center 图 5.4: PPS 输入/输出示意图 相关寄存器配置如下: - **PPSIN_LATENCY** :应根据估计的延迟设置,包括外部设备的 PPS_OUTPAD 延迟、外部设备与IP之间的设备延迟以及 IP 的 PPS_INPAD 延迟。 - **PPS_IN_OUT_PULSE_CTRL** :应根据 PPS_IN 的频率设置。通常,PPS_IN 应为1秒脉冲,具有0.5 秒高电平和0.5 秒低电平。PPS_OUT 将与 PPS_IN 具有相同的频率。 - **RTC_INC_DELTA** :应根据 ptp_ref_clk 的时钟周期设置。 - **PTP_EN位** :设置为1'b1。 - 使用预加载 RTC 功能预加载初始 RTC 值。 - 设置 **PPSIN_SYNC_EN** 为1,让硬件自动将本地 RTC 同步到 PPS_IN 输入并输出 PPS_OUT。硬件将使用硬件 PI 控制算法调整 RTC 偏移和 RTC_INC_VALUE,使 PPS_OUT 的相位尽可能准确地跟踪 PPS_IN 的相位。硬件还将同步本地 RTC 值与外部设备。 .. note:: PPS_IN_OUT_SYNC 无法在秒级进行同步。如果需要,客户可以使用RTC的偏移取消功能来取消秒级偏移。 1588同步功能 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 使用两步1588事件包进行同步,操作如下: - 将 ``PTP_EN`` 设置为1。 - 使用预加载 RTC 功能将初始 RTC 值预加载到本地 RTC。 - 软件驱动程序使用 1588 公告通用消息与外部设备建立主从层次结构。 - 软件驱动程序定期发送 1588 事件包,同时 IP 也会定期接收 1588 事件包。 - 当在 XMII 接口接收到 1588 事件包时: - 记录RX时间戳 - 立即置位 ``top_intr`` 中断 - ``INT_STA_REG`` 寄存器的 ``RX_PTP_EVENT_INT`` 位将置1 - 软件应尽快处理 RX 数据包 - 接收到的 1588 事件包的 RRD 将指示 ``rx_pkt_id`` 和数据包类型为 1588 事件包 - 软件可以使用 ``rx_pkt_id`` 作为索引从 ``RX_PTP_TS_${rx_pkt_id}`` 寄存器中读出 RX 时间戳 - 发送 1588 事件包操作: - 在TPD中指示 ``tx_pkt_id`` 并设置 ``TX_TIMESTAMP`` 位 - 下一个 TX 1588 事件包的 ``tx_pkt_id`` 应增加1 - 当数据包通过 XMII 接口时: - 硬件将当前本地 RTC 值存储到 ``TX_PTP_TS_${tx_pkt_id}`` 寄存器 - ``TX_PTP_TS_UPDT[tx_pkt_id]`` 位将置1(表示时间戳有效) 关键要点: - **中断处理**: - 立即置位 ``top_intr`` 中断 - ``INT_STA_REG`` 的 ``TX_PTP_EVENT_INT`` 位将置1 - 软件驱动程序需检查 ``TX_PTP_TS_UPDT[tx_pkt_id]`` 确认时间戳有效性 - 读取后清除 ``TX_PTP_TS_UPDT[tx_pkt_id] = 0`` - **时钟同步算法**: - 使用PI控制算法计算偏移取消值 - 通过 ``RTC_OFFSET_LOAD`` 执行 RTC 偏移取消 - 更新 ``RTC_INC_DELTA`` 值使从时钟与主时钟保持同步 - **调试支持**: - ``PPS_OUT`` 引脚可输出 RTC 的 PPS 信号用于调试 - 使用 ``PPS_IN_OUT_PULSE_CTRL`` 寄存器控制 PPS_OUT 频率 .. note:: 对于 1588 "延迟请求-响应延迟"机制或"对等延迟"机制: - RX 1588 事件包的序列顺序是固定的 - 如果某些 RX 1588 事件包被丢弃: - 软件驱动程序可以感知该情况 - 应使所有相关 1588 事件包无效 - 使用下一个有效的"延迟请求-响应延迟"或"对等延迟"包进行计算 MAC PAD 映射到 XMII ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 在 SoC 层级中, ``xmii_gtxc`` PAD 是输出 PAD, ``xmii_txc`` PAD 是输入 PAD。 .. list-table:: 表 5.5: PAD 映射到 XMII :widths: 20 15 15 15 15 :header-rows: 1 :align: center * - **MAC PAD** - **GMII** - **RGMII** - **MII** - **RMII** * - gmii_rxc - RX_CLK - RXC - RX_CLK - REF_CLK * - xmii_txe - TX_CLK - NC - TX_CLK - NC * - xmii_gtxc - GTX_CLK - TXC - NC - REF_CLK * - gmii_rxd_bit0 - RXD[0] - RXD[0] - RXD[0] - RXD[0] * - gmii_rxd_bit1 - RXD[1] - RXD[1] - RXD[1] - RXD[1] * - gmii_rxd_bit2 - RXD[2] - RXD[2] - RXD[2] - NC * - gmii_rxd_bit3 - RXD[3] - RXD[3] - RXD[3] - NC * - gmii_rxd_bit4 - RXD[4] - NC - NC - NC * - gmii_rxd_bit5 - RXD[5] - NC - NC - NC * - gmii_rxd_bit6 - RXD[6] - NC - NC - NC * - gmii_rxd_bit7 - RXD[7] - NC - NC - NC * - gmii_txd_bit0 - TXD[0] - TXD[0] - TXD[0] - TXD[0] * - gmii_txd_bit1 - TXD[1] - TXD[1] - TXD[1] - TXD[1] * - gmii_txd_bit2 - TXD[2] - TXD[2] - TXD[2] - NC * - gmii_txd_bit3 - TXD[3] - TXD[3] - TXD[3] - NC * - gmii_txd_bit4 - TXD[4] - NC - NC - NC * - gmii_txd_bit5 - TXD[5] - NC - NC - NC * - gmii_txd_bit6 - TXD[6] - NC - NC - NC * - gmii_txd_bit7 - TXD[7] - NC - NC - NC * - gmii_rcx - CRS - CRS - CRS - NC * - gmii_col - COL - COL - COL - NC * - gmii_rxd - RX_DV - RX_CTL - RX_DV - CRS_DV * - gmii_rxer - RX_ER - NC - RX_ER - RX_ER * - gmii_txe - TX_EN - TX_CTL - TX_EN - TX_EN * - gmii_txe - TX_ER - NC - TX_ER - NC - 对于 GMII 接口,当工作在 1000M 时,MAC通过 ``xmii_gtxc`` PAD 向 PHY 输出 txclk。 - 对于 MII 接口,当工作在 100M/10M 时,PHY应通过 ``xmii_txc`` PAD 向 MAC 输出 txclk。 - 对于 RGMII 接口,当工作在 1000M/100M/10M 时,MAC始终通过``xmii_gtxc``PAD向 PHY 输出 txclk。 - 对于 RMII 模式,如果 MAC 工作在 RMII 主模式,MAC应通过 ``xmii_gtxc`` PAD向 PHY 输出 REF_CLK;如果 MAC 工作在 RMII 从模式,PHY 应通过 ``gmii_rxc`` PAD 向 MAC 输出 REF_CLK。 - NC 表示不连接。 中断 ------------------------ 在顶部,IP 将向 SoC 输出一个 top_intr 信号,该信号是 INT_STA_REG 寄存器中所有未屏蔽中断的“或”运算结果。内部中断分为两类:一类是紧急中断,需立即处理;另一类是常规接收数据包和发送数据包中断。当进行大规模传输时,这两类数据包中断会频繁触发。软件驱动程序不希望被高频中断打断,否则将给 CPU 带来沉重负担。 中断模块 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 为解决上述问题,针对常规的接收和发送数据包中断,我们将采用中断调制功能显著减少中断次数。关键点如下: * 设有 INTR_MOD_RX_TIMER 和 INTR_MOD_TX_TIMER 寄存器分别控制接收和发送调制定时器。例如当触发 TX 中断时,首先置位对应的中断状态位 TX_PKT_INT,随后等待 TX 调制定时器倒计时至 0 再置位 top_intr,如此可忽略所有发生在 TX 调制等待期内的相同 TX 数据包事件。 * 接收与发送调制定时器分别独立计数。 * 在调制等待期间,若触发紧急中断,无需等待调制定时器计数归零,顶端中断 (top_intr) 将立即置位。 中断屏蔽功能 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ DIS_INT 位用于禁用所有中断,当 DIS_INT 为 1 时,top_intr 不会被置高。INT_MASK 用于屏蔽相应的中断。INT_MASK 的位 0 用于屏蔽 INT_STA 的位 0,依此类推。 魔术包中断 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 对于典型应用,当系统处于睡眠状态时,会使用魔术模式唤醒系统。因此当系统进入睡眠时,软件驱动程序可将控制位 MAGIC_FRAME_EN 设为 1。当 MAGIC_FRAME 为 1 时,硬件仅会为 MAGIC_FRAME_INT 触发 top_intr 中断,并自动忽略所有其他中断。当 MAGIC_FRAME_EN 为 1 时,软件驱动程序无需为其他中断设置屏蔽位。 .. note:: 系统唤醒后,软件驱动程序可将 MAGIC_FRAME_EN 重置为 0。 如何处理中断 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 各中断寄存器的含义如下: * RXF_OF_INT:表示接收 SRAM 发生溢出,可能有两种情况:一是接收 AXI 带宽低于 MAC 接收带宽,需在 SoC 层面解决;二是 RFD 全部耗尽导致新数据包无法上传至主机内存,此时软件驱动需检查 RFD_PROD_IDX 以确保接收数据包有足够的 RFD 存储空间。 * RFD_UR_INT:当接收数据包到来时,若主机内存中的 RFD 不足且即将耗尽,则需软件驱动程序分配 RFD 并更新 RFD_PROD_IDX,确保有足够的 RFD 存储接收数据包。 * TXF_UR_INT:仅在发送巨型数据包时发生,表明 TX AXI 带宽低于 MAC 传输带宽。应在 SoC 层面解决。 * DMAR_TO_INT:DMAR 操作超时,可能导致系统挂起。软件驱动程序可选择重置或继续等待。 * DMAW_TO_INT:DMAW 操作超时,可能导致系统挂起。软件驱动可选择重置或继续等待。 * TX_PKT_INT:发送数据包通过 XMII 接口发出。 * RX_PKT_INT:接收数据包经 DMA 传输至主机内存,软件驱动可开始检查 RRD。 * DMAW_BUS_ERR_INT/DMAR_BUS_ERR_INT:DMA 总线错误,SoC 可选择执行软件复位或忽略。若需复位,需检查状态寄存器 XEC_IDLE 位,当 XEC_IDLE 为 1 时执行复位。 * CMB_INT:软件驱动需从主机内存的 CMB 基址读取数据以获取 TPD 消费者索引。 * MAGIC_FRAME_INT:SoC 可利用此中断唤醒系统。 * RX_PTP_EVENT_INT:软件驱动需检查 RRD,定位 1588 事件数据包的 RRD 以获取接收数据包 ID(RX PKT_ID),并以此 ID 为索引读取对应接收 1588 事件数据包的接收时间戳。 * TX_PTP_EVENT_INT:软件驱动程序检查 TX_PTP_TS_UPDT 寄存器,获取硬件更新的 TX PKT_ID 时间戳寄存器,随后读取对应的 TX 时间戳并将对应的 TX_PTP_TS_UPDT 位清零。 寄存器 ------------------------ MAC_BLOCK 寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 寄存器及其在 MAC_BLOCK 中的对应偏移地址如下表所示: .. list-table:: 表 7.1: MAC_BLOCK 寄存器偏移地址及功能描述 :widths: 10 25 65 :header-rows: 1 * - **偏移地址** - **寄存器名称** - **功能描述** * - 0x0 - MAC_CTRL_REG - MAC 基本和基础控制 * - 0x4 - MAC_IPG_REG - IPG 控制 * - 0x8 - MAC_HALF_CTRL_REG - 半双工控制 * - 0xC - MAC_MTU_REG - MTU 控制 * - 0x10 - MAC_STAD_LO_REG - 源地址低 32 位 * - 0x14 - MAC_STAD_HI_REG - 源地址高 32 位 * - 0x18 - MAC_LPI_REG - 802.3az 控制和状态 * - 0x1C - RX_HASH_TABLE1_REG - 接收哈希表 1 * - 0x20 - RX_HASH_TABLE2_REG - 接收哈希表 2 * - 0x24 - SRAM_CTRL_REG_1 - SRAM RFD 位置 * - 0x28 - SRAM_CTRL_REG_2 - SRAM 发送控制字位置 * - 0x2C - SRAM_CTRL_REG_3 - RX FIFO 头尾地址 * - 0x30 - SRAM_CTRL_REG_4 - SRAM TXD 位置 * - 0x34 - SRAM_CTRL_REG_5 - SRAM RX 和 TX FIFO 深度 * - 0x38 - SRAM_CTRL_REG_6 - 加载指针 * - 0x40 - DESCRIPTOR_CTRL_REG_2 - RFD 基地址低 32 位 * - 0x44 - DESCRIPTOR_CTRL_REG_3 - RRD 基地址低 32 位 * - 0x48 - DESCRIPTOR_CTRL_REG_4 - RFD 描述 * - 0x4C - DESCRIPTOR_CTRL_REG_5 - RRD 和 TPD 环大小 * - 0x54 - DESCRIPTOR_CTRL_REG_7 - TPD 基地址低 32 位 * - 0x5C - CMB_BASE_ADDR_LO - CMB 基地址低 32 位 * - 0x60 - DMA_BURST_CTRL_1 - TPD 突发控制 * - 0x64 - DMA_BURST_CTRL_2 - RFD 突发和直通控制 * - 0x68 - FC_WATERMARK_REG - 流控水位控制 * - 0x6C - CMB_CTR_REG - CMB控制 * - 0x70 - MAILBOX_REG_1 - RFD 索引 * - 0x74 - MAILBOX_REG_2 - TPD 索引 * - 0x78 - INT_STA_REG - 中断状态 * - 0x7C - INT_MSK_REG - 中断屏蔽 * - 0x80 - INTR_TIMER2_REG - 仲裁器定时器 * - 0x84 - MAC_RX_OK - 接收的良好数据包数量 * - 0x88 - MAC_RX_BCAST - 接收的良好广播包数量 * - 0x8C - MAC_RX_MCAST - 接收的良好组播包数量 * - 0x90 - MAC_RX_PAUSE - 接收的暂停包数量 * - 0x94 - MAC_RX_LLDP - 接收的 LLDP 包数量 * - 0x98 - MAC_RX_FCS_ERR - FCS错误的数据包数量 * - 0x9C - MAC_RX_LEN_ERR - 长度字段与实际大小不匹配的数据包数量 * - 0xA0 - MAC_RX_BYTE_CNT - 接收的良好数据包字节数 * - 0xA4 - MAC_RX_RUNT - 接收的小于 64 字节且 FCS 良好的数据包数量 * - 0xA8 - MAC_RX_FRAGMENT - 接收的小于 64 字节且 FCS 错误的数据包数量 * - 0xAC - MAC_RX_SIZE_64 - 接收的 64 字节数据包数量 * - 0xB0 - MAC_RX_SIZE_65TO127 - 接收的 65-127 字节数据包数量 * - 0xB4 - MAC_RX_SIZE_128TO255 - 接收的 128-255 字节数据包数量 * - 0xB8 - MAC_RX_SIZE_256TO511 - 接收的 256-511 字节数据包数量 * - 0xBC - MAC_RX_SIZE_512TO1023 - 接收的 512-1023 字节数据包数量 * - 0xC0 - MAC_RX_SIZE_1024TO1518 - 接收的 1024-1518 字节数据包数量 * - 0xC4 - MAC_RX_SIZE_1519TOMAX - 接收的 1519 字节至 MTU 大小的数据包数量 * - 0xC8 - MAC_RX_OVERSIZE - 接收的大于 MTU 大小的数据包数量 * - 0xCC - MAC_RX_OVERFLOW - 因 RX FIFO 溢出而丢弃的数据包数量 * - 0xD0 - MAC_RX_NIBBLE_ERR - 半字节错误包数量 * - 0xD4 - MAC_RX_BCAST_BYTE_CNT - 接收的广播包字节数 * - 0xD8 - MAC_RX_MCAST_BYTE_CNT - 接收的组播包字节数 * - 0xDC - MAC_RX_ADDR_ERR - 目的地址或源地址错误的数据包数量 * - 0xE0 - MAC_TX_OK - 成功发送的数据包数量 * - 0xE4 - MAC_TX_BCAST - 成功发送的广播包数量 * - 0xE8 - MAC_TX_MCAST - 成功发送的组播包数量(不包括暂停帧) * - 0GMAC - MAC_TX_PAUSE - 发送的暂停包数量 * - 0xF0 - MAC_TX_DEFFER - 延迟发送的数据包数量 * - 0xF4 - MAC_TX_BYTE_CNT - 发送的数据字节数 * - 0xF8 - MAC_TX_SIZE_64B - 发送的 64 字节数据包数量 * - 0xFC - MAC_TX_SIZE_65TO127 - 发送的 65-127 字节数据包数量 * - 0x100 - MAC_TX_SIZE_128TO255 - 发送的 128-255 字节数据包数量 * - 0x104 - MAC_TX_SIZE_256TO511 - 发送的 256-511 字节数据包数量 * - 0x108 - MAC_TX_SIZE_512TO1023 - 发送的 512-1023 字节数据包数量 * - 0x10C - MAC_TX_SIZE_1024TO1518 - 发送的 1024-1518 字节数据包数量 * - 0x110 - MAC_TX_SIZE_1519TOMAX - 发送的 1519 字节至 MTU 大小的数据包数量 * - 0x114 - MAC_TX_SINGLE_COL - 单次碰撞后成功发送的数据包数量 * - 0x118 - MAC_TX_MULT_COL - 多次碰撞后成功发送的数据包数量 * - 0x11C - MAC_TX_LATE_COL - 延迟碰撞发送的数据包数量 * - 0x120 - MAC_TX_ABORT_COL - 因过度碰撞而中止发送的数据包数量 * - 0x124 - MAC_TX_UNDERUN - 因发送 FIFO 下溢而中止的数据包数量 * - 0x128 - MAC_TX_LENGTH_ERR - 长度字段与实际帧大小不匹配的发送数据包数量 * - 0x12C - MAC_TX_TRUNC - 大小大于 MTU 的发送数据包数量 * - 0x130 - MAC_TX_BCAST_BYTE_CNT - 发送的广播包字节数 * - 0x134 - MAC_TX_MCAST_BYTE_CNT - 发送的组播包字节数(不包括暂停帧) * - 0x138 - MDIO_CTRL_REG_1 - MDIO 控制寄存器 * - 0x13C - MDIO_CTRL_REG_2 - MDIO 条款 45 控制寄存器 * - 0x140 - MDIO_STATUS_REG - MDIO 读出数据和忙状态 * - 0x144 - DMA_BURST_REG - DMA 读写突发长度 * - 0x148 - WATCHDOG_REG - DMA 看门狗定时器 * - 0x14C - LOW_POWER_CTRL - 低功耗控制 * - 0x150 - GMAC_STATUS - GMAC 状态 * - 0x154 - DELAY_SEL - 延迟线选择 * - 0x158 - SVLAN - 支持 SVLAN ID * - 0x15C - DBG_TEST_REG - 调试控制寄存器 * - 0x174 - IP_VERSION - GMAC IP 版本 * - 0x178 - SOFT_RESET - 软复位 * - 0x17C - SA_FILTER_CTRL_0 - 源地址过滤器控制 0 * - 0x180 - SA_FILTER_CTRL_1 - 源地址过滤器控制 1 * - 0x184 - DA_FILTER_CTRL - 目的地址过滤器控制 * - 0x188 - SA_FILTER0_LOW - 源地址过滤器 0 低 32 位 * - 0x18C - SA_FILTER0_HIGH_MASK - 源地址过滤器 0 高 32 位掩码 * - 0x190 - SA_FILTER1_LOW - 源地址过滤器 1 低 32 位 * - 0x194 - SA_FILTER1_HIGH_MASK - 源地址过滤器 1 高 32 位掩码 * - 0x198 - SA_FILTER2_LOW - 源地址过滤器 2 低 32 位 * - 0x19C - SA_FILTER2_HIGH_MASK - 源地址过滤器 2 高 32 位掩码 * - 0x1A0 - SA_FILTER3_LOW - 源地址过滤器 3 低 32 位 * - 0x1A4 - SA_FILTER3_HIGH_MASK - 源地址过滤器 3 高 32 位掩码 * - 0x1A8 - SA_FILTER4_LOW - 源地址过滤器 4 低 32 位 * - 0x1AC - SA_FILTER4_HIGH_MASK - 源地址过滤器 4 高 32 位掩码 * - 0x1B0 - SA_FILTER5_LOW - 源地址过滤器 5 低 32 位 * - 0x1B4 - SA_FILTER5_HIGH_MASK - 源地址过滤器 5 高 32 位掩码 * - 0x1B8 - SA_FILTER6_LOW - 源地址过滤器 6 低 32 位 * - 0x1BC - SA_FILTER6_HIGH_MASK - 源地址过滤器 6 高 32 位掩码 * - 0x1C0 - SA_FILTER7_LOW - 源地址过滤器 7 低 32 位 * - 0x1C4 - SA_FILTER7_HIGH_MASK - 源地址过滤器 7 高 32 位掩码 * - 0x1C8 - SA_FILTER8_LOW - 源地址过滤器 8 低 32 位 * - 0x1CC - SA_FILTER8_HIGH_MASK - 源地址过滤器 8 高 32 位掩码 * - 0x1D0 - SA_FILTER9_LOW - 源地址过滤器 9 低 32 位 * - 0x1D4 - SA_FILTER9_HIGH_MASK - 源地址过滤器 9 高 32 位掩码 * - 0x1D8 - SA_FILTER10_LOW - 源地址过滤器 10 低 32 位 * - 0x1DC - SA_FILTER10_HIGH_MASK - 源地址过滤器 10 高 32 位掩码 * - 0x1E0 - SA_FILTER11_LOW - 源地址过滤器 11 低 32 位 * - 0x1E4 - SA_FILTER11_HIGH_MASK - 源地址过滤器 11 高 32 位掩码 * - 0x1E8 - SA_FILTER12_LOW - 源地址过滤器 12 低 32 位 * - 0x1EC - SA_FILTER12_HIGH_MASK - 源地址过滤器 12 高 32 位掩码 * - 0x1F0 - SA_FILTER13_LOW - 源地址过滤器 13 低 32 位 * - 0x1F4 - SA_FILTER13_HIGH_MASK - 源地址过滤器 13 高 32 位掩码 * - 0x1F8 - SA_FILTER14_LOW - 源地址过滤器 14 低 32 位 * - 0x1FC - SA_FILTER14_HIGH_MASK - 源地址过滤器 14 高 32 位掩码 * - 0x200 - SA_FILTER15_LOW - 源地址过滤器 15 低 32 位 * - 0x204 - SA_FILTER15_HIGH_MASK - 源地址过滤器 15 高 32 位掩码 * - 0x208 - SA_FILTER16_LOW - 源地址过滤器 16 低 32 位 * - 0x20C - SA_FILTER16_HIGH_MASK - 源地址过滤器 16 高 32 位掩码 * - 0x210 - SA_FILTER17_LOW - 源地址过滤器 17 低 32 位 * - 0x214 - SA_FILTER17_HIGH_MASK - 源地址过滤器 17 高 32 位掩码 * - 0x218 - SA_FILTER18_LOW - 源地址过滤器18低32位 * - 0x21C - SA_FILTER18_HIGH_MASK - 源地址过滤器 18 高 32 位掩码 * - 0x220 - SA_FILTER19_LOW - 源地址过滤器 19 低 32 位 * - 0x224 - SA_FILTER19_HIGH_MASK - 源地址过滤器 19 高 32 位掩码 * - 0x228 - SA_FILTER20_LOW - 源地址过滤器 20 低 32 位 * - 0x22C - SA_FILTER20_HIGH_MASK - 源地址过滤器 20 高 32 位掩码 * - 0x230 - SA_FILTER21_LOW - 源地址过滤器 21 低 32 位 * - 0x234 - SA_FILTER21_HIGH_MASK - 源地址过滤器 21 高 32 位掩码 * - 0x238 - SA_FILTER22_LOW - 源地址过滤器 22 低 32 位 * - 0x23C - SA_FILTER22_HIGH_MASK - 源地址过滤器 22 高 32 位掩码 * - 0x240 - SA_FILTER23_LOW - 源地址过滤器 23 低 32 位 * - 0x244 - SA_FILTER23_HIGH_MASK - 源地址过滤器 23 高 32 位掩码 * - 0x248 - SA_FILTER24_LOW - 源地址过滤器 24 低 32 位 * - 0x24C - SA_FILTER24_HIGH_MASK - 源地址过滤器 24 高 32 位掩码 * - 0x250 - SA_FILTER25_LOW - 源地址过滤器 25 低 32 位 * - 0x254 - SA_FILTER25_HIGH_MASK - 源地址过滤器 25 高 32 位掩码 * - 0x258 - SA_FILTER26_LOW - 源地址过滤器 26 低 32 位 * - 0x25C - SA_FILTER26_HIGH_MASK - 源地址过滤器 26 高 32 位掩码 * - 0x260 - SA_FILTER27_LOW - 源地址过滤器 27 低 32 位 * - 0x264 - SA_FILTER27_HIGH_MASK - 源地址过滤器 27 高 32 位掩码 * - 0x268 - SA_FILTER28_LOW - 源地址过滤器 28 低 32 位 * - 0x26C - SA_FILTER28_HIGH_MASK - 源地址过滤器 28 高 32 位掩码 * - 0x270 - SA_FILTER29_LOW - 源地址过滤器 29 低 32 位 * - 0x274 - SA_FILTER29_HIGH_MASK - 源地址过滤器 29 高 32 位掩码 * - 0x278 - SA_FILTER30_LOW - 源地址过滤器 30 低 32 位 * - 0x27C - SA_FILTER30_HIGH_MASK - 源地址过滤器 30 高 32 位掩码 * - 0x280 - SA_FILTER31_LOW - 源地址过滤器 31 低 32 位 * - 0x284 - SA_FILTER31_HIGH_MASK - 源地址过滤器 31 高 32 位掩码 * - 0x288 - DA_FILTER0_LOW - 目的地址过滤器 0 低 32 位 * - 0x28C - DA_FILTER0_HIGH_MASK - 目的地址过滤器 0 高 32 位掩码 * - 0x290 - DA_FILTER1_LOW - 目的地址过滤器 1 低 32 位 * - 0x294 - DA_FILTER1_HIGH_MASK - 目的地址过滤器 1 高 32 位掩码 * - 0x298 - DA_FILTER2_LOW - 目的地址过滤器 2 低 32 位 * - 0x29C - DA_FILTER2_HIGH_MASK - 目的地址过滤器 2 高 32 位掩码 * - 0x2A0 - DA_FILTER3_LOW - 目的地址过滤器 3 低 32 位 * - 0x2A4 - DA_FILTER3_HIGH_MASK - 目的地址过滤器 3 高 32 位掩码 * - 0x2A8 - DA_FILTER4_LOW - 目的地址过滤器 4 低 32 位 * - 0x2AC - DA_FILTER4_HIGH_MASK - 目的地址过滤器 4 高 32 位掩码 * - 0x2B0 - DA_FILTER5_LOW - 目的地址过滤器 5 低 32 位 * - 0x2B4 - DA_FILTER5_HIGH_MASK - 目的地址过滤器 5 高 32 位掩码 * - 0x2B8 - DA_FILTER6_LOW - 目的地址过滤器 6 低 32 位 * - 0x2BC - DA_FILTER6_HIGH_MASK - 目的地址过滤器 6 高 32 位掩码 * - 0x2C0 - DA_FILTER7_LOW - 目的地址过滤器 7 低 32 位 * - 0x2C4 - DA_FILTER7_HIGH_MASK - 目的地址过滤器 7 高 32 位掩码 * - 0x2C8 - DA_FILTER8_LOW - 目的地址过滤器 8 低 32 位 * - 0x2CC - DA_FILTER8_HIGH_MASK - 目的地址过滤器 8 高 32 位掩码 * - 0x2D0 - DA_FILTER9_LOW - 目的地址过滤器 9 低 32 位 * - 0x2D4 - DA_FILTER9_HIGH_MASK - 目的地址过滤器 9 高 32 位掩码 * - 0x2D8 - DA_FILTER10_LOW - 目的地址过滤器 10 低 32 位 * - 0x2DC - DA_FILTER10_HIGH_MASK - 目的地址过滤器 10 高 32 位掩码 * - 0x2E0 - DA_FILTER11_LOW - 目的地址过滤器 11 低 32 位 * - 0x2E4 - DA_FILTER11_HIGH_MASK - 目的地址过滤器 11 高 32 位掩码 * - 0x2E8 - DA_FILTER12_LOW - 目的地址过滤器 12 低 32 位 * - 0x2EC - DA_FILTER12_HIGH_MASK - 目的地址过滤器 12 高 32 位掩码 * - 0x2F0 - DA_FILTER13_LOW - 目的地址过滤器 13 低 32 位 * - 0x2F4 - DA_FILTER13_HIGH_MASK - 目的地址过滤器13高32位掩码 * - 0x2F8 - DA_FILTER14_LOW - 目的地址过滤器 14 低 32 位 * - 0x2FC - DA_FILTER14_HIGH_MASK - 目的地址过滤器 14 高 32 位掩码 * - 0x300 - DA_FILTER15_LOW - 目的地址过滤器 15 低 32 位 * - 0x304 - DA_FILTER15_HIGH_MASK - 目的地址过滤器 15 高 32 位掩码 * - 0x308 - DA_FILTER16_LOW - 目的地址过滤器 16 低 32 位 * - 0x30C - DA_FILTER16_HIGH_MASK - 目的地址过滤器 16 高 32 位掩码 * - 0x310 - DA_FILTER17_LOW - 目的地址过滤器 17 低 32 位 * - 0x314 - DA_FILTER17_HIGH_MASK - 目的地址过滤器 17 高 32 位掩码 * - 0x318 - DA_FILTER18_LOW - 目的地址过滤器 18 低 32 位 * - 0x31C - DA_FILTER18_HIGH_MASK - 目的地址过滤器 18 高 32 位掩码 * - 0x320 - DA_FILTER19_LOW - 目的地址过滤器 19 低 32 位 * - 0x324 - DA_FILTER19_HIGH_MASK - 目的地址过滤器 19 高 32 位掩码 * - 0x328 - DA_FILTER20_LOW - 目的地址过滤器 20 低 32 位 * - 0x32C - DA_FILTER20_HIGH_MASK - 目的地址过滤器 20 高 32 位掩码 * - 0x330 - DA_FILTER21_LOW - 目的地址过滤器 21 低 32 位 * - 0x334 - DA_FILTER21_HIGH_MASK - 目的地址过滤器 21 高 32 位掩码 * - 0x338 - DA_FILTER22_LOW - 目的地址过滤器 22 低 32 位 * - 0x33C - DA_FILTER22_HIGH_MASK - 目的地址过滤器 22 高 32 位掩码 * - 0x340 - DA_FILTER23_LOW - 目的地址过滤器 23 低 32 位 * - 0x344 - DA_FILTER23_HIGH_MASK - 目的地址过滤器 23 高 32 位掩码 * - 0x348 - DA_FILTER24_LOW - 目的地址过滤器 24 低 32 位 * - 0x34C - DA_FILTER24_HIGH_MASK - 目的地址过滤器 24 高 32 位掩码 * - 0x350 - DA_FILTER25_LOW - 目的地址过滤器 25 低 32 位 * - 0x354 - DA_FILTER25_HIGH_MASK - 目的地址过滤器 25 高 32 位掩码 * - 0x358 - DA_FILTER26_LOW - 目的地址过滤器 26 低 32 位 * - 0x35C - DA_FILTER26_HIGH_MASK - 目的地址过滤器 26 高 32 位掩码 * - 0x360 - DA_FILTER27_LOW - 目的地址过滤器 27 低 32 位 * - 0x364 - DA_FILTER27_HIGH_MASK - 目的地址过滤器 27 高 32 位掩码 * - 0x368 - DA_FILTER28_LOW - 目的地址过滤器 28 低 32 位 * - 0x36C - DA_FILTER28_HIGH_MASK - 目的地址过滤器 28 高 32 位掩码 * - 0x370 - DA_FILTER29_LOW - 目的地址过滤器 29 低 32 位 * - 0x374 - DA_FILTER29_HIGH_MASK - 目的地址过滤器 29 高 32 位掩码 * - 0x378 - DA_FILTER30_LOW - 目的地址过滤器 30 低 32 位 * - 0x37C - DA_FILTER30_HIGH_MASK - 目的地址过滤器 30 高 32 位掩码 * - 0x380 - DA_FILTER31_LOW - 目的地址过滤器 31 低 32 位 * - 0x384 - DA_FILTER31_HIGH_MASK - 目的地址过滤器 31 高 32 位掩码 MAC_CTRL_REG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x0`` .. list-table:: **表 7.2 MAC_CTRL_REG 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TXEN - 0 - 读/写 - 0 - MAC 发送使能 * 1'b0: 禁用 * 1'b1: 使能 * - RXEN - 1 - 读/写 - 0 - MAC 接收使能 * 1'b0: 禁用 * 1'b1: 使能 * - TXFC - 2 - 读/写 - 1 - 发送流控制使能 * 1'b0: 禁用 * 1'b1: 使能 * - RXFC - 3 - 读/写 - 1 - 接收流控制使能 * 1'b0: 禁用 * 1'b1: 使能 * - MAC_LP_EN - 4 - 读/写 - 0 - MAC 内部环回 * 1'b0: 禁用 * 1'b1: 使能 * - FULL_DUPLEX - 5 - 读/写 - 1 - MAC 全双工/半双工工作模式 * 1'b0: 半双工模式 * 1'b1: 全双工模式 * - CRCE - 6 - 读/写 - 1 - 发送 CRC 使能 * 1'b0: MAC 不会为发送的数据包附加 CRC。 * 1'b1: 指示 MAC 为发送的数据包附加 CRC。 注意:如果数据包小于 64 字节,MAC 将始终启用填充(pad)功能。 * - FLCHK - 7 - 读/写 - 1 - 长度检查使能 * 1'b0: MAC 不会检查接收数据包的长度字段是否与实际包长匹配。 * 1'b1: MAC 会检查接收数据包的长度字段是否与实际包长匹配。 * - PRLEN - 11:8 - 读/写 - 7 - 前导码长度,标准值为 0x07 * - 保留 - 12 - / - 0x0 - / * - VLAN_STRIP - 13 - 读/写 - 1 - 是否自动为接收的数据包移除VLAN标签 * 1'b0: 否 * 1'b1: 是 * - PROM_MODE - 14 - 读/写 - 0 - 混杂模式使能 * 1'b0: 禁用 * 1'b1: 使能 * - TX_IP_SUM_EN - 15 - 读/写 - 1 - 当TX_PARSER_EN使能时,由硬件卸载IP校验和 * 1'b0: 禁用 * 1'b1: 使能 * - TX_TCP_ICMP_SUM_EN - 16 - 读/写 - 1 - 当TX_PARSER_EN使能时,由硬件卸载TCP和ICMP校验和 * 1'b0: 禁用 * 1'b1: 使能 * - TX_UDP_SUM_EN - 17 - 读/写 - 1 - 当 TX_PARSER_EN 使能时,由硬件卸载 UDP 校验和 * 1'b0: 禁用 * 1'b1: 使能 * - SPEED - 19:18 - 读/写 - 1 - MAC 速度选择 * 2'b10: 1000M * 2'b01: 100M * 2'b00: 10M * - MII_MODE - 21:20 - 读/写 - 0 - MAC-PHY 接口模式 * 2'b00: GMII * 2'b01: RGMII * 2'b10: MII * 2'b11: RMII * - TX_PARSER_EN - 22 - 读/写 - 0 - 是否进行发送数据包解析 * 1'b0: 否 * 1'b1: 是 * - RX_CHKSUM_EN - 23 - 读/写 - 1 - 接收校验和使能 * 1'b0: 禁用 * 1'b1: 使能 * - MULTI_ALL - 24 - 读/写 - 1 - 所有多播目的地址均为合法。 * 1'b0: 否 * 1'b1: 是 * - RX_HASH_EN - 25 - 读/写 - 0 - 命中了哈希表的多播目的地址为合法 * 1'b0: 否 * 1'b1: 是 * - BROAD_EN - 26 - 读/写 - 1 - 无错误地将所有广播帧上传至系统 * 1'b0: 否 * 1'b1: 是 * - DEBUG_MODE - 27 - 读/写 - 0 - 将所有接收到的帧上传至系统 * 1'b0: 否 * 1'b1: 是 * - SYS_CLK_IS_125 - 28 - 读/写 - 0 - 指示系统时钟(sys_clk)是否为 125MHz * 1'b0: 否 * 1'b1: 是 * - SYS_CLK_IS_25 - 29 - 读/写 - 1 - 指示系统时钟(sys_clk)是否为 25MHz * 1'b0: 否 * 1'b1: 是 * - RMII_MODE - 30 - 读/写 - 1 - 选择 RMII 工作模式 * 1'b0: RMII 从模式:PHY 将通过 gmii_rxc 引脚向 MAC 提供 rmii_clk 参考时钟。 * 1'b1: RMII 主模式:MAC 将通过 gmii_txc 引脚向 PHY 提供 rmii_clk 参考时钟。 注意:此位仅在 RMII 模式下有意义。 * - MAGIC_FRAME_EN - 31 - 读/写 - 0 - 魔术帧检测功能 * 1'b0: 禁用 * 1'b1: 使能 MAC_IPG_REG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x4`` .. list-table:: **表 7.3 MAC_IPG_REG 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_IPG - 6:0 - 读/写 - 96 - 最小背靠背发送包间隔 * - 保留 - 7 - / - 0 - 保留 * - RX_IPG - 15:8 - 读/写 - 8 - 对背靠背接收帧的最小间隔要求。间隔低于此值的帧将被视为非法。 * - 保留 - 16 - / - 0 - 保留 * - RGMII_100M_RX_NEG_SEL - 17 - 读/写 - 0 - 为 rgmii_100m 模式选择在正沿或负沿采样接收数据 * 1'b0: 在 XMII 接口使用延迟的 rxclk 采样 rxdata * 1'b1: 在 XMII 接口使用 rxclk 的负沿采样 rxdata * - RGMII_100M_TX_NEG_SEL - 18 - 读/写 - 0 - 为 rgmii_100m 模式选择在正沿或负沿输出发送数据 * 1'b0: 在 XMII 接口使用 txclk 的正沿输出 txdata * 1'b1: 在 XMII 接口使用 txclk 的负沿输出 txdata * - RMII_RX_NEG_SEL - 19 - 读/写 - 0 - 为 rmii 模式选择在正沿或负沿采样接收数据 * 1'b0: 在 XMII 接口使用 rxclk 的正沿采样 rxdata * 1'b1: 在 XMII 接口使用 rxclk 的负沿采样 rxdata * - RMII_TX_NEG_SEL - 20 - 读/写 - 0x1 - 为 rmii 模式选择在正沿或负沿输出发送数据 * 1'b0: 对于 RMII 主模式,在 txclk 的正沿输出 txdata;对于 RMII 从模式,在 txclk 的负沿输出 txdata; * 1'b1: 对于 RMII 主模式,在 txclk 的负沿输出 txdata;对于 RMII 从模式,在 txclk 的正沿输出 txdata; * - MII_RX_NEG_SEL - 21 - 读/写 - 0 - 为 mii/gmii 模式选择在正沿或负沿采样接收数据 * 1'b0: 在 XMII 接口使用 rxclk 的正沿采样 rxdata * 1'b1: 在 XMII 接口使用 rxclk 的负沿采样 rxdata * - MII_TX_NEG_SEL - 22 - 读/写 - 0x1 - 为 mii/gmii 模式选择在正沿或负沿输出发送数据 * 1'b0: 在 XMII 接口使用 txclk 的正沿输出 txdata * 1'b1: 在 XMII 接口使用 txclk 的负沿输出 txdata * - 保留 - 31:23 - 读/写 - 0 - 保留 MAC_HALF_CTRL_REG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x8`` .. list-table:: **表 7.4 MAC_HALF_CTRL_REG 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RETRY_NUM - 3:0 - 读/写 - 10 - 发生冲突时的最大重试次数 * - BACKOFF_EN - 4 - 读/写 - 1 - 退避使能 * 1'b0: 冲突后不退避 * 1'b1: 冲突后会有退避等待 * - 保留 - 31:5 - 读/写 - 0 - 保留 MAC_MTU_REG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xC`` .. list-table:: **表 7.5 MAC_MTU_REG 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - MTU - 15:0 - 读/写 - 1536 - 最大帧大小 * - 保留 - 31:16 - / - 0 - 保留 MAC_STAD_LO_REG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x10`` .. list-table:: **表 7.6 MAC_STAD_LO_REG 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - STAD_LO - 31:0 - 读/写 - 0 - MAC 的单播站地址(低32位) MAC_STAD_HI_REG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x14`` .. list-table:: **表 7.7 MAC_STAD_HI_REG 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - STAD_HI - 15:0 - 读/写 - 0 - MAC 的单播站地址(高16位) * - 保留 - 31:16 - / - 0 - 保留 MAC_LPI_REG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x18`` .. list-table:: **表 7.8 MAC_LPI_REG 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - LPI_ENTER_CNT - 15:0 - 读/写 - 21 - 进入 LPI 模式前等待的空闲时间,每一步表示 2us * - LPI_WT - 23:16 - 读/写 - 21 - 退出 LPI 模式前的等待时间,每一步表示 2us * - RX_IN_LPI - 24 - 只读 - 0 - RX 处于 LPI 状态 * 1'b0: 否 * 1'b1: 是 * - TX_IN_LPI - 25 - 只读 - 0 - TX 处于 LPI 状态 * 1'b0: 否 * 1'b1: 是 * - 保留 - 30:26 - / - 0 - 保留 * - LPI_EN - 31 - 读/写 - 0 - 使能 802.3AZ 功能 * 1'b0: 禁用 * 1'b1: 使能 RX_HASH_TABLE1_REG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x1C`` .. list-table:: **表 7.9 RX_HASH_TABLE1_REG 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_HASH_TABLE_LO - 31:0 - 读/写 - 21 - 接收哈希表(低32位) RX_HASH_TABLE2_REG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x20`` .. list-table:: **表 7.10 RX_HASH_TABLE2_REG 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_HASH_TABLE_HI - 31:0 - 读/写 - 21 - 接收哈希表(高32位) SRAM_CTRL_REG_1 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x24`` .. list-table:: **表 7.11 SRAM_CTRL_REG_1 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RFD_HEAD_ADDR - 10:0 - 读/写 - 960 - 接收空闲描述符(RFD)环在内部 SRAM 中的头地址 * - 保留 - 11 - / - 0 - 保留 * - RFD_TAIL_ADDR - 22:12 - 读/写 - 1023 - 接收空闲描述符(RFD)环在内部 SRAM 中的尾地址 * - 保留 - 23 - / - 0 - 保留 * - XEC_RFD_LEN - 31:24 - 读/写 - 64 - SRAM 中 RFD FIFO 的深度 SRAM_CTRL_REG_2 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x28`` .. list-table:: **表 7.12 SRAM_CTRL_REG_2 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TRD_HEAD_ADDR - 10:0 - 读/写 - 1504 - 发送控制字(TPD)在内部 SRAM 中的头地址 * - 保留 - 11 - / - 0 - 保留 * - TRD_TAIL_ADDR - 22:12 - 读/写 - 1535 - 发送控制字(TPD)在内部 SRAM 中的尾地址 * - 保留 - 23 - / - 0 - 保留 * - XEC_TRD_LEN - 31:24 - 读/写 - 32 - SRAM 中发送控制字 FIFO 的深度 SRAM_CTRL_REG_3 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x2C`` .. list-table:: **表 7.13 SRAM_CTRL_REG_3 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RXF_HEAD_ADDR - 10:0 - 读/写 - 0 - SRAM 中接收数据(RXD)区域的起始地址 * - 保留 - 11 - / - 0 - 保留 * - RXF_TAIL_ADDR - 22:12 - 读/写 - 959 - 内部 SRAM 中 RX FIFO 的尾地址 * - 保留 - 31:23 - / - 0 - 保留 SRAM_CTRL_REG_4 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x30`` .. list-table:: **表 7.14 SRAM_CTRL_REG_4 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TXF_HEAD_ADDR - 10:0 - 读/写 - 1024 - 内部 SRAM 中 TX FIFO 的头地址 * - 保留 - 11 - / - 0 - 保留 * - TXF_TAIL_ADDR - 22:12 - 读/写 - 1503 - 内部 SRAM 中 TX FIFO 的尾地址 * - 保留 - 31:23 - / - 0 - 保留 SRAM_CTRL_REG_5 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x34`` .. list-table:: **表 7.15 SRAM_CTRL_REG_5 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - XEC_RXF_LEN - 10:0 - 读/写 - 960 - SRAM 中 RXD FIFO 的深度 * - 保留 - 11 - / - 0 - 保留 * - XEC_TXF_LEN - 22:12 - 读/写 - 480 - SRAM 中 TXD FIFO 的深度 * - 保留 - 31:23 - / - 0 - 保留 SRAM_CTRL_REG_6 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x38`` .. list-table:: **表 7.16 SRAM_CTRL_REG_6 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - LOAD_PTR - 0 - 读/写 - 0 - 当 SRAM 配置改变时,软件设置此位以复位 SRAM 指针,它将在下一个周期自动清零 * - 保留 - 31:1 - / - 0 - 保留 DESCRIPTOR_CTRL_REG_2 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x40`` .. list-table:: **表 7.17 DESCRIPTOR_CTRL_REG_2 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RFD_BASE_ADDR_LO_0TO2 - 2:0 - 只读 - 0 - RFD 环的基地址,低32位,位[2:0] * - RFD_BASE_ADDR_LO_3TO31 - 31:3 - 读/写 - 0 - RFD 环的基地址,低32位,位[31:3] DESCRIPTOR_CTRL_REG_3 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x44`` .. list-table:: **表 7.18 DESCRIPTOR_CTRL_REG_3 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RRD_BASE_ADDR_LO_0TO2 - 2:0 - 只读 - 0 - RRD 环的基地址,低32位,位[2:0] * - RRD_BASE_ADDR_LO_3TO31 - 31:3 - 读/写 - 0 - RRD 环的基地址,低32位,位[31:3] DESCRIPTOR_CTRL_REG_4 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x48`` .. list-table:: **表 7.19 DESCRIPTOR_CTRL_REG_4 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RFD_RRD_RING_SIZE - 11:0 - 读/写 - 0x800 - RFD 和 RRD 环中的描述符数量 * - 保留 - 15:12 - / - 0 - 保留 * - RX_BUFFER_SIZE_0TO2 - 18:16 - 只读 - 0 - 每个 RFD 的缓冲区大小,位[2:0] * - RX_BUFFER_SIZE_3TO11 - 27:19 - 读/写 - 0xC0 - 每个 RFD 的缓冲区大小,位[11:3] * - 保留 - 31:28 - / - 0 - 保留 DESCRIPTOR_CTRL_REG_5 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x4C`` .. list-table:: **表 7.20 DESCRIPTOR_CTRL_REG_5 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - 保留 - 15:0 - / - 0 - 保留 * - TPD_RING_SIZE - 31:16 - 读/写 - 0x800 - TPD 环中的描述符数量 DESCRIPTOR_CTRL_REG_7 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x54`` .. list-table:: **表 7.21 DESCRIPTOR_CTRL_REG_7 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TPD_BASE_ADDR_LO_0TO3 - 3:0 - 只读 - 0 - TPD 环的基地址,低32位,位[3:0] * - TPD_BASE_ADDR_LO_4TO31 - 31:4 - 读/写 - 0 - TPD 环的基地址,低32位,位[31:4] CMB_BASE_ADDR_LO ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x5C`` .. list-table:: **表 7.22 CMB_BASE_ADDR_LO 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - CMB_BASE_ADDR_LO_0 - 0 - 只读 - 0 - CMB 的基地址,低32位,位[0] * - CMB_BASE_ADDR_LO_1TO31 - 31:1 - 读/写 - 0 - CMB 的基地址,低32位,位[31:1] DMA_BURST_CTRL_1 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x60`` .. list-table:: **表 7.23 DMA_BURST_CTRL_1 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - NUM_TPD_BURST_PREF - 2:0 - 读/写 - 5 - 单个 DMA 请求中预取的 TPD 描述符数量。最大配置值为 5 * - 保留 - 31:3 - / - 0 - 保留 DMA_BURST_CTRL_2 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x64`` .. list-table:: **表 7.24 DMA_BURST_CTRL_2 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - NUM_RFD_BURST_PREF - 3:0 - 读/写 - 8 - 单个 DMA 请求中预取的 RFD 描述符数量,最大配置值为8 * - 保留 - 6:4 - / - 0 - 保留 * - CUT_THRU_EN - 7 - 读/写 - 0 - 允许在包结束前将包数据更新到主机内存(直通模式) * 1'b0: 包将存储在 SRAM 中直到包结束(EOP) * 1'b1: 当包超过1536字节或超过 rx_buffer_size 时,允许在 EOP 之前更新包。 注意:如果支持巨型包(jumbo packet),此位必须设置为1。 * - 保留 - 31:8 - / - 0 - 保留 FC_WATERMARK_REG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x68`` .. list-table:: **表 7.25 FC_WATERMARK_REG 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - FC_UOF_WATERMARK - 10:0 - 读/写 - 575 - 当 Rx SRAM 的已用空间超过此值且 TXFC 被设置时,MAC 发送 XON 帧,单位为8字节 * - 保留 - 15:11 - / - 0 - 保留 * - CUT_THRFC_DOF_WATERMARKU_EN - 26:16 - 读/写 - 447 - 当 Rx SRAM 的已用空间低于此值且 TXFC 被设置时,MAC 发送 XOFF 帧,单位为8字节 * - 保留 - 31:27 - / - 0 - 保留 CMB_CTR_REG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x6C`` .. list-table:: **表 7.26 CMB_CTR_REG 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - CMB_THRESHOLD - 15:0 - 读/写 - 256 - 当已使用的 TPD 超过此阈值时,触发 CMB 请求 * - CMB_TIMER - 30:16 - 读/写 - 0x7fff - 触发 CMB 请求的倒计时定时器,0表示禁用此功能,单位为2us * - CMB_EN - 31 - 读/写 - 0 - 使能或禁用 CMB 功能 * 1'b0: 禁用 * 1'b1: 使能 MAILBOX_REG_1 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x70`` .. list-table:: **表 7.27 MAILBOX_REG_1 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RFD_PROD_IDX - 11:0 - 读/写 - 0 - RFD 生产者索引 * - 保留 - 14:12 - / - 0 - 保留 * - RFD_CONS_IDX - 26:15 - 只读 - 0 - RFD 消费者索引 * - 保留 - 31:27 - / - 0 - 保留 MAILBOX_REG_2 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x74`` .. list-table:: **表 7.28 MAILBOX_REG_2 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TPD_PROD_IDX - 15:0 - 读/写 - 0 - TPD 生产者索引 * - TPD_CONS_IDX - 31:16 - 只读 - 0 - TPD 消费者索引 INT_STA_REG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x78`` .. list-table:: **表 7.29 INT_STA_REG 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RXP_OF_INT - 0 - 写1清0 - 0 - RX FIFO 满中断,写1清除 * - RFD_UR_INT - 1 - 写1清0 - 0 - RFD 环空(下溢)中断,写1清除 * - TXF_UR_INT - 2 - 写1清0 - 0 - TXF 下溢中断,写1清除 * - DMAR_TO_INT - 3 - 写1清0 - 0 - DMAR 操作超时中断,写1清除 * - DMAW_TO_INT - 4 - 写1清0 - 0 - DMAW 操作超时中断,写1清除 * - TX_PKT_INT - 5 - 写1清0 - 0 - 一个报文已发送到 PHY,写1清除 * - RX_PKT_INT - 6 - 写1清0 - 0 - 一个报文已接收并上传到主机内存,写1清除 * - DMAW_BUS_ERR_INT - 7 - 写1清0 - 0 - DMAW 总线错误中断,写1清除 * - DMAR_BUS_ERR_INT - 8 - 写1清0 - 0 - DMAR 总线错误中断,写1清除 * - CMB_INT - 9 - 写1清0 - 0 - CMB DMA 写操作完成,写1清除 * - MAGIC_FRAME_INT - 10 - 写1清0 - 0 - 检测到魔术包,写1清除 * - RX_PTP_EVENT_INT - 11 - 写1清0 - 0 - 接收到一个 PTP 事件包并上传到主机内存,写1清除 * - TX_PTP_EVENT_INT - 12 - 写1清0 - 0 - 发送出一个 PTP 事件包到 PHY,写1清除 * - 保留 - 31:13 - / - 0x0 - / INT_MSK_REG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x7C`` .. list-table:: **表 7.30 INT_MSK_REG 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - INT_MASK - 12:0 - 读/写 - 0 - 设置为1以屏蔽相应的中断。位0屏蔽 int_status 位0,依此类推。1表示屏蔽中断,0表示中断有效 * - 保留 - 30:13 - / - 0 - 保留 * - DIS_INT - 31 - 读/写 - 0 - 禁用所有中断 * 1'b0: 允许中断 * 1'b1: 禁用中断 INTR_TIMER2_REG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x80`` .. list-table:: **表 7.31 INTR_TIMER2_REG 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - INTR_MOD_RX_TIMER - 15:0 - 读/写 - 0x8 - 用于 rx_pkt_int 的中断调节定时器,收到 rx_pkt_int 后,等待该定时器再断言 top_int 以合并 rx_pkt_int,步长为 2us,0 表示不合并 * - INTR_MOD_TX_TIMER - 31:16 - 读/写 - 0xff - 用于 tx_pkt_int 的中断调节定时器,收到 tx_pkt_int 后,等待该定时器再断言 top_int 以合并 tx_pkt_int,步长为 2us,0 表示不合并 MAC_RX_OK ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x84`` .. list-table:: **表 7.32 MAC_RX_OK 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_OK - 23:0 - 读后清0 - 0 - 接收的正确报文数量。正确意味着无 MAC 层错误。读出时清零 * - 保留 - 31:24 - / - 0 - 保留 MAC_RX_BCAST ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x88`` .. list-table:: **表 7.33 MAC_RX_BCAST 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_BCAST - 23:0 - 读后清0 - 0 - 接收的正确广播报文数量。正确意味着无 MAC 层错误。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_RX_MCAST ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x8C`` .. list-table:: **表 7.34 MAC_RX_MCAST 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_MCAST - 23:0 - 读后清0 - 0 - 接收的正确组播报文(不包括暂停帧)数量。正确意味着无 MAC 层错误。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_RX_PAUSE ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x90`` .. list-table:: **表 7.35 MAC_RX_PAUSE 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_PAUSE - 23:0 - 读后清0 - 0 - 接收的暂停报文数量 * - 保留 - 31:24 - / - 0 - 保留 MAC_RX_LLDP ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x94`` .. list-table:: **表 7.36 MAC_RX_LLDP 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_LLDP - 23:0 - 读后清0 - 0 - 接收的 LLDP 报文数量。 * - 保留 - 31:24 - / - 0 - 保留 MAC_RX_FCS_ERR ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x98`` .. list-table:: **表 7.37 MAC_RX_FCS_ERR 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_FCS_ERR - 23:0 - 读后清0 - 0 - 接收的 FCS 错误报文数量 * - 保留 - 31:24 - / - 0 - 保留 MAC_RX_LEN_ERR ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x9C`` .. list-table:: **表 7.38 MAC_RX_LEN_ERR 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_LEN_ERR - 23:0 - 读后清0 - 0 - 接收的长度字段(46~1500)与实际大小不匹配的报文数量。 * - 保留 - 31:24 - / - 0 - 保留 MAC_RX_BYTE_CNT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xA0`` .. list-table:: **表 7.39 MAC_RX_BYTE_CNT 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_BYTE_CNT - 31:0 - 读后清0 - 0 - 接收的正确报文的字节总数。读出时清零。 MAC_RX_RUNT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xA4`` .. list-table:: **表 7.40 MAC_RX_RUNT 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_RUNT - 23:0 - 读后清0 - 0 - 接收的小于 64 字节且 FCS 正确的报文数量。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_RX_FRAGMENT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xA8`` .. list-table:: **表 7.41 MAC_RX_FRAGMENT 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_FRAGMENT - 23:0 - 读后清0 - 0 - 接收的小于 64 字节且 FCS 错误的报文数量。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_RX_SIZE_64 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xAC`` .. list-table:: **表 7.42 MAC_RX_SIZE_64 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_SIZE_64B - 23:0 - 读后清0 - 0 - 接收的64字节长的报文数量(包括好包和坏包)。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_RX_SIZE_65TO127 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xB0`` .. list-table:: **表 7.43 MAC_RX_SIZE_65TO127 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_SIZE_65TO127B - 23:0 - 读后清0 - 0 - 接收的长度在 65 到 127 字节之间的报文数量(包括好包和坏包)。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_RX_SIZE_128TO255 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xB4`` .. list-table:: **表 7.44 MAC_RX_SIZE_128TO255 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_SIZE_128TO255B - 23:0 - 读后清0 - 0 - 接收的长度在128到255字节之间的报文数量(包括好包和坏包)。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_RX_SIZE_256TO511 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xB8`` .. list-table:: **表 7.45 MAC_RX_SIZE_256TO511 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_SIZE_256TO511B - 23:0 - 读后清0 - 0 - 接收的长度在256到511字节之间的报文数量(包括好包和坏包)。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_RX_SIZE_512TO1023 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xBC`` .. list-table:: **表 7.46 MAC_RX_SIZE_512TO1023 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_SIZE_512TO1023B - 23:0 - 读后清0 - 0 - 接收的长度在512到1023字节之间的报文数量(包括好包和坏包)。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_RX_SIZE_1024TO1518 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xC0`` .. list-table:: **表 7.47 MAC_RX_SIZE_1024TO1518 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_SIZE_1024TO1518B - 23:0 - 读后清0 - 0 - 接收的长度在1024到1518字节之间的报文数量(包括好包和坏包)。读出时清零 * - 保留 - 31:24 - / - 0 - 保留 MAC_RX_SIZE_1519TOMAX ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xC4`` .. list-table:: **表 7.48 MAC_RX_SIZE_1519TOMAX 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_SIZE_1519TOMAX - 23:0 - 读后清0 - 0 - 接收的长度在1519字节到 MTU 之间的报文数量(包括好包和坏包)。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_RX_OVERSIZE ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xC8`` .. list-table:: **表 7.49 MAC_RX_OVERSIZE 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_OVERSIZE - 23:0 - 读后清0 - 0 - 接收的大于 MTU 大小的报文数量(包括好包和坏包)。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_RX_OVERFLOW ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xCC`` .. list-table:: **表 7.50 MAC_RX_OVERFLOW 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_OVERFLOW - 15:0 - 读后清0 - 0 - 因 RX FIFO 溢出而丢弃的帧数量。读出时清零。 * - 保留 - 31:16 - / - 0 - 保留 MAC_RX_NIBBLE_ERR ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xD0`` .. list-table:: **表 7.51 MAC_RX_NIBBLE_ERR 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_NIBBLE_ERR - 23:0 - 读后清0 - 0 - 接收的半字节错误报文数量。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_RX_BCAST_BYTE_CNT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xD4`` .. list-table:: **表 7.52 MAC_RX_BCAST_BYTE_CNT 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_BCAST_BYTE_CNT - 31:0 - 读后清0 - 0 - 接收的广播报文字节总数。报文应无 MAC 层错误。读出时清零。 MAC_RX_MCAST_BYTE_CNT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xD8`` .. list-table:: **表 7.53 MAC_RX_MCAST_BYTE_CNT 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_MCAST_BYTE_CNT - 31:0 - 读后清0 - 0 - 接收的组播报文(不包括暂停帧)字节总数。报文应无 MAC 层错误。读出时清零。 MAC_RX_ADDR_ERR ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xDC`` .. list-table:: **表 7.54 MAC_RX_ADDR_ERR 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_ADDR_ERR - 23:0 - 读后清0 - 0 - 目的地址或源地址错误的报文数量。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_TX_OK ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xE0`` .. list-table:: **表 7.55 MAC_TX_OK 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_OK - 23:0 - 读后清0 - 0 - 由软件驱动发送的正确报文数量。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_TX_BCAST ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xE4`` .. list-table:: **表 7.56 MAC_TX_BCAST 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_BCAST - 23:0 - 读后清0 - 0 - 发送的正确广播报文数量。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_TX_MCAST ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xE8`` .. list-table:: **表 7.57 MAC_TX_MCAST 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_MCAST - 23:0 - 读后清0 - 0 - 发送的正确组播报文(不包括暂停帧)数量。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_TX_PAUSE ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xEC`` .. list-table:: **表 7.58 MAC_TX_PAUSE 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_PAUSE - 23:0 - 读后清0 - 0 - 发送的暂停报文数量。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_TX_DEFFER ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xF0`` .. list-table:: **表 7.59 MAC_TX_DEFFER 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_DEFER - 23:0 - 读后清0 - 0 - 发送时因检测到载波而延迟的报文数量。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_TX_BYTE_CNT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xF4`` .. list-table:: **表 7.60 MAC_TX_BYTE_CNT 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_BYTE_CNT - 31:0 - 读后清0 - 0 - 发送的数据字节总数。读出时清零。 MAC_TX_SIZE_64B ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xF8`` .. list-table:: **表 7.61 MAC_TX_SIZE_64B 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_SIZE_64B - 23:0 - 读后清0 - 0 - 发送的64字节长的报文数量(包括好包和坏包)。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_TX_SIZE_65TO127 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0xFC`` .. list-table:: **表 7.62 MAC_TX_SIZE_65TO127 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_SIZE_65TO127B - 23:0 - 读后清0 - 0 - 发送的长度在65到127字节之间的报文数量(包括好包和坏包)。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_TX_SIZE_128TO255 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x100`` .. list-table:: **表 7.63 MAC_TX_SIZE_128TO255 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_SIZE_128TO255B - 23:0 - 读后清0 - 0 - 发送的长度在128到255字节之间的报文数量(包括好包和坏包)。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_TX_SIZE_256TO511 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x104`` .. list-table:: **表 7.64 MAC_TX_SIZE_256TO511 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_SIZE_256TO511B - 23:0 - 读后清0 - 0 - 发送的长度在256到511字节之间的报文数量(包括好包和坏包)。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_TX_SIZE_512TO1023 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x108`` .. list-table:: **表 7.65 MAC_TX_SIZE_512TO1023 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_SIZE_512TO1023B - 23:0 - 读后清0 - 0 - 发送的长度在512到1023字节之间的报文数量(包括好包和坏包)。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_TX_SIZE_1024TO1518 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x10C`` .. list-table:: **表 7.66 MAC_TX_SIZE_1024TO1518 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_SIZE_1024TO1518B - 23:0 - 读后清0 - 0 - 发送的长度在1024到1518字节之间的报文数量(包括好包和坏包)。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_TX_SIZE_1519TOMAX ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x110`` .. list-table:: **表 7.67 MAC_TX_SIZE_1519TOMAX 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_SIZE_1519TOMAX - 23:0 - 读后清0 - 0 - 发送的长度在1519字节到 MTU 之间的报文数量(包括好包和坏包)。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_TX_SINGLE_COL ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x114`` .. list-table:: **表 7.68 MAC_TX_SINGLE_COL 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_SINGLE_COL - 23:0 - 读后清0 - 0 - 单次冲突后成功发送的报文数量。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_TX_MULT_COL ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x118`` .. list-table:: **表 7.69 MAC_TX_MULT_COL 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_MULT_COL - 23:0 - 读后清0 - 0 - 多次冲突后成功发送的报文数量。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_TX_LATE_COL ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x11C`` .. list-table:: **表 7.70 MAC_TX_LATE_COL 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_LATE_COL - 23:0 - 读后清0 - 0 - 发送时遇到晚期冲突的报文数量。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_TX_ABORT_COL ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x120`` .. list-table:: **表 7.71 MAC_TX_ABORT_COL 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_ABORT_COL - 23:0 - 读后清0 - 0 - 因过度冲突而中止发送的报文数量。读出时清零。 * - 保留 - 31:24 - / - 0 - 保留 MAC_TX_UNDERRUN ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x124`` .. list-table:: **表 7.72 MAC_TX_UNDERRUN 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_UNDERRUN - 15:0 - 读后清0 - 0 - 因发送 FIFO 下溢而中止发送的报文数量。读出时清零。 * - 保留 - 31:16 - / - 0 - 保留 MAC_TX_LENGTH_ERR ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x128`` .. list-table:: **表 7.73 MAC_TX_LENGTH_ERR 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_LENGTH_ERR - 15:0 - 读后清0 - 0 - 发送的报文中长度字段(46~1500)与实际帧大小不匹配的数量。读出时清零。 * - 保留 - 31:16 - / - 0 - 保留 MAC_TX_TRUNC ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x12C`` .. list-table:: **表 7.74 MAC_TX_TRUNC 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_TRUNC - 15:0 - 读后清0 - 0 - 发送的大小超过 MTU 的报文数量。读出时清零。 * - 保留 - 31:16 - / - 0 - 保留 MAC_TX_BCAST_BYTE_CNT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x130`` .. list-table:: **表 7.75 MAC_TX_BCAST_BYTE_CNT 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_BCAST_BYTE_CNT - 31:0 - 读后清0 - 0 - 发送的广播报文字节总数。读出时清零。 MAC_TX_MCAST_BYTE_CNT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x134`` .. list-table:: **表 7.76 MAC_TX_MCAST_BYTE_CNT 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_MCAST_BYTE_CNT - 31:0 - 读后清0 - 0 - 发送的组播报文(不包括暂停帧)字节总数。读出时清零。 MDIO_CTRL_REG_1 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x138`` .. list-table:: **表 7.77 MDIO_CTRL_REG_1 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - MDIO_DATA - 15:0 - 读/写 - 0 - 在 MDIO 写操作时,要写入 PHY 寄存器的16位控制数据。 * - MDIO_REG_ADDR - 20:16 - 读/写 - 0 - MDIO 寄存器地址 * - MDIO_RD_WR - 21 - 读/写 - 0 - 选择 MDIO 的写/读模式 * 1'b0: MDIO 写 * 1'b1: MDIO 读 * - 保留 - 22 - / - 0 - 保留 * - MDIO_START - 23 - 读/写 - 0 - 写1启动 MDIO 操作。此位在一个周期后自清零 * - MDIO_CLK_SEL - 26:24 - 读/写 - 0 - MDC 频率选择控制,MDC 频率不应超过 2.5MHz。需要配置分频值使 MDC 频率不超过 2.5MHz。 * 3'd0: sysclk_div2: 频率 / 2 * 3'd1: sysclk_div4: 频率 / 4 * 3'd2: sysclk_div8: 频率 / 8 * 3'd3: sysclk_div16: 频率 / 16 * 3'd4: sysclk_div32: 频率 / 32 * 3'd5: sysclk_div64: 频率 / 64 * 3'd6: sysclk_div128: 频率 / 128 * 3'd7: sysclk_div128: 频率 / 128 * - 保留 - 27 - / - 0 - 保留 * - MDIO_MODE - 28 - 读/写 - 0 - MDIO 模式 * 1'b0: clause22 模式 * 1'b1: clause45 模式 * - MDIO_POST_RD_INC - 29 - 读/写 - 0x0 - 后读增量事务请求(用于 clause45) * - 保留 - 31:30 - 读/写 - 0 - 保留 MDIO_CTRL_REG_2 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x13C`` .. list-table:: **表 7.78 MDIO_CTRL_REG_2 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - EX_REG_ADDR - 15:0 - 读/写 - 0 - MDIO 扩展模式(clause45)地址 * - DEAD - 20:16 - 读/写 - 0 - MDIO 设备地址(DEVAD) * - PRTAD - 25:21 - 读/写 - 0 - MDIO 端口地址(PRTAD) * - PHY_ADDR - 30:26 - 读/写 - 0 - PHY 地址(用于 clause22) * - 保留 - 31 - 读/写 - 0 - 保留 MDIO_STATUS_REG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x140`` .. list-table:: **表 7.79 MDIO_STATUS_REG 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - MDIO_READOUT_DATA - 15:0 - 只读 - 0 - MDIO 读出的数据 * - MDIO_BUSY - 16 - 只读 - 0 - MDIO 事务正在进行中,MDIO 忙 * - 保留 - 31:17 - / - 0 - 保留 DMA_BURST_REG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x144`` .. list-table:: **表 7.80 DMA_BURST_REG 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - DMAW_BURST - 3:0 - 读/写 - 15 - DMA 写操作的最大突发长度 * - 保留 - 15:4 - / - 0 - 保留 * - DMAR_BURST - 19:16 - 读/写 - 15 - DMA 读操作的最大突发长度 * - 保留 - 31:20 - / - 0 - 保留 WATCHDOG_REG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x148`` .. list-table:: **表 7.81 WATCHDOG_REG 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - WATCHDOG_TIMER - 31:0 - 读/写 - 8000 - DMA 看门狗定时器值 LOW_POWER_CTRL ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x14C`` .. list-table:: **表 7.82 LOW_POWER_CTRL 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - SYSCLK_DYNAMIC_GATE_EN - 0 - 读/写 - 1 - 使能动态时钟门控功能 * 1'b0: 禁用 * 1'b1: 使能 * - 保留 - 31:1 - / - 0 - 保留 XEC_STATUS ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x150`` .. list-table:: **表 7.83 XEC_STATUS 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - XEC_IDLE - 0 - 只读 - 1 - XEC 处于功能空闲状态 * 1'b0: 否 * 1'b1: 是 * - 保留 - 31:1 - / - 0 - 保留 DELAY_SEL ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x154`` .. list-table:: **表 7.84 DELAY_SEL 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RXC_DELAY_SEL - 5:0 - 读/写 - 0 - 在 gmi_rxc_i 输入上增加的额外延迟。0 表示无延迟,1 表示 6 个多路器延迟 + 1 个缓冲器延迟;N 表示 6 个多路器延迟 + N 个缓冲器延迟 * - 保留 - 15:6 - / - 0 - 保留 * - TXC_DELAY_SEL - 21:16 - 读/写 - 0 - 在 gmi_txc_o 输出上增加的额外延迟。0 表示无延迟,1 表示 6 个多路器延迟 + 1 个缓冲器延迟;N 表示 6 个多路器延迟 + N 个缓冲器延迟 * - 保留 - 31:22 - / - 0 - 保留 SVLAN ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x158`` .. list-table:: **表 7.85 SVLAN 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - svlan_id - 15:0 - 读/写 - 0x88a8 - 支持的 SVLAN ID,可配置为 88a8, 9100, 9200, 9300 * - 保留 - 31:16 - / - 0 - 保留 DBG_TEST_REG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x15C`` .. list-table:: **表 7.86 DBG_TEST_REG 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TPAUSE - 0 - 读/写 - 0 - 发送测试暂停帧 * 1'b0: 否 * 1'b1: 是 * - RX_HUGEN - 1 - 读/写 - 0 - 允许接收大于 MTU 大小的帧(用于测试) * 1'b0: 禁用 * 1'b1: 使能 * - TX_HUGEN - 2 - 读/写 - 0 - 允许发送大于 MTU 大小的帧(用于测试) * 1'b0: 禁用 * 1'b1: 使能 * - BACKP_PAT - 3 - 读/写 - 0 - 背压模式下的发送数据模式 * 1'b0: 只发送 55 55 * 1'b1: 发送 55 d5 * - 保留 - 31:4 - / - 0 - 保留 IP_VERSION ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x174`` .. list-table:: **表 7.87 IP_VERSION 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - VERSION_NUM - 31:0 - 只读 - 0x00010200 - XEC 的 IP 版本号 SOFT_RESET ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x178`` .. list-table:: **表 7.88 SOFT_RESET 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - SOFT_RST - 0 - 读/写 - 0 - 软件写1复位 MAC 逻辑,此位将由硬件自动清零 * - 保留 - 31:1 - / - 0 - 保留 SA_FILTER_CTRL_0 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x17C`` .. list-table:: **表 7.89 SA_FILTER_CTRL_0 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - SA_FILTER_EN - 31:0 - 读/写 - 0 - 使能相应的源地址(SA)过滤器,位 0 对应 SA_FILTER0,依此类推,1 表示使能 SA_FILTER_CTRL_1 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x180`` .. list-table:: **表 7.90 SA_FILTER_CTRL_1 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - SA_FILTER_WHITE_BLACK_SEL - 0 - 读/写 - 1 - 选择过滤器作为白名单或黑名单,0 示白名单,1 表示黑名单 * - 保留 - 31:1 - / - 0 - 保留 DA_FILTER_CTRL ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x184`` .. list-table:: **表 7.91 DA_FILTER_CTRL 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - DA_FILTER_EN - 31:0 - 读/写 - 0 - 使能相应的目的地址(DA)过滤器,位 0 对应 DA_FILTER0,依此类推,1 表示使能 SA_FILTER0_LOW ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x188`` .. list-table:: **表 7.92 SA_FILTER0_LOW 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - SA_LOW - 31:0 - 读/写 - 0 - 用于白名单或黑名单过滤的源地址(SA)的低 32 位 SA_FILTER0_HIGH_MASK ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x18C`` .. list-table:: **表 7.93 SA_FILTER0_HIGH_MASK 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - SA_HIGH - 15:0 - 读/写 - 0 - 用于白名单或黑名单过滤的源地址(SA)的高 16 位 * - 保留 - 23:16 - / - 0 - 保留 * - SA_MASK - 29:24 - 读/写 - 0 - 相应 SA 的掩码,每一位对应一个字节的掩码 * - 保留 - 31:30 - / - 0 - 保留 注:SA_FILTER1_LOW 至 SA_FILTER31_HIGH_MASK 的寄存器格式与上述 SA_FILTER0_LOW 和 SA_FILTER0_HIGH_MASK 完全相同,只是地址偏移不同。为简洁起见,此处省略重复的表格条目。 DA_FILTER0_LOW ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x288`` .. list-table:: **表 7.156 DA_FILTER0_LOW 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - DA_LOW - 31:0 - 读/写 - 0 - 目的地址过滤器0 的低 32 位 DA_FILTER0_HIGH_MASK ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x28C`` .. list-table:: **表 7.157 DA_FILTER0_HIGH_MASK 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - DA_HIGH - 15:0 - 读/写 - 0 - 目的地址过滤器0 的高 16 位 * - 保留 - 23:16 - / - 0 - 保留 * - DA_MASK - 29:24 - 读/写 - 0 - 相应 DA 的掩码,每一位对应一个字节的掩码。 * - 保留 - 31:30 - / - 0 - 保留 注:DA_FILTER1_LOW 至 DA_FILTER31_HIGH_MASK 的寄存器格式与上述 DA_FILTER0_LOW 和 DA_FILTER0_HIGH_MASK 完全相同,只是地址偏移不同。为简洁起见,此处省略重复的表格条目。 1588_BLOCK 寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1588_BLOCK 中寄存器及其对应的偏移地址如表 1588_BLOCK 中的寄存器偏移地址 所示 .. list-table:: 表 7.220: 1588_BLOCK 中的寄存器偏移地址 :widths: 10 25 65 :header-rows: 1 * - **偏移地址** - **寄存器名称** - **功能描述** * - 0x800 - RX_PTP_TS_0_S - 接收的1588事件包的时间戳(秒域),秒的低32位(1位表示1秒) * - 0x804 - RX_PTP_TS_0_NS - 接收的1588事件包的时间戳(纳秒域)(1位表示1纳秒) * - 0x808 - TX_PTP_TS_0_S - 发送的1588事件包的时间戳(秒域),秒的低32位(1位表示1秒) * - 0x80C - TX_PTP_TS_0_NS - 发送的1588事件包的时间戳(纳秒域)(1位表示1纳秒) * - 0x810 - RX_PTP_TS_1_S - 接收的1588事件包的时间戳(秒域),秒的低32位(1位表示1秒) * - 0x814 - RX_PTP_TS_1_NS - 接收的1588事件包的时间戳(纳秒域)(1位表示1纳秒) * - 0x818 - TX_PTP_TS_1_S - 发送的1588事件包的时间戳(秒域),秒的低32位(1位表示1秒) * - 0x81C - TX_PTP_TS_1_NS - 发送的1588事件包的时间戳(纳秒域)(1位表示1纳秒) * - 0x820 - RX_PTP_TS_2_S - 接收的1588事件包的时间戳(秒域),秒的低32位(1位表示1秒) * - 0x824 - RX_PTP_TS_2_NS - 接收的1588事件包的时间戳(纳秒域)(1位表示1纳秒) * - 0x828 - TX_PTP_TS_2_S - 发送的1588事件包的时间戳(秒域),秒的低32位(1位表示1秒) * - 0x82C - TX_PTP_TS_2_NS - 发送的1588事件包的时间戳(纳秒域)(1位表示1纳秒) * - 0x830 - RX_PTP_TS_3_S - 接收的1588事件包的时间戳(秒域),秒的低32位(1位表示1秒) * - 0x834 - RX_PTP_TS_3_NS - 接收的1588事件包的时间戳(纳秒域)(1位表示1纳秒) * - 0x838 - TX_PTP_TS_3_S - 发送的1588事件包的时间戳(秒域),秒的低32位(1位表示1秒) * - 0x83C - TX_PTP_TS_3_NS - 发送的1588事件包的时间戳(纳秒域)(1位表示1纳秒) * - 0x840 - RX_PTP_TS_4_S - 接收的1588事件包的时间戳(秒域),秒的低32位(1位表示1秒) * - 0x844 - RX_PTP_TS_4_NS - 接收的1588事件包的时间戳(纳秒域)(1位表示1纳秒) * - 0x848 - TX_PTP_TS_4_S - 发送的1588事件包的时间戳(秒域),秒的低32位(1位表示1秒) * - 0x84C - TX_PTP_TS_4_NS - 发送的1588事件包的时间戳(纳秒域)(1位表示1纳秒) * - 0x850 - RX_PTP_TS_5_S - 接收的1588事件包的时间戳(秒域),秒的低32位(1位表示1秒) * - 0x854 - RX_PTP_TS_5_NS - 接收的1588事件包的时间戳(纳秒域)(1位表示1纳秒) * - 0x858 - TX_PTP_TS_5_S - 发送的1588事件包的时间戳(秒域),秒的低32位(1位表示1秒) * - 0x85C - TX_PTP_TS_5_NS - 发送的1588事件包的时间戳(纳秒域)(1位表示1纳秒) * - 0x860 - RX_PTP_TS_6_S - 接收的1588事件包的时间戳(秒域),秒的低32位(1位表示1秒) * - 0x864 - RX_PTP_TS_6_NS - 接收的1588事件包的时间戳(纳秒域)(1位表示1纳秒) * - 0x868 - TX_PTP_TS_6_S - 发送的1588事件包的时间戳(秒域),秒的低32位(1位表示1秒) * - 0x86C - TX_PTP_TS_6_NS - 发送的1588事件包的时间戳(纳秒域)(1位表示1纳秒) * - 0x860 - RX_PTP_TS_6_S - 接收的1588事件包的时间戳(秒域),秒的低32位(1位表示1秒) * - 0x870 - RX_PTP_TS_7_S - 接收的1588事件包的时间戳(秒域),秒的低32位(1位表示1秒) * - 0x874 - RX_PTP_TS_7_NS - 接收的1588事件包的时间戳(纳秒域)(1位表示1纳秒) * - 0x878 - TX_PTP_TS_7_S - 发送的1588事件包的时间戳(秒域),秒的低32位(1位表示1秒) * - 0x87C - TX_PTP_TS_7_NS - 发送的1588事件包的时间戳(纳秒域)(1位表示1纳秒) * - 0x880 - TX_PTP_TS_UPDT - TX_PTP_TS 更新状态握手寄存器 * - 0x884 - RTC_SH - RTC 秒域的高32位 * - 0x888 - RTC_SL - RTC 秒域的低32位 * - 0x88C - RTC_NS - RTC 纳秒域 * - 0x890 - RTC_INC - RTC 累加步长值寄存器 * - 0x894 - RTC_OFFSET_SH - 秒域调整偏移量(高16位和符号位) * - 0x898 - RTC_OFFSET_SL - 秒域调整偏移量低32位(1位=1秒) * - 0x89C - RTC_OFFSET_NS - 纳秒域调整偏移量(1位=1纳秒) * - 0x8A0 - RTC_CTRL - RTC 控制寄存器 * - 0x8A4 - PPS_RTC_OFFSET_OBS - 用于检查 PPS 同步计算出的 RTC 偏移值和符号位的观测寄存器 * - 0x8A8 - PTP_EN - PTP 功能使能寄存器 * - 0x8AC - PPS_OUT - PPS_OUT 控制寄存器 * - 0x8B0 - PPS_IN - PPS_IN 同步控制寄存器 RX_PTP_TS_0_S ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x800`` .. list-table:: **表 7.221 RX_PTP_TS_0_S 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_PTP_TS_SECOND - 31:0 - 只读 - 0 - 接收的1588事件包的时间戳(秒域),秒的低32位(1位表示1秒) RX_PTP_TS_0_NS ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x804`` .. list-table:: **表 7.222 RX_PTP_TS_0_NS 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RX_PTP_TS_NS - 31:0 - 只读 - 0 - 接收的1588事件包的时间戳(纳秒域)(1位表示1纳秒) 注:RX_PTP_TS_1_S 至 TX_PTP_TS_7_NS 的寄存器格式与上述 RX_PTP_TS_0_S 和 RX_PTP_TS_0_NS 类似,只是对应不同的事件包ID。为简洁起见,此处省略重复的表格条目。 TX_PTP_TS_UPDT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x880`` .. list-table:: **表 7.253 TX_PTP_TS_UPDT 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - TX_PTP_TS_UPDT - 7:0 - 读/写 - 0 - 位0对应 tx_pkt_id 0,位1对应 tx_pkt_id 1,依此类推。硬件在生成相应的 TX_PTP_TS_N 时,会将对应的位 N 设置为1。软件在读出相应的 TX_PTP_TS_N 后,需要将对应的位 N 清零。 * - 保留 - 31:8 - / - 0 - 保留 RTC_SH ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x884`` .. list-table:: **表 7.254 RTC_SH 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RTC_SEND_HI - 15:0 - 只读 - 0 - RTC 秒域的高16位(总秒数的高16位) * - 保留 - 31:16 - / - 0 - 保留 RTC_SL ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x888`` .. list-table:: **表 7.255 RTC_SL 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RTC_SEND_LO - 31:0 - 只读 - 0 - RTC 秒域的低32位(总秒数的低32位) RTC_NS ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x88C`` .. list-table:: **表 7.256 RTC_NS 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RTC_NS - 31:0 - 只读 - 0 - RTC 纳秒域的值 RTC_INC ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x890`` .. list-table:: **表 7.257 RTC_INC 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RTC_INC_DELTA - 25:0 - 读/写 - 0 - 位 [25:20] 1位=1纳秒,位 [19:0] 1位 = 1/(2^20) 纳秒。用于每个 ptp_ref_clk 周期累加到 RTC 的步长。 * - 保留 - 31:26 - / - 0 - 保留 RTC_OFFSET_SH ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x894`` .. list-table:: **表 7.258 RTC_OFFSET_SH 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RTC_OFFSET_SECOND_HI - 16:0 - 读/写 - 0 - 位[16]: 0表示正偏移,需要加偏移量;1表示负偏移,需要减偏移量。位[15:0]: 秒域高16位的调整偏移量。 * - 保留 - 31:17 - / - 0 - 保留 RTC_OFFSET_SL ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x898`` .. list-table:: **表 7.259 RTC_OFFSET_SL 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RTC_OFFSET_SECOND_LOW - 31:0 - 读/写 - 0 - 秒域低32位的调整偏移量,1位=1秒 RTC_OFFSET_NS ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x89C`` .. list-table:: **表 7.260 RTC_OFFSET_NS 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RTC_OFFSET_NS - 31:0 - 读/写 - 0 - 纳秒域的调整偏移量,1位=1纳秒 RTC_CTRL ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x8A0`` .. list-table:: **表 7.261 RTC_CTRL 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - RTC_OFFSET_LOAD - 0 - 写1清0 - 0 - 写1加载偏移取消(执行加/减偏移操作),硬件将自动清零。 * - RTC_RESET - 1 - 写1清0 - 0 - 写1复位 RTC 到全0,硬件将自动清零 * - RTC_PRELOAD - 2 - 写1清0 - 0 - 写1在初始化时将 RTC_OFFSET 寄存器中的值预加载到 RTC。 * - 保留 - 31:3 - / - 0 - 保留 PPS_RTC_OFFSET_OBS ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x8A4`` .. list-table:: **表 7.262 PPS_RTC_OFFSET_OBS 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - PPS_RTC_OFFSET - 29:0 - 只读 - 0 - 观测寄存器,用于检查 PPS 同步计算出的 RTC 偏移值。 * - 保留 - 30 - / - 0 - 保留 * - PPS_RTC_OFFSET_SIGN - 31 - 只读 - 0 - 观测寄存器,用于检查 PPS 同步计算出的 RTC 偏移符号位。 PTP_EN ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x8A8`` .. list-table:: **表 7.263 PTP_EN 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - PTP_EN - 0 - 读/写 - 0 - 使能 PTP 功能 * 1'b0: 禁用 * 1'b1: 使能 * - 保留 - 31:1 - / - 0 - 保留 PPS_OUT ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x8AC`` .. list-table:: **表 7.264 PPS_OUT 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - PPS_IN_OUT_PULSE_CTRL - 2:0 - 读/写 - 0 - 方波输出频率 * 3'd0: 输出1Hz方波,高脉冲0.5秒,低脉冲0.5秒 * 3'd1: 输出方波,高脉冲1秒,低脉冲1秒 * 3'd2: 输出方波,高脉冲2秒,低脉冲2秒 * 3'd3: 输出方波,高脉冲4秒,低脉冲4秒 * 3'd4: 输出方波,高脉冲8秒,低脉冲8秒 * 3'd5: 输出方波,高脉冲16秒,低脉冲16秒 * - PPS_OUT_MODE - 4:3 - 读/写 - 0 - PPS 输出模式 * 2'b00: 在 pps_out 引脚输出静态0 * 2'b01: 在 pps_out 引脚输出静态1 * 2'b10: 输出由 PPS_OUT_PULSE_CTRL 寄存器定义的方波 * - 保留 - 31:5 - / - 0 - 保留 PPS_IN ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 地址偏移: ``0x8B0`` .. list-table:: **表 7.265 PPS_IN 寄存器格式** :header-rows: 1 :widths: 15 10 10 15 50 * - 字段 - 位 - 访问类型 - 复位值 - 描述 * - PPSIN_LATENCY - 27:0 - 读/写 - 0 - 从外部设备的 PPS_OUT 到 XEC PPS_IN 的路径延迟,包括外部设备的 PPS_OUT 引脚延迟、设备内部延迟、XEC 的 PPS_IN 引脚输入延迟。1位表示1纳秒,此值应由系统设计者计算。 * - KP_COEF - 30:28 - 读/写 - 0 - 计算误差反馈值时的比例系数 * 1: 0.875 * 2: 0.75 * 3: 0.625 * 4: 0.5 * 5: 0.375 * 6: 0.25 * 7: 0.125 * - PPSIN_SYNC_EN - 31 - 读/写 - 0 - 使能本地 RTC 与 pps_in 同步 * 1'b0: 否 * 1'b1: 是