当前位置: 移动技术网 > 移动技术>移动开发>IOS > 屏和TP谁先休眠的问题

屏和TP谁先休眠的问题

2020年07月18日  | 移动技术网移动技术  | 我要评论
屏与TP休眠路径:

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

 

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

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

看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驱动里面的。

 然后深一点的代码就是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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网