Platform: RK3288
OS: Android 6.0
Kernel: 3.10.92

背光的亮暗通过pwm控制,驱动在文件pwm-rockchip.c中,这里不做描述.

dts各个配置参数意义:

backlight {
    /*设备名,会和驱动匹配.*/
    compatible = "pwm-backlight";
    /*使用哪个pwm channal, period*/
    pwms = <&pwm0 0 25000>;
    /*背光可调等级,比如这里是255级,实际反应到占空比就是当前值和数组中最大值的比值,
    例如当前是200,那么最终duty cycle就是200/255.*/
    brightness-levels = <255 254 253 252 251 250 249 248 247 246 245 244 243 242 241 240
         239 238 237 236 235 234 233 232 231 230 229 228 227 226 225 224 223 222 221 220
         219 218 217 216 215 214 213 212 211 210 209 208 207 206 205 204 203 202 201 200
         199 198 197 196 195 194 193 192 191 190 189 188 187 186 185 184 183 182 181 180
         179 178 177 176 175 174 173 172 171 170 169 168 167 166 165 164 163 162 161 160
         159 158 157 156 155 154 153 152 151 150 149 148 147 146 145 144 143 142 141 140
         139 138 137 136 135 134 133 132 131 130 129 128 127 126 125 124 123 122 121 120
         119 118 117 116 115 114 113 112 111 110 109 108 107 106 105 104 103 102 101 100
         99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 74 73 72 71 70
         69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40
         39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10
         9 8 7 6 5 4 3 2 1 0>;
    /*开机初始化默认等级,Android起来之后会改变它.*/
    default-brightness-level = <200>;
    /*backlight使能控制pin.*/
    enable-gpios = <&gpio7 GPIO_A2 GPIO_ACTIVE_HIGH>;
};

驱动流程:

pwm_backlight_probe ->     pwm_bl.c
    pwm_backlight_parse_dt    //读取上面dts中的brightness-levels, default-brightness-level以及enable-gpios,而pwms后面标准接口会解析.
    gpio_request_one    //申请背光使能gpio
    devm_pwm_get ->     core.c//获得一个pwm
        pwm_get ->
            of_pwm_get ->
                of_parse_phandle_with_args    解析上面dts中的pwms属性.
                of_node_to_pwmchip
                pwm = pc->of_xlate    //最终生成struct pwm_device类型.     
    pwm_get_period    //获取period.
    dev_set_name(&pdev->dev, "rk28_bl");    //name不能改,用户空间会被用到:/sys/class/backlight/rk28_bl
    backlight_device_register    -> //注册标准背光设备
        device_register
        backlight_register_fb ->
            fb_register_client    //callback是fb_notifier_callback.
    backlight_update_status ->        //用默认值更新.
        bd->ops->update_status ->
            pwm_backlight_update_status ->
                compute_duty_cycle    //计算占空比,下面会分析.
                pwm_config    //配置pwm
                pwm_backlight_power_on    //enable背光

compute_duty_cycle:

static int compute_duty_cycle(struct pwm_bl_data *pb, int brightness)
{
    /*一般情况下这个值都为0*/
    unsigned int lth = pb->lth_brightness;
    int duty_cycle;
    /*pb->levels这个表格就是从dts节点brightness-levels中获取的,
    假设进来的参数brightness是254,那么得到的duty_cycle就是1,
    如果没有这个表格,那么就直接是进来的亮度值.*/
    if (pb->levels)
        duty_cycle = pb->levels[brightness];
    else
        duty_cycle = brightness;
    /*假设这里lth是0,那么公式就是duty_cycle * pb->period / pb->scale
     pb->scale为pb->levels数组中的最大值. pb->period也就是dts节点pwms
     的第三个参数周期值为25000, 所以这个公式就是按照将android的纯数值转换
     成事件周期值对应的占空比.*/
    return (duty_cycle * (pb->period - lth) / pb->scale) + lth;
}

小结:

其实不管用哪种方式都是调用backlight_update_status来改变背光,syfs也是,看下backlight.c
backlight_class_init ->    backlight.c
    class_create    //创建class,名字是backlight.
    backlight_class->dev_attrs = bl_device_attributes;

static struct device_attribute bl_device_attributes[] = {__ATTR(bl_power, 0644, backlight_show_power, backlight_store_power),__ATTR(brightness, 0644, backlight_show_brightness,backlight_store_brightness),__ATTR(actual_brightness, 0444, backlight_show_actual_brightness,NULL),__ATTR(max_brightness, 0444, backlight_show_max_brightness, NULL),__ATTR(type, 0444, backlight_show_type, NULL),__ATTR_NULL,
};

其中backlight_store_brightness() 最终调用backlight_update_status().
还有一种情况是亮屏/灭屏时调用,记得前面有注册一个fb notify callback.

static int fb_notifier_callback(struct notifier_block *self,unsigned long event, void *data)
{
.../*只处理亮屏和灭屏事件.*//* If we aren't interested in this event, skip it immediately ... */if (event != FB_EVENT_BLANK && event != FB_EVENT_CONBLANK)return 0;
...if (bd->ops)if (!bd->ops->check_fb ||bd->ops->check_fb(bd, evdata->info)) {bd->props.fb_blank = *(int *)evdata->data;//亮屏情况if (bd->props.fb_blank == FB_BLANK_UNBLANK)bd->props.state &= ~BL_CORE_FBBLANK;//灭屏时elsebd->props.state |= BL_CORE_FBBLANK;backlight_update_status(bd);}
...
}

可以看到最后也是调用backlight_update_status().

[RK3288][Android6.0] PWM backlight 驱动流程小结相关推荐

  1. [RK3288][Android6.0] 系统按键驱动流程分析【转】

    本文转载自:http://blog.csdn.net/kris_fei/article/details/77894406 Rockchip的按键驱动位于 kernel/drivers/input/ke ...

  2. [RK3288][Android6.0] WiFi之cfg80211知识点小结

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 概念: cfg80211是Linux 802.11用于管理配置的一套API,它是用户和驱动之间的桥 ...

  3. [RK3288][Android6.0] 设置中通过Sensor旋转显示画面小结

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 Settings -> Display有个选项控制旋转屏幕时内容是否跟着旋转 这个功能是通过 ...

  4. [RK3288][Android6.0] 调试笔记 --- WiFi芯片AP6356S添加

    Platform: RK3288 OS: Android 6.0 Kernel: 3.10.92 背景: RK3288 Android6.0平台对AP6356S的支持不是很完善,直接修改wifi ch ...

  5. android6.0中app crash流程分析

    要根据这个流程分析一下如何在应用中截获系统的app crash弹框,然后做到更人性化 基于Android 6.0的源码剖析, 分析Android应用Crash是如何处理的. /frameworks/b ...

  6. [RK3288][Android6.0] 调试笔记 --- 电池电量一直显示100%

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 之前文章[RK3288][Android6.0] 调试笔记 - 伪电池驱动添加 阐述了如何添加一个 ...

  7. [RK3288][Android6.0] 调试笔记 --- touch无法获取坐标点

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 有网友遇到调试touch的时候能触发中断,但无法获取坐标点 具体可参考文章 [RK3288][An ...

  8. [RK3288][Android6.0] 调试笔记 --- AndroidTool低格无效问题

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 现象: 之前文章 [RK3288][Android6.0] 调试笔记 - AndroidTool两 ...

  9. [RK3288][Android6.0] RK3288和RK3288-W版本说明

    Platform: RK3288 OS: Android 6.0 Kernel: 3.10.92 RK3288不同版本: RK3288-W丝印标记: RK3288-W功能更新: RK3288-W软件兼 ...

最新文章

  1. LeetCode Reconstruct Original Digits from English
  2. 基于 OpenCV 的人脸识别
  3. 内部体验腾讯负载均衡的新功能
  4. java中Runnable和Callable的区别
  5. SpringBoot里实现了某个接口的实现类运行时如何注入的?
  6. 编译原理——实验叁——基于YACC的TINY语法分析器的构建
  7. 采用随机的'User-Agent'提高博客的访问量
  8. 凭什么说这门编程语言是下一代 Java?
  9. zz推荐的软件测试英文网站
  10. OpenSSL新手自学:如何生成RSA私钥并用于数字签名
  11. 财政bug之”Y2K Accounting Bug“
  12. Jquery常用开发插件收集
  13. 牛客网最终python笔试题_牛客笔试题之Python
  14. 通过热透镜聚焦的高斯光束
  15. 字节跳动面试题 —— 水壶问题
  16. 富文本编辑器CKEditor配置与使用
  17. linux硬盘的两个分区合并_linux新加硬盘合并
  18. 微软公司软件测试工程师,【其它微软中国(Microsoft)工资】软件测试工程师待遇-看准网...
  19. 密码重置用HTML怎么弄,如何用简单命令重置路由器密码
  20. base64编码的使用与解析

热门文章

  1. C语言 有3个数a,b,c,要求按大小顺序把他们输出
  2. 一种利用电磁能产生的共振引力波实现超光速飞行的机器
  3. 为什么使用HashMap需要重写hashcode和equals方法_最通俗易懂搞定HashMap的底层原理...
  4. 联通“格物”,做好设备管理这篇大文章
  5. 新构造运动名词解释_新构造运动的含义
  6. 子豪兄教你从零开始实现人脸识别
  7. 有两个列表 l1 =[11,22,33] l2 =[22,33,44]
  8. 关于Multisim仿真电容充电曲线的设置方法
  9. hdfs删文件夹报错
  10. csr867x入门之串口数据收发(二)