设置CRPS电源冷备模式不生效

// 此模板仅供参考,如果不适用可以修改

问题描述

最近在适配一款CRPS电源,发现向Cold_Redundancy_Config(D0h)下发冷备模式命令不生效,社区有没有有经验的小伙伴看下,设置冷备模式有什么条件么?

环境信息

  • 操作系统:[如 Ubuntu 24.04]

  • 软件版本:[如 OpenUBMC2509]

  • 硬件配置:[如 CPU、内存等]

重现步骤

  1. [第一步]

  2. [第二步]

  3. [第三步]

期望结果

能够设置冷备模式

实际结果

通过代码和busctl设置0XD0均未生效

Catch

尝试过的解决方案

分析结论

[详细总结您对此问题的分析结论]

答案内容由AI生成,仅供参考:

总结

问题 原因 解决方案
设置冷备模式不生效 电源未上电/未就绪 先检测STATUS_BYTE,确保电源已输出
设置后自动恢复标准模式 CR_BUS被拉低 确保CR_BUS为高或悬空
Web界面无主用电源选项 未启用ActiveStandbySupported 在CSR中配置ActiveStandbySupported=true
状态显示与实际不符 get_work_mode未判断运行状态 增加OFF位检查,提升函数健壮性

:wrench: 根本原因:当前问题是时序控制缺失 + 配置缺失 + 逻辑健壮性不足三者共同导致。

:white_check_mark: 最终建议

  1. 完善电源就绪检测机制
  2. 正确配置PowerStrategy策略
  3. 提升控制逻辑的容错能力
  4. 加强状态验证与重试

以上措施可确保CRPS电源冷备模式设置稳定、可靠生效。

点击此处查看详细分析解答

CRPS电源冷备模式设置不生效问题分析与解决方案

问题描述

在适配CRPS电源时,通过向PMBus命令Cold_Redundancy_Config (D0h)下发冷备模式配置值,发现设置操作不生效。无论是通过代码还是使用busctl命令直接写入,均未能成功配置电源的冷备模式。


问题原因分析

根据知识库及相关社区讨论内容,设置CRPS电源冷备模式不生效的主要原因如下:

1. 电源未处于可通信状态

  • 在AC上电初期,电源模块可能仍处于关机状态(STATUS_BYTE寄存器中OFF位为1),此时无法响应任何控制命令。
  • 若电源未建立稳定电压输出(无PS_OK信号),其内部控制寄存器(如CONTROL_CMD = 0xD0)无法被正常访问或写入,导致写操作无效。

:white_check_mark: 相关证据:文档中提到“AC上电后,模组并未上电。此时电源处关机状态……在此状态下,是无法设置主备状态的”。


2. CR_BUS信号被拉低,强制进入标准冗余模式

  • 根据PMBus规范,当CR_BUS信号被拉低时,电源会自动切换至标准冗余模式(00h),无视Cold_Redundancy_Config寄存器设置。
  • 即使通过软件成功写入了0x02(Cold Standby 1)等值,只要CR_BUS为低,电源仍会忽略该配置。

:white_check_mark: 知识图谱关系支持CR_BUS SignalCold Redundancy Configuration:当CR_BUS信号拉低时,电源自动转入标准冗余模式(00h)。


3. 缺少对ActiveStandbySupported的CSR配置

  • 在OpenUBMC系统中,必须显式启用电源策略中的主备模式支持,否则上层组件不会触发正确的模式设置流程。
  • 若未在配置中开启ActiveStandbySupported=true,即使底层协议调用成功,逻辑层也不会允许进入主备/冷备模式。

:white_check_mark: 用户案例佐证:用户zhangxuan8899反馈,“BMC上没有配置PowerStrategy中的ActiveStandbySupported: true”,增加后问题解决。


4. get_work_mode/set_power_mode逻辑缺陷

  • 当前get_work_mode()函数直接读取CONTROL_CMD寄存器并返回结果,未判断电源是否已激活(OFF位)
  • 导致:
    • 电源未供电时返回默认值(可能误判为“ACTIVE”或“STANDBY”)
    • 实际硬件未响应设置命令,但软件认为设置成功
    • 出现显示状态与实际运行状态不一致

:white_check_mark: 伪代码证据

function pmbus.get_work_mode():
    work_mode = chip_read_byte(CONTROL_CMD)
    return (work_mode == 1) ? "ACTIVE_MODE" : "STANDBY_MODE"

——该函数无前置状态检查,存在风险。


解决方案

:white_check_mark: 1. 确保电源处于正常运行状态再设置模式

在执行Cold_Redundancy_Config写入前,先读取STATUS_BYTE寄存器,确认OFF位为0(表示电源已输出):

status_byte = chip_read_byte(0x00)  -- STATUS_BYTE
if (status_byte & 0x40):  -- bit 6 is OFF
    return ERROR_POWER_OFF  -- 电源未启动,不可设置
end

建议:引入轮询机制,在AC上电后延迟设置或等待电源就绪事件。


:white_check_mark: 2. 检查并确保CR_BUS信号为高电平

  • 确认硬件设计中CR_BUS未被下拉电阻强制拉低
  • 检查是否有其他电源模块将该总线拉低
  • 冷冗余模式生效前提CR_BUS必须处于高阻态或高电平

:magnifying_glass_tilted_left: 可通过示波器或逻辑分析仪监测CR_BUS电平状态。


:white_check_mark: 3. 正确配置CSR中的ActiveStandbySupported

在PowerStrategy配置中显式启用主备模式支持:

"PowerStrategy_1": {
    "PowerWorkingMode": "LoadBalancing",
    "ActiveStandbySupported": true,
    "DeepSleepSupported": true,
    ...
}

:books: 配置依据:CSR配置字典明确指出ActiveStandbySupported用于控制是否支持主备模式。


:white_check_mark: 4. 改进电源模式获取与设置逻辑

修改get_work_mode()函数以增强健壮性:

function pmbus.get_work_mode():
    status_byte = chip_read_byte(STATUS_BYTE)
    if (status_byte & OFF_BIT):  -- 电源未开启
        return "POWER_OFF"
    
    work_mode = chip_read_byte(CONTROL_CMD)
    if (work_mode == COLD_ACTIVE):
        return "ACTIVE_MODE"
    elseif (work_mode == COLD_STANDBY1):
        return "STANDBY_MODE"
    else:
        return "STANDARD_REDUNDANCY"

同时,建议增加设置后的状态验证与重试机制,防止假性成功上报。


验证方法

  1. 确认电源状态

    busctl --user call bmc.kepler.hwproxy /bmc/kepler/Chip/Eeprom/Eeprom_PsuChip1_0101 bmc.kepler.Chip.BlockIO Read a{ss}uu 0 0x00 1
    # 查看返回值bit6是否为0(OFF位)
    
  2. 写入冷备模式(Cold Standby 1):

    busctl --user call bmc.kepler.hwproxy /bmc/kepler/Chip/Eeprom/Eeprom_PsuChip1_0101 bmc.kepler.Chip.BlockIO Write a{ss}uv 0 0xD0 1 0x02
    
  3. 读取验证

    busctl --user call ... Read a{ss}uu 0 0xD0 1
    # 应返回 0x02
    
  4. 检查实际工作模式是否切换成功,而非仅依赖返回值。


总结

问题 原因 解决方案
设置冷备模式不生效 电源未上电/未就绪 先检测STATUS_BYTE,确保电源已输出
设置后自动恢复标准模式 CR_BUS被拉低 确保CR_BUS为高或悬空
Web界面无主用电源选项 未启用ActiveStandbySupported 在CSR中配置ActiveStandbySupported=true
状态显示与实际不符 get_work_mode未判断运行状态 增加OFF位检查,提升函数健壮性

:wrench: 根本原因:当前问题是时序控制缺失 + 配置缺失 + 逻辑健壮性不足三者共同导致。

:white_check_mark: 最终建议

  1. 完善电源就绪检测机制
  2. 正确配置PowerStrategy策略
  3. 提升控制逻辑的容错能力
  4. 加强状态验证与重试

以上措施可确保CRPS电源冷备模式设置稳定、可靠生效。

我在之前适配过程中,也有部分电源写0xD0不生效的。后来翻了下文档,看到是向0xFC写14(10进制)和85(10进制)就生效的。

读了一下资料,长城有部分CRPS电源确实是写您说的这两个值 向FCh 写入0eh进入冷备,写入55h退出冷备。我这款电源资料确实也写0XD0为1进入冷备模式。不生效的原因经过验证是因为检测到多个电源,其中有电源处于下电状态,此时则无法设置上电的电源0XD0为1,这个逻辑是否正常正在与厂商沟通