5) 修改external/wpa_supplicant/driver_wext.c
这是为了避免wpa_supplicant与下层驱动通讯时出现ioctl[SIOCSIWPRIV]错误,因为现在大部分wifi模块对SIOCSIWPRIV命令不处理,而这个命令要用于侦测wifi强度RSSI的,比较简单的方法是在wifi驱动中增加个空函数或者修改调用的返回值为0。由于大多数模块不支持SIOCSIWPRIV,所以目前采用修改调用的返回值的方法。修改:froyo\external\wpa_supplicant\driver_wext.c
wpa_driver_priv_driver_cmd()函数中:
// if((ret = ioctl(drv->ioctl_sock, SIOCSIWPRIV, &iwr)) < 0) {
//perror("ioctl[SIOCSIWPRIV]");
// }
// 如果这里不注释掉,将导致系统不断报错,错误为 IOCTL::unknownIOCTL's cmd = 0x00008b0c,我跟踪了下代码驱动中并没有这个ioctl,
另外在wpa_supplicant的头文件中也显示未使用,但是在代码中却用了这个ioctl,所以必须把这段代码删除!
6) 修改Android打开WIFI流程
经测试5370模块在ifconfig wlan0 down时配置
iwconfig wlan0 mode Managed会出错,Android代码中的配置过程也是这样,表现就是关闭WIFI重新打开后扫描不到AP,修改:mips-gingerbread\frameworks\base\wifi\java\android\net\wifi\WifiStateTracker.java
public void resetConnections(boolean disableInterface)
if(disableInterface){
//if(LOCAL_LOGD) Log.d(TAG, "Disabling interface");
//NetworkUtils.disableInterface(mInterfaceName);
} //此处若不修改将导致wifi关闭后再次开启,scan不到ap!
#netcfg
lo UP 127.0.0.1 255.0.0.0 0x00000049
eth0 UP 10.20.112.46 255.255.255.0 0x00001043
wlan0 DOWN 0.0.0.0 0.0.0.0 0x00001002
#iwconfig wlan0 mode Managed
Error for wireless request "Set Mode" (8B06) :
SET failed on device wlan0 ; Network is down.
#iwconfig wlan0 nickname "RobinYeung"
Error for wireless request "Set Nickname" (8B1C) :
SET failed on device wlan0 ; Network is down.
上面java代码的调用函数为:
static jint android_net_utils_disableInterface(JNIEnv* env, jobject clazz, jstring ifname)
{
int result;
const char *nameStr = env->GetStringUTFChars(ifname, NULL);
result = ::ifc_disable(nameStr);
env->ReleaseStringUTFChars(ifname, nameStr);
return (jint)result;
}
此jni函数又调用了ifc_disable函数,如下:
int ifc_disable(const char *ifname)
{
int result;
ifc_init(); // 调用socket函数,得到fd
result = ifc_down(ifname); // 通过ioctl设定到内核
ifc_set_addr(ifname, 0);
ifc_close(); // 关闭fd
return result;
}
ifc_down函数
int ifc_down(const char *name)
{
return ifc_set_flags(name, 0, IFF_UP);
}
static int ifc_set_flags(const char *name, unsigned set, unsigned clr)
{
struct ifreq ifr;
ifc_init_ifr(name, &ifr);
if(ioctl(ifc_ctl_sock, SIOCGIFFLAGS, &ifr) < 0) return -1;
ifr.ifr_flags = (ifr.ifr_flags & (~clr)) | set;
return ioctl(ifc_ctl_sock, SIOCSIFFLAGS, &ifr);
}
down时flags & fffffffe,然后通过ioctl 设定到kernel。
7) 创建wpa_supplicant.conf文件
在你的board配置目录下MIPSAndroid_Phase2.1/bcm_mipsgingerbread20111129/AppLibs/opensource/android/src/mips-gingerbread/vendor/broadcom/bcm_platform/prebuilt创建一个wpa_supplicant.conf文件,输入如下内容:
ctrl_interface=DIR=/data/system/wpa_supplicant GROUP=wifi
update_config=1
ap_scan=1
8)修改board配置目录下的AndroidBoard.mk
在MIPSAndroid_Phase2.1/bcm_mipsgingerbread20111129/AppLibs/opensource/android/src/mips-gingerbread/vendor/broadcom/bcm_platform/Android.mk 或AndroidBoard.mk下增加如下代码:
include$(CLEAR_VARS)
LOCAL_MODULE:= wpa_supplicant.conf
LOCAL_MODULE_TAGS:= user
LOCAL_MODULE_CLASS:= ETC
LOCAL_MODULE_PATH:= $(TARGET_OUT_ETC)/wifi
LOCAL_SRC_FILES:= $(LOCAL_MODULE)
include$(BUILD_PREBUILT)
9)少了一个步骤,就是拷贝RT2870STA.dat到etc下
include $(CLEAR_VARS)
LOCAL_MODULE := RT2870STA.dat
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/Wireless/RT2870STA
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)
10) make clean 然后
根据您的脚本build android or all