Linux & Android 多点触摸协议

Android4.0多点触摸入门

1 KERNEL

  对于触摸屏的驱动我们简单的划分为两个主要的部分,一个是注册,另一个是上报。

1.1 注册

  单点触摸信息是以ABS承载并按一定顺序发送,如BTN_TOUCH、ABS_X、ABS_Y、SYNC。而多点触摸信息则是以ABS_MT承载并按一定顺序发送,如ABS_MT_POSITION_X、ABS_MT_POSITION_Y,然后通过调用input_mt_sync()产生一个 SYN_MT_REPORT event来标记一个点的结束,告诉接收方接收当前手指的信息并准备接收其它手指的触控信息。最后调用 input_sync()函数上报触摸信息开始动作并告诉接收方开始接收下一系列多点触摸信息。

1.2 上报

  协议定义了一系列ABS_MT事件,这些事件被分为几大类,允许只应用其中的一部份,多点触摸最小的事件集中包括 ABS_MT_TOUCH_MAJOR、ABS_MT_POSITION_X和 ABS_MT_POSITION_Y,以此来实现多点触摸。如果设备支持ABS_MT_WIDTH_MAJOR这个事件,那么此事件可以提供手指触摸接触面积大小。触摸方向等信息可以由ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MINOR and ABS_MT_ORIENTATION提供。ABS_MT_TOOL_TYPE提供触摸设备的类别,如手或是笔或是其它。最后有些设备可能会支持 ABS_MT_TRACKING_ID,用来支持硬件跟踪多点信息,即该点属于哪一条线等。

2、 framework

    在Android 4.0中,Event Input地位提高了.在Adroid2.3.5中,它在frameworks/base/libs/ui之下,在Android4.0中,它在 frameworks/base/services/input之下,看到没有,它有了自己的地位,就像在Kernel中一样,有自己门户了。

  在此文件夹下,目前主要研究两个文件,一个是EventHub.cpp,另一个是InputReader.cpp两个文件。EventHub.cpp主要是完成设备的扫描和识别。而InputReader.cpp完成对设备上报的原始数据的处理工作。

  而具体的对于APP开发人员来讲主要的数据是通过MotionEvent.java获取。而MotionEvent.java是通过JNI机制与底层进行通信的。

frameworks/base/core/java/android/view/MotionEvent.java --> jni --> frameworks/base/core/jni/android_view_MotionEvent.cpp

3、app

       参考代码TouchExample.java & TouchExampleActivity.java

Linux & Android 多点触摸协议

 单点触摸信息是以ABS承载并按一定顺序发送,如BTN_TOUCH、ABS_X、ABS_Y、SYNC。而多点触摸信息则是以ABS_MT承载并按一定顺序发送,如ABS_MT_POSITION_X、ABS_MT_POSITION_Y,然后通过调用input_mt_sync()产生一个 SYN_MT_REPORT event来标记一个点的结束,告诉接收方接收当前手指的信息并准备接收其它手指的触控信息。最后调用 input_sync()函数上报触摸信息开始动作并告诉接收方开始接收下一系列多点触摸信息。

  协议定义了一系列ABS_MT事件,这些事件被分为几大类,充许只应用其中的一部份,多点触摸最小的事件集中应包括ABS_MT_TOUCH_MAJOR、ABS_MT_POSITION_X和 ABS_MT_POSITION_Y,以此来实现多点触摸。如果设备支持ABS_MT_WIDTH_MAJOR这个事件,那么此事件可以提供手指触摸接触面积大小。触摸方向等信息可以由ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MINOR and ABS_MT_ORIENTATION提供。ABS_MT_TOOL_TYPE提供触摸设备的类别,如手或是笔或是其它。最后有些设备可能会支持ABS_MT_TRACKING_ID,用来支持硬件跟踪多点信息,即该点属于哪一条线等。

下面是两点触摸支持的最小事件集序列:

ABS_MT_TOUCH_MAJOR

ABS_MT_POSITION_X

ABS_MT_POSITION_Y

SYN_MT_REPORT //上报第一个点

ABS_MT_TOUCH_MAJOR

ABS_MT_POSITION_X

ABS_MT_POSITION_Y

SYN_MT_REPORT //上报第二个点

SYN_REPORT //开始动作

Event 原语

“接触”一词用来描述一个物体直接碰到另一个物体的表面。

ABS_MT_TOUCH_MAJOR描述了主接触面的长轴,它和X,Y同一个单位,如果一个面的分辨率为X*Y,则ABS_MT_TOUCH_MAJOR的最大值为sqrt(X2+Y2)

ABS_MT_TOUCH_MINOR描述了接触面的短轴,如果接触面是圆形,它可以不用。

ABS_MT_WIDTH_MAJOR描述了接触工具的长轴

ABS_MT_WIDTH_MINOR描述了接触工具的短轴

ABS_MT_TOUCH_MAJOR := max(X, Y)

ABS_MT_TOUCH_MINOR := min(X, Y)

ABS_MT_ORIENTATION := bool(X > Y)

以上四个参数可以用来生成额外的触摸信息,如ABS_MT_TOUCH_MAJOR/ABS_MT_WIDTH_MAJOR的比率可以用来描述压力。

ABS_MT_ORIENTATION

ABS_MT_POSITION_X接触面的中心点X坐标

ABS_MT_POSITION_Y接触面的中心点Y坐标

ABS_MT_TOOL_TYPE描述接触工具类型,很多内核驱动无法区分此参数如手指及笔,如果是这样,该参数可以不用,协议目前支持MT_TOOL_FINGER和MT_TOOL_PEN两种类型。

ABS_MT_BLOB_ID形状集ID,集合几个点以描述一个形状,很多驱动没有形状属性,此参数可以不用。

ABS_MT_TRACKING_ID描述了从接触开始到释放的整个过程的集合,如果设备不支持,此参数可是不用。

触摸轨迹

  仅有少数设备可以明触的标识真实的 trackingID,多数情况下 trackingID只能来标识一次触摸动作的过程。

手势

  多点触摸指定的应用是创建手势动作, TOUCH和 WIDTH参数经常用来区别手指的压力和手指间的距离,另外 MINOR类的参数可以用来区别设备的接触面的大小(点接触还是面接触),ORIENTATION可以产生旋转事件。

Android Input系统之触摸屏

最近开始在TI平台调试触摸屏,之前研究过Android的Event输入设备驱动,对键盘比较了解。Input驱动程序包含游戏杆、鼠标和事件设备3中驱动,而键盘和触摸屏都输入事件设备。

Input驱动程序的主设备号是13,3种驱动程序的设备号分配是:

游戏杆:0~31

鼠标:32~62

mice鼠标:63

事件设备:64~95

每种Input设备占用5位,每种设备个数是32。Event设备在文件系统中的设备节点是:/dev/input/eventX。

Android针对输入子系统设备有一套统一的架构,基本层次结构:

其详细结构:

触摸屏驱动分析:

Host端通过IIC总线,从芯片读出需要的数据,一般为X,Y的绝对坐标,还有数据的标志位。采用的触摸屏最多支持五点触摸,因此驱动代码相对单点触摸相对复杂些。

在probe函数的设备初始化阶段的input_set_abs_params()函数设置方式不同:

ifdef CONFIG_MULTITOUCH

set_bit(ABS_MT_TOUCH_MAJOR, input_dev->absbit);

set_bit(ABS_MT_POSITION_X, input_dev->absbit);

set_bit(ABS_MT_POSITION_Y, input_dev->absbit);

set_bit(ABS_MT_WIDTH_MAJOR, input_dev->absbit);

input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, SCREEN_MAX_X, 0, 0);

input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, SCREEN_MAX_Y, 0, 0);

input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, PRESS_MAX, 0, 0);  //相当于单点屏的ABS_PRESSURE
input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, 0, 200, 0, 0);

else

set_bit(ABS_X, input_dev->absbit);

set_bit(ABS_Y, input_dev->absbit);

set_bit(ABS_PRESSURE, input_dev->absbit);

set_bit(BTN_TOUCH, input_dev->keybit);

input_set_abs_params(input_dev, ABS_X, 0, SCREEN_MAX_X, 0, 0);

input_set_abs_params(input_dev, ABS_Y, 0, SCREEN_MAX_Y, 0, 0);

input_set_abs_params(input_dev, ABS_PRESSURE, 0, PRESS_MAX, 0 , 0);

endif

在android 4.0上开发触摸设备驱动需要注意的几点

android 4.0已经渐渐流行,很多方案都已经基于其上,android 4.0的linux内核版本已经更新为linux 3.0,这个变化导致和内核直接接触的驱动需要或多或少的变化,以下描述的是触摸设备驱动的一些小变化:

1.当一个(这时候的情境应该是多点触摸的情况)手指或是触摸工具抬起(UP)时,他应该立即消失在多点出没的同步报告中,当所有的工具或手指抬起,驱动应该立即发送一个“空”同步消息,使用SYN_MT_REPORT其次是SYN_REPORT。

之前的版本是向上报告一个presssure为0的消息,现在新的多点触摸协议已经不再兼容旧的协议了。

2.物理接触或是信号强度将使用ABS_MT_PRESSURE上报。

之前的版本是用ABS_MT_TOUCH_MAJOR上报这个消息,同样,旧的方式也已经不被兼容了。

3.触摸接触面积使用ABS_MT_TOUCH_MAJOR向上报告

旧的版本使用ABS_MT_TOOL_MAJOR向上报告,旧的方式也已经不被兼容了。

触摸设备驱动程序不再需要特定的Android定制。依靠标准的Linux输入协议,Android可以更广泛支持触摸外设,如外部HID多点触摸触摸屏,使用未修改的驱动程序。

example:

static irqreturn_t xxx_ts_irq_handler(int irq, void *dev_id)

{

struct xxx_ts_data *ts = dev_id;

struct xxx_ts_finger *finger = ts->finger;

struct input_dev input_dev = ts->input_dev;

int count = 0;

int i, ret;

ret = xxx_ts_read_data(ts);

if (ret < 0)

goto end;

/
multi touch protocol /

for (i = 0; i < MAX_FINGERS; i++) {

if (!finger[i].is_valid)

continue;

input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR, finger[i].t);

input_report_abs(input_dev, ABS_MT_POSITION_X, finger[i].x);

input_report_abs(input_dev, ABS_MT_POSITION_Y, finger[i].y);

input_mt_sync(input_dev);

count++;

}

/
SYN_MT_REPORT only if no contact /

if (!count)

input_mt_sync(input_dev);

/
SYN_REPORT */

input_sync(input_dev);

end:

return IRQ_HANDLED;

}

Linux & Android 多点触摸协议的更多相关文章

  1. Linux/Android多点触摸协议

    链接点击打开链接 关于Linux多点触摸协议大家可以参考kernel中的文档:https://www.kernel.org/doc/Documentation/input/multi-touch-pr ...

  2. Linux/Android多点触摸协议【转】

    本文转载自: 链接点击打开链接 关于Linux多点触摸协议大家可以参考kernel中的文档:https://www.kernel.org/doc/Documentation/input/multi-t ...

  3. Linux Android 多点触摸协议 原文出自【比特网】,转载请保留原文链接:http://soft.chinabyte.com/os/71/12306571.shtml

    为了使用功能强大的多点触控设备,就需要一种方案去上报用户层所需的详细的手指触摸数据.这个文档所描述的多点触控协议可以让内核驱动程序向用户层上报任意多指的数据信息. 使用说明 单点触摸信息是以ABS承载 ...

  4. Linux与Android 多点触摸协议【转】

    本文转载自:http://blog.csdn.net/xubin341719/article/details/7833277 一.Linux与Android 多点触摸协议 为了使用功能强大的多点触控设 ...

  5. Android 中多点触摸协议

    http://blog.csdn.net/zuosifengli/article/details/7398661 Android 中多点触摸协议: 参考: http://www.kernel.org/ ...

  6. 内核中的多点触摸协议文档 Multi【转】

    转自:http://www.arm9home.net/read.php?tid=24754 前段时间改写了一个GT801的内核驱动,仔细阅读 MT Event 上报的时候,发现这个驱动是针对 Andr ...

  7. CTP多点触摸协议【转】

    转自:http://blog.chinaunix.net/uid-26403844-id-5063920.html linux kernel 2.6.30开始对多点触摸支持,最近高通要求所有CTP器件 ...

  8. Android多点触摸放大缩小图片

    1.Activity package com.fit.touchimage; import android.app.Activity; import android.graphics.Bitmap; ...

  9. 搞定android多点触摸模拟

    原理在android 创建多点触摸虚拟设备,然后往设备写模拟数据可以

随机推荐

  1. java-访问控制修饰符

    访问权限 public    任何情况都可以访问 默认包 本包范围内可以访问到 protect       同一个包里的所有类所可以访问:所有子类(子类可以不和父类在同一个包)都可以访问 privat ...

  2. 判断移动端和pc端最简单的方法

    <!DOCTYPE html><html><head> <title></title> <script type="text ...

  3. OC中的block作方法参数时的用法

    方式一.在传参时直接声明block回调方法. 1. 定义方法: - (int)doTest:(NSString *)name success:(int (^)(int param1, int para ...

  4. get请求中url传参中文乱码问题

    在项目中经常会遇到中文传参数,在后台接收到乱码问题.那么在遇到这种情况下我们应该怎么进行处理让我们传到后台接收到的参数不是乱码是我们想要接收的到的,下面就是我的一些认识和理解. 一:get请求url中 ...

  5. salt 通信及其安全

    salt 通信及其安全 模型架构 server-agent通信模型: server就是salt master; agent就是salt-minion salt也可以作为一个单点服务器管理工具使用,或者 ...

  6. 质数,$\varphi$和$\mu$线性筛

    typedef long long ll; bool check[N]; int mu[N],pri[N],tot; ll phi[N]; void init(int lim){ check[]=,p ...

  7. compileReleaseJavaWithJavac

    如果你打release 包的时候,出现这个问题,那么请你先跑一下程序,肯定是有什么方法名,或者什么东西没找到. release 的时候不会报错,只有你跑的时候才会报错.

  8. CSS的z-index & 绝对定位与相对定位

    1.在有些情况下,需要仔细地控制元素在网页中堆叠顺序.z-index样式属性让你能够设置元素的堆叠顺序. 堆叠元素时,z-index值较大的元素在z-index值较小的下面. 2.z-index值仅在 ...

  9. 直接选择排序&堆排序

    1.什么是直接选择排序? 直接选择排序(Straight Select Sort)是一种简单的排序方法,它的基本思想是:通过n-i次关键字之间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i ...

  10. 2018"百度之星"程序设计大赛 - 资格赛 - 题集

    1001 $ 1 \leq m \leq 10 $ 像是状压的复杂度. 于是我们(用二进制)枚举留下的问题集合 然后把这个集合和问卷们的答案集合 $ & $ 一下 就可以只留下被选中的问题的答 ...