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存储设备模拟 |
| SOL | Serial Over LAN,通过网络传输串口数据的远程管理技术 |
| PECI | Platform Environment Control Interface,CPU与BMC之间的通信接口 |
| M3安全核 | chipv1芯片内置的安全处理器,负责eFuse、固件校验、安全启动、TPCM等安全功能 |
| UART | Universal Asynchronous Receiver/Transmitter,通用异步收发传输器 |
| TPCM | Trusted Platform Module,可信平台模块 |
| eFuse | 芯片级只读存储区域,存放芯片密钥和配置信息 |
| D-Bus资源树 | openUBMC框架提供的基于D-Bus的对象模型接口,统一管理硬件资源 |
1.5 外部交互边界图
soctrl采用分层架构设计,通过D-Bus与外部组件交互:
+-----------------------------------------------------------+
| 外部组件 (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_app | src/lualib/soctrl_app.lua | 主应用类,初始化并管理所有子模块 |
| usb_mgmt | src/lualib/usb_mgmt/ | USB设备管理,支持复合设备挂载与控制 |
| uart | src/lualib/uart/ | 串口控制,端口互联与参数配置 |
| soc | src/lualib/soc/ | SOC核心控制(boot_loader、PECI、GPIO、NandFlash、黑匣子等) |
| bbb | src/lualib/bbb/ | BBB协议实现(USB Mass Storage) |
| scm3_msg | src/lualib/soc/scm3_msg.lua | M3安全核通信 |
| libbbb.so | src/lualib-src/bbb/ | BBB协议FSM的C++实现 |
| libboot_loader.so | src/lualib-src/boot_loader/ | 启动环境变量、PCIe、GMAC等驱动 |
2. API 使用说明与示例
2.1 USB设备控制接口
功能说明
提供USB设备的连接与断开管理能力,支持USB复合设备的挂载和单一设备数据传输。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.Managers.SOC.UsbDevices |
资源树路径
└─/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设备 |
ConnectState | USB设备连接状态(property,emits-change) |
应用场景
- 通过Redfish/IPMI调用USB设备连接/断连操作
- 业务系统需要从SP启动或安装板载BMA时,挂载对应USB设备
- 远程运维时挂载U盘进行数据交换
限制条件
- 同一USB口的复合设备连接/断连操作会耦合,不能单独对某一设备进行连接或断连
- 调用方需注意对同一USB口上设备的互斥关系
调试示例
busctl --user get-property bmc.kepler.soctrl /bmc/kepler/Managers/1/UsbDevices/SP \
bmc.kepler.Managers.UsbDevice.Ums ConnectState2.2 NandFlash写保护接口
功能说明
提供NandFlash写保护的查询和设置能力,在写入量超过阈值或BMC升级时保护NandFlash使用寿命。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.Managers.SOC.NandFlashCtrl |
参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| WriteProtection | 属性 | bool | NandFlash写保护开关,读写 | true=开启写保护 / false=关闭写保护 |
应用场景
- BMC升级前开启写保护,限制NandFlash写入
- 写入量超过阈值时自动开启写保护
- 通过修改WriteProtection属性控制rsyslog日志写入行为
限制条件
- 修改NandFlash内容前应先确认写保护状态,避免在写保护开启时进行写入操作
调试示例
# 查询写保护状态
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 true2.3 PCIe通道使能控制接口
功能说明
提供PCIe控制器状态的设置和获取能力,支持BMC配置开启和关闭PCIe1控制器。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.Managers.SOC.PCIeController |
参数说明
| 方法 | 签名 | 描述 |
|---|---|---|
GetState | req: y, rsp: b | 获取PCIe控制器使能状态 |
SetState | req: yb, rsp: - | 设置PCIe控制器使能状态 |
应用场景
- 黑匣子、虚拟网口、MCTP、EDMA等业务需要PCIe1通道时由bmc_soc调用开启
- BMC配置关闭PCIe1以降低功耗或隔离硬件
限制条件
- PCIe0固定开启,不支持BMC配置
- 设置PCIe控制器状态后需重启OS生效
- 环境变量持久化保存,系统重启后仍保持配置
调试示例
# 获取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" true2.4 串口控制接口
功能说明
提供完整的UART端口互联、开关和参数配置管理功能,支持8路UART控制器与8个UART Port的灵活映射。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.Managers.Uart |
参数说明
| 方法 | 签名 | 描述 |
|---|---|---|
UartOpen | a{ss}yu | 打开初始化对应串口 |
UartClose | a{ss}y | 关闭串口 |
PortConnectPort | a{ss}uu | 设置portN之间的互联关系 |
UartConnectPort | a{ss}uu | 设置uartN和PortN之间的互联关系 |
UartConnectUart | a{ss}uu | 设置uartN之间的互联关系 |
SetBaudRate | a{ss}yu | 设置波特率 |
SetDataBit | a{ss}yy | 设置数据位 |
SetStopBit | a{ss}yy | 设置停止位 |
SetParityBit | a{ss}yy | 设置校验位 |
QueryConnection | a{ss} | 查询互联关系 |
应用场景
- 将BMC COM与HOST COM进行互联,实现远程串口管理
- 配置UART参数(波特率、数据位、校验位等)以匹配外围设备
- 查询当前UART互联配置状态
限制条件
- UART到PORT的TX方向全互联,但配置时需保证映射关系不冲突
- 对不使用的UART或Port应关闭其通路
2.5 串口日志接口
功能说明
提供4路SOL收发数据的循环记录能力,缓存空间可配置,支持将指定SOL数据读取到文件。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.Managers.UartCircularLog |
参数说明
| 方法 | 签名 | 描述 |
|---|---|---|
SetLogSize | a{ss}uuuuuu | 设置指定SOL DDR地址(tx,rx) |
GetPosition | a{ss}u | 获取当前数据的读指针地址 |
Enable | a{ss}uu | SOL使能开关 |
Dump | a{ss}uuus | 将指定SOL数据读取到指定文件 |
应用场景
- 远程串口数据记录,用于故障排查和审计
- 缓存空间可通过libsoc_adapter接口动态配置
2.6 PECI设备接口
功能说明
提供与CPU进行通信的PECI接口,支持设备初始化、复位和读写操作。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.Managers.SOC.PECI |
参数说明
| 方法 | 签名 | 描述 |
|---|---|---|
WriteRead | Input: 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 |
| Presence | TPCM芯片是否在位(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.log | soctrl组件日志记录在框架日志中 |
4.2 关键日志信息
以下日志片段均来自源代码中的实际日志语句,来源文件见代码位置列。
服务启动/停止
| 日志片段 | 日志级别 | 来源文件 | 含义解读 | 建议处理动作 |
|---|---|---|---|---|
soctrl start failed, err: %s | error | service/main.lua | soctrl服务启动失败 | 查看error详情,检查初始化模块是否正常,环境变量是否就绪 |
get chip name failed | error | soctrl_app.lua | 获取芯片名称失败 | 检查chipv1/chipv2驱动是否正常加载 |
USB设备管理
| 日志片段 | 日志级别 | 来源文件 | 含义解读 | 建议处理动作 |
|---|---|---|---|---|
connect_compound_cdrom_device: usb_id=%d | notice | usb_ctrl/base_scene1 | USB光驱设备连接成功 | 确认业务是否正常 |
connect LCD 0/1/2 successfully | notice | usb_ctrl/base_scene0.lua | USB LCD设备连接成功 | 确认业务是否正常 |
disconnect_compound_cdrom_device: usb_id=%d | notice | usb_ctrl/base_scene1.lua | USB光驱设备断开成功 | 确认业务是否正常 |
failed to init %s device, err: %s | error | usb_ctrl/base.lua | USB设备初始化失败 | 检查设备驱动是否加载,查看error详情 |
failed to open usb drd drv, err: %s | error | usb_drd.lua | USB DRD驱动打开失败 | 检查USB DRD硬件或驱动状态 |
NandFlash写保护
| 日志片段 | 日志级别 | 来源文件 | 含义解读 | 建议处理动作 |
|---|---|---|---|---|
Nand Flash, open nand flash write protection | maintenance(WARN) | soc/nand_flash_ctrl.lua | NandFlash写保护已开启 | 确认是否为预期行为 |
Nand Flash, close nand flash write protection | maintenance(WARN) | soc/nand_flash_ctrl.lua | NandFlash写保护已关闭 | 确认是否为预期行为 |
串口控制
| 日志片段 | 日志级别 | 来源文件 | 含义解读 | 建议处理动作 |
|---|---|---|---|---|
set uart_%s rx connect uart_%s tx failed:%s | error | uart/uart.lua | UART互联配置失败 | 检查UART编号是否有效,检查驱动状态 |
set port_%s tx connect uart_%s tx failed:%s | error | uart/uart.lua | Port到UART互联配置失败 | 检查端口编号是否有效 |
failed to init uart driver, err: %s | error | uart/uart.lua | UART驱动初始化失败 | 检查UART硬件或驱动是否正常 |
failed to init sol driver, err: %s | error | uart/uart_circular_log.lua | SOL驱动初始化失败 | 检查SOL硬件或驱动状态 |
PECI设备
| 日志片段 | 日志级别 | 来源文件 | 含义解读 | 建议处理动作 |
|---|---|---|---|---|
failed to init peci drv, err: %s | error | soc/peci.lua | PECI驱动初始化失败 | 检查PECI硬件或驱动状态 |
PCIe控制器
| 日志片段 | 日志级别 | 来源文件 | 含义解读 | 建议处理动作 |
|---|---|---|---|---|
process pcie1PFUsage finished, value: %s | notice | soc/boot_loader.lua | PCIe功能环境变量处理完成 | 确认PCIe配置是否正确 |
set pcie1 flag failed, msg: %s | error | soc/boot_loader.lua | 设置PCIe1使能标志失败 | 检查驱动状态和环境变量持久化 |
pcie1 system gpu is off | error | soc/boot_loader.lua | PCIe1关联的GPU未开启 | 确认GPU硬件状态 |
the pcie function environment variables will be activated after %ds | notice | soc/boot_loader.lua | PCIe功能环境变量将在系统重启后生效 | 确认是否已重启OS |
M3安全核通信
| 日志片段 | 日志级别 | 来源文件 | 含义解读 | 建议处理动作 |
|---|---|---|---|---|
failed to open scm3 drv, err: %s | error | soc/scm3_msg.lua | M3驱动打开失败 | 检查M3固件是否正常加载 |
get bios verify result failed, msg: %s | error | soc/scm3_msg.lua | 获取BIOS校验结果失败 | 检查M3固件和BIOS状态 |
TPCM get SM3 hash failed, msg: %s | error | soc/scm3_msg.lua | TPCM获取SM3哈希失败 | 检查TPCM芯片状态 |
TPCM get log failed, msg: %s | error | soc/scm3_msg.lua | TPCM获取日志失败 | 检查TPCM芯片和通信链路 |
TPCM get random failed, msg: %s | error | soc/scm3_msg.lua | TPCM获取随机数失败 | 检查TPCM芯片状态 |
import custom certificate hash failed, msg: %s | error | soc/scm3_msg.lua | 导入自定义证书哈希失败 | 检查证书格式和M3固件状态 |
disable boot verification failed, msg: %s | error | soc/scm3_msg.lua | 禁用安全启动校验失败 | 检查M3固件状态 |
reset secure core on next bmc reset failed | error | soc/scm3_msg.lua | 设置下次BMC复位时复位安全核失败 | 检查M3固件状态 |
环境变量和UBoot
| 日志片段 | 日志级别 | 来源文件 | 含义解读 | 建议处理动作 |
|---|---|---|---|---|
get uboot env failed, msg: %s | error | soc/boot_loader.lua | 读取UBoot环境变量失败 | 检查UBoot驱动或环境变量存储区 |
set uboot env failed, msg: %s | error | soc/boot_loader.lua | 写入UBoot环境变量失败 | 检查UBoot驱动或存储空间 |
iocfg successfully, csr config num:%s | notice | soc/boot_loader.lua | CSR IO配置成功 | 无 |
uboot env dump success | notice | soc/boot_loader.lua:974 | UBoot环境变量转储成功 | 无 |
csr iocfg has conflict, conflict module id: {%s} | warn | soc/boot_loader.lua | CSR 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 调试方法
开启调试日志
# 开启 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复现问题方法
- 前置条件:确保soctrl服务运行正常,bmc_soc等其他组件已就绪
- 操作步骤:通过D-Bus调用对应接口方法,观察返回值和资源树状态
- 预期现象:接口正常返回预期结果,日志记录操作信息
6. 常见问题解答
可参考4.2章节中的对应日志进行问题处理