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);
}
因此我们可以分析出:
- 如果我们需要获取 /dev/input 目录下的 eventX 设备支持哪些事件(EV_KEY、EV_REL和EV_ABS等),可以通过ioctl调用指定
EVIOCGBIT(0, size)
选项来获取,例如:
len = ioctl(fd, EVIOCGBIT(0, EV_MAX), buf);
- 我们如果我们需要获取 /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事件的最大长度。
.