連接操作系統(tǒng)的輸入設(shè)備,可不知一種,也許是一個(gè)標(biāo)準(zhǔn)的PS/2鍵盤,也許是一個(gè)USB鼠標(biāo),或者是一塊觸摸屏,甚至是一個(gè)游戲機(jī)搖桿,linux入門基礎(chǔ)教程在處理這些紛繁各異的輸入設(shè)備的時(shí)候,采用的辦法還是找中間層來屏蔽各種細(xì)節(jié),請(qǐng)看下圖:
在 Linux 的內(nèi)核中, 對(duì)輸入設(shè)備的使用, 實(shí)際上運(yùn)用了 3 大塊來管理, 他們分別是所謂的輸入設(shè)備驅(qū)動(dòng)層、 輸入子系統(tǒng)核心層, 以及事件觸發(fā)層。 linux入門基礎(chǔ)教程他們各自的工作分別是:
1, 輸入設(shè)備驅(qū)動(dòng)層:
每一種設(shè)備都有其特定的驅(qū)動(dòng)程序, 他們被妥當(dāng)?shù)匮b載到操作系統(tǒng)的設(shè)備模型框架內(nèi),封裝硬件所提供的功能, 向上提供規(guī)定的接口。
2, 核心層:
此處將收集由設(shè)備驅(qū)動(dòng)層發(fā)來的數(shù)據(jù), 整合之后觸發(fā)某一事件。
3, 事件觸發(fā)層:
這一層是我們需要關(guān)注的,我們可以通過在用戶空間讀取相應(yīng)設(shè)備的節(jié)點(diǎn)文件來獲知某設(shè)備的某一個(gè)動(dòng)作。 在靠近應(yīng)用程序的事件觸發(fā)層上, 內(nèi)核所獲知的各類輸入事件, 比如鍵盤被按了一下, 觸摸屏被滑了一下等, 都將被統(tǒng)一封裝在一個(gè)叫做 input_even 的結(jié)構(gòu)體當(dāng)中, 這個(gè)結(jié)構(gòu)體定義如下: (/usr/include/Linux/input.h)
21 struct input_event {
22 struct timeval time;
23 __u16 type;
24 __u16 code;
25 __s32 value;
26 };
該結(jié)構(gòu)體有 4 個(gè)成員, 其含義分別如下:
一、 time: 輸入事件發(fā)生的時(shí)間戳, 精確到微秒。 時(shí)間結(jié)構(gòu)體定義如下:
struct timeval
{
__time_t tv_sec; // 秒
long int tv_usec; // 微秒(1 微秒 = 10^3毫秒 = 10^6秒)
};
二、 type: 輸入事件的類型。 比如:
EV_SYN: 事件間的分割標(biāo)志, 有些事件可能會(huì)在時(shí)間和空間上產(chǎn)生延續(xù), 比如持續(xù)按住一個(gè)按鍵。 為了更好地管理這些持續(xù)的事件, EV_SYN 用以將他們分割成一個(gè)個(gè)的小的數(shù)據(jù)包。
EV_KEY: 用以描述鍵盤, 按鍵或者類似鍵盤的設(shè)備的狀態(tài)變化。
EV_REL: 相對(duì)位移, 比如鼠標(biāo)的移動(dòng), 滾輪的轉(zhuǎn)動(dòng)等。
EV_ABS: 位移, 比如觸摸屏上的坐標(biāo)值。
EV_MSC: 不能匹配現(xiàn)有的類型, 這相當(dāng)于當(dāng)前暫不識(shí)別的事件。 比如在 Linux系統(tǒng)中按下鍵盤中針對(duì) Windows 系統(tǒng)的“一鍵殺毒” 按鍵, 將會(huì)產(chǎn)生該事件。
EV_LED: 用于控制設(shè)備上的 LED 燈的開關(guān), 比如按下鍵盤的大寫鎖定鍵, 會(huì)同時(shí)產(chǎn)生 ”EV_KEY” 和 ”EV_LED” 兩個(gè)事件。
三、code:這個(gè)“事件的代碼”用于對(duì)事件的類型作進(jìn)一步的描述。比如:當(dāng)發(fā)生 EV_KEY事件時(shí), 則可能是鍵盤被按下了, 那么究竟是哪個(gè)按鍵被按下了呢? 此時(shí)查看 code 就知道了。 當(dāng)發(fā)生 EV_REL 事件時(shí), 也許是鼠標(biāo)動(dòng)了, 也許是滾輪動(dòng)了。這時(shí)可以用 code 的值來加以區(qū)分。
四、 value: 當(dāng) code 都不足以區(qū)分事件的性質(zhì)的時(shí)候, 可以用 value 來確認(rèn)。 比如由EV_REL 和 REL_WHEEL 確認(rèn)發(fā)生了鼠標(biāo)滾輪的動(dòng)作, 但是究竟是向上滾還是向下滾呢?再比如由由 EV_KEY 和 KEY_F 確認(rèn)了發(fā)生鍵盤上 F 鍵的動(dòng)作, 但究竟是按下呢還是彈起呢? 這時(shí)都可以用 value 值來進(jìn)一步判斷。
linux入門基礎(chǔ)教程關(guān)于觸摸屏應(yīng)用接口的內(nèi)容就講到這里,想了解更多內(nèi)容可咨詢粵嵌教育培訓(xùn)。