linux驱动input子系统学习一(基础知识)

一.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;
};

该数据结构的具体分析可以看我的这篇博客,里面对每个参数都进行了详细分析。

https://blog.csdn.net/qq_16777851/article/details/81157439

一个设备驱动可能对应两个设备驱动,比如鼠标既可以对应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.

猜你喜欢

转载自blog.csdn.net/qq_16777851/article/details/81211774