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 (Bit 31) - Data-Not-Control 标志。此标志指定 SPI 的类型
事务。对于 TX 数据块,此位应为“1”。0 - 控制命令 1 - 数据块
- SEQ (Bit 30) - 数据块序列。此位用于指示
到 MAC-PHY 的偶数/奇数发送数据块序列。
- NORX (Bit 29) - No Receive 标志。SPI 主机可以设置此位以防止
MAC-PHY 在 MISO 上为当前块传送 RX 数据(页脚中的 DV = 0),表明主机不会处理它。通常,SPI 主机应设置 NORX = 0,表明它将接受并处理当前块中的任何接收帧数据。
RSVD (Bit 28..24) - 保留:所有保留位应为“0”。
- VS (Bit 23..22) - 供应商特定。这些位是特定于实现的。
如果 MAC-PHY 未实现这些位,则主机应将它们设置为“0”。
- DV (Bit 21) - 数据有效标志。SPI 主机使用此位来指示
当前块是否包含有效的发送帧数据 (DV = 1) 或不包含 (DV = 0)。当为“0”时,MAC-PHY 会忽略块有效负载。请注意,接收路径不受数据标头中 DV 位设置的影响。
- SV (Bit 20) - Start Valid 标志。当
以太网帧的开头出现在当前发送数据块有效负载中时,SPI 主机应设置此位。否则,此位应为零。此位不应与 IEEE 802.3 [2] 中描述的帧起始定界符 (SFD) 字节混淆。
- SWO (Bit 19..16) - Start Word Offset。当 SV = 1 时,此字段应
包含指向要传输的新以太网帧起点的发送数据块有效负载中的 32 位字偏移量。当 SV = 0 时,主机应将此字段写入零。
RSVD (Bit 15) - 保留:所有保留位应为“0”。
- EV (Bit 14) - End Valid 标志。当结束
以太网帧出现在当前发送数据块有效负载中时,SPI 主机应设置此位。否则,此位应为零。
- EBO (Bit 13..8) - End Byte Offset。当 EV = 1 时,此字段应包含
指向要传输的以太网帧的最后一个字节的发送数据块有效负载中的字节偏移量。当 EV = 0 时,此字段应为零。
- TSC (Bit 7..6) - 时间戳捕获。请求在
将帧传输到网络上时捕获时间戳。00 - 不捕获时间戳 01 - 将时间戳捕获到时间戳捕获寄存器 A 10 - 将时间戳捕获到时间戳捕获寄存器 B 11 - 将时间戳捕获到时间戳捕获寄存器 C
RSVD (Bit 5..1) - 保留:所有保留位应为“0”。
- P (Bit 0) - 奇偶校验。在发送数据标头上计算的奇偶校验位。
使用的方法是奇校验。
MAC-PHY 中可用于存储传入发送数据块有效负载的缓冲区数量表示为发送信用。MAC-PHY 中的可用发送信用可以从缓冲区状态寄存器或页脚读取(有关页脚信息,请参阅下文)。SPI 主机不应写入比可用发送信用更多的数据块,因为这会导致发送缓冲区溢出错误。
如果先前的数据页脚没有可用的发送信用,并且一旦发送信用变得可用于传输发送数据块,则会断言 MAC-PHY 中断到 SPI 主机。在接收到第一个数据标头时,此中断将被撤销,并且第一个数据块的接收页脚将具有可用的发送信用信息。
通常从 MAC-PHY 传输到 SPI 主机的以太网帧将作为多个接收数据块发送。每个接收数据块将有 64 字节的数据块有效负载,后跟 4 字节页脚,其中包含确定 64 字节数据块有效负载中接收帧数据的有效性和位置所需的信息。
+---------------------------------------------------+
| Rx Chunk |
| +----------------+ +---------------------------+ | MISO
| | 4 bytes footer | | 64 bytes chunk payload | |------------>
| +----------------+ +---------------------------+ |
+---------------------------------------------------+
4 字节页脚包含以下字段,
- EXST (Bit 31) - 扩展状态。当任何位在
STATUS0 或 STATUS1 寄存器被设置且未被屏蔽时,将设置此位。
- HDRB (Bit 30) - 接收标头错误。设置时,指示 MAC-PHY
接收到的控制或数据标头具有奇偶校验错误。
- SYNC (Bit 29) - 配置同步标志。此位反映了
CONFIG0 配置寄存器中的 SYNC 位的状态(参见表 12)。零表示 SPI 主机可能未按预期配置 MAC-PHY。配置后,SPI 主机设置配置寄存器中的相应位,该位反映在此字段中。
- RCA (Bit 28..24) - 可用接收块。RCA 字段指示
SPI 主机,除了当前的接收数据块之外,还有最少数量的帧数据的额外接收数据块可用于读取。当 MAC-PHY 的缓冲区中没有挂起的接收帧数据可供读取时,此字段为零。
- VS (Bit 23..22) - 供应商特定。这些位是特定于实现的。
如果未实现,MAC-PHY 应将这些位设置为“0”。
- DV (Bit 21) - 数据有效标志。MAC-PHY 使用此位来指示
当前接收数据块是否包含有效的接收帧数据 (DV = 1) 或不包含 (DV = 0)。当为“0”时,SPI 主机应忽略块有效负载。
- SV (Bit 20) - Start Valid 标志。MAC-PHY 在当前
块有效负载包含以太网帧的开头时设置此位。否则,此位为零。SV 位不应与 IEEE 802.3 [2] 中描述的帧起始定界符 (SFD) 字节混淆。
- SWO (Bit 19..16) - Start Word Offset。当 SV = 1 时,此字段包含
包含新接收到的以太网帧的第一个字节的接收数据块有效负载中的 32 位字偏移量。当已将接收时间戳添加到接收到的以太网帧的开头 (RTSA = 1) 时,SWO 指向时间戳的最高有效字节。当 SV = 0 时,此字段将为零。
- FD (Bit 15) - 帧丢弃。设置时,此位指示 MAC 已
检测到 SPI 主机应丢弃接收到的以太网帧的条件。此位仅在接收到的以太网帧的结尾 (EV = 1) 处有效,并且在所有其他时间应为零。
- EV (Bit 14) - End Valid 标志。MAC-PHY 在结尾
接收到的以太网帧出现在此接收数据块有效负载中。
- EBO (Bit 13..8) - End Byte Offset:当 EV = 1 时,此字段包含
接收数据块有效负载中的字节偏移量,该字节偏移量定位接收到的以太网帧的最后一个字节。当 EV = 0 时,此字段为零。
- RTSA (Bit 7) - 添加接收时间戳。当 32 位或
已将 64 位时间戳添加到接收到的以太网帧的开头。当 SV = 0 时,MAC-PHY 应将此位设置为零。
- RTSP (Bit 6) - 接收时间戳奇偶校验。在
添加到接收到的以太网帧开头的 32 位/64 位时间戳。使用的方法是奇校验。当 RTSA = 0 时,MAC-PHY 应将此位设置为零。
- TXC (Bit 5..1) - 发送信用。此字段包含最少数量
在不产生发送缓冲区溢出错误的情况下,SPI 主机可以在单个事务中写入的帧数据的发送数据块。
- P (Bit 0) - 奇偶校验。在接收数据页脚上计算的奇偶校验位。
使用的方法是奇校验。
SPI 主机将根据 MAC-PHY 中可用的接收块(在接收块页脚 (RCA - 可用接收块) 中提供)启动数据接收事务。如果存在要传输到 MAC-PHY 的有效以太网帧,SPI 主机将创建数据无效发送数据块(空块)或数据有效发送数据块。MAC-PHY 中可用的接收块可以从缓冲区状态寄存器或页脚读取。
如果先前的数据页脚没有可用的接收数据块,并且一旦再次有接收数据块可供读取,则会断言 MAC-PHY 中断到 SPI 主机。在接收到第一个数据标头时,此中断将被撤销,并且第一个数据块的接收页脚将具有可用的接收块信息。
MAC-PHY 中断¶
满足以下条件时,会断言 MAC-PHY 中断。
可用接收块 - 当先前的数据页脚没有可用的接收数据块,并且一旦接收数据块变得可用于读取时,会断言此中断。在接收到第一个数据标头时,此中断将被撤销。
可用发送块信用 - 当先前的数据页脚指示没有可用的发送信用,并且一旦发送信用变得可用于传输发送数据块时,会断言此中断。在接收到第一个数据标头时,此中断将被撤销。
扩展状态事件 - 当先前的数据页脚指示没有扩展状态,并且一旦扩展事件变得可用时,会断言此中断。在这种情况下,主机应读取状态 #0 寄存器以了解相应的错误/事件。在接收到第一个数据标头时,此中断将被撤销。
控制事务¶
4 字节控制标头包含以下字段,
- DNC (Bit 31) - Data-Not-Control 标志。此标志指定 SPI 的类型
事务。对于控制命令,此位应为“0”。0 - 控制命令 1 - 数据块
- HDRB (Bit 30) - 接收标头错误。由 MAC-PHY 设置时,指示
接收到的标头具有奇偶校验错误。SPI 主机应始终清除此位。MAC-PHY 会忽略 SPI 主机在 MOSI 上发送的 HDRB 值。
- WNR (Bit 29) - Write-Not-Read。此位指示是否要写入数据
到寄存器(设置时)或从寄存器读取数据(清除时)。
- AID (Bit 28) - 地址增量禁用。清除时,地址将自动
在每次寄存器读取或写入后递增 1。设置时,地址自动递增被禁用,允许在同一寄存器地址连续进行读取和写入。
- MMS (Bit 27..24) - 内存映射选择器。此字段选择特定的
要访问的寄存器内存映射。
- ADDR (Bit 23..8) - 地址。第一个寄存器的地址在
要访问的选定内存映射。
- LEN (Bit 7..1) - 长度。指定要读取/写入的寄存器数量。
此字段被解释为寄存器数量减 1,允许从 ADDR 中指定的地址开始最多读取或写入 128 个连续寄存器。长度为零应读取或写入单个寄存器。
- P (Bit 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)¶
从 MAC-PHY 中的 @address 开始写入多个连续寄存器。最多可以从 @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)¶
从 MAC-PHY 中的 @address 开始读取多个连续寄存器。最多可以从 @address 开始读取 128 个连续寄存器。
skb 中的发送以太网帧正在或将要通过 MAC-PHY 传输。
-
int oa_tc6_zero_align_receive_frame_enable(struct oa_tc6 *tc6);¶
可以启用零对齐接收帧功能,以将所有接收以太网帧数据对齐,使其从任何接收数据块有效负载的开头开始,起始字偏移量 (SWO) 为零。