加气站类型的网站建设,摄影海报设计图片,app公司开发价格,禅城区网站建设公司EVIOCGBIT(ev, len) 该怎么理解#xff1f;
我们可以推断出#xff0c;它是一个宏#xff0c;它的前两个参数已经确定了#xff0c;具体的功能由后两个参数(ev,len)来决定。Linux-4.9.88\include\uapi\linux\input.h
#define EVIOCGBIT(ev,len) _IOC(_IOC_READ, E, 0x20 …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) 代码2Linux-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事件的最大长度。 .