转自: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\n",
        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
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/sky-heaven/p/10483249.html

Linux的notifier机制在TP中的应用【转】相关推荐

  1. Linux内核Notifier机制

    notifier是kernel的一种异步通信机制,用于告知某些模块产生了一个事件event. notifier涉及: 1,publisher,类比于server.provider等概念,负责: 提供一 ...

  2. Linux内核notifier机制通知链

    内核使用通知链的机制在内核各子系统之间进行事件通知(注:无法用于内核态和用户态之间的事件通知). 一.通知链介绍 在文件include/linux/notifier.h中,可以查看Linux内核定义的 ...

  3. Linux 内核 notifier机制

    一般而言特定的子系统会用特定的notifier_chain_register包装函数来注册,比如tp通过fb_register_client来注册notifier_block(在具体的应用场景中会封装 ...

  4. Linux 安全缓解机制总结

    Linux 安全缓解机制总结_panhewu9919的博客-CSDN博客 学习资料: kernel-security-learning linux-kernel-defence-map A Decad ...

  5. linux进程管理机制,linux进程管理,linux进程管理机制

    linux进程管理,linux进程管理机制 一.基本介绍 1.在 LINUX 中,每个执行的程序(代码)都称为一个进程.每一个进程都分配一个 ID 号 2.每一个进程,都会对应一个父进程,而这个父进程 ...

  6. Linux内核同步机制之(四):spin lock【转】

    转自:http://www.wowotech.net/kernel_synchronization/spinlock.html 一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享 ...

  7. (DT系列五)Linux kernel 是怎么将 devicetree中的内容生成plateform_device【转】

    转自:https://blog.csdn.net/lichengtongxiazai/article/details/38942033 Linux kernel 是怎么将 devicetree中的内容 ...

  8. linux驱动模型开发——linux platform总线机制讲解与实例开发

    1.概述: 通常在Linux中,把SoC系统中集成的独立外设单元(如:I2C.IIS.RTC.看门狗等)都被当作平台设备来处理. 从Linux2.6起,引入了一套新的驱动管理和注册机制:Platfor ...

  9. Linux内存管理机制研究

    Linux内存管理机制研究 查看linux系统中处于free状态的内存有两个角度,一个是从内核的角度来看,一个是从应用层的角度来看的. 1.从内核的角度来看free的内存,就是内核目前可以直接分配到, ...

最新文章

  1. 解决Ubuntu 14.04 Unity桌面环境登录后冻结问题
  2. oracle spm buffer get比较过程,Oracle 11g 新特性 -- SQL Plan Management 示例
  3. Python第一弹--------初步了解Python
  4. @valid注解_springboot使用自定义注解对接口参数校验
  5. [置顶] JQuery在线截取图片
  6. 大数据 -- 安装Hadoop-单机模式(1)
  7. 概率论与数理统计【三】一维随机变量及其分布
  8. android4.2实现pwm,Android平台下AOA协议的PWM信号控制系统
  9. 机器人动力学-拉格朗日方程
  10. 物联网NodeMCU刷写AT固件
  11. 在Arduino上使用433MHz发送和接收模块
  12. bigquery json处理函数json_extract和json_extract_scalar的区别
  13. MATLAB中图像增强之伪彩色增强
  14. 关于DDK中的编译知识 .
  15. Android快速开发框架之xUtils---图片模块
  16. 用计算机实现校正环节采样开关加在哪,计算机控制技术习题—广州工业大学.doc...
  17. ubuntu中如何提高源的下载速度
  18. 如何安装和设置WordPress多站点网络
  19. vba的like和正则表达式
  20. LAUNCHER3讲解

热门文章

  1. leetcode算法题--骑士拨号器
  2. systemctl和service
  3. POJ1990:MooFest——题解
  4. Kettle和ETL的基本构成
  5. Java学习lesson 09
  6. laravel 模版引擎使用
  7. gulp实现打包js/css/img/html文件,并对js/css/img文件加上版本号
  8. Linux下Apache虚拟主机配置
  9. 开发环境搭建(1)——JDK安装
  10. MySql The service could not be started