多点触控类型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) 收藏 举报
浙公网安备 33010602011771号