RK3568驱动指南|第九篇 设备树模型-第85章设备模型基本框架-kobject和kset

本文主要是介绍RK3568驱动指南|第九篇 设备树模型-第85章设备模型基本框架-kobject和kset,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

瑞芯微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主板


第九篇 设备模型

第85章设备模型基本框架-kobject和kset

85.1 什么是设备模型

字符设备驱动通常适用于相对简单的设备,对于一些更复杂的功能,比如说电源管理和热插拔事件管理,使用字符设备框架可能不够灵活和高效。为了应对更复杂的设备和功能,Linux内核提供了设备模型。设备模型允许开发人员以更高级的方式来描述硬件设备和它们之间的关系,并提供一组通用API和机制来处理设备的注册,热插拔事件,电源管理等。

   通过使用设备模型,驱动开发人员可以将更多的底层功能交给内核来处理,而不必重复实现这些基础功能。这使得驱动的编写更加高级和模块化,减少了重复工作和出错的可能性。对于一些常见的硬件设备,如USB、i2c和平台设备,内核已经提供了相应的设备模型和相关驱动,开发人员可以基于这些模型来编写驱动,从而更快地实现特定设备的功能,并且可以借助内核的电源管理和热插拔事件管理功能。

总之,使用设备模型可以帮助简化驱动开发过程,并提供更高级的功能和灵活性,使得驱动开发人员能够更好地适应复杂的硬件设备需求。

85.2 设备模型的好处

设备模型在内核驱动中扮演着重要的角色,它提供了一种统一的方式来描述硬件设备和它们之间的关系。以下是设备模型在内核驱动中的几个重要方面。

1 代码复用:设备模型允许多个设备复用同一个驱动。通过在设备树或总线上定义不同的设备节点,这些设备可以使用相同的驱动进行初始化和管理。这样可以减少代码的冗余,提高驱动的复用性和维护性。

2 资源的动态申请和释放:设备模型提供了一种机制来动态申请和释放设备所需的资源,如内存,中断等。驱动可以使用这些机制来管理设备所需的资源,确保在设备初始化和关闭时进行正确的资源分配和释放。

3 简化驱动编写: 设备模型提供了一组通用API和机制,使得驱动编写更加简化和模块化。开发人员可以使用这些API来注册设备,处理设备事件,进行设备的读写操作等,而无需重复实现这些通用功能。

4 热插拔机制:设备模型支持热插拔机制,能够在运行时动态添加或移除设备。当设备插入或拔出时,内核会生成相应的热插拔事件,驱动可以通过监听这些事件来执行相应的操作,如设备的初始化或释放。

5 驱动的面向对象思想:设备模型的设计借鉴了面向对象编程(OOP)的思想。每个设备都被看作是一个对象,具有自己的属性和方法,并且可以通过设备模型的机制进行继承和扩展。这种设计使得驱动的编写更加模块化和可扩展,可以更好地应对不同类型的设备和功能需求。

总之,设备模型在内核驱动中扮演着关键的角色,通过提供统一的设备描述和管理机制,简化了驱动的编写和维护过程,提高了代码的复用性和可维护性,并支持热插拔和动态资源管理等重要功能。

85.3 kobject和kset基本概念

kobject和kset是Linux内核中用于管理内核对象的基本概念。

kobject(内核对象)是内核中抽象出来的通用对象模型,用于表示内核中的各种实体。kobject是一个结构体,其中包含了一些描述该对象的属性和方法。它提供了一种统一的接口和机制,用于管理和操作内核对象。kobject结构体在内核源码kernel/include/linux/kobject.h文件中,如下所示:

struct kobject {const char		*name;struct list_head	entry;struct kobject		*parent;struct kset		*kset;struct kobj_type	*ktype;struct kernfs_node	*sd; /* sysfs directory entry */struct kref		kref;
#ifdef CONFIG_DEBUG_KOBJECT_RELEASEstruct delayed_work	release;
#endifunsigned int state_initialized:1;unsigned int state_in_sysfs:1;unsigned int state_add_uevent_sent:1;unsigned int state_remove_uevent_sent:1;unsigned int uevent_suppress:1;ANDROID_KABI_RESERVE(1);ANDROID_KABI_RESERVE(2);ANDROID_KABI_RESERVE(3);ANDROID_KABI_RESERVE(4);
};

这是Linux内核中的struct kobject结构体的定义。它包含了一些字段用于表示和管理内核对象。

下面是一些主要字段的解释:

- const char *name:表示kobject的名称,通常用于在/sys目录下创建对应的目录。

- struct list_head entry:用于将kobject链接到父kobject的子对象列表中,以建立层次关系。

- struct kobject *parent:指向父kobject,表示kobject的层次关系。

- struct kset *kset:指向包含该kobject的kset,用于进一步组织和管理kobject。

- struct kobj_type *ktype:指向定义kobject类型的kobj_type结构体,描述kobject的属性和操作。

- struct kernfs_node *sd:指向sysfs目录中对应的kernfs_node,用于访问和操作sysfs目录项。

- struct kref kref:用于对kobject进行引用计数,确保在不再使用时能够正确释放资源。

- unsigned int 字段:表示一些状态标志和配置选项,例如是否已初始化、是否在sysfs中、是否发送了add/remove uevent等。

 

图 85-1

之前我们在学习平台总线时,查看平台总线要进入/sys/bus目录下,bus目录下的文件都是和总线相关的目录,比如amba总线,CPU总线,platform总线。如下图所示:

图 85-2

kobject表示系统/sys下的一个目录,而目录又是有多个层次,所以对应kobject的树状关系如下图所示:

图 85-3

我们来分析一下上图。在kobject结构体中,parent指针用于表示父kobject,从而建立了kobject之间的层次关系,类似于目录结构中的父目录和子目录的关系。一个kobject可以有一个父kobject和多个子kobject,通过parent指针可以将它们连接起来形成一个层次化的结构,类似于目录结构中,一个目录可以有一个父目录和多个子目录,通过目录的路径可以表示目录之间的层次关系。这种层次化的关系可以方便地进行遍历,查找和管理,使得内核对象能够按照层次关系进行组织和管理。这种设计使得kobject的树状结构在内核中具有很高的灵活性和可扩展性。

接下来我们继续学习kset。

kset(内核对象集合)是一种用于组织和管理一组相关kobject的容器。kset是kobject的一种扩展,它提供了一种层次化的组织结构,可以将一组相关的kobject组织在一起。kset在内核里面用struct kset结构体来表示,定义在include/linux/kobject.h头文件中,如下所示:

struct kset {struct list_head list;spinlock_t list_lock;struct kobject kobj;const struct kset_uevent_ops *uevent_ops;ANDROID_KABI_RESERVE(1);ANDROID_KABI_RESERVE(2);ANDROID_KABI_RESERVE(3);ANDROID_KABI_RESERVE(4);
} __randomize_layout;

这是Linux内核中的struct kset结构体的定义。kset是一种用于组织和管理kobject的集合。

下面是一些主要字段的解释:

- struct list_head list:用于将kset链接到全局kset链表中,以便对kset进行遍历和管理。

- spinlock_t list_lock:用于保护对kset链表的并发访问,确保线程安全性。

- struct kobject kobj:作为kset的kobject表示,用于在/sys目录下创建对应的目录,并与kset关联。

- const struct kset_uevent_ops *uevent_ops:指向kset的uevent操作的结构体,用于处理与kset相关的uevent事件。

该结构体还包含了一些与特定配置相关的保留字段。kset通过包含一个kobject作为其成员,将kset本身表示为一个kobject,并使用kobj来管理和操作kset。通过list字段,kset可以链接到全局kset链表中,以便进行全局的遍历和管理。同时,list_lock字段用于保护对kset链表的并发访问。kset还可以定义自己的uevent操作,用于处理与kset相关的uevent事件,例如在添加或删除kobject时发送相应的uevent通知。

这些字段共同构成了kset的基本属性和关系,用于在内核中组织和管理一组相关的kobject。kset提供了一种层次化的组织结构,并与sysfs目录相对应,方便对kobject进行管理和操作。


85.4 kset和kobject的关系

 在Linux内核中,kset和kobject是相关联的两个概念,它们之间存在一种层次化的关系,

如下图所示:

图 85-4

1. kset是kobject的一种扩展:kset可以被看作是kobject的一种特殊形式,它扩展了kobject并提供了一些额外的功能。kset可以包含多个kobject,形成一个层次化的组织结构。

2. kobject属于一个kset:每个kobject都属于一个kset。kobject结构体中的struct kset *kset字段指向所属的kset。这个关联关系表示了kobject所在的集合或组织。

通过kset和kobject之间的关系,可以实现对内核对象的层次化管理和操作。kset提供了对kobject的集合管理接口,可以通过kset来迭代、查找、添加或删除kobject。同时,kset也提供了特定于集合的功能,例如在集合级别处理uevent事件。

总结起来,kset和kobject之间的关系是:一个kset可以包含多个kobject,而一个kobject只能属于一个kset。kset提供了对kobject的集合管理和操作接口,用于组织和管理具有相似特性或关系的kobject。这种关系使得内核能够以一种统一的方式管理和操作不同类型的内核对象。


这篇关于RK3568驱动指南|第九篇 设备树模型-第85章设备模型基本框架-kobject和kset的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

macOS怎么轻松更换App图标? Mac电脑图标更换指南

《macOS怎么轻松更换App图标?Mac电脑图标更换指南》想要给你的Mac电脑按照自己的喜好来更换App图标?其实非常简单,只需要两步就能搞定,下面我来详细讲解一下... 虽然 MACOS 的个性化定制选项已经「缩水」,不如早期版本那么丰富,www.chinasem.cn但我们仍然可以按照自己的喜好来更换

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram

使用JavaScript将PDF页面中的标注扁平化的操作指南

《使用JavaScript将PDF页面中的标注扁平化的操作指南》扁平化(flatten)操作可以将标注作为矢量图形包含在PDF页面的内容中,使其不可编辑,DynamsoftDocumentViewer... 目录使用Dynamsoft Document Viewer打开一个PDF文件并启用标注添加功能扁平化

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

如何安装 Ubuntu 24.04 LTS 桌面版或服务器? Ubuntu安装指南

《如何安装Ubuntu24.04LTS桌面版或服务器?Ubuntu安装指南》对于我们程序员来说,有一个好用的操作系统、好的编程环境也是很重要,如何安装Ubuntu24.04LTS桌面... Ubuntu 24.04 LTS,代号 Noble NumBAT,于 2024 年 4 月 25 日正式发布,引入了众