全系列传送门
Linux嵌入式驱动开发01——第一个驱动Hello World(附源码)
Linux嵌入式驱动开发06——第一个相对完整的驱动实践编写
Linux嵌入式驱动开发07——GPIO驱动过程记录(飞凌开发板)
Linux嵌入式驱动开发11——平台总线模型修改为设备树实例
Linux嵌入式驱动开发12——pinctl和gpio子系统实践操作
Linux嵌入式驱动开发13——ioctl接口(gpio控制使用)
Linux嵌入式驱动开发14——中断的原理以及按键中断的实现(tasklet中断下文)
make menuconfig图形化配置界面
1. 怎么进入到make menuconfig图形化界面?
首先进入到内核源码的路径下
然后输入
make menuconfig
即可打开这个界面
2. make menuconfig图形化界面的操作
-
搜索功能
- 输入 “ / ” 即可弹出搜索界面,然后输入我们想要搜索的内容即可
例如搜索led
- 输入 “ / ” 即可弹出搜索界面,然后输入我们想要搜索的内容即可
-
配置驱动状态
- 把驱动编译编译成模块(用M表示)
- 把驱动编译到内核里面(用*来表示)
- 不编译
3. 退出
退出分为保存退出和不保存退出
4. 和make menuconfig有关的文件
- Makefile
- 编译规则,告诉我们在make的时候要怎么编译,相当于怎么做饭
- Kconfig
- 内核配置的选项,相当于我们去饭店吃饭服务员给我们的菜单
- .config
- 配置完内核之后生成的配置选项,相当于我们要点的菜
5. make menuconfig会读哪个目录下的Kconfig文件
arch/ $ARCH/目录下的Kconfig
arch/arm/configs
有好多的配置文件,相当于这个饭店的特色菜
6. 为什么要复制成.config而不是其他文件
复制配置文件到源码根目录
cp imx_v7_defconfig /work/linux-4.1.15/.config
注意:
复制成.config
格式
查看我们复制的.config
格式文件
能不能是其他的文件名字?
肯定是不行的,因为内核会默认读取Linux内核根目录下的.config作为默认的配置选项,所以不可以改名字
7. 我们复制的这个默认的配置选项不符合我们的要求怎么办?
我们要就要点菜,菜单是Kconfig,通过make menuconfig来调出来这个菜单了
也就是按照要求从图形化界面选择就是了。
配置完成以后会自动更新到.config里面
8. 怎么和Makefile文件建立的关系
当我们make menuconfig保存退出以后,Linux会将所有的配置选项以宏定义的形式保存在include/generated/下面的autoconf.h里面
具体怎么建立关系也不是我们关心的内容。
驱动编译到内核
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/
新建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
第三步,新建helloworld对应的Makefile
nano Makefile
obj-$(CONFIG_HELLOWORLD)+=helloworld.o
第四步,修改char目录下的Kconfig Makefile
返回上一层目录,来到char目录
首先是Makefile
obj-$(CONFIG_HELLOWORLD) += helloworld/
然后就是Kconfig文件
source "drivers/char/helloworld/Kconfig"
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
我们这里后面还需要用到,现在需要的是把imx_v7_defconfig复制成linux源码根目录下的.config文件
cp imx_v7_defconfig /work/linux-4.1.15/.config
make menuconfig
上一步的复制主要为了这一步,因为我们的make menuconfig
运行,就是配置我们的.config文件
然后我们就可以找到我们的hello world了
找到以后,使用 空格 操作,修改成编译到内核
之后保存退出就可以了
这时候我们可以打开.config文件,查看是不是修改成功了
nano .config
打开后,ctrl+w
就可以搜索我们的hello
.config—>imx_v7_defconfig
刚才默认配置文件imx_v7_defconfig变成临时的配置文件 .config,现在我们要变回去,因为后面的 make imx_v7_defconfig
操作,会从目录/arch/arm/configs
中找到imx_v7_defconfig来进行加载配置
编译
这里使用脚本文件
#!/bin/bash
make distclean
make imx_v7_defconfig
make zImage -j16
make dtbs
make modules -j16
执行完毕后,我们查看是否成功,通过helloworld目录下有没有编译后生成的helloworld.o文件就可以了