如何配置vpd实现手动控制风扇转速

问题描述

添加风扇调速控制后无法手动控制风扇,会被初始值一直覆盖

环境信息

  • 操作系统:Ubuntu 24.04
  • 软件版本:version:25.12.00.01
  • 工具版本:bingo 0.6.120

conan 2.13.0
*模组:920X08 920S08

配置

  1. 在/vpd/vendor/Huawei/Server/Kunpeng/openUBMC/PSR/14100513_Sensor_0.sr文件添加
        "CoolingConfig_Basic": {
            "SmartCoolingState": "Enabled",
            "SmartCoolingMode": "EnergySaving",
            "LevelPercentRange": [20, 100],
            "InitLevelInStartup": 100,
            "DiskRowTemperatureAvailable": false,
            "SysHDDsMaxTemperature": 80.0,
            "SysSSDsMaxTemperature": 80.0,
            "SensorLocationSupported": false
        },
        "AirCoolingConfig": {
            "SpeedPercentRange": [10, 100],
            "InitialSpeedPercent": 100
        },

2.CLU文件
/vpd/vendor/Huawei/TianChi/CLU/14100363_00000001050302035475.sr

3.在网页尝试设置pwm

设置不生效

4.尝试通过指令设置pwm


会有短暂的生效,但又会很快被覆盖回原来的值
排查确定该99的占空比是由

    "Fan_1": {
      "FanId": 1,
      "Slot": 1,
      "Coefficient": 1,
      "FrontPresence": "<=/Scanner_Fan1_Presence.Value",
      "RearPresence": "<=/Scanner_Fan1_Presence.Value",
      "FrontSpeed": "<=/Scanner_Fan1_FSpeed.Value",
      "RearSpeed": "<=/Scanner_Fan1_RSpeed.Value",
      "HardwarePWM": "#/Accessor_Fan1_PWM.Value",
      "SystemId": 1,
      "FrontStatus": 0,
      "RearStatus": 0,
      "MaxSupportedPWM": 255,
      "IdentifySpeedLevel": 99,
      "Position": "CLU",
      "PowerGood": "<=/Scanner_PowerGood.Value"
    },

的IdentifySpeedLevel控制的
请问有什么办法可以不让这个值持续覆盖,实现正常的手动控制转速功能呢

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

:white_check_mark: 总结:修复步骤清单

  1. 【立即修复】 将 IdentifySpeedLevel 改为 35。
  2. 【必须执行】 使用 CLI 命令切换至 手动模式。
  3. 【完整配置】 确保 CoolingConfig 包含 MaxLimiLevel, MinimalLevel, LevelPercentRange。
  4. 【优化建议】 将 InitLevelInStartup 调整为合理值(如 50)。
  5. 【验证】 使用 smdbctl 检查 HardwarePWM 是否可成功修改。
  6. 【重启】 重启服务或 BMC 使新配置生效。
点击此处查看详细分析解答

风扇手动调速配置问题分析与解决方案

根据您描述的问题:在配置了 CoolingConfig 和 AirCoolingConfig 后仍无法实现手动控制风扇转速,且设置的 PWM 值会被自动恢复为 99%,这表明系统中存在默认策略或配置项覆盖了手动设定。结合上下文信息和系统运行机制,以下是详细分析与解决方案。


:magnifying_glass_tilted_left: 问题根源分析

:cross_mark: 1. IdentifySpeedLevel: 99 是关键异常点

从您提供的 CSR 配置片段:

"IdentifySpeedLevel": 99
  • 正常情况下,IdentifySpeedLevel 应设为 35(用于风扇型号识别时的标准测试转速)。
  • 您当前将其设为 99,这意味着系统在识别阶段会将风扇强制设为 ≈99% 转速,并可能因异常逻辑导致该值持续生效或“残留”影响。
  • 知识库确认:IdentifySpeedLevel 是用于风扇类型识别的配置参数,标准值为 35%(参见 IdentifySpeedLevel 实体描述)。

:warning: 将 IdentifySpeedLevel 设置为 99 属于严重配置错误,可能导致系统误认为需以高转速运行风扇,从而覆盖后续的手动控制指令。


:cross_mark: 2. 手动模式切换未成功或被自动模式劫持

尽管网页显示“操作成功”,但实际未生效,原因如下:

  • 必须先切换至“手动模式”,否则任何手动设置都会被 PID 自动调速策略立即覆盖。
  • 文档中多次强调:只有在“Manual Mode”下,SetPWM 等方法才有效(见 Document Chunk 1 和 3)。
  • 您通过 Web 或命令行设置 PWM 后值被快速还原,说明 自动调速策略仍在运行,未真正进入手动控制状态。

:cross_mark: 3. MaxLimiterLevel(最大允许转速限制)缺失或未配置

虽然您设置了:

"LevelPercentRange": [20, 100]

但缺少关键属性:

"MaxLimiLevel": 100

:warning: 注意拼写:根据 CSR 字典,正确字段名为 "MaxLimiLevel",不是 "MaxLimitLevel" 或 "MaxLimiterLevel"。

该字段作用是:

定义整机允许的最大风扇转速百分比,所有手动与自动下发的 PWM 都会被此值限制。

若未配置,默认为 100,但若存在旧配置或默认值异常,也可能导致控制异常。


:cross_mark: 4. InitLevelInStartup: 100 导致启动后满转并维持

  • BMC 启动初期所有风扇会强制运行在 InitLevelInStartup 指定的转速(默认 100%)。
  • 如果此时自动调速策略未能正确接管(如无有效温度策略、传感器异常),风扇将长期保持在高转速状态。
  • 结合您看到的 98%~99% 占空比,极可能是 InitLevelInStartup=100 + IdentifySpeedLevel=99 叠加效应所致。

:white_check_mark: 正确解决方案

:white_check_mark: 1. 修正 IdentifySpeedLevel 为标准值 35

修改 /vpd/.../14100513_Sensor_0.sr 文件中的配置:

"Fan_1": {
    ...
    "MaxSupportedPWM": 255,
    "IdentifySpeedLevel": 35,        ← 修改为 35
    "Position": "CLU",
    ...
}

:pushpin: 说明:IdentifySpeedLevel=35 是风扇识别专用值,用于下发一个中等转速以采集响应特征,绝不应用于正常运行控制。


:white_check_mark: 2. 确保已正确切换至“手动模式”

使用 CLI 命令强制切换模式(比 Web 更可靠):

# 切换至手动模式
ipmcset -d coolingmode -v fan

# 或使用 busctl(适用于 openUBMC)
busctl --user call bmc.kepler.thermal_mgmt /bmc/kepler/Systems/1/Thermal/Fans bmc.kepler.Systems.Fans SetMode s "manual"

:light_bulb: 提示:切换后可通过 Web 界面确认是否变为“手动”。若自动跳回“自动”,说明后台有守护进程干预,需检查 SmartCoolingState 是否被其他配置激活。


:white_check_mark: 3. 完善 CoolingConfig 全局配置参数

确保配置包含以下关键字段:

"CoolingConfig_Basic": {
    "SmartCoolingState": "Enabled",
    "SmartCoolingMode": "EnergySaving",
    "LevelPercentRange": [20, 100],
    "InitLevelInStartup": 50,                     ← 建议降低启动转速(如50%),避免默认满转
    "MinimalLevel": 20,                           ← 最小允许转速
    "MaxLimiLevel": 100,                          ← ⚠️ 注意字段名拼写
    "DiskRowTemperatureAvailable": false,
    "SysHDDsMaxTemperature": 0,
    "SysSSDsMaxTemperature": 0,
    "SensorLocationSupported": true
}

:hammer_and_wrench: 推荐:InitLevelInStartup 设置为 50~70,防止启动阶段长期高转。


:white_check_mark: 4. 验证风扇对象是否存在配置冲突

使用 smdbctl 检查 HardwarePWM 和 ExpectedPWM:

# 查看当前硬件 PWM 实际输出值
smdbctl getprop Fan_1_010103 bmc.kepler.Systems.Fan HardwarePWM

# 查看期望 PWM
smdbctl getprop Fan_1_010103 bmc.kepler.Systems.Fan ExpectedPWM

# 尝试设置(在手动模式下)
smdbctl setprop Fan_1_010103 bmc.kepler.Systems.Fan HardwarePWM 60

:no_entry: 注意:

  • 若 ExpectedPWM 被错误更新,仍会被自动策略拉回。
  • 只有 HardwarePWM 才代表真实的底层 PWM 输出值(见 Document Chunk 4)。

:white_check_mark: 5. 重启 BMC 或重新加载风扇服务(可选)

若配置修改后仍未生效,尝试重启相关服务:

# 重启 thermal_mgmt 服务
systemctl restart thermal_mgmt

# 或软重启 BMC(谨慎操作)
reboot

:puzzle_piece: 附加建议

项目 建议
日志排查 查看 /var/log/app.log 和 cooling_control.log,搜索 SetPWM, TargetPWM, FanType Identify 等关键字
风扇识别日志 若日志中出现 IdentifySpeedLevel=99 下发,则几乎可断定是此配置导致问题
测试命令 使用 busctl 直接调用 SetFanPWM 测试:busctl call ... SetFanPWM d 60
Web 缓存问题 清除浏览器缓存或使用无痕模式,避免前端缓存旧数据

:white_check_mark: 总结:修复步骤清单

  1. 【立即修复】 将 IdentifySpeedLevel 改为 35。
  2. 【必须执行】 使用 CLI 命令切换至 手动模式。
  3. 【完整配置】 确保 CoolingConfig 包含 MaxLimiLevel, MinimalLevel, LevelPercentRange。
  4. 【优化建议】 将 InitLevelInStartup 调整为合理值(如 50)。
  5. 【验证】 使用 smdbctl 检查 HardwarePWM 是否可成功修改。
  6. 【重启】 重启服务或 BMC 使新配置生效。

:books: 参考资料

  • IdentifySpeedLevel 标准值为 35%(见知识图谱实体)
  • SetPWM 仅在 Manual Mode 下有效(见 Document Chunk 1)
  • HardwarePWM 是实际作用于硬件的 PWM 值(见 Document Chunk 4)
  • MaxLimiLevel 限制最大允许转速(见 Document Chunk 8)

:wrench: 按照上述步骤操作后,风扇手动调速功能应能正常工作,不再被初始值覆盖。

  1. 请确认手动模式时如何下发的风扇转速;
  2. 下发的转速为HardwarePWM;实际手动模式若成功,则HardwarePWM为实际下发的转速

手动下发hardware pwm

看样子是HardwarePWM设置成功了

网页也显示占空比设置为60/255 也就是23/100


但是转速没有变化,风扇的实际转速也没有变化

风扇转速没有生效请排查对应的Accessor或者Scanner是否配置正确,例如Accessor_Fan1_PWM

这是风扇识别时转速下发,等风扇转速识别后,再在web设置手动模式看看

排查了scanner,发现之前fan1的前后转子转速 分别 读取的是fan1和fan2的转速
修正如下

"Scanner_Fan1_Presence": {
      "Chip": "#/Smc_FanBoardSMC",
      "Offset": 402656001,
      "Size": 1,
      "Mask": 1,
      "Type": 0,
      "Period": 2000,
      "Debounce": "None",
      "ScanEnabled": "<=/Scanner_PowerGood.Value",
      "NominalValue": 1,
      "@Default" :{
        "ScanEnabled" : 0
      },
      "Value": 0
    },
    "Scanner_Fan2_Speed": { //原来是Fan1_FSpeed
      "Chip": "#/Smc_FanBoardSMC",
      "Offset": 402657025,
      "Size": 4,
      "Mask": 4294901760,
      "Type": 0,
      "Period": 1000,
      "Debounce": "None",
      "Value": 0
    },
    "Scanner_Fan1_Speed": {//原来是Fan1_RSpeed
      "Chip": "#/Smc_FanBoardSMC",
      "Offset": 402657025,
      "Size": 4,
      "Mask": 65535,
      "Type": 0,
      "Period": 1000,
      "Debounce": "None",
      "Value": 0
    },
    "Accessor_Fan1_PWM": {
      "Chip": "#/Smc_FanBoardSMC",
      "Offset": 402657281,
      "Size": 1,
      "Mask": 255,
      "Type": 0,
      "Value": 0
    },
    "Fan_1": {
      "FanId": 1,
      "Slot": 1,
      "Coefficient": 1,
      "FrontPresence": "<=/Scanner_Fan1_Presence.Value",
      "RearPresence": "<=/Scanner_Fan1_Presence.Value",
      "FrontSpeed": "<=/Scanner_Fan1_Speed.Value",
      "RearSpeed": "<=/Scanner_Fan1_Speed.Value",
      "HardwarePWM": "#/Accessor_Fan1_PWM.Value",
      "SystemId": 1,
      "FrontStatus": 0,
      "RearStatus": 0,
      "MaxSupportedPWM": 255,
      "IdentifySpeedLevel": 66,
      "Position": "CLU",
      "PowerGood": "<=/Scanner_PowerGood.Value"
    },
    "CoolingFan_1_1": {
      "FanId": 1,
      "Slot": 1,
      "FrontPresence": "<=/Fan_1.FrontPresence",
      "RearPresence": "<=/Fan_1.RearPresence",
      "FrontStatus": "<=/Fan_1.FrontStatus",
      "RearStatus": "<=/Fan_1.RearStatus",
      "HardwarePWM": "#/Accessor_Fan1_PWM.Value",
      "MaxSupportedPWM": 255
    },

然后设置HardwarePWM依旧对转速不生效,修改ExpectedPWM生效
image
风扇转速会随着ExpectedPWM变化


但是网页上手动设置PWM不生效

请根据:风扇识别时转速下发,等风扇转速识别后,再在web设置手动模式看看

风扇转速无法识别

说明风扇识别失败,配置存在对应的问题,导致最终转速无法下发。
image
可根据代码判断,当前存在的问题是什么

是.sr文件配置的不对吗

参考: