本文主要是介绍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章 核心层代码分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!