4. Sitara以太网子系统架构
在 TI Sitara 系列(如 AM64x、AM243x、AM62x)中,工业以太网能力并非由单一 MAC 提供,而是由两套互补的以太网子系统构成:CPSW3g(Common Platform Switch, 3rd generation Gigabit)与 ICSSG(Industrial Communications Subsystem Gigabit)。理解这两者的定位差异,是后续做 TSN 时间敏感网络配置、多队列调度和驱动裁剪的前提。
一、CPSW3g 与 ICSSG 的定位差异
CPSW3g 是 SoC 内部集成的通用千兆以太网交换机子系统,通常包含两个外部 MAC 端口(可接 PHY 或直接 RGMII/RMII),内部带有一个硬件交换引擎(switch fabric)、一个主机端口(Host Port,连接到 SoC 内部总线)以及一组 DMA 通道。它适合做标准以太网、VLAN 划分、多队列 QoS 和基础 TSN 特性(如基于优先级的调度)。
ICSSG 则是可编程工业通信子系统,内部包含两个 PRU(Programmable Real-time Unit)内核、两个千兆 MAC、以及专用的工业外设(如 IEP 定时器、MII_RT 实时接口)。ICSSG 的强项在于实时协议(EtherCAT、PROFINET IRT、EtherNet/IP)和精确时间同步,其 MAC 端口可以工作在“双端口独立 MAC”或“交换机模式”下。在 AM64x 上,典型配置是 CPSW3g 负责通用网络与 TSN,ICSSG 负责实时工业协议。
二、双端口 MAC 与交换机模式
CPSW3g 的两个外部端口(Port 1、Port 2)在硬件上是对等的,可以各自独立连接 PHY,也可以组成交换机。当工作在交换机模式时,两个外部端口之间的帧转发由硬件交换引擎完成,不需要 CPU 参与;主机端口(Port 0)则用于 CPU 收发帧。这种模式下,SoC 相当于一个三端口交换机:两个对外,一个对内。
交换机模式的关键配置点是 ALE(Address Lookup Engine)。ALE 负责学习 MAC 地址、维护转发表、执行 VLAN 过滤和优先级映射。ALE 表项可以配置为“动态学习”或“静态固定”,在工业场景中,为了确定性,常把关键设备的 MAC 地址静态写入 ALE,避免学习过程带来的抖动。
三、VLAN 与优先级队列
CPSW3g 支持 802.1Q VLAN,每个端口可以配置 PVID(Port VLAN ID)和成员集。接收帧时,ALE 根据 VLAN 标签和端口成员关系决定是否转发;发送时,可以根据 VLAN 优先级(PCP,3 bit)映射到不同的发送队列。
CPSW3g 提供 8 个发送队列(TX Queue 0~7)和 8 个接收队列(RX Queue 0~7)。优先级映射通过 CPSW_PN_REG_PRI_CIR 等寄存器或 Linux 的 tc 工具配置。例如,把 PCP=7 的帧映射到 TX Queue 7,PCP=0 映射到 TX Queue 0,这样高优先级流量可以优先出队。在 TSN 场景中,这 8 个队列进一步与 802.1Qbv 时间门控、802.1Qav 信用整形配合,形成确定性的调度。
四、DMA 描述符与数据通路
CPSW3g 的数据搬运由 CPPI(Common Port Peripheral Interface)DMA 完成。每个数据包对应一个描述符(Descriptor),描述符中包含:数据缓冲区指针、包长度、端口号、VLAN 信息、校验和状态、以及“所有权位”(Owner bit)。Owner bit 是软件与硬件之间的握手信号:当 Owner=1 时表示描述符归硬件所有,软件不能碰;当硬件处理完把 Owner 清 0,软件才能回收。
描述符以链表形式组织,分为发送描述符环和接收描述符环。发送时,驱动把帧填入缓冲区,设置 Owner=1,然后写 CPSW 的 TX 触发寄存器,硬件自动读取描述符并发送。接收时,硬件把收到的帧写入缓冲区,更新描述符状态,产生中断,驱动从接收环中取出描述符并交给协议栈。
五、中断与 NAPI 机制
CPSW3g 的中断源包括:RX 完成、TX 完成、ALE 事件、统计溢出等。在 Linux 驱动中,为了兼顾吞吐和延迟,采用 NAPI(New API)机制:中断处理函数只做最小工作(关闭 RX 中断、调度 NAPI poll),真正的收包在软中断上下文中以轮询方式批量处理。这样在高流量下可以避免“中断风暴”,同时保持低延迟。
具体流程是:硬件收到帧 → 产生 RX 中断 → 中断处理函数调用 napi_schedule() → 软中断中执行 cpsw_rx_poll() → 轮询接收描述符,批量交给 netif_receive_skb() → 处理完一定数量或环空后,重新使能 RX 中断。TX 方向通常采用“发送完成中断 + 清理描述符”的方式,也可以配置为轮询清理。
六、驱动初始化流程分析
以 Linux 内核中的 cpsw_new 驱动(drivers/net/ethernet/ti/cpsw_new.c)为例,初始化大致分为以下阶段:
- Probe 阶段:匹配设备树 compatible,获取寄存器基地址、时钟、中断号、PHY 句柄等资源。
- 硬件复位与时钟使能:复位 CPSW 子系统,使能各模块时钟,配置 CTRL 寄存器中的 RGMII 延迟等。
- ALE 初始化:清空 ALE 表,配置端口默认 VLAN、未知帧处理策略(转发/丢弃)。
- DMA 与描述符环分配:为每个 RX/TX 通道分配描述符内存(通常用
dma_alloc_coherent),初始化描述符链表,写入 CPSW 的 CPPI 寄存器。 - 中断注册与 NAPI 初始化:注册 RX/TX 中断处理函数,调用
netif_napi_add()注册 NAPI 实例。 - PHY 连接与链路建立:通过 MDIO 扫描 PHY,配置速率、双工、自协商,注册
phy_connect回调。 - 注册网络设备:调用
register_netdev(),使能端口,启动队列。
在设备树中,CPSW3g 节点通常包含 compatible = "ti,am64-cpswxg-nuss"、两个 ethernet-ports 子节点、mdio 子节点以及 interrupts 属性。ICSSG 的节点则包含 compatible = "ti,am64-icssg-prueth",并引用 PRU 固件。理解这些节点与驱动阶段的对应关系,是排查“网口不 up”“收包丢包”“VLAN 不通”等问题的基础。
从图中可以看到,CPSW3g 的数据通路是“外部 MAC → 交换引擎/ALE → 主机端口 → DMA 描述符环 → 中断/NAPI → 协议栈”。驱动初始化的七个阶段则对应硬件从复位到可用的完整过程。实际调试时,如果网口无法 up,优先检查第 2 步(时钟/复位)和第 6 步(PHY 链路);如果收包丢包严重,优先检查第 4 步(描述符环大小)和第 5 步(NAPI 预算与中断合并)。
0x08000000,ICSSG 的 PRU 子系统基地址为 0x30000000。设备树中 interrupts 属性需要与 GIC 的 SPI 编号对应,否则会出现“中断注册失败”或“收不到包”的现象。
最后需要强调:CPSW3g 与 ICSSG 虽然都提供双端口 MAC,但它们的寄存器模型、DMA 机制和驱动框架完全不同。CPSW3g 走标准 Linux 网络驱动路径(netdev + NAPI + PHY 框架),而 ICSSG 的 PRU 固件需要单独加载,其以太网功能往往通过 remoteproc 和专用固件实现。在做 TSN 工程时,通常把时间敏感流量放在 CPSW3g 的优先级队列上,把实时工业协议放在 ICSSG 上,两者通过 SoC 内部总线协同工作。