RK3568驱动指南|第九篇 设备模型-第94章 引入并完善kobject_type结构体

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


第94章 引入并完善kobject_type结构体

在上个章节中,我们掌握了kobject_init_and_add()函数需要手动分配内存,并通过 kobject_init()函数对分配的内存进行初始化。此时需要自己实现 ktype结构体。那么ktype结构体如何实现呢,本章节将进一步学习,以实验的方式带着大家进行操作。

94.1实验程序的编写

94.1.1 驱动程序编写

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

我们编写驱动代码,该代码实现了一个简单的内核模块,创建了一个自定义的 kobject 对象,并定义了相应的初始化和释放函数。编写完成的ktype.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>

// 定义了kobject指针变量:mykobject03
struct kobject *mykobject03;

// 定义kobject的释放函数
static void dynamic_kobj_release(struct kobject *kobj)
{
    printk("kobject: (%p): %s\n", kobj, __func__);
    kfree(kobj);
}

// 定义了一个kobj_type结构体变量mytype,用于描述kobject的类型。
struct kobj_type mytype = {
    .release = dynamic_kobj_release,
};

// 模块的初始化函数
static int mykobj_init(void)
{
    int ret;

    // 创建kobject的第二种方法
    // 1 使用kzalloc函数分配了一个kobject对象的内存
    mykobject03 = kzalloc(sizeof(struct kobject), GFP_KERNEL);
    // 2 初始化并添加到内核中,名为"mykobject03"。
    ret = kobject_init_and_add(mykobject03, &mytype, NULL, "%s", "mykobject03");

    return 0;
}

// 模块退出函数
static void mykobj_exit(void)
{
    kobject_put(mykobject03);
}

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

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

94.2 运行测试

94.2.1 编译驱动程序

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

export ARCH=arm64#设置平台架构
export CROSS_COMPILE=aarch64-linux-gnu-#交叉编译器前缀
obj-m += ktype.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操作

图 94-1

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

图 94-2

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

图 94-3

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

94.2.2 运行测试

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

insmod ktype.ko

图94-4 

驱动加载之后,最后可以使用以下命令进行驱动的卸载,如上图(图94-4)所示,dynamic_kobj_release函数被成功执行。

rmmod ktype

至此,引入并完善kobject_type结构体实验就完成了。 


  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值