之前我们学过可以通过应用程序获取设备的数据。其实更简单的方法是直接在终端输入命令 hexdump /dev/input/event4,就能直接看到这些数据。这些数据显示的就是设备输入事件的原始格式。用这个命令查看完全不用自己写程序,操作起来更快也更方便。
一、input_event
uapi/linux/input.h

在 input_event 数据包中,有四个成员变量:
- time
- type
- code
- value
这些成员变量的值在使用 hexdump 命令获取到的数据中是以字节的形式存储的,每个字节都以十六进制的形式表示。为了将 hexdump 输出的数据与 input_event 数据包中的成员值对应起来,你需要了解数据包的字节顺序(即字节序)和每个成员的字节大小。
一般情况下,input_event 数据包的字节顺序是小端字节序(Little Endian)。这意味着较低的字节位于较高的内存地址处。对于每个成员变量,可以根据其字节大小来确定在 hexdump 输出中对应的字节范围。
在 /usr/include/x86_64-linux-gnu/bits/types.h 文件中有如下定义:
INFO
time.tv_sec和time.tv_usec的类型是long int,占 8 个字节__u16 type的类型是unsigned short int,占 2 个字节__u16 code的类型是unsigned short int,占 2 个字节__s32 value的类型是signed int,占 4 个字节
二、案例
假设 hexdump 输出的数据(以 16 进制表示)如下:
INFO
hexdump /dev/input/event2
0000000 0f09 65d3 0000 0000 36fb 0001 0000 0000
0000010 0003 0039 0000 0000 0f09 65d3 0000 0000
0000020 36fb 0001 0000 0000 0003 0035 00f5 0000
0000030 0f09 65d3 0000 0000 36fb 0001 0000 0000
0000040 0003 0036 02b2 0000 0f09 65d3 0000 0000
0000050 36fb 0001 0000 0000 0003 0030 0021 0000
对应的成员值如下:
tv_sec: 0f09 65d3 0000 0000tv_usec: 36fb 0001 0000 0000type: 0003code: 0039value: 0000 0000