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有: