RK3568驱动指南|第九篇 设备模型-第95章 创建属性文件并实现读写功能实验1

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


第95章 创建属性文件并实现读写功能实验1

本章节我们来探索如何创建具有读写功能的属性文件。属性文件通过 sysfs 文件系统提供了一种方便的方式来与内核对象进行交互。我们将深入研究一个代码示例,演示如何创建具有属性的自定义 kobject,使我们能够读取和写入值。让我们开始吧!

95.1实验程序的编写

95.1.1 驱动程序编写

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

我们编写驱动代码,该代码创建了一个自定义的 kobject,并在 sysfs 中创建了两个属性——value1和value2,允许读取和写入这些属性的值。模块的初始化函数负责创建和添加 kobject,而退出函数则负责释放相关资源。编写完成的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> // 自定义的kobject结构体,包含一个kobject对象和两个整型值
struct mykobj
{struct kobject kobj;int value1;int value2;
};// 定义了mykobj结构体指针变量mykobject01
struct mykobj *mykobject01;// 自定义的kobject释放函数
static void dynamic_kobj_release(struct kobject *kobj)
{struct mykobj *mykobject01 = container_of(kobj, struct mykobj, kobj);printk("kobject: (%p): %s\n", kobj, __func__);kfree(mykobject01);
}// 自定义的attribute对象value1和value2
struct attribute value1 = {.name = "value1",.mode = 0666,
};
struct attribute value2 = {.name = "value2",.mode = 0666,
};// 将attribute对象放入数组中
struct attribute *myattr[] = {&value1,&value2,NULL,
};// 自定义的show函数,用于读取属性值
ssize_t myshow(struct kobject *kobj, struct attribute *attr, char *buf)
{ssize_t count;struct mykobj *mykobject01 = container_of(kobj, struct mykobj, kobj);if (strcmp(attr->name, "value1") == 0){count = sprintf(buf, "%d\n", mykobject01->value1);}else if (strcmp(attr->name, "value2") == 0){count = sprintf(buf, "%d\n", mykobject01->value2);}else{count = 0;}return count;
}// 自定义的store函数,用于写入属性值
ssize_t mystore(struct kobject *kobj, struct attribute *attr, const char *buf, size_t size)
{struct mykobj *mykobject01 = container_of(kobj, struct mykobj, kobj);if (strcmp(attr->name, "value1") == 0){sscanf(buf, "%d\n", &mykobject01->value1);}else if (strcmp(attr->name, "value2") == 0){sscanf(buf, "%d\n", &mykobject01->value2);}return size;
}// 自定义的sysfs_ops结构体,包含show和store函数指针
struct sysfs_ops myops = {.show = myshow,.store = mystore,
};// 自定义的kobj_type结构体,包含释放函数、默认属性和sysfs_ops
static struct kobj_type mytype = {.release = dynamic_kobj_release,.default_attrs = myattr,.sysfs_ops = &myops,
};// 模块的初始化函数
static int mykobj_init(void)
{int ret;// 分配并初始化mykobject01mykobject01 = kzalloc(sizeof(struct mykobj), GFP_KERNEL);mykobject01->value1 = 1;mykobject01->value2 = 1;// 初始化并添加mykobject01到内核中,名为"mykobject01"ret = kobject_init_and_add(&mykobject01->kobj, &mytype, NULL, "%s", "mykobject01");return 0;
}// 模块的退出函数
static void mykobj_exit(void)
{// 释放mykobject01kobject_put(&mykobject01->kobj);
}module_init(mykobj_init); // 指定模块的初始化函数
module_exit(mykobj_exit); // 指定模块的退出函数MODULE_LICENSE("GPL");   // 模块使用的许可证
MODULE_AUTHOR("topeet"); // 模块的作者MODULE_LICENSE("GPL");   // 模块使用的许可证
MODULE_AUTHOR("topeet"); // 模块的作者

95.2 运行测试

95.2.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文件目录下,如下图(图95-1)所示:

图 95-1

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

图 95-2

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

图 95-3

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

95.2.2 运行测试

开发板启动之后,使用以下命令进行驱动模块的加载,如下图(图95-4)所示:

insmod attr.ko

图95-4

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

图95-6

我们可以使用echo和cat命令对属性值进行写入和读取,如下图所示:

图95-7

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

rmmod attr 

图95-8

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


 

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

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

相关文章

子进程继承了内存映射mmap导致flock文件锁泄露

背景 想要利用文件锁在进程退出时自动释放的机制&#xff0c;让守护进程管擦某些资源的释放&#xff0c;并执行相关清理/重启工作。然而发现守护进程在父进程退出时永远饿死。 问题伪代码 主进程子进程 安装信号捕获&#xff0c;每当有信号时print并退出&#xff0c;对子进…

实验笔记之——基于windows复现Instant-NGP

之前博客对NeRF-SLAM进行了调研&#xff0c;本博文先复现一下Intant-NGP。 学习笔记之——NeRF SLAM&#xff08;基于神经辐射场的SLAM&#xff09;-CSDN博客文章浏览阅读851次&#xff0c;点赞22次&#xff0c;收藏21次。NeRF 所做的任务是 Novel View Synthesis&#xff08;…

Git提交代码发生冲突的场景与解决方案

问题 当我们在使用 Git 向远程仓库提交代码时&#xff0c;可能会遇到如下所述的错误提示&#xff1a; To https://github.com/xxxxx/gitmerge.git! [rejected] master -> master (fetch first) error: failed to push some refs to https://github.com/xxxxx/gitme…

CMake入门教程【核心篇】编译类型Debug、Release、MinSizeRel、RelWithDebInfo

文章目录 1.说明1.1 Debug 配置1.2 Release 配置1.3 MinSizeRel 配置1.4 RelWithDebInfo 配置 2.提供的编译类型3.示例结论 1.说明 CMake作为一款强大的构建系统&#xff0c;提供了多种编译配置选项。这些配置影响编译过程中的优化级别和调试信息的包含情况。以下是CMake提供的…

成功的交易员是如何走向成熟的?

如果不能严格遵守纪律&#xff0c;你可能会犯下10000种错误&#xff1b;但是&#xff0c;如果你能够严格的遵守纪律&#xff0c;你就一个错误都犯不了。 本文为大家讲讲交易员进阶的五个阶段&#xff0c;希望大家能有所收获哦&#xff01;~ 一、掌握技术分析基础 当你刚开始接触…

第二证券:瑞玛精密盘中上演“天地板”走势

瑞玛精密3日开盘即涨停&#xff0c;随后快速跳水&#xff0c;盘中一度触及跌停&#xff0c;上演“天地板”走势。到发稿&#xff0c;该股迫临跌停&#xff0c;成交超4亿元&#xff0c;换手率达18%。此前&#xff0c;该股已接连3日涨停。 公司1日晚间在公告中指出&#xff0c;近…

综合场景搭建、在线分享,这款地理空间数据管理软件功能太多了!

《四维轻云》是一款轻量化的地理空间数据管理云平台&#xff0c;支持地理空间数据的在线管理、编辑及分享。平台具有项目管理、数据上传、场景搭建、发布分享、SDK开发等功能模块&#xff0c;支持多用户在线协作管理&#xff0c;实现了轻量化、便捷化的空间数据应用。 一、发布…

CRLF注入与检测

一、CRLF介绍 CRLF是CR和LF两个字符的拼接&#xff0c;它们 分别代表”回车换行”&#xff08;\r\n&#xff09;。十六进制编码分别为0x0d和0x0a&#xff0c;URL编码为%0D和%0A。CR和LF组合在一起即CRLF命令&#xff0c;它表示键盘上的"Enter"键&#xff0c;许多应用…

ArkTS - @Prop、@Link

一、作用 Prop 装饰器 和Link装饰器都是父组件向子组件传递参数&#xff0c;子组件接收父组件参数的时候用的&#xff0c;变量前边需要加上Prop或者Link装饰器即可。&#xff08;跟前端vue中父组件向子组件传递参数类似&#xff09; // 子组件 Component struct SonCom {Prop…

华为校招开奖,岗位职级薪资汇总(精华面经分享)

华为开奖 近期&#xff0c;不少同学都收到了来自 华为 的冬至礼物。 以目前形式来说&#xff0c;华为仍然属于优先考虑的企业。 我这里收集转发一下由牛客网统计到的各职位薪资情况&#xff1a; 统计表里面的薪资&#xff0c;有些写了具体金额&#xff0c;有些写的则是职级&…

如何在ArcGIS Pro中指定坐标系

在进行制图的时候&#xff0c;为了实现某些特定的效果&#xff0c;需要指定特定的坐标系&#xff0c;但是现有的数据可能不是所需要的坐标系&#xff0c;这时候就需要对现有的数据坐标系进行处理&#xff0c;这里为大家介绍一下ArcGIS Pro中指定坐标系的方法&#xff0c;希望能…

计算机毕业设计——基于SSM+Layui的图书管理系统(附源码)

1&#xff0c;项目背景 国家大力推进信息化建设的大背景下&#xff0c;城市网络基础设施和信息化应用水平得到了极大的提高和提高。特别是在经济发达的沿海地区&#xff0c;商业和服务业也比较发达&#xff0c;公众接受新事物的能力和消费水平也比较高。开展商贸流通产业的信息…