Linux和android下測試鍵盤和觸控式螢幕 && .kl檔案中的WAKE和WAKE_DROPPED
在Linux或者Android-x86系統下,會用到測試鍵盤、滑鼠、觸控式螢幕等各種輸入裝置的功能,那麼下面的這段程式碼是個好的選擇。首先編寫了個Linux輸入裝置的測試小程式來檢測問題所在,總算也小有成就。具體輸入裝置的路徑,大家可以用cat /proc/bus/input/devices檢視自己機器的裝置檔案。
(1)檢測按鍵的程式如下:
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <linux/input.h> #define NOKEY 0 int main() { int keys_fd; //按鍵控制代碼 char ret[2]; struct input_event t; keys_fd = open("/dev/input/event0", O_RDONLY); if(keys_fd<=0) { printf("open /dev/input/event0 device error!\n"); return 0; } while(1) { if(read(keys_fd,&t,sizeof(t))==sizeof(t)) { if(t.type==EV_KEY) //獲取的是按鍵訊息 if(t.value==0 || t.value==1) //返回值是1或者0 printf("key %d %s\n",t.code,(t.value)?"Pressed":"Released"); //1表按下,0表彈起 } } close(keys_fd); return 0; }
執行結果如下:
(2)檢測觸控式螢幕的程式如下:
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <linux/input.h> int main() { int keys_fd; char ret[2]; struct input_event t; keys_fd = open("/dev/input/event1", O_RDONLY); //開啟TP裝置 if(keys_fd<=0){ printf("open /dev/input/event0 device error!\n"); return 0; } while(1) { if(read(keys_fd,&t,sizeof(t))==sizeof(t)) { if (t.type == EV_KEY){ printf(" type: EV_KEY, event = %s, value = %d \r\n", t.code == BTN_TOUCH ? "BTN_TOUCH" : "Unkown", t.value); } else if(t.type == EV_ABS){ printf(" type: EV_ABS, event = %s, value = %d \r\n", t.code == ABS_X ? "ABS_X" : t.code == ABS_Y ? "ABS_Y" : t.code == ABS_PRESSURE ? "ABS_PRESSURE" :"Unkown", t.value); //該處使用了一些特殊的用法:: } } } close(keys_fd); return 0; }
執行結果如下:
(3)關於Input裝置,說明:
A,ls -l /dev/input,得到裝置名稱和屬性,注意此處沒有input號這種Input層分配的內容,以event為主。如:
# ls -l /dev/input
crw-rw---- root input 13, 66 1970-01-01 00:00 event2
crw-rw---- root input 13, 33 1970-01-01 00:00 mouse1
crwxrwxrwx root input 13, 65 1970-01-01 00:00 event1
crw-rw---- root input 13, 32 1970-01-01 00:00 mouse0
crw-rw---- root input 13, 64 1970-01-01 00:00 event0
crw-rw---- root input 13, 63 1970-01-01 00:00 mice
如果這麼些裝置中無法確認哪個是目前在用的裝置?可以採用這種方式:cat他們,然後操作滑鼠或者鍵盤,哪個輸出亂碼就是用的哪個。
B,cat /proc/bus/input/devices,主要資訊是:
N: Name="s3c-keypad-rev0000"
P: Phys=s3c-keypad/input0
S: Sysfs=/class/input/input0
H: Handlers=kbd event0
N: Name="S3C TouchScreen"
P: Phys=input(ts)
S: Sysfs=/class/input/input1
U: Uniq=
H: Handlers=kbd mouse0 event1
N: Name="ADXL34x accelerometer"
P: Phys=1-0053/input0
S: Sysfs=/class/input/input2
U: Uniq=
H: Handlers=mouse1 event2
分配的Input節點全在Sysfs上,真正的裝置dev在Handlers上。
C,ls -l /sys/class/input,類裝置資訊:
drwxr-xr-x root root 1970-01-01 00:00 mice
drwxr-xr-x root root 1970-01-01 00:00 input0
lrwxrwxrwx root root 1970-01-01 00:04 event0 -> input0/event0
drwxr-xr-x root root 1970-01-01 00:00 input1
lrwxrwxrwx root root 1970-01-01 00:04 mouse0 -> input1/mouse0
lrwxrwxrwx root root 1970-01-01 00:04 event1 -> input1/event1
drwxr-xr-x root root 1970-01-01 00:00 input2
lrwxrwxrwx root root 1970-01-01 00:04 mouse1 -> input2/mouse1
lrwxrwxrwx root root 1970-01-01 00:04 event2 -> input2/event2
======================================================================================================
android系統中,獲取到鍵盤的鍵值後,會搜尋/system/usr/keylayout/mtk-kpd.kl這個檔案,比如:
key 115 VOLUME_UP WAKE_DROPPED
key 114 VOLUME_DOWN WAKE_DROPPED
key 102 HOME WAKE
如果驅動code與其中的鍵值相對應,android就會響應對應的按鍵資訊。
WAKE: 當裝置睡眠時按下此鍵,裝置將被喚醒,按鍵事件將會被髮送到應用程式。WAKE_DROPPED: 當裝置睡眠時按下此鍵,裝置將被喚醒,而按鍵事件不會被髮送到應用程式.