Android 4.2上调试RT3070 WiFi模块

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

Android 4.2上调试RT3070 WiFi模块_第1张图片

最新跟踪:

         上边的总结有过不严谨,现在的问题是: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》

你可能感兴趣的:(Android)