折腾两天终于把驱动编译出来了.
正确的编译方便 不像 AndroidA10(4.0.3)系统编译详解.pdf那样.
先说说这个文档介绍的方法的毛病.
如果按照它的顺序: (最好先 make mrproper)make menuconfig 返回上层, build.sh
最后得到的.config 有几个不是我们想要的.
CONFIG_ARCH_SUN4I 没有选上,CONFIG_ARCH_VERSATILE is not set 被选上了.然后可能会出现wifi的某些模块出现问题.这些模块的编译由 makefile.26执行. 具体在哪没记录下来.
然后手动编辑 .config 把相关config n掉就好.
这样编译内核是成功了.驱动编译会出问题.通过配置
CONFIG_CMDLINE_FROM_BOOTLOADER# CONFIG_CMDLINE_EXTEND
# CONFIG_CMDLINE_FORCE
可以编译驱动..但是insmod时会因为版本不适加载不了.回头看编译过程,发现警告,内核源码根目录缺少Module.symvers. 到现在我还不清楚这个文件是干哈子用的.但是至少它有一个功能,可以为驱动(ko文件)提供内核版本号.
又bing 了半天才搜到generate Module.symvers. 国外的一个帖子.......懒得贴了.
其实就是一个 make modules 命令.
如果按照那个pdf的方法,这时候才会发现原来根本没有按CONFIG_ARCH_SUN4I 配置编译内核.
又bing了半天....在这个帖子找到编译方法
http://m.oschina.net/blog/83234
#cd lichee/linux-3.0 #make clean 如果你之前没有编译过那么这一步就不用了 #make ARCH=arm sun4i_crane_defconfig -->我的产品是sun4i_crane,这个一步是为了省略将来编译的时候让你选择ARM system type列出的选项
#./build.sh -p sun4i_crane -k 3.0 参数-k表示选择的内核版本
说道这里,坛里有人说可以#./build.sh -p sun4i_crane 后编译驱动,我看了下build.sh脚本,这条命令和上面区别只是这条把内核当默认(2.6)编译了.我试了下还是不行.
最后按上面的方法编译还是会有点问题.手动修改.config解决. 最后./build.sh 后提示example模块不在.没有像帖子里说的那样成功返回. 但其实内核已经生成好了.这对我们就够用了.回到 linux-3.0 make modules ,有错误 继续手动修改.config解决.make modules 成功后就生成 Module.symvers文件了.此时自己的驱动文件夹 make -C $(KERN_DIR) M=`pwd` modules
&& adb push 命令&& adb insmod 命令
加载成功!!
写起来看似顺利.其实我走了很多弯路,以上过程有些是先做了后面发现问题不应该这样解决又回去头来重新理清思路.
确实学了不少东西,特别是关于Makefile shell脚本的.
像这样的一条语句
$(warning SUBARCH)
$(warning $(SUBARCH))
可以在Makefile执行时打印这个变量.这个小技巧是我在一个不到2页的一个提问帖里的一个楼层找到的.超级有用!!!
end 碎觉! |