BMC读取CRPS电源的输出电压错误问题分析
更新时间: 2026/05/28
在Gitcode上查看源码问题背景
- 单板类型:NA;
- 软件版本:openUBMC 25.06;
- 涉及功能:电源管理;
- 触发条件:pmbus_FP1420.lua里面重写了pmbus对象的get_output_voltage接口。
- 业务表现:预期电源管理正常,所有字段正常显示;实际在 BMC 资源树中看到电源对象outputVoltage 字段显示始终为 1。
问题复现步骤
- 在基于 2506 社区版本调试一款 CRPS 电源时,使用 PMBus 协议管理电源。
- 调整扩展板 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>定位过程
在 protocol/pmbus.lua 的接口中增加了调试日志,测试时发现日志未输出,包括在 pmbus.lua 构造函数中的日志也未输出。
已确认 csr 中的 physicalinterface 和 protocol 均为 pmbus。
在对应OnePower中fetch_property读取时,加入以下判断:
确认刷新调用栈逻辑:
luaif prop == ‘OutputVoltage’ then log:notice(‘%s’, debug.traceback()) endPsuSlot.lua里面增加了日志,得到的输出电压结果为1,但是在protocol/pmbus.lua定义的get_output_voltage方法中却没有输出。
在OnePower.lua下的init()中打印self[‘PhysicalInterface’],确认使用的是哪个配置类型。
确认include/device_tree/adapters/power_mgmt/protocol/init.lua中配置的是哪一个协议
问题原因
- pmbus_FP1420.lua里面重写了pmbus对象的get_output_voltage接口,导致最终计算的结果为1。
- pmbus.lua中get_output_voltage中获取输出模式时候使用的是self.chip_byteread,导致获取输出模式问题
解决方案
- pmbus_FP1420.lua里get_output_voltage接口改为psu_pmbus:get_output_voltage()。
- pmbus.lua中get_output_voltage中获取输出模式时候使用的是self:chip_byteread。