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驱动,具体代码细节就不细说了,大致包括如下几点:

  1. 解析DTS相关节点配置,如上一节的说明,包括pwm、使能引脚、电源、背光等级等

  2. 初始化PWM,并更新其状态

  3. 注册背光设备,并更新背光状态,并提供相应的背光状态更新接口

  4. 在更新背光状态时,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_brightnessbrightness:两者正常情况下是相同的,都是当前的亮度,范围为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