关键结构体解析:

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 :表示离开触摸屏

 

有了这些基础,我们编写一个应用程序测试一下当我们在触摸屏上按下再离开时,得到的关于这次事件的信息有哪些?

 

input_event 详解-Touch Screen

input_event 详解-Touch Screen

input_event 详解-Touch Screen

 

以上,就是运行应用程序后,单次接触触摸屏并快速离开后,触摸IC检测到的触摸事件信息。

可以看出,一次触摸信息是以type = 1,code = 330 , value = 1 开始,type = 1,code = 330 , value = 0 结束。中间多次上报坐标、压力等信息组成。因为是单点触摸,所以开始到结束过程中的上报信息中区分触摸点的触摸ID 都保持了一致。压力值这个似乎上报的是默认值,接触点坐标(371,558)。time-s:表示秒钟 time-us:表示微秒,记录了整个过程的时间点。

相关文章: