Linux应用编程(三):输入系统

一:输入系统

输入系统介绍和驱动参考:https://blog.csdn.net/qq_34968572/article/details/89875957

输入系统事件的读取和分析:

1、获取与事件对应相关的设备信息指令:

cat /proc/bus/input/devices

Linux应用编程(三):输入系统_第1张图片

参数对应含义:

I:设备ID

struct input_id {
	__u16 bustype; //总线类型
	__u16 vendor;  //与厂商相关的ID
	__u16 product; //与产品相关的ID
	__u16 version; //版本号
};

N:设备名称

P:系统层次结构中设备的物理路径

S:位于sys文件系统的路径

U:设备的唯一标识码

H:与设备关联的输入句柄列表

B:位图

PROP:设备属性。
EV:设备支持的事件类型。
KEY:此设备具有的键/按钮。
MSC:设备支持的其他事件。
LED:设备上的指示灯。

2、查看事件命令:

hexdump /dev/input/event1

先来看下内核中event事件类型结构,再根据hexdump指令分析一个鼠标事件:

struct timeval {
	__kernel_time_t		tv_sec;		/* seconds */
	__kernel_suseconds_t	tv_usec;	/* microseconds */
};

struct input_event {
	struct timeval time;
	__u16 type;
	__u16 code;
	__s32 value;
};

Linux应用编程(三):输入系统_第2张图片

1列:hexdump序列号

2~3列:秒

4~5列:微妙

6列:事件类型,相对事件,绝对事件等

/*
 * Event types
 */

#define EV_SYN			0x00  同步事件
#define EV_KEY			0x01  按键事件
#define EV_REL			0x02  相对事件
#define EV_ABS			0x03  绝对事件
#define EV_MSC			0x04
#define EV_SW			0x05
#define EV_LED			0x11
#define EV_SND			0x12
#define EV_REP			0x14
#define EV_FF			0x15
#define EV_PWR			0x16
#define EV_FF_STATUS		0x17
#define EV_MAX			0x1f
#define EV_CNT			(EV_MAX+1)

7列:事件值,对于鼠标这种相对事件来说code代表的是相对于鼠标当前的位置的x或者y坐标

/*
 * Keys and buttons
 *
 * Most of the keys/buttons are modeled after USB HUT 1.12
 * (see http://www.usb.org/developers/hidpage).
 * Abbreviations in the comments:
 * AC - Application Control
 * AL - Application Launch Button
 * SC - System Control
 */

#define KEY_RESERVED		0
#define KEY_ESC			1
#define KEY_1			2
#define KEY_2			3
#define KEY_3			4
#define KEY_4			5
... ...

8列:具体设备对应值的含义,这里表示为相对于当前位置偏移了多少

二:应用程序

struct input_event event_mouse ;
int fd    = -1 ;

fd = open("/dev/input/event2", O_RDONLY);
read(fd, &event_mouse, sizeof(event_mouse));
if(EV_ABS == event_mouse.type || EV_REL == event_mouse.type)
{
//code表示相对位移X或者Y,当判断是X时,打印X的相对位移value
//当判断是Y时,打印Y的相对位移value
if(event_mouse.code == REL_X)
{
    printf("event_mouse.code_X:%d\n", event_mouse.code);
    printf("event_mouse.value_X:%d\n", event_mouse.value);
}
else if(event_mouse.code == REL_Y)
{
    printf("event_mouse.code_Y:%d\n", event_mouse.code);
    printf("event_mouse.value_Y:%d\n", event_mouse.value);
}

 

你可能感兴趣的:(Linux应用开发)