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

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

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

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

#include

#include

#include

#include

#include

#include

// 构造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 内核通知链随笔【中】

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

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

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

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

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

Linux内核通知链模块

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

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

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

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

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

Linux内核基础--事件通知链&lpar;notifier chain&rpar;

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

Linux内核基础--事件通知链&lpar;notifier chain&rpar;good【转】

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

Linux内核基础--事件通知链&lpar;notifier chain&rpar;【转】

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

随机推荐

Redis 外部访问设置

1.错误原因 Redis搭建好后一般都是使用编程语言进行连接调用,默认Redis的设置是不允许外界访问的,连接Redis只能通过本地(127.0.0.1)来连接,而不能使用网络IP(192.168.1 ...

常用的Webservice接口

常用的Webservice接口 . 查询手机:http://www.yodao.com/smartresult-xml/search.s?type=mobile&q=手机号码 . 查询IP:h ...

RGB to HSI&comma; HSI to RGB Conversion Calculator

The RGB color model is an additive system in which each color is defined by the amount of red, green ...

SQL Server 2005 数据库复制(转载)

对于一个地域分散的大型企业组织来说,构建具有典型的分布式计算机特征的大型企业管理信息系统时,总要解决一个很重要的问题:如何在多个不同数 据库服务器之间保证共享数据的一致性.之所以有这个重要的问题在于企 ...

eclipse设置系统字体

1. 打开eclipse-->Window-->Preferences-->General-->appearance-->Colors and Fonts, 点开后选择B ...

认识CSS样式

CSS全称为“层叠样式表 (Cascading Style Sheets)”,它主要是用于定义HTML内容在浏览器内的显示样式,如文字大小.颜色.字体加粗等. 如下列代码: p{ font-size: ...

Spring3&period;2 HelloWorld

直接上图吧: jar包: 项目文件夹一览: 这里的HelloWeb-servlet,xml 是在WEB-INF 下 HelloController: package com.cqu.tutorial; ...

UltraEdit 中的常用正则表达式

正则表达式 (UltraEdit Syntax):   % 匹配行首 - 表明要搜索的字符串一定在行首.   $ 匹配行尾 - 表明要搜索的字符串一定在行尾   ? 匹配除换行符外的任一单个字符.   ...

手把手教你安装nmon

一.nmon简介 nmon是由IBM 提供.免费监控 AIX 系统与 Linux 系统资源的工具.该工具可帮助在一个屏幕上显示服务器系统资源耗用情况,并动态地对其进行更新.此外,他还可以利用 exce ...

全排列 permutation

给定一个数字列表,返回其所有可能的排列 lintcode package www.dxb.com; import java.util.List;import java.util.ArrayList; ...

linux 内核通知,[Linux] 内核通知链 notifier相关推荐

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

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

  2. 深入理解Linux内核通知链(Notifier)

    数据结构 内核使用struct notifier_block结构代表一个notifier typedef int (*notifier_fn_t)(struct notifier_block *nb, ...

  3. Linux内核通知链(notifier chain)

    1.概述 Linux内核中各个子系统相互依赖,当其中某个子系统状态发生改变时,就必须使用一定的机制告知使用其服务的其他子系统,以便其他子系统采取相应的措施.为满足这样的需求,内核实现了事件通知链机制( ...

  4. Linux 2.6 menuconfig内核编译配置选项详解

    Code maturity level options 代码成熟度选项 Prompt for development and/or incomplete code/drivers 显示尚在开发中或尚未 ...

  5. linux rootkit手动排查,Linux Rootkit如何避开内核检测的

    Rootkit在登堂入室并得手后,还要记得把门锁上. 如果我们想注入一个Rootkit到内核,同时不想被侦测到,那么我们需要做的是精妙的隐藏,并保持低调静悄悄,这个话题我已经谈过了,诸如进程摘链,TC ...

  6. Linux用户态与内核态通信的几种方式(待完善)

    文章目录 1. 内核启动参数 2.模块参数与sysfs 3.sysctl 4.系统调用 5.netlink 6. procfs(/proc) 7.seq_file 8.debugfs 9.relayf ...

  7. linux 失能鼠标,Linux内核中CPU主频和电压调整 (一)

    通过动态改变CPU电压,可以调整CPU主频. 通过改变时钟倍数可以动态改变CPU时钟频率. 一些具有CPU主频率时钟倍数可调能力的处理器,能够在不同的主频率和工作电压之间动态切换:而不需要内核或者用户 ...

  8. linux mint 18.3 内核,Linux Mint Linux用户可以升级到18.2 18.3”

    Linux Mint Linux用户可以升级到18.2 18.3"现在应该在造币厂"的技术 Linux Mint的升级路径--从"索尼娅".现在的操作系统是一个 ...

  9. Linux kernel 3.10内核源码分析--TLB相关--TLB概念、flush、TLB lazy模式

    一.概念及基本原理 TLB即Translation Lookaside Buffer,是MMU中的一种硬件cache,用于缓存页表,即缓存线性地址(虚拟地址)到物理地址的映射关系. 如果没有TLB,那 ...

最新文章

  1. linux shell 替换字符串的几种方法,变量替换${},sed,awk
  2. golang LMDB入门例子——尼玛,LMDB的文档真的是太少了
  3. Visual studio 2010 sp1中文版正式版无法安装Silverlight5_Tools rc1 的解决办法
  4. 使用vue.js devtools遇到的磕磕绊绊
  5. poj 3469(最小割)
  6. tsc244标签编辑软件_能打小票的标签机,M110智能标签打印机来了!
  7. 那时我大约5岁的飞鸽传书
  8. 监听浏览器是否被缩放 - 案例篇
  9. 第一章: 新的结构化元素
  10. Java中的四种内部类
  11. OSPFv3报文中Option字段变化简介
  12. cygwin的离线安装包
  13. 这40份酷炫的 Python 可视化大屏,简直太爱了
  14. Halcon常用图像预处理算子总结
  15. ic 卡获取帐号apdu指令_APDU指令格式解析
  16. Kali Linux学习入门
  17. 为你的企业建立竞争情报系统 (转)
  18. 视频录制后有噪音怎么办?教你简答几步去除视频噪音!
  19. 京东QQ都没有的牛轰特效、两个ListView联动效果,不用stickyheaderlistview,
  20. Windows 2008 Server R2 桌面体验

热门文章

  1. 好文分享:一切都是最好的安排
  2. 在VMware WorkStation中安装Windows Server 2016
  3. 大疆无人机飞控软件介绍
  4. 【笔记】Oracle触发器,根据另外一张表是否存在此记录,来判断是否更新
  5. 普通最小二乘法,加权最小二乘法,广义最小二乘法之初次理解
  6. 【应用回归分析】CH3 回归参数的估计6——广义最小二乘估计
  7. GSWiFi校园网路由器设置方法最新版
  8. EtherCAT之Lan9252调试笔记
  9. LAN9252芯片介绍
  10. pythonsze_python学习笔记二 数据类型(基础篇)