輸入系統(tǒng)協(xié)議用類(lèi)型types和編碼codecs來(lái)表示輸入設(shè)備的值并用此來(lái)通知用戶空間的應(yīng)用程序。這篇文檔對(duì)這些類(lèi)型和編碼進(jìn)行了說(shuō)明并且指出什么時(shí)候和如何使用這些類(lèi)型和編碼。
?一個(gè)單一的硬件事件可以產(chǎn)生多個(gè)輸入事件,每個(gè)輸入事件包含一個(gè)單一數(shù)據(jù)項(xiàng)的新的數(shù)據(jù)值。EV_SYN是一個(gè)特別的事件類(lèi)型,它用來(lái)把同一時(shí)刻產(chǎn)生的多個(gè)輸入數(shù)據(jù)分割為多個(gè)數(shù)據(jù)包。在下面的描述中,術(shù)語(yǔ)事件(event)是指一個(gè)涵蓋類(lèi)型,編碼和參數(shù)值的單一輸入事件。
?input協(xié)議是一個(gè)基于狀態(tài)的協(xié)議,只有當(dāng)相應(yīng)事件編碼對(duì)應(yīng)的參數(shù)值發(fā)生變化時(shí)才會(huì)發(fā)送該事件。不過(guò),狀態(tài)是由Linux的輸入子系統(tǒng)進(jìn)行維護(hù),驅(qū)動(dòng)程序無(wú)需維護(hù)輸入的狀態(tài),就算參數(shù)值沒(méi)有變化時(shí)向輸入子系統(tǒng)發(fā)出事件也不會(huì)有問(wèn)題。用戶空間可以用linux/input.h 中定義的EVIOCG*ioctls來(lái)獲得當(dāng)前事件編碼和參數(shù)的狀態(tài)。設(shè)備的所支持的上報(bào)事件種類(lèi)也可以通過(guò)sysfs的class/input/event*/device/capabilities/來(lái)獲取,設(shè)備的特性和可以通過(guò)class/input/event*/device/properties來(lái)獲
Kernel版本:V3.4.10
?Event types:types對(duì)應(yīng)于一個(gè)相同邏輯輸入結(jié)構(gòu)的一組Codes。每個(gè)type都有一組可用的codes用于產(chǎn)生輸入事件。每個(gè)type可用的codes的詳細(xì)信息請(qǐng)參考Codes一節(jié)的內(nèi)容。
* EV_SYN:
? - 用于事件間的分割標(biāo)志。事件可能按時(shí)間或空間進(jìn)行分割,就像在多點(diǎn)觸摸協(xié)議中的例子。
?* EV_KEY:
? - 用來(lái)描述鍵盤(pán),按鍵或者類(lèi)似鍵盤(pán)設(shè)備的狀態(tài)變化。
?* EV_REL:
? - 用來(lái)描述相對(duì)坐標(biāo)軸上數(shù)值的變化,例如:鼠標(biāo)向左方移動(dòng)了5個(gè)單位。
?* EV_ABS:
??-用來(lái)描述相對(duì)坐標(biāo)軸上數(shù)值的變化,例如:描述觸摸屏上坐標(biāo)的值。
?* EV_MSC:
? - 當(dāng)不能匹配現(xiàn)有的類(lèi)型時(shí),使用該類(lèi)型進(jìn)行描述。
?* EV_SW:
? - 用來(lái)描述具備兩種狀態(tài)的輸入開(kāi)關(guān)。
?* EV_LED:
? - 用于控制設(shè)備上的LED燈的開(kāi)和關(guān)。
?* EV_SND:
? - 用來(lái)給設(shè)備輸出提示聲音。
?* EV_REP:
? -用于可以自動(dòng)重復(fù)的設(shè)備(autorepeating)。
?* EV_FF:
? - 用來(lái)給輸入設(shè)備發(fā)送強(qiáng)制回饋命令。(震動(dòng)?)
?* EV_PWR:
? - 特別用于電源開(kāi)關(guān)的輸入。.
?* EV_FF_STATUS:
? - 用于接收設(shè)備的強(qiáng)制反饋狀態(tài)。
?Event codes:
Event codes 用于對(duì)事件的type進(jìn)行更精確的定義
?EV_SYN:
EV_SYN 事件沒(méi)有對(duì)values進(jìn)行具體的定義, 它們的使用方式僅在發(fā)送evdev的事件串中有定義。
?* SYN_REPORT:
? - 當(dāng)多個(gè)輸入數(shù)據(jù)在同一時(shí)間發(fā)生變化時(shí),SYN_REPORT用于把這些數(shù)據(jù)進(jìn)行打包和包同步。例如,一次鼠標(biāo)的移動(dòng)可以上報(bào)REL_X和REL_Y兩個(gè)數(shù)值,然后發(fā)出一個(gè)SYN_REPORT。下一次鼠標(biāo)移動(dòng)可以再次發(fā)出REL_X和REL_Y兩個(gè)數(shù)值,然后經(jīng)跟這另一個(gè)SYN_REPORT。
?* SYN_CONFIG:
? -TBD
?* SYN_MT_REPORT:
? - 用于同步和分離觸摸事件。更多的信息請(qǐng)參考內(nèi)核文檔:multi-touch-protocol.txt。
?* SYN_DROPPED:
? - 用來(lái)指出evdev客戶的事件隊(duì)列的的緩沖區(qū)溢出。客戶端頂蓋忽略所有的事件,包括下一個(gè)SYN_REPORT事件,并且要查詢?cè)O(shè)備來(lái)獲得它的狀態(tài)(使用EVIOCG* ioctls)。
?EV_KEY:
EV_KEY事件采取KEY_
?幾個(gè) EV_KEY的 codes具有特別的意義:
?* BTN_TOOL_
- 這些codes用于配合觸控板,平板和觸摸屏這些設(shè)備的輸入,這些設(shè)備可以使用手指,筆或者其它工具。當(dāng)一個(gè)事件發(fā)生并且檢測(cè)到某種工具在使用時(shí),相應(yīng)的BTN_TOOL_
?* BTN_TOUCH:
BTN_TOUCH用于觸摸接觸事件。當(dāng)一個(gè)輸入工具被判定為有意義的物理接觸時(shí),這一特性的value值應(yīng)該設(shè)為1。所謂有意義的物理接觸可以是任何的接觸,又或者是滿足某種定義條件的接觸。例如,觸摸板可以當(dāng)觸摸的壓力達(dá)到某一個(gè)值以上時(shí)才把value設(shè)為1,一個(gè)用筆的平板當(dāng)筆劃過(guò)但沒(méi)有接觸到平板的表面時(shí),把BTN_TOOL_PEN的value設(shè)為1,而把BTN_TOUCH的value設(shè)為0.
?注意:為了配合一些老的傳統(tǒng)mousedev模擬驅(qū)動(dòng)程序可以工作,BTN_TOUCH必須作為一個(gè)同步幀的第一個(gè)evdevcode發(fā)出。
?注意:出于歷史的原因,用戶空間會(huì)把帶有BTN_TOOL_FINGER和 BTN_TOUCH的觸摸設(shè)備解釋為觸摸板,而類(lèi)似的不帶BTN_TOOL_FINGER的觸摸設(shè)備則被解釋為觸摸屏。為了與目前的用戶空間應(yīng)用向后兼容,建議遵循這一區(qū)分原則。以后,這一區(qū)分方法將會(huì)失效,而會(huì)使用設(shè)備屬性ioctl EVIOCGPROP(定義在linux/input.h)來(lái)傳送設(shè)備的類(lèi)型。
?* BTN_TOOL_FINGER, BTN_TOOL_DOUBLETAP,BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP:
- 這些codes表明一個(gè),兩個(gè),三個(gè)和四個(gè)手指參與觸摸板和觸摸屏的操作。例如,如果用戶使用兩只手指在觸摸板上試圖滾動(dòng)屏幕上的內(nèi)容,在運(yùn)動(dòng)期間,應(yīng)該發(fā)送value為1的BTN_TOOL_DOUBLETAP。注意的是所有的BTN_TOOL_
?注意:出于歷史原因,一些驅(qū)動(dòng)會(huì)在同一個(gè)同步幀內(nèi)發(fā)送多個(gè)value為1的上報(bào)手指數(shù)的codes,但是這一方法現(xiàn)在已經(jīng)過(guò)時(shí)了(不再使用)。
?注意:在多手指觸摸驅(qū)動(dòng)中,應(yīng)該使用input_mt_report_finger_count()函數(shù)來(lái)發(fā)出以上這些codes,詳情請(qǐng)參看內(nèi)核文檔:multi-touch-protocol.txt。
?EV_REL:
----------
EV_REL事件描述了某種特性的相對(duì)變化量。例如,鼠標(biāo)向左方移動(dòng)了幾個(gè)單位距離,但是他的絕對(duì)位置是未知的。如果我們可以知道絕對(duì)位置,那我們應(yīng)該使用EV_ABS而不是EV_REL。
?下面這些屬于EV_REL的codes有特別的意義:
?* REL_WHEEL, REL_HWHEEL:
? - 這兩個(gè)codes用于對(duì)應(yīng)的垂直方向和水平方向的滾輪。
?EV_ABS:
----------
EV_ABS事件描述了某一特性的絕對(duì)變化值,例如,觸摸板會(huì)用它發(fā)出當(dāng)前位置的絕對(duì)坐標(biāo)值。
?以下這些屬于EV_ABS的 codes有特殊的意義:
?* ABS_DISTANCE:
- 用來(lái)描述觸摸工具離觸摸表面的距離。這一事件應(yīng)該只有當(dāng)觸摸工具在表面懸空滑過(guò)時(shí)發(fā)出,也就是說(shuō),在靠經(jīng)觸摸表面,但是BTN_TOUCH的value是0的時(shí)候。如果輸入設(shè)備可以工作在3維坐標(biāo)時(shí),應(yīng)該考慮使用ABS_Z會(huì)更好。
?* ABS_MT_
- 用于描述多手指觸摸輸入設(shè)備。詳情請(qǐng)參考內(nèi)核文檔:multi-touch-protocol.txt。
?EV_SW:
----------
EV_SW事件用于描述一個(gè)兩態(tài)開(kāi)關(guān)的狀態(tài),比如,SW_LID code用來(lái)指出筆記本電腦的屏幕已經(jīng)合上了。
?當(dāng)綁定一個(gè)設(shè)備或者從suspend狀態(tài)中resuming回來(lái),驅(qū)動(dòng)程序必須上報(bào)開(kāi)關(guān)的當(dāng)前狀態(tài)。從而保證設(shè)備,內(nèi)核和用戶空間的狀態(tài)保持同步。
?在resume時(shí),如果開(kāi)關(guān)的狀態(tài)和suspend之前相同,input子系統(tǒng)會(huì)這一重復(fù)的狀態(tài)上報(bào)消息。驅(qū)動(dòng)程序任何時(shí)候都無(wú)需記住開(kāi)關(guān)的狀態(tài)。
?EV_MSC:
----------
當(dāng)事件不能用其它事件類(lèi)型描述時(shí),使用EV_MSC是將進(jìn)行輸入和輸出事件的上報(bào)。
?EV_LED:
----------
EV_LED事件用來(lái)設(shè)置或查詢?cè)O(shè)備上LED的狀態(tài)。
?EV_REP:
----------
EV_REP 用來(lái)指出自動(dòng)重復(fù)事件(autorepeating)。
?EV_SND:
----------
EV_SND用于對(duì)那些簡(jiǎn)單的發(fā)聲設(shè)備發(fā)出發(fā)音指令。
?EV_FF:
----------
EV_FF事件用來(lái)初始化具有強(qiáng)制反饋能力的設(shè)備,并可以讓這些設(shè)備發(fā)出反饋動(dòng)作。
?EV_PWR:
----------
EV_PWR事件是一個(gè)特殊的類(lèi)型,它是電源管理的專用事件,目前沒(méi)有對(duì)它做出良好的定義,將來(lái)會(huì)完善這一事件。
?設(shè)備特性(Device properties):
=================
正常情況下,用戶空間基于設(shè)備發(fā)出的數(shù)據(jù)(比如事件的types)來(lái)建立一個(gè)輸入設(shè)備,當(dāng)兩個(gè)設(shè)備都發(fā)出相同的事件types時(shí),這時(shí)設(shè)備特性就可以提供額外的識(shí)別信息。
?INPUT_PROP_DIRECT + INPUT_PROP_POINTER:
--------------------------------------
INPUT_PROP_DIRECT特性表明設(shè)備的坐標(biāo)直接和屏幕坐標(biāo)向?qū)?yīng)(無(wú)需瑣碎的轉(zhuǎn)換操作,像縮放,反轉(zhuǎn),旋轉(zhuǎn)等)。非直接輸入設(shè)備則需要一些必要的變換,比如觸摸板上絕對(duì)到相對(duì)的變換。典型的直接輸入設(shè)備有:觸摸屏,手寫(xiě)板;非直接輸入設(shè)備有:觸摸板,鼠標(biāo)。
?INPUT_PROP_POINTER特性表明設(shè)備不是利用屏幕來(lái)獲取輸入信息,從而需要一個(gè)屏幕上的指針來(lái)跟蹤用戶的移動(dòng)。典型的指針設(shè)備有:觸控板,鼠標(biāo);非指針設(shè)備:觸摸屏。
?如果INPUT_PROP_DIRECT或者 INPUT_PROP_POINTER都沒(méi)有設(shè)置,設(shè)備將會(huì)被認(rèn)為是未定義,它的類(lèi)型需要按傳統(tǒng)的方式利用事件的types推導(dǎo)出來(lái)。
?INPUT_PROP_BUTTONPAD:
--------------------
有些觸摸板,它的按鍵位于觸摸板的底部,這樣按下觸摸板會(huì)產(chǎn)生一次按鍵消息,對(duì)于這種設(shè)備,應(yīng)該設(shè)置該特性。自2009年以來(lái),配置這種觸控板的notebooks和macbooks變多越來(lái)越普遍。
?最初,這種按鍵特性是在bcm5974的驅(qū)動(dòng)中通過(guò)名字的版本字段來(lái)進(jìn)行編碼,為了向后兼容性,用戶空間有必要按這兩種方法都進(jìn)行檢查。
?INPUT_PROP_SEMI_MT:
------------------
在2008年至2011年之間,很多觸摸板只能檢測(cè)到多個(gè)接觸點(diǎn),但是不知道它們的獨(dú)立位置,只是知道觸點(diǎn)的數(shù)量和包圍它們的一個(gè)矩形。對(duì)于這樣的設(shè)備,應(yīng)該設(shè)置這個(gè)半多點(diǎn)觸摸特性。
?不同的設(shè)備,這個(gè)矩形可能包圍所有的觸控點(diǎn),就像邊界框一樣,也可能只是包圍了一部分觸控點(diǎn),比如最后的兩個(gè)觸控點(diǎn)。這種不確定性限制了這個(gè)矩形的用處,只是有些手勢(shì)識(shí)別會(huì)對(duì)它進(jìn)行分析。
?如果沒(méi)有設(shè)置INPUT_PROP_SEMI_MT特性,該設(shè)備被假設(shè)為全多點(diǎn)觸控設(shè)備。
?使用指引:
==========
以下的使用指引確保了單點(diǎn)觸摸和多點(diǎn)觸摸可以正常地工作,更詳盡的信息請(qǐng)參考文檔:multi-touch-protocol.txt。
?鼠標(biāo):
----------
當(dāng)鼠標(biāo)移動(dòng)時(shí),REL_{X,Y}必須被上報(bào)。主鍵被按下時(shí),BTN_LEFT必須被上報(bào)。 其它按鍵按下時(shí),BTN_{MIDDLE,RIGHT,4,5,etc.}應(yīng)該被上報(bào)。鼠標(biāo)上的滾輪滾動(dòng)時(shí),REL_WHEEL and REL_HWHEEL事件應(yīng)該被上報(bào)。
?觸摸屏:
----------
觸摸發(fā)生時(shí),必須要用ABS_{X,Y}上報(bào)觸摸的位置。觸摸有效時(shí),BTN_TOUCH必須被上報(bào),而不必用BTN_{MOUSE,LEFT,MIDDLE,RIGHT}來(lái)表明一次觸摸事件。有可能的話,BTN_TOOL_
?對(duì)于新的硬件,應(yīng)該設(shè)置INPUT_PROP_DIRECT特性。
?觸控板:
----------
傳統(tǒng)的觸控板只是想上面鼠標(biāo)所說(shuō)那樣上報(bào)相對(duì)位置信息即可。
?具備絕對(duì)位置信息的觸控板需要通過(guò)ABS_{X,Y}上報(bào)觸控點(diǎn)的位置信息。同樣,觸摸有效時(shí)應(yīng)該上報(bào)BTN_TOUCH事件。如果支持多點(diǎn)觸摸,應(yīng)該通過(guò)BTN_TOOL_
?對(duì)于新的硬件,應(yīng)該設(shè)置INPUT_PROP_POINTER特性。
?Tablets:
----------
當(dāng)筆或其它工具被有效檢測(cè)后,必須上報(bào)BTN_TOOL_
?對(duì)于新的硬件,INPUT_PROP_DIRECT和 INPUT_PROP_POINTER都應(yīng)該被設(shè)置。
評(píng)論
查看更多