功能配置

自协商配置

自协商(Auto-Negotiation)让链路两端的设备通过交换能力信息,自动选择相同的速率和双工模式。协商由 PHY 完成,MAC 读取协商结果。两端配置不同时的链路结果如下:

两端配置与链路结果

本端配置

对端配置

链路结果

说明

自协商

自协商

成功

双方交换能力,选择共同支持的最高性能模式,例如 100M 全双工。

自协商

固定 10M/100M 半双工

成功

本端检测到对端的速率,并按半双工工作,两端匹配。

自协商

固定 10M/100M 全双工

双工不匹配

本端无法获知对端的双工,通常按半双工工作。链路可能显示连通,但会产生冲突和 CRC 错误,丢包率高。

自协商(仅全双工)

自协商(仅半双工)

失败

双方能力没有交集,无法建立链路。

固定速率(如 100M)

固定另一种速率(如 10M)

失败

速率不一致,链路无法建立。

固定全双工

固定半双工(速率相同)

双工不匹配

链路可能显示连通,但会产生冲突和 CRC 错误,丢包率高。

备注

  • 默认开启自协商,只通告 100M 的全双工和半双工能力。

  • 使用强制模式时,两端的速率和双工必须相同,MAC 的配置也要与 PHY 的实际链路状态一致。

VLAN 配置

VLAN(虚拟局域网)通过在以太网帧中加入 4 字节的 VLAN 标签,把一个物理网络划分为多个相互隔离的逻辑网络。Ameba MAC 可以用硬件在发送时处理标签,在接收时剥离标签,软件不需要自己修改报文中的标签字节。标签位于源地址之后、类型字段之前,帧格式如下:

无标签帧、单层标签帧和双层标签帧的格式,以及标签的 TPID、PRI、CFI、VID 字段

VLAN 帧格式

支持的标签层数

  • 最多识别两层标签:外层标签(S-tag,用于 QinQ)和内层标签(C-tag)。

  • 不支持三层及以上的嵌套标签。

出向标签

出向指发送方向。硬件在报文发出之前,对报文中的 VLAN 标签执行一个动作,共四种:

  • 保持原样:不修改报文中的标签。

  • 插入:在报文中插入一个新标签,标签内容由软件指定。

  • 移除:移除报文中的一个标签。

  • 改写:保留原有标签,只替换其中的 VID。

每个报文只能执行一个动作,动作作用于哪一层标签由全局参数决定,不能逐包选择。

出向标签涉及两类参数。全局参数在以太网初始化之前设置,对所有发送的报文生效;逐包参数在每个报文的元数据中设置。

出向可配置参数

参数

类型

说明

标签作用层

全局

动作作用于哪一层标签:内层 C-tag(TPID 为 0x8100)或外层 S-tag。默认是 C-tag。

S-tag 的 TPID

全局

外层 S-tag 的 TPID,默认 0x88A8,一般无需修改。

标签动作

逐包

上述四种动作中的一种。使用前需先将元数据中的 VLAN 有效标志置 1。

标签内容

逐包

插入或改写时使用的 16 位标签内容,包含 VID、优先级和 CFI。

入向标签

入向指接收方向。硬件只能剥离内层 C-tag,不能剥离外层 S-tag。是否剥离在以太网初始化之前设置,默认开启:

  • 剥离:硬件把 C-tag 从报文中去掉,报文数据里不再包含标签。被剥离的标签在报文元数据中返回,VLAN 有效标志为 1 表示报文带有 C-tag,标签内容保存在元数据中。

  • 不剥离:标签保留在报文数据里,由软件自己解析。

一个报文占用多个描述符时,标签信息只在最后一个描述符里。

节能以太网 EEE

EEE(Energy Efficient Ethernet,IEEE 802.3az)让链路空闲时进入低功耗空闲(LPI)状态,有数据时再快速唤醒。EEE 默认关闭,使用时必须开启自协商,且 PHY 和对端设备都需要支持 EEE。

线路上的 LPI 过程如下:

LPI 过程:Active、Sleep、Quiet(周期性 Refresh)、Wake、Active

LPI 状态

  • Sleep:本端通知对端进入低功耗。

  • Quiet:停止发送信号以省电,期间周期性发送 Refresh 信号维持链路。

  • Wake:有数据要发送时,发送唤醒信号,经过唤醒时间后恢复 Active。

休眠和唤醒的时机由具体策略确定,可根据应用场景选择,见下文。

休眠策略

休眠策略决定 MAC 何时请求进入 LPI,默认是“队列为空”。

休眠策略

策略

进入 LPI 的条件

队列为空(默认)

发送队列为空时请求进入 LPI。

低流量

统计窗口内的发送流量低于设定的流量门限时请求进入 LPI。

收到 PAUSE 帧

收到对端的 PAUSE 帧时请求进入 LPI。

三种策略可以组合使用,满足其中一个条件即请求进入 LPI。

唤醒策略

唤醒策略决定 MAC 何时退出 LPI 恢复发送,默认是“任意数据”。

唤醒策略

策略

退出 LPI 的条件

任意数据(默认)

发送队列中一有数据即唤醒。

达到门限后唤醒

发送队列达到门限,或有大于 512 字节的帧待发送时才唤醒。小报文会在队列里等待,延迟变大,但唤醒次数减少。

场景选择

EEE 策略的场景选择

应用场景

休眠策略

唤醒策略

特点

通用联网应用,对延迟敏感(推荐)

队列为空

任意数据

默认配置。空闲就休眠,有数据立即唤醒,延迟最小。

小流量持续发送,希望更多时间处于低功耗

低流量

任意数据

流量低于门限就休眠,比“队列为空”更容易进入 LPI,但发送的数据可能要等唤醒。

以批量传输为主,不在意小报文延迟

队列为空

达到门限后唤醒

减少唤醒次数,小报文延迟变大。

对端或交换机会用 PAUSE 帧流控

在上述策略上叠加“收到 PAUSE 帧”

同上

对端要求暂停发送时同步进入低功耗。

备注

  • 流量断断续续时 PHY 会频繁在 Active 和 LPI 间切换,需要实测对延迟和吞吐的影响。吞吐量要求高的应用不建议启用 EEE。

  • 定时参数和流量门限一般保持默认值即可。

环回测试配置

环回测试用于检查链路的连通性,调试时用来确认 MAC 链路和外部链路是否正常。环回分为内部环回(T2R)和外部环回(R2T)两种模式:

T2R 环回在 MAC 内部把发送数据送回接收;R2T 环回把从 PHY 收到的数据发回给 PHY

环回测试模式

环回模式

模式

数据流向

用途

内部环回(T2R)

发送的数据在 MAC 内部回到接收,不经过 PHY 和网线。

检查收发驱动、描述符和中断处理。

外部环回(R2T)

MAC 把从 PHY 收到的数据原样发回,不需要软件处理。需要外部对端发送测试帧并检查返回的帧。

检查 MAC 与 PHY、网线和对端之间的外部通路。

环回模式在以太网初始化时配置,运行中不能切换。测试结束后需改回正常模式并重新初始化。

描述符与缓冲区配置

MAC 通过 DMA 收发数据。描述符是内存中的一小块数据结构,用来在 CPU 和 DMA 之间传递每个数据缓冲区的地址、长度和状态。CPU 只需要填写描述符,数据搬运由 DMA 完成。发送和接收各有一个描述符环,环中的每个描述符对应一个数据缓冲区,最后一个描述符回绕到第一个。

描述符环:每个描述符指向一个数据缓冲区,最后一个描述符回绕到第一个,OWN 位表示归 DMA 还是 CPU 所有

描述符环与数据缓冲区

描述符中的所有权位(OWN)表示描述符归谁处理:OWN 为 1 时描述符归 DMA,CPU 不能修改;DMA 处理完后清零,归还给 CPU。一个帧占用多个描述符时,用标志位标记哪个是帧的第一个、哪个是最后一个。此外,发送时用控制位启用校验和、VLAN 等硬件功能,接收时由硬件返回校验结果、帧类型等状态。

每个发送描述符占用 20 字节 SRAM,每个接收描述符占用 16 字节,每个描述符还对应一个 1536 字节的数据缓冲区,可容纳含 VLAN 标签的最大标准帧。

描述符数量可以在 Menuconfig 中手动设置,发送和接收分别设置。不手动设置时,IMG2 运行在 Flash(XIP)上默认为 4,运行在 PSRAM 上默认为 8。描述符越多,占用的内存越多;增加接收描述符可以提高应对突发流量的能力,但不能代替及时处理和回收接收数据。

备注

使用 SDK 的 LwIP 以太网驱动时,描述符环和缓冲区的分配、对齐、缓存维护和回收都由驱动完成,应用只需要决定描述符的数量。自行实现收发时,需要注意:

  • 描述符环必须放在 SRAM 的 Non-cacheable 区域,起始地址按 32 字节对齐。

  • 接收描述符的数量必须是 2 的整数次幂(如 4、8、16、32、64),否则编译失败;发送描述符没有这个限制。

  • 数据缓冲区放在可缓存内存时,按 32 字节缓存行对齐并占满整行,不与其他数据共用缓存行,并在 DMA 读写前后做 DCache Clean 和 DCache Invalidate。

  • 缓冲区交给 DMA 之后,CPU 不得修改或复用它,直到描述符被归还。

  • 接收时 MAC 会在帧数据前插入 2 字节填充,缓冲区要为此预留空间。