当我们写好驱动模块的代码后下一步就是编译,如果我们想让他和内核的其他驱动一样自动化编译完成,我们只需要实现自己的Makefile
可以写成如下:
obj-m:test.o #obj-y:test.o #obj-n:test.o
其中后面的
-m:表示编译成可装载模块,需要自己Insmod rmmod,比较灵活,适合调试或者升级替换,免除刷机。
-y:表示跟内核笔译在一起,成为不可拆分的一部分,不需要自己去insmod ,同时意味着更新这个驱动整个内核都需要更新,板子需要重新刷机,不便于调试。
-n:表示不编译该模块。
编译成模块后模块的名称是test.ko 编译只依赖test.c一个c文件如果有多个文件依赖,或者想自己定一个模块名称也可改成如下:
obj-m:=MODULE_NAME.o MODULE_NAME-objs:=file1.o file2.o file3.o
当然以上是山寨做法,标准的做法应该是实现Kconfig文件及Makefile,并且使用
make manuconfig
调出图形界面来配置。
Kconfig
# # IIC device configuration # menuconfig CHAR_I2C tristate "L io device support." default y ---help--- This is i2c char devices group. if CHAR_I2C config CHAR_I2C_TW8836 tristate "TW8836 MCU I2C DEVICE" depends on I2C ---help--- TW8836 Char device driver If you have a mcu chip working with an I2C bus say Yes and it will be accessible from within Linux. To compile this driver as a module, choose M here; the module will be called char_i2c_tw8836. endif #CHAR_I2C
Makefile
# # Makefile for the iic tw8836 device drivers. # obj-$(CONFIG_CHAR_I2C_TW8836) += tw8836.o
Kconfig中的内容就是提供给make manuconfig显示界面用的,其中CONFIG_CHAR_I2C_TW8836宏来控制这个模块的编译,这个模块又依赖IIC
make manuconfig配置保存后,会把内核配置文件更新成
.config
文件保存在内核编译目录下,内核编译的时候就会去找这个配置文件,将相应的配置结果更新的各个Makefile里面,此时CONFIG_CHAR_I2C_TW8836变成y /m/n