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

news2024/9/25 7:25:46

瑞芯微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.coloradmin.cn/o/1352834.html

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

相关文章

SSM共享汽车租赁平台----计算机毕业设计

项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,修改管理员信息,用户信息管理,管理新闻公告,汽车品牌信息管理,城市信息管理,租赁点信息管理,共享汽车信息管理,汽车订单信…

openGauss学习笔记-185 openGauss 数据库运维-升级-提交升级/升级版本回退/异常处理

文章目录 openGauss学习笔记-185 openGauss 数据库运维-升级-提交升级/升级版本回退/异常处理185.1 提交升级操作步骤 185.2 升级版本回滚操作步骤 185.3 异常处理升级问题FAQ openGauss学习笔记-185 openGauss 数据库运维-升级-提交升级/升级版本回退/异常处理 185.1 提交升级…

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-7Lead Compensator超前补偿器(调节根轨迹)

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-7Lead Compensator超前补偿器&#xff08;调节根轨迹&#xff09; 1. Plot Rootlocus 绘制根轨迹2. System Performance 系统表现3. 改善/加快收敛速度4. 超前补偿器 Lead Compe…

C++ DAY6 作业

1.用模板类写顺序表 #include <iostream>using namespace std;#define MAXSIZE 10 template <typename T> class Arr {T *data NULL;int len 0; public://构造函数Arr():data(new T){}Arr(T a,int len):data(new T(a)),len(len){}//析构函数~Arr(){delete data;}…

(一)CarPlay集成开发之概述与环境篇

系列文章目录 第一章 CarPlay集成开发之概述与环境篇 文章目录 系列文章目录概述开发环境依赖项总结 概述 CarPlay是由苹果公司开发的一款集成在iOS系统中&#xff0c;用于运行在已完成对接该系统的汽车中控台&#xff0c;仪表盘上的车载系统&#xff0c;该系统通过USB或者WI…

智能求职助手 - ChatGPT 与 RPA 技术的完美结合

随着全球互联网行业的快速发展&#xff0c;互联网求职市场也变得越来越竞争激烈。在互联网求职寒冬的背景下&#xff0c;一位热心的开发者创造了一个令人惊叹的开源项目&#xff0c;结合了 ChatGPT 和 RPA 技术&#xff0c;为求职者提供了一键自动投递简历的便捷解决方案。 项…

电路板设计很难吗?十分钟带你起飞

1、写在前面 其实在20年前&#xff0c;学习资源相对都固化在大学校园里&#xff0c;差一点的学校&#xff0c;学生们想学点真本事&#xff0c;是非常困难的&#xff0c;还好我读书的时候&#xff0c;互联网开始起步腾飞&#xff0c;优酷&#xff0c;土豆兴起&#xff0c;有人开…

【LeetCode:69. x 的平方根 | 二分】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

《深入理解JAVA虚拟机笔记》对象的创建和访问、对象头

对象的创建 当 Java 虚拟机遇到一条字节码 new 指令时&#xff0c;首先将去检查这个指令的参数是否能做常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有&#xff0c;那必须先执行相应的类加载过程。 在类加载…

xshell登录不上虚拟机了

电脑重启后连不上本地虚机了 1、关闭防火墙 2 虚拟机ping得到主机&#xff0c;而主机ping不到虚拟机的解决办法 原因&#xff1a;可能是主机的网络适配器没有调好 首先&#xff0c;找到虚拟机的网络配置器 根据虚拟机的IP信息修改主机虚拟适配器VMnet8 修改ip使得和虚拟机连…

【力扣100】39.组合总和

添加链接描述 class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:def backtrack(path,target,res,index):if target0:res.append(path[:])returnif target<0:return for i in range(index,len(candidates)):if target&g…

借助libcurl实现ftp文件上传,断点续传demo梳理。

公司业务&#xff0c;需要实现一个ftp大文件上传的功能&#xff0c;简单搭建一个ftp服务器&#xff0c;首先研究demo&#xff0c;以及断点上传的功能。 1&#xff1a;首先了解文件上传相关协议&#xff0c;ftp&#xff0c;sftp或者基于http&#xff0c;其他自己实现等。 2&am…

图像分割-漫水填充法 floodFill

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

最新Java详细安装教程

Java详细安装教程 JDK与JRE区别java官网链接java安装配置环境验证java安装成功 文章参加https://zhuanlan.zhihu.com/p/612846156 各位小伙伴想要博客相关资料的话关注公众号&#xff1a;chuanyeTry即可领取相关资料&#xff01; JDK与JRE区别 对于安装Java的新手&#xff0c;…

Hive09_函数

HIVE函数 系统内置函数 1&#xff09;查看系统自带的函数 hive> show functions;2&#xff09;显示自带的函数的用法 hive> desc function upper;3&#xff09;详细显示自带的函数的用法 hive> desc function extended upper;hive函数分类 1、UDF&#xff1a;用…

理解 RPC 与 Protobuf:完整指南

一、Protobuf 数据格式简析 Protobuf 是什么&#xff1f; 在数据密集型应用领域&#xff0c;Google 开发的 Protobuf 作为一种高效数据编码方式而广受欢迎。它胜任于 JSON 及 XML 对比&#xff0c;不仅在体积和速度上表现出色&#xff0c;而且其结构化方式优化了网络传输中的…

组织权限收集表

在组织角色收集过程中&#xff0c;主要分为两个重要环节&#xff1a;用户信息的收集和角色定义。其中&#xff0c;用户信息的收集相对简单&#xff0c;而角色定义则更为复杂。 在我们的项目中&#xff0c;权限涉及页面权限、按钮权限和数据权。为了确保每个角色具备适当的权限…

数字信号处理期末复习——计算小题(二)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

SQL 在已有表中修改列名的方法

文章目录 1. MySQL2. SQL Server3. Oracle / PostgreSQL Question&#xff1a; 假设有一张表 StudentInfo&#xff0c;表中有一个列名是 Student_Name &#xff0c;想要把这个列名改成 StudentName 应该如何操作&#xff1f; 建表语句如下&#xff1a; --建表 if object_id(S…

零知识证明(zk-SNARK)- groth16(一)

全称为 Zero-Knowledge Succinct Non-Interactive Argument of Knowledge&#xff0c;简洁非交互式零知识证明&#xff0c;简洁性使得运行该协议时&#xff0c;即便 statement 非常大&#xff0c;它的 proof 大小也仅有几百个bytes&#xff0c;并且验证一个 proof 的时间可以达…