1. 程式人生 > >Linux輸入子系統:事件的編碼 -- event-codes.txt

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來獲取。

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

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都應該被設定。

相關推薦

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

輸入系統協議用型別types和編碼codecs來表示輸入裝置的值並用此來通知使用者空間的應用程式。這篇文件對這些型別和編碼進行了說明並且指出什麼時候和如何使用這些型別和編碼。  一個單一的硬體事件可以產生多個輸入事件,每個輸入事件包含一個單一資料項的新的資料值。EV_SYN

linux 輸入子系統

gpo sdn font width idt hid -s OS div 1、分層結構     用戶層     事件處理層     輸入核心層     設備驅動層 2、步驟: https://blog.csdn.net/woshidahuaidan2011/art

linux 輸入子系統之電阻式觸控式螢幕驅動

一、輸入子系統情景回憶ING...... 在Linux中,輸入子系統是由輸入子系統裝置驅動層、輸入子系統核心層(Input Core)和輸入子系統事件處理層(Event Handler)組成。其中裝置驅動層提供對硬體各暫存器的讀寫訪問和將底層硬體對使用者輸入訪問的響應轉換為標準的輸入事件,再

Linux 輸入子系統分析 Linux輸入子系統分析(詳解)

為什麼要引入輸入子系統? 在前面我們寫了一些簡單的字元裝置的驅動程式,我們是怎麼樣開啟一個裝置並操作的呢? 一般都是在執行應用程式時,open一個特定的裝置檔案,如:/dev/buttons 1 ..... 2 int main(int argc, char **argv) 3 {

Linux輸入子系統

為何需要input子系統 Linux系統支援的許多裝置,都是輸入性的裝置,如按鍵、觸控式螢幕、鍵盤、滑鼠。本質上都是一個個的字元裝置驅動,Linux系統為這些裝置統一管理實現了input子系統,方便驅動和應用的開發。 input子系統軟體架構 linux輸

linux輸入子系統——按鍵

轉載linux之輸入子系統分析 實現步驟 1、定義、分配一個input-dev結構體 static struct input_dev *buttons_dev; buttons_dev=input_allocate_device(); 2、設定 buttons_dev->n

jquery筆記事件物件 event.currentTarget,event.data,event.delegateTarget,event.relatedTarget.......

event.currentTarget 在事件冒泡階段中的當前DOM元素 $("p").click(function(event) { alert( event.currentTarget === this ); // true }); event.da

linux input輸入子系統分析《四》input子系統整體流程全面分析

總線 返回值 分代 並不是 事件 等等 lag pri 位置 1 input輸入子系統整體流程 本節分析input子系統在內核中的實現,包括輸入子系統(Input Core),事件處理層(Event Handler)和設備驅動層。由於上節代碼講解了設備驅動層的寫法

核心輸入子系統 設定能產生哪類事件和那些事件總結

在jz2440上編寫使用輸入子系統驅動程式時,經常會遇到設定產生哪類事件和哪些事件,這裡自己總結了一下程式碼裡的2種方法: 下面是一些巨集和結構體定義: struct input_dev {     .........     uns

linux驅動由淺入深系列輸入子系統之二(編寫一個gpio_key驅動)

本系列導航: 在上一篇文章中我們大致瞭解了linux input subsystem的功能及應用層的使用,本文我們一起來看一看驅動程式碼的編寫。接下來一篇,計劃寫一下應用層如何模擬按鍵訊息,產生與按下實際按鍵相同的效果。 在“linux驅動由淺入深系列:驅動程式的基

linux驅動由淺入深系列輸入子系統之三(應用層模擬input_event)

本系列導航: 在上一篇文章中編寫了gpio_key的驅動,可以看到每次gpio_key按下會上報event到/dev/input /event7節點。其實在應用層是可以完全模擬出這個按鍵過程的,原理是向EV_KEY型別的eventX訊息節點write event將

Linux時間子系統之八動態時鐘框架(CONFIG_NO_HZ、tickless)

sleep file rup linux時間 load 曾經 大致 獲取 conf 在前面章節的討論中,我們一直基於一個假設:Linux中的時鐘事件都是由一個周期時鐘提供,不管系統中的clock_event_device是工作於周期觸發模式,還是工作於單觸發模式,也不管定時

Linux時間子系統之四定時器的引擎clock_event_device

到來 開始 register 工作模式 統一 10個 net 說過 序列 早期的內核版本中,進程的調度基於一個稱之為tick的時鐘滴答,通常使用時鐘中斷來定時地產生tick信號,每次tick定時中斷都會進行進程的統計和調度,並對tick進行計數,記錄在一個jiffies變量

Linux時間子系統之六高精度定時器(HRTIMER)的原理和實現

3.4 size 屬於 running return repr 而是 復雜度 ctu 上一篇文章,我介紹了傳統的低分辨率定時器的實現原理。而隨著內核的不斷演進,大牛們已經對這種低分辨率定時器的精度不再滿足,而且,硬件也在不斷地發展,系統中的定時器硬件的精度也越來越高,這也給

Linux時間子系統之七定時器的應用--msleep(),hrtimer_nanosleep()

get 關系 警告 mov signed num wakeup sch switch 我們已經在前面幾章介紹了低分辨率定時器和高精度定時器的實現原理,內核為了方便其它子系統,在時間子系統中提供了一些用於延時或調度的API,例如msleep,hrtimer_nanosleep

Linux時間子系統之二Alarm Timer

數據 類型 oid mtime orm 分別是 type mon 超時 一、前言 嚴格來講Alarm Timer也算POSIX Timer一部分,包含兩種類型CLOCK_REALTIME_ALARM和CLOCK_BOOTTIME_ALARM。分別是在CLOCK_REALTI

第53天鼠標事件event事件對象

鼠標右鍵 pin mov offsetx 參數 cursor wid 坐標 logs -->鼠標事件-->event事件對象-->默認事件-->鍵盤事件(keyCode)-->拖拽效果 一、鼠標事件 onclick --------------

JavaScript事件對象Event和冒泡

add 方式 p值 器) 機制 效率 學習 roi androi 本文最初發表於博客園,並在GitHub上持續更新前端的系列文章。歡迎在GitHub上關註我,一起入門和進階前端。 以下是正文。 綁定事件的兩種方式 我們在上一篇文章 DOM操作詳解 中已經講過事件的概

Linux驅動之輸入子系統簡析

ans 沒有 procfs 通過 sel spa 函數 minor ifdef 輸入子系統由驅動層、輸入子系統核心、事件處理層三部分組成。一個輸入事件,如鼠標移動、鍵盤按下等通過Driver->Inputcore->Event handler->users

Linux登入迴圈輸入密碼登入後閃一下又回登入介面

① .Xauthority問題,請百度 ② 請檢查你的>>環境變數<< 在登入介面嘗試CTRL+ALT+F[1~7]各種快捷鍵,直到進入熟悉的命令列介面 如果普通使用者連ls、sudo之類的命令都壞了的話用root使用者 環境變數檔案在這裡 /