一、wifi基本架構
1、開源代碼移植部分(external目錄下)
wireless_tools、wpa_supplicant、wpa_supplicant_6(後兩項已經移植過)
生成庫libwpaclient.so和守護進程wpa_supplicant及iwconfig、iwlist等相關的測試程序
2、
hardware/libhardware_legary/wifi/wifi.c是wifi管理庫
生成libnetutils.so
同時會和wpa_supplicant守護進程通信
3、JNI部分
frameworks/base/core/jni/Android_net_wifi_Wifi.cpp 這個是無線connect、scan方面的調用
frameworks/base/core/jni/android_net_NetUtils.cpp 這個是管理網絡方面的工具,如dhcp、route、net en/unable等
4、JAVA部分
frameworks/base/services/java/com/android/server/
frameworks/base/wifi/java/android/net/wifi/
frameworks/base/core/java/android/net 這個是管理網絡的工具,調用第三條的第二個jni
5、WIFI Settings位於
packages/apps/Settings/src/com/android/settings/wifi/
6、WIFI驅動模塊 rt5370sta.ko(此驅動兼容使用ralink的好多種設備驅動,具體可以查看USB_DEVICE_ID)
wpa_supplicant通過wireless_ext 接口和驅動通信
7、WIFI 硬件模塊
D-Link DWA-125 芯片:ralink RT3070
二、wifi開發記錄
1、5370驅動編譯安裝及使用過程
set the "MODE = STA" in Makefile and chose the TARGET to Linux by set "TARGET = LINUX"
set 'HAS_WPA_SUPPLICANT=y' and 'HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y'
#wpa_supplicant -Dwext -iwlan0 -c wpa_supplicant.conf -d (-c這裡需要指定下wpa_supplicant.conf的路徑)
wpa_supplicant.conf 內容:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=wheel
network={
ssid="home"
scan_ssid=1
key_mgmt=WPA-PSK
psk="very secret passphrase"
} // 這個地方的大括號中的內容可在settings中點擊選擇某個ap後自動生成
#sudo su (android平台需要自己添加腳本編譯,和這裡寫的有差異)
#make clean
#make
#make install
#modprobe rt5370sta
#ifconfig wlan0 up
#iwconfig wlan0
#iwlist wlan0 scan 這時候已經可以掃描wi-fi網絡了
下面是dhcpcd wlan0即可。
2、幾個可執行程序:wpa_supplicant,wpa_cli等。wpa_supplicant是核心程序,它和wpa_cli的關系就是服務和客戶端的關系:後台運行wpa_supplicant,可以使用wpa_cli來搜索、設置、和連接網絡等,這兩個可執行程序很重要
在android中主要是Settings這個屬於system的進程調用的libhardware_legecy庫中的wifi.c文件和wpa_supplicant通信,同時也調用了wpa_supplicant中提供的libwpa_client.so庫,這兩個進程間通過socket通信收發數據來得到當前狀態,同時也是通過wifi.c來啟動和停止init.rc中的wpa_supplicant進程。
dhcpcd用來自動獲取ip。
iwconfig iwevent iwgetid iwlist iwpriv iwspy這幾個是測試命令,可用來測試wifi當前的情況,以及scan ap等。
3、以上是命令測試過程,下面進行代碼的修改部分說明(broadcom BCM7231)
wpa_supplicant 和wpa_cli原生android2.3已經移植,但是沒有wireless tool工具,需要將工具移植進來,
不過這些工具相對都比較容易移植,不再詳述,下載源碼位置如下
http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html。
然後從驅動開始修改起
1)修改5370驅動
設備名include/rtmp_def.h 修改兩個宏定義從ra0修改為wlan0;
LINUX_SRC=... (android的kernel位置)
ifeq($(PLATFORM),BCM7431)
LINUX_SRC= ${ANDROID_PATH}/kernel #修改path為你的android目錄
endif
驅動編譯後會生成兩個文件:RT5370STA.ko 和RT2870STA.dat,後面
會看到需要拷貝這兩個文件到系統中。
ioctl 驅動代碼接口在os/linux/sta_ioctl.c 及 sta/sta_cfg.c中,如果遇到一些錯誤,一般在這裡都能查找到.
2)把rt5370sta.ko拷貝到.../lib/modules目錄中
include$(CLEAR_VARS)
LOCAL_MODULE := rt5370sta.ko
LOCAL_MODULE_TAGS:= user
LOCAL_MODULE_CLASS:= SHARED_LIBRARIES
LOCAL_MODULE_PATH:= $(TARGET_OUT_SHARED_LIBRARIES)/modules
LOCAL_SRC_FILES:= ${RT5370_PATH}/rt5370sta.ko #PATH
include$(BUILD_PREBUILT)
3) 查看wifi.c文件ko路徑及名字是否正確,若不正確需要修改正確
4) 修改init.rc文件
chmod 0771 /system/etc/wifi wifi wifi
chmod 0660 /system/etc/wifi/wpa_supplicant.conf
chown wifi wifi /system/etc/wifi/wpa_supplicant.conf
mkdir /data/misc/wifi 0771 wifi wifi
mkdir /data/misc/wifi/sockets 0771 wifi wifi
#wpa_supplicant socket
mkdir /data/system/ 0771 system system
mkdir /data/system/wpa_supplicant 0771 wifi wifi
mkdir /data/misc/dhcp 0771 system system
chmod 0777 /system/etc/dhcpcd/dhcpcd-run-hooks
chmod 0777 /data/misc/dhcp/
mountyaffs2 mtd@system /system ro remount
setprop wifi.interface wlan0
service wpa_supplicant /system/bin/wpa_supplicant -dd -Dwext -iwlan0 -c/system/etc/wifi/wpa_supplicant.conf
#group system wifi inet
disabled
oneshot
service dhcpcd_wlan0 /system/bin/dhcpcd wlan0 // 這裡的service需要修改為dhcpcd_wlan0(android2.2 和2.3有差異,我這裡是2.3),而不是dhcpcd!
group system dhcp
disabled
oneshot