i.MX6ULL終結者Linux INPUT子系統實驗執行測試

一隻流浪小法師發表於2021-01-05

1 編譯驅動程式

和前面章節中驅動測試程式一樣需要一個Makefile檔案,只是將obj-m的值改為key_input.o,Makefile檔案內容如下:

KERNELDIR := /home/topeet/kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga
CURRENT_PATH := $(shell pwd)
obj-m := key_input.o

build: kernel_modules
kernel_modules: 
        $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules
clean:
        $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean

首先我們在終端輸入兩個命令(設定兩個環境變數):

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-

然後執行“make”命令編譯模組,編譯完成生成key_input.ko模組檔案。

2 編譯應用測試程式

輸入如下命令編譯應用測試程式:
arm-linux-gnueabihf-gcc -o key_input_test key_input_test.c
編譯完成後,會生成key_input_test可執行檔案。

3 執行測試

啟動開發板,將編譯好的key_input.ko模組檔案和key_input_test應用程式拷貝到/lib/modules/4.1.15目錄下(檢查開發板根檔案系統中有沒有“/lib/modules/4.1.15”這個目錄,如果沒有的話需要自行建立一下。開發板中使用的是光碟資料裡面提供的busybox檔案系統,光碟資料的“i.MX6UL終結者光碟資料\08_開發板系統映象\03_檔案系統映象\01_Busybox檔案系統”目錄下)。在載入驅動模組檔案之前,先看一下在/dev/input 目錄下都有哪些檔案,結果如圖3.1所示:
在這裡插入圖片描述

圖 3.1

在/dev/input目錄下已經存在了不少的event事件,然後輸入下面命令載入模組:

depmod
modprobe key_input

驅動載入成功後在來看一下在/dev/input 目錄下有哪些檔案,結果如圖 49.3.3.2所示:
在這裡插入圖片描述

圖 3.2

可以看出,多了一個 event3 檔案,因此/dev/input/event3 就是我們註冊的驅動所對應的裝置檔案。然後key_input_test應用程式通過讀取/dev/input/event3裝置檔案來獲取輸入事件資訊,測試命令如下:
./key_input_test /dev/input/event3
按下開發板上的按鍵KEY0,有圖 3.3現象:
在這裡插入圖片描述

圖 3.3

可以看出,當我們按下或者釋放開發板上的按鍵以後都會在終端上輸出相應的內容,提示我們哪個按鍵按下或釋放了,在 Linux 核心中 KEY_0 為 11。
另外,我們也可以不用 key_input_test應用程式來測試驅動,可以直接使用 hexdump 命令來檢視 /dev/input/event3 檔案內容,輸入如下命令:
hexdump /dev/input/event3
按下開發板上的按鍵KEY0,有如圖 3.4現象:
在這裡插入圖片描述

圖 3.4

上圖就是 input_event 型別的原始事件資料值,採用十六進位制表示,這些原始資料的含義如下:

/*****************input_event 型別********************/ 
/* 編號 */  /* tv_sec */  /* tv_usec */  /* type */  /* code */  /* value */ 
0000000     1029 5d5e   2c16 0008     0001       000b     0001 0000
0000010     1029 5d5e   2c16 0008     0000       0000     0000 0000
0000020     1029 5d5e   761f 000a     0001       000b     0000 0000
0000030     1029 5d5e   761f 000a     0000       0000      0000 0000

type 為事件型別,EV_KEY 事件值為 1,EV_SYN 事件值為 0。因此第 1 行表示 EV_KEY 事件,第 2 行表示 EV_SYN 事件。code 為事件編碼,也就是按鍵號,KEY_0 這個按鍵編號為 11,對應的十六進位制為 0xb,因此第 1 行表示 KEY_0 這個按鍵事件,最後的 value 就是按鍵值,為 1 表示按下,為 0 的話表示鬆開。
綜上所述,上圖中的原始事件值含義如下:
第 1 行,按鍵(KEY_0)按下事件。
第 2 行,EV_SYN 同步事件,因為每次上報按鍵事件以後都要同步的上報一個 EV_SYN 事
件。
第 3 行,按鍵(KEY_0)鬆開事件。
第 4 行,EV_SYN 同步事件,和第 2 行一樣。

在這裡插入圖片描述

相關文章