一.Linux中的input子系统介绍
Input驱动程序是linux输入设备的驱动程序,分成游戏杆(joystick)、鼠标(mouse和mice)、键盘(keyboard)、事件设备(event)。其中事件设备驱动程序是目前通用的驱动程序,可支持键盘、鼠标、触摸屏等多种输入设备。
Linux input 子系统将一个输入设备的输入过程分成了设备驱动(input device driver)和事件驱动(input event driver)两个层。前者负责从底层硬件采集数据;后者负责与用户程序接口,将采集到的数据分发给不同的用户接口。通过这样的设计,将千差万别的设备统一到了为数不多的几种驱动接口上。同一种事件驱动可以用来处理多个同类设备;同一个设备也可以和多种事件驱动相衔接。而事件驱动和设备驱动则由输入核心层进行连接,匹配。
上:输入事件驱动层 (打包数据,面向应用)
中:输入核心层 (向下提供注册接口,向上给具体的hander发送数据)
下:输入设备驱动层 (底层驱动,面向硬件)
下面我先以一个简单的应用程序来说明如何使用input子系统。后面几节再分析输入子系统的驱动部分。
应用程序使用input子系统的核心是,对驱动层打包好的数据进行分析。其中打包的数据结构如下:
/*
* The event structure itself
*/
struct input_event {
struct timeval time;
__u16 type;
__u16 code;
__s32 value;
};
该数据结构的具体分析可以看我的这篇博客,里面对每个参数都进行了详细分析。
srtruct input_event学习_To_run_away的博客-CSDN博客
一个设备驱动可能对应两个设备驱动,比如鼠标既可以对应mouse,也可以对应event。
event事件设备驱动程序是通用的,可以包括所有类型的输入设备,也是目前的主流,我们就以它为例分析。
应用层操作驱动有2条路:/dev目录下的设备文件,/sys目录下的属性文件。两个效果是一样的,用那个都可以。
下面是我机器上了输入子系统在/sys/目录和/dev/目录下的设备,起始都一样的。
先写一个简单的应用程序。
其作用是,读我电脑鼠标的数据并打印出来。
#include <linux/input.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#define INPUT_MOUSE "/dev/input/event3" /* 我电脑的鼠标 */
#define INPUT_KEY "/dev/input/event1" /* 我电脑的键盘 */
int main(void)
{
int fd = -1, ret = -1;
struct input_event ev;
fd = open(INPUT_MOUSE , O_RDONLY); /* 打开鼠标的设备文件 */
if(fd < 0)
{
perror("open");
return -1;
}
while(1)
{
memset(&ev, 0, sizeof(struct input_event));
ret = read(fd, &ev, sizeof(struct input_event)); /* 读鼠标(会阻塞) */
if(ret != sizeof(struct input_event))
{
perror("read");
close(fd);
return -1;
}
/* 打印读到的键值 */
printf("--------------------\n");
printf("type = %u.\n", ev.type);
printf("code = %u.\n", ev.code);
printf("value = %u.\n", ev.value);
}
return 0;
}
下面是移动打印出来的数据。(具体数据代表含义参考上面的那篇博客)
--------------------
type = 2. /* 相对坐标设备(鼠标) */
code = 0. /* x轴 */
value = 1. /* 位移方向 */
--------------------
type = 2. /* 相对坐标设备(鼠标) */
code = 1. /* y轴 */
value = 1. /* 位移方向 */
--------------------
type = 0. /* 同步包 */
code = 0.
value = 0.
--------------------
type = 2.
code = 0.
value = 1.
--------------------
type = 2.
code = 1.
value = 1.
--------------------
type = 0.
code = 0.
value = 0.