Copyright: |copy| 2009-2010 Henrik Rydberg rydberg@euromail.se
此文章为个人翻译英文文档的产物,仅当做个人笔记使用,不喜勿喷!!
对于翻译内容有强迫症的读者请勿阅读此文档!!
阅读过程中如有不恰当之处欢迎交流指正~~
如需转载,请注明出处!
介绍
为了能够使用多点触控和多用户设备的全部功能,需要一种从各类触控设备报告详细数据的方法,例如:设备表面直接接触设备。本文描述的多点触控(MT)协议用于内核驱动报告任意数量触点的详细信息。
本协议依据硬件的功能分为两种类型。对于处理匿名触点(类型A)的设备,本协议描述如何发送所有触点的原始数据给接收者。对于能够跟踪区分触点(类型B)的设备,本协议描述了如何通过事件slot发送各个触点的更新。
注意:MT协议类型A已经被淘汰了,所有内核驱动都被转换到使用类型B。
协议使用
触点的详细信息作为ABS_MT事件的单独数据包顺序发送。只有ABS_MT事件被认为是触点包的一部分。因为这些事件会被当前的单点触控(ST)应用忽略,MT协议可以在存在于现有驱动中的ST协议上实现。
类型A设备的驱动通过在每个数据包的结尾调用input_mt_sync()实现分离触点数据包。这将会产生一个SYN_MT_REPORT事件,从而通知接收者接收当前触点信息,同时准备接收另一个触点信息。
类型B设备的驱动通过在每个数据包的开头以slot为参数调用input_mt_slot()来分离触点数据包。这会产生一个ABS_MT_SLOT事件,从而通知接收者准备所给的slot的更新。
所有驱动都调用通用input_sync()函数来标记多点触控转换结束。这会通知接收者执行自上次EV_SYNC/SYN_REPORT后累计的大量事件,同时准备接收新的事件和数据包。
无状态的类型A协议和有状态的类型B插槽协议之间的主要区别在于使用可识别的触点来减少发送到用户空间的数据量。使用slot协议需要有ABS_MT_TRACKING_ID,这个由硬件提供或从原始数据中计算得到[#f5]_。
对于类型A设备,内核驱动需要产生当前面板上的所有触点,数据包出现在事件流中的顺序是不重要的。事件过滤和手指追踪都流给用户空间去做[#f3_]。
对于类型B设备,内核驱动需要将每个识别的触点与一个slot关联,利用这个slot来传递对应触点的变化。触点的创建、替换和销毁是通过修改相关联slot的ABS_MT_TRACTKING_ID完成的。一个无符号的追踪id代表一个触点,值-1表示一个未使用的slot。一个未出现的过的追踪id被认为是新的,而一个不在出现的追踪id考虑被移除。因为只传递了变化的信息,每个触点的全部信息需要保存在接收端。当接收到MT事件时,简单地更新当前slot的对应属性。
一些设备识别并/或追踪的触点多于他们能够报告给驱动的数量。这种设备的驱动需要将硬件上报的每一个触点与一个类型B的slot相关联。一旦与一个slot关联的触点的识别发生改变,驱动需要改变它的ABS_MT_TRACKING_ID使这个s