代码仓
中
更新时间: 2026/10/31
在AtomGit上查看源码

soctrl ​

版本信息 ​

项目内容
组件版本1.140.0
首发版本openUBMC 26.12
文档作者openUBMC社区
最后更新2026-10-31

1. 组件概述 ​

1.1 组件简介 ​

soctrl(SOC Control)是SOC控制服务组件,主要将中高风险的硬件访问封装成接口给其它组件使用,如提供USB设备侧(键鼠、U盘、SP/iBMA、光驱、软驱)的连接状态管理功能,通过安全核实现证书相关的操作等。

soctrl适用于openUBMC平台,为BMC系统提供SOC硬件访问控制能力,服务于chipv1和chipv2芯片平台。组件采用分层架构设计,业务逻辑层以Lua实现,驱动适配层以C++原生库实现,通过D-Bus资源树接口向上层组件提供服务。

1.2 解决什么问题 ​

在BMC系统中,直接访问SOC硬件存在较高风险,需要统一收敛硬件访问入口。soctrl正是为此设计:

  • 统一硬件访问:将USB设备、NandFlash、PCIe控制器、串口等硬件访问能力统一封装为D-Bus资源树接口,上层组件无需感知底层硬件细节
  • 安全核集成:通过M3安全核提供eFuse读取、固件校验、安全启动、TPCM等安全能力,支持BIOS安全校验、硬件根证书管理等功能
  • 复合设备支持:支持USB复合设备挂载,在chipv1平台2个USB口上承载chipv0平台3个USB口的特性,同时保证各设备功能独立运行
  • 串口管理:提供完整的UART端口互联、参数配置和SOL日志记录能力,支持4路SOL收发数据的循环记录

1.3 核心功能 ​

  • USB设备管理:支持USB复合设备的挂载和单一设备数据传输,保证各设备功能独立正常运行
  • NandFlash写保护:提供NandFlash写保护查询和设置接口,保护NandFlash使用寿命
  • PCIe通道使能控制:提供PCIe控制器状态设置/获取接口,支持BMC配置开启和关闭
  • 串口控制:提供UART端口互联、开关、参数配置等完整串口管理功能
  • 串口日志:支持4路SOL收发数据循环记录,缓存空间可配置
  • PECI设备:提供接口对PECI设备进行初始化、复位、读写操作
  • BBB协议:实现USB Mass Storage中的BBB协议,支持将SP和BMA分区模拟USB设备
  • M3安全核:提供安全核(M3)相关的资源树接口,包括eFuse、安全启动、固件校验、TPCM等

1.4 关键术语表 ​

术语解释
USB复合设备在一个USB口上同时连接多个USB设备,各设备数据传输独立互不干扰
BBB协议USB Mass Storage中的Bulk-Only Transport协议,实现USB存储设备模拟
SOLSerial Over LAN,通过网络传输串口数据的远程管理技术
PECIPlatform Environment Control Interface,CPU与BMC之间的通信接口
M3安全核chipv1芯片内置的安全处理器,负责eFuse、固件校验、安全启动、TPCM等安全功能
UARTUniversal Asynchronous Receiver/Transmitter,通用异步收发传输器
TPCMTrusted Platform Module,可信平台模块
eFuse芯片级只读存储区域,存放芯片密钥和配置信息
D-Bus资源树openUBMC框架提供的基于D-Bus的对象模型接口,统一管理硬件资源

1.5 外部交互边界图 ​

soctrl采用分层架构设计,通过D-Bus与外部组件交互:

text
+-----------------------------------------------------------+
|                    外部组件 (bmc_soc, bmcast 等)                      |
+-----------------------------------------------------------+
                            |  D-Bus
+-----------------------------------------------------------+
|                    资源树接口层 (MDS)                                |
|  UsbDevices | NandFlashCtrl | PCIeController | Uart        |
|  UartCircularLog | PECI | SecureCore | Env | GPIO | BmcDfx  |
+-----------------------------------------------------------+
                            |
+-----------------------------------------------------------+
|                    业务逻辑层 (Lua)                                |
|  soctrl_app | usb_mgmt | uart | soc | bbb | common           |
+-----------------------------------------------------------+
                            |
+-----------------------------------------------------------+
|                    驱动适配层 (C++)                               |
|  libbbb.so  |  libboot_loader.so                           |
+-----------------------------------------------------------+
                            |
+-----------------------------------------------------------+
|  skynet  |  libmc4lua  | 5.10.0 2.7  |  OpenSSL | 6.5.0  |
+-----------------------------------------------------------+

外部组件通过D-Bus资源树方法/属性与soctrl交互,无需感知内部实现细节。

核心组件职责表

组件文件职责
soctrl_appsrc/lualib/soctrl_app.lua主应用类,初始化并管理所有子模块
usb_mgmtsrc/lualib/usb_mgmt/USB设备管理,支持复合设备挂载与控制
uartsrc/lualib/uart/串口控制,端口互联与参数配置
socsrc/lualib/soc/SOC核心控制(boot_loader、PECI、GPIO、NandFlash、黑匣子等)
bbbsrc/lualib/bbb/BBB协议实现(USB Mass Storage)
scm3_msgsrc/lualib/soc/scm3_msg.luaM3安全核通信
libbbb.sosrc/lualib-src/bbb/BBB协议FSM的C++实现
libboot_loader.sosrc/lualib-src/boot_loader/启动环境变量、PCIe、GMAC等驱动

2. API 使用说明与示例 ​

2.1 USB设备控制接口 ​

功能说明 ​

提供USB设备的连接与断开管理能力,支持USB复合设备的挂载和单一设备数据传输。

属性内容
接口名bmc.kepler.Managers.SOC.UsbDevices

资源树路径 ​

text
└─/bmc/kepler/Managers/1/UsbDevices
│   ├─/bmc/kepler/Managers/1/UsbDevices/BMA
│   ├─/bmc/kepler/Managers/1/UsbDevices/Cdrom
│   ├─/bmc/kepler/Managers/1/UsbDevices/Floppy
│   ├─/bmc/kepler/Managers/1/UsbDevices/KeyMouse
│   ├─/bmc/kepler/Managers/1/UsbDevices/LCD
│   └─/bmc/kepler/Managers/1/UsbDevices/SP

参数说明 ​

方法描述
Connect(a{ss})连接USB设备,需指定UsbId和FuncId
Disconnect(a{ss})断开USB设备
ConnectStateUSB设备连接状态(property,emits-change)

应用场景 ​

  • 通过Redfish/IPMI调用USB设备连接/断连操作
  • 业务系统需要从SP启动或安装板载BMA时,挂载对应USB设备
  • 远程运维时挂载U盘进行数据交换

限制条件 ​

  • 同一USB口的复合设备连接/断连操作会耦合,不能单独对某一设备进行连接或断连
  • 调用方需注意对同一USB口上设备的互斥关系

调试示例 ​

bash
busctl --user get-property bmc.kepler.soctrl /bmc/kepler/Managers/1/UsbDevices/SP \
  bmc.kepler.Managers.UsbDevice.Ums ConnectState

2.2 NandFlash写保护接口 ​

功能说明 ​

提供NandFlash写保护的查询和设置能力,在写入量超过阈值或BMC升级时保护NandFlash使用寿命。

属性内容
接口名bmc.kepler.Managers.SOC.NandFlashCtrl

参数说明 ​

参数名方向类型描述取值范围
WriteProtection属性boolNandFlash写保护开关,读写true=开启写保护 / false=关闭写保护

应用场景 ​

  • BMC升级前开启写保护,限制NandFlash写入
  • 写入量超过阈值时自动开启写保护
  • 通过修改WriteProtection属性控制rsyslog日志写入行为

限制条件 ​

  • 修改NandFlash内容前应先确认写保护状态,避免在写保护开启时进行写入操作

调试示例 ​

bash
# 查询写保护状态
busctl --user get-property bmc.kepler.soctrl /bmc/kepler/Managers/1/SOC/NandFlashCtrl \
  bmc.kepler.Managers.SOC.NandFlashCtrl WriteProtection

# 开启写保护
busctl --user set-property bmc.kepler.soctrl /bmc/kepler/Managers/1/SOC/NandFlashCtrl \
  bmc.kepler.Managers.SOC.NandFlashCtrl WriteProtection b true

2.3 PCIe通道使能控制接口 ​

功能说明 ​

提供PCIe控制器状态的设置和获取能力,支持BMC配置开启和关闭PCIe1控制器。

属性内容
接口名bmc.kepler.Managers.SOC.PCIeController

参数说明 ​

方法签名描述
GetStatereq: y, rsp: b获取PCIe控制器使能状态
SetStatereq: yb, rsp: -设置PCIe控制器使能状态

应用场景 ​

  • 黑匣子、虚拟网口、MCTP、EDMA等业务需要PCIe1通道时由bmc_soc调用开启
  • BMC配置关闭PCIe1以降低功耗或隔离硬件

限制条件 ​

  • PCIe0固定开启,不支持BMC配置
  • 设置PCIe控制器状态后需重启OS生效
  • 环境变量持久化保存,系统重启后仍保持配置

调试示例 ​

bash
# 获取PCIe1使能状态
busctl --user call bmc.kepler.soctrl /bmc/kepler/Managers/1/SOC/PCIeController \
  bmc.kepler.Managers.SOC.PCIeController GetState a{ss}y 0 "1"

# 开启PCIe1
busctl --user call bmc.kepler.soctrl /bmc/kepler/Managers/1/SOC/PCIeController \
  bmc.kepler.Managers.SOC.PCIeController SetState a{ss}yb 0 "1" true

2.4 串口控制接口 ​

功能说明 ​

提供完整的UART端口互联、开关和参数配置管理功能,支持8路UART控制器与8个UART Port的灵活映射。

属性内容
接口名bmc.kepler.Managers.Uart

参数说明 ​

方法签名描述
UartOpena{ss}yu打开初始化对应串口
UartClosea{ss}y关闭串口
PortConnectPorta{ss}uu设置portN之间的互联关系
UartConnectPorta{ss}uu设置uartN和PortN之间的互联关系
UartConnectUarta{ss}uu设置uartN之间的互联关系
SetBaudRatea{ss}yu设置波特率
SetDataBita{ss}yy设置数据位
SetStopBita{ss}yy设置停止位
SetParityBita{ss}yy设置校验位
QueryConnectiona{ss}查询互联关系

应用场景 ​

  • 将BMC COM与HOST COM进行互联,实现远程串口管理
  • 配置UART参数(波特率、数据位、校验位等)以匹配外围设备
  • 查询当前UART互联配置状态

限制条件 ​

  • UART到PORT的TX方向全互联,但配置时需保证映射关系不冲突
  • 对不使用的UART或Port应关闭其通路

2.5 串口日志接口 ​

功能说明 ​

提供4路SOL收发数据的循环记录能力,缓存空间可配置,支持将指定SOL数据读取到文件。

属性内容
接口名bmc.kepler.Managers.UartCircularLog

参数说明 ​

方法签名描述
SetLogSizea{ss}uuuuuu设置指定SOL DDR地址(tx,rx)
GetPositiona{ss}u获取当前数据的读指针地址
Enablea{ss}uuSOL使能开关
Dumpa{ss}uuus将指定SOL数据读取到指定文件

应用场景 ​

  • 远程串口数据记录,用于故障排查和审计
  • 缓存空间可通过libsoc_adapter接口动态配置

2.6 PECI设备接口 ​

功能说明 ​

提供与CPU进行通信的PECI接口,支持设备初始化、复位和读写操作。

属性内容
接口名bmc.kepler.Managers.SOC.PECI

参数说明 ​

方法签名描述
WriteReadInput: ay, InputLength: u, OutputLength: u与CPU进行通信,获取信息,返回Output: ay

2.7 M3安全核接口 ​

功能说明 ​

提供安全核(M3)相关的资源树接口,包括eFuse、固件校验、安全启动和TPCM等功能。

eFuse接口(bmc.kepler.Managers.SOC.SecureCore.Efuse):

方法描述
GetEfuseState查询eFuse是否存在(0不存在/1存在)
GetEfuseType查询eFuse类型(0不支持/1支持)
VerifyPartnerH2pInfo查询H2P密钥校验结果(0校验成功/1加载失败/2校验失败)

固件校验接口(bmc.kepler.Managers.SOC.SecureCore.FirmwareVerification):

方法描述
GetBiosVerifyResult查询BIOS安全校验状态(0校验通过/1校验失败/3未校验)
GetSpiMuxChannel获取SPI MUX方向(0切到host cpu/1切到BMC)
SetSpiMuxChannel设置SPI MUX方向(0切到host cpu/1切到BMC)
StartBiosVerify请求M3对BIOS进行校验(0表示X86 bios/1表示ARM 1620)

安全启动接口(bmc.kepler.Managers.SOC.SecureCore.SecureBoot):

方法描述
DisableBootVerification禁用对安全启动证书的校验功能
ExportCustomCertificateHash获取伙伴模式下硬件根证书的hash
ImportCustomCertificateHash导入伙伴模式下硬件根证书的hash
ExportRepairCredentials导出修复凭证
ImportRepairCredentials导入修复凭证
ResetOnNextBMCReset通知安全核在下次BMC复位时复位

TPCM接口(bmc.kepler.Managers.SOC.SecureCore.TPCM):

方法描述
GetLog从TPCM获取日志
GetPCR从TPCM获取PCR内容
GetRandom从TPCM获取随机数
GetSM3Hash从TPCM获取SM3 HASH
PresenceTPCM芯片是否在位(property,默认值false)

更多API详情请参阅mds/model.json文件。

3. 组件扩展案例 ​

3.1 扩展能力概述 ​

不适用。soctrl为硬件控制服务组件,通过common/config.lua实现芯片版本适配,不对外提供插件式扩展机制。如需扩展芯片平台支持,可在src/lualib/soc/chipv2/目录下添加对应实现。

4. 日志说明 ​

4.1 一键日志收集 ​

soctrl组件日志通过openUBMC统一日志框架收集。

文件路径内容说明
/var/log/framework.logsoctrl组件日志记录在框架日志中

4.2 关键日志信息 ​

以下日志片段均来自源代码中的实际日志语句,来源文件见代码位置列。

服务启动/停止

日志片段日志级别来源文件含义解读建议处理动作
soctrl start failed, err: %serrorservice/main.luasoctrl服务启动失败查看error详情,检查初始化模块是否正常,环境变量是否就绪
get chip name failederrorsoctrl_app.lua获取芯片名称失败检查chipv1/chipv2驱动是否正常加载

USB设备管理

日志片段日志级别来源文件含义解读建议处理动作
connect_compound_cdrom_device: usb_id=%dnoticeusb_ctrl/base_scene1USB光驱设备连接成功确认业务是否正常
connect LCD 0/1/2 successfullynoticeusb_ctrl/base_scene0.luaUSB LCD设备连接成功确认业务是否正常
disconnect_compound_cdrom_device: usb_id=%dnoticeusb_ctrl/base_scene1.luaUSB光驱设备断开成功确认业务是否正常
failed to init %s device, err: %serrorusb_ctrl/base.luaUSB设备初始化失败检查设备驱动是否加载,查看error详情
failed to open usb drd drv, err: %serrorusb_drd.luaUSB DRD驱动打开失败检查USB DRD硬件或驱动状态

NandFlash写保护

日志片段日志级别来源文件含义解读建议处理动作
Nand Flash, open nand flash write protectionmaintenance(WARN)soc/nand_flash_ctrl.luaNandFlash写保护已开启确认是否为预期行为
Nand Flash, close nand flash write protectionmaintenance(WARN)soc/nand_flash_ctrl.luaNandFlash写保护已关闭确认是否为预期行为

串口控制

日志片段日志级别来源文件含义解读建议处理动作
set uart_%s rx connect uart_%s tx failed:%serroruart/uart.luaUART互联配置失败检查UART编号是否有效,检查驱动状态
set port_%s tx connect uart_%s tx failed:%serroruart/uart.luaPort到UART互联配置失败检查端口编号是否有效
failed to init uart driver, err: %serroruart/uart.luaUART驱动初始化失败检查UART硬件或驱动是否正常
failed to init sol driver, err: %serroruart/uart_circular_log.luaSOL驱动初始化失败检查SOL硬件或驱动状态

PECI设备

日志片段日志级别来源文件含义解读建议处理动作
failed to init peci drv, err: %serrorsoc/peci.luaPECI驱动初始化失败检查PECI硬件或驱动状态

PCIe控制器

日志片段日志级别来源文件含义解读建议处理动作
process pcie1PFUsage finished, value: %snoticesoc/boot_loader.luaPCIe功能环境变量处理完成确认PCIe配置是否正确
set pcie1 flag failed, msg: %serrorsoc/boot_loader.lua设置PCIe1使能标志失败检查驱动状态和环境变量持久化
pcie1 system gpu is offerrorsoc/boot_loader.luaPCIe1关联的GPU未开启确认GPU硬件状态
the pcie function environment variables will be activated after %dsnoticesoc/boot_loader.luaPCIe功能环境变量将在系统重启后生效确认是否已重启OS

M3安全核通信

日志片段日志级别来源文件含义解读建议处理动作
failed to open scm3 drv, err: %serrorsoc/scm3_msg.luaM3驱动打开失败检查M3固件是否正常加载
get bios verify result failed, msg: %serrorsoc/scm3_msg.lua获取BIOS校验结果失败检查M3固件和BIOS状态
TPCM get SM3 hash failed, msg: %serrorsoc/scm3_msg.luaTPCM获取SM3哈希失败检查TPCM芯片状态
TPCM get log failed, msg: %serrorsoc/scm3_msg.luaTPCM获取日志失败检查TPCM芯片和通信链路
TPCM get random failed, msg: %serrorsoc/scm3_msg.luaTPCM获取随机数失败检查TPCM芯片状态
import custom certificate hash failed, msg: %serrorsoc/scm3_msg.lua导入自定义证书哈希失败检查证书格式和M3固件状态
disable boot verification failed, msg: %serrorsoc/scm3_msg.lua禁用安全启动校验失败检查M3固件状态
reset secure core on next bmc reset failederrorsoc/scm3_msg.lua设置下次BMC复位时复位安全核失败检查M3固件状态

环境变量和UBoot

日志片段日志级别来源文件含义解读建议处理动作
get uboot env failed, msg: %serrorsoc/boot_loader.lua读取UBoot环境变量失败检查UBoot驱动或环境变量存储区
set uboot env failed, msg: %serrorsoc/boot_loader.lua写入UBoot环境变量失败检查UBoot驱动或存储空间
iocfg successfully, csr config num:%snoticesoc/boot_loader.luaCSR IO配置成功无
uboot env dump successnoticesoc/boot_loader.lua:974UBoot环境变量转储成功无
csr iocfg has conflict, conflict module id: {%s}warnsoc/boot_loader.luaCSR IO配置存在冲突检查配置的module_id是否重复

5. 问题定界指南 ​

5.1 典型问题定界 ​

现象描述是否为本组件问题判断依据关键证据收集方法
USB设备无法连接需确认检查soctrl日志和USB设备状态查看内核日志,确认设备标识是否正确
NandFlash写入失败部分是写保护开启时应阻止写入,这是预期行为;写保护关闭时失败才是问题查询WriteProtection属性状态,查看soctrl日志
PCIe控制器设置后不生效否PCIe控制器状态需OS重启后生效,属正常行为确认是否已重启OS,检查环境变量
UART互联配置失败需确认检查UART编号和PORT编号是否在有效范围内,映射关系是否冲突查看内核日志,确认参数合法性
SOL日志数据为空需确认确认DDR地址和缓存空间配置是否正确,SOL功能是否已使能检查DDR地址是否被正确映射,Enable是否调用成功

5.2 调试方法 ​

开启调试日志 ​

bash
# 开启 soctrl 详细日志
busctl --user call bmc.kepler.soctrl \
/bmc/kepler/soctrl/MicroComponent \
bmc.kepler.MicroComponent.Debug SetDlogLevel a{ss}sy 0 debug 1

# 查看实时日志
tail -f /var/log/framework.log | grep soctrl

复现问题方法 ​

  1. 前置条件:确保soctrl服务运行正常,bmc_soc等其他组件已就绪
  2. 操作步骤:通过D-Bus调用对应接口方法,观察返回值和资源树状态
  3. 预期现象:接口正常返回预期结果,日志记录操作信息

6. 常见问题解答 ​

可参考4.2章节中的对应日志进行问题处理