以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。
一、编程步骤总结
步骤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、测试