Linux MT 协议

简介: 本文内提到的内容来至于 Kernel Documentation。协议被分为了两种类型的设备:所有设备都处理匿名接触点(A类), 协议描述如何发送 raw 数据来自所有接触点给接收者处理带Tracking ID 的接触点(B类),协议描述如何通过事件slot发送更新每个独立接触点协议使用接触点描述的每个包都通过 ABS_MT_* 事件来进行发送单条信息。

本文内提到的内容来至于 Kernel Documentation

协议被分为了两种类型的设备:

  • 所有设备都处理匿名接触点(A类), 协议描述如何发送 raw 数据来自所有接触点给接收者
  • 处理带Tracking ID 的接触点(B类),协议描述如何通过事件slot发送更新每个独立接触点

协议使用

接触点描述的每个包都通过 ABS_MT_* 事件来进行发送单条信息。

在Type A 设备驱动中每个独立接触点之后都会使用 input_mt_sync() 来发送 SYN_MT_REPORT 事件。

而在Type B 设备驱动中每个独立接触点之前都会使用 input_mt_slot() 函数来发送 ABS_MT_SLOT 事件,用来表示准备开始更新某给定的slot 事件。同时要求使用 ABS_MT_TRACKING_ID 来描述slot协议。

所有类型的驱动都会通过 input_sync() 函数来结束单次操作的 EV_SYN/SYN_REPORT事件来进行同步。表示当前事件已经结束,可以使用之前更新的数据。

无状态的Type A 协议与含状态的Type B slot协议主要区别在于使用接触点Id 来减少大量数据发送给到用户空间中。

对于A类设备来说,内核驱动随意迭代所有接触点,数据包在事件流中的位置并不重要。事件过滤及事件tracking都被遗留给了用户空间来处理。而 B 类设备,内核用 slot 来关联每个接触点,通过 slot 来传递接触点的变化。接触点的创建,更新及销毁都通过修改关联的slot的 ABS_MT_TRACKING_ID 来完成(非负数表示诠释一个接触点,-1 表示为一个无用的接触点)。当出现一个之前没有出现过tracking id 时,表示为一个新的点。某个tracking id 不再次出现时,表示已经移除。

如果tracking的接触点多余当前上报的硬件信号时,驱动应该使用 BTN_TOOL_TAP 事件来告知用户空间当前tracking的接触点总数量。驱动应该通过发送相应的 BTN_TOOL_TAP 事件以及在调用 input_mt_report_pointer_emulation() 函数时设置 use_count 为 false 。

ABS_MT_SLOT 最小值为 0。

协议样例

A 类协议

A 类设备获取两点的事件如下:

   ABS_MT_POSITION_X x[0]
   ABS_MT_POSITION_Y y[0]
   SYN_MT_REPORT
   ABS_MT_POSITION_X x[1]
   ABS_MT_POSITION_Y y[1]
   SYN_MT_REPORT
   SYN_REPORT

当其中某点发送移动,进行更新时,这时所有呈现的接触点的 raw 数据通过发送 SYN_REPORT 来同步数据。
比如:

   ABS_MT_POSITION_X x[1]
   ABS_MT_POSITION_Y y[1]
   SYN_MT_REPORT
   SYN_REPORT

接下来通过如下方式来将更新及同步数据

   SYN_MT_REPORT
   SYN_REPORT

如果驱动除 ABS_MT 事件外额外上报一个 BTN_TOUCH 或 ABS_PRESSURE 事件。最后一个 SYN_MT_REPORT 事件可能会省略。

B 类协议

如下是两个接触点的 B 类事件:

   ABS_MT_SLOT 0
   ABS_MT_TRACKING_ID 45
   ABS_MT_POSITION_X x[0]
   ABS_MT_POSITION_Y y[0]
   ABS_MT_SLOT 1
   ABS_MT_TRACKING_ID 46
   ABS_MT_POSITION_X x[1]
   ABS_MT_POSITION_Y y[1]
   SYN_REPORT

如下是在当第一个 slot 在 x 轴上移动之后,上报的日志:

   ABS_MT_SLOT 0
   ABS_MT_POSITION_X x[0]
   SYN_REPORT

如下是当slot 关联的 slot 抬起(release)之后,上报如下事件:

   ABS_MT_TRACKING_ID -1
   SYN_REPORT

如果第二点抬起之后,则上报如下事件:

   ABS_MT_SLOT 1
   ABS_MT_TRACKING_ID -1
   SYN_REPORT

即当变化的接触点所关联的 slot 与上次同步数据的 slot 不一致时,必须先发送 ABS_MT_SLOT 来标记当前要修改的 slot 数据。(类似于 patch 将单个 slot 数据进行缓存,然后通过修改变更的数据来同步当前接触点的数据)。

目录
相关文章
|
2月前
|
传感器 网络协议 物联网
在Linux中搭建Mosquitto MQTT协议消息服务端并结合内网穿透工具实现公网访问
Mosquitto是一个开源的消息代理,它实现了MQTT协议版本3.1和3.1.1。它可以在不同的平台上运行,包括Windows、Linux、macOS等。mosquitto可以用于物联网、传感器、移动应用程序等场景,提供了一种轻量级的、可靠的、基于发布/订阅模式的消息传递机制。
|
6月前
|
安全 Linux 网络安全
Linux远程管理协议
(RFB、RDP、Telnet和SSH)是Linux的远程管理协议。提到远程管理,通常指的是远程管理服务器,而非个人计算机。个人计算机可以随时拿来用,服务器通常放置在机房中,用户无法直接接触到服务器硬件,只能采用远程管理的方式。远程管理,实际上就是计算机(服务器)之间通过网络进行数据传输(信息交换)的过程,与浏览器需要 HTTP 协议(超文本传输协议)浏览网页一样,远程管理同样需要远程管理协议的支持。 目前,常用的远程管理协议有以下 4 种: RDP(remote desktop protocol)协议:远程桌面协议,大部分 Windows 系统都默认支持此协议,Windows 系统中的远
44 0
|
8月前
|
Linux C语言 C++
Linux ICMP协议实现:C/C++编程指南
ICMP(Internet Control Message Protocol)是网络通信中的重要协议,用于在IP网络中传递错误消息和诊断信息。在Linux系统中,我们可以使用C/C++编程语言来实现基本的ICMP功能,例如发送ICMP回显请求(Ping)和解析ICMP消息。本文将带您深入了解C/C++实现的ICMP协议,包括套接字编程、构造ICMP报文、发送和接收ICMP消息等,以及提供实际的代码示例。
459 1
|
8月前
|
传感器 网络协议 物联网
Linux MQTT通信:实现轻量级物联网传输协议
MQTT(Message Queuing Telemetry Transport)是一种轻量级的物联网传输协议,专门设计用于低带宽、不稳定网络环境下的传感器和物联网设备通信。本文将深入探讨Linux环境下如何实现MQTT通信,介绍MQTT协议的基本原理、常用MQTT库以及如何在Linux系统中编写MQTT客户端和服务器端程序。
384 0
|
1月前
|
Linux 网络安全
Linux NFS协议详解
Linux NFS协议详解
29 5
|
3月前
|
网络协议 Linux C++
Linux C/C++ websocket协议与服务器实现
Linux C/C++ websocket协议与服务器实现
65 0
|
3月前
|
存储 网络协议 Linux
Linux C/C++ 开发(学习笔记九 ):DNS协议与请求的实现
Linux C/C++ 开发(学习笔记九 ):DNS协议与请求的实现
54 0
|
8月前
|
运维 Linux
Linux Ping协议解析与应用
Ping是网络通信中常用的工具和协议之一,用于测试网络连通性和测量往返时间。在Linux系统中,`ping`命令是基于ICMP(Internet Control Message Protocol)协议实现的,它通过发送ICMP回显请求和接收ICMP回显应答来测试网络连接。本文将深入解析Linux下的Ping协议,包括原理、使用方法和应用场景,帮助读者全面理解Ping协议在网络通信中的重要性。
149 0
|
8月前
|
缓存 网络协议 算法
深入理解Linux网络——TCP协议三次握手和四次挥手详细流程
一、三次握手流程 客户端调用connect系统调用,发出第一次握手 找到套接字:创建内核对象的时候,fd会跟file对象做通过fd_install关联起来,通过进程的fd_table就可以找到对应的file,而file的private指针就指向了socket对象,所以根据fd即可找到套接字 协议,转载请附上原文出处链接及本声明。
|
4月前
|
网络协议 Linux 数据处理
Linux网络编程(各种协议模型的基础知识)
Linux网络编程(各种协议模型的基础知识)
45 0