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

Input子系统(一)、从内核文档入门(草稿,进度:10%)

本文参考内核文档linux_5.10/Documentation/input/input.rst自行翻译而来,依据个人认知和从业关注点进制裁剪和提炼,故仅供读者参考和个人学习使用。

概要

Input子系统设计用于集合Linux下所有输入设备驱动。几乎所有输入设备的驱动都位于drivers/input目录下,但伋有部分设备驱动位于drivers/hiddrvers/platform中。

Input子系统的核心是input内核模块,故其需要早于其他input设备驱动优先被加载。它提供了在以下两个模块组别之间的联系方式:

  • 设备驱动

    ​ 连接硬件并上报事件到input模块;

  • 事件报告

    ​ 从input模块获取事件并将其传递给需要的对象,如:按键给到内核、鼠标移动给到GPM和X这样的UI框架,等等。

示例

以USB鼠标和键盘为例,示例加载顺序:input -> mousedev -> usbcore ->uhci_hcd(or ohci_hcd, or ehci_hcd) -> usbhid -> hid_generic,之后系统通常会自动创建input/mice节点,否则自动创建并分别接入GPM或X显示框架(详见原文档)。

详细说明

Event handlers

如果需要,event handers就能将事件传递给目标对象,不管是用户空间还是内核空间的。

evdev

evdev是比较常见的input设备event接口,它将内核产生的event事件附上时间戳后直接传递给目标程序,相应的event code是与架构、硬件无关的统一代码。实践证明,这是最佳的交互接口----用户获取输入信息,因此比较建议优先使用该方案。

该方案对应的设备节点位于/dev/input目录下,如:

crw-r--r--   1 root     root      13,  64 Apr  1 10:49 event0
crw-r--r--   1 root     root      13,  65 Apr  1 10:50 event1
crw-r--r--   1 root     root      13,  66 Apr  1 10:50 event2
crw-r--r--   1 root     root      13,  67 Apr  1 10:50 event3
...

通常从设备号范围为64~95,当输入设备数量超过32个时,次设备号将会从256开始编号(由MKDEV定义可知,其为int32_t类型,其中低20位为次设备号)。

mousedev

mousedev 是一种临时解决方案,用于保证使用鼠标输入的旧程序能够正常工作。它从鼠标或数位板/平板设备获取事件,并向用户空间提供一个 PS/2 风格的(类似于 /dev/psaux)鼠标设备。

该方案对应的设备节点位于/dev/input目录下,如:

	crw-r--r--   1 root     root      13,  32 Mar 28 22:45 mouse0
	crw-r--r--   1 root     root      13,  33 Mar 29 00:41 mouse1
	crw-r--r--   1 root     root      13,  34 Mar 29 00:41 mouse2
	crw-r--r--   1 root     root      13,  35 Apr  1 10:50 mouse3
	...
	crw-r--r--   1 root     root      13,  62 Apr  1 10:50 mouse30
	crw-r--r--   1 root     root      13,  63 Apr  1 10:50 mice

所有mouse都只能关联单一设备(鼠标、数字板等),但位于最后一行的mice除外。mice的特殊性在于其可以共享所有输入设备的数据,即使目标设备未连接,这一特性在老旧程序无法处理热插拔和设备未连接的情景下显得特别有用。

其他类型的event handlers还有:keyboard、joydev,但不做展开。

Device drivers

设备驱动即是能够生成事件的模块。

hid-generic

hid-generic 是整个驱动套件中最大且最复杂的驱动之一。它用于处理所有的 HID 设备,由于 HID 设备种类繁多,并且 USB HID 规范并不简单,因此它的代码体量变得非常庞大。

psmouse

psmouse是一个支持各种 采用PS/2 协议设备的驱动程序,包括 Synaptics 和 ALPS 触控板、Intellimouse Explorer 设备、Logitech PS/2 鼠标等。

其他类型的device drivers还有:usbmouse、usbkbd、atkbd、iforce,

功能验证

参考

#----> linux_5.10/Documentation/input/input.rst



http://www.kler.cn/a/392264.html

相关文章:

  • Fastapi使用MongoDB作为数据库
  • 学术论文写作丨机器学习与深度学习
  • Rust 所有权机制
  • AcWing 302 任务安排 斜率优化的dp
  • 矢量拟合(1)Sanathanan–Koerner算法
  • 【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-最大的数
  • 进程调度算法
  • 高频 SQL 50 题(基础版)连接部分
  • 鸿蒙next版开发:相机开发-适配不同折叠状态的摄像头变更(ArkTS)
  • Python中的闭包和装饰器
  • 方案丨车险保单OCR:3秒钟完成保单审核
  • 从0开始学习机器学习--Day24--核函数
  • LeetCode 328.奇偶链表
  • 【Lucene】原理学习路线
  • Redis架构模式有几种?适用哪些场景?
  • Three.js性能优化和实践建议
  • Leetcode 3350 Adjacent Increasing Subarrays Detection II
  • ResNet网络详解
  • 【Spring】@Autowired与@Resource的区别
  • 常用环境部署(二十三)——Docker部署ERPNext
  • C++学习笔记----11、模块、头文件及各种主题(一)---- 模板概览与类模板(8)
  • 深度学习-神经网络基础-激活函数与参数初始化(weight, bias)
  • [Linux]:IO多路转接之epoll
  • 鸿蒙next版开发:订阅应用事件(ArkTS)
  • EasyExcel 使用多线程按顺序导出数据
  • linux GPIO