diff options
author | Jesse Chan <jc@lineageos.org> | 2018-05-02 17:09:59 -0700 |
---|---|---|
committer | Jan Altensen <info@stricted.net> | 2020-02-04 02:34:36 +0100 |
commit | a4922f4f1ce82f5f82b97cc9cc151d495c85cf66 (patch) | |
tree | 6b86c8ae7cd3192034db147147899f5adc3bae63 | |
parent | 83cc460bb7e784a07d0b2eb640505795aad7fbb9 (diff) | |
download | hardware_samsung-a4922f4f1ce82f5f82b97cc9cc151d495c85cf66.tar.gz hardware_samsung-a4922f4f1ce82f5f82b97cc9cc151d495c85cf66.tar.bz2 hardware_samsung-a4922f4f1ce82f5f82b97cc9cc151d495c85cf66.zip |
samsung: hidl: add vibrator HAL for SEC Haptic Engine
Change-Id: I758b40deb4e0b8bfda1aa9a24c27207d3f3d7dbe
-rw-r--r-- | hidl/vibrator/haptic/Android.bp | 30 | ||||
-rw-r--r-- | hidl/vibrator/haptic/Vibrator.cpp | 121 | ||||
-rw-r--r-- | hidl/vibrator/haptic/Vibrator.h | 53 | ||||
-rw-r--r-- | hidl/vibrator/haptic/android.hardware.vibrator@1.0-service.samsung-haptic.rc | 4 | ||||
-rw-r--r-- | hidl/vibrator/haptic/service.cpp | 64 |
5 files changed, 272 insertions, 0 deletions
diff --git a/hidl/vibrator/haptic/Android.bp b/hidl/vibrator/haptic/Android.bp new file mode 100644 index 0000000..3eef74d --- /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 0000000..96d8627 --- /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 <log/log.h> + +#include <android-base/stringprintf.h> + +#include <hardware/hardware.h> +#include <hardware/vibrator.h> + +#include "Vibrator.h" + +#include <cinttypes> +#include <cmath> +#include <fstream> +#include <iostream> + +namespace android { +namespace hardware { +namespace vibrator { +namespace V1_0 { +namespace implementation { + +/* + * Write value to path and close file. + */ +template <typename T> +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<Status> 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<Status> Vibrator::on(uint32_t timeout_ms) { + return doHaptic(timeout_ms, mIntensity, 0, 0); +} + +Return<Status> Vibrator::off() { + set("/sys/class/timed_output/vibrator/enable", 0); + return Status::OK; +} + +Return<bool> Vibrator::supportsAmplitudeControl() { + return true; +} + +Return<Status> Vibrator::setAmplitude(uint8_t amplitude) { + if (amplitude == 0) { + return Status::BAD_VALUE; + } + mIntensity = amplitude * 10000 / 255; + return Status::OK; +} + +Return<void> 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 0000000..e40dac3 --- /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 <android/hardware/vibrator/1.0/IVibrator.h> +#include <hidl/Status.h> + +#include <fstream> + +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<Status> on(uint32_t timeoutMs) override; + Return<Status> off() override; + Return<bool> supportsAmplitudeControl() override; + Return<Status> setAmplitude(uint8_t) override; + Return<void> perform(Effect effect, EffectStrength strength, perform_cb _hidl_cb) override; + + private: + Return<Status> 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 0000000..103b14f --- /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 0000000..9b4e355 --- /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 <android-base/logging.h> +#include <android/hardware/vibrator/1.0/IVibrator.h> +#include <hidl/HidlSupport.h> +#include <hidl/HidlTransportSupport.h> +#include <utils/Errors.h> +#include <utils/StrongPointer.h> + +#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<IVibrator> 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; +} |