0
点赞
收藏
分享

微信扫一扫

Kernel之通知链


Kernel之通知链
背景
最近在调触摸屏,看代码时偶然看到了通知链相关的代码,加上之前刚好了解了一点通知链相关的东东,所以特此记录下。
在触摸屏驱动中的主要功能就是在开关屏的时候通知TP进行resume和suspend操作,大致的伪代码如下,以我看的elan的TP驱动为例:

C

...
/* 通知链的事件回调函数,收到通知TP进行resume和suspend操作 */
 static int fb_notifier_callback(struct notifier_block *self,
                 unsigned long event, void *data)
 {
     struct fb_event *evdata = data;
     int *blank;
     struct elan_ts_data *ts =
         container_of(self, struct elan_ts_data, fb_notif);    if (evdata && evdata->data && event == FB_EVENT_BLANK && ts &&
         ts->client) {
         blank = evdata->data;
         if (*blank == FB_BLANK_UNBLANK)
             elan_ts_resume(&ts->client->dev);
         else if (*blank == FB_BLANK_POWERDOWN)
             elan_ts_suspend(&ts->client->dev);
     }    return 0;
 }/* 
     在probe函数中注册fb client,而 fb_register_client()函数实现的其实就是通知链注册:
     int fb_register_client(struct notifier_block *nb)
     {
         return blocking_notifier_chain_register(&fb_notifier_list, nb);
     }    在开关屏的时候会调用 fb_notifier_call_chain(FB_EVENT_BLANK, &event) 来触发通知:
     int fb_notifier_call_chain(unsigned long val, void *v)
     {
         return blocking_notifier_call_chain(&fb_notifier_list, val, v);
     }    //drivers/video/fbdev/core/fb_notify.c
 */
 static int elan_ts_probe(...)

作者: Shell

举报

相关推荐

0 条评论