背光控制驱动分析

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: 用来表述设备的名称,在注册到ledclass上之后将在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);

}

高通LCD背光控制软件简析相关推荐

  1. 高通LCD bring up流程

    高通LCD bring up流程 前言 kernel 添加LCD的dtsi 将屏的dtsi放到平台的dtsi中 电压配置 lk 添加屏的.h文件 Panel configuration Panel r ...

  2. 高通LCD的pwm背光驱动

    发生异常的现象: msm8953 lcd在快速亮灭的情况下背光概率性休眠不灭:测量高通pwm,发现正常的时候pwm的管脚LCM_BL_PWM为低电平,失败的时候为高电平: 根据原理图: mpp是什么? ...

  3. 高通-LCD驱动框架简述

    LCD驱动框架简述 目录 一 LCD硬件结构框架 二 不同的硬件结构LCD的驱动框架简述 三 RGB接口LCD驱动简述(以户外手机(Android5.1)为例) 3.1 硬件线路框架 3.2 软件驱动 ...

  4. 高通LCD之亮灭屏过程简析

    1.如何看亮灭屏时间 adb shell kmsgcat |grep fb_blank 2.code简介 在kernel/drivers/video/msm/mdss/mdss_fb.c中, stat ...

  5. 高通LCD 开机logo制作

    本文将介绍LK的logo制作方法,以及代码上的修改. 1.基础简介 LK的logo分为两种 1.1 .当图片内容比较小的时候,将图片的数据放入.h 文件 1.2.当图片内容比较大的时候,将图片的数据做 ...

  6. Linux的lcd的mipi接口,LCD MIPI DSI简析系列之二【转】

    MIPI DSI 协议标准支持两种模式:Command模式和Video模式. 1 Command 模式 只有当LCD面板带有显示控制器和帧缓冲区的时候才能使用Command模式.数据传送的格式一般是在 ...

  7. 高通LCD lk代码跟踪分析

    H文件里面的所有参数都是在Oem_panel.c里面的int init_panel_data函数调用的.接下来跟踪一下代码.Oem_panel.c位于bootable\bootloader\lk\ta ...

  8. afe 高通_高通ASOC中的machine驱动

    ASoC被分为Machine.Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的代码,再次引用上一节的内容:Machin ...

  9. (1)RIL简析(高通)——RIL如何启动及初始化

    Android设置了RIL层,是上层framework与Modem沟通的桥梁.高通使用qcril作为其vendor-RIL,与modem之间使用QMI机制通讯. 分3篇分析下面的问题: RIL如何启动 ...

最新文章

  1. 谷歌发布新编程语言,专治SQL各种“不服”
  2. Oracle 11g必须开启的服务及服务详细介绍
  3. linux有符号和无符号,有符号数和无符号数
  4. Unity3D学习笔记(十九):UGUI、Image、Text、Button
  5. 数据库的一些基本知识
  6. Android 底部导航栏的简单实现-BottomNavigationView
  7. Java中lambda表达式去重_JAVA8中Lambda和Stream
  8. [Java基础]Junit测试
  9. java替换数组中的元素_如何使用Java 8流快速替换列表中的元素
  10. React开发(162):React关于 this.props.children 总结
  11. c语言中最常用的四种数据类型,计算机中有哪几种常见数据类型
  12. 【李宏毅2020 ML/DL】P67-72 Anomaly Detection
  13. 决策树和基于决策树的集成方法(DT,RF,GBDT,XGB)复习总结
  14. Costomize Print Output
  15. 课后习题讲解(免费)高数下册
  16. ZeroMQ知识总结大全(二):Req-Rep模式详解
  17. 如何用Python爬取你的微信好友信息
  18. android studio 添加 ignored files 忽略文件
  19. 华为8c系统语言切换,华为荣耀畅玩8C双清教程_怎么清理缓存和恢复出厂设置
  20. https://ipcrs.pbccrc.org.cn/

热门文章

  1. 深入 git 必看:git 是如何被创造的?讲述 git 的诞生史、核心思想及其父:Linus Torvalds
  2. markdown编辑器使用指南
  3. 【图像分类】2022-RepLKNet CVPR 31x31卷积了解一下
  4. python制作mac小软件_python生成mac os app记录-py2app
  5. 怎样在计算机桌面上添加小工具日历,如何在电脑桌面添加时钟,日历等小工具。 在电脑桌面添加时钟,日历等小工具的方法。...
  6. 惊呆:女老师教室内竟在众目睽睽之下撒尿(图)
  7. css 实现半圆与四分之一圆
  8. C语言一阶低通、高通滤波器滤除截止频率外的杂波
  9. 考研政治80分复习经验帖
  10. FPGA时序约束理论(基于Vivado)