风扇转速不稳定问题分析
更新时间: 2026/05/31
在Gitcode上查看源码问题背景
- 单板类型:自研板;
- 软件版本:OpenUBMC 25.12+ 高可用;
- 涉及功能:风扇,SMC,CPLD;
- 触发条件:配置风扇及相关调速策略,查看风扇转速,参与调速的温度是稳定的,风扇转速不稳定:
- 业务表现:预期风扇转速稳定;实际风扇的FanType未识别到,风扇HardwarePWM忽大忽小,几秒钟变化一次;
问题复现步骤
- 风扇调速策略以进风口温度传感器为基础进行适配;
- 风扇配置按照风扇/风扇板适配指南进行配置;
- 出包升级后,查看风扇页面的风扇状态及风扇转速是否稳定;
关键日志信息
app.log日志信息: cooling_control.log日志在设备启动后只有一次输出: 组件日志中PWM设置生效的PWM是稳定的:
定位过程
- 尝试修改自动手动调速模式现象依旧;删除所有CoolingArea后现象依旧;Fan对象的RearSpeed、FrontSpeed可以读到值,SMC命令字使用正常,但是日志有报错;cooling_control.log 日志在设备启动后只有一次输出,持续下发稳定的PWM值(80),但 HardwarePWM实际值不稳定等多种现象说明控制链路中间环节可能存在问题;
- 尝试在fan_service:set_fans_pwm(l_pwm),fan_service:set_fan_pwm(system_id, fan_id, pwm_percent)、fan_obj_manager:set_pwm(pwm_percent)这三个函数加调试日志,打印下下发转速,是由哪里导致的风扇转速变化;日志级别用notice;
- 在fan_obj_manager:set_pwm和fan_obj_manager:set_fan_hardware_pwm加的notice日志都没有打印,猜测是风扇型号一直未识别到,fan_service:set_fans_pwm中无法调到fan_obj:set_fan_hardware_pwm进行PWM生效。尝试使用tracechip查看SMC对象又能够看到大量的PWM设置操作。cooling组件的debug日志如下:
- 代码上看fan_service:set_fans_pwm会尝试走的批量接口下发,风扇识别会走fan_obj_manager:set_pwm(pwm_percent),需要确认是不是这两处导致的转速变化;打开notice日志,用不限频的打印的方式收集日志; 代码日志截图: 收集日志: 从日志上看:CSR没有定义fans对象,没走批量接口;风扇型号未识别,单个风扇设置未执行;
- adapter下风扇接口加打印,确定下是否是thermal组件进行的pwm设置操作,是否还有其他地方在进行转速设置; 日志上看adapter的日志在BMC刚启动的时候打印了一次,且因为self:configurable判断没有真正生效,运行过程中没有持续的PWM设置日志,而且从日志上看fan_obj_manager:start只有入口的日志输出了,后续日志都没有;
- start的712、714中间用pcall加上,确认有没有崩,或者错误打印; pcall未捕捉到异常,屏蔽self.ExpectedPWM = self.HardwarePWM后可以继续后续流程,在fan_obj_manager:set_pwm执行self.Fan.methods.SetFanHardwarePWM时又阻塞了:
- 确认是不是这个监听回调里卡着了,确认使用组件版本,是否有加其他的变更回调。并且尝试用手动方式调用csr配置的chip接口读写风扇转速确认是否能正常读写; 监听代码: 组件版本thermal_mgmt/1.71.0@openubmc/stable,HardwarePWM监听可以正常触发,没有新增其它监听,日志如下: 手动读写正常:
- 确认当前风扇相关的SMC命令字是块读还是位读等; 当前BMC侧和CPLD侧都是块读;将BMC侧和CPLD侧的风扇的一些命令字从BlockIO修改为BitIO,具体修改风扇在位,占空比相关命令字;
问题原因
CPLD只支持块读,块读无法获取风扇在位状态以及设置风扇占空比等信息,导致日志中报错风扇属性更新失败。相关配置错误代码如下:
解决方案
将风扇的在位状态查询及风扇占空比设置块读改为位读即可,代码修改如下: 代码修改完成后,重新出包,升级,查看风扇转速是否稳定即可。