zoukankan      html  css  js  c++  java
  • 2系统启动后的 wifi加载 过程图解

    Wifi模块的初始化:

    系统启动 首先加载init.rc,这个文件 会加载所有service在 SystemServer 启动的时候,会生成一个ConnectivityService 的实例,


    try {
    Log.i(TAG, "Starting Connectivity Service.");
    ServiceManager.addService(Context.CONNECTIVITY_SERVICE, new
    ConnectivityService(context));
    } catch (Throwable e) {
    Log.e(TAG, "Failure starting Connectivity Service", e);
    }


    ConnectivityService 的构造函数会创建WifiService,

    if (DBG) Log.v(TAG, "Starting Wifi Service.");
    mWifiStateTracker = new WifiStateTracker(context, handler);
    WifiService wifiService = new WifiService(context, mWifiStateTracker);
    ServiceManager.addService(Context.WIFI_SERVICE, wifiService);


    WifiStateTracker 会创建WifiMonitor 接收来自底层的事件,WifiService 和WifiMonitor 是整
    个模块的核心。WifiService 负责启动关闭wpa_supplicant、启动关闭WifiMonitor 监视线程
    和把命令下发给wpa_supplicant,而WifiMonitor 则负责从wpa_supplicant 接收事件通知。

    具体流程图如下:



    一:Wifi模块的启动(使能)


    WirelessSettings 在初始化的时候配置了由WifiEnabler 来处理Wifi 按钮,

    private void initToggles() {
    mWifiEnabler = new WifiEnabler(this,
                                      (WifiManager) getSystemService(WIFI_SERVICE),
                                      (CheckBoxPreference) findPreference(KEY_TOGGLE_WIFI));


    当用户按下Wifi 按钮后,Android 会调用WifiEnabler 的onPreferenceChange,再由WifiEnabler
    调用WifiManager 的setWifiEnabled 接口函数,通过AIDL,实际调用的是WifiService 的
    setWifiEnabled 函数,WifiService 接着向自身发送一条MESSAGE_ENABLE_WIFI 消息,在
    处理该消息的代码中做真正的使能工作:首先装载WIFI 内核模块(该模块的位置硬编码为
    "/system/lib/modules/wlan.ko" ), 然后启动wpa_supplicant ( 配置文件硬编码为
    "/data/misc/wifi/wpa_supplicant.conf"),再通过WifiStateTracker 来启动WifiMonitor 中的监视
    线程。

    private boolean setWifiEnabledBlocking(boolean enable) {
        final int eventualWifiState = enable ? WIFI_STATE_ENABLED :WIFI_STATE_DISABLED;
        updateWifiState(enable ? WIFI_STATE_ENABLING : WIFI_STATE_DISABLING);
        if (enable) {
                if (!WifiNative.loadDriver()) {
                      Log.e(TAG, "Failed to load Wi-Fi driver.");
                      updateWifiState(WIFI_STATE_UNKNOWN);
                      return false;
                }
        if (!WifiNative.startSupplicant()) {
               WifiNative.unloadDriver();
               Log.e(TAG, "Failed to start supplicant daemon.");
               updateWifiState(WIFI_STATE_UNKNOWN);
               return false;
         }
         mWifiStateTracker.startEventLoop();
    }
         // Success!
         persistWifiEnabled(enable);
         updateWifiState(eventualWifiState);
         return true;
    }


    当使能成功后,会广播发送WIFI_STATE_CHANGED_ACTION 这个Intent 通知外界WIFI
    已经成功使能了。WifiEnabler 创建的时候就会向Android 注册接收
    WIFI_STATE_CHANGED_ACTION,因此它会收到该Intent,从而开始扫描。

    private void handleWifiStateChanged(int wifiState) {
    if (wifiState == WIFI_STATE_ENABLED) {
    loadConfiguredAccessPoints();
    attemptScan();
    }

    具体流程如下流程图所示:




    二:查找热点(AP)

    上一节(第三部分:Wifi开启)中讲到Wifi模块开启后会对外发送WIFI_STATE_CHANGED_ACTION。WifiLayer中注册了Action的Receiver。
    当WifiLayer收到此Action后开始scan的流程,具体如下:
























    当wpa_supplicant 处理完SCAN 命令后,它会向控制通道发送事件通知扫描完成,从wifi_wait_for_event 函数会接收到该事件,由此WifiMonitor 中的MonitorThread 会被执行来处理这个事件:


    三:配置 AP 参数


    当用户在 WifiSettings 界面上选择了一个AP 后,会显示配置AP 参数的一个对话框:


    四:Wifi连接

    具体流程参见以下流程图:


    五:IP地址的配置


    流程如图:


    整个wifi启动 到 使用的流程图: 

     Wifi驱动模块

    厂商提供的source,主要进行load firmware 和 kernel的wireless进行通信;

     Wifi电源管理模块

    主要控制硬件的GPIO和上下电,让CPU和Wifi模组之间通过sdio接口通信;





  • 相关阅读:
    Jersey Politics
    网络流——最小费用最大流
    网络流——最大流Dinic算法
    【洛谷2756】飞行员配对方案问题(二分图匹配,网络流24题)
    状压dp入门
    2018九江市赛
    [CQOI2007]余数求和
    CSAPC2008 skyline
    [ZJOI2009]函数 题解
    由不定方程想到的——数论选讲
  • 原文地址:https://www.cnblogs.com/liulaolaiu/p/11745048.html
Copyright © 2011-2022 走看看