Android4.2调试RT3070 WiFi模块
历时4天,终于有所收获,今天来总结一下。
周一
1.PC ubuntu上测试该WiFi模块
得出两个结果,ubuntu12.10是支持这个WiFi模块的驱动是rt2x00usb和rt2x00lib等等,产品id:148f:3070。同样也带来了一些困惑怎么会那么多模块呢?Rtl8192cu的就一个模块,这到Android上怎么办呢?了解到标准linux的驱动和各个厂商的驱动是不同步的,前者要之后后者一些,于是我继续做了以下的事。
拆WiFi模块了解具体型号
对于型号有点模糊,了解具体型号最好的方法就是拆机,直接看芯片上的型号,这样一点也不会模糊了,于是动手拆了该WiFi模块,看到芯片的型号如下:
Ralink
RT3070L
TPKY371F9
1234PT
确定其真正型号为RT3070!
2.找官方最新驱动
找到这里是!号外:这个型号叫Ralink(雷凌)现在已经并入了MTK(联发科)。
RT3070驱动下载地址:http://www.mediatek.com/_en/07_downloads/01_windows.php?sn=501
3.编译驱动模块
编译过程很曲折,还好保留了过程(这里),用GIT记录了,并记录了每次改动。这里看一下git log:
commit 2f3f683eec43ce123017b5302002e14e01367a2b
Author: ybk
Date: Thu Dec 26 10:59:28 2013 +0800
change fw path
commit 742c1b56346de3f1ea79b59aae688c5d8cf30561
Author: kangear
Date: Wed Dec 25 16:29:52 2013 +0800
更新的ifname 和if2name的位置和名字
commit 1334bbcffc59321fee262d5ca3970a5208a85da6
Author: ybk
Date: Wed Dec 25 13:08:03 2013 +0800
add module_param ifname if2name
commit 35bed3ef00ed8ff38238d18a3895f05fc490d7be
Author: ybk
Date: Tue Dec 24 14:39:11 2013 +0800
Fix: Supplicant not running, cannot connect
commit ed54e07e671c903e0cf73691d185ad43240c0a33
Author: ybk
Date: Tue Dec 24 14:23:55 2013 +0800
v1.0 succeed cmd
commit 7c0d98a75ab0df239c0defc4f09a27b13d9fd801
Author: ybk
Date: Tue Dec 24 14:18:49 2013 +0800
0.0 version
今天的主要参考文档是[1]和[2].
周二
情况并不容乐观,险些要放弃,因为回头想想我还没有为Android编译过WiFi驱动模块,我潜意识里觉得我编译的驱动模块一定是缺少什么东西的。至少现在驱动模块可以编译过,插入内核模块正常,但是我通过busybox ifconfig并没有看到wlan或者其它。
1.找到网络接口
调试Android驱动最重要的是确定问题在哪一层,一层一场的来搞定。层层是耦合性很松的,可以单独调试某层。现在是网络接口并没有看到,问题是在哪呢?看这个文章《wifi模块rt3070的arm+linux移植 》看到ifconfig后还可以跟-a参数,于是赶紧查查这个是什么意思,是显示所有的网络接口,使用了一下,果真出现了ra0。着实兴奋,然后就是改接口名字为wlan0,这个属于驱动编译决定的。
2.手动启动并扫描AP.
(1).#busybox ifconfig -a # 查看所有网络接口
(2). # busybox ifconfig wlan0 up # 使用该网卡
(3). # iwlist wlan0 scan # 搜索AP 并记下ESSID这里以ChinaNet为例。
(4). # iwconfig wlan0 essid ChinaNet #连接无密码的ESSID,为了测试专门设置一个无密码的。
(5). # dhcp wlan0 # 获取ip地址
(6). # busybox ifconfig #再看网卡状态,可以看到已经成功获取ip地址了。
(7). # ping 115.29.210.26 #先ping百度ip.(最好ping百度,Google不建议)
(8). # ping www.baidu.com #ping百度域名 成功。
周三
这天先做了很多杂事,把固件路径规划一下,这个还是和驱动编译有关,改了重新编译驱动就可以了。重点是手动启动wpa_supplicant。wpa_supplicant具体错误是:
Supplicant not running, cannot connect.
1.手动启动wpa_supplicant
当驱动模块没有问题的时候,我就强行上它上路了,但是从Settings中打开的时候,模块抛入成功-》wpa_supplicant启动失败,所以要找找启动不起来的原因了。
遇到了两个疑惑,看到的例子是使用的wext协议启动的,而目前Android BSP上带的几个都是用nl80211启动的。通过尝试RT3070适合的是wext协议。wpa_supplicant正常启动后,启动端会有响应,可以从/proc/kmsg中看出。最终定下来的启动参数为:
service rt_supplicant /system/bin/wpa_supplicant \
-Dwext -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf
#-Dnl80211 -iwlan0 -puse_p2p_group_interface=1 -e/data/misc/wifi/entropy.bin
# we will start as root and wpa_supplicant will switch to user wifi
# after setting up the capabilities required for WEXT
# user wifi
# group wifi inet keystore
class main
socket wpa_wlan0 dgram 660 wifi wifi
disabled
Oneshot
添加到init.rk30board.rc中,然后以在hardware/libhardware_legacy/wifi/wifi.c中判断如果是RT3070就启动rt_supplicant。以区别用其它协议启动的wpa_supplicant。
意外上路
这次再次将wifi模块上路,从Settings中直接打开看流程,很意外,上路正常,顺利搜索到AP上。连接网络测试,一切OK。
周四
今天就剩下整理代码和文档了,这两项可并不是小事。整理代码包括规范代码,和去除添加的调试信息。记录文档是因为记忆是会消失的,但是记录的文字可不会。所以记录文档还要好好的记录。
类型:RT3070
模块:rt3070sta.ko
参数:ifname=wlan0 if2name=p2p0
协议:wext
固件:/etc/firmware/RT2870STA.dat
最后的优化,关于AP模式还是有一点问题的,可以在接下来的时间解决它。具体的错误是:Unable to open connection to supplicant on "/data/misc/wifi/sockets/p2p0": No such file or directory
最新跟踪:
上边的总结有过不严谨,现在的问题是:Unable to open connection to supplicant on "/data/misc/wifi/sockets/p2p0": Connection refused。
这里的p2p0和softap没有关系,是Android和wpa_supplicant以nl80211通信所用的socket。出错也无妨。
参考文档:
[1] 《 wifi模块rt3070的arm+linux移植 》
[2] 《android wifi ralink rt3070开发记录》
[3] 《ubuntu下命令行连接wifi》