瑞芯微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主板
第107章 在自己的总线下注册驱动实验
107.1实验程序的编写
107.1.1 驱动程序编写
本实验对应的网盘路径为:iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动例程\77_driver\module。
我们编写驱动代码,这段代码的作用是注册一个驱动程序,该驱动程序属于名为"mydevice"的总线类型"mybus",并在探测设备时调用"mydriver_probe"函数,移除设备时调用"mydriver_remove"函数。编写完成的driver.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>
extern struct bus_type mybus; // 引入外部定义的总线类型 mybus
int mydriver_remove(struct device *dev){
printk("This is mydriver_remove\n"); // 打印移除设备的调试信息
return 0; // 返回成功移除设备
};
int mydriver_probe(struct device *dev){
printk("This is mydriver_probe\n"); // 打印探测设备的调试信息
return 0; // 返回成功探测设备
};
struct device_driver mydriver = {
.name = "mydevice", // 驱动程序的名称
.bus = &mybus, // 驱动程序所属的总线类型
.probe = mydriver_probe, // 驱动程序的探测函数
.remove = mydriver_remove, // 驱动程序的移除函数
};
// 模块的初始化函数
static int mydriver_init(void)
{
int ret;
ret = driver_register(&mydriver); // 注册驱动程序
return ret; // 返回注册结果
}
// 模块退出函数
static void mydriver_exit(void)
{
driver_unregister(&mydriver); // 注销驱动程序
}
module_init(mydriver_init); // 指定模块的初始化函数
module_exit(mydriver_exit); // 指定模块的退出函数
MODULE_LICENSE("GPL"); // 模块使用的许可证
MODULE_AUTHOR("topeet"); // 模块的作者
107.3 运行测试
107.3.1 编译驱动程序
在上一小节中的driver.c代码同一目录下创建 Makefile 文件,Makefile 文件内容如下所示:
export ARCH=arm64#设置平台架构
export CROSS_COMPILE=aarch64-linux-gnu-#交叉编译器前缀
obj-m += driver.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的内容注释已在上图添加,保存退出之后,来到存放driver.c和Makefile文件目录下,如下图(图107-1)所示:
图 107-1
然后使用命令“make”进行驱动的编译,编译完成如下图(图107-2)所示:
图 107-2
编译完生成driver.ko目标文件,如下图(图107-3)所示:
图 107-3
至此驱动模块就编译成功了,接下来进行测试。
107.3.2 运行测试
开发板启动之后,使用以下命令进行bus.ko驱动模块的加载,如下图(图107-4)所示:
insmod bus.ko
图107-5
然后加载driver.ko驱动模块,如下图所示
图107-6
驱动加载之后,我们进入/sys/devices目录下,如下图所示,有注册生成的设备。
图107-7
我们进入到/sys/bus/mybus/devices目录下,如下图所示,在总线下注册的设备为mydevice。然后进入到/sys/bus/mybus/driver目录下,如下图所示,在总线下注册的驱动为mydevice
图107-8
最后可以使用以下命令进行驱动的卸载,如下所示:
rmmod device
rmmod driver
rmmod bus
至此,在总线下注册驱动实验就完成了。