把驱动编译进内核和编译成模块

关于把驱动编译进内核的文章,网络上面非常多,但是,我今天实际操作了一下,按照网络上面的方法,还是会遇到不少的问题,遂总结如下:

一、       驱动程序编译进内核的步骤

在 内核中增加程序需要完成以下五项工作:

1. 将编写的源代码复制到 Linux 内核源代码的相应目录;

2. 在目录的 Kconfig 文件中增加新源代码对应项目的编译配置选项;

3. 在目录的 Makefile 文件中增加对新源代码的编译条目。

4.在该目录的上一级目录的Kconfig文件中把上面第二步修改的Kconfig包括到此Kconfig中。

5.在该目录的上一级MakeFile中修改下,使得可以编译到该目录。

(第四、第五步一般情况下,内核的架构已经搭好,不需要改动,但是如果是在相应的驱动目录新建新的目录,那么是一定要改动的,在实际操作中,可能还会遇到问题的,那么还要进一步检查上一级目录的Makefile和Kconfig,还有关于添加依赖的问题,有些目录是某个配置已经配置才会编译到,都要灵活处理)

下面我以在4412板子上面的经历作个总结。

我要在该板子上面porting蓝牙驱动,步骤如下:

1.首先在drivers目录下面新建了一个目录bluetooth

2.然后将驱动的C文件和H文件放置到该目录。

3.然后从平行的目录中拷贝Kconfig文件和Makefile文件。

4.按照规则修改Kconfig文件和Makefile文件。

5.第五步是比较关键的一步,许多博客里面没有讲到。要检查bluetooth的目录的上一层目录的Kconfig文件和Makefile文件,看看有没有把相应的子目录bluetooth包含进去。如何没有包含进去,也是配置不了,或者编译不到。

6。执行make menuconfig 进行相应的配置,并进行编译、

7.make zImage 。如果最后编译出来还是出问题的话,考虑下各种Kconfig文件的依赖关系,必须所有的依赖都在.config里面配置了,才能生效。


 

二、以模块的方式编译驱动程序 2017-01-15

 主要分为如下的几部:

1.在drivers目录新建目录bluetooth

2.将驱动的C文件和H文件啊拷贝过来。

3.直接运行编译命令,或者编写相应的makefile,并运行make

运行的命令可以是:make -C ~/my_android.5.0/linux-3.0.86/ M=$(pwd) modules (这句话是编译的命令,也是makefile的核心)

以下附加一个普通的Makefile文件样子:

PWD = $(shell pwd)--
#obj-$(CONFIG_BT_RTKBTUSB)>->---+= rtk_btusb.o
#obj-m := btusb.o
KERNEL_DIR = /home/libs_liu/my_android.5.0/linux-3.0.86
obj-m := btusb.o
all:
>---$(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules
clean:
>---rm -f *.o *.ko *.mod.* *.order *.symvers

 关于该问题还有一个疑问?

如何在安卓启动的时候将驱动文件加载进系统,试过在各种init.rc里面添加,不知为何没有生效。

后来的一个折中的解决办法是:在init.tiny4412.sh 里面添加加载驱动的文件,并且是在一个已经存在的目录里面,我开始想在某个init.rc里面新建一个目录,可是没有成功,目前还不清楚原因。

posted @ 2017-01-09 20:00  雪山飞燕  阅读(1282)  评论(0编辑  收藏  举报