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
链接: https://notes.z-dd.online/2023/03/18/Kernel%E4%B9%8B%E9%80%9A%E7%9F%A5%E9%93%BE/
来源: DD'Notes
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。