RK3568驱动指南|第九篇 设备模型-第100章 在总线目录下创建属性文件实验

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


第100章 在总线目录下创建属性文件实验

在上个章节中,我们成功注册了一个自定义总线,并为其创建了必要的数据结构和函数。现在,在本章节中,我们将继续深入了解总线的概念,并在总线目录下创建属性文件以扩展其功能。通过创建属性文件,我们可以为总线添加额外的信息和控制选项,以便与设备和驱动进行交互。这些属性文件可以用于读取总线的状态、设置参数或执行其他相关操作。让我们开始吧!

100.1 总线下创建属性API函数

bus_create_file() 函数用于在总线的 sysfs 目录下创建一个属性文件。

int bus_create_file(struct bus_type *bus, struct kobject *kobj, const struct attribute *attr);

参数说明:

  • bus:指向总线类型结构体 struct bus_type的指针,表示要创建属性文件的总线。
  • kobj:指向内核对象 struct kobject的指针,表示要在其下创建属性文件的内核对象。
  • attr:指向属性 struct attribute的指针,表示要创建的属性文件的属性。
  • 返回值:成功时返回 0,否则返回负数错误代码。

在调用 bus_create_file()函数之前,需要先定义好属性结构体 struct attribute,并将其相关字段填充好。通常,属性结构体会包含以下字段:

.name:属性的名称。

.mode:属性的访问权限。

示例用法:

struct bus_attribute mybus_attr = {.attr = {.name = "value",.mode = 0664,},.show = mybus_show,
};ret = bus_create_file(&mybus, &mydevice.kobj, &mybus_attr.attr);

上述示例代码创建了一个名为 "value" 的属性文件,并指定了访问权限为 0664。在创建属性文件时,还可以指定其他属性的回调函数,如 .show、.store等,以实现对属性值的读取和写入操作。

请注意,在使用 bus_create_file() 函数之前,需要确保总线对象和内核对象已正确初始化和注册。

接下来我们开始编写驱动文件,进行实验。

100.2实验程序的编写

100.2.1 驱动程序编写

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

我们编写驱动代码,定义了一个名为 "mybus" 的总线,并实现了总线的匹配回调函数 mybus_match 和设备探测回调函数 mybus_probe。同时,还定义了一个名为 "value" 的属性文件,并实现了属性的显示回调函数 mybus_show。编写完成的bus.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/device.h>
#include <linux/sysfs.h>int mybus_match(struct device *dev, struct device_driver *drv)
{// 检查设备名称和驱动程序名称是否匹配return (strcmp(dev_name(dev), drv->name) == 0);
};int mybus_probe(struct device *dev)
{struct device_driver *drv = dev->driver;if (drv->probe)drv->probe(dev);return 0;
};struct bus_type mybus = {.name = "mybus",                 // 总线的名称.match = mybus_match,            // 设备和驱动程序匹配的回调函数.probe = mybus_probe,            // 设备探测的回调函数
};ssize_t mybus_show(struct bus_type *bus, char *buf)
{// 在 sysfs 中显示总线的值return sprintf(buf, "%s\n", "mybus_show");
};struct bus_attribute mybus_attr = {.attr = {.name = "value",             // 属性的名称.mode = 0664,                // 属性的访问权限},.show = mybus_show,               // 属性的 show 回调函数
};// 模块的初始化函数
static int bus_init(void)
{int ret;ret = bus_register(&mybus);       // 注册总线ret = bus_create_file(&mybus, &mybus_attr);  // 在 sysfs 中创建属性文件return 0;
}// 模块退出函数
static void bus_exit(void)
{bus_remove_file(&mybus, &mybus_attr);  // 从 sysfs 中移除属性文件bus_unregister(&mybus);                // 取消注册总线
}module_init(bus_init);                    // 指定模块的初始化函数
module_exit(bus_exit);                    // 指定模块的退出函数MODULE_LICENSE("GPL");                    // 模块使用的许可证
MODULE_AUTHOR("topeet");                  // 模块的作者

100.3 运行测试

100.3.1 编译驱动程序

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

export ARCH=arm64#设置平台架构
export CROSS_COMPILE=aarch64-linux-gnu-#交叉编译器前缀
obj-m += bus.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的内容注释已在上图添加,保存退出之后,来到存放bus.c和Makefile文件目录下,如下图(图100-1)所示:

图 100-1

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

图 100-2

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

图 100-4

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

100.3.2 运行测试

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

insmod bus.ko

图100-5

驱动加载之后,我们进入/sys/bus目录下,可以看到创建生成的总线mybus,如下图所示,我们进到mybus目录下,可以看到创建属性文件value。

图100-6

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

rmmod bus

 

图 100-7

至此,在总线目录下创建属性文件实验就完成了。


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

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

相关文章

如何利用ChatGPT处理文本、论文写作、AI绘图、文献查阅、PPT编辑、编程等

无论是进行代码生成、错误调试还是解决编程难题&#xff0c;ChatGPT都能为您提供实用且高质量的建议和指导&#xff0c;提高编程效率和准确性。此外&#xff0c;ChatGPT是一位出色的合作伙伴&#xff0c;可以为您提供论文写作的支持。它可以为您提供论文结构指导、段落重组建议…

低代码技术:颠覆数据孤岛的技术利器

在当今数据驱动的世界中&#xff0c;数据的价值无可忽视。然而&#xff0c;很多组织面临一个普遍的问题&#xff0c;即数据孤岛。数据孤岛指的是不同部门或系统之间无法有效共享和集成数据的情况。这限制了组织在数据驱动的决策和创新方面的能力。然而&#xff0c;低代码平台的…

关于HarmonyOs的参数传递UI刷新以及List,Grid嵌套数据传递,ui刷新问题总结

最近在学习开发过程中遇见一系列的参数传递以及ui刷新问题&#xff0c;在这里做个总结分享。 以下是在开发过程中遇见的问题&#xff1a; 1.页面与子组件之间的参数传递与UI刷新 2.Builder自定义内部子组件的参数传递与UI刷新 3.Grid与List item发生变化Ui刷新问题 4.List…

陈述式资源管理(2)

命令行。声明式资源管理 三种常见的项目发布方式&#xff1a; 1、蓝绿发布 2、金丝雀发布&#xff08;灰度发布&#xff09; 3、滚动发布 应用程序升级&#xff0c;最大困难就是新旧业务之间的切换。立项 --- 定稿 --- 需求发布 --- 开发 --- 测试 --- 发布。测试之后上线…

docker搭建Dinky —— 筑梦之路

简介 Dinky 是一个 开箱即用 、易扩展 &#xff0c;以 Apache Flink 为基础&#xff0c;连接 OLAP 和 数据湖 等众多框架的 一站式 实时计算平台&#xff0c;致力于 流批一体 和 湖仓一体 的探索与实践。 主要功能 其主要功能如下&#xff1a; 沉浸式 FlinkSQL 数据开发&#x…

【感知机】感知机(perceptron)学习算法的原始形式

感知机( perceptron )是二类分类的线性分类模型&#xff0c;其输入为实例的特征向量&#xff0c;输出为实例的类别&#xff0c;取1 和-1二值。感知机对应输入空间(特征空间)中将实例划分为正负两类的分离超平面&#xff0c;是一种判别模型。感知机是神经网络与支持向量机的基础…

C#_var

文章目录 一、前言二、隐式类型的局部变量2.1 var和匿名类型2.2 批注 三、总结 一、前言 C#中有一个 var 类型&#xff0c;不管什么类型的变量&#xff0c;都可以用它接收&#xff0c;实属懒人最爱了。 我没有了解过它的底层&#xff0c;甚至没看过它的说明文档&#xff0c;也…

大创项目推荐 深度学习动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

Windows10系统打开管理员命令提示符的六种

在Windows10系统的运行过程中&#xff0c;我们常常需要打开管理员命令提示符&#xff0c;打开Windows10系统管理员命令提示符的方法很多&#xff0c;下面总结一下打开Windows10系统管理员命令提示符的方法。 工具/原料 硬件&#xff1a;电脑 操作系统&#xff1a;Windows10 …

.NET国产化改造探索(一)、VMware安装银河麒麟

随着时代的发展以及近年来信创工作和…废话就不多说了&#xff0c;这个系列就是为.NET遇到国产化需求的一个闭坑系列。接下来&#xff0c;看操作。 安装银河麒麟 麒麟系统分银河麒麟和中标麒麟&#xff0c;我选择的是银河麒麟服务器版的&#xff0c;关于如何下载&#xff0c;…

传统企业数字化转型怎么做?建议掌握这“5要素,7步骤,12维度”

关于“传统企业数字化转型”的文章&#xff0c;我看过很多&#xff0c;但大多数的内容都比较虚幻&#xff0c;无法落地执行~ 基于此&#xff0c;下面我来给出具体的一些建议&#xff0c;供大家参考&#xff01; 一、传统企业数字化转型5要素 人、数据、洞察力、行动和结果。这…

Spring ApplicationEvent事件处理

Spring的事件 ApplicationEvent以及Listener是Spring为我们提供的一个事件监听、订阅的实现&#xff0c;内部实现原理是观察者设计模式&#xff0c;设计初衷也是为了系统业务逻辑之间的解耦&#xff0c;提高可扩展性以及可维护性。 ApplicationEvent就是Spring的事件接口Applic…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机掉线自动重连(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机掉线自动重连&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的掉线自动重连的技术背景通过PnP事件函数检查Baumer工业相机是否掉线在NEOAPI SDK里实现相机掉线重连方法&#xff1a;工业相机掉线重连测试演示图…

以角色为基础的软件开发团队建设

角色抽象作为一种载体&#xff0c;可以很好地进行软件工程知识体系和企业知识地图的组织&#xff0c;满足企业知识体系持续改进的需要&#xff0c;因此角色团队组建和建设也可以作为软件工程实施方法之一。 软件开发项目立项时&#xff0c;重要工作之一就是开发团队的组建&…

AI计算,为什么要用GPU?

今天这篇文章&#xff0c;我们继续来聊聊芯片。 在之前的文章里&#xff0c;小枣君说过&#xff0c;行业里通常会把半导体芯片分为数字芯片和模拟芯片。其中&#xff0c;数字芯片的市场规模占比较大&#xff0c;达到70%左右。 数字芯片&#xff0c;还可以进一步细分&#xff0…

ECharts配置个性化图表:圆环、立体柱状图

官网调试地址&#xff1a;调试 效果图&#xff1a; 配置&#xff1a; option {color: [#29BEFF, #A2DC00, #FFC400, #FF7F5C, #CA99FC],// 提示窗tooltip: {trigger: item,show: false},// 图例legend: {top: 5%,left: center,show: false},// 数据series: [{name: Access …

LM393典型应用Multisim仿真设计

一、LM393简介: LM393是由两个独立的、高精度电压比较器组成的IC。LM393失调电压低,最大为2.0mv。可以是单电源供电,也可以是双电源供电,供电电压范围比较宽,电源功耗比较低。 LM393主要应用于限幅器、简单的模数转换器、脉冲发生器、方波发生器、延时发生器、宽频…

微同城生活源码系统:专业搭建本地生活服务平台 附带完整的安装部署教程

随着移动互联网的普及&#xff0c;人们越来越依赖手机进行日常生活中的各种活动&#xff0c;包括购物、餐饮、娱乐等。而传统的本地生活服务平台往往存在着功能单一、用户体验差等问题&#xff0c;无法满足用户日益增长的需求。因此&#xff0c;开发一款功能强大、易用性强的本…

css文本溢出处理——单行、多行

日常开发中&#xff0c;经常会遇到需要展示的文本过长&#xff0c;这种情况下&#xff0c;为了提高用户的使用体验&#xff0c;最常见的处理方式就是把溢出的文本显示成省略号。 处理文本的溢出的方式&#xff1a;1&#xff09;单行文本溢出&#xff1b; 2&#xff09;多行文本…

TikTok未来十年:平台发展的前瞻性思考

TikTok&#xff0c;作为全球短视频平台的领军者&#xff0c;已经在数字时代崭露头角。然而&#xff0c;随着技术的飞速发展和用户需求的变化&#xff0c;TikTok未来十年的发展前景充满了挑战和机遇。本文将深入探讨TikTok未来的发展方向&#xff0c;从技术、内容、社交和商业等…