当前位置: 首页 > news >正文

【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事件的最大长度。
.

http://www.lryc.cn/news/248232.html

相关文章:

  • 鸿蒙4.0开发笔记之ArkTS装饰器语法基础@Extend扩展组件样式与stateStyles多态样式(十一)
  • 5V摄像机镜头驱动IC GC6208,可用于摄像机,机器人等产品中可替代AN41908
  • PHP echo和print 语句
  • ThinkPHP6.1 多应用模式的一些事儿
  • redis-cluster集群模式
  • 带你用uniapp从零开发一个仿小米商场_10. 首页开发
  • 常使用的定时任务
  • 【人工智能Ⅰ】实验2:遗传算法
  • Hadoop集群升级(3.1.3 -> 3.2.4)
  • (一)基于高尔夫优化算法GOA求解无人机三维路径规划研究(MATLAB)
  • ESP32-Web-Server编程-建立第一个网页
  • csgo/steam游戏搬砖项目的五大认知误区
  • ASCII sorting
  • redis--高可用之持久化
  • 『VUE3 の 要点摘录』
  • Buzz库python代码示例
  • Django路由分发
  • 【UGUI】中Content Size Fitter)组件-使 UI 元素适应其内容的大小
  • 第二十章Java博客
  • 实验一 SAS 基本操作和数据表的导入 2023-11-29
  • YOLOv5改进之ShuffleNetV2
  • tcp/ip协议 error=10022 Winsock.reg Winsock2.reg
  • 【Redis基础】Redis基本的全局命令
  • Vite 了解
  • oracle常用通用sql脚本——查询前用户的表空间信息
  • Python内置类属性`__name__`属性的使用教程
  • BUUCTF-pwn-ciscn_2019_ne_51
  • 【限时免费】20天拿下华为OD笔试之【哈希表】2023Q2B-选修课【欧弟算法】全网注释最详细分类最全的华为OD真题题解
  • Android关于杀掉进程的方案
  • mysql数据库基本概念简介