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

相关文章

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT