【Linux驱动层】EVIOCGBIT

EVIOCGBIT(ev, len) 该怎么理解?

我们可以推断出,它是一个宏,它的前两个参数已经确定了,具体的功能由后两个参数(ev,len)来决定。Linux-4.9.88\include\uapi\linux\input.h

#define EVIOCGBIT(ev,len)	_IOC(_IOC_READ, 'E', 0x20 + (ev), len)	/* get event bits */

但这个宏能实现什么功能呢?我们需要分析下面这两段代码:

代码1(Linux-4.9.88\include\uapi\linux\input-event-codes.h):

在这里插入图片描述

代码2(Linux-4.9.88\drivers\input\evdev.c):

static int handle_eviocgbit(struct input_dev *dev, 
			    unsigned int type, unsigned int size,
			    void __user *p, int compat_mode)
{
	unsigned long *bits;
	int len;

	switch (type) {

	case      0: bits = dev->evbit;  len = EV_MAX;  break;
	case EV_KEY: bits = dev->keybit; len = KEY_MAX; break;
	case EV_REL: bits = dev->relbit; len = REL_MAX; break;
	case EV_ABS: bits = dev->absbit; len = ABS_MAX; break;
	case EV_MSC: bits = dev->mscbit; len = MSC_MAX; break;
	case EV_LED: bits = dev->ledbit; len = LED_MAX; break;
	case EV_SND: bits = dev->sndbit; len = SND_MAX; break;
	case EV_FF:  bits = dev->ffbit;  len = FF_MAX;  break;
	case EV_SW:  bits = dev->swbit;  len = SW_MAX;  break;
	default: return -EINVAL;
	}

	return bits_to_user(bits, len, size, p, compat_mode);
}

因此我们可以分析出:

  1. 如果我们需要获取 /dev/input 目录下的 eventX 设备支持哪些事件(EV_KEY、EV_REL和EV_ABS等),可以通过ioctl调用指定EVIOCGBIT(0, size)选项来获取,例如:
len = ioctl(fd, EVIOCGBIT(0, EV_MAX), buf);
  1. 我们如果我们需要获取 /dev/input 目录下的 eventX 设备支持 EV_ABS事件 的哪些功能的话,我们可以可以通过ioctl调用指定EVIOCGBIT(EV_ABS, size)选项来获取,例如:
len = ioctl(fd, EVIOCGBIT(3, ABS_MAX), buf);

len是读到的数据,EV_MAX是evbit事件的最大长度,ABS_MAX是EV_ABS事件的最大长度。
.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值