Linux/Android多点触摸协议
鏈接點擊打開鏈接
關于Linux多點觸摸協(xié)議大家可以參考kernel中的文檔:https://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt,而這里根據(jù)實際的例子來理解多點觸摸協(xié)議。
多點觸摸協(xié)議有兩種,A協(xié)議和B協(xié)議。
首先來看A協(xié)議,協(xié)議上說了報點格式是這樣的,以兩點為例:
? ? ? ? ABS_MT_POSITION_X x[0]ABS_MT_POSITION_Y y[0]SYN_MT_REPORTABS_MT_POSITION_X x[1]ABS_MT_POSITION_Y y[1]SYN_MT_REPORTSYN_REPORT
如果第一個觸點離開(抬起),這里的意思是說還有一個觸點,需要繼續(xù)上報這個觸點。
? ? ? ? ABS_MT_POSITION_X x[1]ABS_MT_POSITION_Y y[1]SYN_MT_REPORTSYN_REPORT
如果兩個觸點都離開了,那么只需要報告一個同步事件就可以了。
? ? ? ? SYN_MT_REPORTSYN_REPORT
而代碼示例如下: [cpp]?view plaincopy
其中count值表示觸點個數(shù),如果是2個,那么這里值就為2,如果所有觸點都離開了,那么count值就為0。
上面可以說是最簡單,也是最基本的A協(xié)議報點了。除了報點以外,我們也來關注一下input device注冊時需要setting的一些東西。
而這句__set_bit(INPUT_PROP_DIRECT, input_dev->propbit);也是必須要有的,否則在Android中會出現(xiàn)一個白色小圓環(huán),感覺像是缺少idc文件一樣。最后通過getevent -p命令看一下觸摸屏的setting。
add device 1: /dev/input/event1name: ? ? "ft6x36"events:ABS (0003): 0035 ?: value 0, min 0, max 540, fuzz 0, flat 0, resolution 00036 ?: value 0, min 0, max 960, fuzz 0, flat 0, resolution 0input props:INPUT_PROP_DIRECT
對于B協(xié)議就稍微顯得有點復雜。B協(xié)議需要硬件支持,和A協(xié)議主要區(qū)別在哪里呢?B協(xié)議可以使用一個ID來標識觸點,可以減少上報到用戶空間的數(shù)據(jù)量,這個ID(ABS_MT_TRACKING_ID)可以有硬件提供或者從原始數(shù)據(jù)計算而得。那>么下面我們就來看B協(xié)議怎么上報數(shù)據(jù)的。
如果觸點45只是在x方向做了移動,那么應該怎么報告這個事件呢?
可以看到減少了很多數(shù)據(jù)的上報,這就是同A協(xié)議最大的區(qū)別。
這里為什么沒有發(fā)送ABS_MT_SLOT 0事件呢,因為之前slot已經(jīng)被置成了0,再次發(fā)送ABS_MT_SLOT 0是會被忽略掉的。
如果第二個觸點被抬起,發(fā)送下面的事件序列。
其他event
ABS_MT_POSITION_X和ABS_MT_POSITION_Y是多點觸摸協(xié)議的最小事件集,是最基本的事件,也是必須的事件。除此之外呢,還包括下面的一些時間集(需要設置支持):
ABS_MT_TOUCH_MAJOR
ABS_MT_TOUCH_MINOR
ABS_MT_TOUCH*用來表示接觸點區(qū)域大小(即手指與玻璃接觸區(qū)域大小),通常接觸區(qū)域是一個橢圓形狀,那么MAJOR就表示橢圓的長軸,而MINOR就表示橢圓的短軸。如果接觸區(qū)域是圓形的話,那么可以忽略MINOR,而MAJOR就表示圓形的直徑大小。
ABS_MT_WIDTH_MAJOR
ABS_MT_WIDTH_MINOR
上面的TOUCH表示接觸區(qū)域的大小,而WIDTH則表示為接觸工具的大小(例如手指,觸控筆等)。
ABS_MT_PRESSURE
而PRESSURE表示壓力值,這個壓力值可以通過上面的4個參數(shù)計算而得,例如:ABS_MT_TOUCH_MAJOR/ABS_MT_WIDTH_MAJOR,可以看到接觸面積越大,壓力值也就越大。當然這個壓力值也可以直接由設備提供。
ABS_MT_DISTANCE
觸點與接觸面的距離,0表示觸點在接觸面的表面(已經(jīng)實實在在的接觸到了),而正數(shù)表示在接觸面的上方。
ABS_MT_ORIENTATION
觸點的方向。
ABS_MT_TOOL_X
ABS_MT_TOOL_Y
ABS_MT_TOOL_TYPE
關于上報虛擬按鍵值
通常觸摸屏下方都有3個虛擬按鍵,而這3個按鍵同其它實體按鍵(例如:power按鍵、音量按鍵)又有所不同,它是觸摸屏提供的一組虛擬按鍵,我們通過觸摸屏會得到這一組按鍵的坐標值,可以通過這個坐標值上報相應的按鍵值來實
現(xiàn)按鍵功能,那么怎么來上報這個按鍵值呢。首先需要對input設備做一些setting:
好的,再來看怎么上報鍵值。
按鍵按下: [cpp]?view plaincopy
有的地方可能會看到直接使用input_event函數(shù),例如: [cpp]?view plaincopy
最后一點在setting時除了__set_bit之外,可能還會看到另外一個函數(shù)input_set_capability,這個函數(shù)實現(xiàn)在drivers/input/input.c中,而它最終還是調(diào)用了__set_bit函數(shù),所以最后效果都是一樣的。
總結(jié)
以上是生活随笔為你收集整理的Linux/Android多点触摸协议的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高通 8x12 添加 TP和按键
- 下一篇: 基于FT5x06嵌入式Linux电容触摸