第二十六章 linux-输入子系统二

news2024/10/7 6:43:03

第二十六章 linux-输入子系统二


文章目录

  • 第二十六章 linux-输入子系统二
  • 框架
  • 三个重要结构体
    • struct input_dev
    • struct input_handler
    • struct input_handle


框架

Linux系统支持的输入设备繁多,例如键盘、鼠标、触摸屏、手柄或者是一些输入设备像体感输入等等,Linux系统是如何管理如此之多的不同类型、不同原理、不同的输入信息的输入设备的呢?其实就是通过input输入子系统这套软件体系来完成的。从整体上来说,input输入子系统分为3层:上层(输入事件驱动层)、中层(输入核心层)、下层(输入设备驱动层),如下图:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • input driver :主要实现对硬件设备的读写访问,中断设置,并把硬件产生的事件转换为核心层定义的规范提交给事件处理层。
    input device driver 设备驱动程序
    input event driver事件驱动程序
    注意:事件驱动程穿是标准的,对所有的瑜入类都是可用的,所以,我们不需实现事件驱动,为内核里边已经支持所有的事件驱动;我们需实现的是输入设备备驱动程序

  • input core :承上启下。为设备驱动层提供了规范和接口;通知事件处理层对事件进行处理;

  • event handler :提供用户编程的接口(设备节点),并处理驱动层提交的数据处理。

三个重要结构体

struct input_dev

 //表示的是一个具体的输入设备,描述设备能够产生什么数据
struct input_dev {
	const char *name;//sysfs中给用户看的信息
	const char *phys;
	const char *uniq;
	struct input_id id;

	unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)];

	unsigned long evbit[BITS_TO_LONGS(EV_CNT)];
	/*evbit实际是一个位表,描述输入设备能够产生什么数据类型*/
	unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];//能够表示768个bit,直接用24个long来表示,
						//KEY_CNT=768	BITS_TO_LONGS=nr/32 	768/32=24
	//表示能够产生哪种按键
	unsigned long relbit[BITS_TO_LONGS(REL_CNT)];
	//表示能够产生哪种相对坐标数据
	unsigned long absbit[BITS_TO_LONGS(ABS_CNT)];
	//表示能够产生哪种绝对坐标数据
	unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)];
	unsigned long ledbit[BITS_TO_LONGS(LED_CNT)];
	unsigned long sndbit[BITS_TO_LONGS(SND_CNT)];
	unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];
	unsigned long swbit[BITS_TO_LONGS(SW_CNT)];

	unsigned int hint_events_per_packet;

	unsigned int keycodemax;
	unsigned int keycodesize;
	void *keycode;

	int (*setkeycode)(struct input_dev *dev,
			  const struct input_keymap_entry *ke,
			  unsigned int *old_keycode);
	int (*getkeycode)(struct input_dev *dev,
			  struct input_keymap_entry *ke);

	struct ff_device *ff;

	unsigned int repeat_key;
	struct timer_list timer;

	int rep[REP_CNT];

	struct input_mt *mt;

	struct input_absinfo *absinfo;

	unsigned long key[BITS_TO_LONGS(KEY_CNT)];
	unsigned long led[BITS_TO_LONGS(LED_CNT)];
	unsigned long snd[BITS_TO_LONGS(SND_CNT)];
	unsigned long sw[BITS_TO_LONGS(SW_CNT)];

	int (*open)(struct input_dev *dev);
	void (*close)(struct input_dev *dev);
	int (*flush)(struct input_dev *dev, struct file *file);
	int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value);

	struct input_handle __rcu *grab;

	spinlock_t event_lock;
	struct mutex mutex;

	unsigned int users;
	bool going_away;

	struct device dev;//继承device对象

	struct list_head	h_list;
	struct list_head	node;//表示节点

	unsigned int num_vals;
	unsigned int max_vals;
	struct input_value *vals;

	bool devres_managed;
};

struct input_handler

struct input_handler {

	void *private;

	void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value);
	void (*events)(struct input_handle *handle,
		       const struct input_value *vals, unsigned int count);
	bool (*filter)(struct input_handle *handle, unsigned int type, unsigned int code, int value);
	bool (*match)(struct input_handler *handler, struct input_dev *dev);
	int (*connect)(struct input_handler *handler, struct input_dev *dev, const struct input_device_id *id);
	void (*disconnect)(struct input_handle *handle);
	void (*start)(struct input_handle *handle);

	bool legacy_minors;
	int minor;
	const char *name;

	const struct input_device_id *id_table;

	struct list_head	h_list;
	struct list_head	node;
};

struct input_handle

struct input_handle {

	void *private;

	int open;
	const char *name;

	struct input_dev *dev;
	struct input_handler *handler;

	struct list_head	d_node;
	struct list_head	h_node;
};
  • input_dev代表底层的设备,所有设备的input_dev对象保存在一个全局的lnput_dev队列里。
  • input_handler代表某类入设备的处理方法,比如说是专门处理入设备产成的Event〈事件〉,所有的input_handler存放在input_handler队里
  • 一个input_dev可以有多个input_handler,
  • lnput_handle用来关联某个input_dev和某个input_handler。每个input_handle都会生成一个文件节点,比如"/dev/input/event0、1、2、3…"。通过input handle可以找到对应的input handler和input_dev
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]Python计算机毕业设计电子投票系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

30岁转行网络安全来得及吗?有发展空间吗?

30岁转行网络安全来得及吗?有发展空间吗? 现阶段,很多30岁左右的人群都面临就业难的问题,尤其是对于年龄已过30.没有一技之长的人。现阶段,网络安全行业已成了风口行业,也有很多30岁人群也想转行学习网络安全,但又担…

python之界面案例

目录 一、海龟绘图 二、图形化编程入门 窗口创建 三、表格控件的简单认知 四、综合案例 一、海龟绘图 海龟绘图作用:提升界面美观度,吸引用户使用 学习网址: turtle --- 海龟绘图 — Python 3.8.14 文档 二、图形化编程入门 窗口创建 …

【数据结构与算法】跳表

目录 一、什么是跳表 二、跳表的效率验证 三、跳表的实现 1、search 2、add 3、erase 四、跳表与其它搜索结构对比 总结 一、什么是跳表 跳表是一个随机化的数据结构,可以被看做二叉树的一个变种,它在性能上和红黑树,AVL树不相上下&am…

【高精度定位】RTK定位与RTD定位知识科普

高精度定位一般指亚米级别或厘米级别的定位,常见的室内有蓝牙AoA和UWB两种技术,室外有北斗地基增强技术,这些技术都是采用算法进行定位。 工业4.0时代,在资源和环境约束不断强化的背景下,创新驱动传统制造向智能制造转…

【MAUI】条形码,二维码扫描功能

前言 本系列文章面向移动开发小白,从零开始进行平台相关功能开发,演示如何参考平台的官方文档使用MAUI技术来开发相应功能。 介绍 移动端的扫描条形码、二维码的功能已经随处可见,已经很难找到一个不支持扫描的App了,但是微软的…

sync fsync fdatasync 三者的区别

传统的UNIX系统实现在内核中设有缓冲区高速缓存或页高速缓存,大多数磁盘I/O都通过缓区进行。当我们向文件写入数据时,内核通常先将数据复制到缓冲区中,然后排入队列,晚些时候再入磁盘。这种方式被称为延迟写 (delayed wrie)(Bach[…

最惨面试季:“这么简单的9道题,我刷掉了90%的测试员。”

人往高处走水往低处流,十二月将至,“金三银四”招聘季还会远吗? 远观2022年的招聘季,在资本寒冬的映照下,的确萧条了不少,裁员、取消年终奖、末尾淘汰制等热门制度,让很多人陷入了“工作难保&a…

【自然语言处理】隐马尔科夫模型【Ⅴ】解码问题

有任何的书写错误、排版错误、概念错误等,希望大家包含指正。 由于字数限制,分成六篇博客。 【自然语言处理】隐马尔可夫模型【Ⅰ】马尔可夫模型 【自然语言处理】隐马尔科夫模型【Ⅱ】隐马尔科夫模型概述 【自然语言处理】隐马尔科夫模型【Ⅲ】估计问题…

基于安卓的校园订餐系统开发设计

目 录 Abstract 6 1 绪 论 1 1.1 研究背景 1 1.2 研究意义 1 1.3 国内外研究现状 1 1.4 研究的过程和结果 2 1.5 论文主要组织结构 3 2 设计原理和方法 4 2.2 关键技术简介 4 2.3 开发工具 5 2.4 应用平台 6 3 需求分析 8 3.1 功能性需求 8 3.2 非功能需求 17 4 系统概要设计 1…

JS文件操作介绍

JS文件操作介绍 本文将介绍前端浏览器支持的JS文件操作技术。相关权威技术资料 带有 type"file" 的 <input> 元素允许用户可以从他们的设备中选择一个或多个文件。<input type"file"> - HTML&#xff08;超文本标记语言&#xff09; | MDN …

HDFS的API操作

目录 依赖环境 AIP操作hdfs基本流程 创建目录 文件上传 参数优先级 文件下载 文件删除 文件更名与移动 查看HDFS文件的详情信息 文件和文件夹的判断 依赖环境 hadoop依赖&#xff1a; Maven Repository&#xff08;Maven仓库&#xff09;- https://mvnrepository.com/…

中小型企业 CRM 系统有哪些好的推荐?

不同行业的中小型企业在资源、需求、抗风险能力、业务成熟度等方面存在显著差异&#xff0c;因此对CRM的应用需求有不同侧重。 图源&#xff1a;艾瑞咨询我专门研究了一些CRM的行业报告&#xff0c;比较了一下当下几款比较热门的CRM&#xff0c;希望能够帮助大家找到自己的“心…

【能效管理】AcrelEMS-IDC数据中心综合能效管理系统应用分析

概述 安科瑞电气紧跟数据中心发展形式&#xff0c;推出AcrelEMS-IDC数据中心综合能效管理解决方案&#xff0c;包含有电力监控、动环监控、消防监控、能耗统计分析、智能照明控制以及新能源监测几个子系统。集成了变配电监测、电源备自投、电气接点测温、智能照明控制、电能质…

PD芯片在OTG设备的角色应用及OTG发展历史

OTG是On-The-Go的缩写&#xff0c;是近年发展起来的技术。2001年12月18日由USB标准化组织公布&#xff0c;主要应用于不同的设备或移动设备间的联接&#xff0c;进行数据交换。 USB技术的发展&#xff0c;使得PC和周边设备能够通过简单的方式、适度的制造成本&#xff0c;将各…

渗透测试sec123笔记

1.外网打点 1.1端口探测 └─$ sudo masscan 192.168.1.103 -p 1-65535 --rate100 masscan扫描结果 └─$ nmap -sV 192.168.1.103 -sC -p 8088,5985,49154,49173,80,8878,47001,7000,49153,49157,3389,49155,49152,8899,49161 -oN sec-ports …

开发转测试:从零开始的6年自动化之路,太迷茫...

自动化初识 作为一个测试人&#xff0c;我们或多或少都听过或用过自动化&#xff0c;我们都曾在初入测试行业时&#xff0c;满怀期待的以为测试的尽头是不用测试员点点了&#xff0c;项目一提测&#xff0c;小手点下自动化的开关&#xff0c;瞬间测试的工作就完成了。 这就是…

4-Arm PEG-Biotin,4-Arm peg-Biotin,四臂-聚乙二醇-生物素科研试剂供应

一&#xff1a;产品描述 1、名称 英文&#xff1a;4-Arm PEG-Biotin&#xff0c;4-Arm peg-Biotin 中文&#xff1a;四臂-聚乙二醇-生物素 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Biotin PEG Multi-arm PEGs 4、分子量&#xff1a;可定制&#xff0c;四臂-PE…

BundleTrack自用配置笔记

0、下载代码 git clone https://github.com/wenbowen123/BundleTrack.git 或者选择Download ZIP 1、按照Ubuntu版本安装docker 查看docker版本 $ docker version 在1080显卡上测试时出现bug&#xff0c;找到一个解决的文章&#xff0c;本人适用 docker: Error response…

微信小程序模板与配置

文章目录1. 数据绑定2. 事件绑定3. 事件传参4. 网络请求1. 数据绑定 在data中定义数据&#xff1a;在页面对应的js文件中&#xff0c;把数据定义到data对象中即可 // index.js Page({// string 类型info:init data,// 数组 类型msgList:[{msg:hello},{msg:world}] })在WXML中使…