以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。
一、编程步骤总结
步骤1:确定设备文件名字
步骤2:使用标准接口打开与读取设备文件
步骤3:解析struct input_event
二、编程步骤分析
1、确定设备文件名
应用层操作驱动有2条路:/dev目录下的设备文件,/sys目录下的属性文件。input子系统用的是/dev目录下的设备文件,具体一般都是在 /dev/input/event* 。
我们可以用cat命令来确认某个设备文件名对应哪个具体设备。比如我们在开发板“ cat /dev/input/event* ”(这里的*用具体的数字填充进去),然后晃动鼠标或者在键盘上敲打字,如果有反应,就表示该设备文件对应着鼠标或者键盘。
这里实测得知键盘是event1,而鼠标是event3。
2、使用标准接口操作设备文件
即使用open、read/write函数操作设备文件。
3、解析input_event结构体变量
解析input_event结构体变量(即读取该结构体变量成员的信息),可得知输入事件信息。
事件类型定义在x210_kernel\include\linux\input.h文件中,内容如下:
/** 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)
三、代码与测试
1、代码示例
(1)键盘事件
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <linux/input.h> #include <string.h>#define DEVICE_KEY "/dev/input/event1" #define DEVICE_MOUSE "/dev/input/event3"int main(void) {int fd = -1, ret = -1;struct input_event ev;// 第1步:打开设备文件fd = open(DEVICE_KEY, O_RDONLY);if (fd < 0){perror("open");return -1;}while (1){// 第2步:读取一个event事件包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;}// 第3步:解析event包,才知道发生了什么样的输入事件printf("%s.\n", (unsigned char *)&ev); }// 第4步:关闭设备close(fd);return 0; }
(2)鼠标事件:在上面代码中将设备文件换成鼠标对应的设备文件,第3步换成下面代码。
// 第3步:解析event包,才知道发生了什么样的输入事件printf("-------------------------\n");printf("type: %hd\n", ev.type);printf("code: %hd\n", ev.code);printf("value: %d\n", ev.value);printf("\n");
2、测试