wifi enable

wifiservice.java wifistateMachine.java中


/**
* see {@link android.net.wifi.WifiManager#setWifiEnabled(boolean)}
* @param enable {@code true} to enable, {@code false} to disable.
* @return {@code true} if the enable/disable operation was
* started or is already in the queue.
*/
public synchronized boolean setWifiEnabled(boolean enable) {
enforceChangePermission();
Slog.d(TAG, "setWifiEnabled: " + enable + " pid=" + Binder.getCallingPid()
+ ", uid=" + Binder.getCallingUid());
if (DBG) {
Slog.e(TAG, "Invoking mWifiStateMachine.setWifiEnabled\n");
}

if (enable) {
reportStartWorkSource();
}
mWifiStateMachine.setWifiEnabled(enable);

/*
* Caller might not have WRITE_SECURE_SETTINGS,
* only CHANGE_WIFI_STATE is enforced
*/

long ident = Binder.clearCallingIdentity();
try {
handleWifiToggled(enable);
} finally {
Binder.restoreCallingIdentity(ident);
}

if (enable) {
if (!mIsReceiverRegistered) {
registerForBroadcasts();
mIsReceiverRegistered = true;
}
} else if (mIsReceiverRegistered) {
mContext.unregisterReceiver(mReceiver);
mIsReceiverRegistered = false;
}

return true;
}


public void setWifiEnabled(boolean enable) {
mLastEnableUid.set(Binder.getCallingUid());
if (enable) {
/* Argument is the state that is entered prior to load */
sendMessage(obtainMessage(CMD_LOAD_DRIVER, WIFI_STATE_ENABLING, 0));
sendMessage(CMD_START_SUPPLICANT);
} else {
sendMessage(CMD_STOP_SUPPLICANT);
/* Argument is the state that is entered upon success */
sendMessage(obtainMessage(CMD_UNLOAD_DRIVER, WIFI_STATE_DISABLED, 0));
}
}

当前stateMachine应为DriverUnloadedState,转到mDriverLoadingState状态


class DriverUnloadedState extends State {
@Override
public void enter() {
if (DBG) log(getName() + "\n");
EventLog.writeEvent(EVENTLOG_WIFI_STATE_CHANGED, getName());
}
@Override
public boolean processMessage(Message message) {
if (DBG) log(getName() + message.toString() + "\n");
switch (message.what) {
case CMD_LOAD_DRIVER:
transitionTo(mDriverLoadingState);
break;
default:
return NOT_HANDLED;
}
return HANDLED;
}
}


class DriverLoadingState extends State {
@Override
public void enter() {
if (DBG) log(getName() + "\n");
EventLog.writeEvent(EVENTLOG_WIFI_STATE_CHANGED, getName());

final Message message = new Message();
message.copyFrom(getCurrentMessage());
/* TODO: add a timeout to fail when driver load is hung.
* Similarly for driver unload.
*/
new Thread(new Runnable() {
public void run() {
mWakeLock.acquire();
//enabling state
switch(message.arg1) {
case WIFI_STATE_ENABLING:
setWifiState(WIFI_STATE_ENABLING);
break;
case WIFI_AP_STATE_ENABLING:
setWifiApState(WIFI_AP_STATE_ENABLING);
break;
}

if(mWifiNative.loadDriver()) {
if (DBG) log("Driver load successful");
sendMessage(CMD_LOAD_DRIVER_SUCCESS);
} else {
loge("Failed to load driver!");
switch(message.arg1) {
case WIFI_STATE_ENABLING:
setWifiState(WIFI_STATE_UNKNOWN);
break;
case WIFI_AP_STATE_ENABLING:
setWifiApState(WIFI_AP_STATE_FAILED);
break;
}
sendMessage(CMD_LOAD_DRIVER_FAILURE);
}
mWakeLock.release();
}
}).start();
}

@Override
public boolean processMessage(Message message) {
if (DBG) log(getName() + message.toString() + "\n");
switch (message.what) {
case CMD_LOAD_DRIVER_SUCCESS:
transitionTo(mDriverLoadedState);
break;
case CMD_LOAD_DRIVER_FAILURE:
transitionTo(mDriverFailedState);
break;
case CMD_LOAD_DRIVER:
case CMD_UNLOAD_DRIVER:
case CMD_START_SUPPLICANT:
case CMD_STOP_SUPPLICANT:
case CMD_START_AP:
case CMD_STOP_AP:
case CMD_START_DRIVER:
case CMD_STOP_DRIVER:
case CMD_SET_SCAN_MODE:
case CMD_SET_SCAN_TYPE:
case CMD_SET_COUNTRY_CODE:
case CMD_SET_FREQUENCY_BAND:
case CMD_START_PACKET_FILTERING:
case CMD_STOP_PACKET_FILTERING:
deferMessage(message);
break;
default:
return NOT_HANDLED;
}
return HANDLED;
}
}

在DriverLoadingState 中产生第一个native函数:mWifiNative.loadDriver

通过JNI最终调用到wifi.c,


int wifi_load_driver()
{
do_wifi_workaround();// leon 1
#ifdef WIFI_DRIVER_MODULE_PATH
char driver_status[PROPERTY_VALUE_MAX];
int count = 100; /* wait at most 20 seconds for completion */

if (is_wifi_driver_loaded()) {

        return 0;
}

if (insmod(DRIVER_MODULE_PATH, DRIVER_MODULE_ARG) < 0)// leon 2
return -1;
#ifdef BOARD_WIFI_ATHEROS
if (insmod(DRIVER_MODULE_PATH_2, DRIVER_MODULE_ARG_2) < 0)
return -1;
if (insmod(DRIVER_MODULE_PATH_3, DRIVER_MODULE_ARG_3) < 0)
return -1;

property_set("ctl.start", ADD_P2P);
#endif

if (strcmp(FIRMWARE_LOADER,"") == 0) {
if (strcmp(WIFI_DRIVER_MODULE_NAME, "8192cu") == 0)
usleep(1600000);
else
usleep(WIFI_DRIVER_LOADER_DELAY);
property_set(DRIVER_PROP_NAME, "ok");
}
else {
property_set("ctl.start", FIRMWARE_LOADER);
}
sched_yield();
while (count-- > 0) {
if (property_get(DRIVER_PROP_NAME, driver_status, NULL)) {
if (strcmp(driver_status, "ok") == 0)
return 0;
else if (strcmp(DRIVER_PROP_NAME, "failed") == 0) {
wifi_unload_driver();
return -1;
}
}
usleep(200000);
}
property_set(DRIVER_PROP_NAME, "timeout");
wifi_unload_driver();
return -1;
#else
property_set(DRIVER_PROP_NAME, "ok");
return 0;
#endif
}

#define WIFI_FIX_SVC    "wififix"
int do_wifi_workaround() {
property_set("ctl.start", WIFI_FIX_SVC);
return 0;
}

driver 加载成功后,将状态转移到transitionTo(mDriverLoadedState);
接下来执行sendMessage(CMD_START_SUPPLICANT);


class DriverLoadedState extends State {
@Override
public void enter() {
if (DBG) log(getName() + "\n");
EventLog.writeEvent(EVENTLOG_WIFI_STATE_CHANGED, getName());
}
@Override
public boolean processMessage(Message message) {
if (DBG) log(getName() + message.toString() + "\n");
switch(message.what) {
case CMD_UNLOAD_DRIVER:
transitionTo(mDriverUnloadingState);
break;
case CMD_START_SUPPLICANT:
try {
mNwService.wifiFirmwareReload(mInterfaceName, "STA");
} catch (Exception e) {
loge("Failed to reload STA firmware " + e);
// continue
}
try {
//A runtime crash can leave the interface up and
//this affects connectivity when supplicant starts up.
//Ensure interface is down before a supplicant start.


mNwService.setInterfaceDown(mInterfaceName);
//Set privacy extensions
mNwService.setInterfaceIpv6PrivacyExtensions(mInterfaceName, true);
} catch (RemoteException re) {
loge("Unable to change interface settings: " + re);
} catch (IllegalStateException ie) {
loge("Unable to change interface settings: " + ie);
}

/* Stop a running supplicant after a runtime restart
* Avoids issues with drivers that do not handle interface down
* on a running supplicant properly.
*/
if (DBG) log("Kill any running supplicant");
mWifiNative.killSupplicant(mP2pSupported);

if(mWifiNative.startSupplicant(mP2pSupported)) {
if (DBG) log("Supplicant start successful");
mWifiMonitor.startMonitoring();
transitionTo(mSupplicantStartingState);
} else {
loge("Failed to start supplicant!");
sendMessage(obtainMessage(CMD_UNLOAD_DRIVER, WIFI_STATE_UNKNOWN, 0));
}
break;
case CMD_START_AP:
transitionTo(mSoftApStartingState);
break;
default:
return NOT_HANDLED;
}
return HANDLED;
}
}


/* @param mode can be "AP", "STA" or "P2P" */
@Override
public void wifiFirmwareReload(String wlanIface, String mode) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
try {
mConnector.execute("softap", "fwreload", wlanIface, mode);
} catch (NativeDaemonConnectorException e) {
throw e.rethrowAsParcelableException();
}
}

property_set("ctl.start", "wififix" );

insmod /system/lib/dhd.ko

usleep 1000,000

property_set(DRIVER_PROP_NAME, "ok");//static const char
DRIVER_PROP_NAME[]    = "wlan.driver.status";

//间隔0.2s,总计20s

reload
firmware,没有搞清楚是如何加载的。

killall wps

mWifiNative.startSupplicant(mP2pSupported)

时间: 2024-08-13 23:27:45

wifi enable的相关文章

高通8X25Q wifi BT 调试文档

1.蓝牙调试 主要是蓝牙的I2C地址跟 地磁仪的I2C地址冲突,被地磁仪给占用了,改回来就好了. --- a/android-lte/kernel/arch/arm/mach-msm/msm8x25/goso-msm7627a-bt.c +++ b/android-lte/kernel/arch/arm/mach-msm/msm8x25/goso-msm7627a-bt.c @@ -981,8 +981,7 @@ static struct marimba_platform_data marim

[quote] Porting WiFi drivers to Android

From http://blog.linuxconsulting.ro/2010/04/porting-wifi-drivers-to-android.html Porting WiFi drivers to Android by Nicu Pavel on 11 August 2010 Update(19/05/2011): Verify validity against Gingerbread.Update (11/08/2010): Updated patch to fix the loa

Wifi状态监听的广播接收者

/** * 监控Wifi状态的广播接收器 */ private final class WifiStateReceiver extends BroadcastReceiver { @Override public void onReceive(Context c, Intent intent) { Bundle bundle = intent.getExtras(); int statusInt = bundle.getInt("wifi_state"); switch (status

使用adb命令操控Android手机

1) 手机连接电脑之前 首先,查看安卓手机是否已经连接上电脑 adb devices 让adb一直查找安卓设备,找到后才停止 adb wait-for-device 2) 手机连接电脑后的操作 2.0) 基本命令 连接多个安卓设备时,在adb命令后紧跟着使用 -s加序列号 来指定要操作的设备 建议每次只连接一个安卓设备进行操作!!! 建议每次只连接一个安卓设备进行操作!!! 建议每次只连接一个安卓设备进行操作!!! $ adb devices List of devices attached F

adb shell常用命令总结

一.文件操作相关命令 1.文件操作命令 子命令 参数 说明 cd 无 进入目录 cat [-beflnstuv] [-B bsize] [file...] 查看文件内容-n:显示行号-b:显示行号,但会忽略空行-s:显示行号,连续空行标记为一行 df 无 列出分区列表 du [-H] [-L] [-P] [-a] [-d depth] [-s] [-cghikmnrx] [file...] 查询文件或目录的磁盘使用空间 ls [-a] [-i] [-l] [-n] [-s] 列出目录内容-a:列

Android WiFi开发教程(一)——WiFi热点的创建与关闭

相对于BlueTooth,WiFi是当今使用最广的一种无线网络传输技术, 几乎所有智能手机.平板电脑和笔记本电脑都支持Wi-Fi上网.因此,掌握基本的WiFI开发技术是非常必要的.本教程将围绕一个小Demo初步与大家一同探讨WiFi开发. 先上效果图   Demo功能比较简单,四个按钮.两个文本和一个列表.功能主要有创建WiFi热点,关闭WiFi热点,搜索WiFi,连接WiFi,数据通讯.源码会在教程结尾提供. 本章节主要介绍WiFi热点的创建和关闭 需要用到的权限 <uses-permissi

Fedora 23建立wifi热点(Android手机可用)

在ubuntu14.04下使用ap-hotspot,速度还不错.但是在15.04下就用不了了,不知为啥.现在使用fedora23,在学校还是挺需要给手机连wifi的,于是google看看ap-hotspot能不能在fedora下使用,结果搜到了作者的github,说是ap-hotspot过时了,于是又写了个create_ap代替,下载地址: https://github.com/oblique/create_ap 使用挺方便的,下载并解压,然后进入该目录安装: $ cd create_ap-ma

Android BlueDroid(三):BlueDroid蓝牙开启过程enable

关键词:bluedroid  enableNative BTIF_TASK  BTU_TASK bt_hc_work_thread set_power  preload GKI作者:xubin341719(欢迎转载,请注明作者,请尊重版权,谢谢!)绘图工具:Edraw Maindmap欢迎指正错误,共同学习.共同进步!! 一.enableNative函数的的实现(1).初始化BTE:(2).创建BTIU_TASK:(3).初始化HCI.串口相关,启动HCI工作主线程:bt_hc_callback

Android KitKat 4.4 Wifi移植之AP模式与网络共享功能调试记录

Tethering技术在移动平台上已经运用的越来越广泛了,它可以把移动设备当做一个接入点,其它的设备可以通过Wi-Fi,USB或是Bluetooth等方式连接到此移动设备.在Android中可以将Wifi设为AP模式作为WLAN接入点,从而与其他设备共享Android的互联网连接.Android成为接入点后,就无法通过WLAN连接使用Android的应用程序访问互联网,但可以通过其他方式如以太网或移动网络访问互联网.此时以太网或移动网络在网络共享(Tethering)中是作为upstream的角