这是触摸屏点击的信息
定义一个结构体 用来存储以下信息:struct input_id id;可以获得版本号啥的,对应上图的I
struct input_id {
__u16 bustype;
__u16 vendor;
__u16 product;
__u16 version;
};
使用ioctl把信息从驱动程序里面存到指定的id
iotcl(fd,EVIOCGID,&id)
EVIOCGID信息如下,其实就是一个宏,对应IOR(‘E’, 0x02, struct input_id),意思是填入这些参数进去
#define EVIOCGVERSION _IOR('E', 0x01, int) /* get driver version */
#define EVIOCGID _IOR('E', 0x02, struct input_id) /* get device ID */
#define EVIOCGREP _IOR('E', 0x03, unsigned int[2]) /* get repeat settings */
#define EVIOCSREP _IOW('E', 0x03, unsigned int[2]) /* set repeat settings */
#define EVIOCGKEYCODE _IOR('E', 0x04, unsigned int[2]) /* get keycode */
#define EVIOCGKEYCODE_V2 _IOR('E', 0x04, struct input_keymap_entry)
#define EVIOCSKEYCODE _IOW('E', 0x04, unsigned int[2]) /* set keycode */
#define EVIOCSKEYCODE_V2 _IOW('E', 0x04, struct input_keymap_entry)
读取/dev/input/event1回读到下面的值,每个输入事件input_event中都含有发生时间:timeval表示的是“自系统启动以来过了多少时间”,它是一个结构体,含有“tv_sec、tv_usec”两项(即秒、微秒)。
输入事件input_event中更重要的是:type(哪类事件)、code(哪个事件)、value(事件值),
struct input_event event;
len = read(fd,&event,sizeof(event)) ;
struct input_event {
struct timeval time;
__u16 type;
__u16 code;
__s32 value;
};
poll结构体: struct pollfd fds[1];要监听多少个文件你的数据就多大;
struct pollfd {
int fd;
short events;
short revents;
};
参数书写大全:一般只用设置fd和events就可以了
文件fd:监听哪一个文件
事件 events
POLLIN 有数据可读
POLLRDNORM 有普通数据可读
POLLRDBAND 有优先数据可读
POLLPRI 有紧急数据可读
POLLOUT 数据可写
POLLWRNORM 普通数据可写
POLLWRBAND 优先数据可写
POLLMSGSIGPOLL 消息可用
返回事件 revent
除了 事件外;还有
POLLERR 指定描述符发生错误
POLLHUP 指定文件描述符挂起事件
POLLNVAL 指定描述符非法
int ret = poll(fds, nfds, 5000);填完上面的结构体后调用poll函数进行真正的监听,>0代表在范围内,=0代表超时,<0代表监听失败
完整代码演示
#include <linux/input.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <poll.h>
/* ./01_get_input_info /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_id id;
unsigned int evbit[2];
struct input_event event;
//定义一个poll结构体
struct pollfd fds[1];
nfds_t nfds = 1;
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 ",
"NULL ",
"EV_LED ",
"EV_SND ",
"NULL ",
"EV_REP ",
"EV_FF ",
"EV_PWR ",
};
if (argc < 2)
{
printf("Usage: %s <dev> [noblock]\n", argv[0]);
return -1;
}
if (argc == 3 && !strcmp(argv[2], "noblock"))
{
fd = open(argv[1], O_RDWR | O_NONBLOCK);
}
else
{
fd = open(argv[1], O_RDWR);
}
if (fd < 0)
{
printf("open %s err\n", argv[1]);
return -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);
if (len > 0 && len <= sizeof(evbit))
{
printf("support ev type: ");
for (i = 0; i < len; i++)
{
byte = ((unsigned char *)evbit)[i];
for (bit = 0; bit < 8; bit++)
{
if (byte & (1<<bit)) {
printf("%s ", ev_names[i*8 + bit]);
}
}
}
printf("\n");
}
while (1)
{
fds[0].fd = 0;
fds[0].events=POLLIN;//监听是否有数据读出
fds[0].revents=0;
//poll参数:要监听的数组,监听多少秒,5000为5秒
int ret = poll(fds, nfds, 5000);
if(ret>0)//在监听事件之内
{
if (fds[0].revents == POLLIN)//如果监听到了 POLLIN事件
{
while (read(fd, &event, sizeof(event)) == sizeof(event))
{
printf("get event: type = 0x%x, code = 0x%x, value = 0x%x\n", event.type, event.code, event.value);
}
}
}
else if(ret == 0)
{
printf("监听超时\n");
}
else
printf("监听错误\n");
}
return 0;
}