RK3568驱动指南|第九篇 设备模型-第98章 创建多个属性文件的简便方法

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


第98章 创建多个属性文件的简便方法

在上一章节中,我们创建了一个属性文件,但是在情况中,我们可能需要创建N个属性文件,如果还按照上个章节的方法是非常麻烦的。本章节我们来学习创建多个属性文件的简便方法,这样可以更好地组织和管理相关属性文件,提供更清晰和一致的sysfs接口。

98.1 sysfs_create_group函数

sysfs_create_group函数,用于在sysfs中创建一个组(group)。组是一组相关的属性文件的集合,可以将它们放在同一个目录下提供更好的组织性和可读性。

函数原型如下所示:

int sysfs_create_group(struct kobject *kobj, const struct attribute_group *grp);

此函数有俩个参数,分别为如下所示:

kobj: 指向包含目标组的kobject的指针。

grp: 指向attribute_group结构体的指针,该结构体定义了组中的属性文件。

attribute_group 结构体定义如下:

struct attribute_group {const char *name;const struct attribute **attrs;mode_t (*is_visible)(struct kobject *kobj, struct attribute *attr, int index);
};

结构体中包含如下字段:

  • name: 组的名称,将用作sysfs目录的名称。
  • attrs: 指向属性文件数组的指针
  • is_visible : 可选的回调函数,用于决定每个属性文件是否可见。如果为NULL,则所有属性文件都可见。

属性文件数组是一个以struct attribute *类型为元素的数组,以NULL结束。每个struct attribute结构体表示一个属性文件,可以使用&运算符将属性对象(如struct kobject_attribute)的.attr字段传递给属性文件数组。

下面展示使用sysfs_create_group创建一个组并添加属性文件

struct attribute *attrs[] = {&attr1.attr,&attr2.attr,NULL,
};const struct attribute_group attr_group = {.name = "my_group",.attrs = attrs,
};sysfs_create_group(kobj, &attr_group);

在上述示例中,我们创建了一个名叫“my_group”的组,并将属性文件attr1和attr2添加到该组中,然后使用sys_create_group将该组添加到指定的kobject kobj中。接下来我们开始做实验。

98.2实验程序的编写

98.2.1 驱动程序编写

本实验对应的网盘路径为:iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动例程\73_attr04\module

我们编写驱动代码,创建了一个名为 "mykobject01" 的自定义 kobject,并在其中使用上小节介绍的方式创建了两个属性文件 "value1" 和 "value2"。编写完成的attr.c代码如下所示:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/configfs.h>
#include <linux/kernel.h>
#include <linux/kobject.h>
#include <linux/sysfs.h>// 定义了mykobj结构体指针变量mykobject01
struct kobject *mykobject01;// 自定义的show函数,用于读取属性值
ssize_t show_myvalue1(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
{ssize_t count;count = sprintf(buf, "show_myvalue1\n");return count;
};// 自定义的store函数,用于写入属性值
ssize_t store_myvalue1(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count)
{printk("buf is %s\n", buf);return count;
};// 自定义的show函数,用于读取属性值
ssize_t show_myvalue2(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
{ssize_t count;count = sprintf(buf, "show_myvalue2\n");return count;
};// 自定义的store函数,用于写入属性值
ssize_t store_myvalue2(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count)
{printk("buf is %s\n", buf);return count;
};// 定义attribute对象value1和value2
struct kobj_attribute value1 = __ATTR(value1, 0664, show_myvalue1, store_myvalue1);
struct kobj_attribute value2 = __ATTR(value2, 0664, show_myvalue2, store_myvalue2);struct attribute *attr[] = {&value1.attr,&value2.attr,NULL,
};const struct attribute_group my_attr_group = {.name = "myattr",.attrs = attr,
};// 模块的初始化函数
static int mykobj_init(void)
{int ret;// 创建并添加kobject "mykobject01"mykobject01 = kobject_create_and_add("mykobject01", NULL);// 在kobject "mykobject01" 中创建属性组ret = sysfs_create_group(mykobject01, &my_attr_group);return ret;
}// 模块的退出函数
static void mykobj_exit(void)
{// 释放kobject "mykobject01"kobject_put(mykobject01);
}module_init(mykobj_init); // 指定模块的初始化函数
module_exit(mykobj_exit); // 指定模块的退出函数
MODULE_LICENSE("GPL");    // 模块使用的许可证
MODULE_AUTHOR("topeet");  // 模块的作者

接下来驱动编写好之后,我们修改Linux源码中的kernel/lib/kobject.c文件,添加如下打印:

图98-1

然后重新编译内核镜像,单独烧写内核镜像。

98.3 运行测试

98.3.1 编译驱动程序

在上一小节中的attr.c代码同一目录下创建 Makefile 文件,Makefile 文件内容如下所示:

export ARCH=arm64#设置平台架构
export CROSS_COMPILE=aarch64-linux-gnu-#交叉编译器前缀
obj-m += attr.o   #此处要和你的驱动源文件同名
KDIR :=/home/topeet/Linux/linux_sdk/kernel    #这里是你的内核目录                                                                                                                            
PWD ?= $(shell pwd)
all:make -C $(KDIR) M=$(PWD) modules    #make操作
clean:make -C $(KDIR) M=$(PWD) clean    #make clean操作

对于Makefile的内容注释已在上图添加,保存退出之后,来到存放attr.c和Makefile文件目录下,如下图(图98-2)所示:

图 98-2

然后使用命令“make”进行驱动的编译,编译完成如下图(图98-3)所示:

图 98-3

编译完生成attr.ko目标文件,如下图(图98-4)所示:

图 98-4

至此驱动模块就编译成功了,接下来进行测试。

98.3.2 运行测试

内核镜像更新之后,开发板启动,使用以下命令进行驱动模块的加载,如下图(图98-5)所示:

insmod attr.ko

图 97-4

至此驱动模块就编译成功了,接下来进行测试。

97.2.2 运行测试

内核镜像更新之后,开发板启动,使用以下命令进行驱动模块的加载,如下图(图97-5)所示:

insmod attr.ko 

图97-5

驱动加载之后,我们进入/sys/目录下,可以看到创建生成的myobject01,如下图所示

图97-6

我们进到myobject01目录下,可以看到创建的属性文件value1和value2。

图97-7

我们可以使用echo和cat命令对属性值进行写入和读取,如下图所示,可以看到在写入和读取的过程中,会打印我们在内核中添加的打印。

图97-8

最后可以使用以下命令进行驱动的卸载,如下图(图97-9)所示:

rmmod attr

图 97-9

至此,创建属性文件并实现读写功能实验2就完成了。


 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

multipath 内核接口及框架介绍

文章目录 1 云主机使用网络存储 io 流程2 multipath 介绍 1 云主机使用网络存储 io 流程 对于一个云服务环境&#xff0c;大致会有网络节点&#xff0c;存储节点&#xff0c;计算节点&#xff0c;控制节点&#xff0c;其中虚拟云主机在计算节点工作&#xff0c;而虚拟云主机&a…

【MySQL】常用存储引擎,数据库管理,数据表管理,数据库账户管理

目录 一 常用的数据引擎(4) 1.1 InnoDB存储引擎 1.2 MyISAM存储引擎 1.3 Memory存储引擎 1.4 ARCHIVE存储引擎 二 数据库管理 2.1 元数据库概念与分类 2.2 相关操作命令 三 数据表的管理 3.1 三大范式 3.2 数据类型 四 数据库账户管理 五 思维导图 一 常用的数据…

高德地图经纬度坐标导出工具

https://tool.xuexiareas.com/map/amap 可以导出单个点&#xff0c;也可以导出多个&#xff0c;多个点可以连成线&#xff0c;可用于前端开发时自己模拟“线“数据

【docker】安装 Redis

查看可用的 redis版本 docker search redis拉取 redis最新镜像 docker pull redis:latest查看本地镜像 docker images创建挂在文件 mkdir -pv /test1/docker_volume/redis/datamkdir -pv /test1/docker_volume/redis/confcd /test1/docker_volume/redis/conf/touch redis.con…

Taro多端统一开发框架:小程序开发轻松驾驭,一套代码多端运行

引言 在如今不断增长的小程序市场中&#xff0c;小程序的数量迅速增多。这是因为小程序具有诸多优势&#xff0c;例如轻量化、便捷性和良好的用户体验&#xff0c;吸引了越来越多的开发者和企业加入这一领域。随着小程序的普及&#xff0c;各个行业都纷纷推出自己的小程序&…

图像分割 分水岭法 watershed

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 本文的C#版本请访问&#xff1a;图像分割 分水岭法 watershed&#xff08;C#&#xff09;-CSDN博客 Watershed算法是一种图像处理算…

如何给NVIDIA JetsonOrin Nano开发套件安装CSI摄像头

Jetson Orin Nano开发套件沿袭先前系列产品的设计重点&#xff0c;也提供两个CSI/MIPI摄像头接口&#xff0c;如下图右两个黄色圆框圈出的地方&#xff0c;不过这次的22针接口与先前系列产品的15针接口并不相同&#xff0c;不过先前产品所支持的摄像头规格&#xff08;例如IMX2…

Langchain访问OpenAI ChatGPT API Account deactivated的另类方法,访问跳板机API

笔者曾经写过 ChatGPT OpenAI API请求限制 尝试解决 Account deactivated. Please contact us through our help center at help.openai.com if you need assistance. 结果如何&#xff1f; 没有啥用。目前发现一条曲线救国的方案。 1. 在官方 openai 库中使用 此处为最新Op…

【Java并发】深入浅出 synchronized关键词原理-上

一个问题的思考 建设我们有两个线程&#xff0c;一个进行5000次的相加操作&#xff0c;另一个进行5000次的减操作。那么最终结果是多少 package com.jia.syn;import java.util.concurrent.TimeUnit;/*** author qxlx* date 2024/1/2 10:08 PM*/ public class SynTest {privat…

Android Matrix剪切clipPath缩放scale图片postTranslate圆形放大镜,Kotlin(1)

Android Matrix剪切clipPath缩放scale图片postTranslate圆形放大镜&#xff0c;Kotlin&#xff08;1&#xff09; 实现查看图片的放大镜&#xff0c;放大镜随着手指在屏幕上的移动&#xff0c;放大镜里面展示手指触点为中心、半径长度的圆形放大后的图片。 剪切出一块圆形Path…

掌握静态S5:从入门到精通的指南

在现今的数据驱动时代&#xff0c;静态S5作为一款强大的数据分析工具&#xff0c;越来越受到各行各业的青睐。然而&#xff0c;如何从入门到精通&#xff0c;全面掌握静态S5的各项功能&#xff0c;成为了许多用户面临的挑战。本文将为你提供一份详尽的指南&#xff0c;助你顺利…

milvus学习(一)cosin距离和欧式距离

参考&#xff1a;https://blog.csdn.net/qq_36560894/article/details/115408613 归一化以后的cosin距离和欧式距离可以相互转化&#xff0c;未归一化的不可以相互转化&#xff08;因为距离带单位&#xff09;。