4. S32G车载网络控制器与驱动配置

S32G 作为中央计算平台的核心网关芯片,内部集成了多路 CAN FD 控制器、千兆以太网 MAC 以及硬件交换引擎。这些外设并非“上电即用”,而是需要经过寄存器级初始化、时钟与引脚复用配置,再由 Linux 内核驱动完成设备注册,最终通过设备树把硬件资源与驱动实例绑定起来。本节围绕这条从硅片到协议栈的完整链路展开,重点说明每一层“配置了什么、为什么这样配、如何判断配对了”。

一、CAN FD 控制器的寄存器级配置

S32G 的 CAN 子系统通常基于 FlexCAN 模块,每个实例对应一组寄存器基址。配置顺序遵循“先复位、再时钟、后功能”的原则。关键寄存器包括 MCR(模块配置)、CTRL1(位时序与采样)、CBT(CAN FD 位时序)、FDCTRL(FD 使能)以及 RAMn 报文缓冲区。

以标称 500 kbps、数据段 2 Mbps、采样点 80% 为例,假设协议时钟源为 40 MHz。标称段预分频 PRESDIV 取 4,则时间量子 tq = 4/40 MHz = 100 ns,位时间 20 tq,其中 PROPSEG+PHASE1 共 16 tq、PHASE2 为 4 tq,采样点落在 16/20 = 80%。数据段通过 FDCBT 单独设置,取预分频 1,tq = 25 ns,位时间 20 tq,PHASE1 取 15、PHASE2 取 4,同样保持 80% 采样点。这些值写入 CTRL1 与 CBT 后,必须置位 MCR 的 FRZ 与 HALT 才能安全修改,改完再清除。

/* 示例:FlexCAN FD 位时序配置片段(教学示例,非实测值) */
writel(0x0, base + MCR);            /* 进入冻结模式 */
writel(0x0, base + CTRL1);
writel((4-1)<<24 | (15-1)<<16 | (4-1)<<0, base + CTRL1); /* 标称段 */
writel((1-1)<<24 | (15-1)<<16 | (4-1)<<0, base + CBT);   /* 数据段 */
writel(FDCTRL_FDEN | FDCTRL_BRS, base + FDCTRL);
writel(MCR_FRZ | MCR_HALT, base + MCR);  /* 退出冻结,进入正常模式 */

配置完成后,通过读取 ECR(错误计数)与 ESR(错误状态)判断控制器是否进入 Error Active 状态;若 ECR 的 TXERR/RXERR 持续增长,通常意味着位时序或终端电阻不匹配,而非驱动问题。

二、以太网 MAC 与交换机 IP 的配置要点

S32G 的以太网子系统包含 GMAC(千兆 MAC)与 SJA1110 类交换引擎。GMAC 侧需要配置 MAC 地址寄存器、DMA 描述符基址、MII/RGMII 接口模式以及流控阈值。交换机 IP 则涉及端口使能、VLAN 表、FDB(转发数据库)和镜像端口。寄存器级配置的核心是“端口—队列—描述符”三者的对应关系:每个端口分配独立的 TX/RX 队列,队列再指向内存中的描述符环。

实际工程中,MAC 与交换机的寄存器配置大多由驱动完成,工程师真正需要手工介入的是设备树中的 PHY 地址、接口类型(rgmii-id 或 sgmii)以及时钟延迟参数。若 RGMII 的 TX/RX 延迟配错,链路能 up 但丢包率极高,此时应优先检查设备树中的 phy-mode 与 tx-internal-delay-ps。

三、时钟与引脚复用

S32G 的每个外设都有独立的时钟门控,位于 MC_ME 与 MC_CGM 模块。CAN 控制器通常挂载在 CAN_PE 时钟域,以太网挂载在 ENET 域。上电后若未使能对应时钟,寄存器读写会返回 0 或触发总线错误。引脚复用则通过 SIUL2 的 MSCR 寄存器完成,每个引脚需要同时配置功能编号(MSCR 的 SSS 字段)和电气属性(驱动强度、上下拉、开漏)。

例如,将 PTA15 复用为 CAN0_TX,需要把 MSCR[15] 的 SSS 写为对应 ALT 功能值,并清除 OBE 以外的干扰位;若该引脚同时被其他外设占用,会出现“寄存器写成功但波形无输出”的现象。因此引脚复用检查应作为驱动加载前的固定动作。

四、驱动加载与设备树适配

Linux 下 FlexCAN 驱动为 flexcan,以太网为 stmmac,交换机为 sja1110 或厂商提供的 switchdev 驱动。设备树中每个节点必须包含 compatible、reg、interrupts、clocks 和 pinctrl 五类属性,缺一不可。驱动 probe 时按 compatible 匹配,再依次申请寄存器、中断、时钟和引脚,任何一步失败都会导致设备不注册。

/* 示例:CAN0 设备树节点(教学示例) */
can0: can@401c0000 {
    compatible = "nxp,s32g-flexcan";
    reg = <0x0 0x401c0000 0x0 0x4000>;
    interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
    clocks = <&clks CAN0_CLK>;
    pinctrl-names = "default";
    pinctrl-0 = <&can0_pins>;
    status = "okay";
};

加载后通过 ip -d link show can0 查看状态,用 ip link set can0 up type can bitrate 500000 dbitrate 2000000 fd on 激活 FD 模式。若 dmesg 出现 “flexcan: probe failed” 或 “clock not found”,应回到设备树核对 clocks 引用与时钟控制器节点是否一致。

S32G 网络外设配置链路:从寄存器到协议栈 寄存器级配置 MCR / CTRL1 / CBT FDCTRL / ECR / ESR GMAC DMA / VLAN / FDB 位时序、采样点、队列映射 时钟与引脚复用 MC_ME / MC_CGM 门控 SIUL2 MSCR 功能选择 驱动强度 / 上下拉 / 开漏 时钟未使能 → 寄存器读 0 设备树适配 compatible / reg interrupts / clocks pinctrl-0 / phy-mode 五类属性缺一不可 Linux 驱动层:flexcan / stmmac / sja1110 probe 顺序:匹配 compatible → 申请 reg → 申请中断 → 获取时钟 → 配置 pinctrl 网络协议栈:SocketCAN / 网络设备 / switchdev can0 up / ip link / dmesg 状态确认 验证与排障入口 ECR 错误计数 ↑ → 位时序/终端电阻;dmesg probe failed → 设备树 clocks/pinctrl;链路 up 但丢包 → RGMII 延迟参数

五、配置结果判断与常见问题

判断一条 CAN FD 链路是否配置成功,最直接的方法是回环测试:将控制器置为 loopback 模式,发送一帧标准 ID 报文,若 ECR 无增长且接收缓冲区收到相同数据,说明位时序与 RAM 配置正确。以太网侧则用 ethtool 查看链路速率与双工模式,再用 ping 大包验证 RGMII 延迟是否合适。

设备树中 status = "okay" 只是使能节点,真正决定驱动能否 probe 的是 clocks 与 pinctrl 引用是否指向已使能的父节点。很多“设备树写了但驱动不加载”的问题,根源在于时钟控制器节点本身处于 disabled 状态。
修改 CAN 位时序时,务必先置位 MCR 的 FRZ 和 HALT,否则写入 CTRL1/CBT 的值不会生效,且可能触发总线关闭。修改完成后清除这两位,控制器才会重新同步总线。

把上述四层串起来看:寄存器决定电气行为,时钟与引脚决定物理通路,设备树决定资源绑定,驱动决定协议栈接入。任何一层缺失,现象都表现为“设备不工作”,但排查入口完全不同。掌握每层的判断依据,才能在 S32G 平台上快速定位网络通信故障。