Linux輸入子系統:事件的編碼 -- event-codes.txt

輸入系統協議用類型types和編碼codecs來表示輸入設備的值並用此來通知用戶空間的應用程序。這篇文檔對這些類型和編碼進行了說明並且指出什麼時候和如何使用這些類型和編碼。

 一個單一的硬件事件可以產生多個輸入事件,每個輸入事件包含一個單一數據項的新的數據值。EV_SYN是一個特別的事件類型,它用來把同一時刻產生的多個輸入數據分割爲多個數據包。在下面的描述中,術語事件(event)是指一個涵蓋類型,編碼和參數值的單一輸入事件。

 input協議是一個基於狀態的協議,只有當相應事件編碼對應的參數值發生變化時纔會發送該事件。不過,狀態是由Linux的輸入子系統進行維護,驅動程序無需維護輸入的狀態,就算參數值沒有變化時向輸入子系統發出事件也不會有問題。用戶空間可以用linux/input.h 中定義的EVIOCG*ioctls來獲得當前事件編碼和參數的狀態。設備的所支持的上報事件種類也可以通過sysfs的class/input/event*/device/capabilities/來獲取,設備的特性和可以通過class/input/event*/device/properties來獲取。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

本文由DroidPhone 翻譯:http://blog.csdn.net/droidphone

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_<name> 或BTN_<name>的形式,比如,KEY_A代表鍵盤上的A鍵,當一個按鍵被按下時,一個帶有按鍵編碼和value爲1的事件被髮出。當一個按鍵被釋放時,一個value爲0的事件被髮出。有些硬件當按鍵重複時會發出事件,這些事件的value值爲2。通常,KEY_<name>用作鍵盤上的按鍵,而BTN_<name>則用於開關按鈕事件。

 幾個 EV_KEY的 codes具有特別的意義:

 * BTN_TOOL_<name>:

- 這些codes用於配合觸控板,平板和觸摸屏這些設備的輸入,這些設備可以使用手指,筆或者其它工具。當一個事件發生並且檢測到某種工具在使用時,相應的BTN_TOOL_<name> code事件應該把value設爲1,當該工具不再和輸入設備進行交互時,value應該復位爲0。所有的觸控板,當事件發生時,平板和觸摸屏映泰至少使用一種BTN_TOOL_<name> code。

 * 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_<name>codes 和 BTN_TOUCH code是用於正交目的的,一個觸摸板由手指碰觸時,應該在這兩組中各生成一個事件code,至少在一個同步幀中帶有一個value爲1的BTN_TOOL_<name>code。

 注意:出於歷史原因,一些驅動會在同一個同步幀內發送多個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_<name>:

- 用於描述多手指觸摸輸入設備。詳情請參考內核文檔: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_<name>事件也可以應該上報。

 對於新的硬件,應該設置INPUT_PROP_DIRECT特性。

 觸控板:

----------

傳統的觸控板只是想上面鼠標所說那樣上報相對位置信息即可。

 具備絕對位置信息的觸控板需要通過ABS_{X,Y}上報觸控點的位置信息。同樣,觸摸有效時應該上報BTN_TOUCH事件。如果支持多點觸摸,應該通過BTN_TOOL_<name>上報有效觸摸的數量。

 對於新的硬件,應該設置INPUT_PROP_POINTER特性。

 Tablets:

----------

當筆或其它工具被有效檢測後,必須上報BTN_TOOL_<name>事件,必須用ABS_{X,Y}上報觸控的位置信息,同時應該上報BTN_TOUCH事件。當觸控工具上的按鈕有效時,應該上報BTN_{STYLUS,STYLUS2}消息。除了BTN_{MOUSE,LEFT}以外,其它任意的按鍵消息都可以用於上報平板上的按鍵,對於沒有標記的按鍵,BTN_{0,1,2,etc}是個不錯的選擇,避免使用有特別意義的按鍵:像BTN_FORWARD之類,除非設備上特別標明瞭就是這一按鍵。

 對於新的硬件,INPUT_PROP_DIRECT和 INPUT_PROP_POINTER都應該被設置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章