按键中断解决irq_of_parse_and_map返回0的问题--Apple的学习笔记我为了复习相关函数和io模型,所以自己写按键中断,其实linux中有input子系统就像pinctrl子系统一样,已经抽象的写好了按键驱动。因为一般的驱动就是要实现open,read,write的io模型。所以linux内核都帮我们写好了。我们可以复用。到document的input文件夹中看相关帮助资料。网上资料也一大堆。
A.今天的学习目标:
- 看内核代码,熟悉input子系统框。
- 会参考已经有的input子系统driver,自己使用input子系统框架来实现按键中断driver。
- 直接使用gpio-key的driver来实现按键中。
B.input子系统框学习
image.pnglinux内核空间主要分三层
a,驱动层:输入设备的具体驱动程序
b, 核心层:承上启下,为驱动层提供输入设备注册的操作接口,通知事件层对输入事件进行处理
c,事件层:和用户空间交互。
C.input子系统关键数据结构
input_dev 输入设备
input_handler 事件处理器
input_handle 连接结构体
我本来在想为什么要加一个input_handle,直接连接dev和handler不就可以了。后来网上查了,因为不是一对一而是可以1对多的关系。一个设备可以对应多个事件,一个事件也可以对应多个设备。
D.内核代码分析
input_register_handler开始到最后connect,可以参考
12.Linux之输入子系统分析(详解),此文描述的比较好。
E.实践
实验1,使用input子系统,自己写驱动。--已完成
实验2,直接使用gpio-key,通过修改设备树完成驱动。--已完成
F.小结
一,关于中断中的锁使用
- spin_lock--不会关中断,某进程锁住了,然后中断处理程序中也使用了此时由于某进程被挂起,导致中断程序获取不了资源而产生死锁。
- spin_lock_irq--进入中断会关闭中断,退出的时候是开启的。
- spin_lock_irqsave--进入的时候会关闭中断,退出的时候会恢复之前的中断状态。
网友评论