车载 Switch 配置的生效机制:固件初始化、UMSD 与 MDIO 管理链路
Switch 的运行状态由已经完成的初始化和管理操作共同形成。XML 描述期望配置,C 代码表达软件动作,运行时寄存器与表项反映当前硬件状态。看见配置值、找到 API 名称和确认配置已经生效,是三件不同的事。 沿着配置消费、构建、执行、硬件访问和读回建立连续关系,才能解释它们之间的差异。
本文是车载以太网 Switch 专栏的第三篇,结合硬件连接与二层转发,说明配置生效、UMSD/MDIO 管理与 AUTOSAR 集成。所有代码均为自行构造的示意代码,不引用内部驱动、配置原件或专有寄存器序列。
1. 上电后,谁把端口配置好
Switch 一般先经历供电、参考时钟稳定、复位释放、Strap 采样和硬件默认初始化。随后怎样建立端口与转发表,取决于芯片和系统:有的器件依赖外部主机,有的具备内部处理器与固件,有的可以读取非易失性配置。
| 阶段或来源 | 可能承担的工作 | 不能直接推出的结论 |
|---|---|---|
| 硬件复位与 Strap | 选择启动方式、管理地址、部分接口模式 | 全部 VLAN/FDB 已满足业务需求 |
| 固件启动,如器件具备 | 加载配置、初始化端口、执行管理策略 | 每颗 Switch 都有同样的固件启动过程 |
| 主机初始化 | 识别设备,设置接口、PHY、VLAN/FDB 和端口状态 | 每个 API 都在当前构建中执行 |
| 运行时管理 | 控制端口、更新策略、读取状态 | 当前值永久不变或复位后自动恢复 |
具体顺序要处理依赖关系,例如管理访问须等待设备就绪,PHY/SerDes 需要匹配接口与时钟,Link Training 需要对端配合,转发状态还可能受安全和启动策略控制。
从“MCU 某个文件没有写 FDB”,不能单独推出“FDB 一定来自 Switch 内部 CPU”。默认状态、其他主机模块、启动脚本、外部工具和动态学习,都可能参与状态形成。判断初始化归属,需要找到真正的配置消费者及其执行路径。
2. 配置工具与 XML 的职责
配置工具中的 XML 可以保存板级连接、端口参数、VLAN 成员、MAC 规则,以及工具需要的其他元数据。它首先是供软件消费的文件;芯片不会因为磁盘上某个 XML 变化,就自行改变寄存器。
常见消费路径有三类:
| 使用方式 | 文件怎样产生作用 | 生效时间 |
|---|---|---|
| 离线查看或编辑 | 工具解析文件,展示期望参数 | 尚未建立硬件配置变化 |
| 生成固件/配置镜像 | XML 经工具转换,再进入目标镜像 | 正确镜像被部署并由设备加载后 |
| 在线应用 | 工具或主机解析参数,再执行管理事务 | 事务完成并通过相应检查后 |
同一个工具可以同时支持 Offline 与 Online,也可能提供 Apply、Activate、Save 或 Reset。按钮的名称不保证含义一致:Save 可能只保存文件,也可能写入非易失性存储;Activate 可能改变运行中的硬件。
因此比较 XML 和 C 代码时,先问:这个 XML 由哪个程序读取,输出是什么,当前设备是否使用了那个输出? 只比较文本数值,无法回答硬件最后采用了哪个来源。
3. AUTOSAR 与外部 Switch 管理
AUTOSAR Classic 提供 Ethernet Driver、Ethernet Interface、Ethernet Transceiver Driver 和 Ethernet Switch Driver 等标准化角色。Ethernet Switch Driver 的公开规范覆盖端口、配置与状态等管理职责。[1] 项目也可能通过 CDD 或平台适配层接入供应商驱动。
UMSD 是 Marvell Switch 管理驱动软件的称呼,负责将端口、VLAN、地址表等 API 请求转换成该系列器件的访问操作。其支持范围、数据类型和 API 行为取决于交付版本;它与 AUTOSAR 标准模块并非同一个概念。
典型分层中,上层关心“读取默认 VID”“更新一个表项”;驱动负责选择寄存器或表操作;BSP 提供总线访问回调;MCAL 控制 MDIO 硬件。这种分层让器件管理逻辑与具体 MCU 总线控制分开。
msdLoadDriver() 的职责需要看实现
不能因函数名含 Load,就把 msdLoadDriver() 描述成“下载 XML 到 Switch”或“烧写 Switch 固件”。驱动初始化可能建立设备对象、绑定回调、识别芯片和准备访问路径;配置应用、文件解析和固件下载需要各自的实现支持。
如果某个版本的函数只完成设备识别与回调绑定,它就不能证明 XML 已被应用。即使函数返回成功,也只证明满足该函数定义的成功条件。要解释更多职责,需检查该版本的参数、实现、下层调用和完成语义。
4. 记录上报与硬件配置:两条不同路径
某个结构体名叫 ConfigInfo,里面也存着 Default VID、MAC 和 Port Vector,仍可能只是用于描述配置、组帧或遥测。变量名字不能替代数据流分析。
第一条是记录路径:配置记录结构体→记录组帧→AUTOSAR RTE→上层记录接收方。它把内存中的信息发布出去。
第二条是硬件管理路径:MCU Software→UMSD API→BSP ReadMii/WriteMii→Ethernet MCAL→MDIO Controller→MDC/MDIO→Switch Register。它访问实际器件。两条路径可能通过“读取硬件后上报”发生联系,但这个联系要由代码建立。
/* 演示:只记录一个期望值,尚未访问 Switch。 */
TelemetryRecord record;
record.expected_vid = 120u;
publish_record_via_rte(&record);这段动作改变 RAM,并把记录交给接收方。RTE Sender-Receiver 写入本身不会自动转化为 MDIO 寄存器写。若接收方随后发起硬件配置,需要继续追踪它的实现。
/* 演示:由适配层完成真实读取,再把结果作为观测记录发布。
* helper 名称为本文定义,不是供应商 API。
*/
uint16_t actual_vid;
if (read_default_vid_completed(device, port, &actual_vid) == READ_OK) {
publish_observed_vid(port, actual_vid);
}第二段的记录来自一次成功完成的硬件读取,因此可以描述该读取时刻的观测结果。它仍需携带读取状态和时间,才能避免把历史缓存当成当前值。
5. SMI、MDC 与 MDIO
SMI 在相关驱动语境中表示 Serial/System Management Interface,具体命名和扩展方式以器件文档为准。常见 Ethernet 管理接口使用两根信号:
| 信号 | 方向与作用 |
|---|---|
| MDC:Management Data Clock | 由管理端产生,给事务提供时钟 |
| MDIO:Management Data Input/Output | 双向数据线,管理端和被管理器件按事务阶段交接驱动权 |
MDIO 在同一数据线上轮流传输请求与读回数据,是半双工的管理通道。读事务包含 Turnaround:管理端必须按协议释放数据线,让器件返回响应。SPI 的 MOSI/MISO 可以同时收发,UART 常有独立 TX/RX;它们与 MDIO 的方向控制方式不同。
总线设计还需检查上拉、电压、设备地址、负载和时序。MDIO 地址、Switch 逻辑端口号和芯片内部寄存器块地址不是天然一一对应的概念。部分 Switch 使用直接寻址,部分使用带 Busy 状态的间接命令入口;Linux mv88e6xxx/smi.c 展示了这些不同访问方式。[2]
6. Clause 22 与 Clause 45
Clause 22 与 Clause 45 是 IEEE 802.3 中的管理访问体系。它们解决的是寄存器寻址与事务格式,不是“22 Mbit/s”和“45 Mbit/s”。
| 比较项 | Clause 22 直接访问 | Clause 45 原生访问 |
|---|---|---|
| 常见寻址字段 | 5-bit PHYAD + 5-bit REGAD | 5-bit PRTAD + 5-bit DEVAD/MMD + 16-bit 寄存器地址 |
| 寄存器数据宽度 | 16 bit | 16 bit |
| 直接地址空间 | 每个地址下 32 个寄存器索引 | 每个 MMD 可表达 65536 个寄存器地址 |
| 普通访问形式 | 一帧携带读/写目标与数据阶段 | 地址帧,再进行读/写数据事务 |
这些是字段可表达的范围,不保证器件实现所有地址或所有 MMD。Clause 22 设备也可通过支持的分页机制扩展访问;支持 MMD 间接访问的设备还可以经寄存器 13/14 访问相应空间。后者与原生 Clause 45 帧是不同的访问路径。[3]
Switch 的间接 SMI 命令又是一层器件协议:底层可能采用 Clause 22 帧,但上层在操作端口块、全局块或内部表单元。不能只看总线上 REGAD 的数值,就把它解释成某个 T1 PHY 的同号标准寄存器。
7. MDC 时钟与有效管理吞吐
传统普通管理事务常以 2.5 MHz MDC 上限作为兼容性基线,对应 400 ns 时钟周期。公开 IEEE 工作组材料同时讨论了高速 MDIO 实现与传统时序的差异。[4] 某些新器件支持更快的 MDC,例如 TI 公开数据手册给出了特定负载下更高频率的能力;能否使用,需要管理端、全部相关器件及板级电气共同满足条件。[5]
因此“MDIO 最高只能 2.5 MHz”是过度概括;“某颗 PHY 支持高速 MDC,所以整条总线都可以使用该频率”也不成立。
以保留 32-bit Preamble、无额外等待的普通 Clause 22 事务为例:
32 PRE + 2 ST + 2 OP + 5 PHYAD + 5 REGAD + 2 TA + 16 DATA = 64 bit
2.5 MHz 下:64 / 2.5 MHz = 25.6 μs / 事务
数据占比:16 / 64 = 25%
理想寄存器数据吞吐:0.625 Mbit/s ≈ 78.1 kB/s这里每笔操作只读/写 16 bit 数据。Clause 45 的一次独立随机读若需要一帧地址加一帧读取,则为 128 个时钟,约 51.2 μs,16-bit 数据的理想吞吐约 0.3125 Mbit/s。帧格式可以参照公开 IP 文档。[6]
Preamble Suppression、连续地址操作、Busy 轮询、分页、软件调度和总线锁都会改变实际成本。这些数值是指定假设下的计算,不是某个 ECU 的实测结果。
MDIO 访问慢会影响表初始化、批量诊断或采样频率,但每个 1G/10G 业务帧不会经过 MDIO。规则被写入后由交换数据通路使用,管理线速与业务端口线速属于不同的预算。密集轮询仍可能增加 MCU 负载,或与其他管理请求争用资源。
8. 与 SPI、I²C、UART 的比较
| 接口 | 传输结构 | 速率或配置示例 | 有效负载与主要开销 |
|---|---|---|---|
| MDIO | MDC + 双向 MDIO,管理帧寻址 | 传统 2.5 MHz 基线;高速依实现 | 16-bit 数据之外还有前导、地址、操作码、Turnaround |
| SPI | 时钟、片选、收发数据线;常见实现可全双工 | 工程中可见数 MHz 至数十 MHz,非统一上限 | 命令、地址、Dummy Cycle、片选与设备等待 |
| I²C | SCL + 双向 SDA,地址与 ACK | 常见 Standard 100 kbit/s、Fast 400 kbit/s、Fast-mode Plus 1 Mbit/s | 地址、每字节 ACK、Start/Stop;还可能 Clock Stretching |
| UART | 异步 TX/RX,依波特率与帧格式 | 例如 115200 baud;非统一最大值 | 8N1 每 8-bit 数据占 10-bit 时间,另有上层协议开销 |
I²C 的标准模式可参照 NXP 公开规范。[7] SPI 的最大时钟与 UART 的可选波特率由控制器、器件和板级实现决定。不能把一组“常见数字”当作这些接口的标准最大速率。
例如 115200 baud、8N1 的 UART,忽略上层开销时只能传约 115200/10=11520 byte/s 的字节数据。与 MDIO 比较前,应统一到有效字节、事务延迟或配置完成时间,而不是直接比较时钟数值。
9. TC3xx:从驱动回调到 MDIO 控制器
TC3xx GETH 提供 MAC 和 MDIO 管理相关能力。[8] 典型适配中,Switch 驱动调用 BSP 的 ReadMii/WriteMii 回调,BSP 通过所用 Ethernet MCAL 配置硬件事务,控制器输出 MDC/MDIO,最终从器件取得数据或完成写入。
| 层次 | 负责保证 |
|---|---|
| Switch 驱动 | 型号支持、寄存器/表操作顺序、字段解释 |
| BSP 回调与适配层 | 总线地址映射、完成语义、错误转换和访问串行化 |
| Ethernet MCAL | 所用 API 的同步/异步契约、控制器就绪、事务触发与完成通知 |
| MDIO 控制器与板级接口 | 时钟分频、数据方向、电气与实际总线事务 |
如果所用 MCAL 的 MII API 是异步的,返回“请求受理”不等于输出指针中的读值已有效。适配层需要在驱动期望的完成语义下等待或对接完成通知,并处理 Timeout、Busy 和缓冲区生命周期。具体按 MCAL 版本/API 文档执行,不能把所有实现描述成同步读写。
间接访问的“写选择器→发命令→等 Busy 清除→读结果”还应作为一个完整序列保护。只给每条底层 MDIO 帧分别加锁,未必能阻止另一任务在中间改变目标选择器。驱动层锁、MCAL 的非重入限制和多个配置所有者,需要共同考虑。
10. 源码、编译产物与执行顺序
下面的 API 文本存在于源码,但正常预处理不会保留这个分支中的语句:
#if 0
apply_demo_vlan(device, 120u);
#endif所以它不成为当前翻译单元的可执行代码。若同名函数在其他活动文件中被调用,仍需另行追踪;不能由这一处排除就断言整套系统没有配置动作。
检查调用是否发生,可以依次核对:活动文件与宏条件、预处理输出、目标文件/Map/反汇编、启动调用关系、运行时断点或 Trace,最后是管理事务完成及读回结果。源码检索找到函数名,只回答了第一层问题的一部分。
多个来源冲突时,也要按时间和状态转换理解。以下仍是虚拟例子:
| 时刻 | 动作 | 能得出的信息 |
|---|---|---|
| T0 | 离线 XML 写着 P1 Default VID=320 | 文件中的期望值为 320 |
| T1 | 某初始化消费者实际把 320 写入硬件并完成 | 该时刻的硬件写入成功 |
| T2 | 活动代码把 Default VID 改为 120,事务完成 | 后续可能使用 120 |
| T3 | 只读获取 Default VID=120、Force=false | T3 的观测符合对应字段 |
| T4 | 发生设备复位或另一管理者重新应用配置 | 需要重新确认配置来源与当前值 |
当前状态受最近的有效操作、复位、固件策略和硬件规则共同约束。它不由 XML/C 文件的排列顺序或修改日期决定。读取一个字段也不能代替完整 VLAN 路径验证。
11. 只读确认 Default VID 与 Force Default VID
只读验证优先使用目标型号支持的 Getter 或已确认的查询接口,而不是把另一型号的寄存器偏移照搬过去。示意步骤如下:
- 确认目标芯片、版本、管理地址与逻辑端口映射,设备及访问通道已经就绪。
- 分别读取 Default VID 与 Force Default VID,记录完成状态和采样时间。
- 再读取 802.1Q Mode、Tagged/Untagged 接纳策略和相关解析模式。
- 查询目标 VID 的 VTU/FID、入口/出口成员及 Tag 表示。
- 查询相应 FID 下的目的 MAC,结合学习、洪泛、端口状态和 Link。
- 对照已有抓包与计数器,确认实际入帧和出口表现;仅有 Getter 数值时,保留这个观测范围。
| 读取对象 | 演示期望 | 说明 |
|---|---|---|
| P1 Default VID | 120 | 未标记帧的普通默认分类 |
| P1 Force Default VID | false | 不由此控制项强制覆盖有效 Tagged VID |
| VLAN 120 的 VTU/FID | 存在,FID=9,P1/P8 是成员 | 能关联到第二篇的交换域 |
| FID 9 中的 SoC MAC | 有效,候选出口 P8 | 能关联到目的地址查找 |
Default VID=120 与 Force=true/false 是两种不同状态;只看到“VID=120”还不能推演所有 Tagged 入帧。Provider VID 也应作为独立字段按工具与芯片语义核对。
“只读语义”不一定意味着每个底层总线帧都只能是 Read:分页选择、间接地址设置或 Get-Next 查询可能需要写选择器/查询命令。应使用已确认的查询序列,避免改变端口、转发表、持久配置或复位状态。
读寄存器也可能有副作用,例如 Clear-on-Read 计数器、Latch-Low 状态位,或需要两次读取才能区分历史与当前 Link 的机制。并发管理还可能让分次读取组成一个从未同时存在的组合。因此采样时记录时间、状态与必要的串行化条件,优先读取已知的目标字段,不进行盲目的全地址扫描。
12. 用硬件状态闭合配置链
配置分析最终要连接“谁产生配置、谁消费配置、谁完成写入、何时读取、帧如何表现”。XML、C 结构体、RTE 上报和寄存器观测都可以提供信息,但各自描述的对象不同。
建立这条关系后,就能解释为什么修改 XML 尚未生效、为什么记录里的静态 MAC 没出现在 FDB、为什么 API 名称存在却没有总线事务,以及为什么上电后的值会被另一管理者改写。它也是从软件阅读走向可复现 Switch 调试的基础。
公开参考资料
- AUTOSAR CP R20-11:Specification of Ethernet Switch Driver,标准模块角色;集成时使用与工程版本一致的规范。
- Linux v6.12:mv88e6xxx/smi.c,直接/间接 SMI 与 Busy 处理的公开实现,不是所有 Switch 的统一布局。
- IEEE 802.3 工作组公开材料:Clause 22 Access to Clause 45 Registers,MMD 间接访问背景;为历史技术材料。
- IEEE 802.3 工作组公开材料:Specification Gaps and Improvement of MDC/MDIO,传统时序与实现差异;提案本身不等于已发布规范。
- TI:DP83TG720S-Q1 数据手册,MDC 频率、SMI 时序与实际器件限制。
- Altera:MDIO Frame Format,Clause 45,管理帧字段与地址/数据操作。
- NXP:UM10204 I²C-bus Specification and User Manual,I²C 模式与协议开销。
- Infineon:AURIX TC3xx GETH 公开培训,MAC、MDIO 与系统集成。
- AUTOSAR CP R19-11:Specification of Ethernet Driver,MII API 契约;实际同步/异步行为需匹配所用版本与实现。
关联阅读: 硬件架构与接口 · VLAN、VTU、FID 与 ATU 转发机制 · 专栏首页
