1.概述
输入设备是典型的字符设备,一般工作机制是:底层在按键,触摸等动作发生时产生一个中断,然后cpu通过SPIIIC或者外部存储器总线读取键值,坐标等数据,放入一个缓冲区,字符设备驱动管理该缓冲区,而驱动的read接口让用户可以读取键值,坐标等数据。
Linux系统中,输入子系统由输入子系统设备驱动层,输入子系统核心层和输入子系统时间处理层组成。
- 设备驱动层:提供对硬件各寄存器的读/写访问和将底层硬件对用户输入访问的相应转换为标准输入事件,再通过核心层提交给事件处理层
- 核心层:对下提供了设备驱动层的编程接口,对上提供了时间处理层的编程接口
- 事件处理层:为用户空间的应用程序提供了统一访问设备的接口和驱动层提交来的事件处理
这些设计,使得输入设备的驱动不再关心对设备文件的操作,而关心对各硬件寄存器的操作和提交的输入事件
2.关键数据结构
- input_dev:表示底层硬件设备,是所有输入设备的抽象
- input_handle:连接底层硬件和上层事件处理层
- input_handler:表示事件处理,是对事件处理的抽象
3.软件设计流程
- 分配一个输入设备
- 注册一个输入设备
- 向上提交输入事件
- 注销一个输入设备
- 释放一个输入设备
4.相关API
- input_allocate_device:分配输入设备
- input_register_device:向输入子系统核心注册输入设备
- set_bit:告诉输入子系统支持的事件
- input_event:报告指定type,code的输入事件
- input_report_key:报告键值
- input_report_rel:报告相对坐标
- input_report_abs:报告绝对坐标
- input_sync:报告同步事件
- input_free_device:释放input_dev结构体
- input_unregister_device:注销一个输入设备