在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)
诺基亚6银白色京东开卖售价不变:有了Lumia的味道
特斯拉二季度在美国最大电动汽车市场加州销量下降近一半
视频安防系统得益于高压反激式控制器
如何使用Ansys软件套件实现立方体卫星系统的高级开发
MAX3806应用电路(用于光测距系统的接收器)
Linux的notifier机制在TP中的应用
了解常见晶振频率和应用范围
康宁、友达升级玻璃技术,抢攻曲面车用显示商机
禾赛科技推动整个激光雷达行业对于信息安全的重视与实践
OPPOR17光感屏幕指纹体验 效果怎么样
热衷灯光秀的无人机,还可以这么玩?
三相空气开关跳闸的原因_三相空气开关跳闸的处理办法
电容性负载稳定性问题的探究和解决方案
分布式视频处理系统有什么优势?
混凝土区块链平台是一个怎样的平台
基于工业智能网关的粮机设备运维管理平台
未来物联网系统中的无故障数据存储
环球晶圆公布第三季度财报 营收151.61亿元创下历史新高
中美贸易战让库克担忧新款iPhone出货延迟 华为挺进日本智能手机日销量排行名单Top5
想知道无人驾驶汽车为什么会撞人吗?自动驾驶的运作原理告诉你答案