Android WIFI Ralink RT3070开发记录(2)

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/93fe648b6176506667ec2b780329b1b4.html