在Linux内核中,添加驱动代码一般有3部:
-
将代码拷贝到Linux内核代码恰当的地方
-
新建或者修改对应的kconfig文件
-
新建或修改对应的makefile文件
下面先介绍这些文件的用途,然后以具体的例子加以说明,最后解释一下它们的语法。
一、作用
Kconfig ---> (每个源码目录下)提供编译选项 .config ---> (源码顶层目录下)保存选择结果 Makefile---> (每个源码目录下)根据.config中的内容来告知编译系统如何编译
1.deconfig 文件
一般由平台厂商提供,内核编译用做.config的参考,注意:如果,缺少该文件,无法进行编译。
文件位于:\kernel..\arch\arm\configs\xxx_defconfig
2.kconfig
分布在各目录下的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文件相关的内核配置菜单。在内核配置make menuconfig(或xconfig等)时,从Kconfig中读出配置菜单,用户配置完后保存到.config(在顶层目录下生成)中。
3.makefile
分布在各个目录下,用于集成编译。
4.config 文件
在内核编译时,主Makefile调用这个.config,用于或者用于的内核编译配置。当我们在内核源码目录下输入make menuconfig时,在出现的菜单界面中选择一项时,它会自动更新.config相应项的值。如果我们没有选择,则会在.config问下插入一行注释(# CONFIG_TOUCHSCREEN_GT9xx is not set)
文件位于 :kernel...\out\xxx_defconfig.config
二、例子
1、在driver目录下新建一个目录
mkdir driver/test 1
进入test目录,创建Kconfig文件
config TEST bool "Test Driver" help test hao test
2、第二步 配置Makefile
在同样的目录中,新建一个Makefile
obj-$(CONFIG_TEST) += test.o
Obj-$(CONFIG选项名) += xxx.o /*当CONFIG选项名=y时,表示对应目录下的xxx.c将被编译进内核 当CONFIG_选项名=m时对应目录下的xxx.c将被编译成模块*/
3、配置上层目录的Makefile与Kconfig
kconfig末尾添加:
source "drivers/test/Kconfig"
makefile添加:
obj-$(CONFIG_TEST) += test/
或者
obj-y += test/
到这里就加完了,还需要让它能够在编译内核时会被编译到,还需
4、使能之
有两个方法:
(1)、deconfig文件
在该文件中添加
CONFIG_TEST=y/m
(2)、Kconfig文件
修改驱动对应目录下的kconfig文件
config TEST bool "Test Driver" + default y help test hao test
三、语法
1、kconfig文件
CONFIG宏变量参数
-
bool: 表示该CONFIG宏只能选择y(编译内核)或者n(不编译),不能选择m(编译为模块)
-
tristate: 表示该CONFIG宏可以设置y/m/n三种模式(tristate)
-
string: 表示该CONFIG宏可以设为一串字符,比如#define CONFIG_XXX "config test"
-
hex: 表示该CONFIG宏可以设为一个十六进制,比如#define CONFIG_XXX 0x1234
-
int: 表示该CONFIG宏可以设为一个整数,比如#define CONFIG_XXX 1234
常用参数
-
default y: 表示默认是勾上的,当然也可以写为default m或者default n
-
help: 帮助提示信息
-
depends on:依赖项,比如depends on XXX 表示当前宏需要CONFIG_ XXX宏打开的前提下,才能设置它 (注意依赖项的config参数只有bool或tristate才有效)
-
select : 反依赖项,和depends on刚好相反,比如 selecton XXX表示当前宏如果是y或者m,则会自动设置XXX=y或者m(注意参数只有bool或tristate才有效)
-
choice: 会生成一个单选框,里面通过多选一方式选择config,需要注意choice中的config参数只能bool或tristate
-
prompt: 提示信息,如果对于choice而言,则会用来当做一个单选框入口点的标签
-
range : 设置用户输入的数据范围,比如range 0 100表示数据只能位于0~100
-
menuconfig: menuconfig XXX和config XXX类似,唯一不同的是该选项除了能设置y/m/n外,还可以实现菜单效果(能回车进入该项内部)
2、makefile