Linux之PWM背光驱动
Linux之PWM背光驱动
概述
- Platform: RK3588/RK356X
- OS: Linux
- Kernel: v5.10
通过PWM调光的背光一般我们使用的是通用的PWM背光驱动,调用pwm的接口,实现对pwm占空比的调整,从而实现对背光亮度的控制
代码
DTS
常见的dts配置如下:
backlight: backlight {
compatible = "pwm-backlight";
pwms = <&pwm4 0 25000 0>;
brightness-levels = <
0 20 20 21 21 22 22 23
23 24 24 25 25 26 26 27
...
240 241 242 243 244 245 246 247
248 249 250 251 252 253 254 255
>;
default-brightness-level = <200>;
};
简单说明:
pwms
:背光调节所使用的PWM,25000为PWM的周期(单位为ns),最后一个参数为pwm的极性,PWM_POLARITY_NORMAL
(0)或PWM_POLARITY_INVERTED
,若为PWM_POLARITY_INVERTED
则极性翻转,占空比代表负向(低电平)占空比brightness-levels
:背光亮度级别数组。数组第一个代表最低亮度值,最后一个代表最大亮度值,实际亮度水平(PWM占空比)将根据这些值进行计算,值越大,占空比越大,实际PWM占空比是越大背光越亮还是越暗,与对应的硬件有关default-brightness-level
:默认的背光等级num-interpolation-steps
:这里未使用,亮度级别表中每个值之间的插值步长。这样,可以使用高分辨率pwm占空比,而无需列出亮度级别表中的每个值
代码分析
核心驱动代码:drivers/video/backlight/pwm_bl.c
PWM背光驱动主要就是结合了backlight
驱动和pwm
驱动,具体代码细节就不细说了,大致包括如下几点:
解析DTS相关节点配置,如上一节的说明,包括pwm、使能引脚、电源、背光等级等
初始化PWM,并更新其状态
注册背光设备,并更新背光状态,并提供相应的背光状态更新接口
在更新背光状态时,
compute_duty_cycle()
函数会根据背光亮度级别计算出PWM相应的占空比,再pwm_apply_state()
更新pwm输出
测试
如果驱动及配置一切正常,会生成/sys/class/backlight/backlight
节点,内容类似如下:
actual_brightness brightness max_brightness scale type
bl_power device power subsystem uevent
其中主要的几个参数:
actual_brightness
和brightness
:两者正常情况下是相同的,都是当前的亮度,范围为0~max_brightness之间- max_brightness:顾名思义,最大亮度
- bl_power: 背光电源状态 0:打开, 4:关闭
- scale:表示背光等级是线性还是非线性
相关操作
调节背光:
echo 128 > /sys/class/backlight/backlight/brightness + 开关背光 ```shell echo 0(打开) or 4(关闭) > /sys/class/backlight/backlight/bl_power
获取最大亮度
cat /sys/class/backlight/backlight/max_brightness