第一:什么是输入设备?
解答:常见的输入设备为鼠标、键盘、遥控器、电脑、画板等,用户利用输入设备与系统进程交互。
第二:Linux系统为了统一设备,实现了兼容所有的输入设备框架,这个框架就是input子系统。驱动开发人员基于input子系统开发输入设备驱动程序,input子系统可以屏蔽硬件的差异,向应用提供统一的接口。
第三:输入设备读取数据的流程是什么?
1、应用程序打开/dev/input/event0设备文件;
2、应用程序发起读操作(譬如调用read),如果没有数据可读则会进入休眠(阻塞I/O情况)。
3、当有数据可读的时候,应用程序会被唤醒,读操作获取到数据返回。
4、应用程序对读取到的数据进行解析。
核心点:应用程序是如何解析数据的?
struct input_event{ struct timeval time; __u16 type; __u16 code; __s32 value; };
这个结构体中的time成员变量是一个struct timeval类型的变量,内核会记录每次上报的事件发生的时间,并通过变量time返回给应用程序。
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <linux/input.h> int main(int argc, char *argv[]) { struct input_event in_ev = {0}; int fd = -1;
/* 校验传参 */
if (2 != argc) { fprintf(stderr, "usage: %s \n", argv[0]); exit(-1); }
/* 打开文件 */
if (0 > (fd = open(argv[1], O_RDONLY))) { perror("open error"); exit(-1); } for ( ; ; ) {
/* 循环读取数据 */
if (sizeof(struct input_event) != read(fd, &in_ev, sizeof(struct input_event))) { perror("read error"); exit(-1); } printf("type:%d code:%d value:%d\n", in_ev.type, in_ev.code, in_ev.value); } }