獲取設備事件
(一)此節先不詳細說明Linux input子系統的架構,而是簡單舉兩個獲取設備事件的方法。Linux內核和驅動合力將設備映射爲一個事件結點文件event,就像其他的字符設備文件操作一樣,通過對事件文件的讀取就可以接收設備消息。
1.查看設備對應event號,event文件可以在/dev/input下查看,例如我的:
ls /dev/input
2.尋找哪個事件文件對應哪個設備,可以在/proc/bus/input/devices中查看,例如我的設備中有如下輸出
cat /proc/bus/input/devices
這裏先不解釋各項內容,可以看到Name和Handlers,Name可以對應設備,handlers對應事件結點。我這裏鍵盤設備keyboard對應事件結點event3
3.打印事件,有兩種方式事件
(1)使用hexdump命令打印事件內容,好處是使用簡單,不需要寫程序,壞處是隻能查看二進制內容,分析不夠方便。
hexdump /dev/input/event3
每次按下鍵盤都會在終端上看到二進制內容輸出,表明收到了事件。
(2)編寫應用程序輸出事件內容,可以將輸出內容用於初始化結構體struct input_event,從而可以得到更加詳細的事件。
#include<stdio.h>
#include<stdlib.h>
#include<linux/input.h>
#include<fcntl.h>
int main(int argc,char **args)
{
int fd;
struct input_event event;
char event_addr[10]={};
if(args[1]!=NULL && args[1][0]>=48 && args[1][0]<=57)
{
sprintf(event_addr,"/dev/input/event%d",args[1][0]-48);
}
else
{
printf("error input\n");
return 0;
}
fd=open(event_addr,O_RDONLY);
if(fd<=0)
{
printf("read event error\n");
return 0;
}
while(1)
{
if(read(fd,&event,sizeof(event)) == sizeof(event))
{
printf("event type:[%d],event value:[%d],event code:[%d]\n",event.type,event.value,event.code);
}
}
close(fd);
return 0;
}
注意編譯方式,需要先在ubuntu上進行編譯,且需要編譯爲靜態文件,然後再拷貝到最小系統的根文件系統中:
gcc input_mouse.c -o input_mouse -static
我這起的名字雖然是input_mouse,但此程序可以通過接收不同參數打印不同設備的事件,輸出鍵盤設備的事件如下: