一、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工具,需要将工具移植进来,
不过这些工具相对都比较容易移植,不再详述,下载源码位置如下
然后从驱动开始修改起
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
servicedhcpcd_wlan0/system/bin/dhcpcd wlan0// 这里的service需要修改为dhcpcd_wlan0(android2.2 和2.3有差异,我这里是2.3),而不是dhcpcd!
group system dhcp
disabled
oneshot