在学习过程中,一般是把驱动编译成模块加载。但一个完整的项目通常需要内核自动去加载,本篇文章介绍一下如何将驱动编译进内核。
我们在编译内核源码时通常要先配置一下内核,用make menuconfig,可以看到像是一个菜单,我们可以配置有关内核的可选项,这是因为make menuconfig会读取名为Kconfig的文件来列出所有的配置选项。可以发现内核源码的几乎每个子目录中都有一个名为Kconfig的文件,这个文件负责配置驱动在配置菜单中的显示以及配置行为,且Kconfig遵循特定的语法。
同时,我们可以发现每个子目录中同样也有个Makefile文件,Makefile文件也会递归调用子目录中的Makefile,执行各目录的编译并链接。
将驱动编译进内核的步骤:
1、将驱动源文件放在内核对应目录中,一般的驱动文件放在drivers目录下,字符设备放在drivers/char中,块设备就放在drivers/blok中。如果需要添加多个驱动,则可以自己创建一个目录。
2、遵循Kconfig的语法,如果创建了目录,则在目录下编写Kconfig与Makefile,并且在此目录的上级目录的Kconfig与Makefile中调用自己编写的这两个文件。如果只有一个驱动文件,就直接在当前目录中修改Kconfig与Makefile。
3、执行make menuconfig配置自己添加的选项,make。
示例:
需要添加的源代码为字符设备驱动,名为test.c,新建一个目录test。
1、在内核源码的drivers/char中新建test目录。
2、在drivers/char/test目录下编写Kconfig文件:
config TEST
bool "cdev test"
default n
help
this is a test
config条目就是具体的配置项,.config 文件中的“CONFIG_xxx” (xxx 就是
具体的配置项名字)就是 Kconfig 文件中 config 关键字后面的配置项名字加上“CONFIG_”前
缀。
bool代表CONFIG_TEST这个变量有两种值: y 和 n,当为 y 的时候表示使能这个配置项,当为 n 的时候就禁止这个配置项。
default n表示这个选项默认是禁止的。
help表示帮助信息,告诉我们配置项的含义,当我们按下“h”或“?”弹出来的
帮助界面就是 help 的内容。
3、在drivers/char目录下的Kconfig文件中添加 source "drivers/char/test/Kconfig"
source表示调用此路径的Kconfig文件。
4、在drivers/char/test目录下编写Makefile文件:
obj-$(CONFIG_TEST) += test.o
表示如果CONFIG_TEST变量为y,则将此目录下的test.c编译成test.o
5、在drivers/char目录下的Makefile文件中添加
obj-$(CONFIG_TEST) += test/
表示如果CONFIG_TEST变量为y,test/Makefile就会被调用。
6、在make menuconfig中选中,进入目录选项Device Driver --> Character devices
找到 cdev test 选项按y选中,然后编译。