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

瑞芯微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非常重要,可以帮助开发者更好地进行设备的配置和管理,提高系统的灵活性和可扩展性。如果大家还有不理解的地方,建议反复观看视频学习。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

神由之星加入元宇宙产业委员会共谋数字发展新篇章

近年来,元宇宙产业呈现出飞速发展的趋势,成为全球范围内备受瞩目的新兴行业。在这个充满机遇与挑战的时代,常州神由之星数字信息产业发展有限公司凭借敏锐的洞察力和卓越的数字产品,迅速抓住元宇宙的发展势头,大力发展元宇宙业务,成为该领域内一颗冉冉升起的新星。 神由之星荣膺…

数据分享 I 全国市级商品房屋销售数据,shp/excel格式,2005-2020年数据

基本信息. 数据名称: 全国市级商品房屋销售数据 数据格式: Shp、excel 数据时间: 2005-2020年 数据几何类型: 面 数据坐标系: WGS84坐标系 数据来源:网络公开数据 数据字段: 序号字段名称字段说明1spxse商品房销售额(亿元&#xf…

优思学院|如何建立公司运营指标体系?如何推行六西格玛改进运营指标?

关键绩效指标 (KPI) 是测量您团队或组织朝重要商业目标进展表现如何的量化指标,组织会在多个层面使用 KPI,这视乎您想要追踪何指标而定,您可以设定全组织的、特定团队的、或甚至是个人 KPI。 良好的KPI能让公司管理者掌握组织的营运是否进度…

在设计和考虑建造室外雨水收集池时需要注意的因素

在设计和建造室外雨水收集池时,需要考虑以下因素: 地质条件:建造雨水收集池需要考虑到地质条件,例如土壤类型、地基承载能力等。这些因素可能对水池的建造和结构产生影响。 气候条件:不同地区的降雨量、湿度、气温等…

Spring基于xml半注解开发

目录 Component的使用 依赖注解的使用 非自定义Bean的注解开发 Component的使用 基本Bean注解&#xff0c;主要是使用注解的方式替代原有的xml的<bean>标签及其标签属性的配置&#xff0c;使用Component注解替代<bean>标签中的id以及class属性&#xff0c;而对…

node.js express mongoose用户建模、权限校验

目录 userModel.js 依赖引入 数据建模 中间件 模型方法 创建user model并导出 catchAsync.js authController.js 依赖引入 token生成 注册 登录 密码修改 userRoutes.js 路由设计 protect中间件 角色中间件 app.js userModel.js 依赖引入 const mongoose …

解决canvas清晰度问题devicePixelRatio

视频教程 解决canvas清晰度的问题【渡一教育】_哔哩哔哩_bilibili 检测网页本身是否缩放 ,即缩放倍率 window.devicePixelRatio 为了获得清晰图像,需要遵循以下公式 原始尺寸样式尺寸*缩放倍率 在项目中,canvas里的原始尺寸一般与css中的样式尺寸一样,所以在写js代码时,涉…

纯电超跑SUV获得2024中国年度性能车大奖 路特斯ELETRE实力几何?

2023年12月5日&#xff0c;“中国年度车”颁奖盛典在北京圆满落幕。路特斯首款纯电超跑SUV ELETRE ( 参数询价 ) 斩获“2024中国年度性能车”大奖&#xff0c;成为首次获此殊荣的纯电SUV车型。一台纯电SUV能获得年度性能车奖项&#xff0c;注定是件非常有看点的事&#xff0c;那…

17.(vue3.x+vite)组件间通信方式之作用域插槽

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 作用域插槽 父组件中的插槽内容是无法访问到子组件中的数据的,而作用域插槽就是解决获取子组件数据。 父组件代码 <template><div><div>父组件--Hello World!</div><Child>

【普中开发板】基于51单片机电子钟闹钟设计( proteus仿真+程序+设计报告+讲解视频)

【普中开发板】基于51单片机电子钟闹钟数码管显示设计( proteus仿真程序设计报告讲解视频&#xff09; Proteus 仿真&#xff1a;Proteus 8.16 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;P03 51单片机电子钟闹钟 1. 主要功能&a…

RT-Thread Studio + STM32CubeMx 联合开发

RT-Thread Studio STM32CubeMx 联合开发 背景参考 背景 使用RTThreadNano开发工具&#xff1a; RTThread Studio&#xff1a;官方工具&#xff0c;对RTThread系统兼容最好&#xff0c;可以对不同的MCU平台进行开发&#xff0c;包括但不限于以下平台 STM32GD32IAR STM32CubeI…

mac 安装nvm以及切换node版本详细步骤

1、nvm介绍&#xff08;node版本管理工具&#xff09; nvm 可以让你通过命令行快速安装和使用不同版本的node 有时候项目太老&#xff0c;node版本太高,执行npm install命令会报错,可以借助nvm切换低版本的node。 2、安装nvm 在终端执行安装命令 curl -o- https://raw.gith…

Vue router深入学习

Vue router深入学习 一、单页应用程序介绍 1.概念 单页应用程序&#xff1a;SPA【Single Page Application】是指所有的功能都在一个html页面上实现 2.具体示例 单页应用网站&#xff1a; 网易云音乐 https://music.163.com/ 多页应用网站&#xff1a;京东 https://jd.co…

销售技巧培训之如何提升化妆品销售技巧

销售技巧培训之如何提升化妆品销售技巧 一、引言 在当今竞争激烈的化妆品市场&#xff0c;销售人员需要掌握一定的技巧才能吸引顾客&#xff0c;提高销售业绩。本文将通过实际案例&#xff0c;探讨化妆品销售的有效技巧&#xff0c;帮助销售人员提升业绩。 二、案例分析 案…

jstree组件的使用详细教程,部分案例( PHP / fastAdmin )

jstree 组件的使用。 简介&#xff1a;JsTree是一个jquery的插件&#xff0c;它提交一个非常友好并且强大的交互性的树&#xff0c;并且是完全免费或开源的&#xff08;MIT 许可&#xff09;。Jstree技持Html 或 json格式的的数据&#xff0c; 或者是ajax方式的动态请求加载数…

宁夏康源肛肠医院发声 有劳肠道了

肠道先生&#xff1a; 你好&#xff0c;我是宁夏康源肛肠医院&#xff0c;今日书信一封&#xff0c;旨在请先生出山&#xff0c;救万民健康于水火。当前&#xff0c;支原体肺炎肆虐&#xff0c;且尚无疫苗可预&#xff0c;值此危急之际&#xff0c;正是肠道先生免疫力发挥功力…

高速吹风筒方案中光耦的作用和原理--【其利天下技术】

我们都知道高速风筒方案中&#xff0c;采用了光耦作为隔离元器件&#xff0c;那么光耦是个什么特性的元件呢&#xff1f;它用来隔离什么东西呢&#xff1f;它又是如何做到隔离作用的呢&#xff1f;带着这样的疑问&#xff0c;我们对光耦做一番研究吧。 其利天下技术--光耦 &am…

AutoAnimate动画库,仅需一行代码

插件官网,支持react,vue AutoAnimate - Add motion to your apps with a single line of code 自动加动画原理 AutoAnimate 加动画的原理也很简单&#xff0c;监听绑定的 DOM 节点里 DOM 结构变化&#xff0c;自动添加对应的过渡动画&#xff1a; 增加子节点 > 渐入动画…

芳村金融茶最新进展——00后老板被带走调查

芳村 芳村茶叶的发展史可以追溯到1858年&#xff0c;当时芳村花地的翠林花园一角&#xff0c;已经有茶叶商行和制茶作坊。然而&#xff0c;芳村真正以花闻名&#xff0c;可以说是“先有花后有茶”&#xff0c;是花带动了茶的发展。在20世纪70年代左右&#xff0c;芳村和山村主要…