RK3568驱动指南|驱动基础进阶篇-进阶3 驱动代码使用Makefile的宏

news2024/11/19 12:38:45

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


进阶3 驱动代码使用Makefile的宏

在第一章的开头有这样一段内容,module_init 宏定义在内核源码目录下的“include/linux/module.h”文件中,具体内容如下所示:

#ifndef MODULE
#define module_init(x)  __initcall(x);
#define module_exit(x)  __exitcall(x);
#else /* MODULE */
 ..........
#define module_init(initfn)                 \
    static inline initcall_t __maybe_unused __inittest(void)        \
    { return initfn; }                  \
    int init_module(void) __copy(initfn) __attribute__((alias(#initfn)));
..........
#endif

module_init的具体内容由MODULE宏定义来决定,该宏定义在内核源码的顶层Makefile中,在本节课中将对Makefile中的宏进行进一步探究。

3.1 内核模块的编译选项的变量

在Makefile中KBUILD_CFLAGS_MODULE和EXTRA_CFLAGS都是用于指定编译内核模块时的编译选项的变量,下面是两个变量的详细介绍。

1KBUILD_CFLAGS_MODULE:
KBUILD_CFLAGS_MODULE是一个makefile变量,用于指定编译内核模块时的编译选项。在makefile中,可以使用KBUILD_CFLAGS_MODULE变量来添加特定于模块的编译选项。

通常,通过在makefile中使用KBUILD_CFLAGS_MODULE变量,可以将特定于模块的编译选项添加到模块的编译命令中。例如,可以使用KBUILD_CFLAGS_MODULE添加宏定义、优化选项、警告选项等。

在给KBUILD_CFLAGS_MODULE赋值时,可以使用+=操作符来追加编译选项,以确保不覆盖已有的编译选项。

例如,KBUILD_CFLAGS_MODULE += -DDEBUG表示将-DDEBUG编译选项添加到模块的编译命令中,定义了一个名为DEBUG的宏。

2EXTRA_CFLAGS:
EXTRA_CFLAGS也是一个makefile变量,用于指定额外的编译选项。与KBUILD_CFLAGS_MODULE类似,可以使用EXTRA_CFLAGS变量来添加编译选项。

同样地,在给EXTRA_CFLAGS赋值时,也可以使用+=操作符来追加编译选项,以确保不覆盖已有的编译选项。

例如,EXTRA_CFLAGS += -DDEBUG表示将-DDEBUG编译选项添加到全局的编译命令中,定义了一个名为DEBUG的宏。

注:两个变量的最终效果是相同的,在目前的内核中主要使用KBUILD_CFLAGS_MODULE变量的方式,EXTRA_CFLAGS已经弃之不用了,但仍旧支持这种方法。

3.2 实验程序的编写

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

本实验将通过KBUILD_CFLAGS_MODULE参数来添加特定于模块的编译选项,根据编译选项的内容来打印不同的值。

编写完成的define.c代码如下所示:

#include <linux/module.h>
#include <linux/kernel.h>

static int __init helloworld_init(void) //驱动入口函数
{
#ifndef DEBUG
    printk("helloworld a!\n");
#else
    printk("helloworld b!\n");
#endif
    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"); //作者信息

3.3 运行测试

3.3.1 编译驱动程序

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

KBUILD_CFLAGS_MODULE += -DDEBUG
export ARCH=arm64#设置平台架构
export CROSS_COMPILE=aarch64-linux-gnu-#交叉编译器前缀
obj-m +=define.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的内容注释已在上图添加,保存退出之后,来到存放define.c和Makefile文件目录下,如下图(图3-1)所示:

图 3-1

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

图 3-2

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

图 3-3

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

3.3.2 运行测试

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

insmod define.ko

根据打印信息可以确定DEBUG宏定义已经被定义了,所以才会打印“helloworld b!”,如果删除Makefile文件中的第一行内容之后,重新加载内核就会打印“helloworld a!”如下图(图3-5)所示: 

图 3-5

最后,使用以下命令对该内核进行卸载,如下图所示:

rmmod define.ko

 

图 3-6

至此,驱动代码使用Makefile的宏实验就完成了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1385863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nvidia Jetson AGX Orin使用CAN与底盘通信(ROS C++ 驱动)

文章目录 一、Nvidia Jetson AGX Orin使用CAN通信1.1 CAN使能配置修改GPIO口功能1.2 can收发测试 二、通过CAN协议编写CAN的SocketCan ROS1驱动程序2.1 通讯协议2.2 接收数据节点2.3 发送数据节点2.4 功能包配置 三、ROS2驱动程序 一、Nvidia Jetson AGX Orin使用CAN通信 参考…

linux手动安装 vscode-server

适用场景 很多时候&#xff0c;我们需要在本机&#xff08;比如windows&#xff09;通过remote ssh访问远程服务器&#xff08;一般是ubuntu&#xff09;&#xff0c;但经常出现 vscode 一直连不上远程服务器的情况&#xff0c;看一下 log&#xff1a; 这个log表示远程服务器…

【2023年收入最高的10种编程语言】

在过去的一年时间里&#xff08;2022 年 10 月 1 日到 2023 年 10 月 1 日&#xff09; &#xff0c;DevJobsScanner 分析了来自世界各地的超过 1000 万份开发工作机会&#xff0c;以了解市场以及最热门、薪酬最高的编程语言。值得注意的是&#xff0c;本项研究只关注了来自美国…

【Linux】网络诊断 traceroute命令详解

目录 一、traceroute概述 1.1 traceroute命令简介 1.2 命令格式 1.3 原理 1.4 命令功能 二、使用实例 实例1&#xff1a;traceroute 用法简单、最常用的用法 实例2&#xff1a;跳数设置 实例3&#xff1a;设置探测数据包数量 实例4&#xff1a;显示IP地址&#xff0c…

什么是SAMBA?如何配置?方法来了!

/bin/bash 目录 SAMBA SMB协议 SMB连接过程 samba主要有两个进程 Linux下搭建samba服务器实现文件共享 Linux客户端&#xff1a; Windows客户端&#xff1a; SAMBA samba是SMB文件共享协议的应用软件&#xff0c;可以让Linux系统和Windows系统之间相互共享资源。 在Lin…

3d模型素材亮度和对比度如何调整呢?

1、修改材质参数&#xff1a;打开3ds Max后&#xff0c;选择要调整亮度和对比度的3D模型素材。然后&#xff0c;进入材质编辑器&#xff0c;选择相应的材质球。在材质编辑器中&#xff0c;你可以调整材质的漫反射、反射和高光等参数&#xff0c;这些参数将影响模型的亮度和对比…

K8S的dashboard使用账号密码登录

原文网址&#xff1a;K8S的dashboard使用账号密码登录-CSDN博客 简介 本文介绍K8S的dashboard使用账号密码登录的方法。 ----------------------------------------------------------------------------------------------- 分享Java真实高频面试题&#xff0c;吊打面试官&…

美颜技术对比:如何根据项目选择不同的美颜SDK?

各位开发者应该非常清楚&#xff0c;为了在项目中取得最佳效果&#xff0c;选择合适的美颜SDK至关重要。本篇文章&#xff0c;笔者将通过对比不同美颜SDK的关键特性&#xff0c;帮助开发者根据项目需求做出明智的选择。 一、技术原理对比 不同的美颜SDK可能采用不同的技术原理…

如何使用CFImagehost结合内网穿透搭建私人图床并无公网ip远程访问

[TOC] 推荐一个人工智能学习网站点击跳转 1.前言 图片服务器也称作图床&#xff0c;可以说是互联网存储中最重要的应用之一&#xff0c;不仅网站需要图床提供的外链调取图片&#xff0c;个人或企业也用图床存储各种图片&#xff0c;方便随时访问查看。不过由于图床很不挣钱&a…

大数据开发之Hive(压缩和存储)

第 9 章&#xff1a;压缩和存储 Hive不会强制要求将数据转换成特定的格式才能使用。利用Hadoop的InputFormat API可以从不同数据源读取数据&#xff0c;使用OutputFormat API可以将数据写成不同的格式输出。 对数据进行压缩虽然会增加额外的CPU开销&#xff0c;但是会节约客观…

Qt QTableView和QStandardItemModel包含搜索出现的文本及隐藏顶层节点

前言 使用Qt进行开发时&#xff0c;树结构一般是使用QTreeWidget或使用QTreeViewQStandardItemModel结合。 查找 如果要进行查找树的所有项中&#xff0c;是否包含某文本&#xff0c;就需要遍历。 QTreeWidget查找 以下是使用QTreeWidget进行查找&#xff1a; 首先初始化一…

Python 将列表数据写入文件(txt, csv,excel)

写入txt文件 def text_save(filename, data):#filename为写入txt文件的路径&#xff0c;data为要写入数据列表. file open(filename,a) for i in range(len(data)): s str(data[i]).replace([,).replace(],)#去除[],这两行按数据不同&#xff0c;可以选择 s s.replace(&quo…

全网首发!Yolov8_obb旋转框检测(DOTA1.0数据集)

一、YOLOv8环境搭建 &#xff08;1&#xff09;Pytorch的安装 如果你的环境没有部署请参考本人文章&#xff1a;NLP笔记&#xff08;2&#xff09;——PyTorch的详细安装_安装torchnlp-CSDN博客 &#xff08;2&#xff09;下载最新的Yolov8-obb代码&#xff1a; https://git…

MongoDB - 库、集合、文档(操作 + 演示 + 注意事项)

目录 一、MongoDB 1.1、简介 a&#xff09;MongoDB 是什么&#xff1f;为什么要使用 MongoDB&#xff1f; b&#xff09;应用场景 c&#xff09;MongoDB 这么强大&#xff0c;是不是可以直接代替 MySQL &#xff1f; d&#xff09;MongoDB 中的一些概念 e&#xff09;Do…

如何用Docker部署Nacos服务并结合内网穿透实现公网访问管理界面?

文章目录 1. Docker 运行Nacos2. 本地访问Nacos3. Linux安装Cpolar4. 配置Nacos UI界面公网地址5. 远程访问 Nacos UI界面6. 固定Nacos UI界面公网地址7. 固定地址访问Plik Nacos是阿里开放的一款中间件,也是一款服务注册中心&#xff0c;它主要提供三种功能&#xff1a;持久化…

HCIA的网络地址转换NAT

NAT&#xff1a;网络地址转换 功能&#xff1a; 1.将大量的私有地址转换成公有地址&#xff08;节约IP地址&#xff09; 2.将一个IP地址转换成另一个IP地址&#xff08;公有的&#xff09;&#xff08;增加内部网络设备的安全性&#xff09;&#xff1a;比如有一个内网&#xf…

【数据结构】C语言实现顺序栈

顺序栈的C语言实现 导言一、栈的分类二、顺序栈2.1 顺序栈的数据类型2.2 顺序栈的初始化2.3 栈的判空2.5 顺序栈的进栈2.6 顺序栈的出栈2.7 顺序栈的查找2.8 顺序栈的另一种实现方式2.9 顺序栈的销毁 结语 导言 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff0…

OpenAIOps社区线上宣讲会圆满召开,期待您的加入!

2024年1月12日“OpenAIOps社区”线上宣讲会圆满召开&#xff0c;群体智慧协同创新社区的创立为AIOps领域未来发展注入了活力。OpenAIOps社区是一个AIOps开源社区及创新平台&#xff0c;由中国计算机学会(CCF)、清华大学、南开大学、中科院、国防科大、必示科技等单位共同发起&a…

Java环境变量——Windows和Linux配置jdk

本文我主要是介绍jdk的下载方式和在Windows系统下安装配置jdk11&#xff08;压缩包格式&#xff09;&#xff0c;其他格式的jdk以及Linux操作系统上的jdk安装我后续视情况进行更新… JDK的下载 大家可以去官网Java|Oracle下载对应的资源 继续往下翻&#xff0c;就可以看到Jav…

中国数据库市场的领军黑马——亚信安慧AntDB数据库

自2008年问世以来&#xff0c;亚信科技AntDB数据库一直在中国国产数据库市场中崭露头角&#xff0c;尤其在信创政策的大力支持下&#xff0c;成为这一领域的一匹黑马。经过多次迭代&#xff0c;AntDB已经发展到了7.0版本&#xff0c;为超高强度和密度的业务需求提供了强有力的解…