​Linux 外设屏幕背光介绍

文摘   科技   2023-11-27 19:01   广东  

点击上方蓝字关注我们

根据之前章节提到屏幕介绍,触摸屏介绍,本章节主要介绍Linux 外设中屏幕背光的调整相关知识。回顾:

Linux Touch Screen (触摸屏)介绍
Linux MIPI DSI显示屏介绍

1. 屏幕背光来源

提到屏幕背光,首先先了解下屏幕相关知识;这里主要展示显示屏LCD(液晶显示)OLED(有机发光二极管显示)这两种主要屏幕技术。
LCD 使用了非常久的一个设计技术,LCD的发光原理主要依靠背光源,在图中1.1 LCD的背光完全依然最底下层,显示的颜色也只有一种就是白色。,光线从背光板发出,透过滤光片,即可让每个像素点显示红绿蓝三基色,通过调节三基色比例以显示出不同的色彩。OLED从图1.1看出并没有背光源,它主要自发光,有一层叫做自发光层。

图 1.1 LCD & OLED

这两种简要屏幕对比

特性LCDOLED
背光源需要背光源无需背光源
对比度一般较低
亮度受限于背光源
颜色饱和度良好卓越
响应时间一般卓越
视角有限广泛
厚度相对较厚较薄
寿命一般有潜力更短(燃尽问题)
制造成本通常较低相对较高
用途适用于大型显示器和电视适用于各种尺寸和形状

根据这两种屏幕使用的技术不一样,对背光调整也不一样了总结下来:

  • 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 驱动程序和接口

屏幕背光驱动PWM方式可以采用pwm_bl + backlight的方式,实现屏幕的PWM背光调节,背光电源的控制。
backlight驱动框架的主要源码:
./drivers/video/backlight/pwm_bl.c./drivers/video/backlight/backlight.c
举例backlight设备树的节点:
        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/ -lhtotal 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 brightnesslrwxrwxrwx 1 root root    0 Jan  1 00:00 device -> ../../../platform-r--r--r-- 1 root root 4.0K Jan  1 00:00 max_brightnessdrwxr-xr-x 2 root root    0 Jan  1 00:00 powerlrwxrwxrwx 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
通过写/sys文件控制背光,向
/sys/devices/platform/backlight/lvds_backlight1/brightness 
写入数字,
数字的大小根据
/sys/devices/platform/backlight/lvds_backlight1/max_brightness 
后按比例写数;
还可以通过工具xrandr进行设置:
xrandr --output eDP-1 --brightness 0.5
xrandr 是一个扩展工具,可以去配置屏幕的显示大小,方向,镜像,屏幕亮度等等,如果没有该工具,需要进行移植。不过在驱动方面估计还是调用sys相关文件操作。

5. 结语

本文主要简单介绍屏幕背光通用的调光模式,还有一些通过I2C/SPI等方式控制屏幕的芯片进行调光,类似发送特定命令,调光的事情交给屏幕上的小MCU操作。
期文章:
Linux 嵌入式外设屏接口介绍
Linux MIPI DSI显示屏介绍
Linux Touch Screen (触摸屏)介绍
Linux 图形子系统
Linux 图形子系统_DRI介绍
Linux 图形子系统_DRM/KMS介绍

...

有兴趣加入嵌入式软件交流群

码思途远
一位码农的日常分享,探索软件技术知识与新闻的数字十字路口。