功能配置
自协商配置
自协商(Auto-Negotiation)让链路两端的设备通过交换能力信息,自动选择相同的速率和双工模式。协商由 PHY 完成,MAC 读取协商结果。两端配置不同时的链路结果如下:
本端配置 |
对端配置 |
链路结果 |
说明 |
|---|---|---|---|
自协商 |
自协商 |
成功 |
双方交换能力,选择共同支持的最高性能模式,例如 100M 全双工。 |
自协商 |
固定 10M/100M 半双工 |
成功 |
本端检测到对端的速率,并按半双工工作,两端匹配。 |
自协商 |
固定 10M/100M 全双工 |
双工不匹配 |
本端无法获知对端的双工,通常按半双工工作。链路可能显示连通,但会产生冲突和 CRC 错误,丢包率高。 |
自协商(仅全双工) |
自协商(仅半双工) |
失败 |
双方能力没有交集,无法建立链路。 |
固定速率(如 100M) |
固定另一种速率(如 10M) |
失败 |
速率不一致,链路无法建立。 |
固定全双工 |
固定半双工(速率相同) |
双工不匹配 |
链路可能显示连通,但会产生冲突和 CRC 错误,丢包率高。 |
备注
默认开启自协商,只通告 100M 的全双工和半双工能力。
使用强制模式时,两端的速率和双工必须相同,MAC 的配置也要与 PHY 的实际链路状态一致。
VLAN 配置
VLAN(虚拟局域网)通过在以太网帧中加入 4 字节的 VLAN 标签,把一个物理网络划分为多个相互隔离的逻辑网络。Ameba MAC 可以用硬件在发送时处理标签,在接收时剥离标签,软件不需要自己修改报文中的标签字节。标签位于源地址之后、类型字段之前,帧格式如下:
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 状态
Sleep:本端通知对端进入低功耗。
Quiet:停止发送信号以省电,期间周期性发送 Refresh 信号维持链路。
Wake:有数据要发送时,发送唤醒信号,经过唤醒时间后恢复 Active。
休眠和唤醒的时机由具体策略确定,可根据应用场景选择,见下文。
休眠策略
休眠策略决定 MAC 何时请求进入 LPI,默认是“队列为空”。
策略 |
进入 LPI 的条件 |
|---|---|
队列为空(默认) |
发送队列为空时请求进入 LPI。 |
低流量 |
统计窗口内的发送流量低于设定的流量门限时请求进入 LPI。 |
收到 PAUSE 帧 |
收到对端的 PAUSE 帧时请求进入 LPI。 |
三种策略可以组合使用,满足其中一个条件即请求进入 LPI。
唤醒策略
唤醒策略决定 MAC 何时退出 LPI 恢复发送,默认是“任意数据”。
策略 |
退出 LPI 的条件 |
|---|---|
任意数据(默认) |
发送队列中一有数据即唤醒。 |
达到门限后唤醒 |
发送队列达到门限,或有大于 512 字节的帧待发送时才唤醒。小报文会在队列里等待,延迟变大,但唤醒次数减少。 |
场景选择
应用场景 |
休眠策略 |
唤醒策略 |
特点 |
|---|---|---|---|
通用联网应用,对延迟敏感(推荐) |
队列为空 |
任意数据 |
默认配置。空闲就休眠,有数据立即唤醒,延迟最小。 |
小流量持续发送,希望更多时间处于低功耗 |
低流量 |
任意数据 |
流量低于门限就休眠,比“队列为空”更容易进入 LPI,但发送的数据可能要等唤醒。 |
以批量传输为主,不在意小报文延迟 |
队列为空 |
达到门限后唤醒 |
减少唤醒次数,小报文延迟变大。 |
对端或交换机会用 PAUSE 帧流控 |
在上述策略上叠加“收到 PAUSE 帧” |
同上 |
对端要求暂停发送时同步进入低功耗。 |
备注
流量断断续续时 PHY 会频繁在 Active 和 LPI 间切换,需要实测对延迟和吞吐的影响。吞吐量要求高的应用不建议启用 EEE。
定时参数和流量门限一般保持默认值即可。
环回测试配置
环回测试用于检查链路的连通性,调试时用来确认 MAC 链路和外部链路是否正常。环回分为内部环回(T2R)和外部环回(R2T)两种模式:
环回测试模式
模式 |
数据流向 |
用途 |
|---|---|---|
内部环回(T2R) |
发送的数据在 MAC 内部回到接收,不经过 PHY 和网线。 |
检查收发驱动、描述符和中断处理。 |
外部环回(R2T) |
MAC 把从 PHY 收到的数据原样发回,不需要软件处理。需要外部对端发送测试帧并检查返回的帧。 |
检查 MAC 与 PHY、网线和对端之间的外部通路。 |
环回模式在以太网初始化时配置,运行中不能切换。测试结束后需改回正常模式并重新初始化。
描述符与缓冲区配置
MAC 通过 DMA 收发数据。描述符是内存中的一小块数据结构,用来在 CPU 和 DMA 之间传递每个数据缓冲区的地址、长度和状态。CPU 只需要填写描述符,数据搬运由 DMA 完成。发送和接收各有一个描述符环,环中的每个描述符对应一个数据缓冲区,最后一个描述符回绕到第一个。
描述符环与数据缓冲区
描述符中的所有权位(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 字节填充,缓冲区要为此预留空间。