input 子系统分为 input 驱动层、 input 核心层、 input 事件处理层,最终给用户空间提供可访问的设备节点, input 子系统框架如图 58.1.1.1 所示:

input 驱动编写流程:

input 核心层会向 Linux 内核注册输入设备类名为input这样系统启动以后就会在/sys/class 目录下有一个 input 子目录,并且注册了一个字符设备,主设备号为 13。因此,input 子系统的所有设备主设备号都为 13。我们在使用 input 子系统处理输入设备的时候就不需要去注册字符设备了,我们只需要向系统注册一个 input_device 即可。

 

 

综上所述, input_dev 注册过程如下

 

1.  使用 input_allocate_device 函数申请一个 input_dev

在使用 input 子系统的时候我们只需要注册一个 input 设备即可, input_dev 结构体表示 input设备,此结构体定义在 include/linux/input.h 文件中。

 

2.  初始化 input_dev 的事件类型以及事件值

evbit 表示输入事件类型,可选的事件类型定义在 include/uapi/linux/input.h 文件中,事件类型如下:

keybitrelbit 等等都是存放不同事件所对应的事件值。比如我们本章要使用按键事件,因此要用到 keybit,Linux 内核定义了很多按键事件值,这些按键值定义在 include/uapi/linux/input.h 文件中,按键事件值如下:

3.  使用 input_register_device 函数向 Linux 系统注册前面初始化好的 input_dev

4.  卸载input驱动的时候需要先使用input_unregister_device函数注销掉注册的input_dev然后使用 input_free_device 函数释放掉前面申请的 input_dev.

5.  通过input_event函数或其他函数上报事件及对应的事件值。

我们向 Linux 内核注册好 input_dev 以后还不能高枕无忧的使用 input 设备, input 设备都是具有输入功能的,但是具体是什么样的输入值 Linux 内核是不知道的,我们需要获取到具体的

输入值,或者说是输入事件,然后将输入事件上报给 Linux 内核比如按键,我们需要在按键中断处理函数,或者消抖定时器中断函数中将按键值上报给 Linux 内核,这样 Linux 内核才能获取

到正确的输入值。

6.  上报事件以后还需要使用 input_sync 函数来告诉 Linux 内核 input 子系统上报结束。