diff --git a/power/1.2/Android.bp b/power/1.2/Android.bp new file mode 100644 index 0000000000..0eb73e7a45 --- /dev/null +++ b/power/1.2/Android.bp @@ -0,0 +1,23 @@ +// This file is autogenerated by hidl-gen -Landroidbp. + +hidl_interface { + name: "android.hardware.power@1.2", + root: "android.hardware", + vndk: { + enabled: true, + }, + srcs: [ + "types.hal", + "IPower.hal", + ], + interfaces: [ + "android.hardware.power@1.0", + "android.hardware.power@1.1", + "android.hidl.base@1.0", + ], + types: [ + "PowerHint", + ], + gen_java: true, +} + diff --git a/power/1.2/IPower.hal b/power/1.2/IPower.hal new file mode 100644 index 0000000000..1c2c7b85a9 --- /dev/null +++ b/power/1.2/IPower.hal @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2017 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. + */ +package android.hardware.power@1.2; + +import @1.1::IPower; + +interface IPower extends @1.1::IPower { + /** + * called to pass hints on power requirements which + * may result in adjustment of power/performance parameters of the + * cpufreq governor and other controls. + * + * A particular platform may choose to ignore any hint. + * + * @param hint PowerHint which is passed + * @param data contains additional information about the hint + * and is described along with the comments for each of the hints. + */ + oneway powerHintAsync_1_2(PowerHint hint, int32_t data); +}; diff --git a/power/1.2/types.hal b/power/1.2/types.hal new file mode 100644 index 0000000000..f7a6cf6878 --- /dev/null +++ b/power/1.2/types.hal @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2017 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. + */ +package android.hardware.power@1.2; + +import @1.0::PowerHint; + +/** Power hint identifiers passed to powerHintAsync_1_2() */ +enum PowerHint : @1.0::PowerHint { + /** + * This hint indicates that audio stream is being started. Can be used + * for device specific optimizations during starting audio stream. The + * data parameter is non-zero when stream starts and zero when audio + * stream setup is complete. + */ + AUDIO_STREAMING, + + /** + * This hint indicates that low latency audio is active. Can be used + * for device specific optimizations towards low latency audio. The + * data parameter is non-zero when low latency audio starts and + * zero when ends. + */ + AUDIO_LOW_LATENCY, + + /** + * These hint indicates that camera is being launched. Can be used + * for device specific optimizations during camera launch. The data + * parameter is non-zero when camera launch starts and zero when launch + * is complete. + */ + CAMERA_LAUNCH, + + /** + * This hint indicates that camera stream is being started. Can be used + * for device specific optimizations during starting camera stream. The + * data parameter is non-zero when stream starts and zero when ends. + */ + CAMERA_STREAMING, + + /** + * This hint indicates that camera shot is being taken. Can be used + * for device specific optimizations during taking camera shot. The + * data parameter is non-zero when camera shot starts and zero when ends. + */ + CAMERA_SHOT, +}; diff --git a/power/1.2/vts/functional/Android.bp b/power/1.2/vts/functional/Android.bp new file mode 100644 index 0000000000..d615e85a7c --- /dev/null +++ b/power/1.2/vts/functional/Android.bp @@ -0,0 +1,26 @@ +// +// Copyright (C) 2017 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. +// + +cc_test { + name: "VtsHalPowerV1_2TargetTest", + defaults: ["VtsHalTargetTestDefaults"], + srcs: ["VtsHalPowerV1_2TargetTest.cpp"], + static_libs: [ + "android.hardware.power@1.0", + "android.hardware.power@1.1", + "android.hardware.power@1.2", + ], +} diff --git a/power/1.2/vts/functional/VtsHalPowerV1_2TargetTest.cpp b/power/1.2/vts/functional/VtsHalPowerV1_2TargetTest.cpp new file mode 100644 index 0000000000..5e929971ff --- /dev/null +++ b/power/1.2/vts/functional/VtsHalPowerV1_2TargetTest.cpp @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2017 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_TAG "power_hidl_hal_test" +#include +#include + +#include +#include + +using ::android::sp; +using ::android::hardware::hidl_vec; +using ::android::hardware::Return; +using ::android::hardware::power::V1_2::IPower; +using ::android::hardware::power::V1_2::PowerHint; + +// Test environment for Power HIDL HAL. +class PowerHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase { + public: + // get the test environment singleton + static PowerHidlEnvironment* Instance() { + static PowerHidlEnvironment* instance = new PowerHidlEnvironment; + return instance; + } + + virtual void registerTestServices() override { registerTestService(); } +}; + +class PowerHidlTest : public ::testing::VtsHalHidlTargetTestBase { + public: + virtual void SetUp() override { + power = ::testing::VtsHalHidlTargetTestBase::getService( + PowerHidlEnvironment::Instance()->getServiceName()); + ASSERT_NE(power, nullptr); + } + + sp power; +}; + +// Sanity check Power::PowerHintAsync_1_2 on good and bad inputs. +TEST_F(PowerHidlTest, PowerHintAsync_1_2) { + std::vector hints; + for (uint32_t i = static_cast(PowerHint::VSYNC); + i <= static_cast(PowerHint::CAMERA_SHOT); ++i) { + hints.emplace_back(static_cast(i)); + } + PowerHint badHint = static_cast(0xFF); + hints.emplace_back(badHint); + + Return ret; + for (auto& hint : hints) { + ret = power->powerHintAsync_1_2(hint, 30000); + ASSERT_TRUE(ret.isOk()); + + ret = power->powerHintAsync_1_2(hint, 0); + ASSERT_TRUE(ret.isOk()); + } + + // Turning these hints on in different orders triggers different code paths, + // so iterate over possible orderings. + std::vector hints2 = {PowerHint::AUDIO_STREAMING, PowerHint::CAMERA_LAUNCH, + PowerHint::CAMERA_STREAMING, PowerHint::CAMERA_SHOT}; + auto compareHints = [](PowerHint l, PowerHint r) { + return static_cast(l) < static_cast(r); + }; + std::sort(hints2.begin(), hints2.end(), compareHints); + do { + for (auto iter = hints2.begin(); iter != hints2.end(); iter++) { + ret = power->powerHintAsync_1_2(*iter, 0); + ASSERT_TRUE(ret.isOk()); + } + for (auto iter = hints2.begin(); iter != hints2.end(); iter++) { + ret = power->powerHintAsync_1_2(*iter, 30000); + ASSERT_TRUE(ret.isOk()); + } + } while (std::next_permutation(hints2.begin(), hints2.end(), compareHints)); +} + +int main(int argc, char** argv) { + ::testing::AddGlobalTestEnvironment(PowerHidlEnvironment::Instance()); + ::testing::InitGoogleTest(&argc, argv); + PowerHidlEnvironment::Instance()->init(&argc, argv); + int status = RUN_ALL_TESTS(); + LOG(INFO) << "Test result = " << status; + return status; +}