Linux下开发好的驱动添加到系统内核中通常有两种方法:
1.是将驱动编译成内核模块(xxx.ko文件),然后通过insmod xxx.ko
将驱动动态的插入内核中,当然动态插入的内核模块也可以通过rmmod xxx.ko
来动态的删除模块。
2.将驱动添加到menuconfig
中,直接编译进内核。这种方法也有一定的缺陷,比如开发出来的驱动如果有bug则需要升级整个内核文件才可以。但方法1只需要替换相应的xxx.ko
文件即可。
本文通过将简单介绍如何将驱动添加到menuconfig
中,下面通过我工作中的一个项目来做说明。
一、建立工作目录
首先需要建立一个自己的目录来保存将要添加的驱动文件,这样做的好处是防止污染原生系统以及方便后期管理。下面是我建立的工作目录:
linux/drivers/char/xlg/
二、Kconfig文件创建
Kconfig
文件是menuconfig
的关键文件。Kconfig用来配置内核,它就是各种配置界面的源文件,内核的配置工具读取各个Kconfig文件,生成配置界面供开发人员配置内核,最后生成配置文件.config。下面是我创建的Kconfig文件,文件路劲为linux/drivers/char/xlg/Kconfig
:
menuconfig XLG
tristate "xlg dedicated driver"
if XLG
config LED
tristate "a20 led driver"
config SECURITY_ID
tristate "a20 security_id driver"
config KEY
tristate "a20 key driver"
config TEM
tristate "a20 18b20 driver"
config TEM_HUM
tristate "a20 am2301 driver"
config SPI2
tristate "a20 spi2 driver"
config EXT_RESET
tristate "external reset driver"
endif # XLG
menuconfig XLG
:是传给Makefile的参数,在生成的.config文件中会多一项CONFIG_XLG
;
tristate "xlg dedicated driver"
:这样就可以在make menuconfig时增加一项" <> xlg dedicated driver"
选项,其中tristate定义该选项为三态的,即< > <*>
和 <M>
三中选项,若为bool 则定义该选项为两个选择,即[ ] 和 [*]两种选项。如下图所示:
if XLG
和endif
:确保只有XLG被定义,也就是说<M> xlg dedicated driver --->
或者<*> xlg dedicated driver --->
时才会出现被包含的内容。这两者之间包含了需要添加的驱动,每个驱动都可以选择是否编译,是否编译进内核还是模块,如下图所示:
三、Makefile创建
Makefile是编译内核的关键,下面给出新建Makefile的内容,文件路径为linux/drivers/char/xlg/Makefile
:
obj-$(CONFIG_LED) += a20_led.o
obj-$(CONFIG_SECURITY_ID) += a20_security_id.o
obj-$(CONFIG_KEY) += key_dev.o
obj-$(CONFIG_TEM) += tem_dev.o
obj-$(CONFIG_TEM_HUM) += tem_hum_dev.o
obj-$(CONFIG_SPI2) += a20_spidev.o
obj-$(CONFIG_EXT_RESET) += ext_reset.o
Makefile中的每一项都对应Kconfig,比如
obj-$(CONFIG_LED) += a20_led.o
对应Kconfig中的
config LED
tristate "a20 led driver"
四、上层Kconfig修改
自己工作目录下的Kconfig创建好之后需要添加到原生内核的Kconfig中去。修改文件linux/drivers/char/Kconfig
,将下面内容添加到该文件中:
source "drivers/char/xlg/Kconfig"
一般是添加到文件的最后面,但需要注意的是要在endmenu
之前。Kconfig文件中#开头的为注释,可以添加一些自己的注释。
注意:路径是从drivers/
开始的,不是相对路径。
五、上层Makefile修改
将新驱动添加的menuconfig之后还需要添加到原生Makefile中,这样在编译系统的时候才能编译新添加的驱动。修改文件linux/drivers/char/Makefile
,将下面内容添加到该文件中:
obj-$(CONFIG_XLG) +=xlg/
其中CONFIG_XLG
对应的是linux/drivers/char/xlg/Kconfig
中的:
menuconfig XLG
tristate "xlg dedicated driver"
至此,已经将自己的驱动添加进menuconfig中了,做好相应的配置之后,保存配置,在Linux根目录下便会生成.config文件,如下图所示:
六、内核编译
根据如上配置,在.config文件中生成如下内容(文件的一部分):
CONFIG_XLG=m
CONFIG_LED=m
CONFIG_SECURITY_ID=m
CONFIG_KEY=m
CONFIG_TEM=m
CONFIG_TEM_HUM=m
CONFIG_SPI2=m
CONFIG_EXT_RESET=m
在编译内核时Makefile根据.config文件来编译内核。上述配置全部为m,故会将上述文件编译成内核模块,如果选择的是y的话,会直接编译到内核中。