linux内核将新驱动添加到menuconfig菜单

  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 XLGendif:确保只有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的话,会直接编译到内核中。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值