点击上方蓝字关注我们
点击上方蓝字关注我们
根据之前章节提到屏幕介绍,触摸屏介绍,本章节主要介绍Linux 外设中屏幕背光的调整相关知识。回顾:
1. 屏幕背光来源
图 1.1 LCD & OLED
这两种简要屏幕对比
特性 | LCD | OLED |
---|---|---|
背光源 | 需要背光源 | 无需背光源 |
对比度 | 一般较低 | 高 |
亮度 | 受限于背光源 | 高 |
颜色饱和度 | 良好 | 卓越 |
响应时间 | 一般 | 卓越 |
视角 | 有限 | 广泛 |
厚度 | 相对较厚 | 较薄 |
寿命 | 一般 | 有潜力更短(燃尽问题) |
制造成本 | 通常较低 | 相对较高 |
用途 | 适用于大型显示器和电视 | 适用于各种尺寸和形状 |
根据这两种屏幕使用的技术不一样,对背光调整也不一样了总结下来:
LCD背光: 大多数现代显示屏使用背光源。全阵列LED均匀地分布在整个屏幕后面,而边缘LED位于显示屏的边缘。 OLED背光: OLED(有机发光二极管)屏幕不需要背光,因为每个像素都是自发光的。
2. 背光调光技术
2.1 PWM 调光
通过脉冲宽度调制(PWM)调整LED的亮度。这是一种常见的数字调光方法,通过改变高电平的时间比例来调整亮度。图2.1 PWM调光,主要通过控制PWM的占空比进行控制。
图2.1 PWM 调光
2.2 DC调光
DC调光的原理非常简单,就是通过提高或降低电路功率来改变屏幕的亮度。功率 = 电压 x 电流,所以改变电压或电流都能改变屏幕亮度。大多数是通过改变电压的方式,我们在示波器上可以看到一条直线,占空比100%。
注意:屏幕背光调光技术与屏幕的类型没有直接关系,不是说LCD是DC调光,OLED是PWM调光。
3. Linux 驱动程序和接口
./drivers/video/backlight/pwm_bl.c
./drivers/video/backlight/backlight.c
lvds_backlight1: lvds_backlight@1 {
compatible = "pwm-backlight";
pwms = <&pwm_lvds1 0 100000 0>;
brightness-levels = < 0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59
60 61 62 63 64 65 66 67 68 69
70 71 72 73 74 75 76 77 78 79
80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95 96 97 98 99
100>;
default-brightness-level = <80>;
};
从设备树中比较简单到:
pwms = <&pwm_lvds1 0 100000 0>;
&pwm_lvds1
: 这表示 PWM 控制器的引用
100000
: 这是 PWM 的频率设置,以赫兹(Hz)为单位。它表示 PWM 脉冲的频率为 100,000 Hz。频率决定了脉冲的重复速率。
0
: 这是 PWM 的占空比设置。占空比表示 PWM 信号中高电平(脉冲)占总周期的比例。在这里,占空比为 0%,即脉冲宽度为零,表示 PWM 信号一直为低电平;
brightness-levels
表示可用的亮度级别,按照从 0 到 100 的顺序列出。
vim ./drivers/video/backlight/pwm_bl.c
static const struct dev_pm_ops pwm_backlight_pm_ops = {
#ifdef CONFIG_PM_SLEEP
.suspend = pwm_backlight_suspend,
.resume = pwm_backlight_resume,
.poweroff = pwm_backlight_suspend,
.restore = pwm_backlight_resume,
#endif
};
static struct platform_driver pwm_backlight_driver = {
.driver = {
.name = "pwm-backlight",
.pm = &pwm_backlight_pm_ops,
.of_match_table = of_match_ptr(pwm_backlight_of_match),
},
.probe = pwm_backlight_probe,
.remove = pwm_backlight_remove,
.shutdown = pwm_backlight_shutdown,
};
pwm_backlight_probe
代码未贴,讨论主要工作pwm_backlight_parse_dt
//解析设备树pwm_bl_data
//初始化结构backlight_device_register
//注册PWM背光设备backlight_update_status
//更新设备状态4. Linux 下用户空间控制
根据驱动提供的sys文件操作:
root:~# ls /sys/devices/platform/backlight/lvds_backlight1/ -lh
total 0
-r--r--r-- 1 root root 4.0K Jan 1 00:00 actual_brightness
-rw-r--r-- 1 root root 4.0K Jan 1 00:00 bl_power
-rw-r--r-- 1 root root 4.0K Jan 1 00:00 brightness
lrwxrwxrwx 1 root root 0 Jan 1 00:00 device -> ../../../platform
-r--r--r-- 1 root root 4.0K Jan 1 00:00 max_brightness
drwxr-xr-x 2 root root 0 Jan 1 00:00 power
lrwxrwxrwx 1 root root 0 Jan 1 00:00 subsystem -> ../../../../class/backlight
-r--r--r-- 1 root root 4.0K Jan 1 00:00 type
-rw-r--r-- 1 root root 4.0K Jan 1 00:00 uevent
5. 结语
有兴趣加入嵌入式软件交流群