LinuxAndroid多点触摸协议

LinuxAndroid多点触摸协议
关于Linux多点触摸协议⼤家可以参考kernel中的⽂档: ,⽽这⾥根据实际的例⼦来理解多点触摸协议。
人防系统多点触摸协议有两种,A协议和B协议。
⾸先来看A协议,协议上说了报点格式是这样的,以两点为例:
ABS_MT_POSITION_X x[0]PPPOE 协议
ABS_MT_POSITION_Y y[0]
SYN_MT_REPORT
ABS_MT_POSITION_X x[1]
ABS_MT_POSITION_Y y[1]
SYN_MT_REPORT
xxx0123SYN_REPORT
如果第⼀个触点离开(抬起),这⾥的意思是说还有⼀个触点,需要继续上报这个触点。
ABS_MT_POSITION_X x[1]
ABS_MT_POSITION_Y y[1]
SYN_MT_REPORT
SYN_REPORT
如果两个触点都离开了,那么只需要报告⼀个同步事件就可以了。
SYN_MT_REPORT
SYN_REPORT
⽽代码⽰例如下:
for (i = 0; i < count; i++) {
input_report_abs(input_dev, ABS_MT_POSITION_X, finger[i].x);
input_report_abs(input_dev, ABS_MT_POSITION_Y, finger[i].x);
input_mt_sync(input_dev);
}
if (!count)
input_mt_sync(input_dev);
input_sync(input_dev);
其中count值表⽰触点个数,如果是2个,那么这⾥值就为2,如果所有触点都离开了,那么count值就为0。
上⾯可以说是最简单,也是最基本的A协议报点了。除了报点以外,我们也来关注⼀下input device注册时需要setting的⼀些东西。
input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, MAX_X, 0, 0);
input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, MAX_Y, 0, 0);
无线开关
__set_bit(EV_SYN, input_dev->evbit);
__set_bit(EV_ABS, input_dev->evbit);
__set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
可能你会看到有的代码会多下⾯这两句:
__set_bit(ABS_MT_POSITION_X, input_dev->absbit);
__set_bit(ABS_MT_POSITION_X, input_dev->absbit);
其实这两句(包括上⾯的__set_bit(EV_ABS, input_dev->evbit);)是可有可⽆的,因为在input_set_abs_params函数中会做相应的设置。
⽽这句__set_bit(INPUT_PROP_DIRECT, input_dev->propbit);也是必须要有的,否则在Android中会出现⼀个⽩⾊⼩圆环,感觉像是缺少idc⽂件⼀样。最后通过getevent -p命令看⼀下触摸屏的setting。
add device 1: /dev/input/event1
name:    "ft6x36"
events:
ABS (0003): 0035  : value 0, min 0, max 540, fuzz 0, flat 0, resolution 0
0036  : value 0, min 0, max 960, fuzz 0, flat 0, resolution 0
input props:
INPUT_PROP_DIRECT
对于B协议就稍微显得有点复杂。B协议需要硬件⽀持,和A协议主要区别在哪⾥呢?B协议可以使⽤⼀个ID来标识触点,可以减少上报到⽤户空间的数据量,这个ID(ABS_MT_TRACKING_ID)可以有硬件提供或者从原始数据计算⽽得。那>么下⾯我们就来看B协议怎么上报数据的。
ABS_MT_SLOT 0
数码贴膜
ABS_MT_TRACKING_ID 45
ABS_MT_POSITION_X x[0]背光片
ABS_MT_POSITION_Y y[0]
ABS_MT_SLOT 1
ABS_MT_TRACKING_ID 46
ABS_MT_POSITION_X x[1]
ABS_MT_POSITION_Y y[1]
SYN_REPORT
如果触点45只是在x⽅向做了移动,那么应该怎么报告这个事件呢?
ABS_MT_SLOT 0
ABS_MT_POSITION_X x[0]
SYN_REPORT
可以看到减少了很多数据的上报,这就是同A协议最⼤的区别。
如果同slot 0相关的触点离开(抬起),只需要做下⾯的操作。
ABS_MT_TRACKING_ID -1
SYN_REPORT
这⾥为什么没有发送ABS_MT_SLOT 0事件呢,因为之前slot已经被置成了0,再次发送ABS_MT_SLOT 0是会被忽略掉的。
如果第⼆个触点被抬起,发送下⾯的事件序列。
ABS_MT_SLOT 1
ABS_MT_TRACKING_ID -1
SYN_REPORT
其他event
ABS_MT_POSITION_X和ABS_MT_POSITION_Y是多点触摸协议的最⼩事件集,是最基本的事件,也是必须的事件。除此之外呢,还包括下⾯的⼀些时间集(需要设置⽀持):
ABS_MT_TOUCH_MAJOR
ABS_MT_TOUCH_MINOR
ABS_MT_TOUCH*⽤来表⽰接触点区域⼤⼩(即⼿指与玻璃接触区域⼤⼩),通常接触区域是⼀个椭圆形状,那么MAJOR就表⽰椭圆的长轴,⽽MINOR就表⽰椭圆的短轴。如果接触区域是圆形的话,那么可以忽略MINOR,⽽MAJOR就表⽰圆形的直径⼤⼩。
ABS_MT_WIDTH_MAJOR
ABS_MT_WIDTH_MINOR
上⾯的TOUCH表⽰接触区域的⼤⼩,⽽WIDTH则表⽰为接触⼯具的⼤⼩(例如⼿指,触控笔等)。
ABS_MT_PRESSURE
⽽PRESSURE表⽰压⼒值,这个压⼒值可以通过上⾯的4个参数计算⽽得,例如:
ABS_MT_TOUCH_MAJOR/ABS_MT_WIDTH_MAJOR,可以看到接触⾯积越⼤,压⼒值也就越⼤。当然这个压⼒值也可以直接由设备提供。
ABS_MT_DISTANCE
触点与接触⾯的距离,0表⽰触点在接触⾯的表⾯(已经实实在在的接触到了),⽽正数表⽰在接触⾯的上⽅。
ABS_MT_ORIENTATION
触点的⽅向。
ABS_MT_TOOL_X
ABS_MT_TOOL_Y
ABS_MT_TOOL_TYPE
关于上报虚拟按键
通常触摸屏下⽅都有3个虚拟按键,⽽这3个按键同其它实体按键(例如:power按键、⾳量按键)⼜有所不同,它是触摸屏提供的⼀组虚拟按键,我们通过触摸屏会得到这⼀组按键的坐标值,可以通过这个坐标值上报相应的按键值来实
现按键功能,那么怎么来上报这个按键值呢。⾸先需要对input设备做⼀些setting:
__set_bit(KEY_MENU, input_dev->keybit);
__set_bit(KEY_HOMEPAGE, input_dev->keybit);
__set_bit(KEY_BACK, input_dev->keybit);
__set_bit(EV_KEY, input_dev->evbit);
__set_bit(EV_SYN, input_dev->evbit);
OK,这些键值呢在kernel中是定义在uapi/linux/input.h中的,⽽通常我们的driver只需要包含linux/input.h就可以了,这个⽂件中include了的uapi/linux/input.h。
好的,再来看怎么上报键值。
按键按下:
input_report_key(input_dev, key_value, 1);
input_sync(input_dev);
按键抬起:
input_report_key(input_dev, key_value, 0);
input_sync(input_dev);
如果是按键⼀直被按下,重复上报按键被按下那部分就可以了。
有的地⽅可能会看到直接使⽤input_event函数,例如:
input_event(input_dev, EV_KEY, key_value, 1);
⼤家也可以去看看input_report_key函数,它其实是对input_event函数做了封装,不管是input_report_abs也好,还是input_sync,最终都是调⽤的input_event函数,所以真正上报event的函数其实是input_event函数。
最后⼀点在setting时除了__set_bit之外,可能还会看到另外⼀个函数input_set_capability,这个函数实现在drivers/input/input.c中,⽽它最终还是调⽤了__set_bit函数,所以最后效果都是⼀样的。

本文发布于:2024-09-22 19:34:28,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/283837.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:协议   触点   按键
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议