嵌入式技术
1.概述
本文主要讲述了Linux的backlight驱动框架、实现方法、驱动添加方法和调试方法。
示例Linux内核版本:6.2.8。
2.原理
屏幕背光亮度调节是电子产品的一项基本功能,比如我们使用的手机、平板、电脑等都具有背光亮度调节功能,其中手机、平板还具有自动亮度调节功能,能够通过传感器检测外部环境光亮度,并依此自动调节屏幕亮度,增加用户的视觉舒适度。屏幕背光亮度调节的方法一般包括PWM方式、电压调节方式、电流调节方式和LED数量分组方式等。
Linux内核支持backlight驱动框架,该驱动框架提供了backlight驱动的核心数据类型和函数定义。backlight驱动开发者可以方便地利用该驱动框架提供的数据类型和函数,注册backlight设备,添加各自的backlight驱动程序,并通过sysfs接口调用backlight驱动功能。
3.驱动框架及实现方法
3.1驱动框架源码
backlight驱动框架的主要源码:
./include/linux/backlight.h //backlight驱动框架头文件
./drivers/video/backlight/backlight.c //backlight驱动框架核心代码
3.2驱动框架数据类型定义
(1)结构体struct backlight_ops
表示backlight相关操作。其中,对于特定的backlight驱动,由驱动开发者按需对该结构体的成员变量进行配置和实现。
在./include/linux/backlight.h中定义。
各成员变量定义说明如下。
unsigned int options;
int (*update_status)(struct backlight_device *);
int (*get_brightness)(struct backlight_device *);
int (*check_fb)(struct backlight_device *bd, struct fb_info *info);
(2)结构体struct backlight_properties
表示backlight相关属性。
在./include/linux/backlight.h中定义。
各成员变量定义说明如下。
int brightness;
int max_brightness;
int power;
int fb_blank;
enum backlight_type type;
unsigned int state;
enum backlight_scale scale;
(3)结构体struct backlight_device
表示backlight设备数据。
在./include/linux/backlight.h中定义。
各成员变量定义说明如下。
(4)枚举backlight_type
表示backlight控制类型。
在./include/linux/backlight.h中定义。
(5)枚举backlight_scale
表示亮度值标度类型。
在./include/linux/backlight.h中定义。
3.3驱动框架核心函数
(1)devm_backlight_device_register函数
用于注册一个新的backlight设备。在./drivers/video/backlight/backlight.c中定义。该函数有2个重要参数,一个是ops,表示backlight相关操作,另一个是props,表示backlight相关属性,其数据类型定义形式详见3.2节。函数参数含义如下。
(2)devm_backlight_device_unregister函数
用于注销一个backlight设备。在./drivers/video/backlight/backlight.c中定义。函数参数含义如下。
3.4驱动典型实现方法
(1)概要
backlight驱动源文件位于./drivers/video/backlight路径下,需要驱动开发者添加相应的源文件即可,源文件设计可参考其他厂家的驱动代码。参考原有代码的命名风格,可以将新添加的驱动源文件命名为xx-bl.c;xx-bl.c的2个核心函数为probe和remove函数,可以分别命名为xx_backlight_probe和xx_backlight_remove。
(2)结构体struct backlight_ops的函数成员定义
根据使用功能需求及backlight相关硬件资料,驱动开发者对结构体struct backlight_ops的函数成员进行定义,以用于后续在xx_backlight_probe函数内通过devm_backlight_device_register函数注册backlight设备时使用。
(3)xx_backlight_probe函数定义
xx_backlight_probe函数的实现方法为:
首先对backlight设备对应的结构体struct backlight_ops的函数成员进行配置,并对结构体struct backlight_properties进行初始化配置,然后以结构体struct backlight_ops和struct backlight_properties作为参数,调用backlight驱动框架核心函数devm_backlight_device_register注册一个新的backlight设备。
(4)xx_backlight_remove函数定义
xx_backlight_remove函数的实现方法为:
调用backlight驱动框架核心函数devm_backlight_device_unregister注销一个backlight设备。
4.驱动添加方法
4.1添加驱动源文件
按3.4节所述方法,编写驱动源文件xx-bl.c,添加到./drivers/video/backlight路径下。实际上,Linux内核已经集成了种类丰富的backlight硬件驱动,极大减轻了驱动工程师的工作量,若芯片使用的backlight硬件恰好已经被Linux内核支持,则留给驱动工程师的工作仅为在设备树添加相应的节点即可。下文4.3节将以Linux内核已有的pwm_bl.c驱动为例,介绍相应设备树节点的设计方法。
4.2添加编译支持
(1)修改./drivers/video/backlight路径下的Kconfig文件,添加backlight驱动配置选项。
(2)修改./drivers/video/backlight路径下的Makefile文件,添加xx-bl.c的编译选项。
(3)在memuconfig界面,使能所添加的backlight驱动。
配置界面示例如下。
4.3添加backlight设备树节点
以Generic PWM based Backlight Driver为例,其驱动源码为pwm_bl.c,添加相应的pwm-backlight设备树节点。该节点的基本属性包括兼容性、信号选择pwms、brightness-levels和default-brightness-level,其他属性按需添加。
pwm-backlight设备树设计方法可参考如下文档:
./Documentation/devicetree/bindings/leds/backlight/pwm-backlight.yaml
下面是从参考文档中选取的pwm-backlight设备树节点的示例。
5.调试方法
使用sysfs接口对backlight驱动进行功能调试,主要调试命令示例如下。
(1)查看backlight设备节点
ls /sys/class/backlight/backlight/
(2)查看backlight最大亮度等级
cat /sys/class/backlight/backlight/max_brightness
(3)设置backlight亮度等级
echo 64 > /sys/class/backlight/backlight/brightness
(4)查看backlight当前亮度等级
cat /sys/class/backlight/backlight/actual_brightness
全部0条评论
快来发表一下你的评论吧 !