diff --git a/power-libperfmgr/Android.bp b/power-libperfmgr/Android.bp index 60553d6..7d0b0b4 100644 --- a/power-libperfmgr/Android.bp +++ b/power-libperfmgr/Android.bp @@ -24,7 +24,8 @@ cc_binary { relative_install_path: "hw", vintf_fragments: ["android.hardware.power@1.3-service.xiaomi_sm6250.xml"], init_rc: ["android.hardware.power@1.3-service.xiaomi_sm6250-libperfmgr.rc"], - srcs: ["service.cpp", "Power.cpp", "InteractionHandler.cpp"], + srcs: ["service.cpp", "Power.cpp", "InteractionHandler.cpp", + "display-helper.cpp"], cflags: [ "-Wall", "-Werror", diff --git a/power-libperfmgr/Power.cpp b/power-libperfmgr/Power.cpp index 7ee82d7..df2b934 100644 --- a/power-libperfmgr/Power.cpp +++ b/power-libperfmgr/Power.cpp @@ -27,6 +27,8 @@ #include #include "Power.h" +#include "display-helper.h" + #include constexpr int kWakeupModeOff = 4; @@ -131,6 +133,13 @@ Return Power::powerHint(PowerHint_1_0 hint, int32_t data) { } break; case PowerHint_1_0::LOW_POWER: + if (data) { + // Device in battery saver mode, enable display low power mode + set_display_lpm(true); + } else { + // Device exiting battery saver mode, disable display low power mode + set_display_lpm(false); + } break; default: break; diff --git a/power-libperfmgr/display-helper.cpp b/power-libperfmgr/display-helper.cpp new file mode 100644 index 0000000..2dbe453 --- /dev/null +++ b/power-libperfmgr/display-helper.cpp @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2018 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. + */ + +#define LOG_NIDEBUG 0 +#define LOG_TAG "android.hardware.power@1.3-service.xiaomi_sm6250-libperfmgr" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "display-helper.h" + +#define DAEMON_SOCKET "pps" + +static int daemon_socket = -1; + +static int connectPPDaemon() { + // Setup socket connection, if not already done. + if (daemon_socket < 0) + daemon_socket = + socket_local_client(DAEMON_SOCKET, ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_STREAM); + + if (daemon_socket < 0) { + ALOGE("Connecting to socket failed: %s", strerror(errno)); + return -1; + } + return 0; +} + +static int ppdComm(const char *cmd) { + int ret = -1; + + ret = connectPPDaemon(); + if (ret < 0) + return ret; + + ret = write(daemon_socket, cmd, strlen(cmd)); + if (ret < 0) { + ALOGE("Failed to send data over socket, %s", strerror(errno)); + return ret; + } + return 0; +} + +void set_display_lpm(int enable) { + ALOGI("set_display_lpm state: %d", enable); + if (enable) { + ppdComm("foss:on"); + } else { + ppdComm("foss:off"); + } +} diff --git a/power-libperfmgr/display-helper.h b/power-libperfmgr/display-helper.h new file mode 100644 index 0000000..70b9697 --- /dev/null +++ b/power-libperfmgr/display-helper.h @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2018 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 POWER_LIBPERFMGR_DISPLAY_HELPER_H_ +#define POWER_LIBPERFMGR_DISPLAY_HELPER_H_ + +enum display_lpm_state { + DISPLAY_LPM_OFF = 0, + DISPLAY_LPM_ON, + DISPLAY_LPM_UNKNOWN, +}; + +void set_display_lpm(int enable); + +#endif // POWER_LIBPERFMGR_DISPLAY_HELPER_H_