我是靠谱客的博主 单纯柚子,最近开发中收集的这篇文章主要介绍背光子系统分析笔记(以RK3288-Android7.1 Linux 4.4为例),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

当调节设置->显示->亮度时,或者echo xxxx >/sys/class/backlight/backlight/brightness LCD亮度能随着变化,这是怎么实现的呢?
参考:https://blog.csdn.net/weixin_41028621/article/details/103542751
本文记录下分析过程,
设置应用java层操作brightness节点过程,暂不详说,希望能人志士补充.本文重点说驱动层.

brightness节点的生成驱动:kernel/drivers/video/backlight/backlight.c
static int __init backlight_class_init(void)
{
backlight_class = class_create(THIS_MODULE, “backlight”);
backlight_class->dev_groups = bl_device_groups;

}
其中对dev_groups赋值为bl_device_groups,dev_groups是设备的以组 为单位的默认属性,当该设备被添加到内核的时候,会自动添加该默认属性,赋值格式为:设备_groups,因此这里的设备就是bl_device,

接下来必然是为这个组设备指定属性:
static struct attribute *bl_device_attrs[] = {
&dev_attr_bl_power.attr,
&dev_attr_brightness.attr,
&dev_attr_actual_brightness.attr,
&dev_attr_max_brightness.attr,
&dev_attr_type.attr,
NULL,
};
ATTRIBUTE_GROUPS(bl_device);
为/sys/class/backlight/backlight这个设备设备(可以看作为backlight总线)声明了bl_power,brightness,actual_brightness,max_brightness,type这几个属性节点.
这几个节点即/sys/class/backlight/backlight/下的节点.
AT5:/sys/class/backlight/backlight # ls
actual_brightness brightness max_brightness subsystem uevent bl_power device power type
再然后,为每一个属性,定义自己的show和store回调方法,以brightness为例

static ssize_t brightness_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct backlight_device *bd = to_backlight_device(dev);

return sprintf(buf, "%dn", bd->props.brightness);

}

static ssize_t brightness_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count)
{
int rc;
struct backlight_device *bd = to_backlight_device(dev);
unsigned long brightness;
rc = kstrtoul(buf, 0, &brightness);
if (rc)
return rc;
rc = backlight_device_set_brightness(bd, brightness);
return rc ? rc : count;
}
static DEVICE_ATTR_RW(brightness);

DEVICE_ATTR_RW是再DEVICE_ATTR的基础上加了RW,区别与RO,WO,表示可读可写.

echo或者设置java操作brightness节点的时候,会把brightness值传下来,出发这个回调函数执行,然后通告backlight_device_set_brightness()操作具体的硬件控制模块设置背光.这个函数会通过notify,调用时间通知notify注册的回调函数fb_notifier_callback,然后通过backlight_update_status调用具体的硬件驱动的update_status(比如pwm_bl.c里面的pwm_backlight_update_status,这个文件对应于dts中backlight这个硬件驱动)函数更新背光设置.

最后

以上就是单纯柚子为你收集整理的背光子系统分析笔记(以RK3288-Android7.1 Linux 4.4为例)的全部内容,希望文章能够帮你解决背光子系统分析笔记(以RK3288-Android7.1 Linux 4.4为例)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部