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

相关文章

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

CentOS7更改默认SSH端口与配置指南

《CentOS7更改默认SSH端口与配置指南》SSH是Linux服务器远程管理的核心工具,其默认监听端口为22,由于端口22众所周知,这也使得服务器容易受到自动化扫描和暴力破解攻击,本文将系统性地介绍... 目录引言为什么要更改 SSH 默认端口?步骤详解:如何更改 Centos 7 的 SSH 默认端口1

SpringBoot多数据源配置完整指南

《SpringBoot多数据源配置完整指南》在复杂的企业应用中,经常需要连接多个数据库,SpringBoot提供了灵活的多数据源配置方式,以下是详细的实现方案,需要的朋友可以参考下... 目录一、基础多数据源配置1. 添加依赖2. 配置多个数据源3. 配置数据源Bean二、JPA多数据源配置1. 配置主数据

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

python中各种常见文件的读写操作与类型转换详细指南

《python中各种常见文件的读写操作与类型转换详细指南》这篇文章主要为大家详细介绍了python中各种常见文件(txt,xls,csv,sql,二进制文件)的读写操作与类型转换,感兴趣的小伙伴可以跟... 目录1.文件txt读写标准用法1.1写入文件1.2读取文件2. 二进制文件读取3. 大文件读取3.1

SpringBoot中配置Redis连接池的完整指南

《SpringBoot中配置Redis连接池的完整指南》这篇文章主要为大家详细介绍了SpringBoot中配置Redis连接池的完整指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以... 目录一、添加依赖二、配置 Redis 连接池三、测试 Redis 操作四、完整示例代码(一)pom.