在Linux系统中通过Input Device控制触摸屏
随着Linux支持的输入设备越来越多,如果每一种设备都采用完全不同的驱动接口,那么应用程序在开发过程中就需要分别适配各种不同的硬件,软件开发难度将会大大增加。为了统一管理各种输入设备,Linux内核专门设计了Input输入子系统(Input Subsystem)。
它负责统一管理各种输入设备,并向上层应用程序提供一致的访问接口。无论底层连接的是键盘、鼠标还是触摸屏,最终都会以统一的输入事件(Input Event)形式提供给应用程序读取,使应用程序无需关心具体硬件的实现方式。
输入机制
Linux Input 输入子系统采用事件(Event)的方式向应用程序传递输入数据。所谓输入事件是指输入设备在工作过程中产生的一次操作信息,例如按键按下、按键释放、鼠标移动以及触摸屏坐标变化等,都属于输入事件。

不同类型的输入设备虽然硬件结构和工作原理各不相同,但经过 Linux Input 输入子系统处理后,都会被封装成统一格式的输入事件,并提供给应用程序读取。这样一来,应用程序无需关心底层硬件的具体实现,只需要按照统一的数据格式解析输入事件即可。
不同类型的输入设备虽然硬件结构和工作原理各不相同,但经过 Linux Input 输入子系统处理后,都会被封装成统一格式的输入事件,并提供给应用程序读取。这样一来,应用程序无需关心底层硬件的具体实现,只需要按照统一的数据格式解析输入事件即可。
成员说明
Linux使用struct input_event结构体来描述一个输入事件,该结构体定义在Linux内核提供的input.h头文件中,可以在程序中包含头文件 #include <linux/input.h> 结构如下:
(1)type
事件类型(type) 说明
EV_SYN 事件间的分割标志,有些事件可能会在时间和空间上产生延续,比如持续按住一个按键,为了更好地管理这些持续的事件,EV_SYN用以将他们分割成一个个的小的数据包。
EV_KEY 用以描述键盘,按键或者类似键盘的设备的状态变化。
EV_REL 相对位移,比如鼠标的移动,滚轮的转动等。
EV_ABS 绝对位移,比如触摸屏上的坐标值。
(2)code
用于对事件的类型作进一步的描述。比如:当发生EV_KEY事件时,则可能是键盘被按下了,那么究竟是哪个按键被按下了呢?此时查看code就知道了。当发生EV_REL事件时,也许是鼠标动了,也许是滚轮动了。这时可以用code的值来加以区分。
事件类型(type) 事件代码(code) 说明
EV_KEY BTN_TOUCH 触摸屏发生了按压、松开事件
EV_KEY KEY_LEFT 键盘的左箭头发生了按压、松开事件
EV_KEY KEY_RIGHT 键盘的右箭头发生了按压、松开事件
EV_ABS ABS_X 触摸屏发生了x轴坐标事件
EV_ABS ABS_Y 触摸屏发生了y轴坐标事件
(3)value
当code都不足以区分事件的性质的时候,可以用value来确认。比如由EV_REL和REL_WHEEL确认发生了鼠标滚轮的动作,但是究竟是向上滚还是向下滚呢?再比如由由EV_KEY和KEY_F确认了发生键盘上F键的动作,但究竟是按下呢还是弹起呢?这时都可以用value值来进一步判断。
事件类型(type) 事件代码(code) 发生值(value) 说明
EV_KEY BTN_TOUCH 大于0 手指按压了触摸屏
EV_KEY BTN_TOUCH 0 手指松开了触摸屏
EV_ABS ABS_X 213 触摸屏产生了一个233的 x 轴坐标
EV_ABS ABS_Y 448 触摸屏产生了一个448的 y 轴坐标

浙公网安备 33010602011771号