rk3588 pwm-fan风扇调试:
参考文档:
http://www.taodudu.cc/news/show-2282037.html?action=onClick Rockchip平台cpu散热风扇随温度自动调速的配置方法
http://www.coloradmin.cn/o/576106.html?action=onClick rk3568适配温控风扇
https://www.kernel.org/doc/html/latest/driver-api/pwm.html
https://zhuanlan.zhihu.com/p/651211513 【linux kernel】一文总结linux内核通知链
rockchip 在drivers/hwmon/pwm-fan.c驱动中添加了rockchip,temp-trips设备树属性,用于支持根据cpu温度调节风扇风速。
方法是:delayed_work每200毫秒调用thermal_zone_get_temp获取温度,通知notifier通知链上的观察者。
pwm-fan.c中注册成为nofitier通知链上的观察者。
根据设备原理图配置设备树。
/ {
pwm_fan: pwm-fan {
compatible = "pwm-fan";
#cooling-cells = <2>;
pwms = <&pwm10 0 50000 0>;
cooling-levels = <0 50 100 150 200 255>;
// 注意:如下cooling-levels配置会导致风扇一会儿开启,一会儿关闭
// 原因是:风扇调节过于猛烈,需要根据整机情况进行调优
//cooling-levels = <0 150 200 225 240 255>;
rockchip,temp-trips = <
50000 1
55000 2
60000 3
65000 4
70000 5
>;
};
};
&pwm10 {
pinctrl-0 = <&pwm10m0_pins>;
status = "okay";
};
调试方法:
1,每隔几秒打印cpu温度
while true; do adb shell “cat /sys/class/thermal/thermal_zone*/temp” | tee -a pwm_fan.txt;echo “######$(date)######” | tee -a pwm_fan.txt;sleep 5; done
2,运行耗时的视频App
3,当cpu温度升高时,观察到风扇启动了,并随cpu温度的升高,风扇的风速也越快了。
kernel层调试pwm:
cat /sys/kernel/debug/pwm
cat /sys/kernel/debug/pwm
对应的代码 /drivers/pwm/core.c
platform/febe0020.pwm, 1 PWM device
pwm-0 (pwm-fan ): requested period: 50000 ns duty: 0ns polaity: normal
当cpu温度升高,fan工作时:
pwm-0 (pwm-fan ): requested enabled period: 50000 ns duty: 9804ns polaity: normal
sysfs调试pwm:
遇到的问题:
echo 0 > /sys/class/pwm/pwmchip0/export 失效,没有导出来。
sysfs调试pwm:
echo 0 > /sys/class/pwm/pwmchip0/export
**遇到的问题:**
cd /sys/class/pwm/pwmchip0/
echo 0 >export 执行该操作后,pwm0没有导出来。
原因是:
cat /sys/kernel/debug/pwm 显示的是 requested,会并返回-EBUSY,所以导不出来,是正常现象。
当不是requested时会,正常导出来。
pwm-0 (pwm-fan ): requested period: 50000 ns duty: 0ns polaity: normal
sysfs手动调节pwm
如下内容参考文档:https://blog.csdn.net/weixin_44244400/article/details/131558493 RK3588 PWM调试记录—linux pwm子系统驱动框架
如上分析,如果想通过sysfs手动调节pwm的话,需要把设备树pwm_fan节点注释掉,
同时把pwm10的状态由disabled改为okay。
/ {
// 注释掉pwm-fan设备树节点,通过sysfs手动调节pwm
// pwm_fan: pwm-fan {
// compatible = "pwm-fan";
// #cooling-cells = <2>;
// pwms = <&pwm10 0 50000 0>;
// cooling-levels = <0 50 100 150 200 255>;
//
//
// rockchip,temp-trips = <
// 50000 1
// 55000 2
// 60000 3
// 65000 4
// 70000 5
// >;
// };
};
&pwm10 {
pinctrl-0 = <&pwm10m0_pins>;
status = "okay";
};
设备树中的pwm10的状态由disabled改为okay,
那么我们可以在/sys/class/pwm/pwmchi0目录将pwm0导出。
polarity可以赋值为: normal 或 inversed
例子1:
# cat /d/pwm
# cd /sys/class/pwm/pwmchi0
# echo 0 > export
# cd pwm0/
# echo normal > polarity
# echo 10000 > period
# echo 5000 > duty_cycle
# echo 1 > enable
# ls
capture duty_cycle enable output_type period polarity power uevent
上面的指令设置了周期10000,占空比50%,极性为normal的pwm输出。
例子2:
# echo normal > polarity
# echo 50000 > period
# echo 0 > duty_cycle // 占空比为0% // 风扇停止运行
# echo 50000 > duty_cycle // 占空比为100% // 风扇最高转速运行
例子3:
# echo inversed > polarity
# echo 50000 > period
# echo 0 > duty_cycle // 占空比为100% // 风扇最高转速运行
# echo 50000 > duty_cycle // 占空比为0% // 风扇停止运行