1. 程式人生 > >Linux和android下測試鍵盤和觸控式螢幕 && .kl檔案中的WAKE和WAKE_DROPPED

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: 當裝置睡眠時按下此鍵,裝置將被喚醒,而按鍵事件不會被髮送到應用程式.