@[TOC](使用 poll 函数监测多个输入设备)
Imx9ull开发板实验现象
- 输入硬件信息
- 实验现象
每次按键按下ret = 1,说明两个输入设备只有一个触发了EV_KEY事件
代码
#include <linux/input.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <poll.h>
/* ./02_input_read /dev/input/event0 noblock]*/
int main(int argc,char **argv)
{
int fd;
int err;
int len;
int i;
unsigned char byte;
int bit;
struct input_event event;
struct pollfd fds[2];
nfds_t nfds = 2;
int timeout_ms = 5000;
int ret = 0;
struct input_id id;
unsigned int evbit[2];
char *ev_names[] = {
"EV_SYN",
"EV_KEY",
"EV_REL",
"EV_ABS",
"EV_MSC",
"EV_SW ",
"NULL",
"NULL",
"NULL",
"NULL",
"NULL",
"NULL",
"NULL",
"NULL",
"NULL",
"NULL",
"EV_LED",//0x11 = 17D
"EV_SND",
"NULL",
"EV_REP",
"EV_FF ",
"EV_PWR",
};
if (argc == nfds + 1)
{
for (int i = 0;i < nfds; i++)
{
/* 打开文件 */
fd = open(argv[i+1],O_RDWR | O_NONBLOCK);//非阻塞模式->查询
if (fd < 0)
{
printf("open %s err\n",argv[i+1]);
}
/* 获取文件信息,并打印*/
err = ioctl(fd,EVIOCGID,&id);
if (err == 0)
{
printf("bustype = 0x%x\n", id.bustype);
printf("vendor = 0x%x\n", id.vendor );
printf("product = 0x%x\n", id.product);
printf("version = 0x%x\n", id.version);
}
/*获取输入设备支持的事件类型,并打印*/
len = ioctl(fd,EVIOCGBIT(0,sizeof(evbit)),&evbit);//取出来几个字节的数据
printf("len = %d\n",len);
if (len > 0 && len <= sizeof(evbit))
{
printf("%s support ev type: ",argv[i+1]);
for (int j= 0; j< len; j++)
{
byte = ((unsigned char *)evbit)[j];
for (bit = 0; bit < 8; bit++)
{
if (byte & (1<<bit)){
printf("%s ", ev_names[j*8 + bit]);
}
}
}
printf("\n");
}
/* 设置poll的文件描述符与关注的事件信息 */
fds[i].fd = fd;
fds[i].events = POLLIN;
}
}else
{
printf("Usage:%s <dev> <dev>\n",argv[0]);
return -1;
}
while (1)
{
for (int i = 0; i < nfds; i++)
{
fds[i].revents = 0; //很重要,每次清零
}
ret = poll(fds,nfds,timeout_ms);
if (ret > 0)
{
printf("ret = %d"\n,ret);
for (int i = 0; i < nfds; i++)
{
if (fds[i].revents == POLLIN)
{
while (read(fds[i].fd, &event, sizeof(event)) == sizeof(event)) //非阻塞模式->查询,会一直读;
{
printf("get %s event: event type = -0x%x, event code = 0x%x, event value = 0x%x\n", argv[i+1],event.type,event.code,event.value);
}
}
}
}else if (ret == 0)
{
printf("timeout\n");
}else
{
printf("poll err\n");
}
}
}