From 5e735a2f3b4fa14ec840e5c09bf374345f7abaa1 Mon Sep 17 00:00:00 2001 From: Simon1511 Date: Fri, 26 May 2023 15:51:49 +0200 Subject: [PATCH] sm7125-common: Switch to hardware/samsung vibrator Change-Id: I92f293534c99e37142d731e256c6fe96b6754a03 --- BoardConfigCommon.mk | 3 + common.mk | 2 +- sepolicy/vendor/file_contexts | 2 +- vibrator/Android.bp | 22 -- vibrator/Vibrator.cpp | 269 ------------------ vibrator/Vibrator.h | 79 ----- ...ndroid.hardware.vibrator-service.sm7125.rc | 5 - ...droid.hardware.vibrator-service.sm7125.xml | 6 - vibrator/service.cpp | 25 -- 9 files changed, 5 insertions(+), 408 deletions(-) delete mode 100644 vibrator/Android.bp delete mode 100644 vibrator/Vibrator.cpp delete mode 100644 vibrator/Vibrator.h delete mode 100644 vibrator/android.hardware.vibrator-service.sm7125.rc delete mode 100644 vibrator/android.hardware.vibrator-service.sm7125.xml delete mode 100644 vibrator/service.cpp diff --git a/BoardConfigCommon.mk b/BoardConfigCommon.mk index eb5c62f..315f356 100644 --- a/BoardConfigCommon.mk +++ b/BoardConfigCommon.mk @@ -209,6 +209,9 @@ include device/qcom/sepolicy_vndr-legacy-um/SEPolicy.mk BOARD_VENDOR_SEPOLICY_DIRS += $(COMMON_PATH)/sepolicy/vendor SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS += $(COMMON_PATH)/sepolicy/public +# Vibrator +$(call soong_config_set,samsungVibratorVars,duration_amplitude,true) + # Wifi BOARD_WLAN_DEVICE := qcwcn BOARD_HOSTAPD_DRIVER := NL80211 diff --git a/common.mk b/common.mk index 966ab8a..ad569a6 100644 --- a/common.mk +++ b/common.mk @@ -400,7 +400,7 @@ PRODUCT_PACKAGES += \ # Vibrator PRODUCT_PACKAGES += \ - android.hardware.vibrator-service.sm7125 + android.hardware.vibrator-service.samsung # Tether PRODUCT_PACKAGES += \ diff --git a/sepolicy/vendor/file_contexts b/sepolicy/vendor/file_contexts index 41e0511..d648110 100644 --- a/sepolicy/vendor/file_contexts +++ b/sepolicy/vendor/file_contexts @@ -62,5 +62,5 @@ /(vendor|system/vendor)/bin/hw/android.hardware.biometrics.fingerprint@2.3-service-samsung.sm7125 u:object_r:hal_fingerprint_default_exec:s0 /(vendor|system/vendor)/bin/hw/vendor.samsung.hardware.thermal@1.0-service u:object_r:hal_thermal_default_exec:s0 /(vendor|system/vendor)/bin/hw/android.hardware.sensors-service.samsung-multihal u:object_r:hal_sensors_default_exec:s0 -/(vendor|system/vendor)/bin/hw/android.hardware.vibrator-service.sm7125 u:object_r:hal_vibrator_default_exec:s0 +/(vendor|system/vendor)/bin/hw/android\.hardware\.vibrator\-service\.samsung u:object_r:hal_vibrator_default_exec:s0 /(vendor|system/vendor)/bin/hw/android\.hardware\.health@2\.1-service-samsung u:object_r:hal_health_default_exec:s0 diff --git a/vibrator/Android.bp b/vibrator/Android.bp deleted file mode 100644 index 6d0ac09..0000000 --- a/vibrator/Android.bp +++ /dev/null @@ -1,22 +0,0 @@ -// -// Copyright (C) 2022 The LineageOS Project -// -// SPDX-License-Identifier: Apache-2.0 -// - -cc_binary { - name: "android.hardware.vibrator-service.sm7125", - relative_install_path: "hw", - init_rc: ["android.hardware.vibrator-service.sm7125.rc"], - vintf_fragments: ["android.hardware.vibrator-service.sm7125.xml"], - srcs: [ - "Vibrator.cpp", - "service.cpp", - ], - shared_libs: [ - "libbase", - "libbinder_ndk", - "android.hardware.vibrator-V2-ndk", - ], - vendor: true, -} diff --git a/vibrator/Vibrator.cpp b/vibrator/Vibrator.cpp deleted file mode 100644 index d20e630..0000000 --- a/vibrator/Vibrator.cpp +++ /dev/null @@ -1,269 +0,0 @@ -/* - * Copyright (C) 2022 The LineageOS Project - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include "Vibrator.h" - -#include - -#include -#include -#include -#include - -namespace aidl { -namespace android { -namespace hardware { -namespace vibrator { - -/* - * Write value to path and close file. - */ -template -static ndk::ScopedAStatus writeNode(const std::string& path, const T& value) { - std::ofstream node(path); - if (!node) { - LOG(ERROR) << "Failed to open: " << path; - return ndk::ScopedAStatus::fromStatus(STATUS_UNKNOWN_ERROR); - } - - LOG(DEBUG) << "writeNode node: " << path << " value: " << value; - - node << value << std::endl; - if (!node) { - LOG(ERROR) << "Failed to write: " << value; - return ndk::ScopedAStatus::fromStatus(STATUS_UNKNOWN_ERROR); - } - - return ndk::ScopedAStatus::ok(); -} - -static bool nodeExists(const std::string& path) { - std::ofstream f(path.c_str()); - return f.good(); -} - -Vibrator::Vibrator() { - mIsTimedOutVibrator = nodeExists(VIBRATOR_TIMEOUT_PATH); - mHasTimedOutIntensity = nodeExists(VIBRATOR_INTENSITY_PATH); -} - -ndk::ScopedAStatus Vibrator::getCapabilities(int32_t* _aidl_return) { - *_aidl_return = IVibrator::CAP_ON_CALLBACK | IVibrator::CAP_PERFORM_CALLBACK | - IVibrator::CAP_EXTERNAL_CONTROL /*| IVibrator::CAP_COMPOSE_EFFECTS | - IVibrator::CAP_ALWAYS_ON_CONTROL*/; - - if (mHasTimedOutIntensity) { - *_aidl_return = *_aidl_return | IVibrator::CAP_AMPLITUDE_CONTROL | - IVibrator::CAP_EXTERNAL_AMPLITUDE_CONTROL; - } - - return ndk::ScopedAStatus::ok(); -} - -ndk::ScopedAStatus Vibrator::off() { - return activate(0); -} - -ndk::ScopedAStatus Vibrator::on(int32_t timeoutMs, const std::shared_ptr& callback) { - ndk::ScopedAStatus status = activate(timeoutMs); - - if (callback != nullptr) { - std::thread([=] { - LOG(INFO) << "Starting on on another thread"; - usleep(timeoutMs * 1000); - LOG(INFO) << "Notifying on complete"; - if (!callback->onComplete().isOk()) { - LOG(ERROR) << "Failed to call onComplete"; - } - }).detach(); - } - - return status; -} - -ndk::ScopedAStatus Vibrator::perform(Effect effect, EffectStrength strength, const std::shared_ptr& callback, int32_t* _aidl_return) { - ndk::ScopedAStatus status; - float amplitude; - uint32_t ms; - - amplitude = strengthToAmplitude(strength, &status); - if (!status.isOk()) { - return status; - } - setAmplitude(amplitude); - - ms = effectToMs(effect, &status); - if (!status.isOk()) { - return status; - } - status = activate(ms); - - if (callback != nullptr) { - std::thread([=] { - LOG(INFO) << "Starting perform on another thread"; - usleep(ms * 1000); - LOG(INFO) << "Notifying perform complete"; - callback->onComplete(); - }).detach(); - } - - *_aidl_return = ms; - return status; -} - -ndk::ScopedAStatus Vibrator::getSupportedEffects(std::vector* _aidl_return) { - *_aidl_return = { Effect::CLICK, Effect::TICK }; - return ndk::ScopedAStatus::ok(); -} - -ndk::ScopedAStatus Vibrator::setAmplitude(float amplitude) { - uint32_t intensity; - - if (amplitude <= 0.0f || amplitude > 1.0f) { - return ndk::ScopedAStatus(AStatus_fromExceptionCode(EX_ILLEGAL_ARGUMENT)); - } - - LOG(DEBUG) << "Setting amplitude: " << amplitude; - - intensity = amplitude * INTENSITY_MAX; - - LOG(DEBUG) << "Setting intensity: " << intensity; - - return writeNode(VIBRATOR_TIMEOUT_PATH, intensity); -} - -ndk::ScopedAStatus Vibrator::setExternalControl(bool enabled) { - if (mEnabled) { - LOG(WARNING) << "Setting external control while the vibrator is enabled is " - "unsupported!"; - return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); - } - - LOG(INFO) << "ExternalControl: " << mExternalControl << " -> " << enabled; - mExternalControl = enabled; - return ndk::ScopedAStatus::ok(); -} - -ndk::ScopedAStatus Vibrator::getCompositionDelayMax(int32_t* /*_aidl_return*/) { - return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); -} - -ndk::ScopedAStatus Vibrator::getCompositionSizeMax(int32_t* /*_aidl_return*/) { - return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); -} - -ndk::ScopedAStatus Vibrator::getSupportedPrimitives(std::vector* /*_aidl_return*/) { - return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); -} - -ndk::ScopedAStatus Vibrator::getPrimitiveDuration(CompositePrimitive /*primitive*/, int32_t* /*_aidl_return*/) { - return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); -} - -ndk::ScopedAStatus Vibrator::compose(const std::vector& /*composite*/, const std::shared_ptr& /*callback*/) { - return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); -} - -ndk::ScopedAStatus Vibrator::getSupportedAlwaysOnEffects(std::vector* /*_aidl_return*/) { - return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); -} - -ndk::ScopedAStatus Vibrator::alwaysOnEnable(int32_t /*id*/, Effect /*effect*/, EffectStrength /*strength*/) { - return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); -} - -ndk::ScopedAStatus Vibrator::alwaysOnDisable(int32_t /*id*/) { - return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); -} - -ndk::ScopedAStatus Vibrator::getResonantFrequency(float* /*_aidl_return*/) { - return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); -} - -ndk::ScopedAStatus Vibrator::getQFactor(float* /*_aidl_return*/) { - return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); -} - -ndk::ScopedAStatus Vibrator::getFrequencyResolution(float* /*_aidl_return*/) { - return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); -} - -ndk::ScopedAStatus Vibrator::getFrequencyMinimum(float* /*_aidl_return*/) { - return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); -} - -ndk::ScopedAStatus Vibrator::getBandwidthAmplitudeMap(std::vector* /*_aidl_return*/) { - return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); -} - -ndk::ScopedAStatus Vibrator::getPwlePrimitiveDurationMax(int32_t* /*_aidl_return*/) { - return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); -} - -ndk::ScopedAStatus Vibrator::getPwleCompositionSizeMax(int32_t* /*_aidl_return*/) { - return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); -} - -ndk::ScopedAStatus Vibrator::getSupportedBraking(std::vector* /*_aidl_return*/) { - return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); -} - -ndk::ScopedAStatus Vibrator::composePwle(const std::vector& /*composite*/, const std::shared_ptr& /*callback*/) { - return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); -} - -ndk::ScopedAStatus Vibrator::activate(uint32_t timeoutMs) { - std::lock_guard lock{mMutex}; - if (!mIsTimedOutVibrator) { - return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); - } - - /* We mostly get values that are 20ms and lower, but - that's not enough to be actually noticeable. Set it to - 30ms if timeoutMs is less than that. */ - if (timeoutMs < INTENSITY_MIN) { - timeoutMs = INTENSITY_MIN; - } - - return writeNode(VIBRATOR_TIMEOUT_PATH, timeoutMs); -} - -float Vibrator::strengthToAmplitude(EffectStrength strength, ndk::ScopedAStatus* status) { - *status = ndk::ScopedAStatus::ok(); - - switch (strength) { - case EffectStrength::LIGHT: - return AMPLITUDE_LIGHT; - case EffectStrength::MEDIUM: - return AMPLITUDE_MEDIUM; - case EffectStrength::STRONG: - return AMPLITUDE_STRONG; - } - - *status = ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); - return 0; -} - -uint32_t Vibrator::effectToMs(Effect effect, ndk::ScopedAStatus* status) { - *status = ndk::ScopedAStatus::ok(); - - switch (effect) { - case Effect::CLICK: - return 10; - case Effect::TICK: - return 5; - default: - break; - } - - *status = ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); - return 0; -} - -} // namespace vibrator -} // namespace hardware -} // namespace android -} // namespace aidl diff --git a/vibrator/Vibrator.h b/vibrator/Vibrator.h deleted file mode 100644 index d5a4bb2..0000000 --- a/vibrator/Vibrator.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2022 The LineageOS Project - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#pragma once - -#include - -#define INTENSITY_MIN 30 -#define INTENSITY_MAX 10000 -#define INTENSITY_DEFAULT INTENSITY_MAX - -#define AMPLITUDE_LIGHT 0.25 -#define AMPLITUDE_MEDIUM 0.5 -#define AMPLITUDE_STRONG 1 - -#define VIBRATOR_TIMEOUT_PATH "/sys/class/timed_output/vibrator/enable" -#define VIBRATOR_INTENSITY_PATH "/sys/class/timed_output/vibrator/intensity" - -using ::aidl::android::hardware::vibrator::IVibratorCallback; -using ::aidl::android::hardware::vibrator::Braking; -using ::aidl::android::hardware::vibrator::Effect; -using ::aidl::android::hardware::vibrator::EffectStrength; -using ::aidl::android::hardware::vibrator::CompositeEffect; -using ::aidl::android::hardware::vibrator::CompositePrimitive; -using ::aidl::android::hardware::vibrator::PrimitivePwle; - -namespace aidl { -namespace android { -namespace hardware { -namespace vibrator { - -class Vibrator : public BnVibrator { -public: - Vibrator(); - ndk::ScopedAStatus getCapabilities(int32_t* _aidl_return) override; - ndk::ScopedAStatus off() override; - ndk::ScopedAStatus on(int32_t timeoutMs, const std::shared_ptr& callback) override; - ndk::ScopedAStatus perform(Effect effect, EffectStrength strength, const std::shared_ptr& callback, int32_t* _aidl_return) override; - ndk::ScopedAStatus getSupportedEffects(std::vector* _aidl_return) override; - ndk::ScopedAStatus setAmplitude(float amplitude) override; - ndk::ScopedAStatus setExternalControl(bool enabled) override; - ndk::ScopedAStatus getCompositionDelayMax(int32_t* _aidl_return) override; - ndk::ScopedAStatus getCompositionSizeMax(int32_t* _aidl_return) override; - ndk::ScopedAStatus getSupportedPrimitives(std::vector* _aidl_return) override; - ndk::ScopedAStatus getPrimitiveDuration(CompositePrimitive primitive, int32_t* _aidl_return) override; - ndk::ScopedAStatus compose(const std::vector& composite, const std::shared_ptr& callback) override; - ndk::ScopedAStatus getSupportedAlwaysOnEffects(std::vector* _aidl_return) override; - ndk::ScopedAStatus alwaysOnEnable(int32_t id, Effect effect, EffectStrength strength) override; - ndk::ScopedAStatus alwaysOnDisable(int32_t id) override; - ndk::ScopedAStatus getResonantFrequency(float* _aidl_return) override; - ndk::ScopedAStatus getQFactor(float* _aidl_return) override; - ndk::ScopedAStatus getFrequencyResolution(float* _aidl_return) override; - ndk::ScopedAStatus getFrequencyMinimum(float* _aidl_return) override; - ndk::ScopedAStatus getBandwidthAmplitudeMap(std::vector* _aidl_return) override; - ndk::ScopedAStatus getPwlePrimitiveDurationMax(int32_t* _aidl_return) override; - ndk::ScopedAStatus getPwleCompositionSizeMax(int32_t* _aidl_return) override; - ndk::ScopedAStatus getSupportedBraking(std::vector* _aidl_return) override; - ndk::ScopedAStatus composePwle(const std::vector& composite, const std::shared_ptr& callback) override; - -private: - ndk::ScopedAStatus activate(uint32_t ms); - static uint32_t effectToMs(Effect effect, ndk::ScopedAStatus* status); - static float strengthToAmplitude(EffectStrength strength, ndk::ScopedAStatus* status); - - bool mEnabled{false}; - bool mExternalControl{false}; - std::mutex mMutex; - - bool mIsTimedOutVibrator; - bool mHasTimedOutIntensity; -}; - -} // namespace vibrator -} // namespace hardware -} // namespace android -} // namespace aidl diff --git a/vibrator/android.hardware.vibrator-service.sm7125.rc b/vibrator/android.hardware.vibrator-service.sm7125.rc deleted file mode 100644 index 7206472..0000000 --- a/vibrator/android.hardware.vibrator-service.sm7125.rc +++ /dev/null @@ -1,5 +0,0 @@ -service vendor.vibrator-default /vendor/bin/hw/android.hardware.vibrator-service.sm7125 - class hal - user system - group system - shutdown critical diff --git a/vibrator/android.hardware.vibrator-service.sm7125.xml b/vibrator/android.hardware.vibrator-service.sm7125.xml deleted file mode 100644 index 49b11ec..0000000 --- a/vibrator/android.hardware.vibrator-service.sm7125.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - android.hardware.vibrator - IVibrator/default - - diff --git a/vibrator/service.cpp b/vibrator/service.cpp deleted file mode 100644 index c345b6e..0000000 --- a/vibrator/service.cpp +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2022 The LineageOS Project - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include "Vibrator.h" - -#include -#include -#include - -using ::aidl::android::hardware::vibrator::Vibrator; - -int main() { - ABinderProcess_setThreadPoolMaxThreadCount(0); - std::shared_ptr vibrator = ndk::SharedRefBase::make(); - - const std::string instance = std::string() + Vibrator::descriptor + "/default"; - binder_status_t status = AServiceManager_addService(vibrator->asBinder().get(), instance.c_str()); - CHECK(status == STATUS_OK); - - ABinderProcess_joinThreadPool(); - return EXIT_FAILURE; // should not reach -}