MSM8909的触摸屏驱动导致的熄屏后重新亮屏速度慢的原因!【转】

转自:https://blog.csdn.net/kk20000/article/details/83041081

使用的汇顶的触摸驱动的时候会重新亮屏速度慢3秒,而在使用另外一个敦泰触摸驱动的时候没有发现问题。
比较代码后发现,fb_notifier_callback的影响是关键.


有问题的代码是:

static int fb_notifier_callback(struct notifier_block *self,
                                 unsigned long event, void *data)
{
        struct fb_event *evdata = data;
        int *blank;
        struct goodix_ts_data *ts =
                container_of(self, struct goodix_ts_data, fb_notif);

        if (evdata && evdata->data && event == FB_EVENT_BLANK &&
                        ts && ts->client) {
                blank = evdata->data;

                GTP_DEBUG("fb notifier callback blank :%d",*blank);

                if (*blank == FB_BLANK_UNBLANK)
                        goodix_ts_resume(&ts->client->dev);
                else if (*blank == FB_BLANK_POWERDOWN)
                        goodix_ts_suspend(&ts->client->dev);
        }
        return 0;
}

 

修改为下面的方式后正常:

static int fb_notifier_callback(struct notifier_block *self,

                                 unsigned long event, void *data)
{
        struct fb_event *evdata = data;
        int *blank;
        struct goodix_ts_data *ts =
                container_of(self, struct goodix_ts_data, fb_notif);
        if (evdata && evdata->data && event == FB_EARLY_EVENT_BLANK && ts && ts->client)
        {
                blank = evdata->data;
                GTP_DEBUG ("fb_notifier_callback:goodix blank=%d\n", *blank);
                if (*blank == FB_BLANK_UNBLANK)
                {
                        if (!work_pending (&ts->resume_work))
                        {
                                schedule_work (&ts->resume_work);
                        }
                }
                else if (*blank == FB_BLANK_POWERDOWN)
                {
                        cancel_work_sync (&ts->resume_work);
                        goodix_ts_suspend (&ts->client->dev);
                }
        }
        else if (event == FB_R_EARLY_EVENT_BLANK)
        {
                if (!work_pending (&ts->resume_work))
                {
                        schedule_work (&ts->resume_work);
                }
        }


        return 0;
}

所以在使用屏幕通知唤醒的时候,要避免直接调用唤醒函数,而应该采用内核工作队列中来处理。
---------------------
作者:雨滴平头哥
来源:CSDN
原文:https://blog.csdn.net/kk20000/article/details/83041081
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @   Sky&Zhang  阅读(874)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
历史上的今天:
2018-04-24 Android Framebuffer介绍及使用【转】
2018-04-24 Windows Live Writer离线博客工具使用教程(适用于博客园、CSDN、51CTO等等博客)【转】
2018-04-24 jenkins 入门教程(上)【转】
点击右上角即可分享
微信分享提示