Linux嵌入式驱动开发02——驱动编译到内核

文章目录

  • 全系列传送门
  • make menuconfig图形化配置界面
    • 1. 怎么进入到make menuconfig图形化界面?
    • 2. make menuconfig图形化界面的操作
    • 3. 退出
    • 4. 和make menuconfig有关的文件
    • 5. make menuconfig会读哪个目录下的Kconfig文件
    • 6. 为什么要复制成.config而不是其他文件
    • 7. 我们复制的这个默认的配置选项不符合我们的要求怎么办?
    • 8. 怎么和Makefile文件建立的关系
  • 驱动编译到内核
    • Kconfig例子
    • helloworld准备
      • 第一步,复制.c文件到指定位置
      • 第二步,新建helloworld对应的Kconfig
      • 第三步,新建helloworld对应的Makefile
      • 第四步,修改char目录下的Kconfig Makefile
    • imx_v7_defconfig—>.config
    • make menuconfig
    • .config—>imx_v7_defconfig
    • 编译

全系列传送门

Linux嵌入式驱动开发01——第一个驱动Hello World(附源码)

Linux嵌入式驱动开发02——驱动编译到内核

Linux嵌入式驱动开发03——杂项设备驱动(附源码)

Linux嵌入式驱动开发04——应用层和内核层数据传输

Linux嵌入式驱动开发05——物理地址到虚拟地址映射

Linux嵌入式驱动开发06——第一个相对完整的驱动实践编写

Linux嵌入式驱动开发07——GPIO驱动过程记录(飞凌开发板)

Linux嵌入式驱动开发08——字符设备(步步为营)

Linux嵌入式驱动开发09——平台总线详解及实战

Linux嵌入式驱动开发10——设备树开发详解

Linux嵌入式驱动开发11——平台总线模型修改为设备树实例

Linux嵌入式驱动开发12——pinctl和gpio子系统实践操作

Linux嵌入式驱动开发13——ioctl接口(gpio控制使用)

Linux嵌入式驱动开发14——中断的原理以及按键中断的实现(tasklet中断下文)

Linux嵌入式驱动开发15——等待队列和工作队列

Linux嵌入式驱动开发16——按键消抖实验(内核定时器)

Linux嵌入式驱动开发17——输入子系统

Linux嵌入式驱动开发18——I2C通信

make menuconfig图形化配置界面

1. 怎么进入到make menuconfig图形化界面?

首先进入到内核源码的路径下
在这里插入图片描述

然后输入

make menuconfig

即可打开这个界面
Linux嵌入式驱动开发02——驱动编译到内核_第1张图片

2. make menuconfig图形化界面的操作

  • 搜索功能

    • 输入 “ / ” 即可弹出搜索界面,然后输入我们想要搜索的内容即可
      Linux嵌入式驱动开发02——驱动编译到内核_第2张图片
      例如搜索led
      Linux嵌入式驱动开发02——驱动编译到内核_第3张图片
  • 配置驱动状态

    • 把驱动编译编译成模块(用M表示)
    • 把驱动编译到内核里面(用*来表示)
    • 不编译

3. 退出

退出分为保存退出和不保存退出
Linux嵌入式驱动开发02——驱动编译到内核_第4张图片

4. 和make menuconfig有关的文件

  • Makefile
    • 编译规则,告诉我们在make的时候要怎么编译,相当于怎么做饭
  • Kconfig
    • 内核配置的选项,相当于我们去饭店吃饭服务员给我们的菜单
  • .config
    • 配置完内核之后生成的配置选项,相当于我们要点的菜

5. make menuconfig会读哪个目录下的Kconfig文件

arch/ $ARCH/目录下的Kconfig
在这里插入图片描述

arch/arm/configs

Linux嵌入式驱动开发02——驱动编译到内核_第5张图片

有好多的配置文件,相当于这个饭店的特色菜

6. 为什么要复制成.config而不是其他文件

复制配置文件到源码根目录

 cp imx_v7_defconfig /work/linux-4.1.15/.config

注意:
复制成.config格式
Linux嵌入式驱动开发02——驱动编译到内核_第6张图片
查看我们复制的.config格式文件
Linux嵌入式驱动开发02——驱动编译到内核_第7张图片

能不能是其他的文件名字?

肯定是不行的,因为内核会默认读取Linux内核根目录下的.config作为默认的配置选项,所以不可以改名字

7. 我们复制的这个默认的配置选项不符合我们的要求怎么办?

我们要就要点菜,菜单是Kconfig,通过make menuconfig来调出来这个菜单了
Linux嵌入式驱动开发02——驱动编译到内核_第8张图片

也就是按照要求从图形化界面选择就是了。

配置完成以后会自动更新到.config里面

8. 怎么和Makefile文件建立的关系

当我们make menuconfig保存退出以后,Linux会将所有的配置选项以宏定义的形式保存在include/generated/下面的autoconf.h里面
在这里插入图片描述

Linux嵌入式驱动开发02——驱动编译到内核_第9张图片
具体怎么建立关系也不是我们关心的内容。

驱动编译到内核

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
source "drivers/redled/Kconfig"  

包含drivers/redled这个路径下的驱动文件,方便对菜单管理

config LED_4412        

配置选项的名称LED_4412

tristate "Led Support for GPIO Led" 

tristate表示驱动状态(1、驱动编译成模块,2、驱动编译到内核,3、不编译),
与之对应的还有bool(1、编译到内核,2、不编译)
“Led Support for GPIO Led” 是make menuconfig显示的名字

 depends on LEDS_CLASS

helloworld准备

第一步,复制.c文件到指定位置

首先是打开我们linux源码的char文件位置

 cd /work/linux-4.1.15/drivers/char/

Linux嵌入式驱动开发02——驱动编译到内核_第10张图片
新建helloworld文件夹

mkdir helloworld
chmod 777 helloworld

复制过来我们之前的helloworld.c 文件就可以了

第二步,新建helloworld对应的Kconfig

nano Kconfig

根据上面的例子写出helloworld的Kconfig

 config HELLOWORLD
        tristate "helloworld"
        help
        This option enable support for helloworld

Linux嵌入式驱动开发02——驱动编译到内核_第11张图片

第三步,新建helloworld对应的Makefile

nano Makefile
obj-$(CONFIG_HELLOWORLD)+=helloworld.o

Linux嵌入式驱动开发02——驱动编译到内核_第12张图片

第四步,修改char目录下的Kconfig Makefile

返回上一层目录,来到char目录
Linux嵌入式驱动开发02——驱动编译到内核_第13张图片
首先是Makefile

obj-$(CONFIG_HELLOWORLD) += helloworld/

Linux嵌入式驱动开发02——驱动编译到内核_第14张图片
然后就是Kconfig文件

source "drivers/char/helloworld/Kconfig"

Linux嵌入式驱动开发02——驱动编译到内核_第15张图片

imx_v7_defconfig—>.config

首先执行一个操作

. /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa9hf-neon-poky-linux-gnueabi
make distclean

清除掉linux源码根目录下的.config文件

然后可以

ls .config

查看一下是否被清除掉

make menuconfig的配置文件有一个默认的

cd arch/arm/configs/

我们可以在文件下找到imx_v7_defconfig
Linux嵌入式驱动开发02——驱动编译到内核_第16张图片
我们这里后面还需要用到,现在需要的是把imx_v7_defconfig复制成linux源码根目录下的.config文件

cp imx_v7_defconfig /work/linux-4.1.15/.config

在这里插入图片描述

make menuconfig

上一步的复制主要为了这一步,因为我们的make menuconfig运行,就是配置我们的.config文件

然后我们就可以找到我们的hello world了
Linux嵌入式驱动开发02——驱动编译到内核_第17张图片
Linux嵌入式驱动开发02——驱动编译到内核_第18张图片
Linux嵌入式驱动开发02——驱动编译到内核_第19张图片
Linux嵌入式驱动开发02——驱动编译到内核_第20张图片
找到以后,使用 空格 操作,修改成编译到内核

之后保存退出就可以了

这时候我们可以打开.config文件,查看是不是修改成功了

nano .config

在这里插入图片描述
打开后,ctrl+w 就可以搜索我们的hello
Linux嵌入式驱动开发02——驱动编译到内核_第21张图片

.config—>imx_v7_defconfig

刚才默认配置文件imx_v7_defconfig变成临时的配置文件 .config,现在我们要变回去,因为后面的 make imx_v7_defconfig 操作,会从目录/arch/arm/configs中找到imx_v7_defconfig来进行加载配置
Linux嵌入式驱动开发02——驱动编译到内核_第22张图片

编译

这里使用脚本文件

#!/bin/bash
make distclean
make imx_v7_defconfig
make zImage -j16
make dtbs
make modules -j16

执行完毕后,我们查看是否成功,通过helloworld目录下有没有编译后生成的helloworld.o文件就可以了
在这里插入图片描述

你可能感兴趣的:(i.MX6,内核,linux,c++)