天天看点

Android imx6平台 iw移植笔记

花了三天时间终于把iw工具移植到android平台,硬件环境imx6,wifi芯片WL1271。移植还是费了不小的力气,走了不少弯路。现在把详细过程记录一些,便于日后可能还会用到,或许有其他人做类似的工作时能做些参考。

1,下载源码iw

资源在:http://git.sipsolutions.net/?p=iw.git

git://git.sipsolutions.net/iw.git

虽然获取了源码,但是还担心能不能用。看到有sungsang/intel的工程师在维护,提交代码,并且最近还有更新,相比凑合应该能用。

iw还依赖小伙伴libnl,

资源在:http://www.infradead.org/~tgr/libnl/files/

这个比较官方,用起来比较踏实。里面有众多版本任君选择,我同时下了libnl-1.1.4.tar.gz 和libnl-doc-3.2.25.tar.gz 供选择

2,代码下载下来后,接着要做的就是交叉编译

这个耗费了鄙人大量的时间和精力,一度想放弃。

首先编译的是libnl。 最早我的想法是把他们放到android项目源码里面编译,事实证明这个行不通。上述工具适用于众多软件平台而不仅限于android,自然也不会为android专门做套编译脚本。我没那么多时间为了让他们融入android编译系统而去写脚本。然后想到了用android自带的ndk工具,配合android prebuilt的toolchain工具链去编译这两个小项目,结果是,虽然我想尽了办法还是失败了。

网上很多人列出这些命令,就能轻松搞定

    ./configure --prefix=/绝对路径 CC=arm-linux-gcc --host=arm     make     make install

但是我遇到的问题没这么轻松。./configure的时候,用android自带的编译器arm-linux-androideabi-gcc,--prefix=...  --host=...  --with-sysroot=... 辅助以各种CFLAGS='-Ixxx/.../xxx/include'  LDFLAGS='-Lxxx/.../xxx/lib -lc -ldl -nostdlib'  各种组合,报了各种各样,没完没了的错误。   如 ......./ld: error: cannot open crtbegin_dynamic.o: No such file or directory;

........../ld: error: cannot open crtend_android.o: No such file or directory;  还有各种各样很普通函数的undefined........

在遇到这些问题的时候,我开始想用各种CFLAGS='-I...'  LDFLAGS='-L...'试图解决,也确实解决了部分error,但是问题依然是无穷无尽。然后我开始怀疑交叉编译工具了。网上看了些帖子,说是要将toolchain 从 android ndk 里面分离出来。另外发现了ndk自带的文档说明 android/ndk/docs/STANDALONE-TOOLCHAIN.html.   分离命令是:

$(NDK)/build/tools/make-standalone-toolchain.sh  --platform=android-14  --install-dir=/tmp/my_toolchain

然后我还是执迷不悟地想在android 自带的ndk里面分离出来toolchain命令编译开源软件项目。事实再次证明我这么做是瞎折腾。android源码里面的ndk能不能分离出来toolchain,答案是未知的,至少网上我是没看到,我也没做到。后面想到了直接下载官方的和我们当前代码匹配的ndk, 下载下来后, 解压,然后用该命令分离,这次比较容易的成功了。在这里mark一下, 因为这是整个过程很关键的一步。

      再用分离出来的toolchain来编译libnl库就没有之前那么蛋疼了,但是问题还是有的。

先列出最终编译成功的命令:

./configure --prefix=/tmp/  CC=arm-linux-androideabi-gcc  --host=arm  --with-sysroot=/tmp/my_toolchain/sysroot  LDFLAGS='-L/tmp/libnl-1.1.4/lib -lnl -nostdlib'

make

make install

上面操作在./configure的时候提示过少了libpthread.so库,查得这个库何该软件的兼容性有关,而这个我不是很关心,直接在configure里面把涉及到-lpthread的地方干掉。没费太大力气这一步可以通过。 然后在make的时候报了一些错误, 由于我的libnl-1.1.4这个版本太低了,不是我不想用另外一个新的版本 libnl-doc-3.2.25, 而是因为编译这个新版本的时候遇到的问题更多。解决这些问题没有其他办法,只有手动fix, 适配自己的平台及版本库。回头把我做过的改动也发出来。

手动解决编译libnl-1.1.4和iw遇到的问题的时候, 参考过这些帖子:

VLAN_FLAG_REORDER_HDR未定义:                                  http://bbs.chinaunix.net/thread-3749052-1-1.html

__bswap_64未定义:                                                                    http://blog.chinaunix.net/uid-25267728-id-3791301.html

旧的linux/genetlink.h里面定义的一些编译要用到的数据结构: http://code.taobao.org/p/taocode_svn_root/src/linux_include/usr/include/linux/genetlink.h

解决完编译问题后,得到了可执行的iw,  libnl.a,  libnl.so,  libnl.so.1, libnl.so.1.1.4, push到目标平台上,放到合适的位置,运行iw list,显示出我们想看到的信息。至此移植iw基本完工。我的终极目的是让wl1271工作在master mode。下一步要做的是让hostapd正常工作起来,完成之后再更新。

继续阅读