Linux 内核中每个模块之间都是独立的,如果模块需要感知其他模块的事件,就需要用到内核通知链。

最典型的通知链应用就是 LCD 和 TP 之间,TP 需要根据 LCD 的亮灭来控制是否打开关闭触摸功能。

通俗的讲,LCD 会创建一个函数链表,TP 会将 suspend 和 resume 函数添加到链表中,当 LCD 发生亮灭变化时,会根据情况执行链表上所有对应的函数,函数会根据不同的动作执行 TP 的 suspend 和 resume 函数。

下面参考 TP 写一个内核通知链 demo。

#include <linux/module.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/err.h>
#include <linux/fb.h>
#include <linux/notifier.h> // 构造dmeo的结构体,包括需要执行的函数
struct demo_device {
struct notifier_block fb_notif;
void (*demo_suspend)(struct demo_device *dev);
void (*demo_resume)(struct demo_device *dev);
struct mutex ops_lock;
}; struct demo_device demo; // 当LCD状态变化时执行的函数
static inline int fb_notifier_callback(struct notifier_block *self,
unsigned long action, void *data)
{
struct demo_device *notifier;
struct fb_event *event = data;
int blank_mode;
int ret = ; // 根据参数fb_notif查找结构体demo_device的首地址
notifier = container_of(self, struct demo_device, fb_notif); mutex_lock(&notifier->ops_lock); switch (action) {
// LCD灭屏
case FB_EARLY_EVENT_BLANK:
blank_mode = *((int *)event->data);
if (blank_mode != FB_BLANK_UNBLANK)
notifier->demo_suspend(notifier);
break; // LCD亮屏
case FB_EVENT_BLANK:
blank_mode = *((int *)event->data);
if (blank_mode == FB_BLANK_UNBLANK)
notifier->demo_resume(notifier);
break; default:
break;
} mutex_unlock(&notifier->ops_lock); if (ret < )
{
printk("demo_notifier_callback error action = %x, blank_mode = %x\n", (int)action, blank_mode);
return ret;
} return NOTIFY_OK;
} static inline int demo_register_fb(struct demo_device *dev)
{
memset(&dev->fb_notif, , sizeof(dev->fb_notif));
// 给回调函数赋值,也就是LCD状态变化时执行的函数
dev->fb_notif.notifier_call = fb_notifier_callback;
mutex_init(&dev->ops_lock); // 将demo加入LCD的内核通知链
return fb_register_client(&dev->fb_notif);
} static inline void demo_unregister_fb(struct demo_device *dev)
{
// 将demo从LCD的内核通知链删除
fb_unregister_client(&dev->fb_notif);
} static void demo_early_suspend(struct demo_device *dev)
{
printk("%s\n", __func__);
} static void demo_early_resume(struct demo_device *dev)
{
printk("%s\n", __func__);
} static int __init demo_init(void)
{
printk("%s\n", __func__); demo.demo_suspend = demo_early_suspend;
demo.demo_resume = demo_early_resume; demo_register_fb(&demo); return ;
} static void __exit demo_exit(void)
{
printk("%s\n", __func__); demo_unregister_fb(&demo);
} module_init(demo_init);
module_exit(demo_exit); MODULE_DESCRIPTION("Notifier Demo Driver");
MODULE_AUTHOR("AaronLee");
MODULE_LICENSE("GPL");

[Linux] 内核通知链 notifier的更多相关文章

  1. Linux 内核通知链随笔【中】

    关于内核通知链不像Netlink那样,既可以用于内核与用户空间的通信,还能用于内核不同子系统之间的通信,通知链只能用于内核不同子系统之间的通信.那么内核通知链到底是怎么工作的?我们如何才能用好通知链? ...

  2. Linux 内核通知链随笔【中】【转】

    转自:http://blog.chinaunix.net/uid-23069658-id-4364171.html 关于内核通知链不像Netlink那样,既可以用于内核与用户空间的通信,还能用于内核不 ...

  3. Linux 内核通知链机制的原理及实现

    一.概念: 大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣.为了满足这个需求,也即是让某个子系统在发生某个事件时通知其它的子 系统,Linux内核提供了通知链的机制.通 ...

  4. Linux内核通知链模块

    通知链描写叙述 大多数内核子系统都是相互独立的,因此某个子系统可能对其他子系统产生的事件感兴趣. 为了满足这个需求,也即是让某个子系统在发生某个事件时通知其他的子系统.Linux内核提供了通知链的机制 ...

  5. Linux内核通知链机制的原理及实现【转】

    转自:http://www.cnblogs.com/armlinux/archive/2011/11/11/2396781.html 一.概念: 大多数内核子系统都是相互独立的,因此某个子系统可能对其 ...

  6. Linux内核调试方法总结之内核通知链

    Linux内核通知链notifier 1.内核通知链表简介(引用网络资料)    大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣.为了满足这个需求,也即是让某个子系统在 ...

  7. Linux内核基础--事件通知链(notifier chain)

    转载: http://blog.csdn.net/wuhzossibility/article/details/8079025 http://blog.chinaunix.net/uid-277176 ...

  8. Linux内核基础--事件通知链(notifier chain)good【转】

    转自:http://www.cnblogs.com/pengdonglin137/p/4075148.html 阅读目录(Content) 1.1. 概述 1.2.数据结构 1.3.  运行机理 1. ...

  9. Linux内核基础--事件通知链(notifier chain)【转】

    转自:http://blog.csdn.net/wuhzossibility/article/details/8079025 内核通知链 1.1. 概述 Linux内核中各个子系统相互依赖,当其中某个 ...

随机推荐

  1. Win10同时安装office2016和visio2016说明

    前言 无论是先安装office2016还是visio2016,均不能成功. 而office2016和visio2016的镜像文件是一样的,只是名称不一样,只需下载其一即可. 具体参考链接 https: ...

  2. linux识别ntfs U盘

    NTFS-3G 是一个开源的软件,可以实现 Linux.Free BSD.Mac OSX.NetBSD 和 Haiku 等操作系统中的 NTFS 读写支持 下载最新ntfs-3g源代码,编译安装 # ...

  3. 虚拟机NAS存储的安装

    1.下载一款免费的NAS系统fressNAS 下载网址;https://www.freenas.org/download/ 2.选择配置好虚拟机(内存设置8G最好,选择桥接) 不要做任何操作等待进入安 ...

  4. java ArrayList的remove()方法的参数为int和Integer的问题

    ArrayList的父类List中,有2个remove重载方法: remove(int index) remove(Object o) 假如参数输入为数字类型,到底是删除值等于该数字的对象还是删除索引 ...

  5. Flink源码阅读(一)——Flink on Yarn的Per-job模式源码简析

    一.前言 个人感觉学习Flink其实最不应该错过的博文是Flink社区的博文系列,里面的文章是不会让人失望的.强烈安利:https://ververica.cn/developers-resource ...

  6. js节点的创建添加删除

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. abp学习(三)——文档翻译一

    地址:https://aspnetboilerplate.com/Pages/Documents 什么是ASP.NET样板?ASP.NET Boilerplate(ABP)是一个开放源代码且文档齐全的 ...

  8. 《The One!团队》:BETA Scrum metting1

    项目 内容 作业所属课程 所属课程 作业要求 作业要求 团队名称 < The One !> 作业学习目标 (1)掌握软件黑盒测试技术:(2)学会编制软件项目总结PPT.项目验收报告:(3) ...

  9. git 删除错误commit

    其实就是硬reset到之前对的commit记录然后强行再推送到远程库一下 具体操作: git reset --hard <commit_id> git push origin HEAD - ...

  10. 使用Navicat Premium 12导出SQL语句并在Power Designer 16.5中生成物理模型

    内容简介 本文主要介绍使用Navicat Premium 12导出建表SQL(使用MySQL数据库)文件,并在Power Designer 16.5中使用导出的SQL文件来生成物理模型的步骤. 操作步 ...