本文转载自:http://blog.csdn.net/xubin341719/article/details/7833277

一、Linux与Android 多点触摸协议

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

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()函数上报触摸信息开始动作并告诉接收方开始接收下一系列多点触摸信息。

协议定义了一系列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,用来支持硬件跟踪多点信息,即该点属于哪一条线等。

  1. 下面是两点触摸支持的最小事件集序列:
  2. ABS_MT_TOUCH_MAJOR
  3. ABS_MT_POSITION_X
  4. ABS_MT_POSITION_Y
  5. SYN_MT_REPORT //上报第一个点
  6. ABS_MT_TOUCH_MAJOR
  7. ABS_MT_POSITION_X
  8. ABS_MT_POSITION_Y
  9. SYN_MT_REPORT //上报第二个点
  10. ………… //完成多点上报
  11. SYN_REPORT //开始动作

2、Event原语

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

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

  1. <span style="white-space:pre">  </span>ABS_MT_TOUCH_MINOR描述了接触面的短轴,如果接触面是圆形,它可以不用。
  2. ABS_MT_WIDTH_MAJOR描述了接触工具的长轴
  3. ABS_MT_WIDTH_MINOR描述了接触工具的短轴
  4. ABS_MT_TOUCH_MAJOR := max(X, Y)
  5. ABS_MT_TOUCH_MINOR := min(X, Y)
  6. 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描述了从接触开始到释放的整个过程的集合,如果设备不支持,此参数可是不用。

3、触摸轨迹

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

4、手势

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

5、在Linux内核支持的基础上,Android在其2.0源码中加入多点触摸功能(android4.0中间层有所不同)

由此触摸屏在Android的frameworks被完全分为2种实现途径:单点触摸屏的单点方式,多点触摸屏的单点和多点方式。

在Linux的input.h中,多点触摸功能依赖于以下几个主要的软件位:

  1. ……
  2. #define SYN_REPORT0
  3. #define SYN_CONFIG1
  4. #define SYN_MT_REPORT2
  5. ……
  6. #define ABS_MT_TOUCH_MAJOR0x30
  7. #define ABS_MT_TOUCH_MINOR0x31
  8. #define ABS_MT_WIDTH_MAJOR0x32
  9. #define ABS_MT_WIDTH_MINOR0x33
  10. #define ABS_MT_ORIENTATION0x34
  11. #define ABS_MT_POSITION_X0x35
  12. #define ABS_MT_POSITION_Y0x36
  13. #define ABS_MT_TOOL_TYPE0x37
  14. #define ABS_MT_BLOB_ID0x38
  15. ……

在Android中对应的软件位定义在RawInputEvent.java中:

  1. ……
  2. public class RawInputEvent {
  3. ……
  4. public static final int CLASS_TOUCHSCREEN_MT = 0x00000010;
  5. ……
  6. public static final int ABS_MT_TOUCH_MAJOR = 0x30;
  7. public static final int ABS_MT_TOUCH_MINOR = 0x31;
  8. public static final int ABS_MT_WIDTH_MAJOR = 0x32;
  9. public static final int ABS_MT_WIDTH_MINOR = 0x33;
  10. public static final int ABS_MT_ORIENTATION = 0x34;
  11. public static final int ABS_MT_POSITION_X = 0x35;
  12. public static final int ABS_MT_POSITION_Y = 0x36;
  13. public static final int ABS_MT_TOOL_TYPE = 0x37;
  14. public static final int ABS_MT_BLOB_ID = 0x38;
  15. ……
  16. public static final int SYN_REPORT = 0;
  17. public static final int SYN_CONFIG = 1;
  18. public static final int SYN_MT_REPORT = 2;
  19. ……

在Android中,多点触摸的实现方法在具体的代码实现中和单点是完全区分开的。在Android代码的EventHub.cpp中,单点屏和多点屏由如下代码段来判定:

  1. int EventHub::open_device(const char *deviceName)
  2. {
  3. ……
  4. if (test_bit(ABS_MT_TOUCH_MAJOR, abs_bitmask)
  5. && test_bit(ABS_MT_POSITION_X, abs_bitmask)
  6. && test_bit(ABS_MT_POSITION_Y, abs_bitmask)) {
  7. device->classes |= CLASS_TOUCHSCREEN | CLASS_TOUCHSCREEN_MT;
  8. //LOGI("It is a multi-touch screen!");
  9. }
  10. //single-touch?
  11. else if (test_bit(BTN_TOUCH, key_bitmask)
  12. && test_bit(ABS_X, abs_bitmask)
  13. && test_bit(ABS_Y, abs_bitmask)) {
  14. device->classes |= CLASS_TOUCHSCREEN;
  15. //LOGI("It is a single-touch screen!");
  16. }
  17. ……
  18. }

我们知道,在触摸屏驱动中,通常在probe函数中会调用input_set_abs_params给设备的input_dev结构体初始化,这些input_dev的参数会在Android的EventHub.cpp中被读取。如上可知,如果我们的触摸屏想被当成多点屏被处理,只需要在驱动中给input_dev额外增加以下几个参数即可:

  1. input_set_abs_params(mcs_data.input, ABS_MT_POSITION_X, pdata->abs_x_min, pdata->abs_x_max, 0, 0);
  2. input_set_abs_params(mcs_data.input, ABS_MT_POSITION_Y, pdata->abs_y_min, pdata->abs_y_max, 0, 0);
  3. input_set_abs_params(mcs_data.input, ABS_MT_TOUCH_MAJOR, 0, 15, 0, 0);//相当于单点屏的ABX_PRESSURE
  4. input_set_abs_params(mcs_data.input, ABS_MT_WIDTH_MAJOR, 0, 15, 0, 0);//相当于单点屏的ABS_TOOL_WIDTH

由于多点触摸技术需要采集到多个点,然后再一起处理这些点,所以在软件实现中需要保证每一波点的准确性和完整性。因此,Linux内核提供了input_mt_sync(struct input_dev * input)函数。在每波的每个点上报后需要紧跟一句input_mt_sync(),当这波所有点上报后再使用input_sync()进行同步。

    1. 例如一波要上报3个点:
    2. ……
    3. input_mt_sync(input);
    4. ……
    5. input_mt_sync(input);
    6. ……
    7. input_mt_sync(input);
    8. input_sync(input);
    9. 注:即使是仅上报一个点的单点事件,也需要一次input_mt_sync。<span style="font-family:Arial, Helvetica, sans-serif;"><span style="white-space: normal;">
    10. </span></span>

Linux与Android 多点触摸协议【转】的更多相关文章

  1. Linux & Android 多点触摸协议

    Linux & Android 多点触摸协议 Android4.0多点触摸入门 1 KERNEL 对于触摸屏的驱动我们简单的划分为两个主要的部分,一个是注册,另一个是上报. 1.1 注册 单点 ...

  2. Linux/Android多点触摸协议

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

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

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

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

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

  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. 【引用】Linux 内核驱动--多点触摸接口

    本文转载自James<Linux 内核驱动--多点触摸接口>   译自:linux-2.6.31.14\Documentation\input\multi-touch-protocol.t ...

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

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

  9. 【转】基于Qt, TUIO和TSLIB的嵌入式Linux下的多点触摸设计

    这个教程描述了在嵌入式linux下使用Qt如何设置一个支持多点触摸和单点触摸的输入系统.这里假定你已经有了对应的驱动程序,驱动可以从触摸屏的厂商那里获得或者使用一个linux 内核源码中已经存在的驱动 ...

随机推荐

  1. Muduo网络库源代码分析(六)TcpConnection 的生存期管理

    TcpConnection是使用shared_ptr来管理的类,由于它的生命周期模糊.TcpConnection表示已经建立或正在建立的连接.建立连接后,用户仅仅须要在上层类如TcpServer中设置 ...

  2. c++ 模板仿函数初探

    一直以来对于C++的使用基本上都是C with class,对于各种尖括号的模板都是敬而远之,最近忽然觉得该好好看看模板了.于是就有了这篇blog. 本文以一个查找问题为例来说明模板仿函数. 在C中, ...

  3. windows 32位以及64位的inline hook

    Tips : 这篇文章的主题是x86及x64 windows系统下的inline hook实现部分. 32位inline hook 对于系统API的hook,windows 系统为了达成hotpatc ...

  4. react手记(componentWillMount,componentDidMount等)

    生命周期componentWillMount 组件出现前 就是dom还没有渲染到html文档里面componentDidMount 组件渲染完成 已经出现在dom文档里可以再各个周期实现特定的操作 生 ...

  5. java中訪问修饰符

    较之c++ 中 public,proctected, private 三种訪问控制, java多了默认訪问控制. java中四种訪问控制权限 简单描写叙述为一下四句: 1)private 仅本类可见 ...

  6. 关于 js 动态生成html 绑定事件失效的问题

    在实际问题中,也只到使用新版jq 的on 事件 进行动态元素的绑定: 是这样 (但是依然没有效果——): $('dom节点').on('click',function(){}) 之后经过查阅发现:正确 ...

  7. hdu1174(3维射线与圆是否相交)

    简单的题意,要注意z2 = h2*0.9-r2 #include <iostream> #include <cmath> #include <vector> #in ...

  8. 《从零开始学Swift》学习笔记(Day 38)——构造函数与存储属性初始化

    原创文章,欢迎转载.转载请注明:关东升的博客 构造函数的主要作用是初始化实例,其中包括:初始化存储属性和其它的初始化.在Rectangle类或结构体中,如果在构造函数中初始化存储属性width和hei ...

  9. 《从零开始学Swift》学习笔记(Day 21)——函数返回值

    原创文章,欢迎转载.转载请注明:关东升的博客 返回值3种形式:无返回值.单一返回值和多返回值. 无返回值函数 所谓无返回结果,事实上是Void类型,即表示没有数据的类型. 无返回值函数的语法格式有如下 ...

  10. 初识Python、数据类型、基本语句

    Python是一种面向对象的.直译式计算机程序设计语言,也是一种功能强大的且完善的通用型语言,是一种脚本语言. Python的主要特点:是面向过程的.面向对象的:模块丰富,功能强大:语法简单易学:扩展 ...