0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RK3568驱动指南|驱动基础进阶篇-进阶5 自定义实现insmod命令实验

北京迅为电子 2024-02-20 14:10 次阅读

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。

迅为RK3568开发板:

wKgZomXUQe2AHEs6AAFHcI66r1k035.png

进阶5 自定义实现insmod命令实验

5.1 实验程序的编写

在本章节将会实现第二种方法实现insmod命令。

5.1.1 驱动程序编写

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

编写完成的helloworld.c代码如下所示。

#include

#include

static int __init helloworld_init(void) //驱动入口函数

{

dump_stack();

return 0;

}

static void __exit helloworld_exit(void) //驱动出口函数

{

printk(KERN_EMERG "helloworld_exit\r\n");

}

module_init(helloworld_init); //注册入口函数

module_exit(helloworld_exit); //注册出口函数

MODULE_LICENSE("GPL v2"); //同意 GPL 开源协议

MODULE_AUTHOR("topeet"); //作者信息

该驱动程序就是最简单的helloworld驱动程序,只是在第6行添加了dump_stack()函数,用来在内核中输出当前调用堆栈信息,在这里使用该函数的目的是验证在app中的init_module系统调用是否生效。

5.1.2 编写测试 APP

本应用程序对应的网盘路径为:iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动例程\52_module02\02_app。

编写完成的应用程序app.c代码如下所示:

#include

#include

#include

#include

#include

#include

#include

#define init_module(mod, len, opts) syscall(__NR_init_module, mod, len, opts)

int main(int argc, char **argv)

{

int fd; // 文件描述符

int ret; // 返回值

struct stat statbuf; // 存储文件信息的结构体

size_t image_size; // 文件大小

char *image; // 文件内容缓冲区

fd = open(argv[1], O_RDONLY | __O_CLOEXEC); // 以只读方式打开文件

if (fd < 0)

{

printf("open error \n"); // 打开文件失败

return -1;

}

fstat(fd, &statbuf); // 获取文件信息

image_size = statbuf.st_size; // 获取文件大小

image = malloc(image_size); // 为文件内容分配内存空间

read(fd, image, image_size); // 读取文件内容到缓冲区

ret = init_module(image, image_size, ""); // 调用系统调用初始化内核模块

if (ret < 0)

{

printf("error \n"); // 内核模块初始化失败

}

else

{

printf("ok \n"); // 内核模块初始化成功

}

free(image); // 释放内存空间

return ret; // 返回结果

}

该应用程序的重点在30行,使用init_module系统调用加载模块到内核。

5.2运行测试

5.2.1 编译驱动程序

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

export ARCH=arm64#设置平台架构

export CROSS_COMPILE=aarch64-linux-gnu-#交叉编译器前缀

obj-m += helloworld.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的内容注释已在上图添加,保存退出之后,来到存放helloworld.c和Makefile文件目录下,如下图(图5-1)所示:

wKgZomXUQfuARt71AACYCaDbMd0958.png

然后使用命令“make”进行驱动的编译,编译完成:

编译完生成platform_led.ko目标文件:

wKgZomXUQg-ADe7sAACyJt9ZejA322.png

至此驱动模块就编译成功了。

5.2.2 编译应用程序

下面进行应用程序编译,因为测试APP是要在开发板上运行的,所以需要aarch64-linux-gnu-gcc来编译,输入以下命令,编译完成以后会生成一个app的可执行程序,如下图(图141-4)所示:

aarch64-linux-gnu-gcc myinsmod.c

下面进行驱动程序的测试。

5.2.3运行测试

本次测试要使用上面编译的helloworld.ko驱动文件和a.out可执行文件,所以需要先将两个要用到的文件拷贝到开发板上。

开发板启动之后,使用以下命令加载helloworld.ko驱动,如下图所示:

./a.out helloworld.ko

dump_stack函数会打印调用的一系列函数,这些函数的具体调用已经在进阶第一章讲解过了,这里的重点为红色框中的倒数第二行,调用了init_module函数加载了helloworld驱动。

然后继续使用以下命令查看驱动的加载情况,打印如下图(141-6)所示:

lsmod

可以看到helloworld驱动成功加载上了,最后可以使用以下命令进行驱动的卸载,

rmmod

wKgZomXUQheAEDEIAAAc4QBhlQw571.png

至此,内核是如何运行KO文件的_insmod实验就完成了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18283

    浏览量

    222166
  • 芯片
    +关注

    关注

    447

    文章

    47795

    浏览量

    409156
  • 驱动
    +关注

    关注

    11

    文章

    1717

    浏览量

    84349
  • RK3568
    +关注

    关注

    4

    文章

    433

    浏览量

    4129
收藏 人收藏

    评论

    相关推荐

    迅为RK3568开发板驱动开发指南-输入子系统

    迅为RK3568开发板驱动开发指南-输入子系统
    的头像 发表于 02-23 15:11 202次阅读
    迅为<b class='flag-5'>RK3568</b>开发板<b class='flag-5'>驱动</b>开发<b class='flag-5'>指南</b>-输入子系统

    RK3568驱动指南驱动基础进阶篇-进阶8 内核运行ko文件总结

    RK3568驱动指南驱动基础进阶篇-进阶8 内核运行ko文件总结
    的头像 发表于 01-31 14:58 501次阅读
    <b class='flag-5'>RK3568</b><b class='flag-5'>驱动</b><b class='flag-5'>指南</b>|<b class='flag-5'>驱动</b>基础<b class='flag-5'>进阶篇</b>-<b class='flag-5'>进阶</b>8 内核运行ko文件总结

    更新 | 持续开源 迅为RK3568驱动指南第十一篇-pinctrl子系统

    《iTOP-RK3568开发板驱动开发指南》更新,本次更新内容对应的是驱动(第十一期_pinctrl子系统-全新升级)视频,后续资料会不断更新,不断完善,帮助用户快速入门,大大提升研发
    发表于 10-18 11:12

    RK3568 EDP接口调试

    RK3568支持多种接口,本文主要介绍通过edp显示接口驱动edp显示屏的具体操作方法以及调试记录。
    的头像 发表于 09-20 09:57 1581次阅读
    <b class='flag-5'>RK3568</b> EDP接口调试

    iTOP-RK3568开发板驱动指南第五-中断

    文档教程更新至第五 第1 驱动基础 第2 字符设备基础 第3 并发与竞争 第4
    发表于 09-04 10:53

    rk3568是什么架构的?

    设计之一,经过优化,可在提供高性能的同时实现低功耗。RK3568有四个Cortex-A55内核,能够以高达2GHz的时钟速度运行。 此外,RK3568还配备了ARM Mali-G52 MP2 GPU,专为
    的头像 发表于 08-15 17:25 1635次阅读

    rk3568有多少引脚?

    rk3568有多少引脚? 首先,让我们来了解一下什么是rk3568rk3568是由瑞芯微推出的一款高性能、低功耗的嵌入式处理器,它是rk3566的升级版本,采用了更加先进的技术和架构
    的头像 发表于 08-15 17:25 1008次阅读

    RK3568与全志H6参数对比

    RK3568与全志H6参数对比 全志是一家知名的处理器设计公司,专注于移动和家庭娱乐电子领域。它提供了许多流行的处理器,如H6、H5、H3等。最近,全志推出了一款名为RK3568的新处理器,那么
    的头像 发表于 08-15 17:25 3949次阅读

    RK35683568J的区别

    RK35683568J的区别 在当前处理器市场中,以小而美形象闻名的瑞克微电子旗下产品RK3568/J也引起了广泛关注,其中RK35683568
    的头像 发表于 08-15 17:25 5091次阅读

    RK3568RK3566的区别

    RK3568RK3566的区别 RK3568RK3566是两种不同的芯片,都是由Rockchip公司推出的。它们都是面向高性能应用市场的芯片,具有相似的性能规格和功能特点。但是在某
    的头像 发表于 08-15 17:25 1.1w次阅读

    rk3568rk3399的区别

    rk3568rk3399的区别 随着人工智能、物联网和5G等技术的不断发展,CPU芯片的需求越来越高。而在所有的CPU芯片中,Rockchip的产品备受瞩目。作为一家集成电路设计厂商
    的头像 发表于 08-15 17:04 2315次阅读

    迅为RK3568开发板保姆级3900页手册_415期视频_426G文档

    10.互斥锁实验基于RK3568 11.并发与竞争总结 第四期-高级字符设备进阶>嵌入式学习之Linux驱动 1.引入I0模型 2.使用等待队列
    发表于 08-11 11:14

    瑞芯微RK3568核心板PET_RK3568_CORE简述

    瑞芯微RK3568核心板PET_RK3568_CORE简述
    的头像 发表于 08-08 11:44 2107次阅读
    瑞芯微<b class='flag-5'>RK3568</b>核心板PET_<b class='flag-5'>RK3568</b>_CORE简述

    瑞芯微RK3568主板开发板PET_RK3568_P01简述

    瑞芯微RK3568主板开发板PET_RK3568_P01简述
    的头像 发表于 08-08 11:41 1769次阅读
    瑞芯微<b class='flag-5'>RK3568</b>主板开发板PET_<b class='flag-5'>RK3568</b>_P01简述

    迅为基于RK3568开发板的嵌入式学习之Linux驱动视频

    迅为基于RK3568开发板的嵌入式学习之Linux驱动视频
    的头像 发表于 05-19 16:30 569次阅读
    迅为基于<b class='flag-5'>RK3568</b>开发板的嵌入式学习之Linux<b class='flag-5'>驱动</b>视频