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

18.1基于Linux的INPUT子系统实验(知识)_csdn

按键、鼠标、键盘、触摸屏等都属于输入(input)设备, Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件
输入设备本质上还是字符设备,只是在此基础上套上了 input 框架,用户只需要负责上报输入事件,比如按键值、坐标等信息, input 核心层负责处理这些事件。
本章我们就来学习一下 Linux 内核中的 input 子系统。

1、input 子系统

1.1、input 子系统简介

Pasted image 20250408112814.png
Pasted image 20250418142904.png
Pasted image 20250408113223.png

1.2、input 驱动编写流程

Pasted image 20250408113427.png
在我看来,就是注册字符设备进行封装了。给了input子系统统一操作了。这就是核心层!
Pasted image 20250408113555.png
第 2498 行,注册一个 input 类,这样系统启动以后就会在/sys/class 目录下有一个 input 子目录,如图 38.1.2.1 所示:
Pasted image 20250408113719.png
第 2508~2509 行,注册一个字符设备,主设备号为 INPUT_MAJOR, INPUT_MAJOR 定义在 include/uapi/linux/major.h 文件中,定义如下:
Pasted image 20250408113908.png

1.2.1、注册 input_dev

Pasted image 20250408114027.png
Pasted image 20250408114043.png
Pasted image 20250408114102.png
Pasted image 20250408114126.png
Pasted image 20250408114143.png
1.编写申请注册子系统input设备:
Pasted image 20250408115001.png
2.编写注销子系统input设备:
Pasted image 20250408115028.png
申请好一个 input_dev 以后就需要初始化这个 input_dev需要初始化的内容主要为事件类型(evbit)和事件值(keybit)这两种。 input_dev 初始化完成以后就需要向 Linux 内核注册 input_dev了,需要用到 input_register_device 函数
此函数原型如下:
Pasted image 20250408115356.png
逻辑就是:
1、申请input_dev 结构体变量:
2、初始化input_dev:
需要初始化的内容主要为事件类型(evbit)和事件值(keybit)这两种(等等)
3、用到 input_register_device 函数:
初始化完成以后就需要向 Linux 内核注册 input_dev了。需要用到 input_register_device 函数。
4、注销一系列函数。
综上所述, input_dev 注册过程如下:
、使用 input_allocate_device 函数申请一个 input_dev。
、初始化 input_dev 的事件类型以及事件值。
、使用 input_register_device 函数向 Linux 系统注册前面初始化好的 input_dev。
、卸载input驱动的时候需要先使用input_unregister_device函数注销掉注册的input_dev,然后使用 input_free_device 函数释放掉前面申请的 input_dev。
input_dev 注册过程示例代码如下所示:
Pasted image 20250408120008.png
input_allocate_device() 函数返回的正是一个地址,更准确地说,它返回的是新分配的 struct input_dev 结构体实例在内存中的起始地址。
struct input_dev *inputdev;定义了个指针变量,其中inputdev就是用来存储地址的。
后面的inputdev->就是地址指向input_dev`类型中的结构。
Pasted image 20250408132017.png
Pasted image 20250408132030.png

1.2.2、上报输入事件

在这里插入图片描述
Pasted image 20250408132510.png
Pasted image 20250408132642.png
Pasted image 20250408132722.png
在这里插入图片描述

Pasted image 20250408132813.png
Pasted image 20250408132840.png
Pasted image 20250408132900.png
可以看出,第六行代码就是平常获取IO口的值,获取按键的键值,目前就是将驱动代码带过来的键值信息,通过input上传给内核,驱动层->核心层->事件层。
因为按键是低电平有效:
所以value所以等于0时,表示按键按下。
上报后还要提示内核上报结束!

1.2.3、input_event 结构体

Pasted image 20250408134226.png
Pasted image 20250408134323.png
Pasted image 20250408134337.png
Pasted image 20250408134356.png

http://www.xdnf.cn/news/86671.html

相关文章:

  • A2A + MCP:构建实用人工智能系统的超强组合
  • 记录:扩展欧几里得算法
  • Spark2 之 memorypool
  • Lua 第7部分 输入输出
  • this._uid:Vue 内部为每个组件实例分配的唯一 ID
  • 基于DeepSeek的文献分析系统
  • 模型 螃蟹效应
  • 详解Windows(七)——更新管理
  • uView的u-modal不显示问题
  • 若依框架二次开发——若依 Vue3 版本前端样式优化指南
  • Spark-streaming(一)
  • 第 1.4 节: G1 人形机器人足球项目定义与课程路线
  • LSTM如何解决梯度消失问题
  • uv包管理器如何安装依赖?
  • 火语言RPA--Ftp删除目录
  • 衡石ChatBI:依托开放架构构建技术驱动的差异化数据服务
  • 现有一整型数组,a[8] = { 4,8,7,0,3,5,9,1},现使用堆排序的方式原地对该数组进行升序排列。那么在进行第一轮排序结束之后,数组的顺序为?
  • 示例:spring xml+注解混合配置
  • FastAPI WebSocket 聊天应用详细教程
  • 搭建 Spark - Local 模式:开启数据处理之旅
  • 掌握 Altium Designer:轻松定制“交换器件”工具栏
  • 智能电网第1期 | 工业交换机在变电站自动化系统中的作用
  • Python 获取淘宝买家订单列表(buyer_order_list)接口的详细指南
  • [创业之路-377]:企业法务 - 有限责任公司与股份有限公司的优缺点对比
  • 如何在 Element UI 中优雅地使用 `this.$loading` 显示和隐藏加载动画
  • PyQt5、NumPy、Pandas 及 ModelArts 综合笔记
  • # 基于PyTorch的食品图像分类系统:从训练到部署全流程指南
  • 第 2.1 节: 机器人仿真环境选择与配置 (Gazebo, MuJoCo, PyBullet)
  • 【Dv3Admin】从零搭建Git项目安装·配置·初始化
  • iPaaS集成平台相比传统集成技术有哪些优势?