07、输入子系统上报数据格式
之前我们学过可以通过应用程序获取设备的数据。其实更简单的方法是直接在终端输入命令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 文件中有如下定义:
::: 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 进制表示) 如下:
::: 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 0000
tv_usec: 36fb 0001 0000 0000
type: 0003
code:0039
value: 0000 0000