https://www.kernel.org/doc/html/latest/input/event-codes.html#input-event-codes

翻译:

2. input事件编码

input协议使用types和codes映射将输入设备值表达到用户空间。本文档描述了types和codes以及如何使用、何时使用。

译者注:input协议由定义于/usr/include/linux/input.h的struct input_event结构体描述:

/** The event structure itself* Note that __USE_TIME_BITS64 is defined by libc based on* application's request to use 64 bit time_t.*/struct input_event {#if (__BITS_PER_LONG != 32 || !defined(__USE_TIME_BITS64)) && !defined(__KERNEL__)struct timeval time;
#define input_event_sec time.tv_sec
#define input_event_usec time.tv_usec
#else__kernel_ulong_t __sec;
#if defined(__sparc__) && defined(__arch64__)unsigned int __usec;unsigned int __pad;
#else__kernel_ulong_t __usec;
#endif
#define input_event_sec  __sec
#define input_event_usec __usec
#endif__u16 type;__u16 code;__s32 value;
};

主要是包含了一个时间,事件类型type,事件编码code,事件值。我们今天讨论的就是有哪些事件类型,以及这种事件类型支持哪些编码,不同的编码其value有不同的含义。

单个硬件事件会生成多个输入事件。每个输入事件都包含单个数据项的新值。一种特殊的事件类型,EV_SYN,用于将输入事件分离为同时发生的输入数据变化包。在下文中,术语“事件”是指包含类型、代码和值的单个输入事件。

译者注:上面这段话的意思是说,一个硬件时间可能会产生多个struct input_event,例如鼠标的一次移动会产生x,y坐标两个值,为了标识这两个input是同一时刻发生的,会先发一个特殊事件EV_SYN。

输入协议是有状态的协议。仅当事件代码的值发生更改时才会发出事件。然而,这个状态是在 Linux 输入子系统中维护的;驱动程序不需要维护状态,并且可能会尝试发出不变的值而不会造成伤害。用户空间可以使用 linux/input.h 中定义的 EVIOCG* ioctl 获取事件代码值的当前状态。设备支持的事件报告也由 sysfs 在 class/input/event*/device/capabilities/ 中提供,设备的属性在 class/input/event*/device/properties 中提供。

2.1 事件类型

事件类型是逻辑输入结构下的代码组。每种类型都有一组可用于生成事件的适用代码。有关每种类型的有效代码的详细信息,请参阅代码部分。

  • EV_SYN:

    • 用作分隔事件的标记。事件可以在时间或空间上分离,例如使用多点触控协议。
  • EV_KEY:
    • 用于描述键盘、按钮或其他类似键的设备的状态变化。
  • EV_REL:
    • 用于描述相对轴值的变化,例如将鼠标向左移动 5 个单位。
  • EV_ABS:
    • 用于描述绝对轴值变化,例如描述触摸屏上的触摸坐标。
  • EV_MSC:
    • 用于描述不适合其他类型的杂项输入数据。
  • EV_SW:
    • 用于描述二进制状态输入开关。
  • EV_LED:
    • 用于打开和关闭设备上的 LED。
  • EV_SND:
    • 用于向设备输出声音。
  • EV_REP:
    • 用于自动重复设备。
  • EV_FF:
    • 用于向输入设备发送力反馈命令。
  • EV_PWR:
    • 电源按钮和开关输入的特殊类型。
  • EV_FF_STATUS:
    • 用于接收力反馈设备状态。

2.2. 事件代码

事件代码定义了事件的精确类型。

2.2.1。EV_SYN

EV_SYN 事件值未定义。它们的使用仅由它们在 evdev 事件流中发送的时间来定义。

  • SYN_REPORT:

    • 用于将事件同步并分离为同时发生的输入数据变化的数据包。例如,鼠标的运动可能会为一个运动设置 REL_X 和 REL_Y 值,然后发出 SYN_REPORT。下一个动作将发出更多的 REL_X 和 REL_Y 值并发送另一个 SYN_REPORT。
  • SYN_CONFIG:
    • 待定
  • SYN_MT_REPORT:
    • 用于同步和分离触摸事件。有关详细信息,请参阅 多点触控 (MT) 协议文档。
  • SYN_DROPPED:
    • 用于指示 evdev 客户端的事件队列中的缓冲区溢出。客户端应忽略直到并包括下一个 SYN_REPORT 事件的所有事件,并查询设备(使用 EVIOCG* ioctls)以获取其当前状态。

2.2.2。EV_KEY

EV_KEY 事件采用 KEY_ 或 BTN_ 的形式。例如,KEY_A 用于表示键盘上的“A”键。当一个键被按下时,一个带有键代码的事件被发出,值为 1。当键被释放时,一个事件被发出,值为 0。一些硬件在重复一个键时发送事件。这些事件的值为 2。通常,KEY_ 用于键盘按键,而 BTN_ 用于其他类型的瞬时开关事件。

一些 EV_KEY 代码有特殊含义:

  • BTN_TOOL_<名称>:

    • 这些代码与输入触控板、平板电脑和触摸屏结合使用。这些设备可以与手指、笔或其他工具一起使用。当发生事件并使用工具时,应将相应的 BTN_TOOL_ 代码设置为值 1。当工具不再与输入设备交互时,应将 BTN_TOOL_ 代码重置为 0。生成事件时,所有触控板、平板电脑和触摸屏都应使用至少一个 BTN_TOOL_ 代码。同样,所有触控板、平板电脑和触摸屏一次只能导出一个 BTN_TOOL_。为了不破坏现有用户空间,建议不要在一个 EV_SYN 帧中切换工具,而是首先在 0 处发出旧的 BTN_TOOL_,然后发出一个 SYN_REPORT,然后将新的 BTN_TOOL_ 设置为 1。
  • BTN_TOUCH:

    BTN_TOUCH 用于触摸接触。当确定输入工具处于有意义的物理接触范围内时,此属性的值必须设置为 1。有意义的物理接触可能意味着任何接触,或者可能意味着由实现定义的属性限定的接触。例如,只有当触摸压力上升到某个值以上时,触摸板才会将该值设置为 1。BTN_TOUCH 可以与 BTN_TOOL_ 代码结合使用。例如,当笔悬停在数位板表面但未接触数位板表面时,数位板可以将 BTN_TOOL_PEN 设置为 1,将 BTN_TOUCH 设置为 0。

注意:对于旧版 mousedev 仿真驱动程序的适当功能,BTN_TOUCH 必须是同步帧中发出的第一个 evdev 代码。

注意:历史上带有 BTN_TOOL_FINGER 和 BTN_TOUCH 的触摸设备被用户空间解释为触摸板,而没有 BTN_TOOL_FINGER 的类似设备被解释为触摸屏。为了与当前用户空间向后兼容,建议遵循此区别。将来,这种区别将被弃用,设备属性 ioctl EVIOCGPROP(定义在 linux/input.h 中)将用于传达设备类型。

  • BTN_TOOL_FINGER、BTN_TOOL_DOUBLETAP、BTN_TOOL_TRIPLETAP、BTN_TOOL_QUADTAP:

    • 这些代码表示触控板或触摸屏上的一、二、三和四指交互。例如,如果用户使用两根手指并在触摸板上移动它们以努力滚动屏幕上的内容,则 BTN_TOOL_DOUBLETAP 应在运动期间设置为值 1。请注意,所有 BTN_TOOL_ 代码和 BTN_TOUCH 代码都是正交的。由手指触摸生成的触控板事件应为每组中的一个代码生成事件。在任何同步帧期间,这些 BTN_TOOL_ 代码中最多只有一个的值为 1。

注意:过去,一些驱动程序会在同一同步帧中发出多个值为 1 的手指计数代码。此用法已弃用。

注意:在多点触控驱动程序中,input_mt_report_finger_count()应该使用该函数来发出这些代码。有关详细信息,请参阅多点触控 (MT) 协议。

2.2.3。EV_REL

EV_REL 事件描述属性的相对变化。例如,鼠标可能会向左移动一定数量的单位,但它在空间中的绝对位置是未知的。如果绝对位置已知,则应使用 EV_ABS 代码而不是 EV_REL 代码。

一些 EV_REL 代码具有特殊含义:

  • REL_WHEEL,REL_HWHEEL:

    • 这些代码分别用于垂直和水平滚轮。该值是在轮子上移动的棘爪数,其物理尺寸因设备而异。对于高分辨率滚轮,这可能是基于高分辨率滚动事件的近似值,请参阅 REL_WHEEL_HI_RES。这些事件代码是旧代码,如果可用,应首选 REL_WHEEL_HI_RES 和 REL_HWHEEL_HI_RES。
  • REL_WHEEL_HI_RES、REL_HWHEEL_HI_RES:

    • 高分辨率滚轮数据。累加值120表示移动一个棘爪。对于不提供高分辨率滚动的设备,该值始终是 120 的倍数。对于具有高分辨率滚动的设备,该值可能是 120 的小数。

      如果垂直滚轮支持高分辨率滚动,则除了 REL_WHEEL 或 REL_HWHEEL 之外,还会发出此代码。REL_WHEEL 和 REL_HWHEEL 可以是基于高分辨率滚动事件的近似值。无法保证在模拟 REL_WHEEL 或 REL_HWHEEL 事件时高分辨率数据是 120 的倍数。

2.2.4。EV_ABS

EV_ABS 事件描述属性的绝对变化。例如,触摸板可以发出触摸位置的坐标。

一些 EV_ABS 代码具有特殊含义:

  • ABS_DISTANCE:

    • 用于描述工具与交互表面的距离。此事件仅应在工具悬停时发出,这意味着靠近设备并且 BTN_TOUCH 代码的值为 0。如果输入设备可以在三个维度上自由使用,请考虑使用 ABS_Z。
    • BTN_TOOL_ 应在工具进入可检测接近范围时设置为 1,在工具离开可检测接近范围时设置为 0。BTN_TOOL_ 表示当前由硬件检测到的工具类型,并且与 ABS_DISTANCE 和/或 BTN_TOUCH 无关。
  • ABS_MT_<名称>:

    • 用于描述多点触控输入事件。有关详细信息,请参阅 多点触控 (MT) 协议。
  • ABS_PRESSURE/ABS_MT_PRESSURE:

    • 对于触摸设备,许多设备将接触尺寸转换为压力。手指因压力而变平,从而导致更大的接触面积,因此压力和接触尺寸直接相关。对于其他设备而言,情况并非如此,例如带有真正压力传感器的数字化仪和触摸板(“压力板”)。

      设备应设置轴的分辨率以指示压力是否以可测量单位表示。如果分辨率为零,则压力数据采用任意单位。如果分辨率不为零,则压力数据以单位/克为单位。例如,分辨率为 1 的值 10 表示 10 克,分辨率为 1000 的值 10 表示 10 微克。

2.2.5。EV_SW

EV_SW 事件描述有状态的二进制开关。例如,SW_LID 代码用于表示笔记本电脑盖何时关闭。

在绑定到设备或从挂起恢复时,驱动程序必须报告当前的开关状态。这确保了设备、内核和用户空间状态是同步的。

恢复时,如果开关状态与挂起之前相同,则输入子系统将过滤掉重复的开关状态报告。驱动程序不需要随时保持开关的状态。

2.2.6。EV_MSC

EV_MSC 事件用于不属于其他类别的输入和输出事件。

一些 EV_MSC 代码具有特殊含义:

  • MSC_TIMESTAMP:

    • 用于报告自上次重置以来的微秒数。此事件应编码为 uint32 值,允许回绕而没有特殊后果。假设两个连续事件之间的时间差在合理的时间尺度(小时)上是可靠的。可能会发生重置为零,在这种情况下,自上次事件以来的时间是未知的。如果设备不提供此信息,则驱动程序不得将其提供给用户空间。

2.2.7。EV_LED

EV_LED 事件用于输入和输出,以设置和查询设备上各种 LED 的状态。

2.2.8。EV_REP

EV_REP 事件用于指定自动重复事件。

2.2.9。EV_SND

EV_SND 事件用于向简单的声音输出设备发送声音命令。

2.2.10。EV_FF

EV_FF 事件用于初始化具有力反馈功能的设备并导致此类设备进行反馈。

2.2.11。EV_PWR

EV_PWR 事件是一种特殊类型的事件,专门用于电源管理。它的用法没有很好的定义。以后再处理。

2.3. 设备属性

通常,用户空间根据它发出的数据(即事件类型)设置输入设备。在两个设备发出相同事件类型的情况下,可以以设备属性的形式提供附加信息。

2.3.1。INPUT_PROP_DIRECT + INPUT_PROP_POINTER

INPUT_PROP_DIRECT 属性指示设备坐标应直接映射到屏幕坐标(不考虑微不足道的变换,例如缩放、翻转和旋转)。非直接输入设备需要非平凡的转换,例如触摸板的绝对到相对转换。典型的直接输入设备:触摸屏、绘图板;非直接设备:触摸板、鼠标。

INPUT_PROP_POINTER 属性表示设备不在屏幕上转置,因此需要使用屏幕上的指针来跟踪用户的移动。典型的指针设备:触摸板、平板电脑、鼠标;非指针设备:触摸屏。

如果 INPUT_PROP_DIRECT 或 INPUT_PROP_POINTER 均未设置,则该属性被视为未定义,并且应使用已发出的事件类型以传统方式推断设备类型。

2.3.2. INPUT_PROP_BUTTONPAD

对于按钮位于表面下方的触摸板,按下触摸板会导致单击按钮,应设置此属性。常见于 2009 年及以后的 Clickpad 笔记本和 Macbook。

最初,按钮板属性被编码到名为集成按钮下的 bcm5974 驱动程序版本字段中。为了向后兼容,这两种方法都需要在用户空间中进行检查。

2.3.3。INPUT_PROP_SEMI_MT

一些在 2008 年到 2011 年间最常见的触摸板可以检测多个触点的存在,而无需解析各个位置;只有触点的数量和矩形是已知的。对于此类触摸板,应设置 SEMI_MT 属性。

根据设备的不同,矩形可能包含所有触摸,例如边界框,或者只是其中的一些,例如最近的两次触摸。多样性使得矩形的使用受限,但通常可以从中提取一些手势。

如果未设置 INPUT_PROP_SEMI_MT,则假定该设备是真正的 MT 设备。

2.3.4。INPUT_PROP_TOPBUTTONPAD

一些笔记本电脑,尤其是联想 40 系列,提供了定点杆设备,但没有与定点杆设备关联的物理按钮。取而代之的是,触摸板的顶部区域被标记为显示旨在与触控杆一起使用的左、中、右按钮的视觉/触觉区域。

如果设置了 INPUT_PROP_TOPBUTTONPAD,用户空间应该相应地模拟按钮。此属性不影响内核行为。内核不为此类设备提供按钮模拟,但将它们视为任何其他 INPUT_PROP_BUTTONPAD 设备。

2.3.5。INPUT_PROP_ACCELEROMETER

此设备上的方向轴(绝对和/或相对 x、y、z)表示加速度计数据。一些设备还报告陀螺仪数据,这些设备可以通过旋转轴(绝对和/或相对 rx、ry、rz)报告。

所有其他轴保留其含义。设备不得在同一事件节点上混合常规方向轴和加速度计轴。

2.4. 指导方针

以下指南可确保正确的单点触控和多指功能。有关多点触控功能,请参阅多点触控 (MT) 协议文档了解更多信息。

2.4.1。老鼠

鼠标移动时必须报告 REL_{X,Y}。BTN_LEFT 必须用于报告主按钮按下。BTN_{MIDDLE,RIGHT,4,5,etc.} 应该用于报告设备的更多按钮。REL_WHEEL 和 REL_HWHEEL 应该用于报告可用的滚轮事件。

2.4.2. 触摸屏

ABS_{X,Y} 必须与触摸的位置一起报告。BTN_TOUCH 必须用于报告屏幕上何时激活触摸。BTN_{MOUSE,LEFT,MIDDLE,RIGHT} 不得报告为触摸接触的结果。应尽可能报告 BTN_TOOL_ 事件。

对于新硬件,应设置 INPUT_PROP_DIRECT。

2.4.3。触控板

仅提供相对位置信息的旧版触控板必须报告上述鼠标等事件。

提供绝对触摸位置的触控板必须报告触摸位置的 ABS_{X,Y}。BTN_TOUCH 应该用于报告触控板上何时激活触摸。在多指支持可用的情况下,应使用 BTN_TOOL_ 报告触控板上的活动触摸次数。

对于新硬件,应设置 INPUT_PROP_POINTER。

2.4.4。平板电脑

当手写笔或其他工具在平板电脑上处于活动状态时,必须报告 BTN_TOOL_ 事件。ABS_{X,Y} 必须与工具的位置一起报告。BTN_TOUCH 应该用于报告工具何时与平板电脑接触。BTN_{STYLUS,STYLUS2} 应该用于报告工具本身的按钮。除 BTN_{MOUSE,LEFT} 外,任何按钮都可用于平板电脑上的按钮。BTN_{0,1,2,etc} 是无标签按钮的良好通用代码。不要使用有意义的按钮,例如 BTN_FORWARD,除非该按钮在设备上被标记为用于该目的。

对于新硬件,应同时设置 INPUT_PROP_DIRECT 和 INPUT_PROP_POINTER。

Linux input子系统应用编程(9)event-codes编码表相关推荐

  1. 【Linux】Linux input子系统之Input event codes

    文章目录 前言 正文 附件 参考文章 前言 在阅读和修改Linux kernel中Touch相关驱动代码时经常可以见到形如INPUT_PROP_DIRECT EV_SYN BTN_TOUCH之类的In ...

  2. Linux input子系统 io控制字段【转】

    转自:http://www.cnblogs.com/leaven/archive/2011/02/12/1952793.html http://blog.csdn.net/guoshaobei/arc ...

  3. 31 Linux input子系统按键驱动--4IO驱动16按键

    31.1 前言 按键是设备中是最常见的人机交互方式,本节中将学习两部分. (1)如何4个GPIO 16个按键的实现: (2)Linux input按键驱动开发实例编程: 31.2 4个IO驱动16按键 ...

  4. 三个子系统_「正点原子Linux连载」第五十八章Linux INPUT子系统实验(一)

    1)实验平台:正点原子Linux开发板 2)摘自<正点原子I.MX6U嵌入式Linux驱动开发指南> 关注官方微信号公众号,获取更多资料:正点原子 第五十八章Linux INPUT子系统实 ...

  5. linux input子系统分析--子系统核心.事件处理层.事件传递过程

    linux input子系统分析--子系统核心.事件处理层.事件传递过程 一.  输入子系统核心分析. 1.输入子系统核心对应与/drivers/input/input.c文件,这个也是作为一个模块注 ...

  6. linux input子系统分析--主要函数

    linux input子系统分析--主要函数 一. 各种注册函数 因为分析一所讲的每种数据结构都代表一类对象,所以每种数据结构都会对应一个注册函数,他们都定义在子系统核心的input.c文件中.主要有 ...

  7. linux input子系统分析--概述与数据结构

    linux input子系统分析--概述与数据结构 Input子系统处理输入事务,任何输入设备的驱动程序都可以通过Input输入子系统提供的接口注册到内核,利用子系统提供的功能来与用户空间交互.输入设 ...

  8. linux 驱动 (2)---Linux input子系统最清晰、详尽的分析

    Linux input子系统最清晰.详尽的分析 Linux input分析之二:解构input_handler.input_core.input_device 输入输出是用户和产品交互的手段,因此输入 ...

  9. linux的input命令,认识linux input子系统(一)

    认识linux input子系统 (一) -0-.序 本来只是想写个内核态的键盘记录的,但是发现现在的linux驱动模型已经和以前版本不同,增加了input层,几乎所有的底层驱动都把数据封装在even ...

最新文章

  1. css订单导航栏横线动画,小程序 纯css 实现tab导航栏下划线跟随动画
  2. 去掉“3_人民日报语料”中每行前边的数字编号,改成“1, 2,......”
  3. python存储问题_python学习永久存储和异常处理
  4. 【luogu P3384 树链剖分】 模板
  5. 基于struts2的文件上传下载
  6. mysql pxc_MySQL之PXC集群搭建
  7. AF_INET域与AF_UNIX域socket通信原理对比
  8. 【转】从Chrome源码看JS Object的实现
  9. PB中导入EXCEL数据
  10. linux服务器root密码忘记怎么办,Linux忘记root密码怎么办?
  11. Swing-右键菜单
  12. nav-tage、vue3.0顶部历史浏览记录代码实现 vuex + el + vue3.0
  13. AI-Powered Concierge App:如何在2018-2019年推出新的业务方式
  14. 路由器自身拥有IP地址吗?
  15. 磊科linux无线网卡驱动安装步骤,如何安装磊科无线网卡驱动教程
  16. JSON和byte[]
  17. MAVEN依赖jar版本下载错误:xxx.pom.part.lock (文件名、目录名或卷标语法不正确。)
  18. win10开启与关闭Administrator账户
  19. Alibaba的COBAR真是强大
  20. decorators 参数_Django中decorators装饰器的使用

热门文章

  1. android逆向终极版,x32dbg/x64dbg之条件断点生成器改良第三终结版
  2. 判定操作系统x64还是x32方法
  3. 用Excel做回归分析
  4. 修改和删除用户角色+查看角色信息+修改角色+删除角色
  5. JDBC自我复习之Statement和PreparedStatement的区别
  6. Photoshop CC2017软件
  7. 抖音、微信关闭个性化推荐功能上线,用户真能摆脱“算法牢笼”吗?
  8. Android 8.0源码下载及编译环境搭建
  9. git push出现 ! [rejected] master - master (non-fast-forward)error failed to push some refs to
  10. Android百度地图、高德地图、腾讯地图导航路线规划问题