MCU和VRD升级介绍

相关代码实现在开源组件general_hardwaresrc/lualib/mcu目录下

目录

  1. 概述
  2. 目录结构
  3. 整体架构
  4. 核心模块说明
  5. MCU管理功能
  6. MCU升级流程
  7. VRD升级流程
  8. 通信协议说明
  9. 模块关系图

概述

本模块实现了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

架构说明

  1. 外部接口层:接收来自固件管理服务的升级请求
  2. 升级服务层:处理升级流程的三个阶段(准备、处理、完成)
  3. MCU管理层:管理MCU对象的创建、销毁和状态维护
  4. 通信层:实现与硬件的具体通信协议
  5. 硬件层:实际的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

主要管理功能

  1. 设备发现与注册

    • 系统启动时自动发现板卡上的MCU设备
    • 根据通信协议类型创建对应的MCU对象
    • 将MCU信息注册到BMC的固件清单中
  2. 版本监控

    • 定期查询MCU版本信息
    • 自动更新固件清单中的版本号
    • 版本格式:主版本.次版本.修订号(如 1.02.03)
  3. VRD异常监控

    • 每5秒检测系统事件状态
    • 检测到VRD异常时自动收集故障诊断信息
    • 诊断信息保存到持久化目录
  4. 日志收集

    • 支持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升级更复杂,主要特点:

  1. 必须在系统下电状态下执行 - 避免影响CPU供电
  2. 上电锁机制 - 防止升级过程中意外上电
  3. 缓存生效机制 - 系统上电时先缓存,等下电后再执行
  4. 四阶段流程 - 比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通信支持两种协议:SMBusSMC

协议对比

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字节
子组件支持 :cross_mark: :white_check_mark:
VRD管理 :cross_mark: :white_check_mark:
日志收集 :cross_mark: :white_check_mark:
适用场景 简单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

代码阅读建议

推荐阅读顺序

  1. 先了解数据结构

    • enum/mcu_enums.lua - 枚举常量
    • upgrade/defs.lua - 升级相关定义
  2. 再了解MCU管理

    • mcu_object.lua - MCU基类
    • mcu_service.lua - MCU服务管理
  3. 然后了解通信协议

    • upgrade/upgrade_interface.lua - 接口定义
    • upgrade/smbus_interface.lua - SMBus实现
    • upgrade/smc_interface.lua - SMC实现
  4. 最后了解升级流程

    • 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()

1 个赞