什么是输入系统?

​ 在了解输入系统之前,先来了解什么是输入设备?常见的输入设备有键盘、鼠标、遥控杆、书写板、触摸屏等等,用户通过这些输入设备与Linux系统进行数据交换,Linux系统为了统一管控和处理这些设备,于是就实现了一套固定的与硬件无关的输入系统框架,供用户空间程序使用,这就是输入系统。

​ 在Linux输入系统中,主要分三层进行管理,分别是input core(输入系统核心层)、drivers(输入系统驱动层)以及event handlers(输入系统事件层),如下图所示,这就是Linux输入系统的基本框架:

举个非常简单的例子,比如用户按下键盘里的其中一个按键,它遵循流程是这样的:
​ 按键按下–>输入系统驱动层–>输入系统核心层–>输入系统事件层—>用户空间
​ 对于应用程序软件编程的角度,我们只需要关注用户空间是怎么得到按键按下以后获取的是什么事件就可以了,例如我想知道我当前按下的按是短按还是长按?或者我想知道当前我按下键盘的是空格键还是回车键等等。

用户空间的设备节点那么多,怎么知道当前是哪个设备上报的呢?例如想知道键盘是由哪个设备节点上报的,就可以通过以下这条指令来获取:

cat /proc/bus/input/devices

这条指令的含义就是获取与event对应的相关设备信息,在ubuntu系统上,我们输入这个指令可以看到以下结果:

那么这里的I、N、P、S、U、H、B对应的每一行是什么含义呢?
I:id of the device(设备ID)
该参数由结构体struct input_id来进行描述

41 struct input_id {
42 	//总线类型
43 	__u16 bustype;
44 	//与厂商相关ID
45 	__u16 vendor;
46 	//与产品相关ID
47 	__u16 product;
48 	//版本ID
49 	__u16 version;
50 };

N:name of the device
设备名称
P:physical path to the device in the system hierarchy
系统层次结构中设备的物理路径。
S:sysfs path
位于sys文件系统的路径
U:unique identification code for the device(if device has it)
设备的唯一标识码
H:list of input handles associated with the device.
与设备关联的输入句柄列表。
B:bitmaps(位图)
PROP:device properties and quirks.
EV:types of events supported by the device.
KEY:keys/buttons this device has.
MSC:miscellaneous events supported by the device.
LED:leds present on the device.
PROP:设备属性和怪癖。
EV:设备支持的事件类型。
KEY:此设备具有的键/按钮。
MSC:设备支持的其他事件。
LED:设备上的指示灯。
通过了解以上参数的含义,结合以下指令

cat /proc/bus/input/devices

显示出来的信息很容易可以知道event1即是键盘上报的事件设备节点,通过读取这个event1即可获得当前用户按下的按键具体是哪个事件。

hexdump /dev/input/event1

hexdump序号

微秒
事件类型
事件值
具体设备对应值的含义

这些数值是通过input_event结构体来上报的,它位于/usr/include/linux/input.h这个头文件,input_event结构体描述如下:

24 struct input_event {
25 	//事件发生的事件
26 	struct timeval time;
27 	//事件类型
28 	__u16 type;
29 	//事件值
30 	__u16 code;
31 	//该事件上报的数值
32 	__s32 value;
33 };

而input_event结构体中的time即是:

1 struct timeval
2 {
3 	__time_t tv_sec;        /* Seconds. */
4 	__suseconds_t tv_usec;    /*Microseconds. */
5 };

其中tv_sec为Epoch到创建struct timeval时的秒数,tv_usec为微秒数,即秒后面的零头,Epoch的意思是指定为1970年一月一日凌晨零点零分零秒,格林威治时间。
回到input_event结构体,事件类型type主要有以下三种,分别是:相对事件、绝对事件、键盘事件
例如:鼠标就是一个相对事件,有些情况下也有可能是绝对事件,当移动鼠标的时候,type类型也就是底层上报给用户的事件类型,那么code表示的就是相对于鼠标当前的位置的X或者Y的坐标,value则表示相对于当前的位置偏移了多少。

事件类型(type)
文件头文件路径:

/usr/include/linux/input-event-codes.h

当然Linux内核版本较低的有可能在以下路径的这个头文件:
```
/usr/include/linux/input.h

作者:SteveChen  创建时间:2024-12-12 08:52
最后编辑:SteveChen  更新时间:2024-12-12 08:59