欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

屏和TP谁先休眠的问题

程序员文章站 2022-05-04 09:23:06
我确实没回答好这个问题,但是实际工作中只用5分钟就能得到答案。休眠时,屏先休眠;唤醒时,屏先唤醒。实际也是这样。但是为什么屏先休眠呢?屏休眠是display off(0x28) , sleep in(0x10) 这两个动作在suspend里面是一起的。也就是实际中说屏灭了,然后进入休眠状态。反回来想,如果TP先休眠,那么屏必然是没有灭的,这是后看起来就是触摸屏出现无触摸的问题。所以这个是错误的。----------------------换一个角度想,TP实际......
屏与TP休眠路径:

kernel/msm-3.18/drivers/video/msm/mdss/mdss_dsi_panel.c
kernel/msm-3.18/drivers/input/touchscreen/gt1x/gt1x_generic.c

 

屏和TP谁先休眠的问题

面试了一家公司,问了我这问题,虽然都会感觉是屏先休眠,但我不敢说哈哈。不知道说具体原因不想瞎说。

没回答好这个问题,现在去想一下。

看log的结论是:

休眠时,屏先休眠;唤醒时,屏先唤醒。

实际也是这样。

但是为什么屏先休眠呢?

屏休眠是display off(0x28) , sleep in(0x10) 这两个动作在suspend里面是一起的。

也就是实际中说屏灭了,然后进入休眠状态。

反回来想,如果TP先休眠,那么屏必然是没有灭的,这是后看起来就是触摸屏出现无触摸的问题。所以这个是错误的。

 

----------------------

换一个角度想,

TP实际应用也可以不休眠的,比如TP是带灭屏手势的唤醒的,TP驱动中是有宏控制2.8v和i2c电压是否掉电。

也就是说考虑这个问题时忽略TP,那么屏休眠还是在前面。

 

---------------------------------------------

更新

我发现我自己看的不够深~~~csdn下面推荐了一个博客,我点进去一看,发现我只是表面思考得出结论.....

真的是有代码原因,有通知event,有callback函数导致的,从上面的dmesg log也可以看出gtp_fb_notifier_callback函数执行了,然后TP的resume函数执行了。

https://blog.csdn.net/mike8825/article/details/95006981?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-2.nonecase

-------------------------------------

下面理下代码流程:

首先这个类似回调函数的东西是在TP probe函数的末尾注册的。

函数名称是gt1x_register_powermanger().

 static int gt1x_register_powermanger(void)
 {
     #if defined(CONFIG_FB)
         gt1x_fb_notifier.notifier_call = gtp_fb_notifier_callback;
        fb_register_client(&gt1x_fb_notifier);

     #elif defined(CONFIG_HAS_EARLYSUSPEND)
        register_early_suspend(&gt1x_early_suspend);
     #endif
     
    return 0;
}

这个比较好理解,注册了一个callback函数,然后向系统注册了一个结构体gt1x_fb_notifier.(机制类的东西~~)

static int gtp_fb_notifier_callback(struct notifier_block *noti,
                                     unsigned long event, void *data)
{

    
    //省略...
    
     if (ev_data && ev_data->data && event == FB_EVENT_BLANK) {
         blank = ev_data->data;
         if (*blank == FB_BLANK_UNBLANK) {
             GTP_DEBUG("Resume by fb notifier.");
             gt1x_resume();
         }
     }

 
     if (ev_data && ev_data->data && event == FB_EVENT_BLANK) {
         blank = ev_data->data;
         if (*blank == FB_BLANK_POWERDOWN) {
             GTP_DEBUG("Suspend by fb notifier.");
             gt1x_suspend();
         }
     }

    //省略...

}

这个也比较好理解,通过传入的参数event以及获取blank来判断是休眠还是唤醒,这个参数是从屏休眠唤醒传过来的,
 然后执行了TP的休眠或者唤醒。

然后搜一下这个FB_BLANK_UNBLANK和FB_BLANK_POWERDOWN,这个是来自framebuffer驱动里面的。

屏和TP谁先休眠的问题

 然后深一点的代码就是fb的ops函数里的mdss_fb_ops,

.fb_blank = mdss_fb_blank,  /* blank display */

大概就是黑屏函数吧,里面模式变为了FB_BLANK_POWERDOWN,就不再深入看了。

-----------------------------------------------------------------

总结一下:

            一方面,屏休眠或者唤醒会发出event类的东西(FB_EVENT_BLANK);

            一方面,TP probe注册了callback类的函数,检测FB_EVENT_BLANK和evdat->data;

            顺序的,屏休眠后,带动TP里的callback函数执行了,然后TP也休眠了。唤醒也是一样,屏先唤醒,然后TP唤醒。

---------------

暂时的理解是这样。

 

本文地址:https://blog.csdn.net/John_chaos/article/details/107412995