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