图形化配置内核
Linux 驱动开发者需要牢固地掌握 Linux 内核的编译方法以为嵌入式系统构建可运行的 Linux 操作系统映像。 在编译内核时, 需要配置内核, 可以使用下面命令中的一个:
#make config (基于文本的最为传统的配置界面, 不推荐使用)
#make menuconfig (基于文本菜单的配置界面)
#make xconfig (要求 QT 被安装)
#make gconfig (要求 GTK+ 被安装)
在这四种方式中, 最推荐的是 make menuconfig, 它不依赖于 QT 或 GTK+, 且非常直观。 在 imx6ull 内核源码运行如下命令, 即可打开这个界面。
make ARCH=arm menuconfig
打开后界面如下图所示, 在这个界面我们可以配置一些驱动的选项, 比如说对系统进行裁剪。
内核配置包含的条目相当多, arch/arm/configs/xxx_defconfig 文件包含了许多电路板的默认配置, 默认配置文件相当于这个饭店的特色菜。 只需要运行以下命令就可以为 xxx 开发板配置内核。
make ARCH=arm xxx_defconfig
如下图所示, config -linux/arm 4.14.2 Kernel configuration 说明已经配置好为 arm 平台。
输入以下命令来编译内核和模块, 如果 ARCH=arm 已经作为环境变量导出, 则不再需要在 make 命令后书写该选项。 执行完命令后会在 arch/arm/boot/目录下会得到压缩的内核映像 zImage, 在内核各对应目录内得到选中的内核模块。
make ARCH=arm zImage
make ARCH=arm modules
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 配置完内核以后生成的配置选项, 相当于我们点完的菜。
内核中编译驱动
在 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 帮助信息
以 imx6ull 开发板为例, 我们把 helloworld 编译进内核, 我们进入到 imx6ull 开发板的内核目录下, 如下图所示:
输入以下命令进入到 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, 如下图所示:
Makefile 添加如下图所示的内容
obj-y += hello/
Kconfig 添加如下图所示内容:
source "drivers/char/hello/Kconfig"
我们返回到内核源码目录下, 输入“make ARCH=arm menuconfig” ,如下图所示:
我们依次选择
Device Drivers --->
Character devices --->
│ *│ < > hello world (NEW)
然后退出保存, 配置完就可以交叉编译了, 为了保险起见呢, 我们看一下.config 文件, 搜索如下图所示, 说明驱动配置成功。
编译好设备树源码如下图所示, 注意修改内核配置文件, 需要覆盖掉arch/arm/configs/imx_v7_deconfig
检验编写好的驱动是否编译进内核源码, 有两种方法
第一种方法直接烧写镜像
第二种方法查看编写的驱动是否被编译成.o 文件