• Linux的notifier机制在TP中的应用【转】


    转自:https://blog.csdn.net/armfpga123/article/details/51771666

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/armfpga123/article/details/51771666
    在linux内核系统中,各个模块、子系统之间是相互独立的。Linux内核可以通过通知链机制来获取由其它模块或子系统产生的它感兴趣的某些事件。
    notifier_block结构体在include/linux/notifier.h中定义:

    struct notifier_block {
    notifier_fn_t notifier_call;
    struct notifier_block __rcu *next;
    int priority;
    };
    priority用来定义优先级,高优先级的处理例程将被优先执行,数值越大,优先级越高。
    回到函数的原型定义:
    typedef int (*notifier_fn_t)(struct notifier_block *nb,
    unsigned long action, void *data);
    TP属于输入子系统,可以通过获取framebuffer子系统来实现亮屏和灭屏时触发相应的事件。
    fb_register_client和fb_unregister_client函数定义在drivers/video/fb_notify.c:
    /**
    * fb_register_client - register a client notifier
    * @nb: notifier block to callback on events
    */
    int fb_register_client(struct notifier_block *nb)
    {
    return blocking_notifier_chain_register(&fb_notifier_list, nb);
    }

    /**
     *    fb_unregister_client - unregister a client notifier
     *    @nb: notifier block to callback on events
     */
    int fb_unregister_client(struct notifier_block *nb)
    {
        return blocking_notifier_chain_unregister(&fb_notifier_list, nb);
    }
    当framebuffer子系统发生事件时,调用notifier_call_chain()来触发相应的处理函数。
    /**
    * fb_notifier_call_chain - notify clients of fb_events
    *
    */
    int fb_notifier_call_chain(unsigned long val, void *v)
    {
    return blocking_notifier_call_chain(&fb_notifier_list, val, v);
    }
    下面是一个实例:
    struct msg21xx_ts_data {
    struct input_dev *input;
    struct hrtimer timer;
    struct work_struct work;
    int irq;
    struct dentry *dir;
    char *ts_info;
    u8 addr;
    int fw_major;
    int fw_minor;
    #ifdef CONFIG_FB
    struct notifier_block fb_notif;
    #endif
    bool suspended;
    struct i2c_client *client;
    struct regulator *vdd;
    struct regulator *vcc_i2c;
    struct msg21xx_platform_data *pdata;
    struct workqueue_struct *msg21xx_wq;
    struct mutex msg21xx_mutex;
    };
    probe函数中与notifier相关部分实现:
    struct msg21xx_ts_data *data;

    data = kzalloc(sizeof(struct msg21xx_ts_data), GFP_KERNEL);
    if (!data) {
        dev_err(&client->dev, "%s: Alloc mem fail!", __func__);
        err = -ENOMEM;
        goto exit;
    }

    #ifdef CONFIG_FB
    data->fb_notif.notifier_call = fb_notifier_callback;
    err = fb_register_client(&data->fb_notif);
    if (err)
    dev_err(&client->dev, "Unable to register fb_notifier: %d ",
            err);
    #endif
    fb_notifier_callback实现:
    #ifdef CONFIG_FB
    static int fb_notifier_callback(struct notifier_block *self,
    unsigned long event, void *data)
    {
    struct fb_event *evdata = data;
    int *blank;
    struct msg21xx_ts_data *msg21xx_data =
    container_of(self, struct msg21xx_ts_data, fb_notif);

    if (evdata && evdata->data && event == FB_EVENT_BLANK &&
    msg21xx_data && msg21xx_data->client) {
    blank = evdata->data;
    if (*blank == FB_BLANK_UNBLANK)
    msg21xx_ts_resume(&msg21xx_data->client->dev);
    else if (*blank == FB_BLANK_POWERDOWN)

    ---------------------
    作者:ELinux2607
    来源:CSDN
    原文:https://blog.csdn.net/armfpga123/article/details/51771666
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    *** Assertion failure in -[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:viewCategory
    linker command failed with exit code 1 (use -v to see invocation)
    谈谈我对PhoneGap的看法——(摘自唐巧的技术博客)
    ssh key一键自动化生成公钥私钥,并自动分发上百服务器免密码交互
    2018年Linux运维人员必会开源运维工具体系总结
    CentOS 6下PXE+Kickstart无人值守安装操作系统
    IOS优秀博客
    Nginx简单实现网站的负载均衡
    堆排序 Heap Sort
    h5移动端设计页面
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/10483249.html
Copyright © 2020-2023  润新知