Linux的notifier机制在TP中的应用

 在     linux      内核系统中,各个模块、子系统之间是相互独立的。Linux内核可以通过通知链机制来获取由其它模块或子系统产生的它感兴趣的某些事件。

    Linux的notifier机制在TP中的应用_设计制作_测量仪表  

no     ti   fier_block结构体在include/linux/no  TI fier.h中定义:

struct no  TI fier_block {
no  TI fier_fn_t no  TI fier_call;
struct notifier_block __rcu *next;
int priority;
};
priority用来定义优先级,高优先级的处理例程将被优先执行,数值越大,优先级越高。
回到函数的原型定义:
typedef int (*notifier_fn_t)(struct notifier_block *nb,
unsigned long action, void *data);
TP属于输入子系统,可以通过获取f     ram   ebuffer子系统来实现亮屏和灭屏时触发相应的事件。
fb_regis     te   r_client和fb_unregister_client函数定义在drive     rs   /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_ch     ai   n_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_     mi   nor;
#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)



97
158
0
79

相关资讯

  1. 1、基于FPGAEPlS30芯片和AD变换器实现导航系统的设计4817
  2. 2、新一轮“厮杀”?全球第二大动力电池市场争夺将爆发1893
  3. 3、安捷伦Agilent仪器常见故障及预防措施815
  4. 4、飞腾电子发布NB-IoT模组FT780,内含M0内核,支持单芯片解决方案635
  5. 5、有刷电动工具和无刷电动工具的区别3545
  6. 6、5G助力我国远程医疗进入发展新阶段开拓应用新场景3280
  7. 7、盛思锐的环境传感器在空气质量测试中的应用671
  8. 8、保护物联网安全的四种方法3261
  9. 9、单片机和嵌入式系统linux的区别1126
  10. 10、停滞的工业化世界和狂奔的信息化世界1369
全部评论(0)
我也有话说
0
收藏
点赞
顶部