关键结构体解析:
struct input_event {
struct timeval time;
__u16 type;
__u16 code;
__s32 value;
};
type: 上报事件的类型
EV_SYN: 同步事件
EV_KEY:键盘事件
EV_REL: 相对坐标事件-鼠标
EV_ABS: 绝对坐标事件-触摸屏
我们解析一个input event 时,首先要确定type属性,code和value属性都是根据不同的type有不同的含义(在不同的前缀下,找对应的含义)
code: 不同的type,code有不同的含义
type = EV_KEY时,code代表键盘以及鼠标上不同的按键,如code = 9,表示此时event上报的是键盘上数字“9”对应的事件;code = 46,表示此时event上报的是键盘上字母"C“对应的事件
type = EV_REL时,code代表轨迹的类型,指示鼠标移动的方向,如code = 3,表示此时event上报的是鼠标向X轴移动的数据;当code = 4时,表示此时event上报的时鼠标向Y轴移动的数据。
type = EV_ABS时,code代表触摸坐标轴,如code = 0x35 ,表示此时的event上报的就是当前触摸点X轴的坐标;code = 0x36,表示此时的event 上报的就是当前触摸点Y轴的坐标。
value: 不同的code,value有不同的含义(tpye是根),举几个列子:
type = EV_KEY,code = 9, value = 0:表示键盘上数字”9“被放开
type = EV_KEY,code = 9, value = 1:表示键盘上数字”9“被按下
type = EV_ABS,code = 0x35, value = 128:表示触摸点的X轴坐标为128
type = EV_ABS,code = 0x36,value = 560;表示触摸点的Y轴坐标为560
type = EV_ABS, code = 0x3a, value = 50: 表示触摸点的压力值为50
type = EV_ABS, code = 0x39,value = 0: 表示该触摸点的ID = 0,在多点触控式与其他触摸点区分。
每次事件的上报之后还需要完成一次同步上报,通常情况下,同步有固定的格式:
type = 0,code = 0, value = 0:表示同步
type = 0,code = 2, value = 0;表示MT同步
对于触摸屏来说,上面的分析已经涵盖了同步、坐标、压力、多点触控区分等信息了,但是还缺少接触触摸屏和离开触摸屏两个信息。其实,这两个信息是必不可少的信息,对于不同的触控IC有不用的实现(tpye、code、value)。我使用的触控IC是汇顶科技的gt1x系列,在驱动中通过如下事件区分接触和离开触摸屏事件:
type = 1,code = 330 , value = 1 :表示接触触摸屏
type = 1,code = 330 , value = 0 :表示离开触摸屏
有了这些基础,我们编写一个应用程序测试一下当我们在触摸屏上按下再离开时,得到的关于这次事件的信息有哪些?
以上,就是运行应用程序后,单次接触触摸屏并快速离开后,触摸IC检测到的触摸事件信息。
可以看出,一次触摸信息是以type = 1,code = 330 , value = 1 开始,type = 1,code = 330 , value = 0 结束。中间多次上报坐标、压力等信息组成。因为是单点触摸,所以开始到结束过程中的上报信息中区分触摸点的触摸ID 都保持了一致。压力值这个似乎上报的是默认值,接触点坐标(371,558)。time-s:表示秒钟 time-us:表示微秒,记录了整个过程的时间点。