Merge "Migrate suspend HAL interactions to new suspend control AIDL."
This commit is contained in:
@@ -120,6 +120,7 @@ cc_defaults {
|
|||||||
"android.frameworks.schedulerservice@1.0",
|
"android.frameworks.schedulerservice@1.0",
|
||||||
"android.frameworks.sensorservice@1.0",
|
"android.frameworks.sensorservice@1.0",
|
||||||
"android.system.suspend@1.0",
|
"android.system.suspend@1.0",
|
||||||
|
"suspend_control_aidl_interface-cpp",
|
||||||
],
|
],
|
||||||
|
|
||||||
static_libs: [
|
static_libs: [
|
||||||
|
|||||||
@@ -30,8 +30,8 @@
|
|||||||
|
|
||||||
#include <android/hardware/power/1.0/IPower.h>
|
#include <android/hardware/power/1.0/IPower.h>
|
||||||
#include <android/hardware/power/1.1/IPower.h>
|
#include <android/hardware/power/1.1/IPower.h>
|
||||||
#include <android/system/suspend/1.0/ISystemSuspend.h>
|
#include <android/system/suspend/BnSuspendCallback.h>
|
||||||
#include <android/system/suspend/1.0/ISystemSuspendCallback.h>
|
#include <android/system/suspend/ISuspendControlService.h>
|
||||||
#include <android_runtime/AndroidRuntime.h>
|
#include <android_runtime/AndroidRuntime.h>
|
||||||
#include <jni.h>
|
#include <jni.h>
|
||||||
|
|
||||||
@@ -44,14 +44,14 @@
|
|||||||
|
|
||||||
using android::hardware::Return;
|
using android::hardware::Return;
|
||||||
using android::hardware::Void;
|
using android::hardware::Void;
|
||||||
|
using android::system::suspend::BnSuspendCallback;
|
||||||
using android::hardware::power::V1_0::PowerStatePlatformSleepState;
|
using android::hardware::power::V1_0::PowerStatePlatformSleepState;
|
||||||
using android::hardware::power::V1_0::PowerStateVoter;
|
using android::hardware::power::V1_0::PowerStateVoter;
|
||||||
using android::hardware::power::V1_0::Status;
|
using android::hardware::power::V1_0::Status;
|
||||||
using android::hardware::power::V1_1::PowerStateSubsystem;
|
using android::hardware::power::V1_1::PowerStateSubsystem;
|
||||||
using android::hardware::power::V1_1::PowerStateSubsystemSleepState;
|
using android::hardware::power::V1_1::PowerStateSubsystemSleepState;
|
||||||
using android::hardware::hidl_vec;
|
using android::hardware::hidl_vec;
|
||||||
using android::system::suspend::V1_0::ISystemSuspend;
|
using android::system::suspend::ISuspendControlService;
|
||||||
using android::system::suspend::V1_0::ISystemSuspendCallback;
|
|
||||||
using IPowerV1_1 = android::hardware::power::V1_1::IPower;
|
using IPowerV1_1 = android::hardware::power::V1_1::IPower;
|
||||||
using IPowerV1_0 = android::hardware::power::V1_0::IPower;
|
using IPowerV1_0 = android::hardware::power::V1_0::IPower;
|
||||||
|
|
||||||
@@ -66,7 +66,7 @@ static sem_t wakeup_sem;
|
|||||||
extern sp<IPowerV1_0> getPowerHalV1_0();
|
extern sp<IPowerV1_0> getPowerHalV1_0();
|
||||||
extern sp<IPowerV1_1> getPowerHalV1_1();
|
extern sp<IPowerV1_1> getPowerHalV1_1();
|
||||||
extern bool processPowerHalReturn(const Return<void> &ret, const char* functionName);
|
extern bool processPowerHalReturn(const Return<void> &ret, const char* functionName);
|
||||||
extern sp<ISystemSuspend> getSuspendHal();
|
extern sp<ISuspendControlService> getSuspendControl();
|
||||||
|
|
||||||
// Java methods used in getLowPowerStats
|
// Java methods used in getLowPowerStats
|
||||||
static jmethodID jgetAndUpdatePlatformState = NULL;
|
static jmethodID jgetAndUpdatePlatformState = NULL;
|
||||||
@@ -74,17 +74,17 @@ static jmethodID jgetSubsystem = NULL;
|
|||||||
static jmethodID jputVoter = NULL;
|
static jmethodID jputVoter = NULL;
|
||||||
static jmethodID jputState = NULL;
|
static jmethodID jputState = NULL;
|
||||||
|
|
||||||
class WakeupCallback : public ISystemSuspendCallback {
|
class WakeupCallback : public BnSuspendCallback {
|
||||||
public:
|
public:
|
||||||
Return<void> notifyWakeup(bool success) override {
|
binder::Status notifyWakeup(bool success) override {
|
||||||
ALOGV("In wakeup_callback: %s", success ? "resumed from suspend" : "suspend aborted");
|
ALOGI("In wakeup_callback: %s", success ? "resumed from suspend" : "suspend aborted");
|
||||||
int ret = sem_post(&wakeup_sem);
|
int ret = sem_post(&wakeup_sem);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
char buf[80];
|
char buf[80];
|
||||||
strerror_r(errno, buf, sizeof(buf));
|
strerror_r(errno, buf, sizeof(buf));
|
||||||
ALOGE("Error posting wakeup sem: %s\n", buf);
|
ALOGE("Error posting wakeup sem: %s\n", buf);
|
||||||
}
|
}
|
||||||
return Void();
|
return binder::Status::ok();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -107,9 +107,12 @@ static jint nativeWaitWakeup(JNIEnv *env, jobject clazz, jobject outBuf)
|
|||||||
jniThrowException(env, "java/lang/IllegalStateException", buf);
|
jniThrowException(env, "java/lang/IllegalStateException", buf);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
ALOGV("Registering callback...");
|
sp<ISuspendControlService> suspendControl = getSuspendControl();
|
||||||
sp<ISystemSuspend> suspendHal = getSuspendHal();
|
bool isRegistered = false;
|
||||||
suspendHal->registerCallback(new WakeupCallback());
|
suspendControl->registerCallback(new WakeupCallback(), &isRegistered);
|
||||||
|
if (!isRegistered) {
|
||||||
|
ALOGE("Failed to register wakeup callback");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wait for wakeup.
|
// Wait for wakeup.
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
#include <android/hardware/power/1.1/IPower.h>
|
#include <android/hardware/power/1.1/IPower.h>
|
||||||
#include <android/system/suspend/1.0/ISystemSuspend.h>
|
#include <android/system/suspend/1.0/ISystemSuspend.h>
|
||||||
|
#include <android/system/suspend/ISuspendControlService.h>
|
||||||
#include <nativehelper/JNIHelp.h>
|
#include <nativehelper/JNIHelp.h>
|
||||||
#include "jni.h"
|
#include "jni.h"
|
||||||
|
|
||||||
@@ -30,13 +31,14 @@
|
|||||||
#include <android-base/chrono_utils.h>
|
#include <android-base/chrono_utils.h>
|
||||||
#include <android_runtime/AndroidRuntime.h>
|
#include <android_runtime/AndroidRuntime.h>
|
||||||
#include <android_runtime/Log.h>
|
#include <android_runtime/Log.h>
|
||||||
|
#include <binder/IServiceManager.h>
|
||||||
|
#include <hardware/power.h>
|
||||||
|
#include <hardware_legacy/power.h>
|
||||||
|
#include <hidl/ServiceManagement.h>
|
||||||
#include <utils/Timers.h>
|
#include <utils/Timers.h>
|
||||||
#include <utils/misc.h>
|
#include <utils/misc.h>
|
||||||
#include <utils/String8.h>
|
#include <utils/String8.h>
|
||||||
#include <utils/Log.h>
|
#include <utils/Log.h>
|
||||||
#include <hardware/power.h>
|
|
||||||
#include <hardware_legacy/power.h>
|
|
||||||
#include <hidl/ServiceManagement.h>
|
|
||||||
|
|
||||||
#include "com_android_server_power_PowerManagerService.h"
|
#include "com_android_server_power_PowerManagerService.h"
|
||||||
|
|
||||||
@@ -48,6 +50,7 @@ using android::String8;
|
|||||||
using android::system::suspend::V1_0::ISystemSuspend;
|
using android::system::suspend::V1_0::ISystemSuspend;
|
||||||
using android::system::suspend::V1_0::IWakeLock;
|
using android::system::suspend::V1_0::IWakeLock;
|
||||||
using android::system::suspend::V1_0::WakeLockType;
|
using android::system::suspend::V1_0::WakeLockType;
|
||||||
|
using android::system::suspend::ISuspendControlService;
|
||||||
using IPowerV1_1 = android::hardware::power::V1_1::IPower;
|
using IPowerV1_1 = android::hardware::power::V1_1::IPower;
|
||||||
using IPowerV1_0 = android::hardware::power::V1_0::IPower;
|
using IPowerV1_0 = android::hardware::power::V1_0::IPower;
|
||||||
|
|
||||||
@@ -176,6 +179,7 @@ void android_server_PowerManagerService_userActivity(nsecs_t eventTime, int32_t
|
|||||||
}
|
}
|
||||||
|
|
||||||
static sp<ISystemSuspend> gSuspendHal = nullptr;
|
static sp<ISystemSuspend> gSuspendHal = nullptr;
|
||||||
|
static sp<ISuspendControlService> gSuspendControl = nullptr;
|
||||||
static sp<IWakeLock> gSuspendBlocker = nullptr;
|
static sp<IWakeLock> gSuspendBlocker = nullptr;
|
||||||
static std::mutex gSuspendMutex;
|
static std::mutex gSuspendMutex;
|
||||||
|
|
||||||
@@ -191,18 +195,33 @@ sp<ISystemSuspend> getSuspendHal() {
|
|||||||
return gSuspendHal;
|
return gSuspendHal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sp<ISuspendControlService> getSuspendControl() {
|
||||||
|
static std::once_flag suspendControlFlag;
|
||||||
|
std::call_once(suspendControlFlag, [](){
|
||||||
|
while(gSuspendControl == nullptr) {
|
||||||
|
sp<IBinder> control =
|
||||||
|
defaultServiceManager()->getService(String16("suspend_control"));
|
||||||
|
if (control != nullptr) {
|
||||||
|
gSuspendControl = interface_cast<ISuspendControlService>(control);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return gSuspendControl;
|
||||||
|
}
|
||||||
|
|
||||||
void enableAutoSuspend() {
|
void enableAutoSuspend() {
|
||||||
static bool enabled = false;
|
static bool enabled = false;
|
||||||
|
|
||||||
std::lock_guard<std::mutex> lock(gSuspendMutex);
|
|
||||||
if (!enabled) {
|
if (!enabled) {
|
||||||
sp<ISystemSuspend> suspendHal = getSuspendHal();
|
sp<ISuspendControlService> suspendControl = getSuspendControl();
|
||||||
suspendHal->enableAutosuspend();
|
suspendControl->enableAutosuspend(&enabled);
|
||||||
enabled = true;
|
|
||||||
}
|
}
|
||||||
if (gSuspendBlocker) {
|
|
||||||
gSuspendBlocker->release();
|
{
|
||||||
gSuspendBlocker.clear();
|
std::lock_guard<std::mutex> lock(gSuspendMutex);
|
||||||
|
if (gSuspendBlocker) {
|
||||||
|
gSuspendBlocker->release();
|
||||||
|
gSuspendBlocker.clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user