【北京迅为】《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”。 
如果可以找到,将驱动编译进内核已经成功了。
相关文章:
【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十八章 驱动模块编译进内核
i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…...
Mailspring搭建安装教程:打造个性邮件体验
Mailspring搭建安装教程步骤!如何选择电子邮件服务商? Mailspring作为一款功能强大、界面友好的邮件客户端,成为了许多用户的首选。AokSend将为大家提供详细的Mailspring搭建安装教程,帮助您打造个性化的邮件体验。 Mailspring搭…...
【分布式锁】Redission实现分布式锁
接着上一节,我们遇到了超卖的问题,并通过Redis实现分布式锁,进行了解决。本节 我将换一种方式实现分布式锁。 前提: nginx、redis、nacos 模块1: provider-and-consumer 端口 8023 模块2 rabbitmq-consumer 端口 8021 …...
UE4/5 对话系统
参考教程:UE4甜筒教艺术生学蓝图#21.UE4对话系统(1)--唠嗑案例展示_哔哩哔哩_bilibili 说来惭愧两年前看的教程,现在才记录一下,很好的教程推荐大家观看 1.首先创建两个枚举,内容如下 2.创建三个结构体,内容如下 3.再…...
Golang | Leetcode Golang题解之第275题H指数II
题目: 题解: func hIndex(citations []int) int {n : len(citations)return n - sort.Search(n, func(x int) bool { return citations[x] > n-x }) }...
Python—面向过程编程,详细讲解(类和实例,初始化函数,类中封装数据与操作)
1.类和实例 类:类别 实例(对象):类型塑造出来的某一个具体的内容 isinstance(对象,类) 返回一个对象是否是一个类的实例 # 声明一个整数类的实例10 a int(10) # a 10 print(type(a), isinstance(a, int)) a flo…...
Linux云计算 |【第一阶段】SERVICES-DAY2
主要内容: DNS服务基础及搭建、特殊解析(针对地址库文件:DNS轮询 DNS泛域名解析 DNS别名)、缓存DNS(全局转发forwarders)、DNS递归迭代(子域授权)、DNS主从架构搭建、DNS主从数据同步 一、DNS工…...
el-upload照片墙自定义上传多张图片(手动一次性上传多张图片)包含图片回显,删除
需求:el-upload照片墙自定义上传多张图片(手动一次性上传多张图片)包含图片回显,删除,预览,在网上看了很多,都没有说怎么把数据转为file格式的,找了很久最终实现, 难点&a…...
三星Unpacked发布会即将举行:有新款折叠屏手机,还有智能戒指
随着7月的脚步渐近,科技界的目光再次聚焦于三星,它即将在法国巴黎举办今年的第二场Unpacked发布会。这不仅是一场新品的展示,更是三星对创新科技的一次深刻诠释。 从Galaxy Z Fold 6的全新设计,到Galaxy Z Flip 6的显著升级&…...
【Python】Matplotlib简要教程
文章目录 一、简介二、一些基本概念2.1 图表元素2.2 常见图表类型2.3 主要绘图函数及其返回值2.4 Artists 的概念 三、基本图表详解3.1 成对数据3.11 折线图:plot()🟨设置图表样式🟨设置各种标签🟨设置坐标轴🟨绘制子图…...
数驭未来,景联文科技构建高质大模型数据库
国内应用层面的需求推动AI产业的加速发展。根据IDC数据预测,预计2026年中国人工智能软件及应用市场规模会达到211亿美元。 数据、算法、算力是AI发展的驱动力,其中数据是AI发展的基石,中国的数据规模增长速度预期将领跑全球。 2024年《政府工…...
视频汇聚平台EasyCVR启动出现报错“cannot open shared object file”的原因排查与解决
安防视频监控EasyCVR安防监控视频系统采用先进的网络传输技术,支持高清视频的接入和传输,能够满足大规模、高并发的远程监控需求。EasyCVR平台支持多种视频流的外部分发,如RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、WebRTC、fmp4等…...
VMware 安装完,设备管理器中没有虚拟网卡(vmnet0、wmnet1、vmnet8) / 虚拟网络编辑器中没有桥接模式
问题:VMware 安装完,设备管理器中没有虚拟网卡(vmnet0、wmnet1、vmnet8) / 虚拟网络编辑器中没有桥接模式 1、确认 Device Install Service 和 Device Setup Manager 没有被禁用 Device Install Service 和 Device Setup Manager是 Windows 操作系统中…...
构建高效Node.js中间层:探索请求合并转发的艺术
🎉 博客主页:【剑九 六千里-CSDN博客】 🎨 上一篇文章:【CSS盒模型:掌握网页布局的核心】 🎠 系列专栏:【面试题-八股系列】 💖 感谢大家点赞👍收藏⭐评论✍ 引言&#x…...
中断和EXIT原理介绍
中断和EXIT原理介绍 一、中断的介绍?二、EXIT的介绍1.EXIT作用2.EXIT的详情3.EXIT中AFIO复用的作用4.STM32中AFIO复用作用 一、中断的介绍? 二、EXIT的介绍 EXTI(Extern Interrupt)外部中断 1.EXIT作用 EXTI可以监测指定GPIO口…...
vcpkg或者命令行需要设置代理时如何设置
当使用命令行或者vcpkg时,有时候需要设置代理来下载一些代码,那么可以这样: 本地先起一个http或者socks5的代理服务器。监听127.0.0.1:10808如果本地是http代理服务器,在命令行执行: set http_proxyhttp://127.0.0.1:…...
tensorflow安装及数据操作----学习笔记(一)
安装Miniconda 下载对应系统版本的Miniconda。我的系统是ubuntu,所以选择Miniconda3 Linux 64-bit。下载后执行下载的sh脚本 sh Miniconda3-latest-Linux-x86_64.sh -b执行后,运行conda初始化命令 ~/miniconda3/bin/conda init关闭当前命令终端&#…...
顺序表和单链表的经典算法题
目录 前言 一、基础思想(数组) 1. 移除元素 2.删除有序元素的重复项 3.合并两个有序数组 二、单链表算法 1.移除链表元素 2.翻转链表 3.合并两个有序的链表 前言 Hello,小伙伴们,今天我们来做一个往期知识的回顾,今天我将…...
python基础知识点(蓝桥杯python科目个人复习计划71)
做些简单题 第一题:确定字符串是否包含唯一字符 题目描述: 实现一个算法来识别一个字符串的字符是否是唯一的。 若唯一输出YES,否则输出NO。 输入描述: 输入一个字符串,长度不超过100. 输出描述; 输出一行&…...
【大数据专题】Flink题库
1 . 简述什么是Apache Flink ? Apache Flink 是一个开源的基于流的有状态计算框架。它是分布式地执行的,具备低延迟、高吞吐的优秀性能,并且非常擅长处理有状态的复杂计算逻辑场景 2 . 简述Flink 的核心概念 ? Flink 的核心概念…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
