【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十八章 驱动模块编译进内核

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT、4G模块、CAN、RS485等接口一应俱全。H264、VP8视频硬编码,H.264、H.265、VP8、VP9视频硬解码,并提供相关历程,支持8路PDM接口、5路SAI接口、2路Speaker。系统支持Android9.0(支持获取root限)Linux4.14.78+Qt5.10.1、Yocto、Ubuntu20、Debian9系统。适用于智能充电桩,物联网,工业控制,医疗,智能交通等,可用于任何通用工业和物联网应用、

【公众号】迅为电子

【粉丝群】258811263(加群获取驱动文档+例程)


第三十八章 动模块编译进内核

本章导读

由于Linux驱动编程的本质属于Linux内核编程,因此我们有必要熟悉Linux内核的编译及加载。Linux设备驱动会以直接编译到内核源码中,因此,学会linux内核的编译及加载是学习Linux设备驱动的先决条件。

38.1章节讲解了如何图形化配置内核

38.2章节讲解了以helloworld驱动为例,将其编译进内核源码。

本章内容对应视频讲解链接(在线观看):

make menuconfig图形化配置  https://www.bilibili.com/video/BV1Vy4y1B7ta?p=7

Linux下把驱动编译进内核  https://www.bilibili.com/video/BV1Vy4y1B7ta?p=8

38.1 图形化配置内核

Linux 内核可以通过输入“make menuconfig”来打开图形化配置界面, menuconfig是一套图形化的配置工具,需要 ncurses 库支持。 ncurses 库提供了一系列的 API 函数供调用者生成基于文本的图形界面,因此需要先在 Ubuntu 中安装 ncurses 库,命令如下:

sudo apt-get install build-essential

sudo apt-get install libncurses5-dev

Linux驱动开发者需要牢固地掌握Linux内核的编译方法,为嵌入式系统构建可运行的Linux操作系统

映像。在编译内核时,需要配置内核,可以使用下面命令中的一个:

#make config (基于文本的最为传统的配置界面,不推荐使用)

#make menuconfig (基于文本菜单的配置界面)

#make xconfig (要求 QT 被安装)

#make gconfig (要求 GTK+ 被安装)

在这四种方式中,最推荐的是make menuconfig,它不依赖于QT或GTK+,且非常直观。在i.mx8mm内核源码运行如下命令,即可打开这个界面。特别要注意的是,因为之前编译源码设置了环境变量,所以在内核makemenuconfig的时候要新打开一个会话窗口,再输入以下命令:

make ARCH=arm64 menuconfig

打开后界面如下图所示,在这个界面我们可以配置一些驱动的选项,比如说对系统进行裁剪。 

内核配置包含的条目相当多,arch/arm64/configs/xxx_defconfig文件包含了许多电路板的默认配置,默认配置文件相当于这个饭店的特色菜。只需要运行以下命令就可以为xxx开发板配置内核。

make ARCH=arm64 xxx_defconfig

如下图所示,.config - Linux/arm64 4.14.78 Kernel Configuration说明已经配置好为arm64平台。

 

Linux内核的配置系统由以下3个部分组成。

  • Makefile:分布在Linux内核源代码中,定义Linux内核的编译规则。
  • 配置文件(Kconfig):给用户提供配置选择的功能。
  • 配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供

字符界面和图形界面)。这些配置工具使用的都是脚本语言,如用Tcl/TK、Perl等。

使用make menuconfig等命令后,会生成一个.config配置文件,记录哪些部分被编译入内核、哪些部分被编译为内核模块。当我们make menuconfig保存退出以后,Linux会将所有的配置选项以宏定义的形式保存在include/generated/下面的autoconf.h里面。

menuconfig的使用方式,主要是:

上下键

选择不同的行,即移动到不同的(每一行的)选项上

空格键

用于在选择该选项,取消选择该选项之间来回切换

选择该(行所在的)选项

则对应的该选项前面就变成了 [ * ],表示被选中了。

把驱动编译编译成模块,用M来表示。

把驱动编译到内核里面,用*来表示。

取消该选项

则对应的该选项变成了只有一个中括号,里面是空的,即:[ ]

左右键

用于在Select/Exit/Help之前切换

回车键

左右键切换到了某个键上,此时回车键,就执行相应的动作

Select

此时一般都是所在(的行的)选项,后面有三个短横线加上一个右箭头,即 —>,表示此项下面还有子选项,即进入子菜单

Exit

直接退出当前的配置。所以,当你更改了一些配置,但是又没有去保存,此时一般都会询问你是否要保存当前(已修改后的最新的)配置,然后再退出。

Help

针对你当前所在某个(行的)选项,查看其帮助信息。一般来说,其帮助信息,都包含针对该选项的很详细的解释。换句话说:如果你对某个选项的功能,不是很清楚,那么就应该认真仔细的去看看其Help,往往都会找到详细解释,以便你更加了解此配置的含义。另外一般也会写出,此选项所对应的宏。该宏,就是写出到配置文件中的那个宏,对于写makefile的人来说,往往也是利用此相关的宏,在makefile中,实现对应的不同的控制。

快捷键快速跳转到对应的选项

menuconfig中的每一行的选项,都有一个用特殊颜色标记出来的字母,很明显,此字母,就是该行的快捷字母。注意:此类快捷字母,一般都是大写的,且是大小写区分的。

/ 键

输入“/”即可弹出搜索界面,然后输入我们想要搜索的内容即可。

 在Linux内核中增加驱动程序需要完成以下3项工作。

  • 将编写的源代码复制到Linux内核源代码的相应目录中。
  • 在目录的Kconfig文件中增加关于新源代码对应项目的编译配置选项。
  • 在目录的Makefile文件中增加对新源代码的编译条目。

Makefile 里面是编译规则,告诉我们在make的时候要怎么编译,相当于怎么做饭。

Kconfig 内核配置的选项 ,相当于我们去饭店吃饭时服务员给的菜单

.config  配置完内核以后生成的配置选项,相当于我们点完的菜。

38.2 内核中编译驱动

本章节我们来学习如何把驱动编译进内核,第38.1章已经学习了make menuconfig的图形化配置,那么有关menuconfig的几个配置文件之间的关系已经讲清楚了,本章节我们来讲解38.3章节helloworld驱动编译到内核,之前37.1章节是编译helloworld为模块,然后insmod加载进去模块。那么我们怎么把驱动编译到内核里面呢?通过38.1章节make menuconfig的学习,我们有了一个基础的认识,在Linux内核中增加驱动程序需要驱动源码,Kconfig和Makefile文件。Kconfig相当于菜单,我们要把驱动编译到内核,要先改Kconfig,然后我们要把驱动添加到菜单里面,添加好了之后,我们才可以通过make menuconfig图形化配置来修改我们的.config。

首先我们来看Kconfig里面的一个例子

source “drivers/redled/Kconfig”

config LED__4412

tristate “Led Support for GPIO Led”

depends on LEDS_CLASS

help

This option enable support for led

1.source “drivers/redled/Kconfig”,他会包含drivers/redled/这个路径下的驱动文件,方便我们对菜单进行管理

2.config LED__4412配置选项的名称

3.tristate 表示的驱动的状态,三种状态是把驱动编译成模块,把驱动编译到内核,不编译。与之对应的还有bool 分别是编译到内核,不编译

4 “Led Support for GPIO Led”make menuconfig显示的名字

5  A depends on B表示只有在选择B的时候才可以选择A

比如我想直接去掉LED相关的驱动,我们直接改.config文件可以吗?可以,但是不推荐。如果有依赖的话,直接修改.config是不成功的。

6.select 反向依赖,该选项被选中时,后面的定义也会被选中。

7.help This option enable support for led   帮助信息

我们先利用一个简单的实例,引导读者对其建立对具初步的认识。以i.MX8MM开发板为例,我们把36.3章节的helloworld编译进内核,我们进入到i.MX8MM开发板的内核目录下,(这里的路径大家依据自己源码所在ubuntu实际路径为准),如下图所示:

 

输入以下命令进入到drivers/char目录下

cd drivers/char

然后输入以下命令建立hello文件夹,并进入hello文件夹。

mkdir hello

cd hello

 

将我们上次编写的驱动文件helloworld.c拷贝到刚刚创建的文件夹下面,然后写一个Kconfig文件。我们输入以下命令创建Kconfig文件

touch Kconfig

我们输入“vim Kconfig”命令编辑Kconfig,Kconfig写入以下内容:

config HELLO

tristate "hello world"

help

hello hello

我们输入以下命令创建Makefile文件

touch Makefile

我们输入“vim Makefile”,Makefile写入以下内容

obj-$(CONFIG_HELLO)+=helloworld.o

驱动文件,Kconfig,Makefile准备完毕。下一步我们要把它包含进去,我们修改上一级目录的Makefile和Kconfig,也就是drivers/char目录下,如下图所示:

Makefile添加如下图所示的内容

obj-y                           += hello/

 

Kconfig添加如下图所示内容:

source "drivers/char/hello/Kconfig"

 

上面我们已经写好helloworld驱动,接下来我们需要使用makemenuconfig在内核中配置上helloworld驱动。依次输入以下命令:

export ARCH=arm64

make defconfig //i.MX8MM内核默认的配置文件是/home/topeet/linux/linux-imx/arch/arm64/configs/defconfig

make menuconfig

然后我们依次选择,如下所示,选中helloworld驱动。

Device Drivers  --->

Character devices  --->

 <*> hello world

 然后光标移动到save,保存配置,如下图所示:

保存到/home/topeet/linux/linux-imx/arch/arm64/configs/defconfig,如下所示: 

然后点击ok,退出配置界面。配置完便可以编译源码了,如下图所示。注意编译源码要再打开一个新窗口,不能和makemenuconfig使用同一个窗口编译。 

编译完成后我们检验编写好的驱动是否编译进内核源码,有两种方法

第一种方法查看编写的驱动是否被编译成.o文件

如下图所示:

 

编译完成后我们检验编写好的驱动是否编译进内核源码,有两种方法

第一种方法查看编写的驱动是否被编译成.o文件

如下图所示:

 

在编译过程中,也会看到helloworld编译成功了,如下图所示: 

第二种方法直接烧写镜像看系统启动的打印信息有没有打印hello world

烧写镜像请参考i.MX8MM开发板使用手册烧写yocto镜像章节,镜像烧写完毕,开发板启动,查看打印内核信息。如下图所示,我们在打印日志里面搜索“hello world”。 

如果可以找到,将驱动编译进内核已经成功了。

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

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

相关文章

OpenAI从GPT-4V到GPT-4O,再到GPT-4OMini简介

OpenAI从GPT-4V到GPT-4O&#xff0c;再到GPT-4OMini简介 一、引言 在人工智能领域&#xff0c;OpenAI的GPT系列模型一直是自然语言处理的标杆。随着技术的不断进步&#xff0c;OpenAI推出了多个版本的GPT模型&#xff0c;包括视觉增强的GPT-4V&#xff08;GPT-4 with Vision&…

Sokit(TCP/UDP调试工具)

下载&#xff1a;http://www.winwin7.com/soft/56522.html#xiazai Sokit中文版是一款免费开源的TCP / UDP 测试&#xff08;调试&#xff09;工具&#xff0c;它主要可以用于接收和发送TCP/UDP数据包&#xff0c;让你更深的了解网络状况&#xff0c;能够有效地接收、发送、转…

Adobe国际认证详解-从零开始学做视频剪辑

从零开始学做视频剪辑&#xff0c;是许多初学者面临的挑战。在这个数字媒体时代&#xff0c;视频剪辑已经成为一种重要的技能&#xff0c;无论是个人爱好还是职业发展&#xff0c;掌握视频剪辑技能都是非常有价值的。 视频剪辑&#xff0c;简称“剪辑”&#xff0c;是视频制作过…

创建vue3项目,以及使用示例

1.在根目录下cmd&#xff1a;vue create myobj&#xff08;没有切换淘宝镜像记得切换&#xff0c;这样创建项目运行快&#xff09; 2. 3.(按空格键选中&#xff0c;选好回撤就到下一步了) 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.然后输入执行以下两步就已经运行项目了 以…

SpringMVC实现文件上传

导入文件上传相关依赖 <!--文件上传--> <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version> </dependency> <dependency><groupId>…

鱼眼摄像头-opencv校准(基于棋盘+畸变表)

一&#xff1a;主要参数说明 1&#xff1a;内参矩阵K 是3*3的矩阵&#xff0c;其类似格式 Knp.array([ [389.2109574522624, 0.0, 630.2525667489842], [0.0, 388.505701978078, 360.7886749292513], [0.0, 0.0, 1.0]]) 2&#xff1a;畸变系数 针对鱼眼相机&#xff1a;…

粘包问题、mmap和分片上传

一、粘包问题&#xff1a; 如果一端要把文件发给另一端&#xff0c;要发送两个部分的数据&#xff1a;其一是文件名&#xff0c;用于对端创建文件&#xff1b;另一个部分是文件内容。服务端在接收文件名&#xff0c;实际上并不知道有多长&#xff0c; 所以它会试图把网络缓冲区…

v-for 进行列表的 增删改查

通过对象下标替换属性值 但是通过实践此方法是错误的&#xff0c;Vue监听的是students这个对象&#xff0c;而不是这个对象里面的数组信息&#xff0c;也就是说&#xff0c;改变里面的值&#xff0c;并不能在页面上实现更新的功能 <!DOCTYPE html> <html lang"en…

Adobe国际认证详解-动漫制作专业就业方向和前景

动漫制作专业的就业方向和前景随着创意产业的蓬勃发展而愈发广阔。这一专业涵盖了从角色设计、场景绘制到动画制作、特效合成等多个环节&#xff0c;是创意与技术相结合的典型代表。随着数字媒体和互联网的普及&#xff0c;动漫制作专业人才的需求正不断增长&#xff0c;为该专…

c++ primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作

c primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作 c primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作 文章目录 c primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作16.3.3 对矢量可执行的其他操作…

计算机毕业设计python+neo4j知识图谱中医问答系统 中医中药方剂大数据可视化 vue.js 前后端分离 大数据毕业设计 机器学习 深度学习 人工智能

背景介绍 中医问答系统开题报告 一、项目背景与意义 随着科技的飞速发展和人们生活水平的提高&#xff0c;人们对健康管理的需求日益增强。中医作为中国传统医学的瑰宝&#xff0c;其独特的理论体系、诊疗方法和养生观念在现代社会依然发挥着不可替代的作用。然而&#xff0…

华为云技术精髓笔记(四)-CES基础入门实战

华为云技术精髓笔记(四) CES基础入门实战 一、监控ECS性能 1、 远程登录ECS 步骤一 双击实验桌面的“Xfce终端”打开Terminal&#xff0c;输入以下命令登录云服务器。注意&#xff1a;请使用云服务器的公网IP替换命令中的【EIP】。 LANGen_us.UTF-8 ssh rootEIP说明&#x…

机械学习—零基础学习日志(高数09——函数图形)

零基础为了学人工智能&#xff0c;真的开始复习高数 函数图像&#xff0c;开始新的学习&#xff01; 幂函数 利用函数的性质&#xff0c;以幂函数为例&#xff0c;因为单调性相同&#xff0c;利用图中的2和3公式&#xff0c;求最值问题&#xff0c;可以直接将式子进行简化。这…

东京裸机云多IP服务器全面分析

东京裸机云多IP服务器是一种提供多IP地址分配和高性能网络服务的云计算解决方案&#xff0c;广泛应用于需要多IP管理和高稳定性的网络应用。下面将从几个方面具体介绍东京裸机云多IP服务器&#xff0c;rak部落为您整理发布东京裸机云多IP服务器的全面分析。 在数字化时代&#…

SQL injection UNION attacks SQL注入联合查询攻击

通过使用UNION关键字&#xff0c;拼接新的SQL语句从而获得额外的内容&#xff0c;例如 select a,b FROM table1 UNION select c,d FROM table2&#xff0c;可以一次性查询 2行数据&#xff0c;一行是a&#xff0c;b&#xff0c;一行是c&#xff0c;d。 UNION查询必须满足2个条…

15Kg级无人机降落伞系统技术详解

15Kg级无人机降落伞系统由以下几个主要部分组成&#xff1a; 1. 降落伞主体&#xff1a;采用轻质高强度的材料制成&#xff0c;能够承受无人机在降落过程中产生的冲击力&#xff0c;并确保无人机平稳安全地着陆。 2. 伞绳与连接机构&#xff1a;伞绳负责连接降落伞主体与无人机…

操作系统常用知识总结(基本结构+磁盘+进程)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 基本结构 冯诺依曼计算机模型 现代计算机模型是基于冯诺依曼计算…

适配器模式详解和应用

目录 适配器模式适配器模式结构适配器模式适用场景适配器模式优缺点练手题目题目描述输入描述输出描述题解 适配器模式 适配器模式是一种结构型设计模式&#xff0c; 它能使接口不兼容的对象能够相互合作。 适配器模式结构 对象适配器 实现时使用了构成原则&#xff1a; 适…

重复图片查找:巧用Python和OpenCV进行图像哈希与汉明距离检测以从海量图片中找出重复图片

重复图片查找&#xff1a;巧用Python和OpenCV进行图像哈希与汉明距离检测以从海量图片中找出重复图片 1. 导言2. 环境准备3. 图像哈希&#xff08;pHash&#xff09;原理4. 汉明距离原理5. 代码实现导入必要的库图像哈希计算函数汉明距离计算函数查找重复图片函数示例使用 在处…

C++:内存管理(new,delete)

目录 C/C内存分布 C语言内存管理 C内存管理&#xff1a; new和delete的原理 new delete malloc/free和new/delete的区别 C/C内存分布 在C/C中&#xff0c;都有一块虚拟地址&#xff0c;内部井然有序的将代码分成了几部分&#xff0c;如下表&#xff1a; 栈&#xff1a;…