zoukankan      html  css  js  c++  java
  • MSM8909平台 LED背光的控制

    之前齐师兄问我,是不是应该有一个文件记录背光灯的亮度,我说理论上有,但是在哪里我真的还没有见过。只知道在调LCD驱动的时候会调用一个背光控制的函数,传进来一个亮度值就可以配置亮度了,至于这个函数是谁调用的,以及和上层是怎么联系的,自己一直没想过,最近系统的看了一下,特作此总结。

    路径:root/andriod/kernel/drivers/video/

    在Mdss_dsi_panel.c文件里,有一个背光控制函数static void mdss_dsi_panel_bl_ctrl(struct mdss_panel_data *pdata,u32 bl_level)

    背光的亮度就是根据这个参数值bl_level进行调节的。

    首先看看谁调用的这个函数:

    在mdss_dsi_panel_init()函数里,有这么一句ctrl_pdata->panel_data.set_backlight =mdss_dsi_panel_bl_ctrl;

    然后看看panel_data.set_backlight是在哪里调用的。

    用搜索功能排除万难后发现,在Mdss_fb.c()文件里有函数

    void mdss_fb_set_backlight(struct msm_fb_data_type *mfd, u32 bkl_lvl){

    …… ……;

    pdata->set_backlight(pdata, temp);//其中pdata就是从mdss_dsi_panel.c那传过来的结构体。

    …… ……;

    }

    继续找函数调用的地方:

    static void mdss_fb_set_bl_brightness(struct led_classdev *led_cdev, enum led_brightness value)
    {
    …… ……;
    mdss_fb_set_backlight(mfd, bl_lvl);
    …… ……;
    }
    继续

    static struct led_classdev backlight_led = {
    .name           = "lcd-backlight",
    .brightness     = MDSS_MAX_BL_BRIGHTNESS,
    .brightness_set = mdss_fb_set_bl_brightness,
    .max_brightness = MDSS_MAX_BL_BRIGHTNESS,
    };

    可以看到,这个mdss_fb_set_bl_brightness()函数又是某个结构体的回调函数。那么我们来看看这个结构体是在哪里定义,以及其中的britness_set函数是在哪里调用的。

    继续条件搜索,排除无关文件,可以定位到:

    路径:root/android/kernel/drivers/leds/Led-class.c

    在这个文件里这样一些关于设备文件的操作:

    static ssize_t led_brightness_show(struct device *dev,struct device_attribute *attr, char *buf)
    {
    struct led_classdev *led_cdev = dev_get_drvdata(dev);
    return snprintf(buf, LED_BUFF_SIZE, "%u ", led_cdev->brightness);
    }


    static ssize_t led_brightness_store(struct device *dev,struct device_attribute *attr, const char *buf, size_t size)
    {
    struct led_classdev *led_cdev = dev_get_drvdata(dev);
    …… ……;
    __led_set_brightness(led_cdev, state);
    return size;
    }
      

    继续看__led_set_brightness()函数的定义:

    static inline void__led_set_brightness(struct led_classdev *led_cdev,enum led_brightness value)
    {
    if (value > led_cdev->max_brightness)
    value = led_cdev->max_brightness;
    led_cdev->brightness = value;
    if (!(led_cdev->flags & LED_SUSPENDED))
    led_cdev->brightness_set(led_cdev, value);
    }

    最后就是设备文件操作的调用了:

    __ATTR(brightness, 0644,led_brightness_show, led_brightness_store)

    至此,所有的谜团都解开了。

          当上层应用修改亮度时(比如用手指化冻亮度调节的进度条),亮度的数值会存到一个名为“brightness”的文件里,并且这时候底层会调用led_brightness_store()函数把当前亮度值存到led_cdev->brightness变量里,且调用配置好的背光调节函数来修改背光。

      当上层函数想要获取当前背光时,就会调用led_brightness_show()函数,此时底层就会把当前驱动里的背光亮度值返回

  • 相关阅读:
    shmget() 建立共享内存
    [转]SQL2005 连接问题处理
    [转]工作以后十不要,自勉
    C#学习笔记
    一位软件工程师6年总结(转)
    时间相关处理
    Litter Tips
    [转] VS打开解决方案时报错的处理方法
    面向对象—设计模式
    SQL Server 2000中的错误
  • 原文地址:https://www.cnblogs.com/LoongEmbedded/p/5298211.html
Copyright © 2011-2022 走看看