BMC读取CRPS电源的输出电压错误问题分析
更新时间: 2026/05/28
在Gitcode上查看源码

问题背景

  • 单板类型:NA;
  • 软件版本:openUBMC 25.06;
  • 涉及功能:电源管理;
  • 触发条件:pmbus_FP1420.lua里面重写了pmbus对象的get_output_voltage接口。
  • 业务表现:预期电源管理正常,所有字段正常显示;实际在 BMC 资源树中看到电源对象outputVoltage 字段显示始终为 1。

问题复现步骤

  1. 在基于 2506 社区版本调试一款 CRPS 电源时,使用 PMBus 协议管理电源。
  2. 调整扩展板 SR 后,可以在 BMC 资源树中看到电源对象,但部分字段获取异常。例如:
  • outputVoltage 字段显示始终为 1。
  • 但通过读取电源 psu_chip 并发送对应电压指令 0x8B,解码结果为 12V,与实际值一致

关键日志信息

增加日志得到的堆栈信息输出

stack traceback:
text
./opt/bmc/lualib/device_tree/adapters/OnePower.lua:211: in function ‘fetch_property’
./opt/bmc/lualib/device_tree/adapters/OnePower.lua:167: in function ‘run_probe’
./opt/bmc/lualib/device_tree/adapters/OnePower.lua:181: in function ‘init’
./opt/bmc/libmc/lualib/mc/class.lua:138: in function ‘old_new’
./opt/bmc/libmc/lualib/mc/mdb/device_tree/device_object.lua:549: in function ‘new’
./opt/bmc/libmc/lualib/mc/mdb/device_tree/dev_object_manage.lua:171: in function ‘create_object’
./opt/bmc/libmc/lualib/mc/orm/factory.lua:123: in function ‘create_object’
./opt/bmc/libmc/lualib/mc/orm/factory.lua:37: in function <./opt/bmc/libmc/lualib/mc/orm/factory.lua:36>
[C]: in function ‘pcall’
./opt/bmc/libmc/lualib/mc/signal.lua:69: in function ‘run_slot’
./opt/bmc/libmc/lualib/mc/signal.lua:89: in function <./opt/bmc/libmc/lualib/mc/signal.lua:79>
./opt/bmc/libmc/lualib/mc/orm/mdb_object_manager.lua:67: in function ‘cb’
./opt/bmc/libmc/lualib/mc/mdb/object_manage.lua:91: in function <./opt/bmc/libmc/lualib/mc/mdb/object_manage.lua:88>
[C]: in function ‘pcall’
./opt/bmc/libmc/lualib/mc/context.lua:194: in function ‘with_context’
./opt/bmc/libmc/lualib/mc/mdb/object_manage.lua:88: in function <./opt/bmc/libmc/lualib/mc/mdb/object_manage.lua:60>
[C]: in function ‘pcall’
./opt/bmc/libmc/lualib/mc/mdb/object_manage.lua:202: in function <./opt/bmc/libmc/lualib/mc/mdb/object_manage.lua:197>
[C]: in function ‘pcall’
./opt/bmc/libmc/lualib/mc/context.lua:194: in function ‘’
/opt/bmc/skynet/lualib/skynet.lua: in function </opt/bmc/skynet/lualib/skynet.lua:0>

定位过程

  1. 在 protocol/pmbus.lua 的接口中增加了调试日志,测试时发现日志未输出,包括在 pmbus.lua 构造函数中的日志也未输出。

  2. 已确认 csr 中的 physicalinterface 和 protocol 均为 pmbus。

  3. 在对应OnePower中fetch_property读取时,加入以下判断:

  4. 确认刷新调用栈逻辑:

    lua
    if prop == ‘OutputVoltage’ then
    log:notice(‘%s’, debug.traceback())
    end
  5. PsuSlot.lua里面增加了日志,得到的输出电压结果为1,但是在protocol/pmbus.lua定义的get_output_voltage方法中却没有输出。

  6. 在OnePower.lua下的init()中打印self[‘PhysicalInterface’],确认使用的是哪个配置类型。

  7. 确认include/device_tree/adapters/power_mgmt/protocol/init.lua中配置的是哪一个协议

问题原因

  1. pmbus_FP1420.lua里面重写了pmbus对象的get_output_voltage接口,导致最终计算的结果为1。
  2. pmbus.lua中get_output_voltage中获取输出模式时候使用的是self.chip_byteread,导致获取输出模式问题

解决方案

  1. pmbus_FP1420.lua里get_output_voltage接口改为psu_pmbus:get_output_voltage()。
  2. pmbus.lua中get_output_voltage中获取输出模式时候使用的是self:chip_byteread。

PR链接

修复从pmbus读取输出电压失败