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()函数,此时底层就会把当前驱动里的背光亮度值返回

  • 相关阅读:
    LeetCode 1245. Tree Diameter
    LeetCode 1152. Analyze User Website Visit Pattern
    LeetCode 1223. Dice Roll Simulation
    LeetCode 912. Sort an Array
    LeetCode 993. Cousins in Binary Tree
    LeetCode 1047. Remove All Adjacent Duplicates In String
    LeetCode 390. Elimination Game
    LeetCode 1209. Remove All Adjacent Duplicates in String II
    LeetCode 797. All Paths From Source to Target
    LeetCode 1029. Two City Scheduling
  • 原文地址:https://www.cnblogs.com/LoongEmbedded/p/5298211.html
Copyright © 2011-2022 走看看