hexdump: 查看文件的內(nèi)容,比如二進(jìn)制文件中包含的某些字符串,通常用來(lái)調(diào)試驅(qū)動(dòng)用
描述
我們以event1為例,當(dāng)我們insmod掛載了鍵盤(pán)驅(qū)動(dòng)后,出現(xiàn)一個(gè)event1設(shè)備,
此時(shí)沒(méi)有按鍵按下吨拍,所以event1里面的數(shù)據(jù)是沒(méi)有的,那么數(shù)據(jù)又是從來(lái)哪里來(lái)壤巷?
通過(guò)鍵盤(pán)驅(qū)動(dòng)的read函數(shù),若有按鍵按下,就會(huì)上傳按鍵數(shù)據(jù)給用戶層hexdump
因?yàn)殒I盤(pán)驅(qū)動(dòng)的input_handler 是:evdev_handler
所以鍵盤(pán)驅(qū)動(dòng)的read函數(shù)是: evdev_handler->evdev_fops->evdev_read
進(jìn)入evdev_read()函數(shù),如下圖所示:
struct input_event event;
while (retval + input_event_size() <= count &&
evdev_fetch_next_event(client, &event)) {
if (input_event_to_user(buffer + retval, &event))
return -EFAULT;
evdev_event_to_user()這個(gè)函數(shù)從字面上來(lái)看,顯然就是用來(lái)上傳給用戶層的函數(shù),其中buffer是函數(shù)參數(shù),指向用戶層,所以數(shù)據(jù)就是event.
我們來(lái)看看event的結(jié)構(gòu)體:input_event
struct input_event {
struct timeval time; //事件發(fā)生的時(shí)間
__u16 type; // 哪類事件, 比如鍵盤(pán)事件
__u16 code; // 對(duì)應(yīng)的事件里支持的哪個(gè)變量,比如按鍵K
__s32 value; // 對(duì)應(yīng)的變量里的數(shù)值, 比如松開(kāi)按鍵則是1,反之為0
};
把 time里的成員展開(kāi)如下:
struct input_event {
long tv_sec; /* seconds */ //秒
long tv_usec; /* microseconds */ //微妙
__u16 type; // 哪類事件, 比如鍵盤(pán)事件
__u16 code; // 對(duì)應(yīng)的事件里支持的哪個(gè)變量,比如按鍵K
__s32 value; // 對(duì)應(yīng)的變量里的數(shù)值, 比如松開(kāi)按鍵則是1,反之為0
};
所以我們hexdump調(diào)試任何輸入子系統(tǒng)event XX驅(qū)動(dòng)時(shí),有信息就會(huì)打印上面數(shù)據(jù)
1.調(diào)試鍵盤(pán)驅(qū)動(dòng)
以按開(kāi)發(fā)板的按鍵 KEY_L,為例(因?yàn)閿?shù)據(jù)是從低到高打印的,所以數(shù)據(jù)是反的):
2.調(diào)試觸摸屏驅(qū)動(dòng)
也可以使用getevent 命令,用于獲取 input 輸入事件害碾,比如獲取按鍵上報(bào)信息、獲取觸摸屏上報(bào)信息等。
格式輸出為event type、event code湿诊、event value
比如 EV_KEY 330 0 表示: 按鍵事件的BTN_TOUCH觸摸按鍵(ox14a) 松開(kāi)了(0) EV_ABS 1 72 表示: 絕對(duì)坐標(biāo)事件的ABS_Y(1)坐標(biāo)位于72
這些定義都在input.h里,比如EV_ABS的code有: