如何配置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 使新配置生效。
点击此处查看详细分析解答

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

根据您描述的问题:在配置了 CoolingConfigAirCoolingConfig 后仍无法实现手动控制风扇转速,且设置的 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 检查 HardwarePWMExpectedPWM

# 查看当前硬件 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.logcooling_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文件配置的不对吗

参考: