1. 输入子系统
连接操作系统的输入设备,可不止一种,也许是一个标准PS/2键盘,也许是一个USB鼠标,或者是一块触摸屏,甚至是一个游戏机摇杆,Linux在处理这些纷繁各异的输入设备的时候,采用的办法还是找中间层来屏蔽各种细节,请看下图:

在Linux的内核中,对输入设备的使用,实际上运用了3大块来管理,他们分别是所谓的输入设备驱动层、输入子系统核心层,以及事件触发层。他们各自的工作分别是:
-
输入设备驱动层:
每一种设备都有其特定的驱动程序,他们被妥当地装载到操作系统的设备模型框架内,封装硬件所提供的功能,向上提供规定的接口。 -
核心层:
此处将收集由设备驱动层发来的数据,整合之后触发某一事件。 -
事件触发层:
这一层是我们需要关注的,我们可以通过在用户空间读取相应设备的节点文件来获知某设备的某一个动作。
以触摸屏为例,当手指在屏幕上滑动的时候,数据流大致是这样的:驱动层中的触摸屏驱动会源源不断地产生触摸屏相关数据,并向上递送给内核输入子系统,输入子系统进一步将这些信息规整为统一的结构体,并借助事件触发层发往对应的设备节点,至此,应用程序即可从这些设备节点读取相关信息。
值得注意的是,底层驱动产生的设备数据与上层应用读取设备数据是两个完全异步的过程,彼此之间是没有耦合和约束的,例如:当底层驱动产生的触摸屏坐标信息比应用层读取的速度要快时,应用程序将会丢失一部分坐标信息。
2. 输入信息结构体
在最靠近应用程序的事件触发层上,内核所获知的各类输入事件,比如键盘被按了一下,触摸屏被滑了一下等,都将被统一封装在一个叫做 input_even 的输入信息结构体当中,这个结构体定义如下:
vincent@ubuntu:/usr/include/linux/$ cat input.h -n
1 #ifndef _INPUT_H
2 #define _INPUT_H
3
...
...
20
21 struct input_event {
22 struct timeval time;
23 __u16 type;
24 __u16 code;
25 __s32 value;
26 };
27
...
1. time
输入事件发生的时间戳,精确到微秒。时间结构体定义如下:
struct timeval
{
__time_t tv_sec; // 秒
long int tv_usec; // 微秒(1微秒 = 10-3毫秒 = 10-6秒)
};
2. type
输入事件的类型。比如:
| 事件类型(typ |
|---|

Linux内核通过输入设备驱动层、输入子系统核心层和事件触发层来管理各种输入设备,如键盘、鼠标、触摸屏等。输入信息结构体input_event用于封装输入事件,包括时间戳、事件类型、事件代码和值。触摸屏操作涉及坐标值和压力值,处理过程中可能因异步导致数据不连续,需借助SYN事件整理。示例代码展示了如何读取和处理触摸屏的划屏和单击事件。
最低0.47元/天 解锁文章
3004





