嵌入式Linux驱动模块编译进内核

图形化配置内核
        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 文件
 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木士易

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值