From a4922f4f1ce82f5f82b97cc9cc151d495c85cf66 Mon Sep 17 00:00:00 2001 From: Jesse Chan Date: Wed, 2 May 2018 17:09:59 -0700 Subject: [PATCH] samsung: hidl: add vibrator HAL for SEC Haptic Engine Change-Id: I758b40deb4e0b8bfda1aa9a24c27207d3f3d7dbe --- hidl/vibrator/haptic/Android.bp | 30 +++++ hidl/vibrator/haptic/Vibrator.cpp | 121 ++++++++++++++++++ hidl/vibrator/haptic/Vibrator.h | 53 ++++++++ ...are.vibrator@1.0-service.samsung-haptic.rc | 4 + hidl/vibrator/haptic/service.cpp | 64 +++++++++ 5 files changed, 272 insertions(+) create mode 100644 hidl/vibrator/haptic/Android.bp create mode 100644 hidl/vibrator/haptic/Vibrator.cpp create mode 100644 hidl/vibrator/haptic/Vibrator.h create mode 100644 hidl/vibrator/haptic/android.hardware.vibrator@1.0-service.samsung-haptic.rc create mode 100644 hidl/vibrator/haptic/service.cpp diff --git a/hidl/vibrator/haptic/Android.bp b/hidl/vibrator/haptic/Android.bp new file mode 100644 index 00000000..3eef74d3 --- /dev/null +++ b/hidl/vibrator/haptic/Android.bp @@ -0,0 +1,30 @@ +// Copyright (C) 2019 The LineageOS 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_binary { + name: "android.hardware.vibrator@1.0-service.samsung-haptic", + defaults: ["hidl_defaults"], + vendor: true, + relative_install_path: "hw", + init_rc: ["android.hardware.vibrator@1.0-service.samsung-haptic.rc"], + srcs: ["service.cpp", "Vibrator.cpp"], + shared_libs: [ + "libbase", + "libhidlbase", + "liblog", + "libutils", + "libhardware", + "android.hardware.vibrator@1.0", + ], +} diff --git a/hidl/vibrator/haptic/Vibrator.cpp b/hidl/vibrator/haptic/Vibrator.cpp new file mode 100644 index 00000000..96d8627c --- /dev/null +++ b/hidl/vibrator/haptic/Vibrator.cpp @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2019 The LineageOS 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 "android.hardware.vibrator@1.0-service.samsung-haptic" + +#include + +#include + +#include +#include + +#include "Vibrator.h" + +#include +#include +#include +#include + +namespace android { +namespace hardware { +namespace vibrator { +namespace V1_0 { +namespace implementation { + +/* + * Write value to path and close file. + */ +template +static void set(const std::string& path, const T& value) { + std::ofstream file(path); + file << value << std::endl; +} + +Vibrator::Vibrator() { + mIntensity = 10000; +} + +// SEC Haptic Engine +Return Vibrator::doHaptic(int timeout, int intensity, int freq, int overdrive) { + std::string haptic = + android::base::StringPrintf("4 %d %d %d %d", timeout, intensity, freq, overdrive); + set("/sys/class/timed_output/vibrator/haptic_engine", haptic); + set("/sys/class/timed_output/vibrator/enable", 1); + + return Status::OK; +} + +// Methods from ::android::hardware::vibrator::V1_0::IVibrator follow. +Return Vibrator::on(uint32_t timeout_ms) { + return doHaptic(timeout_ms, mIntensity, 0, 0); +} + +Return Vibrator::off() { + set("/sys/class/timed_output/vibrator/enable", 0); + return Status::OK; +} + +Return Vibrator::supportsAmplitudeControl() { + return true; +} + +Return Vibrator::setAmplitude(uint8_t amplitude) { + if (amplitude == 0) { + return Status::BAD_VALUE; + } + mIntensity = amplitude * 10000 / 255; + return Status::OK; +} + +Return Vibrator::perform(Effect effect, EffectStrength strength, perform_cb _hidl_cb) { + Status status = Status::OK; + uint32_t timeMS; + uint32_t intensity; + + switch (strength) { + case EffectStrength::LIGHT: + intensity = 1000; + break; + case EffectStrength::STRONG: + intensity = 5000; + break; + default: + intensity = 3000; + break; + } + + switch (effect) { + case Effect::CLICK: + case Effect::DOUBLE_CLICK: + status = doHaptic(7, intensity, 2000, 1); + timeMS = 7; + break; + default: + status = Status::UNSUPPORTED_OPERATION; + timeMS = 0; + break; + } + + _hidl_cb(status, timeMS); + return Void(); +} + +} // namespace implementation +} // namespace V1_0 +} // namespace vibrator +} // namespace hardware +} // namespace android diff --git a/hidl/vibrator/haptic/Vibrator.h b/hidl/vibrator/haptic/Vibrator.h new file mode 100644 index 00000000..e40dac3d --- /dev/null +++ b/hidl/vibrator/haptic/Vibrator.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2019 The LineageOS 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 ANDROID_HARDWARE_VIBRATOR_V1_0_VIBRATOR_H +#define ANDROID_HARDWARE_VIBRATOR_V1_0_VIBRATOR_H + +#include +#include + +#include + +namespace android { +namespace hardware { +namespace vibrator { +namespace V1_0 { +namespace implementation { + +class Vibrator : public IVibrator { + public: + Vibrator(); + + // Methods from ::android::hardware::vibrator::V1_0::IVibrator follow. + Return on(uint32_t timeoutMs) override; + Return off() override; + Return supportsAmplitudeControl() override; + Return setAmplitude(uint8_t) override; + Return perform(Effect effect, EffectStrength strength, perform_cb _hidl_cb) override; + + private: + Return doHaptic(int timeout, int intensity, int freq, int overdrive); + uint32_t mIntensity; +}; + +} // namespace implementation +} // namespace V1_0 +} // namespace vibrator +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_VIBRATOR_V1_0_VIBRATOR_H diff --git a/hidl/vibrator/haptic/android.hardware.vibrator@1.0-service.samsung-haptic.rc b/hidl/vibrator/haptic/android.hardware.vibrator@1.0-service.samsung-haptic.rc new file mode 100644 index 00000000..103b14f6 --- /dev/null +++ b/hidl/vibrator/haptic/android.hardware.vibrator@1.0-service.samsung-haptic.rc @@ -0,0 +1,4 @@ +service vendor.vibrator-1-0 /vendor/bin/hw/android.hardware.vibrator@1.0-service.samsung-haptic + class hal + user system + group system diff --git a/hidl/vibrator/haptic/service.cpp b/hidl/vibrator/haptic/service.cpp new file mode 100644 index 00000000..9b4e3557 --- /dev/null +++ b/hidl/vibrator/haptic/service.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2019 The LineageOS 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 "android.hardware.vibrator@1.0-service.samsung-haptic" + +#include +#include +#include +#include +#include +#include + +#include "Vibrator.h" + +using android::hardware::configureRpcThreadpool; +using android::hardware::joinRpcThreadpool; +using android::hardware::vibrator::V1_0::IVibrator; +using android::hardware::vibrator::V1_0::implementation::Vibrator; + +using android::OK; +using android::sp; +using android::status_t; + +int main() { + status_t status; + sp vibrator; + + LOG(INFO) << "Vibrator HAL service is starting."; + + vibrator = new Vibrator(); + if (vibrator == nullptr) { + LOG(ERROR) << "Can not create an instance of Vibrator HAL IVibrator, exiting."; + goto shutdown; + } + + configureRpcThreadpool(1, true); + + status = vibrator->registerAsService(); + if (status != OK) { + LOG(ERROR) << "Could not register service for Vibrator HAL"; + goto shutdown; + } + + LOG(INFO) << "Vibrator HAL service is Ready."; + joinRpcThreadpool(); + +shutdown: + // In normal operation, we don't expect the thread pool to shutdown + LOG(ERROR) << "Vibrator HAL failed to join thread pool."; + return 1; +}