相关代码实现在开源组件general_hardware的src/lualib/mcu目录下
目录
概述
本模块实现了BMC系统中 MCU(多媒体控制单元) 的管理和升级功能。MCU是嵌入在各种板卡(如基础板BCU、加速卡ACU等)上的多媒体控制单元,负责板卡的底层控制和监控。
主要功能
| 功能 | 说明 |
|---|---|
| MCU管理 | 管理不同板卡上的MCU设备,包括版本查询、状态监控等 |
| MCU升级 | 通过SMBus/SMC协议升级MCU固件 |
| VRD升级 | 升级电压调节器(VRD)固件,支持延迟生效机制 |
| VDM升级 | 升级VDM固件 |
| 日志收集 | 收集MCU运行日志和VRD故障诊断信息 |
| 异常监控 | 监听VRD异常事件并收集故障信息 |
目录结构
src/lualib/mcu/
├── mcu_object.lua # MCU对象基类,定义MCU的基本属性和行为
├── mcu_service.lua # MCU服务管理器,管理所有MCU对象的生命周期
├── smbus_mcu_object.lua # SMBus协议MCU对象(简单MCU)
├── smc_mcu_object.lua # SMC协议MCU对象(功能丰富的MCU,支持VRD)
├── enum/
│ └── mcu_enums.lua # 枚举常量定义(命令字、状态码等)
└── upgrade/
├── defs.lua # 升级相关常量定义
├── fructl_handler.lua # FRU控制器(电源管理、上电锁)
├── parser_cfg.lua # 升级配置文件解析
├── smbus_interface.lua # SMBus通信协议实现
├── smc_interface.lua # SMC通信协议实现
├── sub_component.lua # 子组件管理(VRD/CPLD等)
├── upgrade_interface.lua # 通信接口基类
├── upgrade_object.lua # 升级操作封装
├── valid.lua # VRD生效处理
└── upgrade_service/ # 升级服务实现
├── upgrade_service_comm.lua # 公共升级方法
├── upgrade_service_handle.lua # 升级请求入口
├── upgrade_service_mcu.lua # MCU升级服务
├── upgrade_service_object.lua # 升级服务工厂
└── upgrade_service_vrd.lua # VRD升级服务
整体架构
flowchart TB
subgraph External["外部接口"]
FW["固件管理服务<br/>(Firmware Management)"]
end
subgraph UpgradeService["升级服务层"]
USH["upgrade_service_handle<br/>升级请求入口"]
USO["upgrade_service_object<br/>服务工厂"]
USM["upgrade_service_mcu<br/>MCU升级"]
USV["upgrade_service_vrd<br/>VRD/VDM升级"]
end
subgraph MCUManagement["MCU管理层"]
MS["mcu_service<br/>MCU服务管理器"]
SMB["smbus_mcu_object<br/>SMBus MCU"]
SMC["smc_mcu_object<br/>SMC MCU"]
end
subgraph Communication["通信层"]
SMBI["smbus_interface<br/>SMBus协议"]
SMCI["smc_interface<br/>SMC协议"]
end
subgraph Hardware["硬件层"]
HW["MCU硬件设备"]
end
FW --> USH
USH --> USO
USO --> USM
USO --> USV
USM & USV --> MS
MS --> SMB & SMC
SMB --> SMBI
SMC --> SMCI
SMBI & SMCI --> HW
架构说明
- 外部接口层:接收来自固件管理服务的升级请求
- 升级服务层:处理升级流程的三个阶段(准备、处理、完成)
- MCU管理层:管理MCU对象的创建、销毁和状态维护
- 通信层:实现与硬件的具体通信协议
- 硬件层:实际的MCU硬件设备
核心模块说明
MCU对象模块
| 模块 | 作用 |
|---|---|
mcu_object |
MCU基类,定义通用属性(ID、版本、位置)和方法(版本查询、固件注册) |
smbus_mcu_object |
用于简单MCU,通过SMBus协议通信 |
smc_mcu_object |
用于功能丰富的MCU,支持子组件管理、VRD控制、日志收集 |
mcu_service |
单例服务,管理所有MCU对象,提供统一的访问接口 |
升级服务模块
| 模块 | 作用 |
|---|---|
upgrade_service_handle |
升级入口,接收外部升级请求并分发给具体服务 |
upgrade_service_object |
工厂模式,根据固件类型返回对应的升级服务 |
upgrade_service_mcu |
处理MCU固件升级流程 |
upgrade_service_vrd |
处理VRD/VDM固件升级流程,支持延迟生效 |
upgrade_object |
封装单个升级操作的完整流程 |
通信接口模块
| 模块 | 作用 |
|---|---|
upgrade_interface |
接口基类,定义通信方法规范 |
smbus_interface |
实现SMBus协议,用于简单的版本查询和升级 |
smc_interface |
实现SMC协议,支持子组件管理、VRD诊断、日志收集 |
辅助模块
| 模块 | 作用 |
|---|---|
sub_component |
管理MCU下的子组件(VRD、CPLD、PLL等) |
fructl_handler |
FRU控制,管理电源状态和上电锁 |
parser_cfg |
解析升级配置文件 |
valid |
VRD生效处理,在系统下电时执行缓存的升级 |
MCU管理功能
MCU生命周期管理
flowchart LR
subgraph Lifecycle["MCU对象生命周期"]
A["检测到MCU设备"] --> B["创建MCU对象"]
B --> C["注册到固件清单"]
C --> D["周期性版本更新"]
D --> E["设备移除"]
E --> F["销毁MCU对象"]
end
主要管理功能
-
设备发现与注册
- 系统启动时自动发现板卡上的MCU设备
- 根据通信协议类型创建对应的MCU对象
- 将MCU信息注册到BMC的固件清单中
-
版本监控
- 定期查询MCU版本信息
- 自动更新固件清单中的版本号
- 版本格式:
主版本.次版本.修订号(如 1.02.03)
-
VRD异常监控
- 每5秒检测系统事件状态
- 检测到VRD异常时自动收集故障诊断信息
- 诊断信息保存到持久化目录
-
日志收集
- 支持MCU运行日志收集
- 支持VRD故障诊断信息收集
- 日志自动转储,防止文件过大
MCU升级流程
MCU升级采用标准的 三阶段流程:Prepare(准备)→ Process(处理)→ Finish(完成)
流程概览
flowchart TB
subgraph Prepare["阶段一:Prepare(准备)"]
P1["解析升级配置文件"]
P2["获取待升级MCU列表"]
P3["记录升级前版本"]
P4["设置升级中标志"]
P1 --> P2 --> P3 --> P4
end
subgraph Process["阶段二:Process(处理)"]
PR1["解压升级固件包"]
PR2["初始化升级通道"]
PR3["传输固件数据"]
PR4["发送启动升级命令"]
PR5["等待升级完成"]
PR6["发送生效命令"]
PR7["更新版本信息"]
PR1 --> PR2 --> PR3 --> PR4 --> PR5 --> PR6 --> PR7
end
subgraph Finish["阶段三:Finish(完成)"]
F1["清理临时资源"]
F2["注册生效策略"]
F3["返回升级结果"]
F1 --> F2 --> F3
end
Prepare --> Process --> Finish
详细说明
Prepare 阶段
- 接收升级请求,解析配置文件获取固件信息
- 根据配置匹配需要升级的MCU设备
- 记录当前版本号用于日志和回显
- 检查是否有其他升级任务正在进行
Process 阶段
- 解压HPM升级包,提取固件文件
- 通过SMBus/SMC协议与MCU建立通信
- 分片传输固件数据(每2KB等待一定时间)
- 传输完成后发送升级启动命令
- 轮询查询升级状态,等待MCU完成内部升级
- 发送生效命令使新固件生效
- 支持失败重试(最多3次)
Finish 阶段
- 清理升级过程中的临时文件
- 如果MCU需要AC重启生效,注册生效策略
- 记录升级结果到维护日志
升级时序图
sequenceDiagram
participant Client as 外部请求
participant Handle as 升级入口
participant Service as MCU升级服务
participant Object as 升级对象
participant Interface as 通信接口
participant MCU as MCU硬件
Note over Client,MCU: Prepare 阶段
Client->>Handle: 发起升级准备
Handle->>Service: 解析配置
Service->>Service: 获取升级列表
Service-->>Client: 返回准备结果
Note over Client,MCU: Process 阶段
Client->>Handle: 发起升级处理
Handle->>Service: 执行升级
Service->>Object: 升级流程
Object->>Interface: 初始化通道
Interface->>MCU: SMC命令
Object->>Interface: 传输固件
Interface->>MCU: 分片数据
Object->>Interface: 启动升级
Interface->>MCU: 升级命令
loop 等待完成
Object->>Interface: 查询状态
Interface->>MCU: 状态查询
MCU-->>Interface: 返回状态
end
Object->>Interface: 生效命令
Interface->>MCU: 生效
Service-->>Client: 返回处理结果
Note over Client,MCU: Finish 阶段
Client->>Handle: 发起升级完成
Handle->>Service: 清理资源
Service-->>Client: 返回最终结果
VRD升级流程
VRD(Voltage Regulator Down,电压调节器)是负责CPU供电的关键组件。VRD升级比MCU升级更复杂,主要特点:
- 必须在系统下电状态下执行 - 避免影响CPU供电
- 上电锁机制 - 防止升级过程中意外上电
- 缓存生效机制 - 系统上电时先缓存,等下电后再执行
- 四阶段流程 - 比MCU多一个Active(生效)阶段
流程概览
flowchart TB
Start([开始VRD升级]) --> CheckPower{检查电源状态}
CheckPower -->|所有Host下电| DirectUpgrade
CheckPower -->|部分Host上电| MixedMode
CheckPower -->|所有Host上电| CacheOnly
subgraph DirectUpgrade["直接升级模式"]
D1["加上电锁"]
D2["执行VRD升级"]
D3["更新版本"]
D4["解除上电锁"]
D1 --> D2 --> D3 --> D4
end
subgraph MixedMode["混合模式"]
M1["下电Host: 执行升级"]
M2["上电Host: 缓存升级包"]
M1 --> M3["注册生效策略"]
M2 --> M3
end
subgraph CacheOnly["缓存模式"]
C1["缓存升级包到指定目录"]
C2["注册生效策略"]
C1 --> C2
end
DirectUpgrade --> End([升级完成])
MixedMode --> WaitActive
CacheOnly --> WaitActive
subgraph WaitActive["等待生效"]
W1["等待系统下电"]
W2["触发Active阶段"]
W3["执行缓存的升级"]
W1 --> W2 --> W3
end
WaitActive --> End
VRD升级与MCU升级对比
| 特性 | MCU升级 | VRD升级 |
|---|---|---|
| 电源要求 | 无特殊要求 | 必须下电 |
| 上电锁 | 不需要 | 需要(防止升级期间意外上电) |
| 升级阶段 | 3阶段:Prepare → Process → Finish | 4阶段:Prepare → Process → Finish → Active |
| 缓存机制 | 无 | 支持(系统上电时缓存,下电后执行) |
| 延迟生效 | 部分支持(AC重启生效) | 支持(等待系统下电触发Active阶段) |
阶段说明:
- Prepare:准备阶段,解析配置、获取升级列表
- Process:处理阶段,传输固件、执行升级
- Finish:完成阶段,清理资源、注册生效策略
- Active:生效阶段(仅VRD),系统下电时执行缓存的升级包
VRD四阶段详细说明
flowchart LR
subgraph P1["Prepare"]
PA["检查电源状态"]
PB["加上电锁"]
PC["记录版本"]
end
subgraph P2["Process"]
direction TB
PD{"系统下电?"}
PE["执行升级"]
PF["缓存升级包"]
end
subgraph P3["Finish"]
PG["注册生效策略"]
PH["保存配置"]
end
subgraph P4["Active"]
PI["读取缓存"]
PJ["执行升级"]
PK["清理缓存"]
end
P1 --> P2 --> P3
P3 -.->|"下次下电时"| P4
Active 阶段(生效阶段)
- 仅在存在缓存升级包时触发
- 由系统下电事件触发执行
- 从缓存目录读取升级包
- 执行完整的升级流程
- 升级完成后清理缓存文件
通信协议说明
MCU通信支持两种协议:SMBus 和 SMC
协议对比
flowchart LR
subgraph SMBus["SMBus协议"]
S1["简单I2C协议"]
S2["32字节/帧"]
S3["基本升级功能"]
end
subgraph SMC["SMC协议"]
C1["扩展协议"]
C2["96-240字节/帧"]
C3["子组件管理"]
C4["VRD诊断"]
C5["日志收集"]
end
| 特性 | SMBus | SMC |
|---|---|---|
| 协议复杂度 | 简单 | 复杂 |
| 单帧数据量 | 32字节 | 96-240字节 |
| 子组件支持 | ||
| VRD管理 | ||
| 日志收集 | ||
| 适用场景 | 简单MCU | 功能丰富的MCU |
协议选择
flowchart TD
A["MCU设备"] --> B{协议类型?}
B -->|"Protocol = SMBus 或 空"| C["使用 smbus_interface"]
B -->|"Protocol = SMC"| D["使用 smc_interface"]
C --> E["smbus_mcu_object"]
D --> F["smc_mcu_object"]
子组件类型
SMC协议支持管理MCU下的多种子组件:
| 类型ID | 名称 | 说明 |
|---|---|---|
| 0 | MCU | 多媒体控制单元本身 |
| 1 | CPLD | 复杂可编程逻辑器件 |
| 2 | VRD | 电压调节器 |
| 3 | PLL | 锁相环 |
| 4 | USBHUB | USB集线器 |
| 5 | VDM | VDM设备 |
模块关系图
整体模块依赖
graph TB
subgraph "升级服务"
USH[upgrade_service_handle]
USO[upgrade_service_object]
USM[upgrade_service_mcu]
USV[upgrade_service_vrd]
USC[upgrade_service_comm]
end
subgraph "MCU管理"
MS[mcu_service]
MO[mcu_object]
SMO[smbus_mcu_object]
SMCO[smc_mcu_object]
end
subgraph "升级核心"
UO[upgrade_object]
SC[sub_component]
VD[valid]
end
subgraph "通信接口"
UI[upgrade_interface]
SI[smbus_interface]
SCI[smc_interface]
end
subgraph "工具模块"
FH[fructl_handler]
PC[parser_cfg]
EN[mcu_enums]
end
USH --> USO
USO --> USM & USV
USM & USV --> USC
USV --> VD
USC --> UO
UO --> SC
MS --> SMO & SMCO
MO --> SMO & SMCO
SMO --> SI
SMCO --> SCI
SI & SCI --> UI
USM & USV --> FH & PC
UO --> EN
类继承关系
classDiagram
class mcu_object {
MCU基类
}
class smbus_mcu_object {
SMBus MCU
}
class smc_mcu_object {
SMC MCU
}
class upgrade_interface {
<<interface>>
通信接口
}
class smbus_interface {
SMBus实现
}
class smc_interface {
SMC实现
}
mcu_object <|-- smbus_mcu_object
mcu_object <|-- smc_mcu_object
upgrade_interface <|-- smbus_interface
upgrade_interface <|-- smc_interface
smbus_mcu_object --> smbus_interface
smc_mcu_object --> smc_interface
代码阅读建议
推荐阅读顺序
-
先了解数据结构
enum/mcu_enums.lua- 枚举常量upgrade/defs.lua- 升级相关定义
-
再了解MCU管理
mcu_object.lua- MCU基类mcu_service.lua- MCU服务管理
-
然后了解通信协议
upgrade/upgrade_interface.lua- 接口定义upgrade/smbus_interface.lua- SMBus实现upgrade/smc_interface.lua- SMC实现
-
最后了解升级流程
upgrade/upgrade_service/upgrade_service_handle.lua- 入口upgrade/upgrade_service/upgrade_service_mcu.lua- MCU升级upgrade/upgrade_service/upgrade_service_vrd.lua- VRD升级
关键入口点
| 功能 | 入口文件 | 入口函数 |
|---|---|---|
| MCU对象创建 | mcu_service.lua |
on_add_object() |
| MCU版本查询 | mcu_object.lua |
get_mcu_version() |
| MCU升级 | upgrade_service_mcu.lua |
on_upgrade_prepare/process/finish() |
| VRD升级 | upgrade_service_vrd.lua |
on_upgrade_prepare/process/finish() |
| VRD生效 | valid.lua |
vrd_valid_task() |
| VRD异常监听 | mcu_service.lua |
listen_vrd_abnormal() |