高通LCD之背光

news/2024/5/20 20:50:15

背光控制的两种方式:

1、LCD控制IC支持动态背光控制功能(CABC)通过解析图像的直方图动态改变输出PWM的占空比从而动态调节LCD的背光,在不改变图像显示效果的情况下降低功耗,PMIC根据CABC的占空比控制背光输出电压;

 2、背光控制部分不经过PMIC而是通过一颗单独的带有boost转换功能的LED驱动器如LM3630A,该芯片通过PWM调节亮度。  


软件结构:


1、Wled backlight

在driver/leds/目录下存放着系统背光以及LED灯的驱动程序,通常需要在驱动程序中构造好struct led_classdev结构体,用来描述当前的led设备:


structled_classdev {

    const char     *name;                                                                                                                                               

    int         brightness; 

    int         max_brightness;

    int         flags;

       …..

    /* Set LED brightness level */

    /* Must not sleep, use a workqueue ifneeded */                                

    void       (*brightness_set)(struct led_classdev *led_cdev,                   

                      enum led_brightnessbrightness);                              

    /* Get LED brightness level */                                                 

    enum led_brightness(*brightness_get)(struct led_classdev *led_cdev);          

       const char      *default_trigger;

       …

};

name: 用来表述设备的名称,在注册到led class上之后将在sys/leds/目录下创建一个class

其中还需要注意的是设置背光brightness_set的实现必须是不能睡眠的,通常使用一个工作队列,在工作队列中实现设置的动作。

default_trigger是一个字符串,用来匹配由链表中哪个节点的ledclass_dev作为触发控制背光,实际是在链表中添加一个node,trigger_event的时候,根据给定的name与default匹配使用那一个节点的ledclass device作为触发。

以我们项目中的leds-qpnp驱动来分析,在probe中构造ledclass_dev结构体

led->cdev.brightness_set    = qpnp_led_set;    //设置背光

led->cdev.brightness_get    = qpnp_led_get;    //获取背光

......

led->cdev.name= “wled:backlight”;

最后使用led_classdev_register(&spmi->dev, &led->cdev);注册到ledclass驱动上去。

static voidqpnp_led_set(struct led_classdev *led_cdev, enum led_brightness value)

{

       if (value >led->cdev.max_brightness)

              value =led->cdev.max_brightness;

       led->cdev.brightness = value;

       schedule_work(&led->work);   //schedule work

}

实际上由__qpnp_led_work()函数去设置背光。


2、LCD backlight

LCDbacklight是android的背光控制借口,它是一个通用的驱动,最终会调用到WLED的背光控制驱动设置背光。

mdss_fb.c中通过led_classdev_register注册一个led classdev,同样的先需要构造一个ledclass dev结构体,与wled不同的是它的backlight level是0~255,而wled则有panel决定。


staticstruct led_classdev backlight_led = {                                                                                                                             

    .name           = "lcd-backlight",

    .brightness     = MDSS_MAX_BL_BRIGHTNESS,  //255

    .brightness_set =mdss_fb_set_bl_brightness,

};

那么显然续作一个数据数量的转换。比如我们项目中wled的背光是0~4095,因此需要在代码中转换。在probe同样需要注册ledclass device。代码如下:

    if (!lcd_backlight_registered) {

        backlight_led.brightness =mfd->panel_info->brightness_max;                                                                                                      

        backlight_led.max_brightness =mfd->panel_info->brightness_max;

        if(led_classdev_register(&pdev->dev, &backlight_led))

            pr_err("led_classdev_registerfailed\n");

        else

            lcd_backlight_registered = 1;

    }   

那么,用户层设定背光lcd_backlight是怎么调用到wled backlight驱动中去的呢?首先背光level数量级不同,需要做转换,将android的backlevel转换成背光驱动需要的backlevel。通过如下的宏实现:

#defineMDSS_BRIGHT_TO_BL(out, v, bl_max, max_bright) do {\                                                                                                               

                    out = (2 * (v) * (bl_max) +max_bright)\

                    / (2 * max_bright);\

                    } while (0)

从软件框图的执行流程来看,最终backlevel是从pdata->set_backlight(pdata, temp);这条语句设置下去的。

到了这里,需要提到上面的default_trigger,它是一座桥梁,过渡到wled驱动。

DEFINE_LED_TRIGGER(bl_led_trigger);实际上这个宏的作用定义了一个struct led_trigger类型的指针变量bl_led_trigger.然后在初始化的时候将defualt trigger对应的字符串注册到trigger驱动中去,实际上就是添加到对应的链表中。并返回初始化好的bl_led_trigger

led_trigger_register_simple("bkl-trigger",  & bl_led_trigger);

在drivers/video/msm/mdss/mdss_dsi_panel.c中初始化时候将mdss_dsi_panel_bl_ctrl挂在函数指针上面:

ctrl_pdata->panel_data.set_backlight= mdss_dsi_panel_bl_ctrl;在这个函数中遍历链表找到对应的ledcass dev节点,led_set_brightness去设置背光。

staticinline 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);                                  

}



https://www.xjx100.cn/news/444346.html

相关文章

qcom平台 LCD亮灭屏流程及LCD知识点总结

一、LK中亮屏流程 1.gcdb_display_init(),进行display初始化的起始地方; 2.oem_panel_select(),在这里去选择哪一款屏,也可以在这里添加新一款屏; 3.dsi_panel_init()把屏头文件中的配置信息拷贝到结构体中,并一些屏需要的配置&am…

一文搞懂显示技术的底层框架

1. DPU与GPU的耦合是历史产物,完全可以独立出来2. DPU的原型设计 2.1【DPU的四大组成部分】2.2【KSM与DPU】3. DPU的最新设计 3.1【Source Suface Pipes or Overlays】3.2【Blender】3.3【Destination surface post-processor】3.4【Display Interface】4. 总结 PC上…

MTK LCM驱动知识

1.lcm 相关概念 1.1) MIPI接口:一共有三种接口:DBI(也做CPU或MCU接口)、DPI(也叫RGB接口)、DSI.在使用DSI接口时, 目前75/77都只支持到2条data lane,加上一条clock lane.使用DPI接口时,根据LCM IC支持的情况&#xf…

2.原版rom备份

为防止在调试的时候把开发板弄成砖块,需要先将原始镜像拷贝出来。原版系统为安卓7.1.2 可参考链接https://blog.csdn.net/oxp7085915/article/details/80291057 1.装备工作 adb命令行工具cmdadb驱动,瑞芯微开发工具AndroidTool 2. 安装usb驱动Drive…

三相并网变换器虚拟同步控制

一、研究/设计内容 1.1 逆变器控制策略研究现状 合理有效的逆变器控制策略能够有效改善电能的输出质量和电力系统运行的稳定性。根据不同的微网控制结构和并网要求,微网逆变器主要采用以下几种控制策略:恒功率控制(主要应用场景为并网模式&…

项目中实现读写分离

1、AbstractRoutingDataSource Spring boot提供了AbstractRoutingDataSource 根据用户定义的规则选择当前的数据源,这样我们可以在执行查询之前,设置使用的数据源。实现可动态路由的数据源,在每次数据库查询操作前执行。它的抽象方法 det…

RecyclerView使用问题集合http://www.jianshu.com/p/333fe22cabc6

1.RecyclerViewCursorAdapter & Loader机制:http://www.jianshu.com/p/333fe22cabc6 2RecyclerView侧边字母索引排序 3.使用RecyclerView notifyItemChanged()出现图片闪烁问题解决 4.RecyclerView的实现item中下划线的长度最后一行长度全长,其余长度较短的实…

SpringBoot后端篇(一)创建SpringBoot项目

最近看了大佬的文章,觉得写的很不错,于是动手实践实践,但是也走了很多的坑,目前自己整理了以下,谨以此作自己成长过程中的垫脚石....... 数据库设计 -- ---------------------------------------------------- -- 用…