• 正文
  • 相关推荐
申请入驻 产业图谱

STM32MP257 RMII Switch 配置全指南:百兆 PHY 适配与 TSN 功能使能

7小时前
323
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

STM32MP257 系列作为双核 A35 架构的高性能 MPU,内置千兆 Ethernet Switch,支持 RMII(百兆)与 RGMII(千兆)双接口 PHY 适配。官方参考设计与文档多聚焦 RGMII 接口配置,而实际项目中百兆 RMII PHY 的应用场景更为广泛。本文从硬件架构解析、软件配置分步实现、常见问题排查三个维度,详细拆解 STM32MP257 的 RMII Switch 配置流程,覆盖 Developer 与 Distribution 两种开发包适配,助力快速实现稳定的百兆以太网交换功能与 TSN(时间敏感网络)特性。

资料获取:如何配置STM32MP257的RMII Switch

1. 核心架构与基础认知

在配置 RMII Switch 前,需先明确 STM32MP257 的以太网 subsystem 架构、端口定义与软件驱动框架,为后续配置奠定基础。

1.1 硬件架构核心特性

  • 网口资源:STM32MP257 内置 ETH1、ETH2 两个独立网口,ETH1 可灵活配置为 “独立 GMAC 接口” 或 “Switch 模式”;使能 Switch 后,ETH3 可扩展接入额外 PHY,形成 “ETH1(Switch)+ ETH2(独立)+ ETH3(扩展)” 的多网口架构。
  • 接口兼容性:Switch 支持 RMII(百兆)与 RGMII(千兆)双接口 PHY,本文聚焦 RMII 百兆 PHY 的硬件适配与软件配置,硬件设计可参考官方文档 AN5489(STM32MP23/25xx MPU 硬件开发指南)。
  • 核心模块:ETH1 Switch 由两部分组成 ——DeIP 标准 802.1 功能模块与 ACM(Ultra-low latency cut-through)模块,共同支撑交换转发与低延迟传输,为 TSN 功能提供硬件基础。

1.2 端口定义与网络拓扑

使能 Switch 后,各端口角色与网络拓扑如下:

端口名称 角色定位 配置要求
sw0p1 对内 GMAC 接口 无需配置 IP,用于 MPU 与 Switch 内部通信
sw0p2 对外 GMAC 接口 无需配置 IP,对应 ETH1 物理口,连接 RMII PHY
sw0p3 对外 GMAC 接口 无需配置 IP,对应 ETH3 物理口,连接扩展 RMII PHY
sw0ep 终端通信端口 需配置 IP(默认 192.168.0.10),是 MPU 与外部网络的交互入口
ETH2(end0) 独立 GMAC 接口 可单独配置为普通网口,与 Switch 功能解耦

1.3 软件驱动框架

Switch 功能的软件实现依赖三层核心驱动,需确保全量使能:

  • STM32 deip glue 驱动:负责 RCC 时钟配置,为 Switch 提供稳定时钟源;
  • Switch driver(edge-lkm):核心驱动,支持 DeIP 标准 802.1 功能与 TSN 应用适配;
  • ACM driver:控制 ACM 模块寄存器,实现低延迟数据转发。

2. Developer 开发包配置步骤(手动编译驱动)

Developer 开发包适用于需要手动调试驱动、灵活配置的场景,核心步骤包括 kernel 配置、时钟适配、设备树修改、驱动编译与脚本运行。

2.1 Kernel 配置(使能桥接与 VLAN 功能)

Switch 本质是以太网桥接设备,需在 kernel 中开启桥接相关配置,具体如下:

CONFIG_BRIDGE=m                  # 启用桥接模块
CONFIG_BRIDGE_NETFILTER=m        # 桥接网络过滤功能
CONFIG_BRIDGE_VLAN_FILTERING=y   # VLAN过滤使能
CONFIG_VLAN_8021Q=m              # 802.1Q VLAN协议支持

2.2 OPTEE 时钟配置(提供 125MHz 核心时钟)

Switch 为千兆以太网架构,即使接入百兆 RMII PHY,内部仍需 125MHz 时钟支撑,需修改 OPTEE 的 RCC 时钟配置:

&rcc {
    st,flexgen = <
        // 其他时钟配置...
        FLEXGEN_CFG(54, XBAR_SRC_PLL6, 0, 3) /* 生成125MHz时钟 */
        // 其他时钟配置...
    >;
};

2.3 Kernel 设备树配置(ETH1 与 Switch 使能)

设备树需明确 ETH1 的 GMAC 模式、Switch 的 RMII 接口属性与 PHY 参数,配置如下:

&eth1 {
    status = "okay";
    pinctrl-0 = <&eth1_mdio_pins_a>;
    pinctrl-names = "default";
    phy-mode = "rgmii";          // ETH1自身为RGMII模式,Switch对外为RMII
    phy-handle = <&phy1_eth1>;
    st,ext-phyclk;
    
    fixed_link: fixed-link {
        speed = <1000>;          // 内部固定千兆链路
        full-duplex;
    };
    
    mdio1 {
        #address-cells = <1>;
        #size-cells = <0>;
        compatible = "snps,dwmac-mdio";
        
        // PHY1配置(ETH1对应sw0p2)
        phy1_eth1: ethernet-phy@1 {
            compatible = "ethernet-phy-id001c.c816";  // PHY型号适配
            reset-gpios = <&gpioj 9 GPIO_ACTIVE_LOW>; // 复位GPIO
            max-speed = <100>;                        // 百兆速率限制
            reset-assert-us = <10000>;                // 复位断言时间
            reset-deassert-us = <80000>;              // 复位释放时间
            reg = <1>;                                // PHY地址
        };
        
        // PHY2配置(ETH3对应sw0p3,未扩展可注释)
        phy2_eth1: ethernet-phy@2 {
            compatible = "ethernet-phy-id001c.c816", "ethernet-phy-ieee802.3-c22";
            max-speed = <100>;
            reg = <2>;
        };
    };
};

&switch0 {
    status = "okay";
    pinctrl-0 = <&eth1_rmii_pins_a>;  // RMII引脚配置
    pinctrl-names = "default";
    phy-mode = "rmii";                // 对外接口为RMII模式
    st,ethsw-internal-125;            // 启用内部125MHz时钟
};

2.4 编译 Switch 驱动模块

需先加载 STM32MP2 的 SDK 环境,再编译 DeIP 与 TSN 相关驱动,命令如下:

# 1. 克隆驱动源码
git clone https://github.com/STMicroelectronics/tttech-tsn-swch-content.git -b 1.6.8

# 2. 编译DeIP驱动
cd st,stm32-deip
INSTALL_MOD_PATH=./install_artifact KDIR=<linux路径>/build platform=st sched=fsc sid=sid make
INSTALL_MOD_PATH=./install_artifact KDIR=<linux路径>/build platform=st sched=fsc sid=sid make modules_install

# 3. 编译TSN Switch驱动
cd ../tsn_sw_base.edge-lkm
INSTALL_MOD_PATH=./install_artifact KDIR=<linux路径>/build platform=st sched=fsc sid=sid make
INSTALL_MOD_PATH=./install_artifact KDIR=<linux路径>/build platform=st sched=fsc sid=sid make modules
INSTALL_MOD_PATH=./install_artifact KDIR=<linux路径>/build platform=st sched=fsc sid=sid make modules_install

2.5 运行初始化脚本

(1)驱动加载脚本(switch_init.sh)

用于加载桥接、VLAN、Switch 核心驱动,内容如下:

modprobe 8021q                  # 加载VLAN模块
modprobe bridge                  # 加载桥接模块
modprobe sch_prio                # 优先级调度模块
modprobe sch_mqprio              # 多队列优先级模块
modprobe stm32_deip              # STM32 DeIP驱动
modprobe edgx_pfm_lkm netif="eth0:0"  # 适配ETH1网络名(需根据实际修改)

(2)TSN 与网络配置脚本(ttt-ip-init.sh)

用于配置 PHY 映射、端口延迟、IP 地址与桥接,核心功能包括:

  • 读取参考网口 MAC 地址并配置到 sw0ep;
  • 绑定 PHY 到 sw0p2/sw0p3 端口;
  • 配置端口收发延迟参数;
  • 创建桥接设备 br0,绑定 sw0p1/sw0p2/sw0p3;
  • 启动 LLDP、deptp 等 TSN 相关服务。

运行脚本:./ttt-ip-init.sh start,完成后 sw0ep 将配置 IP 192.168.0.10,桥接设备 br0 生效。

3. Distribution 开发包配置步骤(Yocto 编译)

Distribution 开发包适用于量产场景,通过 Yocto 构建包含 TSN Switch 功能的文件系统,步骤更简洁。

3.1 编译 TSN Switch 文件系统

通过 Yocto 添加 TSN Switch 扩展层,编译完整文件系统:

# 添加TSN Switch layer到Yocto工程
bitbake-layers add-layer ../layers/meta-st/meta-st-stm32mp-tsn-swch
# 编译文件系统(具体命令参考Yocto工程配置)
bitbake st-image-core

3.2 时钟与设备树配置

与 Developer 开发包一致,需修改 OPTEE 的 125MHz 时钟配置与 kernel 设备树(eth1 与 switch0 节点),配置内容完全相同。

3.3 启动脚本修改(适配网口命名)

Distribution 包默认将 eth0/eth1 重命名为 end0/end1,需修改 /usr/sbin/ttt-ip-init-systemd.sh 脚本:

REF_ETH_INTERFACE=eth0  # 改为实际网口名(如end1)
st_configure() {
    get_soc_path
    wait_sysfs $SOC_PATH/$IP_REF_NAME/net/sw0p3/phy/mdiobus
    if [ -e $SOC_PATH/$IP_REF_NAME/net/sw0p3/phy/mdiobus ]; then
        # 绑定PHY1到sw0p3(PHY地址01,需根据硬件修改)
        echo -n stmmac-1:01 > $SOC_PATH/$IP_REF_NAME/net/sw0p3/phy/mdiobus
        # 未扩展PHY2时,注释以下行
        # echo -n stmmac-1:02 > $SOC_PATH/$IP_REF_NAME/net/sw0p2/phy/mdiobus
    else
        echo "[ERROR]: MDIO总线未就绪"
        exit 1
    fi
}

4. 常见问题与避坑指南

4.1 测试带宽限制(iperf3 测试失败)

  • 问题原因:Switch 内部为千兆架构,即使接入百兆 RMII PHY,默认仍按千兆速率收发,导致速率不匹配。
  • 解决方案:测试时指定百兆带宽,或通过 tc 命令限制端口速率:
    # 方法1:iperf3测试指定带宽
    iperf3 -c <目标IP> -b 100M
    
    # 方法2:tc命令配置速率限制
    tc qdisc replace dev sw0ep root handle 1: htb default 1 r2q 1
    tc class replace dev sw0ep parent 1: classid 1:1 htb rate 95Mbit
    

4.2 网口命名不匹配(驱动加载失败)

  • 问题原因:自定义文件系统可能修改默认网口名(如 eth0→end1),导致脚本与驱动配置不匹配。
  • 解决方案:同步修改以下三个文件中的网口名:
    • /usr/sbin/ttt-ip-init-systemd.sh:Switch 驱动使能的网口名;
    • /etc/modprobe.d/edgx_sw_core.conf:驱动加载配置的网口名;
    • /usr/lib/systemd/network/80-wired.network:IP 配置的网口名。

4.3 PHY 未识别(MDIO 总线通信失败)

  • 问题原因:PHY 地址配置错误、复位 GPIO 未生效或引脚配置错误。
  • 解决方案
    • 确认设备树中reg属性与 PHY 实际地址一致(常见 0x01、0x02);
    • 检查复位 GPIO 的电平极性与延时参数(reset-assert-us/reset-deassert-us);
    • 验证eth1_rmii_pins_a引脚配置与硬件原理图一致。

STM32MP257 的 RMII Switch 配置核心在于 “时钟适配 + 设备树精准定义 + 驱动与脚本协同”,关键要点如下:

  1. 时钟是基础:必须配置 125MHz 内部时钟,确保 Switch 架构正常工作;
  2. 设备树是核心:明确 ETH1 的 GMAC 模式、Switch 的 RMII 属性与 PHY 参数,避免接口不匹配;
  3. 驱动与脚本是关键:Developer 包需手动编译驱动、运行初始化脚本,Distribution 包通过 Yocto 层简化配置;
  4. 避坑重点:百兆带宽限制、网口命名一致性、PHY 地址与复位配置。

本方案已通过 STM32MP257F-EV 开发板验证,支持 RMII 百兆 PHY 的稳定通信与 TSN 功能,可直接应用于工业控制物联网网关等对百兆以太网交换有需求的场景。若需扩展多 PHY 或优化 TSN 低延迟性能,可参考官方文档 RM0457(STM32MP23/25 参考手册)进一步调整。

相关推荐