Linux下输入系统编程,随手笔记,有点乱

在这里插入图片描述

这是触摸屏点击的信息在这里插入图片描述定义一个结构体 用来存储以下信息: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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔动山霸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值