屏和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
面试了一家公司,问了我这问题,虽然都会感觉是屏先休眠,但我不敢说哈哈。不知道说具体原因不想瞎说。
没回答好这个问题,现在去想一下。
看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函数执行了。
-------------------------------------
下面理下代码流程:
首先这个类似回调函数的东西是在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(>1x_fb_notifier);
#elif defined(CONFIG_HAS_EARLYSUSPEND)
register_early_suspend(>1x_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