多点触控类型A和B

对比维度 Type A (A型) Type B (B型)
状态管理 无状态 (Stateless) 有状态 (Stateful)
触摸点标识 匿名 (Anonymous),无法跟踪具体触摸点 可识别 (Identifiable),通过 ABS_MT_TRACKING_ID 跟踪每个触点
数据上报方式 全量上报:每次同步都上报当前所有触摸点的完整信息 增量上报:只上报发生变化的触摸点信息
数据包分隔 使用 SYN_MT_REPORT 事件分隔每个触摸点的数据包 使用 ABS_MT_SLOT 事件指定当前更新的是哪个“槽位”(slot)
硬件要求 低,适用于只能报告原始触点、无法跟踪触点身份的硬件 高,需要硬件有能力跟踪并识别每一个触摸点
数据效率 低,因为每次都传所有数据,数据量大 高,因为只传变化,数据量小,性能更好
复杂度 驱动实现简单,但会将手指追踪等复杂任务留给用户空间处理 驱动实现更复杂,但为用户空间提供了更精确、更高效的触摸数据
当前状态 已过时 (Obsolete) 当前标准

数据上报方式不同:

Type A (全量上报):无论是一个点移动,还是其他点状态没变,驱动都必须将所有触摸点的坐标、压力等全部信息再发送一遍。这种方式虽然简单,但效率很低。

Type B (增量上报):这是它更高效的关键。当一个触摸点移动时,驱动只需要发送该点的变化信息,其他触摸点的数据无需重发。这种机制通过“槽位”(slot)和“跟踪ID”配合实现,大大减少了数据量。

协议数据包示例:

Type A 示例(两个触摸点,其中一个移动时的上报序列):

ABS_MT_POSITION_X x[0]  // 上报触点0的X
ABS_MT_POSITION_Y y[0]  // 上报触点0的Y
SYN_MT_REPORT           // 触点0数据结束
ABS_MT_POSITION_X x[1]  // 上报触点1的X
ABS_MT_POSITION_Y y[1]  // 上报触点1的Y
SYN_MT_REPORT           // 触点1数据结束
SYN_REPORT              // 整个数据包结束

可以看到,即使触点0没动,它和触点1的所有数据都被重新上报了一遍。

Type B 示例(两个触摸点,触点45在X方向移动时):

// ---- 初始建立触点 ----
ABS_MT_SLOT 0
ABS_MT_TRACKING_ID 45   // 为槽0分配ID 45
ABS_MT_POSITION_X x[0]
ABS_MT_POSITION_Y y[0]
ABS_MT_SLOT 1
ABS_MT_TRACKING_ID 46   // 为槽1分配ID 46
ABS_MT_POSITION_X x[1]
ABS_MT_POSITION_Y y[1]
SYN_REPORT

// ---- 触点45 移动 ----
ABS_MT_SLOT 0           // 选中槽0 (触点45)
ABS_MT_POSITION_X x[0]  // 只上报发生变化的X坐标
SYN_REPORT              // 整个数据包结束

可以看到,在移动触点45时,只发送了它在槽0的新X坐标,触点46的数据完全不需要重复发送。

evtest测试TypeB协议

root@imx8mm-lpddr4-evk:~# evtest /dev/input/touchscreen0
Input driver version is 1.0.1
Input device ID: bus 0x18 vendor 0x0 product 0x0 version 0x0
Input device name: "ilitek_ts"
Supported events:
  Event type 0 (EV_SYN)
  Event type 1 (EV_KEY)
    Event code 116 (KEY_POWER)
    Event code 330 (BTN_TOUCH)
  Event type 3 (EV_ABS)
    Event code 47 (ABS_MT_SLOT)
      Value      0
      Min        0
      Max        9
    Event code 48 (ABS_MT_TOUCH_MAJOR)
      Value      0
      Min        0
      Max    32767
    Event code 50 (ABS_MT_WIDTH_MAJOR)
      Value      0
      Min        0
      Max    32767
    Event code 53 (ABS_MT_POSITION_X)
      Value      0
      Min        0
      Max    16384
    Event code 54 (ABS_MT_POSITION_Y)
      Value      0
      Min        0
      Max    16384
    Event code 57 (ABS_MT_TRACKING_ID)
      Value      0
      Min        0
      Max    65535
Properties:
  Property type 1 (INPUT_PROP_DIRECT)
Testing ... (interrupt to exit)

[   69.021256] [dhd] [wlan0] wl_run_escan : LEGACY_SCAN sync ID: 6, bssidx: 0
Event: time 946684913.946684913, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: time 946684913.946684913, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 0
Event: time 946684913.946684913, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 9483
Event: time 946684913.946684913, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 8993
Event: time 946684913.946684913, -------------- SYN_REPORT ------------
Event: time 946684913.946684913, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value -1
Event: time 946684913.946684913, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 0
Event: time 946684913.946684913, -------------- SYN_REPORT ------------
Event: time 946684914.946684914, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: time 946684914.946684914, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 1
Event: time 946684914.946684914, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 10680
Event: time 946684914.946684914, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 8043
Event: time 946684914.946684914, -------------- SYN_REPORT ------------
Event: time 946684915.946684915, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value -1
Event: time 946684915.946684915, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 0
Event: time 946684915.946684915, -------------- SYN_REPORT ------------
Event: time 946684917.946684917, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: time 946684917.946684917, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 2
Event: time 946684917.946684917, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 11962
Event: time 946684917.946684917, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 2705
Event: time 946684917.946684917, -------------- SYN_REPORT ------------
Event: time 946684917.946684917, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value -1
Event: time 946684917.946684917, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 0
Event: time 946684917.946684917, -------------- SYN_REPORT ------------
[   98.039352] [dhd] [wlan0] wl_run_escan : LEGACY_SCAN sync ID: 7, bssidx: 0
Event: time 946684931.946684931, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: time 946684931.946684931, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 3
Event: time 946684931.946684931, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 10882
Event: time 946684931.946684931, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 5538
Event: time 946684931.946684931, -------------- SYN_REPORT ------------
Event: time 946684931.946684931, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value -1
Event: time 946684931.946684931, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 0
Event: time 946684931.946684931, -------------- SYN_REPORT ------------
Event: time 946684932.946684932, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: time 946684932.946684932, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 4
Event: time 946684932.946684932, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 12350
Event: time 946684932.946684932, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 1824
Event: time 946684932.946684932, -------------- SYN_REPORT ------------
Event: time 946684932.946684932, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value -1
Event: time 946684932.946684932, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 0
Event: time 946684932.946684932, -------------- SYN_REPORT ------------
Event: time 946684933.946684933, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: time 946684933.946684933, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 5
Event: time 946684933.946684933, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 11311
Event: time 946684933.946684933, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 7033
Event: time 946684933.946684933, -------------- SYN_REPORT ------------
Event: time 946684933.946684933, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value -1
Event: time 946684933.946684933, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 0
Event: time 946684933.946684933, -------------- SYN_REPORT ------------
Event: time 946684933.946684933, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: time 946684933.946684933, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 6
Event: time 946684933.946684933, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 7303
Event: time 946684933.946684933, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 7291
Event: time 946684933.946684933, -------------- SYN_REPORT ------------
Event: time 946684933.946684933, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value -1
Event: time 946684933.946684933, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 0
Event: time 946684933.946684933, -------------- SYN_REPORT ------------
Event: time 946684934.946684934, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: time 946684934.946684934, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 7
Event: time 946684934.946684934, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 12053
Event: time 946684934.946684934, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 4557
Event: time 946684934.946684934, -------------- SYN_REPORT ------------
Event: time 946684934.946684934, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value -1
Event: time 946684934.946684934, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 0
Event: time 946684934.946684934, -------------- SYN_REPORT ------------
Event code 47 (ABS_MT_SLOT)
Event code 57 (ABS_MT_TRACKING_ID)

这两个是 Type B 协议的核心标志:

  • ABS_MT_SLOT:表示支持槽位(slot)机制
  • ABS_MT_TRACKING_ID:表示能够给每个触摸点分配唯一的跟踪 ID

而 Type A 协议的设备不会有这两个事件代码。
从输出中可以看到:

Event code 47 (ABS_MT_SLOT)
  Value      0
  Min        0
  Max        9

解析log

type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 0
type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 9483
type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 8993
-------------- SYN_REPORT ------------

事件序列解析

type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
  • 事件类型:按键事件
  • 按键码:330,代表触摸屏的"触摸"键
  • 值 1:表示手指按下了屏幕
  • 含义手指接触屏幕

type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 0
  • 事件类型:绝对值事件
  • 事件码:57,代表多点触控跟踪 ID(Type B 协议的核心标志)
  • 值 0:分配给这个触摸点的唯一标识符
    • 值 ≥ 0 = 新触摸点建立
    • 值 = -1 = 触摸点抬起/消失
  • 含义建立新触摸点,分配 ID = 0

type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 9483
  • 事件类型:绝对值事件
  • 事件码:53,代表触摸点的 X 轴坐标
  • 值 9483:当前触摸点的 X 坐标
  • 含义触摸点位于 X = 9483(范围 0 ~ 16384)

type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 8993
  • 事件类型:绝对值事件
  • 事件码:54,代表触摸点的 Y 轴坐标
  • 值 8993:当前触摸点的 Y 坐标
  • 含义触摸点位于 Y = 8993(范围 0 ~ 16384)

-------------- SYN_REPORT ------------
  • 事件类型:同步报告事件
  • 含义数据包结束标记。表示上面所有数据属于同一时刻的同一个数据包,应用程序可以一次性处理这些数据

整体流程

按下手指
    ↓
BTN_TOUCH = 1        → 通知系统手指已接触屏幕
    ↓
TRACKING_ID = 0      → 分配 ID=0 给这个触摸点
    ↓
POSITION_X = 9483    → 上报 X 坐标
    ↓
POSITION_Y = 8993    → 上报 Y 坐标
    ↓
SYN_REPORT           → 数据包结束,应用层可以处理

总结:这段日志记录了一次单点触摸按下事件,触摸点坐标为 (9483, 8993),分配跟踪 ID 为 0。
Max = 9 表示该触摸屏支持 最多 10 个触摸点(slot 编号从 0 到 9)。

posted on 2026-06-30 22:01  f1engmin11  阅读(9)  评论(0)    收藏  举报

导航