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 panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We