RK3568驱动指南|第九篇 设备模型-第99章 注册一个自己的总线实验

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


第99章 注册一个自己的总线实验

在设备模型中,包含总线、设备、驱动和类四个概念。在前面的章节中,我们学习了设备模型的基本框架kobject和kset。而在本章节中,我们将学习设备模型中总线的概念。并进行实验——注册一个自己的总线。

99.1 总线注册API函数

我们进入开发板的/sys/bus目录下,/sys/bus 是 Linux 系统中的一个目录,用于表示总线(bus)子系统的根目录。如果我们自己注册一个总线,会在此目录下显示。

RK3568驱动指南|第九篇 设备模型-第99章 注册一个自己的总线实验_第1张图片

图 99-1

bus_register是一个函数,用于将一个自定义总线注册到 Linux 内核中。

函数原型如下:

int bus_register(struct bus_type *bus);

参数 bus 是一个指向 struct bus_type 结构体的指针,表示要注册的自定义总线。关于bus_type结构体的介绍请参阅88.2.1小节

函数返回一个整数值,表示注册操作的结果。通常情况下,返回值为 0 表示注册成功,负值表示注册失败。

bus_unregister 是一个函数,用于取消注册一个已经注册的自定义总线。

函数原型如下:

void bus_unregister(struct bus_type *bus);

参数 bus 是一个指向 struct bus_type 结构体的指针,表示要取消注册的自定义总线。该函数没有返回值。

接下来,我们使用上述的API函数编写驱动代码进行实验。

99.2实验程序的编写

99.2.1 驱动程序编写

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

我们编写驱动代码,驱动中定义了一个名为 "mybus" 的自定义总线,并指定了该总线的匹配回调函数 mybus_match 和探测回调函数 mybus_probe。编写完成的bus.c代码如下所示:

#include 
#include 
#include 
#include 
#include 
#include 
#include 

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,            // 设备探测的回调函数
};

// 模块的初始化函数
static int bus_init(void)
{
    int ret;
    ret = bus_register(&mybus);       // 注册总线
    return 0;
}

// 模块退出函数
static void bus_exit(void)
{
    bus_unregister(&mybus);           // 取消注册总线
}

module_init(bus_init);                // 指定模块的初始化函数
module_exit(bus_exit);                // 指定模块的退出函数

MODULE_LICENSE("GPL");                // 模块使用的许可证
MODULE_AUTHOR("topeet");              // 模块的作者

99.3 运行测试

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

图99-2

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

RK3568驱动指南|第九篇 设备模型-第99章 注册一个自己的总线实验_第2张图片

图 99-3

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

图 99-4

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

99.3.2 运行测试

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

insmod bus.ko

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

RK3568驱动指南|第九篇 设备模型-第99章 注册一个自己的总线实验_第3张图片

图99-3

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

rmmod bus

图 99-4

至此,注册一个自己的总线实验就完成了


RK3568驱动指南|第九篇 设备模型-第99章 注册一个自己的总线实验_第4张图片 

你可能感兴趣的:(RK3568,驱动开发,linux)