Linux驅動學習(2) 從usb驅動到input子系統1

獲取設備事件

(一)此節先不詳細說明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,但此程序可以通過接收不同參數打印不同設備的事件,輸出鍵盤設備的事件如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章