安卓内核驱动编译的方法——自我感悟

学习linux的时候,一般有两种方法。一种是配置Kconfig与Makefile文件,接着使用make menuconfig来实现内核的添加。还有一种是将驱动编译为.ko文件,通过insmod的方式来加载。

可最近在编译安卓源码,发现这样子行不通。当让,第二种方法是可以的。需要用adb工具,将驱动文件添加到手机内部,然后加载,这种方式对于要调TP驱动的我来说不是很方便。于是尝试使用第一种方法,make menuconfig,接着就在kernel目录下产生了.config文件,与在kernel/include/下产生了config的空文件夹。前者用来存放要编译的驱动信息,后者不知道。

在添加完驱动后,在安卓顶层目录下编译内核:make kernel 2>1& | tee log.txt  结果出现错误:is not clean, please run 'make mrproper'  经过查找原因:grep -nR "is not clean, please run 'make mrproper' " *   发现是kernel顶层目录的Makefile文件里的提示语句。于是删除上述两个文件.config与config文件夹。再次编译,没有报错。

这样就产生了矛盾,于是在第一种方法的基础上不使用make menuconfig。在kernel/arch/arm/configs/目录下有对应平台的后缀为decongfig文件,在文件中添加选项并赋值为y即可。如果想查看文件是否被编译,则在文件中添加错误的代码,编译报错则代表成功。

转念一想,驱动的Makefile都是有固定格式的,如obj-y += 文件名.o  表示将驱动编译进内核,obj-m += 文件名.o 表示将驱动编译成模块。这样子,我们只需要将Makefile文件中的变量直接用y来代替即可,这样就可以将驱动编译进内核。当然,这样做要保证需要编译的部分已经在Makefile的编译流程中。

如果是子目录,就需要被上级目录的Makefile所包含。可以在确定会被编译的目录中新建一个子目录xxx,在当前文件夹下的Makefile 中添加 obj-y +=xxx/ 。然后在xxx目录下新建Makefile,在Makefile 中添加 obj-y += 文件名.o 即可。

下图作为参考

 

今天终于知道原因了(ps:引用大神博客,链接

Android编译kernel时make menuconfig是没有作用的

Android 中编译时会以arch/arm64/configs/xxxdefconfig和各级kconfig文件生成到out\target\product\msm8953_64\obj\KERNEL_OBJ\.config。

执行完Make menuconfig 在对android进行全编,menuconfig的操作是无效的,因为android下编译脚本去out\target\product\msm8953_64\obj\KERNEL_OBJ\目录寻找.config 文件,而menuconfig生成在kernel根目录,除非将menuconfig生成的.config替换掉arch/arm64/configs/xxxdefconfig文件。


 

展开阅读全文

没有更多推荐了,返回首页