基础知识
- Linux 内核输入子系统是对分散、多种不同类别的输入设备(鼠标、键盘、触摸屏、手写板等)进行统一的驱动程序。优势:统一物理形态各异相似输入设备处理功能;提供分发输入报告给用户应用程序的简单事件接口;抽取输入驱动程序并且引进一致性。输入子系统架构视图如下:
- 设备驱动程序可以利用已存在的、合适的事件驱动程序通过输入核心和用户应用程序接口。
设备驱动程序是指输入设备驱动程序,而不是输入事件驱动程序
- 输入事件驱动程序分析:事件驱动程序提供一个硬件无关的抽象,方便与输入设备进行交互。将 GUI 和各种底层硬件隔离起来。
输入设备驱动程序分析
键盘(PC 键盘、USB 与蓝牙键盘)
键盘内部处理流程:键盘控制器扫描键盘矩阵,译码->键盘设备驱动程序在 serio
指引下,针对每个键按下与释放,从键盘控制器读取原始的扫描码->输入模式(键盘设备驱动程序转换接受到扫描码为键值->根据加载的键盘映射,键盘事件驱动程序进行键值翻译)
鼠标(PS/2 鼠标,Trackpoint, Touchpad, USB 与蓝牙鼠标)
输出事件(一些设备驱动程序也是处理输出事件)
数据结构(struct input_dev)
input_event
为事件传输的载体,输入子系统的事件封装struct input_event
结构体,最后传输给我们用户空间。
input_handler
结构体类型为事件驱动的主体,相当于每一种处理方式对应一个handler
结构体。
常用的内核编程接口
- 向
input
核心注册一个设备
- 向
input
核心删除一个设备
- 产生按键或者按钮单击;在某个方向产生相对移动;在某个方向产生绝对移动
- 注册一个用户事件驱动程序
资料参考:https://github.com/0voice