wifi: Add firmware mode controller
am: a26a6e0807
Change-Id: I2b8cfeb08f88024157c945ec7a8b92c19ce296a0
This commit is contained in:
commit
987226de7c
3 changed files with 148 additions and 0 deletions
|
@ -24,6 +24,7 @@ LOCAL_SRC_FILES := \
|
|||
wifi_ap_iface.cpp \
|
||||
wifi_chip.cpp \
|
||||
wifi_legacy_hal.cpp \
|
||||
wifi_mode_controller.cpp \
|
||||
wifi_nan_iface.cpp \
|
||||
wifi_p2p_iface.cpp \
|
||||
wifi_rtt_controller.cpp \
|
||||
|
@ -39,6 +40,7 @@ LOCAL_SHARED_LIBRARIES := \
|
|||
liblog \
|
||||
libnl \
|
||||
libutils \
|
||||
libwifi-hal \
|
||||
libwifi-system
|
||||
LOCAL_WHOLE_STATIC_LIBRARIES := $(LIB_WIFI_HAL)
|
||||
LOCAL_INIT_RC := android.hardware.wifi@1.0-service.rc
|
||||
|
|
87
wifi/1.0/default/wifi_mode_controller.cpp
Normal file
87
wifi/1.0/default/wifi_mode_controller.cpp
Normal file
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
* Copyright (C) 2016 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <android-base/logging.h>
|
||||
#include <android-base/macros.h>
|
||||
#include <private/android_filesystem_config.h>
|
||||
|
||||
#include "wifi_mode_controller.h"
|
||||
|
||||
using android::hardware::wifi::V1_0::IfaceType;
|
||||
using android::wifi_hal::DriverTool;
|
||||
|
||||
namespace {
|
||||
int convertIfaceTypeToFirmwareMode(IfaceType type) {
|
||||
int mode;
|
||||
switch (type) {
|
||||
case IfaceType::AP:
|
||||
mode = DriverTool::kFirmwareModeAp;
|
||||
break;
|
||||
case IfaceType::P2P:
|
||||
mode = DriverTool::kFirmwareModeP2p;
|
||||
break;
|
||||
case IfaceType::NAN:
|
||||
// NAN is exposed in STA mode currently.
|
||||
mode = DriverTool::kFirmwareModeSta;
|
||||
break;
|
||||
case IfaceType::STA:
|
||||
mode = DriverTool::kFirmwareModeSta;
|
||||
break;
|
||||
}
|
||||
return mode;
|
||||
}
|
||||
}
|
||||
|
||||
namespace android {
|
||||
namespace hardware {
|
||||
namespace wifi {
|
||||
namespace V1_0 {
|
||||
namespace implementation {
|
||||
namespace mode_controller {
|
||||
|
||||
WifiModeController::WifiModeController() : driver_tool_(new DriverTool) {}
|
||||
|
||||
bool WifiModeController::isFirmwareModeChangeNeeded(IfaceType type) {
|
||||
return driver_tool_->IsFirmwareModeChangeNeeded(
|
||||
convertIfaceTypeToFirmwareMode(type));
|
||||
}
|
||||
|
||||
bool WifiModeController::changeFirmwareMode(IfaceType type) {
|
||||
if (!driver_tool_->LoadDriver()) {
|
||||
LOG(ERROR) << "Failed to load WiFi driver";
|
||||
return false;
|
||||
}
|
||||
if (!driver_tool_->IsFirmwareModeChangeNeeded(
|
||||
convertIfaceTypeToFirmwareMode(type))) {
|
||||
LOG(ERROR) << "Failed to change firmware mode";
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WifiModeController::deinitialize() {
|
||||
if (!driver_tool_->UnloadDriver()) {
|
||||
LOG(ERROR) << "Failed to unload WiFi driver";
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
} // namespace mode_controller
|
||||
} // namespace implementation
|
||||
} // namespace V1_0
|
||||
} // namespace wifi
|
||||
} // namespace hardware
|
||||
} // namespace android
|
59
wifi/1.0/default/wifi_mode_controller.h
Normal file
59
wifi/1.0/default/wifi_mode_controller.h
Normal file
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
* Copyright (C) 2016 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef WIFI_MODE_CONTROLLER_H_
|
||||
#define WIFI_MODE_CONTROLLER_H_
|
||||
|
||||
#include <wifi_hal/driver_tool.h>
|
||||
|
||||
#include <android/hardware/wifi/1.0/IWifi.h>
|
||||
|
||||
namespace android {
|
||||
namespace hardware {
|
||||
namespace wifi {
|
||||
namespace V1_0 {
|
||||
namespace implementation {
|
||||
namespace mode_controller {
|
||||
/**
|
||||
* Class that encapsulates all firmware mode configuration.
|
||||
* This class will perform the necessary firmware reloads to put the chip in the
|
||||
* required state (essentially a wrapper over DriverTool).
|
||||
*/
|
||||
class WifiModeController {
|
||||
public:
|
||||
WifiModeController();
|
||||
|
||||
// Checks if a firmware mode change is necessary to support the specified
|
||||
// iface type operations.
|
||||
bool isFirmwareModeChangeNeeded(IfaceType type);
|
||||
// Change the firmware mode to support the specified iface type operations.
|
||||
bool changeFirmwareMode(IfaceType type);
|
||||
// Unload the driver. This should be invoked whenever |IWifi.stop()| is
|
||||
// invoked.
|
||||
bool deinitialize();
|
||||
|
||||
private:
|
||||
std::unique_ptr<wifi_hal::DriverTool> driver_tool_;
|
||||
};
|
||||
|
||||
} // namespace mode_controller
|
||||
} // namespace implementation
|
||||
} // namespace V1_0
|
||||
} // namespace wifi
|
||||
} // namespace hardware
|
||||
} // namespace android
|
||||
|
||||
#endif // WIFI_MODE_CONTROLLER_H_
|
Loading…
Reference in a new issue