Linux INPUT 子系统详解

目录

一、引言

二、INPUT 子系统的架构

1.输入设备驱动层

2.核心层

3.事件处理层

三、INPUT 子系统的工作原理

1.设备注册与初始化

2.事件产生与提交

3.事件分发与处理

4.应用程序访问输入设备

四、使用 INPUT 子系统进行设备驱动开发

1.编写输入设备驱动程序

2.注册输入设备驱动程序 

五、总结


一、引言

        在 Linux 操作系统中,INPUT 子系统是一个非常重要的组成部分,它负责处理各种输入设备,如键盘、鼠标、触摸屏等。INPUT 子系统提供了一种统一的框架,使得不同类型的输入设备可以以相同的方式被操作系统识别和处理,大大提高了系统的可扩展性和可维护性。本文将深入探讨 Linux INPUT 子系统的架构、工作原理以及使用方法。

二、INPUT 子系统的架构

1.输入设备驱动层

  • 这是最底层的部分,负责与具体的输入设备进行通信,将设备产生的输入事件转换为 Linux 内核可以理解的格式,并向上层提交。不同类型的输入设备有不同的驱动程序,但它们都遵循 INPUT 子系统的规范。
  • 例如,键盘驱动程序会检测键盘的按键按下和释放事件,并将其转换为相应的键码(keycode)提交给上层。

2.核心层

  • INPUT 子系统的核心部分,负责管理输入设备的注册、注销、事件分发等功能。它提供了一组通用的接口,供上层应用程序和其他子系统使用。
  • 当输入设备驱动程序注册一个输入设备时,核心层会为该设备分配一个唯一的设备编号,并将其添加到系统的输入设备列表中。当有输入事件发生时,核心层会根据事件的类型和目标设备,将事件分发给相应的处理程序。

3.事件处理层

  • 位于核心层之上,负责处理输入事件。可以是用户空间的应用程序,也可以是内核空间的其他子系统。例如,X Window 系统就是一个典型的用户空间事件处理程序,它接收来自 INPUT 子系统的输入事件,并将其转换为图形界面上的操作。
  • 事件处理层可以根据自己的需求对输入事件进行过滤、转换和组合,以实现更加复杂的功能。

三、INPUT 子系统的工作原理

1.设备注册与初始化

  • 当输入设备驱动程序加载时,它会首先调用 INPUT 子系统提供的接口函数进行设备的注册。注册过程包括提供设备的名称、类型、支持的事件类型等信息。
  • 核心层会为设备分配一个唯一的设备编号,并将其添加到系统的输入设备列表中。同时,驱动程序还可以进行一些设备的初始化工作,如设置设备的中断处理函数、配置设备的寄存器等。

2.事件产生与提交

当输入设备产生一个输入事件时,驱动程序会将其转换为 INPUT 子系统规定的格式,并调用核心层提供的接口函数将事件提交给内核。事件通常包括事件类型(如按键按下、按键释放、鼠标移动等)、事件代码(如键码、鼠标坐标等)和事件值(如按键状态、鼠标移动的距离等)。

3.事件分发与处理

核心层接收到输入事件后,会根据事件的类型和目标设备,将事件分发给相应的处理程序。如果事件是针对某个特定的应用程序的,核心层会将事件传递给该应用程序的输入队列中,等待应用程序进行处理。如果事件是系统级的,如电源管理事件、屏幕亮度调节事件等,核心层会将事件分发给相应的内核子系统进行处理。

4.应用程序访问输入设备

  • 用户空间的应用程序可以通过多种方式访问输入设备。最常用的方式是通过 /dev/input/eventX 设备文件进行访问,其中 X 是设备的编号。应用程序可以打开这个设备文件,读取其中的输入事件,并根据事件的类型和代码进行相应的处理。
  • 另外,应用程序也可以通过使用 INPUT 子系统提供的库函数,如 libinput、evdev 等,来更加方便地访问输入设备。这些库函数提供了更高层次的抽象,使得应用程序可以更加容易地处理输入事件。

四、使用 INPUT 子系统进行设备驱动开发

1.编写输入设备驱动程序

  • 编写输入设备驱动程序需要遵循 INPUT 子系统的规范,实现设备的初始化、事件产生和提交等功能。通常需要实现以下几个关键函数:
    • probe 函数:在设备被探测到时被调用,进行设备的初始化工作,如配置设备的寄存器、分配内存等。
    • remove 函数:在设备被移除时被调用,进行设备的清理工作,如释放内存、注销设备等。
    • input_report_xxx 函数:用于提交输入事件,根据事件的类型选择不同的函数,如 input_report_key 用于提交按键事件,input_report_rel 用于提交相对坐标事件等。
  • 例如,以下是一个简单的键盘驱动程序的示例:
static struct input_dev *my_keyboard_dev;static int my_keyboard_probe(struct platform_device *pdev)
{my_keyboard_dev = input_allocate_device();if (!my_keyboard_dev) {return -ENOMEM;}set_bit(EV_KEY, my_keyboard_dev->evbit);set_bit(KEY_A, my_keyboard_dev->keybit);return input_register_device(my_keyboard_dev);
}static int my_keyboard_remove(struct platform_device *pdev)
{input_unregister_device(my_keyboard_dev);input_free_device(my_keyboard_dev);return 0;
}static struct platform_driver my_keyboard_driver = {.probe = my_keyboard_probe,.remove = my_keyboard_remove,.driver = {.name = "my_keyboard",.owner = THIS_MODULE,},
};

2.注册输入设备驱动程序 

  • 在 Linux 内核中,输入设备驱动程序通常是作为一个内核模块进行加载的。可以通过在模块的初始化函数中调用 platform_driver_register 函数来注册输入设备驱动程序。
  • 例如:

五、总结

        Linux INPUT 子系统为输入设备的管理和处理提供了一种统一的框架,使得不同类型的输入设备可以以相同的方式被操作系统识别和处理。通过深入了解 INPUT 子系统的架构、工作原理和使用方法,可以更好地进行输入设备驱动开发和应用程序开发,提高系统的可扩展性和可维护性。同时,随着技术的不断发展,INPUT 子系统也在不断演进和完善,为用户提供更加丰富和便捷的输入体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/476444.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql注入报错分享(mssql+mysql)

mysql mysql的报错内容比较多 网上也有比较多的 这里重复的就不多介绍了。一笔带过 溢出类 bigint 当超过mysql的整形的时候,就会导致溢出,mysql可能会将错误信息带出。这里user()是字母默认为0 取反以后1可能就会导致异常。 报错特征 BIGINT UNSIG…

JVM(五、垃圾回收器)

经典的垃圾回收器大概有7种,这些收集器的目标、特性、原理、使用场景都有所区别,有的适用于年轻代,有的适用于老年代,图中展示的就是这7中垃圾回收器,如果两个垃圾回收器有连线,则表明可以配合使用。这个关…

雅思阅读TFNG题型7大解题思路

雅思阅读TFNG题型7大解题思路,全在这了‼️ ⚠️在徘徊在6-6.5的同学有很大的共性就是对题型不够熟悉,我记得我当时卡6.5的时候我有时候分不清NG和F,有时候又分不清NG 和True,也不知道他有哪几种考我的方法,脑子里没有…

Nuxt3:拉取项目模板失败问题解决方法

问题描述 使用官网提供的命令npx nuxilatest init <project-name> 创建Nuxt3项目时&#xff0c;遇到了拉取项目模板失败的问题&#xff0c;报错信息如下 先分析一下这行命令在做的事情&#xff0c;结合之前的经验来看&#xff0c;似乎是在尝试通过该网址返回的元数据信息…

索引(MySQL)

1. 没有索引&#xff0c;可能会有什么问题 索引&#xff1a;提高数据库的性能&#xff0c;索引是物美价廉的东西了。不用加内存&#xff0c;不用改程序&#xff0c;不用调sql&#xff0c;只要执行 正确的 create index &#xff0c;查询速度就可能提高成百上千倍。但是天下没有…

MybatisPlus之1:快速入门

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

菜鸟驿站二维码/一维码 取件识别功能

特别注意需要引入 库文 ZXing 可跳转&#xff1a; 记录【WinForm】C#学习使用ZXing.Net生成条码过程_c# zxing-CSDN博客 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Net.…

「甲子光年」对话黄翔:从电子签回望中国SaaS“黄金十年”

法大大成立十周年之际&#xff0c;联合「甲子光年」重榜发布《中国电子签十年风云录》&#xff0c;通过应用者、从业者、观察者的不同视角&#xff0c;记录电子签乃至时代发展的风云十年。本期是刊物精彩内容呈现的第一期&#xff0c;扫描下图可获取电子版。 创立法大大之前&am…

【Three.js基础学习】28.Coffee Smoke

前言 /* 补充&#xff1a;材质本身纹理有光源等信息因此能看到模型 gltf.scene.traverse((child) > { if (child.isMesh) { child.material.map null; // 移除贴图 } }); 此时是纯白色&#xff0c;按照正常逻辑 没有光会是灰/黑色 为什么显示白色 1.默认材质颜色 2.材质的表…

Linux(命令行扩展+命令行历史 大白话+图片)

后面也会持续更新&#xff0c;学到新东西会在其中补充。 建议按顺序食用&#xff0c;欢迎批评或者交流&#xff01; 缺什么东西欢迎评论&#xff01;我都会及时修改的&#xff01; 在这里真的很感谢这位老师的教学视频让迷茫的我找到了很好的学习视频 王晓春老师的个人空间…

渗透测试---shell(5)字符串运算符与逻辑运算符

声明&#xff1a;学习素材来自b站up【泷羽Sec】&#xff0c;侵删&#xff0c;若阅读过程中有相关方面的不足&#xff0c;还请指正&#xff0c;本文只做相关技术分享,切莫从事违法等相关行为&#xff0c;本人与泷羽sec团队一律不承担一切后果 目录 一、字符串运算符 创建u.sh文…

06、Spring AOP

在我们接下来聊Spring AOP之前我们先了解一下设计模式中的代理模式。 一、代理模式 代理模式是23种设计模式中的一种,它属于结构型设计模式。 对于代理模式的理解: 程序中对象A与对象B无法直接交互,如:有人要找某个公司的老总得先打前台登记传达程序中某个功能需要在原基…

游戏陪玩系统开发功能需求分析

电竞游戏陪玩系统是一种专门为游戏玩家提供陪伴、指导和互动服务的平台。这类系统通常通过专业的陪玩师&#xff08;也称为陪练师&#xff09;为玩家提供一对一或多对一的游戏陪伴服务&#xff0c;帮助玩家提升游戏技能、享受游戏乐趣&#xff0c;甚至解决游戏中的各种问题。电…

【数据库入门】关系型数据库入门及SQL语句的编写

1.数据库的类型&#xff1a; 数据库分为网状数据库&#xff0c;层次数据库&#xff0c;关系型数据库和非关系型数据库四种。 目前市场上比较主流的是&#xff1a;关系型数据库和非关系型数据库。 关系型数据库使用结构化查询语句&#xff08;SQL&#xff09;对关系型数据库进行…

【2024亚太杯亚太赛APMCM C题】数学建模竞赛|宠物行业及相关产业的发展分析与策略|建模过程+完整代码论文全解全析

第一个问题是&#xff1a;请基于附件 1 中的数据以及你的团队收集的额外数据&#xff0c;分析过去五年中国宠物行业按宠物类型的发展情况。并分析中国宠物行业发展的因素&#xff0c;预测未来三年中国宠物行业的发展。 第一个问题&#xff1a;分析中国宠物行业按宠物类型的发展…

合法三元数量计算

问题描述 小C、小U 和小R 三个好朋友喜欢做一些数字谜题。这次他们遇到一个问题&#xff0c;给定一个长度为n的数组a&#xff0c;他们想要找出符合特定条件的三元组 (i, j, k)。具体来说&#xff0c;三元组要满足 0 < i < j < k < n&#xff0c;并且 max(a[i], a[…

wsl虚拟机中的dockers容器访问不了物理主机

1 首先保证wsl虚拟机能够访问宿主机IP地址&#xff0c;wsl虚拟机通过vEthernet (WSL)的地址访问&#xff0c;着意味着容器也要通过此IP地址访问物理主机。 2 遇到的问题&#xff1a;wsl虚拟机中安装了docker&#xff0c;用在用到docker容器内的开发环境&#xff0c;但是虚拟机…

深入了解 Linux htop 命令:功能、用法与示例

文章目录 深入了解 Linux htop 命令&#xff1a;功能、用法与示例什么是 htop&#xff1f;htop 的安装htop的基本功能A区&#xff1a;系统资源使用情况B区&#xff1a;系统概览信息C区&#xff1a;进程列表D区&#xff1a;功能键快捷方式 与 top 的对比常见用法与示例实际场景应…

如何删除Kafka中的数据以及删除topic

如何删除Kafka数据已经以及删除topic呢&#xff1f; 1、删除数据 先启动Kafka实例 docker exec -it kafka-0 /bin/bash #进去容器 rm -rf /bitnami/kafka/data/* #删除数据 exit #退出如果删除失败&#xff0c;可能是数据不存在于/bitnami/kafka/data&#xff0c;使用 cd /o…

Easyexcel(4-模板文件)

相关文章链接 Easyexcel&#xff08;1-注解使用&#xff09;Easyexcel&#xff08;2-文件读取&#xff09;Easyexcel&#xff08;3-文件导出&#xff09;Easyexcel&#xff08;4-模板文件&#xff09; 文件导出 获取 resources 目录下的文件&#xff0c;使用 withTemplate 获…