Kernel之通知链

Kernel之通知链 | DD'NotesKernel之通知链背景最近在调触摸屏,看代码时偶然看到了通知链相关的代码,加上之前刚好了解了一点通知链相关的东东,所以特此记录下。在触摸屏驱动中的主要功能就是在开关屏的时候通知TP进行resume和suspend操作,大致的伪代码如下,以我看的elan的TP驱动为例: ... /* 通知链的事件回调函数,收到通知TP进行resume和suspend操作 */ static int fb_nothttps://notes.z-dd.online/2023/03/18/Kernel%E4%B9%8B%E9%80%9A%E7%9F%A5%E9%93%BE/

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
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值