Linux-hexdump命令調試event驅動—詳解

Linux-hexdump命令調試event驅動—詳解

hexdump: 查看文件的內容,比如二進制文件中包含的某些字符串,通常用來調試驅動用

 

描述:

我們以event1爲例,當我們insmod掛載了鍵盤驅動後,出現一個event1設備,

此時沒有按鍵按下,所以event1裏面的數據是沒有的,那麼數據又是從來哪裏來?

通過鍵盤驅動的read函數,若有按鍵按下,就會上傳按鍵數據給用戶層hexdump

因爲鍵盤驅動的input_handler 是:evdev_handler

所以鍵盤驅動的read函數是: evdev_handler->evdev_fops->evdev_read

進入evdev_read()函數,如下圖所示:

evdev_event_to_user()這個函數從字面上來看,顯然就是用來上傳給用戶層的函數,其中buffer是函數參數,指向用戶層,

所以數據就是event.

我們來看看event的結構體:input_event

struct input_event {
struct timeval time;  //事件發生的時間
__u16 type;            //  哪類事件, 比如鍵盤事件
__u16 code;     // 對應的事件裏支持的哪個變量,比如按鍵K
__s32 value;   // 對應的變量裏的數值, 比如鬆開按鍵則是1,反之爲0
};

把 time裏的成員展開如下:

複製代碼

 struct input_event {
long   tv_sec; /* seconds */          //秒
long   tv_usec;    /* microseconds */     //微妙

__u16 type;            //  哪類事件, 比如鍵盤事件
__u16 code;     // 對應的事件裏支持的哪個變量,比如按鍵K
__s32 value;   // 對應的變量裏的數值, 比如鬆開按鍵則是1,反之爲0
};

複製代碼

所以我們hexdump調試任何輸入子系統event XX驅動時,有信息就會打印上面數據

 1.調試鍵盤驅動

(鍵盤驅動代碼:http://www.cnblogs.com/lifexy/p/7553861.html)

以按開發板的按鍵 KEY_L,爲例(因爲數據是從低到高打印的,所以數據是反的):

複製代碼

# hexdump /dev/event1     //按鍵鍵盤驅動

/*按下時:*/
//hexdump序列號          秒             微妙         鍵盤事件    code=KEY_L     value=1(按下)
 0000000             07c6 0000      faa2 000b      0001        0026          0001 0000
//hexdump序列號          秒             微妙         同步事件       code        value=0 
 0000010            07c6 0000      faac 000b       0000        0000          0000 0000

/*鬆開時:*/
//hexdump序列號          秒             微妙         鍵盤事件     code=0x26     value=0(鬆開)
 0000020             07c6 0000     cf67 000d        0001        0026         0000 0000
//hexdump序列號          秒             微妙         同步事件      code         value=0 
 0000030             07c6 0000     cf70 000d        0000        0000         0000 0000

複製代碼

2.調試觸摸屏驅動

(觸摸屏驅動代碼: )

複製代碼

 /dev/event0            //觸摸屏驅動
# hexdump /dev/event0 
//hexdump序列號          秒             微妙        絕對座標事件    code=ABS_X   X座標值 
0000000               0412 0000      6ef0 000c      0003          0000      0239 0000
//hexdump序列號          秒             微妙        絕對座標事件    code=ABS_Y   Y座標值
0000010                 0412 0000    6f08 000c      0003          0001      01ae 0000
//hexdump序列號          秒             微妙        絕對座標事件    code=壓力     壓力值
0000020             0412 0000        6f0c 000c      0003          0018      0001 0000
//hexdump序列號          秒             微妙        鍵盤事件       code=觸摸按鍵  value=1(按下)
0000030              0412 0000       6f10 000c      0001          014a      0001 0000
//hexdump序列號          秒             微妙        同步事件      
0000040             0412 0000        6f13 000c      0000          0000      0000 0000

//hexdump序列號          秒             微妙        絕對座標事件    code=壓力     壓力值
00000b0               023b 0000      872d 000c      0003          0018      0000 0000

//hexdump序列號          秒             微妙        鍵盤事件      code=觸摸按鍵  value=0(鬆開)
00000b0            0412 0000         1f5b 000d     0001          014a       0000 0000
//hexdump序列號          秒             微妙        同步事件      
00000c0             0412 0000        1f70 000d     0000          0000       0000 0000

複製代碼

 

也可以使用getevent 命令,用於獲取 input 輸入事件,比如獲取按鍵上報信息、獲取觸摸屏上報信息等。

示例:

格式輸出爲event type、event code、event value

比如 EV_KEY 330  0    表示:   按鍵事件的BTN_TOUCH觸摸按鍵(ox14a) 鬆開了(0)

        EV_ABS     1  72   表示:    絕對座標事件的ABS_Y(1)座標位於72

這些定義都在input.h裏,比如EV_ABS的code有:

 

 

補充一張韋東山驅動的圖

111

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