11.检测按键输入(input子系统)¶

11.检测按键输入(input子系统)¶

11.2.2. input事件结构¶

evtest工具的原理并不神秘,学习本章节后也可以尝试自己

使用代码实现它的部分功能。列出可用事件时,它就是通过查

看目录“/dev/input/”实现的。本示例中主机的“/dev/input”目录的内

容如下图所示。

可看到“/dev/input”目录下,有event*、js*、mouse*及mice文件,它们分别是

驱动层evdev(通用输入事件)、joydev(游戏杆)及遗留的mousedev(鼠标)设备暴露

到用户空间的访问接口文件,读取这些文件的内容可获取到设备上报的信息。

在前面LED、GPIO子系统中,brightness、direction等设备文件直接使用字符串来记

录具体的信息,所以使用cat命令输出文件的内容时,字符串的形式非常方便我们阅读。但是event文件包

含的信息较多,使用字符串不方便其它程序处理,它采用了纯粹的内核事件数据结构来记录内容,其它

程序使用时

应把读取到的内容按数据的结构进行格式化转换,该数据结构定义如下所示。

input_event结构体(内核源码的/include/uapi/linux/input.h文件)¶

1

2

3

4

5

6struct input_event {

struct timeval time;

__u16 type;

__u16 code;

__s32 value;

};

time:该变量用于记录事件产生的时间戳,既evtest输出的time值。

type:输入设备的事件类型。系统常用的默认类型有EV_KEY、 EV_REL和EV_ABS,分别用

于表示按键状态改变事件、相对坐标改变事件及绝对坐标改变事件,特别地,EV_SYN用于分隔事件,无特别意义。如果选择鼠标(本章第一个图)

evtest输出的type类型为EV_ABS。相关的枚举值可以参考内核文件include/uapi/linux/input-event-codes.h。

code:事件代号,它以更精确的方式表示事件。例如

在EV_KEY事件类型中,code的值常用于表

示键盘上具体的按键,其取值范围在0~127之间,例如按键Q对应的是KEY_Q,该枚举变量的

值为16。如果选择鼠标, evtest输出内容的code分别有ABS_X/ABS_Y,表示上报的是X或Y坐标。

value:事件的值。对于EV_KEY事件类型,当按键按下时,该值为1;按键松开时,该值为0。如果选择

鼠标,中evtest输出的内容里,ABS_X事件类型中的value值表示X坐标,ABS_Y类型中的value值表示Y坐标。

如果同样使用cat命令查看事件文件,当事件出现时,cat把内容转化成字

符串,会看到乱码,使用这样的方式可以简单地查看设备是否上报了事件。

可使用以下方式可进行测试:

1

2

3

4#根据自己主机上的事件号修改要查看的具体事件文件

#此处使用的event6是本主机的鼠标设备,注意要使用sudo权限

sudo cat /dev/input/event6

#输入命令后移动鼠标,会看到字符

如下图;

与其它文件不同,通常cat命令读取文件内容后就会返回,而此处读取event文件时,命

令会持续地等待输入。

✨ 相关作品

阴阳师判官悬赏封印位置 判官哪里多
365bet中文版客户端

阴阳师判官悬赏封印位置 判官哪里多

📅 06-30 👁️‍🗨️ 8343
网红是怎么红起来的?网红产业细分有哪些?
365bet中文版客户端

网红是怎么红起来的?网红产业细分有哪些?

📅 07-01 👁️‍🗨️ 1357
神武手游盒子掉线怎么办
谁知道365足球网站

神武手游盒子掉线怎么办

📅 06-28 👁️‍🗨️ 7697