1.概述
本文主要講述了Linux的backlight驅(qū)動(dòng)框架、實(shí)現(xiàn)方法、驅(qū)動(dòng)添加方法和調(diào)試方法。
示例Linux內(nèi)核版本:6.2.8。
2.原理
屏幕背光亮度調(diào)節(jié)是電子產(chǎn)品的一項(xiàng)基本功能,比如我們使用的手機(jī)、平板、電腦等都具有背光亮度調(diào)節(jié)功能,其中手機(jī)、平板還具有自動(dòng)亮度調(diào)節(jié)功能,能夠通過(guò)傳感器檢測(cè)外部環(huán)境光亮度,并依此自動(dòng)調(diào)節(jié)屏幕亮度,增加用戶的視覺(jué)舒適度。屏幕背光亮度調(diào)節(jié)的方法一般包括PWM方式、電壓調(diào)節(jié)方式、電流調(diào)節(jié)方式和LED數(shù)量分組方式等。
Linux內(nèi)核支持backlight驅(qū)動(dòng)框架,該驅(qū)動(dòng)框架提供了backlight驅(qū)動(dòng)的核心數(shù)據(jù)類型和函數(shù)定義。backlight驅(qū)動(dòng)開發(fā)者可以方便地利用該驅(qū)動(dòng)框架提供的數(shù)據(jù)類型和函數(shù),注冊(cè)backlight設(shè)備,添加各自的backlight驅(qū)動(dòng)程序,并通過(guò)sysfs接口調(diào)用backlight驅(qū)動(dòng)功能。
3.驅(qū)動(dòng)框架及實(shí)現(xiàn)方法
3.1驅(qū)動(dòng)框架源碼
backlight驅(qū)動(dòng)框架的主要源碼:
./include/linux/backlight.h //backlight驅(qū)動(dòng)框架頭文件
./drivers/video/backlight/backlight.c //backlight驅(qū)動(dòng)框架核心代碼
3.2驅(qū)動(dòng)框架數(shù)據(jù)類型定義
(1)結(jié)構(gòu)體struct backlight_ops
表示backlight相關(guān)操作。其中,對(duì)于特定的backlight驅(qū)動(dòng),由驅(qū)動(dòng)開發(fā)者按需對(duì)該結(jié)構(gòu)體的成員變量進(jìn)行配置和實(shí)現(xiàn)。
在./include/linux/backlight.h中定義。
各成員變量定義說(shuō)明如下。
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)結(jié)構(gòu)體struct backlight_properties
表示backlight相關(guān)屬性。
在./include/linux/backlight.h中定義。
各成員變量定義說(shuō)明如下。
int brightness;
int max_brightness;
int power;
int fb_blank;
enum backlight_type type;
unsigned int state;
enum backlight_scale scale;
(3)結(jié)構(gòu)體struct backlight_device
表示backlight設(shè)備數(shù)據(jù)。
在./include/linux/backlight.h中定義。
各成員變量定義說(shuō)明如下。
(4)枚舉backlight_type
表示backlight控制類型。
在./include/linux/backlight.h中定義。
(5)枚舉backlight_scale
表示亮度值標(biāo)度類型。
在./include/linux/backlight.h中定義。
3.3驅(qū)動(dòng)框架核心函數(shù)
(1)devm_backlight_device_register函數(shù)
用于注冊(cè)一個(gè)新的backlight設(shè)備。在./drivers/video/backlight/backlight.c中定義。該函數(shù)有2個(gè)重要參數(shù),一個(gè)是ops,表示backlight相關(guān)操作,另一個(gè)是props,表示backlight相關(guān)屬性,其數(shù)據(jù)類型定義形式詳見(jiàn)3.2節(jié)。函數(shù)參數(shù)含義如下。
(2)devm_backlight_device_unregister函數(shù)
用于注銷一個(gè)backlight設(shè)備。在./drivers/video/backlight/backlight.c中定義。函數(shù)參數(shù)含義如下。
3.4驅(qū)動(dòng)典型實(shí)現(xiàn)方法
(1)概要
backlight驅(qū)動(dòng)源文件位于./drivers/video/backlight路徑下,需要驅(qū)動(dòng)開發(fā)者添加相應(yīng)的源文件即可,源文件設(shè)計(jì)可參考其他廠家的驅(qū)動(dòng)代碼。參考原有代碼的命名風(fēng)格,可以將新添加的驅(qū)動(dòng)源文件命名為xx-bl.c;xx-bl.c的2個(gè)核心函數(shù)為probe和remove函數(shù),可以分別命名為xx_backlight_probe和xx_backlight_remove。
(2)結(jié)構(gòu)體struct backlight_ops的函數(shù)成員定義
根據(jù)使用功能需求及backlight相關(guān)硬件資料,驅(qū)動(dòng)開發(fā)者對(duì)結(jié)構(gòu)體struct backlight_ops的函數(shù)成員進(jìn)行定義,以用于后續(xù)在xx_backlight_probe函數(shù)內(nèi)通過(guò)devm_backlight_device_register函數(shù)注冊(cè)backlight設(shè)備時(shí)使用。
(3)xx_backlight_probe函數(shù)定義
xx_backlight_probe函數(shù)的實(shí)現(xiàn)方法為:
首先對(duì)backlight設(shè)備對(duì)應(yīng)的結(jié)構(gòu)體struct backlight_ops的函數(shù)成員進(jìn)行配置,并對(duì)結(jié)構(gòu)體struct backlight_properties進(jìn)行初始化配置,然后以結(jié)構(gòu)體struct backlight_ops和struct backlight_properties作為參數(shù),調(diào)用backlight驅(qū)動(dòng)框架核心函數(shù)devm_backlight_device_register注冊(cè)一個(gè)新的backlight設(shè)備。
(4)xx_backlight_remove函數(shù)定義
xx_backlight_remove函數(shù)的實(shí)現(xiàn)方法為:
調(diào)用backlight驅(qū)動(dòng)框架核心函數(shù)devm_backlight_device_unregister注銷一個(gè)backlight設(shè)備。
4.驅(qū)動(dòng)添加方法
4.1添加驅(qū)動(dòng)源文件
按3.4節(jié)所述方法,編寫驅(qū)動(dòng)源文件xx-bl.c,添加到./drivers/video/backlight路徑下。實(shí)際上,Linux內(nèi)核已經(jīng)集成了種類豐富的backlight硬件驅(qū)動(dòng),極大減輕了驅(qū)動(dòng)工程師的工作量,若芯片使用的backlight硬件恰好已經(jīng)被Linux內(nèi)核支持,則留給驅(qū)動(dòng)工程師的工作僅為在設(shè)備樹添加相應(yīng)的節(jié)點(diǎn)即可。下文4.3節(jié)將以Linux內(nèi)核已有的pwm_bl.c驅(qū)動(dòng)為例,介紹相應(yīng)設(shè)備樹節(jié)點(diǎn)的設(shè)計(jì)方法。
4.2添加編譯支持
(1)修改./drivers/video/backlight路徑下的Kconfig文件,添加backlight驅(qū)動(dòng)配置選項(xiàng)。
(2)修改./drivers/video/backlight路徑下的Makefile文件,添加xx-bl.c的編譯選項(xiàng)。
(3)在memuconfig界面,使能所添加的backlight驅(qū)動(dòng)。
配置界面示例如下。
4.3添加backlight設(shè)備樹節(jié)點(diǎn)
以Generic PWM based Backlight Driver為例,其驅(qū)動(dòng)源碼為pwm_bl.c,添加相應(yīng)的pwm-backlight設(shè)備樹節(jié)點(diǎn)。該節(jié)點(diǎn)的基本屬性包括兼容性、信號(hào)選擇pwms、brightness-levels和default-brightness-level,其他屬性按需添加。
pwm-backlight設(shè)備樹設(shè)計(jì)方法可參考如下文檔:
./Documentation/devicetree/bindings/leds/backlight/pwm-backlight.yaml
下面是從參考文檔中選取的pwm-backlight設(shè)備樹節(jié)點(diǎn)的示例。
5.調(diào)試方法
使用sysfs接口對(duì)backlight驅(qū)動(dòng)進(jìn)行功能調(diào)試,主要調(diào)試命令示例如下。
(1)查看backlight設(shè)備節(jié)點(diǎn)
ls /sys/class/backlight/backlight/
(2)查看backlight最大亮度等級(jí)
cat /sys/class/backlight/backlight/max_brightness
(3)設(shè)置backlight亮度等級(jí)
echo 64 > /sys/class/backlight/backlight/brightness
(4)查看backlight當(dāng)前亮度等級(jí)
cat /sys/class/backlight/backlight/actual_brightness
評(píng)論
查看更多