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