方式1常用于编写,调试阶段。驱动源码的文件夹位置独立自由,只要在Makefile中指定好Linux内核源码的路径。
方式2常用于最后集成阶段,在调试基本完成后,可以将驱动源代码文件(夹)放置在Linux内核源码的driver/xxx/的相应路径中,修改本层和上层的Makefile和KConfig文件,并重新make menuconfig内核,可以在Menu中选中新加入的驱动模块,然后make module,就可以在驱动源码文件夹生成.ko文件。
方式1:
本地Makefile文件内容如下:
- ifeq ($(KERNELRELEASE),) #开始满足这个条件
- KERNELDIR ?= /opt/xxxxxx/linux-2.6.32.2 #指定Linux内核目录位置
- PWD := $(shell pwd) #打印当前驱动源码的本地位置
- modules: #编译为驱动模块
- $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
- #-C 指定内核Makefile的路径,可以使用相对路径。
- #-M 指定要编译的文件的路径,同样可以使用相对路径。
- modules_install:
- $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
- clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions modules.order Module.symvers
- .PHONY: modules modules_install clean
- else #再次读取这个Makefile文件时,下面的执行
- MODULE_NAME := ecat #指定驱动模块的名字
- # 注意:驱动模块的名字 千万 不能和本文件夹内的任何文件同名!
- RESMAIN_CORE_OBJS := ecat2440.o #指定驱动模块的核心文件(有init 和 exit)
- RESMAIN_GLUE_OBJS := ecateoe.o eoeappl.o mcihw.o ecatslv.o mailbox.o ecatappl.o #依赖文件
- $(MODULE_NAME)-objs := $(RESMAIN_GLUE_OBJS) $(RESMAIN_CORE_OBJS)
- #xxx-objs := 指定驱动模块的所有依赖文件
- obj-m := ecat.o #最终由xxx-objs链接生成ecat.o,再生成ecat.ko
- endif
- # change by myself for test
方式2:
1. 本地Makefile
- #CONFIG_ECAT_DRV为m时编译为模块,为y时编进内核
- obj-$(CONFIG_ECAT_DRV) += ecat.o
- #-objs指定依赖的多个.o文件
- ecat-objs := ecateoe.o eoeappl.o mcihw.o ecatslv.o mailbox.o ecatappl.o ecat2440.o
2. 本地Kconfig
- #建立一个本地子目录。“”为显示的目录名字
- menu "ecat driver here"
- depends on NET #依赖于上层的某个开关
- config ECAT_DRV #配置变量名,必须和Makefile中的变量后半段一样
- bool "ecat driver" #bool量, 显示的名字
- ---help--- #下面为要显示的帮助文字
- This is test for ecat.
- endmenu #本地子目录结束
3. 上层Makefile
- *
- *#添加下面这一句
- obj-$(CONFIG_ECAT_DRV) += ecat/ #打开下一级目录编译
- *
- *
4. 上层Kconfig
- *
- *#添加下面这一句
- source "driver/xxx/ecat/Kconfig"
- #导入子文件夹中的Kconfig文件,可以为相对路径
- *
- *
转载自:http://blog.csdn.net/keyearth/article/details/6338614