1.linux input子系统

292 阅读2分钟

1、什么是input子系统

在linux内核中,为了统一各种各样的输入型设备(鼠标、键盘、触摸等),格式化输入型事件,便于应用层使用而形成的子系统。

2、4个结构体

Input_device: 代表着具体的输入设备,它直接从硬件中读取数据,并以事件的形式转发

Hanler: 代表接收某一类事件的上层接口,对应于一类事件设备文件(evdev)

Handle: 用于将input_device 和 handler 连接起来,对应于某1个具体的设备文件

Client: 对应于用户程序对文件的访问接口,每open一次事件驱动,就创建一个client

1644676651.png

  1. input_dev_list连接所有input_dev
  2. input_handler_list连接所有input_handler
  3. 一个handle对应一个dev与一个handler
  4. 一个dev可以对应不只一个handler,有对应的handle来连接它们的handler
  5. 一个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、流程图

右键另存为可获取清晰图片

input.png