标签:根据 多点触摸 数据 inline 0x03 iat str repo static
struct input_event {
struct timeval time;
__u16 type;
__u16 code;
__s32 value;
};
struct timeval {
__kernel_time_t tv_sec; /* seconds */
__kernel_suseconds_t tv_usec; /* microseconds */
};
typedef long __kernel_time_t;
typedef int __kernel_suseconds_t;
对于按键
type为事件类型,按键为EV_KEY,在include/linux/input.h中,
code为按键的值,value用于标记按键是按下还是弹起,1是按下,0是弹起。
按下和弹起事件只需上报一次。
对于touch
static inline void input_report_abs(struct input_dev *dev, unsigned int code, int value) 为input_event的封装,函数如下
input_event(dev, EV_ABS, code, value);
type为EV_ABS, #define EV_ABS 0X03,
code的值,根据上报属性的不同,分别如下:
(多点触摸)
ABS_MT_TOUCH_MAJOR和ABS_MT_PRESSURE实现一个应该就可以了。
(单点触摸)input.h中列举了很多属性,但只需实现以下几种即可。
下面一个BTN_TOUCH为点击事件,单点触摸中需要上报点击事件
touch点上报机制
多点触摸
value为对应属性的值,如code为ABS_MT_POSITION_X,则value的值为就为x轴坐标。
当把一个点的信息发送完毕以后,还需加上input_mt_sync(注意:即使只有一个点也需要加上),这个函数转换成input_event事件为
input_event(dev, EV_SYN, SYN_MT_REPORT, 0);
其中#define EV_SYN 0x00, #define SYN_MT_REPORT 2,
则type为0x00,code为2,value为0。
接着再上报第二个点,第二个点上报结束,依旧要上报input_mt_sync,直至最后一次报点结束,加上input_sync,转换成input_event事件为
input_event(dev, EV_SYN, SYN_REPORT, 0);
其中#define EV_SYN 0x00,#define SYN_REPORT 0,
则type为0x00,code为0,value为0。至此报点结束。
点需要一直上报。
Linux 驱动中的例子
input_report_abs(ssd2531_data.input, ABS_MT_TRACKING_ID, 1);
input_report_abs(ssd2531_data.input, ABS_MT_TOUCH_MAJOR, PRESS_STATUS);
input_report_abs(ssd2531_data.input, ABS_MT_POSITION_X, X_COOR);
input_report_abs(ssd2531_data.input, ABS_MT_POSITION_Y, Y_COOR);
input_mt_sync(ssd2531_data.input);
单点触摸
单点上报同多点上报差不多,只是不需要input_mt_sync了,上报过程中需要
input_event(dev, EV_KEY, BTN_TOUCH, 0/1 ); value为1,代表按下,value为0代表抬起。code值为BTN_TOUCH, #define BTN_TOUCH 0x14a;
同样最后结束需要input_sync。
linux驱动的例子‘
input_report_abs(ts.input, ABS_X, ts.xp);
input_report_abs(ts.input, ABS_Y, ts.yp);
input_report_key(ts.input, BTN_TOUCH, 1);
input_sync(ts.input);
input子系统 KeyPad-Touch上报数据格式与机制
标签:根据 多点触摸 数据 inline 0x03 iat str repo static
原文地址:https://www.cnblogs.com/fengliu-/p/10078279.html