linux内核中,在/drivers/char目录的Kconfig文件中加入自己编写的新驱动,make menuconfig却不显示的问题

修改了一个同学编写的基于i2c接口的气压传感器sht21驱动,文件名SHT21.c,文件中将sht21注册成字符设备,现需要将驱动重新编译。

按照mini2440用户手册7.3.3节的步骤,将SHT21 module加入内核代码树并编译,

第一步:
编辑配置文件Kconfig,加入驱动选项,使之在make menuconfig 的时候出现
打开 linux-2.6.32.2/drivers/char/Kconfig 文件,找到下述片段:

config MINI2440_HELLO_MODULE
    tristate "Mini2440 module sample"
    depends on MACH_MINI2440
    default m if MACH_MINI2440
    help
      Mini2440 module sample.

然后直接复制一遍,照葫芦画瓢,稍作修改:

config MINI2440_SHT21_MODULE
    tristate "SHT21 driver for Mini2440"
    depends on MACH_MINI2440
    default m if MACH_MINI2440
    help
      SHT21 driver for Mini2440, a kind of baroceptor used i2c.

保存文件即可。

第二步:
打开 linux-2.6.32.2/drivers/char/Makefile,找到下面这个语句:
obj-$(CONFIG_MINI2440_HELLO_MODULE) += mini2440_hello_module.o
依旧照葫芦画瓢,在此行的上面增加一行
obj-$(CONFIG_MINI2440_SHT21_MODULE) += SHT21.o
保存退出。

第三步:

在linux-2.6.32.2 的顶层目录位置运行一下make menuconfig 就可以在Device Drivers -> Character devices 菜单中看到刚才所添加的选项了,按下空格键将会选择为,此意为要把该选项编译为模块方式;再按下空格会变为<*>,意为要把该选项编译到内核中。

这是mini2440用户手册中的描述,但是,我按照上述步骤,进入Device Drivers -> Character devices 子菜单,却并未发现“SHT21 driver for Mini2440”的字样,甚至连手册中说的本该已经存在的”Mini2440 module sample”, “LED Support for Mini2440 GPIO LEDs”等选项也都没有。

于是回过头来仔细阅读Kconfig中的驱动描述,发现mini2440预先编写的驱动例程的config第三行都有一句话:depends on MACH_MINI2440,查阅资料得知,只有在内核配置为mini2440模式的时候,带有depends on MACH_MINI2440语句的模块才会在menuconfig中显示出来。

这时候想到,我的内核文件解压缩之后,并未对其做任何配置,因此内核默认一定不是为mini2440配置的。这一点从mini2440用户手册第六章,定制 Linux 内核及制作文件系统中得到了验证。

解决方法很简单,友善之臂已经针对不同的LCD输出分别制作了相应的内核配置文件,配置文件就放在内核根目录下,是一些名为config_mini2440_xxx的文件。
直接使用即可,方法是直接将config_mini2440_w35文件重命名为.config文件即可:
#cp config_mini2440_w35 .config

这时候重新执行make menuconfig,进入Device Drivers -> Character devices 子菜单,成功发现新加入的驱动模块“SHT21 driver for Mini2440”,问题解决。

第四步:
在内核顶层目录下,执行make modules,稍等片刻,就可以看到,linux-2.6.32.2/drivers/char目录下成功生成我们所需要的内核模块文件SHT21.ko

参考资料:
Linux kernel的Makefile和Kconfig以及Make menuconfig的关系
Kconfig和Makefile的修改

你可能感兴趣的:(嵌入式系统)