1、什么是input子系统
在linux内核中,为了统一各种各样的输入型设备(鼠标、键盘、触摸等),格式化输入型事件,便于应用层使用而形成的子系统。
2、4个结构体
Input_device: 代表着具体的输入设备,它直接从硬件中读取数据,并以事件的形式转发
Hanler: 代表接收某一类事件的上层接口,对应于一类事件设备文件(evdev)
Handle: 用于将input_device 和 handler 连接起来,对应于某1个具体的设备文件
Client: 对应于用户程序对文件的访问接口,每open一次事件驱动,就创建一个client
- input_dev_list连接所有input_dev
- input_handler_list连接所有input_handler
- 一个handle对应一个dev与一个handler
- 一个dev可以对应不只一个handler,有对应的handle来连接它们的handler
- 一个handler可以对应不只一个dev,有对应的handle来连接它们的dev
3、初始化
输入事件驱动层(input/evdev.c):打包数据,面向应用
- input_register_handler()注册input_handler:加入input_handler_list,遍历input_dev_list进行匹配,创建event设备并使用input_register_handle()注册handle,形成上图关系网
输入核心层(input.c):向下提供注册接口,向上发送数据
输入设备驱动层(input.c):底层驱动,面向硬件
- input_allocate_device();创建一个input_dev
- 设置input_dev的name、属性、参数
- input_register_device()注册input_dev到系统:加入input_dev_list,遍历input_handler_list进行匹配,创建event设备并使用input_register_handle()注册handle,形成上图关系网
4、发送数据
输入事件驱动层(input/evdev.c):打包数据,面向应用
- 每次open设备节点都创建client
- read时client没有数据则阻塞等待(),有数据则拷贝到用户空间
- 从底层有数据来时,打包设备驱动层发送过来的事件
- 通过evdev_events()把数据写入到client->buffer中
- 唤醒等到队列上的进程
输入核心层(input.c):向下提供注册接口,向上发送数据
输入设备驱动层(input.c):底层驱动,面向硬件
- 通过input_event()上报数据,遍历input_dev->h_list,找到handle,再找handler,调用handler->events()(即evdev_events)上报数据
应用层:
- 通过open,read设备节点event获取数据
5、流程图
右键另存为可获取清晰图片