修改了一个同学编写的基于i2c接口的气压传感器sht21驱动,文件名SHT21.c,文件中将sht21注册成字符设备,现需要将驱动重新编译。
按照mini2440用户手册7.3.3节的步骤,将SHT21 module加入内核代码树并编译,
第一步:
编辑配置文件Kconfig,加入驱动选项,使之在make menuconfig 的时候出现
打开 Linux-2.6.32.2/drivers/char/Kconfig 文件,找到下述片段:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
然后直接复制一遍,照葫芦画瓢,稍作修改:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
保存文件即可。
第二步:
打开 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 菜单中看到刚才所添加的选项了,按下空格键将会选择为
<M>
,此意为要把该选项编译为模块方式;再按下空格会变为<*>
,意为要把该选项编译到内核中。
这是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的修改