Linux INPUT 子系统
按键、鼠标、键盘、触摸屏等都属于输入(input)设备,Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。输入设备本质上还是字符设备,用户只需要负责上报输入事件,比如按键值、坐标等信息,input 核心层负责处理这些事件。
input 子系统简介
input 就是输入的意思,因此 input 子系统就是管理输入的子系统,比如按键输入、键盘、鼠标、触摸屏等等这些都属于输入设备,不同的输入设备所代表的含义不同,按键和键盘就是代表按键信息,鼠标和触摸屏代表坐标信息。input 子系统分为 input 驱动层、input 核心层、input 事件处理层。
input 子系统框架如下图所示:
左边就是最底层的具体设备,比如按键、USB 键盘/鼠标等,中间部分属于
Linux 内核空间,分为驱动层、核心层和事件层,最右边的就是用户空间,所有的输入设备以文件的形式供用户应用程序使用。我们编写驱动程序的时候只需要关注中间的驱动层、核心层和事件层,这三个层的分工如下:
驱动层:输入设备的具体驱动程序,如按键驱动程序,向内核层报告输入内容。
核心层:承上启下,为驱动层提供输入设备注册和操作接口。通知事件层对输入事件进行处理。
事件层:主要和用户空间进行交互。
input 驱动编写流程
我们在使用 input 子系统处理输入设备的时候就不需要去注册字符设备了,我们只需要向系统注册一个 input_device 即可。
1、注册 input_dev
input事件类型如下:
比如我们要使用到按键,那么就需要注册 EV_KEY 事件,如果要使用连按功能的话还需要注册 EV_REP 事件。另外,我们要使用按键事件,还要用到 keybit,keybit 就是按键事件使用的位图,Linux 内核定义了很多按键值。按键
值如下:
我们可以将开发板上的按键值设置为上图的任意一个,比如我们可以将按键值设置为 KEY_0。在编写 input 设备驱动的时候我们需要先申请一个 input_dev 结构体变量,使用input_allocate_device 函数来申请一个 input_dev,此函数原型如下所示:
struct input_dev *input_allocate_device(void)
参数:无。
返回值:申请到的 input_dev。
如果要注销的 input 设备的话需要使用 input_free_device 函数来释放掉前面申请到的input_dev,input_free_device 函数原型如下:
void input_free_device(struct input_dev