Linux的backlight驱动框架和调试方法

嵌入式技术

1368人已加入

描述

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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分