RK3568驱动指南|第八篇 设备树插件-第75章ConfigFS的核心数据结构

news2024/11/13 10:33:12

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


第75章ConfigFS的核心数据结构

在前面的章节中,我们对于ConfigFS 有了一个感性的认识,本章节将进一步深入,探讨ConfigFS的核心数据结构,这将为我们理解ConfigFS的内部工作原理提供基础。让我们一起深入学习ConfigFS的核心数据结构吧!

75.1 关键数据结构

接下来我们将要学习如何创建内核对象,然后生成对应的文件和目录。

在创建之前,我们先要了解下和ConfigFs文件系统相关的几个核心数据结构。

ConfigFS的核心数据结构主要包括以下几个部分:

  1. :是一个顶层的数据结构,用于表示整个ConfigFS子系统。它包含了根配置项组的指针,以及ConfigFS的其他属性和状态信息。
  2. :是一种特殊类型的配置项,表示一个配置项组。它可以包含一组相关的配置项,形成一个层次结构。config_group结构包含了父配置项的指针,以及指向子配置项的链表。
  3. :这是ConfigFS中最基本的数据结构,用于表示一个配置项。每个配置项都是一个内核对象,可以是设备、驱动程序、子系统等。结构包含了配置项的类型、名称、属性、状态等信息,以及指向父配置项和子配置项的指针。

这些数据结构之间的关系可以形成一个树形结构,其中configfs_subsystem是根节点,config_group表示配置项组,config_item表示单个配置项。子配置项通过链表连接在一起,形成父子关系。如下表(图 75-1)所示:

75.2 子系统、容器和config_item

本小节我们来了解下子系统,容器,config_item的结构体。

configfs_subsystem结构体,如下所示:

struct configfs_subsystem {
	struct config_group	su_group;
	struct mutex		su_mutex;
};

configfs_subsystem结构体中包含config_group结构体,config_group结构体如下所示:

struct config_group {
	struct config_item		cg_item;
	struct list_head		cg_children;
	struct configfs_subsystem 	*cg_subsys;
	struct list_head		default_groups;
	struct list_head		group_entry;
};

config_group结构体中包含config_item结构体,config_item结构体如下所示:

struct config_item {
	char			*ci_name;
	char			ci_namebuf[CONFIGFS_ITEM_NAME_LEN];  //目录的名字
	struct kref		ci_kref;
	struct list_head	ci_entry;
	struct config_item	*ci_parent;
	struct config_group	*ci_group;
	const struct config_item_type	*ci_type;  //目录下属性文件和属性操作
	struct dentry		*ci_dentry;
};

接下来我们来分析设备树插件驱动代码,如下(图 75-2)所示:

图 75-2

这段代码定义了一个名为dtbocfg_root_subsysconfigfs_subsystem结构体实例,表示ConfigFS中的一个子系统。

首先,dtbocfg_root_subsys.su_group是一个config_group结构体,它表示子系统的根配置项组。在这里,该结构体的.cg_item字段表示根配置项组的基本配置项。

  1. = "device-tree":配置项的名称设置为"device-tree",表示该配置项的名称为"device-tree"。
  2. = &dtbocfg_root_type:配置项的类型设置为dtbocfg_root_type,这是一个自定义的配置项类型。

接下来,.su_mutex字段是一个互斥锁,用于保护子系统的操作。在这里,使用了__MUTEX_INITIALIZER宏来初始化互斥锁。

通过这段代码,创建了一个名为"device-tree"的子系统,它的根配置项组为空。可以在该子系统下添加更多的配置项和配置项组,用于动态配置和管理设备树相关的内核对象。Linux系统下创建了device-tree这个子系统,如下图(图 75-3)所示:

图 75-3

接下来继续分析设备树插件驱动代码中注册配置项组的部分,如下图(图 75-4)所示:

图 75-4

这段代码是一个初始化函数dtbocfg_module_init(),用于初始化和注册ConfigFS子系统和配置项组。首先,通过config_group_init()函数初始化了dtbocfg_root_subsys.su_group,即子系统的根配置项组。接下来,使用config_group_init_type_name()函数初始化了dtbocfg_overlay_group,表示名为"overlays"的配置项组,并指定了配置项组的类型为dtbocfg_overlays_type,这是一个自定义的配置项类型。然后,调用configfs_register_subsystem()函数注册了dtbocfg_root_subsys子系统。如果注册失败,将打印错误信息,并跳转到register_subsystem_failed标签处进行错误处理。接着,调用configfs_register_group()函数注册了dtbocfg_overlay_group配置项组,并将其添加到dtbocfg_root_subsys.su_group下。如果注册失败,同样会打印错误信息,并跳转到register_group_failed标签处进行错误处理。最后,如果所有的注册过程都成功,将打印"OK"消息,并返回0,表示初始化成功。如果在注册配置项组失败时,会先调用configfs_unregister_subsystem()函数注销之前注册的子系统,然后返回注册失败的错误码retval。

这段代码的作用是初始化和注册一个名为"device-tree"的ConfigFS子系统,并在其下创建一个名为"overlays"的配置项组。Linux系统下,在device-tree子系统下创建了overlays容器,如下图(图 75-5)所示:

图 75-5

75.3 属性和方法

我们要在容器下放目录或属性文件,所以我们看一下config_item结构体,如下所示:

struct config_item {
	char			*ci_name;
	char			ci_namebuf[CONFIGFS_ITEM_NAME_LEN];  //目录的名字
	struct kref		ci_kref;
	struct list_head	ci_entry;
	struct config_item	*ci_parent;
	struct config_group	*ci_group;
	const struct config_item_type	*ci_type;  //目录下属性文件和属性操作
	struct dentry		*ci_dentry;
};

config_item结构体中包含了 config_item_type结构体,config_item_type结构体如下所示:

struct config_item_type {
	struct module				*ct_owner;
	struct configfs_item_operations		*ct_item_ops;  //item(目录)的操作方法
	struct configfs_group_operations	*ct_group_ops;  //group(容器)的操作方法
	struct configfs_attribute		**ct_attrs;     //属性文件的操作方法
	struct configfs_bin_attribute		**ct_bin_attrs; //bin属性文件的操作方法
};
  1. 结构体中包含了struct configfs_item_operations结构体,如下所示:
struct configfs_item_operations {
//删除item方法,在group下面使用rmdir命令会调用这个方法
	void (*release)(struct config_item *);
	int (*allow_link)(struct config_item *src, struct config_item *target);
	void (*drop_link)(struct config_item *src, struct config_item *target);
};
  1. 结构体中包含了struct configfs_group_operations结构体,如下所示:
struct configfs_group_operations {
	//创建item的方法,在group下面使用mkdir命令会调用这个方法
struct config_item *(*make_item)(struct config_group *group, const char *name); 
	//创建group的方法
struct config_group *(*make_group)(struct config_group *group, const char *name);
	int (*commit_item)(struct config_item *item);
	void (*disconnect_notify)(struct config_group *group, struct config_item *item);
	void (*drop_item)(struct config_group *group, struct config_item *item);
};
  1. 结构体中包含了struct configfs_attribute结构体 ,如下所示:
struct configfs_attribute {
	const char		*ca_name;  属性文件的名字
	struct module 		*ca_owner;  属性文件文件的所属模块
	umode_t			ca_mode;  属性文件访问权限
读写方法的函数指针,具体功能需要自行实现。
	ssize_t (*show)(struct config_item *, char *);   
	ssize_t (*store)(struct config_item *, const char *, size_t);  };

75.4 总结

在上面几个小节中,对ConfigFS的核心数据结构做出了详细的解释,本小节我们来总结一下。这些核心数据结构相互关联,通过在ConfigFS层级结构进行组织和管理,使得设备的配置和管理更加灵活和可定制。如下图(图 75-6)所示:

图 75-6

理解ConfigFS的核心数据结构对于深入使用和定制ConfigFS非常重要,可以帮助开发者更好地进行设备的配置和管理,提高系统的灵活性和可扩展性。如果大家还有不理解的地方,建议反复观看视频学习。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1304858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Docker】进阶之路:(九)Docker网络

【Docker】进阶之路:(九)Docker网络 Docker网络模式简介bridge网络模式host网络模式none网络模式container网络模式user-defined网络模式1.创建自定义的bridge网络2.使用自定义网络 高级网络配置docker network命令 为什么要了解容器的网络模…

谈谈MYSQL主从复制原理

目录 概述 要点binlog日志 主从复制过程 总结 概述 MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。 MySQL 默认采用异步复制方式。从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行&#xff0…

Python应用利器:缓存妙用,让你的程序更出色更快速!

在 Python 应用程序中,使用缓存能够显著提高性能并降低资源消耗。本文将详细介绍如何在 Python 中实现缓存机制,包括内置 functools 模块提供的 lru_cache 装饰器以及自定义缓存机制。 使用 functools 模块的 lru_cache functools 模块提供了 lru_cach…

【CDP】CDP 集群通过Knox 访问Yarn Web UI,无法跳转到Flink Web UI 问题解决

一、前言 记录下在CDP 环境中,通过Knox 访问Yarn Web UI,无法跳转到Flink Web UI 的BUG 解决方法。 二、问题复现 登录 Knox Web UI 找到任一 Flink 任务 点击 ApplicationMaster 跳转 Flink WEB UI 出问题 内容空白,无法正常跳转到…

【MySQL】mysql | mysql5.7升级8.0注意事项

一、说明 1、应公司要求,mysql5.7安全漏洞较多,需要升级到8.0 2、记录注意事项备不时之需 二、注意事项 1、加密算法 1)加密算法8.0改了,导致navicat无法连接 2)解决: use mysql; ALTER USER root% IDENT…

利用冒泡排序了解如何将数组作为参数传递给函数

目录 前言:冒泡排序简介步骤动图演示 错误的冒泡排序函数数组名正确的冒泡排序函数 前言:冒泡排序 简介 冒泡排序是一种简单直观的排序算法。 它重复地访问要排序的数,一次比较两个元素,如果他们的顺序错误就把他们交换过来。访问数需要重复地进行直到…

DS冲刺整理做题定理(一)二叉树专题

(只总结博主自己记得不熟的~) 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技…

微服务——分布式事务

事务理论基础 分布式锁保证多线程下数据库操作安全保障 分布式事务发生异常可以回滚. 使用postman发送请求插入一条新订单。 然后现在库存只剩下8个商品,如果买10个的话应该统一失败。 CAP定理 假如node03在独立时将所有请求都堵塞并等待恢复和其余节点的连接的话以…

【Spring Boot】快速入门

一、引言 1、什么是spring boot? Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff…

【c++】stl_priority_queue优先级队列

目录 一、priority_queue的介绍 二、 priority_queue的本质 三、priority_queue的使用 四、priority_queue的模拟实现 总结 一、priority_queue的介绍 首先让我们通过阅读优先级队列的官方文档 简单翻译一下 1. 优先队列是一种容器适配器,根据严格的弱排序标准…

内存不够用怎么办?整理了几个必备的方法!

内存越大,运行越快,程序之间的切换和响应也会更加流畅。但是随着时间的增加,还是堆积了越来越多的各种文件,导致内存不够用,下面就像大家介绍三种好用的清理内存的方法。 方法一:通过电脑系统自带的性能清理…

关于Android studio新版本和NEW UI显示返回按钮的设置

1.新版Android studio问题 因为在新版本的Android Studio中,默认情况下是没有直接的选项来显示返回上一步按钮在状态栏上的,可以通过以下方法来实现返回上一步的功能: 在Android Studio的顶部菜单栏中,选择"View"。在…

量子纠错率提高100倍!亚马逊云科技开启量子创新时代

由AWS开发和制造的包装组件中的超导量子芯片(图片来源:网络) 作为一项尖端技术,量子计算能提供前所未有的计算能力。美国亚马逊云科技(AWS)近期推出了一款量子芯片,展示出该技术取得了重大飞跃…

为什么选择国产WordPress:HelpLook的优势解析

如今网站建设可以说已经是企业必备。而在众多的网站建设工具中,WordPress无疑是其中的佼佼者。作为一款开源的CMS(内容管理系统),WordPress拥有丰富的插件和主题,以及强大的功能,使得用户可以轻松地构建出符…

golang 操作Jenkins

1.創建Agent/Node func CreateAgent(username string, password string, nodeName string, nodeDescription string, numExecutors string, remoteFS string, labelString string, host string) {var obj stringobj "{name:" nodeName ",nodeDescription:&q…

洛谷 P8802 [蓝桥杯 2022 国 B] 出差

文章目录 [蓝桥杯 2022 国 B] 出差题目链接题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 思路解析CODE [蓝桥杯 2022 国 B] 出差 题目链接 https://www.luogu.com.cn/problem/P8802 题目描述 A \mathrm{A} A 国有 N N N 个城市,编号为 1 … N …

抖音跑腿小程序开发指南:从零开始到上线

如今,抖音跑腿小程序的开发已经成为一项具有巨大潜力的领域。本文将为您提供一份详尽的开发指南,从零开始引导您完成一个成功的抖音跑腿小程序的开发和上线过程。 第一步:确定目标和需求 了解用户的期望,确定小程序的功能模块&a…

ROS-ROS通信机制-小乌龟

文章目录 1.话题发布2.话题订阅3.服务调用4.参数设置5.通信机制比较 1.话题发布 需求描述: 编码实现乌龟运动控制,让小乌龟做圆周运动。 实现分析: 乌龟运动控制实现,关键节点有两个,一个是乌龟运动显示节点 turtlesim_node,另…

在RHEL8中如何使用 SELinux

本章主要介绍在RHEL8中如何使用 SELinux。 了解什么是 SELinux 了解 SELinux 的上下文 配置端口上下文 了解SELinux的布尔值 了解SELinux的模式 在 Windows系统中安装了一些安全软件后,当执行某个命令时,如果安全软件认为这个 命令对系统是一种危害&a…

【广州华锐互动】3D虚拟还原井下复杂事故:提高安全意识,预防事故再次发生

随着科技的不断发展,3D虚拟现实技术已经逐渐应用于各个领域,为我们的生活带来了诸多便利。在钻井行业,3D虚拟现实技术的应用也日益受到重视。通过3D虚拟还原井下复杂事故,可以帮助我们更直观地了解事故发生的原因和过程&#xff0…