• android MTK驱动背光唤醒流程


         在标准的android驱动中,睡眠唤醒流程非常清晰,能够较方便的更改lcd唤醒时间和led背光的点亮时间,但是也很容易出现问题,比如说闪屏,唤醒慢!

         出现闪屏有两个原因

    1、 开背光时间在唤醒lcd前!

    2、 开背光时间在唤醒lcd后,但是没有等lcd刷屏就点亮背光!

    我按照标准驱动流程去分析mtk的做法

     

     他的video最初的注册位置是

    Mediatek kernel drivers video  mtkfb.c 里面

    入口函数

     

    module_init(mtkfb_init);

     

    在 函数int __init mtkfb_init(void)  中有这样一句

    register_early_suspend(&mtkfb_early_suspend_handler);

    是注册睡眠机制函数 

    只要注册这里 就是把 mtkfb_early_suspend_handler  下面的结构体里面的函数

     

    .suspend = mtkfb_early_suspend,

    .resume = mtkfb_late_resume,

    睡眠、唤醒交给系统来管理

    他的调用顺序和

    .level = EARLY_SUSPEND_LEVEL_DISABLE_FB,    这个值有关系

     

     

     

    去找找背光的驱动

    module_init(mt65xx_leds_init);  背光入口函数

     

    在mt65xx_leds_init中注册平台类设备

    ret = platform_driver_register(&mt65xx_leds_driver);

     

     

    他函数注册信息是

    static struct platform_driver mt65xx_leds_driver = {

    .driver = {

    .name = "leds-mt65xx",

    .owner = THIS_MODULE,

    },

    .probe = mt65xx_leds_probe,

    .remove = mt65xx_leds_remove,

    //.suspend = mt65xx_leds_suspend,

    .shutdown   = mt65xx_leds_shutdown,

    };

     

     

    我们也可以再  手机adb  shell里面查找到相关的信息

    /sys/bus/platform/devices/leds-mt65xx

    /sys/devices/platform/leds-mt65xx

    但是没有找到这里的设置路径???奇怪!!那背光灯设置是在什么地方呢????

    在mt65xx_leds_probe  函数中

    有这样一条代码

    g_leds_data[i]->cdev.brightness_set = mt65xx_led_set;

    难道是 直接给上层节点直接设置??

    继续跟代码

    仔细分析 代码 mt65xx_leds_probe函数

    if(strcmp(g_leds_data[i]->cdev.name,"lcd-backlight") == 0)

    {

    rc = device_create_file(g_leds_data[i]->cdev.dev, &dev_attr_duty);

                if(rc)

                {

                    LEDS_DEBUG("[LED]device_create_file duty fail! ");

                }

                

                rc = device_create_file(g_leds_data[i]->cdev.dev, &dev_attr_div);

                if(rc)

                {

                    LEDS_DEBUG("[LED]device_create_file duty fail! ");

                }

                rc = device_create_file(g_leds_data[i]->cdev.dev, &dev_attr_frequency);

                if(rc)

                {

                    LEDS_DEBUG("[LED]device_create_file duty fail! ");

                }

                

        rc = device_create_file(g_leds_data[i]->cdev.dev, &dev_attr_pwm_register);

                if(rc)

                {

                    LEDS_DEBUG("[LED]device_create_file duty fail! ");

                }

    bl_setting = &g_leds_data[i]->cust;

    }

    建立了节点   之后呢??????????

    不得不佩服mtk弄个鸟东西搞这么复杂

     

    进入 

    /sys/devices/platform/leds-mt65xx/leds/lcd-backlight/

    发现有

    Brightness

    用这种可以设置背光灯亮度

    echo 255 > brightness

    Brightness   这东西在哪里来的?

    在代码  kernel drivers  leds  led-class.c

    里面有subsys_initcall(leds_init);

    用 subsys_initcall

    有这样代码

     

    static struct device_attribute led_class_attrs[] = {

    __ATTR(brightness, 0644, led_brightness_show, led_brightness_store),

    __ATTR(max_brightness, 0444, led_max_brightness_show, NULL),

    #ifdef CONFIG_LEDS_TRIGGERS

    __ATTR(trigger, 0644, led_trigger_show, led_trigger_store),

    #endif

    __ATTR_NULL,

    };

     

    生成了brightness节点

    上层直接调用……

     

    为什么?????

    打log发现   在resume  lcd后就会调用brightness  写值

     

    他没有用

    .level = EARLY_SUSPEND_LEVEL_DISABLE_FB, 这个来管理

     

    优点

    不会有我开始说的那两种bug,什么时候点亮lcd是由上层控制,上层去判断有没有刷屏!

    流程已经写死,只要开发者不破坏此模式就不会有bug

     

    缺点

    破坏了源代码的流程,已经完全是一体,真正出现问题比较难改!

     

    关于上层怎么去判断什么时候去点亮背光 ,这个问题,现在还没跟,以后有时间慢慢跟,不过做驱动,跟到这里已经可以满足驱动的要求了!

  • 相关阅读:
    关于响应式框架的定位不了元素的坑
    pychrom 中文版
    firebug定位工具很强大
    查询数据中所有表名
    java解析Json中获取Array字段值及嵌套Json对象
    mysql表操作
    集合框架(二)
    集合框架
    Java API(二)
    JDBC入门
  • 原文地址:https://www.cnblogs.com/reality-soul/p/4757728.html
Copyright © 2020-2023  润新知