关于把驱动编译进内核的文章,网络上面非常多,但是,我今天实际操作了一下,按照网络上面的方法,还是会遇到不少的问题,遂总结如下:
一、 驱动程序编译进内核的步骤
在 内核中增加程序需要完成以下五项工作:
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里面新建一个目录,可是没有成功,目前还不清楚原因。