OPEN Alliance 10BASE-T1x MAC-PHY 串行接口 (TC6) 框架支持

简介

IEEE 802.3cg 项目定义了两种在单对导体上运行的 10 Mbit/s PHY。10BASE-T1L (第 146 条) 是一种长距离 PHY,支持在 1 公里的单平衡导体对上进行全双工点对点操作。10BASE-T1S (第 147 条) 是一种短距离 PHY,支持在 15 米的单平衡导体对上进行全/半双工点对点操作,或者在 25 米的单平衡导体对上进行半双工多点总线操作。

此外,IEEE 802.3cg 项目定义了新的物理层冲突避免 (PLCA) 协调子层 (第 148 条),旨在为 CSMA/CD 媒体访问方法提供更高的确定性。PLCA 与在多点模式下运行的 10BASE-T1S PHY 协同工作。

上述 PHY 旨在覆盖工业和汽车环境中的低速/低成本应用。IEEE 802.3 第 22 条规定的 MII 接口所需的引脚数量较多 (16 个) 是需要解决以实现此目标的主要成本因素之一。

MAC-PHY 解决方案集成了 IEEE 第 4 条 MAC 和 10BASE-T1x PHY,向主机微控制器公开低引脚数的串行外围接口 (SPI)。这也使得可以将以太网功能添加到未集成 MAC 控制器的现有低端微控制器中。

概述

MAC-PHY 被指定为通过单个全双工串行外围接口传输数据 (以太网帧) 和控制 (寄存器访问) 事务。

协议概述

该协议中定义了两种类型的事务:用于以太网帧传输的数据事务和用于寄存器读/写传输的控制事务。数据事务的基本元素是块,每个块由 4 个字节的开销加上 64 个字节的有效负载大小组成。以太网帧通过一个或多个数据块传输。控制事务由一个或多个寄存器读/写控制命令组成。

SPI 事务由 SPI 主机通过将 CSn 拉低到 MAC-PHY 来启动,并以 CSn 拉高来结束。在每个 SPI 事务之间,SPI 主机可能需要时间进行额外的处理,并设置下一个 SPI 数据或控制事务。

SPI 数据事务由相等数量的发送 (TX) 和接收 (RX) 块组成。发送和接收方向上的块可能包含也可能不包含彼此独立的有效帧数据,从而允许同时发送和接收不同长度的帧。

每个发送数据块都以一个 32 位数据头开始,后跟 MOSI 上的数据块有效负载。数据头指示是否存在发送帧数据,并提供用于确定有效负载的哪些字节包含有效帧数据的信息。

同时,在 MISO 上接收接收数据块。每个接收数据块都由一个数据块有效负载组成,以一个 32 位数据尾部结束。数据尾部指示有效负载中是否存在接收帧数据,并提供用于确定有效负载的哪些字节包含有效帧数据的信息。

参考

10BASE-T1x MAC-PHY 串行接口规范,

链接: https://opensig.org/download/document/OPEN_Alliance_10BASET1x_MAC-PHY_Serial_Interface_V1.1.pdf

硬件架构

+----------+      +-------------------------------------+
|          |      |                MAC-PHY              |
|          |<---->| +-----------+  +-------+  +-------+ |
| SPI Host |      | | SPI Slave |  |  MAC  |  |  PHY  | |
|          |      | +-----------+  +-------+  +-------+ |
+----------+      +-------------------------------------+

软件架构

+----------------------------------------------------------+
|                 Networking Subsystem                     |
+----------------------------------------------------------+
          / \                             / \
           |                               |
           |                               |
          \ /                              |
+----------------------+     +-----------------------------+
|     MAC Driver       |<--->| OPEN Alliance TC6 Framework |
+----------------------+     +-----------------------------+
          / \                             / \
           |                               |
           |                               |
           |                              \ /
+----------------------------------------------------------+
|                    SPI Subsystem                         |
+----------------------------------------------------------+
                        / \
                         |
                         |
                        \ /
+----------------------------------------------------------+
|                10BASE-T1x MAC-PHY Device                 |
+----------------------------------------------------------+

实现

MAC 驱动程序

  • 由 SPI 子系统探测。

  • 为 MAC-PHY 初始化 OA TC6 框架。

  • 注册并配置网络设备。

  • 将来自 n/w 子系统的 tx 以太网帧发送到 OA TC6 框架。

OPEN Alliance TC6 框架

  • 初始化 PHYLIB 接口。

  • 注册 mac-phy 中断。

  • 使用 OPEN Alliance 10BASE-T1x MAC-PHY 串行接口规范中指定的控制事务协议执行 mac-phy 寄存器读/写操作。

  • 使用 OPEN Alliance 10BASE-T1x MAC-PHY 串行接口规范中指定的以太网帧数据事务协议执行以太网帧事务。

  • 将从 10Base-T1x MAC-PHY 接收的以太网帧转发到 n/w 子系统。

数据事务

通常从 SPI 主机传输到 MAC-PHY 的以太网帧将转换为多个发送数据块。每个发送数据块将有一个 4 字节的头,其中包含确定 64 字节数据块有效负载中发送帧数据的有效性和位置所需的信息。

+---------------------------------------------------+
|                     Tx Chunk                      |
| +---------------------------+  +----------------+ |   MOSI
| | 64 bytes chunk payload    |  | 4 bytes header | |------------>
| +---------------------------+  +----------------+ |
+---------------------------------------------------+

4 字节的头包含以下字段,

DNC (位 31) - 数据非控制标志。此标志指定 SPI 的类型

事务。对于 TX 数据块,此位应为 ‘1’。 0 - 控制命令 1 - 数据块

SEQ (位 30) - 数据块序列。此位用于指示一个

到 MAC-PHY 的偶数/奇数发送数据块序列。

NORX (位 29) - 无接收标志。SPI 主机可以设置此位以阻止

MAC-PHY 在 MISO 上为当前块传输 RX 数据 (页脚中 DV = 0),指示主机不会处理它。通常,SPI 主机应设置 NORX = 0,表示它将接受和处理当前块内的任何接收帧数据。

RSVD (位 28..24) - 保留:所有保留位都应为 ‘0’。

VS (位 23..22) - 供应商特定。这些位是特定于实现的。

如果 MAC-PHY 未实现这些位,则主机应将其设置为 ‘0’。

DV (位 21) - 数据有效标志。SPI 主机使用此位来指示

当前块是否包含有效的发送帧数据 (DV = 1) 或不包含 (DV = 0)。当为 ‘0’ 时,MAC-PHY 会忽略块有效负载。请注意,接收路径不受数据头中 DV 位设置的影响。

SV (位 20) - 开始有效标志。当

以太网帧的开头出现在当前发送数据块有效负载中时,SPI 主机应设置此位。否则,此位应为零。此位不要与 IEEE 802.3 [2] 中描述的帧起始定界符 (SFD) 字节混淆。

SWO (位 19..16) - 开始字偏移量。当 SV = 1 时,此字段应

包含指向要发送的新以太网帧的起点的发送数据块有效负载中的 32 位字偏移量。当 SV = 0 时,主机应将此字段写为零。

RSVD (位 15) - 保留:所有保留位都应为 ‘0’。

EV (位 14) - 结束有效标志。当

以太网帧的结尾出现在当前发送数据块有效负载中时,SPI 主机应设置此位。否则,此位应为零。

EBO (位 13..8) - 结束字节偏移量。当 EV = 1 时,此字段应包含

指向要发送的以太网帧的最后一个字节的发送数据块有效负载中的字节偏移量。当 EV = 0 时,此字段应为零。

TSC (位 7..6) - 时间戳捕获。当

帧被传输到网络上时请求时间戳捕获。00 - 不捕获时间戳 01 - 将时间戳捕获到时间戳捕获寄存器 A 10 - 将时间戳捕获到时间戳捕获寄存器 B 11 - 将时间戳捕获到时间戳捕获寄存器 C

RSVD (位 5..1) - 保留:所有保留位都应为 ‘0’。

P (位 0) - 奇偶校验。在发送数据头计算的奇偶校验位。

使用的方法是奇校验。

MAC-PHY 中可用于存储传入发送数据块有效负载的缓冲区的数量表示为发送信用额度。MAC-PHY 中可用的发送信用额度可以从缓冲区状态寄存器或从 MAC-PHY 接收的页脚中读取 (请参阅下面的页脚信息)。SPI 主机不应写入超过可用发送信用额度的数据块,因为这会导致发送缓冲区溢出错误。

如果前一个数据页脚没有可用的发送信用额度,并且一旦发送信用额度可用于发送发送数据块,则会向 SPI 主机断言 MAC-PHY 中断。在接收到第一个数据头时,此中断将被取消断言,并且接收到的第一个数据块的页脚将具有可用的发送信用额度信息。

通常从 MAC-PHY 传输到 SPI 主机的以太网帧将作为多个接收数据块发送。每个接收数据块都包含 64 字节的数据块有效负载,后跟 4 字节的页脚,其中包含确定 64 字节数据块有效负载中接收帧数据的有效性和位置所需的信息。

+---------------------------------------------------+
|                     Rx Chunk                      |
| +----------------+  +---------------------------+ |   MISO
| | 4 bytes footer |  | 64 bytes chunk payload    | |------------>
| +----------------+  +---------------------------+ |
+---------------------------------------------------+

4 字节的页脚包含以下字段:

EXST (位 31) - 扩展状态。当 STATUS0 或 STATUS1 寄存器中的任何位被设置且未被屏蔽时,将设置此位。

STATUS0 或 STATUS1 寄存器中的任何位被设置且未被屏蔽时,将设置此位。

HDRB (位 30) - 接收头错误。当设置时,表示 MAC-PHY

接收到的控制或数据头带有奇偶校验错误。

SYNC (位 29) - 配置同步标志。此位反映

CONFIG0 配置寄存器中 SYNC 位的状态(请参见表 12)。零表示 SPI 主机可能没有按预期配置 MAC-PHY。配置完成后,SPI 主机会设置配置寄存器中对应的位,该位会反映在此字段中。

RCA (位 28..24) - 可用接收块。RCA 字段向

SPI 主机指示,除了当前接收数据块之外,可用于读取的最小额外接收数据块帧数据数。当 MAC-PHY 的缓冲区中没有待读取的接收帧数据时,此字段为零。

VS (位 23..22) - 供应商特定。这些位是特定于实现的。

如果未实现,MAC-PHY 应将这些位设置为“0”。

DV (位 21) - 数据有效标志。MAC-PHY 使用此位来指示

当前接收数据块是否包含有效的接收帧数据 (DV = 1) 或不包含 (DV = 0)。当为“0”时,SPI 主机应忽略数据块有效负载。

SV (位 20) - 启动有效标志。当当前

数据块有效负载包含以太网帧的开头时,MAC-PHY 会设置此位。否则,此位为零。SV 位不要与 IEEE 802.3 [2] 中描述的帧起始定界符 (SFD) 字节混淆。

SWO (位 19..16) - 启动字偏移量。当 SV = 1 时,此字段包含

32 位字偏移量,该偏移量指向包含新接收到的以太网帧的第一个字节的接收数据块有效负载。当接收时间戳已添加到接收到的以太网帧的开头时 (RTSA = 1),则 SWO 指向时间戳的最高有效字节。当 SV = 0 时,此字段为零。

FD (位 15) - 帧丢弃。当设置时,此位表示 MAC 检测到

SPI 主机应丢弃接收到的以太网帧的条件。此位仅在接收到的以太网帧的末尾有效 (EV = 1),并且在所有其他时间应为零。

EV (位 14) - 结束有效标志。当

此接收数据块有效负载中存在接收到的以太网帧的末尾时,MAC-PHY 会设置此位。

EBO (位 13..8) - 结束字节偏移量:当 EV = 1 时,此字段包含

指向接收数据块有效负载的字节偏移量,该偏移量定位接收到的以太网帧的最后一个字节。当 EV = 0 时,此字段为零。

RTSA (位 7) - 接收时间戳已添加。当 32 位或

64 位时间戳已添加到接收到的以太网帧的开头时,将设置此位。当 SV = 0 时,MAC-PHY 应将此位设置为零。

RTSP (位 6) - 接收时间戳奇偶校验。奇偶校验位在

添加到接收到的以太网帧开头的 32 位/64 位时间戳上计算得出。使用的方法是奇校验。当 RTSA = 0 时,MAC-PHY 应将此位设置为零。

TXC (位 5..1) - 传输信用。此字段包含最小数量

的帧数据传输数据块,SPI 主机可以在单个事务中写入这些数据块,而不会产生传输缓冲区溢出错误。

P (位 0) - 奇偶校验。在接收数据页脚上计算得出的奇偶校验位。

使用的方法是奇校验。

SPI 主机将根据 MAC-PHY 中可用的接收块(在接收块页脚中提供(RCA - 可用接收块))启动数据接收事务。如果存在要传输到 MAC-PHY 的有效以太网帧,SPI 主机将创建无效传输数据块(空块)或有效传输数据块。可以从缓冲区状态寄存器或页脚中读取 MAC-PHY 中可用的接收块。

如果前一个数据页脚没有可用的接收数据块,并且一旦接收数据块再次可用于读取,则 MAC-PHY 中断会断言到 SPI 主机。在接收到第一个数据头时,此中断将被取消断言,并且第一个数据块的接收页脚将包含可用的接收块信息。

MAC-PHY 中断

满足以下条件时,MAC-PHY 中断会断言。

接收块可用 - 当前一个数据页脚没有可用的接收数据块,并且一旦接收数据块再次可用于读取时,此中断会断言。在接收到第一个数据头时,此中断将被取消断言。

传输块信用可用 - 当前一个数据页脚指示没有可用的传输信用,并且一旦传输信用可用于传输传输数据块时,此中断会断言。在接收到第一个数据头时,此中断将被取消断言。

扩展状态事件 - 当前一个数据页脚指示没有扩展状态,并且一旦扩展事件可用时,此中断会断言。在这种情况下,主机应读取状态 #0 寄存器以了解相应的错误/事件。在接收到第一个数据头时,此中断将被取消断言。

控制事务

4 字节的控制头包含以下字段:

DNC (位 31) - 数据非控制标志。此标志指定 SPI 的类型

事务。对于控制命令,此位应为“0”。0 - 控制命令 1 - 数据块

HDRB (位 30) - 接收头错误。当由 MAC-PHY 设置时,表示

接收到的头带有奇偶校验错误。SPI 主机应始终清除此位。MAC-PHY 忽略 SPI 主机在 MOSI 上发送的 HDRB 值。

WNR (位 29) - 写入-非读取。此位指示是否要将数据写入

寄存器(设置时)或从寄存器读取(清除时)。

AID (位 28) - 地址增量禁用。清除时,地址将

在每次寄存器读取或写入后自动后增 1。设置时,禁用地址自动增量,允许在同一寄存器地址发生连续读取和写入。

MMS (位 27..24) - 内存映射选择器。此字段选择要访问的特定

寄存器内存映射。

ADDR (位 23..8) - 地址。要访问的选定

内存映射中的第一个寄存器的地址。

LEN (位 7..1) - 长度。指定要读取/写入的寄存器数量。

此字段解释为寄存器数量减 1,允许从 ADDR 中指定的地址开始最多读取或写入 128 个连续寄存器。长度为零应读取或写入单个寄存器。

P (位 0) - 奇偶校验。在控制命令头上计算得出的奇偶校验位。

使用的方法是奇校验。

控制事务由一个或多个控制命令组成。SPI 主机使用控制命令来读取和写入 MAC-PHY 内的寄存器。每个控制命令都由一个 4 字节的控制命令头组成,后跟控制写入命令的寄存器写入数据。

MAC-PHY 忽略来自 SPI 主机的控制写入命令末尾的最后 4 个字节的数据。控制写入命令也从 MAC-PHY 回显到 SPI 主机,以识别发生任何总线错误时哪个寄存器写入失败。回显的控制写入命令将具有前 4 个字节的未使用值,SPI 主机应忽略该值,后跟 4 字节的回显控制头,然后是回显的寄存器写入数据。控制写入命令可以写入单个寄存器或多个连续寄存器。当写入多个连续寄存器时,地址由 MAC-PHY 自动后增。写入任何未实现或未定义的寄存器应被忽略,并且不会产生任何影响。

对于控制读取命令,MAC-PHY 忽略来自 SPI 主机的控制头后面的所有数据。控制读取命令也从 MAC-PHY 回显到 SPI 主机,以识别发生任何总线错误时哪个寄存器读取失败。回显的控制读取命令将具有前 4 个字节的未使用值,SPI 主机应忽略该值,后跟 4 字节的回显控制头,然后是寄存器读取数据。控制读取命令可以读取单个寄存器或多个连续寄存器。当读取多个连续寄存器时,地址由 MAC-PHY 自动后增。读取任何未实现或未定义的寄存器应返回零。

设备驱动程序 API

include/linux/oa_tc6.h 定义了以下函数

struct oa_tc6 *oa_tc6_init(struct spi_device *spi, struct net_device *netdev)

初始化 OA TC6 库。

void oa_tc6_exit(struct oa_tc6 *tc6)

释放分配的 OA TC6 库。

int oa_tc6_write_register(struct oa_tc6 *tc6, u32 address, u32 value)

在 MAC-PHY 中写入单个寄存器。

int oa_tc6_write_registers(struct oa_tc6 *tc6, u32 address, u32 value[], u8 length)

从 @address 开始,在 MAC-PHY 中写入多个连续的寄存器。从 @address 开始,最多可以写入 128 个连续的寄存器。

int oa_tc6_read_register(struct oa_tc6 *tc6, u32 address, u32 *value)

在 MAC-PHY 中读取单个寄存器。

int oa_tc6_read_registers(struct oa_tc6 *tc6, u32 address, u32 value[], u8 length)

从 @address 开始,在 MAC-PHY 中读取多个连续的寄存器。从 @address 开始,最多可以读取 128 个连续的寄存器。

netdev_tx_t oa_tc6_start_xmit(struct oa_tc6 *tc6, struct sk_buff *skb);

skb 中的以太网帧正在或将要通过 MAC-PHY 传输。

int oa_tc6_zero_align_receive_frame_enable(struct oa_tc6 *tc6);

可以启用零对齐接收帧功能,以将所有接收到的以太网帧数据对齐到任何接收数据块有效负载的开头,起始字偏移 (SWO) 为零。