RK3568驱动指南|第十三篇 输入子系统-第152章 核心层代码分析

本文主要是介绍RK3568驱动指南|第十三篇 输入子系统-第152章 核心层代码分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。


【公众号】迅为电子

【粉丝群】824412014(加群获取驱动文档+例程)

【视频观看】嵌入式学习之Linux驱动(第十三篇 输入子系统_全新升级)_基于RK3568

【购买链接】迅为RK3568开发板瑞芯微Linux安卓鸿蒙ARM核心板人工智能AI主板


第152章 核心层代码分析

152.1 核心层的作用

输入子系统的核心层主要由kernel/drivers/input/input.c文件实现的,它是Linux内核中处理输入设备的关键组件之一。input.c文件负责注册,管理和处理输入设备,提供与输入设备相关的核心功能和接口。

核心层的主要作用如下:

1 设备注册和管理:核心层负责注册和管理输入设备。它通过与设备驱动程序进行交互,将输入设备与相应的驱动程序进行匹配,并创建与设备相关的数据结构。这些数据结构包含设备的状态,属性和操作函数等信息。

2 事件处理:核心层负责处理输入设备产生的事件。当输入设备发生触摸,按键或其他操作时,

核心层会收到相应的事件数据,并进行处理。它将事件数据传递给上层应用程序或其他子系统,以便实现相应的交互操作。

3 事件分发:核心层负责将事件分发给注册了对应设备的应用程序或子系统。它根据设备的类型和属性,将事件传递给相应的处理程序。这样,应用程序或子系统就可以根据事件类型来执行相应的操作,例如处理触摸事件,响应按键输入等。

4 设备节点管理:核心层负责创建和管理输入设备的设备节点。设备节点通常位于/dev/input目录下,提供了对输入设备的访问接口。核心层会根据设备的类型和属性,在设备节点中创建相应的信息,并确保设备节点的正确性和一致性。

5 设备驱动程序的接口:核心层为设备驱动程序提供了接口,使其可以与输入子系统进行交互。驱动程序可以通过注册回调函数等方式,与核心层进行通信和数据交换,实现了输入设备的初始化,事件处理等功能。

152.2 代码分析

接下来,我们将详细分析位于核心层的代码kernel/drivers/input/input.c。该代码是Linux内核中用于处理输入设备的驱动程序的核心部分。

首先在代码中找到模块的入口函数input_init,如下所示:

上述的代码是输入子系统的初始化函数input_init,它在内核启动时被调用,以下是对代码的解释。

首先,函数尝试注册input_dev类,使用class_register(&input_class)函数。这个类用于表示输入设备,并提供了一些与输入设备相关的操作和属性。注册成功之后,可以在系统的/sys/class/input目录下查看,如下图所示

如果注册类失败,会打印错误信息并返回错误码。

接下来,函数调用input_proc_init()初始化输入子系统的proc文件系统接口。这个接口用于在/proc文件系统中提供有关输入设备的信息。如果初始化失败,会跳转到fail标签处进行错误处理。

然后,函数调用register_chrdev_region()来注册字符设备区域。字符设备是通过设备节点来访问输入设备的一种方式。该函数会为输入子系统的字符设备分配一个主设备号13,指定了设备节点的名称和数量。如果注册字符设备失败,会打印错误信息并跳转到fail2标签处进行错误处理。

最后,如果所有初始化步骤都成功,则返回0,表示输入子系统初始化成功。

如果在任何一个初始化步骤中出现错误,函数会进行逆向清理,依次调用input_proc_exit()释放proc文件系统接口和class_unregister(&input_class)注销input_dev类,并返回相应的错误码。 

接下来我们详细学习下input_proc_init()函数。input_proc_init()函数实现如下图所示:

以上代码是输入子系统的proc文件系统初始化函数input_proc_init,它负责在/proc文件系统中创建输入子系统相关的目录和文件,并设置相应的文件操作函数。以下是对代码的详细解释。

1 首先,函数调用proc_mkdir(“bus/input”,NULL)创建一个名为”bus/input”的目录,表示输入设备的总线类型。如果创建目录失败,返回错误码-ENOMEM,表示内存分配失败。

2 接下来,函数调用proc_create("devices", 0, proc_bus_input_dir, &input_devices_fileops)创建一个名为“device”的文件,并将其与之前创建的“bus/input”目录相关联。input_devices_fileops是一个结构体,包含了对“devices”文件进行操作的函数指针。如果创建文件失败,跳转到fail标签处进行错误处理。

3 然后,函数调用proc_create("handlers", 0, proc_bus_input_dir, &input_handlers_fileops)创建一个名为"handlers"的文件,并将其与"bus/input"目录相关联。与前面的步骤类似,input_handlers_fileops是一个结构体,包含了对"handlers"文件进行操作的函数指针。如果创建文件失败,跳转到fail2标签处进行错误处理。

4 最后,如果所有的步骤都成功,则返回0,表示输入子系统的proc文件系统初始化成功。

如果在创建目录或文件的过程中出现错误,函数会进行逆向清理。它会先删除之前创建的"devices"文件,然后再删除"bus/input"目录,最后返回错误码-ENOMEM,表示内存分配失败。

至此,核心层代码分析完毕。

这篇关于RK3568驱动指南|第十三篇 输入子系统-第152章 核心层代码分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/845959

相关文章

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例