首页 > 其他分享 >RK3568驱动指南|驱动基础进阶篇-进阶5 自定义实现insmod命令实验

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

时间:2024-02-20 10:56:07浏览次数:28  
标签:进阶 自定义 RK3568 image helloworld init 驱动 include

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

 

迅为RK3568开发板:

 

 

进阶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 <linux/module.h>

#include <linux/kernel.h>

 

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 <stdio.h>

#include <sys/syscall.h>

#include <fcntl.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <stdlib.h>

 

#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)所示:

 

 

 

 

 

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

 

 

 

 

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

 

 

 

 

 

 

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

 

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

 

 

 

 

 

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

标签:进阶,自定义,RK3568,image,helloworld,init,驱动,include
From: https://www.cnblogs.com/topeet/p/18022618

相关文章

  • VK1C21系列:抗干扰段码LCD液晶显示屏驱动芯片,ESD防护能力强适用于水电表,温控表等产品
    概述:VK1C21A/B是一个点阵式存储映射的LCD驱动器,可支持最大128点(32SEGx4COM)的LCD屏,也支持2COM和3COM的LCD屏。单片机可通过3/4个通信脚配置显示参数和发送显示数据,也可通过指令进入省电模式。具备高抗干扰,显示效果好,静电耐压高等优良特性,可替代市面上大部分LCD驱动芯片。 特点:......
  • BEVDet的进阶BEVPoolv2:A Cutting-edge Implementation of BEVDet Toward Deployment
    论文地址:https://arxiv.org/pdf/2211.17111.pdf​arxiv.org/pdf/2211.17111.pdf代码地址:GitHub-HuangJunJie2017/BEVDet:OfficialcodebaseoftheBEVDetseries.​github.com/HuangJunJie2017/BEVDet/tree/dev2.0整体思想:作者从工程优化的角度考虑优化BEVDet,提出了B......
  • (14)lazarus:不安装任何驱动,直接使用csv文件作为数据集
    参考https://blog.csdn.net/bq_cui/article/details/134259372简介在某些数据操作需求特别简单的情况下,我们希望不要安装任何数据库,甚至连一个驱动dll都不要,因为这些驱动dll可能涉及到版本甚至跨平台问题。这种简单需求,可以直接使用csv文件作为数据集来进行增查删改操作。注意,这......
  • 2 - 第一个驱动
    FirstLinuxDeviceDriver原文链接我的博客预备环境在原文链接中给出了ubuntu环境、树莓派环境、比格板环境的搭建指南,可以参考搭建,最好使用推荐的比格板,因为后面会涉及到设备驱动,比格板嵌入式平台方便扩展。第一个Linux设备驱动模块信息证数作者模块描述模块版本......
  • Type information 反射信息 Type指一个对象的种类,某种自定义的class,某个interface或st
    Typeinformation反射信息Type指一个对象的种类,某种自定义的class,某个interface或string等,都是type的一种。 (本文参考了Thinkinginjava中的typeinformation这章)什么是TypeinformationType指一个对象的种类,某种自定义的class,某个interface或string等,都是type的一......
  • 将控件提升为自定义的控件
    一、自定义控件的类型自定义拖动的设计文件(.h、.cpp、.ui)和自定义的自绘文件(.h、.cpp)二、打开提升窗口三、设置自定义类路径四、注意事项1.若自定义控件与提升窗口不在同一路径,且置于pri文件中。则会导致自定义的控件编译报错。"noruletomaketargetxxx......
  • [win_os] chrome浏览器 -- 添加自定义搜索引擎并将其设置为默认搜索引擎(转载裁切
    [win_os]  chrome浏览器 -- 添加自定义搜索引擎并将其设置为默认搜索引擎(转载裁切)    一、必要说明  1、添加搜索引擎【bing】:https://global.bing.com/search?q=%s  2、重点说明【红色部分一点都不能错】:https://global.bing.com/sea......
  • 微信自定义关键词,自动回复,微信公众号文章采集,开发已测试,欢迎大家来测试使用!
    本文主要是通过获取本地的句柄然后用来截取微信的消息,所以可以有效做到 零封号 零丢包 零失误  !!!经测试,可以自定义关键词和回复语(一行一个)可无限添加关键词和对应的回复语!回复时间基本在1秒以内,可以做到检测到关键词存在时即时回复的功能,可以获取到微信公众号文章等信......
  • 03 进阶篇-高阶数据类型BitMaps、HyperLogLogs
    BitMaps介绍BitMaps的基本概念,它是一种通过位来表示数据的方法,能高效地处理大量布尔值。展示BitMaps在用户在线状态、统计等方面的应用示例。介绍相关的命令,如SETBIT,GETBIT,BITCOUNT,BITOP等。BitMaps的基本概念BitMaps,或称为位图,是Redis中用于高效处理大量布尔值的......
  • 这款完全自定义配置的浏览器起始页插件值得你收藏!
    大家好,我是Java陈序员。浏览器是我们上网冲浪的必备工具,每次打开浏览器默认都是先看到起始页。有的浏览器起始页十分简洁美观,而有的则是充满了各种网址导航和广告。今天,給大家介绍一个浏览器起始页配置插件,支持自定义配置。关注微信公众号:【Java陈序员】,获取开源项目分享、A......