LinuxMT協議
本文內提到的內容來至於 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 資料進行快取,然後通過修改變更的資料來同步當前接觸點的資料)。
相關文章
- 【網路協議】IP協議、ARP協議、RARP協議協議
- RTSP協議、RTMP協議、HTTP協議的區別協議HTTP
- 【網路協議】UDP協議協議UDP
- Gossip協議也叫Epidemic協議(流行病協議)Go協議IDE
- IP協議(網路層協議)協議
- 協議協議
- 頁面連結跳轉--指定協議,半協議,無協議協議
- 【網路協議】TCP協議簡介協議TCP
- 路由協議與閘道器協議路由協議
- 淺談WebSocket協議、WS協議和WSS協議原理及關係Web協議
- 二進位制協議 VS 文字協議協議
- 生成樹協議與多生成樹協議協議
- Memcached 協議協議
- mysql協議MySql協議
- raft協議Raft協議
- modbus協議協議
- HTTP 協議HTTP協議
- swift協議Swift協議
- http協議HTTP協議
- OSPF協議協議
- 【TLS協議】TLS協議
- XModem協議協議
- [HTTP協議]HTTP協議
- SNMP協議協議
- Kerberos協議ROS協議
- SMB協議協議
- CMPP協議協議
- SSH 協議協議
- SFTP協議FTP協議
- 雲協議協議
- XMPP協議協議
- SNMP 協議協議
- PXE協議協議
- 優惠協議協議
- UART協議協議
- SPI協議協議
- ICMP協議協議
- 協議號協議