Android O wifi turn on -- load driver

1. frameworks/base/wifi/java/android/net/wifi/WifiManager.java

    public boolean setWifiEnabled(boolean enabled) {

        mService.setWifiEnabled(mContext.getOpPackageName(), enabled);

    }

2. frameworks/base/wifi/java/android/net/wifi/IWifiManager.aidl

boolean setWifiEnabled(String packageName, boolean enable);

3. frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java

    @Override
    public synchronized boolean setWifiEnabled(String packageName, boolean enable)
            throws RemoteException {
 
        mWifiController.sendMessage(CMD_WIFI_TOGGLED);
 
    }

4. frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiController.java

狀態機

parent state child state
mStaEnabledState mDeviceActiveState
mDefaultState mStaEnabledState

 

 

 

初始狀態爲mApStaDisabledState,處理CMD_WIFI_TOGGLED,切換至狀態mDeviceActiveState.

state的enter函數,包括parent state.

state command next state
mApStaDisabledState CMD_WIFI_TOGGLED transitionTo  mDeviceActiveState
mDeviceActiveState    
mStaEnabledState    
mDefaultState    
setInitialState(mApStaDisabledState);
    
    class StaEnabledState extends State {
        @Override
        public void enter() {
            Log.d(TAG, "Enter " + getName() + " mScreenOff=" + mScreenOff);
            mWifiStateMachine.setSupplicantRunning(true);
        }

5.frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachine.java

    public void setSupplicantRunning(boolean enable) {
        if (enable) {
            sendMessage(CMD_START_SUPPLICANT);
        } else {
            sendMessage(CMD_STOP_SUPPLICANT);
        }
    }

狀態機初始狀態爲mInitialState

    class InitialState extends State {
        @Override
        public boolean processMessage(Message message) {
            logStateAndMessage(message, this);
            switch (message.what) {
                case CMD_START_SUPPLICANT:
                    Pair<Integer, IClientInterface> statusAndInterface =
                            mWifiNative.setupForClientMode();
...
                    if (!mWifiNative.enableSupplicant()) {
...
                    mWifiMonitor.startMonitoring(mInterfaceName, true);
...
                    transitionTo(mSupplicantStartingState);
                    break;
...
    }

6. frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiNative.java

    public Pair<Integer, IClientInterface> setupForClientMode() {
        if (!startHalIfNecessary(true)) {
...
        IClientInterface iClientInterface = mWificondControl.setupDriverForClientMode();
...
}


    private boolean startHalIfNecessary(boolean isStaMode) {
        if (!mWifiVendorHal.isVendorHalSupported()) {
            Log.i(mTAG, "Vendor HAL not supported, Ignore start...");
            return true;
        }
        return mWifiVendorHal.startVendorHal(isStaMode);
    }


7.frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiVendorHal.java

    public boolean startVendorHal(boolean isStaMode) {
...
            if (!mHalDeviceManager.start()) {
...
            IWifiIface iface;
            if (isStaMode) {
                mIWifiStaIface = mHalDeviceManager.createStaIface(null, null);
...
                iface = (IWifiIface) mIWifiStaIface;
                if (!registerStaIfaceCallback()) {
...
                mIWifiRttController = mHalDeviceManager.createRttController(iface);
...
                enableLinkLayerStats();
...
            mIWifiChip = mHalDeviceManager.getChip(iface);
...
            if (!registerChipCallback()) {
...
}


8.frameworks/opt/net/wifi/service/java/com/android/server/wifi/HalDeviceManager.java

    public IWifiStaIface createStaIface(InterfaceDestroyedListener destroyedListener,
            Looper looper) {
        return (IWifiStaIface) createIface(IfaceType.STA, destroyedListener, looper);
    }


    private IWifiIface createIface(int ifaceType, InterfaceDestroyedListener destroyedListener,
            Looper looper) {
...
            WifiChipInfo[] chipInfos = getAllChipInfo();
...
            IWifiIface iface = createIfaceIfPossible(chipInfos, ifaceType, destroyedListener,
                    looper);
...
}


    private IWifiIface createIfaceIfPossible(WifiChipInfo[] chipInfos, int ifaceType,
            InterfaceDestroyedListener destroyedListener, Looper looper) {
...
            if (bestIfaceCreationProposal != null) {
                IWifiIface iface = executeChipReconfiguration(bestIfaceCreationProposal, ifaceType);

...
}



    private IWifiIface executeChipReconfiguration(IfaceCreationData ifaceCreationData,
            int ifaceType) {
...
                    WifiStatus status = ifaceCreationData.chipInfo.chip.configureChip(
                            ifaceCreationData.chipModeId);
...
}

9. hardware/interfaces/wifi/1.1/default/wifi_chip.cpp

Return<void> WifiChip::configureChip(ChipModeId mode_id,
                                     configureChip_cb hidl_status_cb) {
  return validateAndCall(this,
                         WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
                         &WifiChip::configureChipInternal,
                         hidl_status_cb,
                         mode_id);
}


WifiStatus WifiChip::configureChipInternal(ChipModeId mode_id) {
...
  WifiStatus status = handleChipConfiguration(mode_id);
...
}

WifiStatus WifiChip::handleChipConfiguration(ChipModeId mode_id) {
...
  if (mode_id == kStaChipModeId) {
    success = mode_controller_.lock()->changeFirmwareMode(IfaceType::STA);
  } else {
    success = mode_controller_.lock()->changeFirmwareMode(IfaceType::AP);
  }
...
}

10.hardware/interfaces/wifi/1.1/default/wifi_mode_controller.cpp

bool WifiModeController::changeFirmwareMode(IfaceType type) {
  if (!driver_tool_->LoadDriver()) {
    LOG(ERROR) << "Failed to load WiFi driver";
    return false;
  }
  if (!driver_tool_->ChangeFirmwareMode(convertIfaceTypeToFirmwareMode(type))) {
    LOG(ERROR) << "Failed to change firmware mode";
    return false;
  }
  return true;
}

11.frameworks/opt/net/wifi/libwifi_hal/driver_tool.cpp

bool DriverTool::LoadDriver() {
  return ::wifi_load_driver() == 0;
}

bool DriverTool::ChangeFirmwareMode(int mode) {
  const char* fwpath = wifi_get_fw_path(mode);
  if (!fwpath) {
    return true;  // HAL doesn't think we need to load firmware for this mode.
  }
  if (wifi_change_fw_path(fwpath) != 0) {
    // Not all devices actually require firmware reloads, but
    // failure to change the firmware path when it is defined is an error.
    return false;
  }
  return true;
}

12.frameworks/opt/net/wifi/libwifi_hal/wifi_hal_common.cpp

int wifi_load_driver() {
#ifdef WIFI_DRIVER_MODULE_PATH
  if (is_wifi_driver_loaded()) {
    return 0;
  }

  if (insmod(DRIVER_MODULE_PATH, DRIVER_MODULE_ARG) < 0) return -1;
#endif

#ifdef WIFI_DRIVER_STATE_CTRL_PARAM
  if (is_wifi_driver_loaded()) {
    return 0;
  }

  if (wifi_change_driver_state(WIFI_DRIVER_STATE_ON) < 0) return -1;
#endif
  property_set(DRIVER_PROP_NAME, "ok");
  return 0;
}

int wifi_change_fw_path(const char *fwpath) {
  int len;
  int fd;
  int ret = 0;

  if (!fwpath) return ret;
  fd = TEMP_FAILURE_RETRY(open(WIFI_DRIVER_FW_PATH_PARAM, O_WRONLY));
  if (fd < 0) {
    PLOG(ERROR) << "Failed to open wlan fw path param";
    return -1;
  }
  len = strlen(fwpath) + 1;
  if (TEMP_FAILURE_RETRY(write(fd, fwpath, len)) != len) {
    PLOG(ERROR) << "Failed to write wlan fw path param";
    ret = -1;
  }
  close(fd);
  return ret;
}

===============================================================================================

VINTF(vendor interface)

HIDL:HAL interface Definition Language

Binderized HAL through "hwbinder"

 

VNDK(vendor NDK)

clearly define which AOSP libraries vendor could use

Google maitained versioned  VNDK

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章