第三十讲 检测按键输入
一、 按键输入实验
1、设备节点文件路径
/dev/input/by-path/platform-gpio-keys-event
2、input 子系统
input 子系统的功能非常强大,它可以用在多种输入设备上面。例如:按键、键盘、鼠标、触摸屏等等。
input 子系统是将一系列的输入设备都抽象出来了,并不是针对某一设备。
3、input_event 结构体
作用:是 input 子系统规定设备的使用方式。在使用的时候需要按照 input_event 结构体多设备文件进行读写。
原型
struct input_event
{
struct timeval time;
__u16 type;
__u16 code;
__s32 value;
};
参数说明
time:记录输入输入触发时间戳
type:输入事件类型
按键输入类型、坐标输入类型、特殊类型:EV_SYN(同步事件,提醒用户及时处理易发生的输入事件)
code:记录输入事件代号
例如发生键盘输入事件,code 记录键盘按下的值
value:记录事件具体的值
例如按键事件,按下为1 松开为0
二、实验代码
/*
* @LastEditors: 夜雨
* @Date: 2021-09-30 21:24:19
* @LastEditTime: 2021-09-30 22:14:40
* @FilePath: \003key\key.c
*/
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <linux/input.h>
#include <linux/input-event-codes.h>
#define KEY_PATH "/dev/input/by-path/platform-sgpio-keys-event"
int main(char *argc, char **argv)
{
int fd = -1;
struct input_event event;
fd = open(KEY_PATH, O_RDWR);
if(fd == -1)
{
close(fd);
printf("Open file "KEY_PATH" failed! code = %d\r\n", fd);
return -1;
}
while(1)
{
if(read(fd, &event, sizeof(event)) == -1)
{
printf("Read input file failed!\r\n");
close(fd);
}
else
{
if(event.type == EV_SYN)
{
printf("Syn event is occur!\r\n");
}
else
{
printf("Event time = %ld.%ld, type is %d, code is %d, value is %d\r\n",\
event.time.tv_sec,\
event.time.tv_usec,\
event.type,\
event.code,\
event.value);
}
}
}
}