歷時4天,終於有所收獲,今天來總結一下。
1.PC Ubuntu上測試該WiFi模塊
得出兩個結果,Ubuntu 12.10是支持這個WiFi模塊的驅動是rt2x00usb和rt2x00lib等等,產品id:148f:3070。同樣也帶來了一些困惑怎麼會那麼多模塊呢?Rtl8192cu的就一個模塊,這到Android上怎麼辦呢?了解到標准linux的驅動和各個廠商的驅動是不同步的,前者要之後後者一些,於是我繼續做了以下的事。
拆WiFi模塊了解具體型號
對於型號有點模糊,了解具體型號最好的方法就是拆機,直接看芯片上的型號,這樣一點也不會模糊了,於是動手拆了該WiFi模塊,看到芯片的型號如下:
確定其真正型號為RT3070!
2.找官方最新驅動
找到這裡是!號外:這個型號叫Ralink(雷凌)現在已經並入了MTK(聯發科)。
RT3070驅動下載地址:http://www.mediatek.com/_en/07_downloads/01_windows.php?sn=501
3.編譯驅動模塊
編譯過程很曲折,還好保留了過程,用GIT記錄了,並記錄了每次改動。這裡看一下git log:
相關文件下載
免費下載地址在 http://linux.linuxidc.com/
用戶名與密碼都是www.linuxidc.com
具體下載目錄在 /2014年資料/3月/4日/Android 4.2調試RT3070 WiFi模塊
下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm
今天的主要參考文檔:
1.《 WIFI模塊RT3070的ARM Linux移植 》 http://www.linuxidc.com/Linux/2014-03/97630.htm
2.《Android WIFI Ralink RT3070開發記錄 》 http://www.linuxidc.com/Linux/2014-03/97631.htm
情況並不容樂觀,險些要放棄,因為回頭想想我還沒有為Android編譯過WiFi驅動模塊,我潛意識裡覺得我編譯的驅動模塊一定是缺少什麼東西的。至少現在驅動模塊可以編譯過,插入內核模塊正常,但是我通過busybox ifconfig並沒有看到wlan或者其它。
1.找到網絡接口
調試Android驅動最重要的是確定問題在哪一層,一層一場的來搞定。層層是耦合性很松的,可以單獨調試某層。現在是網絡接口並沒有看到,問題是在哪呢?看這個文章《wifi模塊rt3070的arm+linux移植 》看到ifconfig後還可以跟-a參數,於是趕緊查查這個是什麼意思,是顯示所有的網絡接口,使用了一下,果真出現了ra0。著實興奮,然後就是改接口名字為wlan0,這個屬於驅動編譯決定的。
2.手動啟動並掃描AP.
(1).#busybox ifocnfig -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。