2010-09-07 120 views
5

我已經從我的鍵盤設備捕獲輸入打轉轉:的/ dev /輸入鍵盤格式

/dev/input/by-path/platform-i8042-serio-0-event-kbd 

對我來說,我想知道是否有什麼它返回的任何規範,使用

od -tx1 /dev/input/by-path/platform-i8042-serio-0-event-kbd 

要聽。我很好奇,主要是由於某些鍵的行爲; meta,箭頭鍵,numpad正斜槓。

0520300 ac 9d 86 4c 6b 0f 04 00 04 00 04 00 (db) 00 00 00 
0520320 ac 9d 86 4c 8c 0f 04 00 01 00 (7d) 00 00 00 00 00 
0520340 ac 9d 86 4c 95 0f 04 00 00 00 00 00 00 00 00 00 

我在這麼遠遠的看着每一個其他關鍵在括號中的兩個字節匹配值,沒有任何原因,這些是特殊的?

回答

12

/dev/input/by-path/platform-i8042-serio-0-event-kbd只是符合鏈接/dev/input/eventX事件設備文件。數據可以從事件設備文件被讀取爲

struct input_event { 
    struct timeval time; 
    __u16 type; 
    __u16 code; 
    __s32 value; 
}; 

/usr/include/linux/input.h定義。

type的可能值以EV_開頭。 code的可能值取決於type。它們的前綴爲KEY_BTN_REL_等。 value的可能值取決於typecode。例如對於按鍵事件value等於1以及對於鍵盤釋放事件0

您可以檢查與事件數據:

evtest /dev/input/eventX 

其中X是鍵盤的情況下,設備號(或任何其他事件設備)。一次按鍵或釋放通常會發出三個事件(EV_MSC,EV_KEYEV_SYN)。

3

一些鍵具有不同尋常的掃描碼...

來源:http://www.beyondlogic.org/keyboard/keybrd.htm(含修改):

現在有101項和8位使256個不同的組合,所以你只需要每發送一個字節鍵,對嗎?

沒有。不幸的是,鍵盤上的一些鍵是擴展鍵,因此需要兩個掃描碼。這些鍵前面有一個E0(十六進制)。但它並不停止在兩個掃描碼。 E1,14,77,E1,F0,14,F0,77怎麼樣!現在,這不能成爲一個有效的掃描碼?又錯了。當您按下暫停/斷開鍵時,它恰好被髮送。不要問我爲什麼他們需要這麼長時間!也許他們正在度過一個糟糕的一天或什麼?