From: Jesse Chan Date: Thu, 3 May 2018 00:09:59 +0000 (-0700) Subject: universal8895: add vibrator HAL for SEC Haptic Engine X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=cd64c7ef084a19640049db205be23d36005cc540;p=GitHub%2Fexynos8895%2Fandroid_device_samsung_universal8895-common.git universal8895: add vibrator HAL for SEC Haptic Engine Change-Id: I758b40deb4e0b8bfda1aa9a24c27207d3f3d7dbe --- diff --git a/device-common.mk b/device-common.mk index c343dd1..948be99 100644 --- a/device-common.mk +++ b/device-common.mk @@ -227,6 +227,10 @@ PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \ android.hardware.usb@1.0-service.basic +# Vibrator +PRODUCT_PACKAGES += \ + android.hardware.vibrator@1.0-service.universal8895 + # Wifi PRODUCT_PACKAGES += \ macloader \ diff --git a/hidl/Android.mk b/hidl/Android.mk new file mode 100644 index 0000000..26e32a7 --- /dev/null +++ b/hidl/Android.mk @@ -0,0 +1,17 @@ +# +# 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. +# + +include $(call all-subdir-makefiles) diff --git a/hidl/vibrator/Android.mk b/hidl/vibrator/Android.mk new file mode 100644 index 0000000..b497326 --- /dev/null +++ b/hidl/vibrator/Android.mk @@ -0,0 +1,40 @@ +# +# 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. +# + +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE_RELATIVE_PATH := hw +LOCAL_MODULE_TAGS := optional +LOCAL_VENDOR_MODULE := true + +LOCAL_MODULE := android.hardware.vibrator@1.0-service.universal8895 +LOCAL_INIT_RC := android.hardware.vibrator@1.0-service.universal8895.rc +LOCAL_SRC_FILES := service.cpp \ + Vibrator.cpp + +LOCAL_SHARED_LIBRARIES := \ + libbase \ + liblog \ + libdl \ + libhidlbase \ + libhidltransport \ + libhardware \ + libutils \ + android.hardware.vibrator@1.0 + +include $(BUILD_EXECUTABLE) diff --git a/hidl/vibrator/Vibrator.cpp b/hidl/vibrator/Vibrator.cpp new file mode 100644 index 0000000..dbc2175 --- /dev/null +++ b/hidl/vibrator/Vibrator.cpp @@ -0,0 +1,119 @@ +/* + * 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.universal8895" + +#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) { + char haptic[32]; + snprintf(haptic, sizeof(haptic) - 1, "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/Vibrator.h b/hidl/vibrator/Vibrator.h new file mode 100644 index 0000000..25950e2 --- /dev/null +++ b/hidl/vibrator/Vibrator.h @@ -0,0 +1,55 @@ +/* + * 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); + std::ofstream mEnable; + std::ofstream mHaptic; + 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/android.hardware.vibrator@1.0-service.universal8895.rc b/hidl/vibrator/android.hardware.vibrator@1.0-service.universal8895.rc new file mode 100644 index 0000000..7281e2b --- /dev/null +++ b/hidl/vibrator/android.hardware.vibrator@1.0-service.universal8895.rc @@ -0,0 +1,4 @@ +service vendor.vibrator-1-0 /vendor/bin/hw/android.hardware.vibrator@1.0-service.universal8895 + class hal + user system + group system diff --git a/hidl/vibrator/service.cpp b/hidl/vibrator/service.cpp new file mode 100644 index 0000000..186ce31 --- /dev/null +++ b/hidl/vibrator/service.cpp @@ -0,0 +1,61 @@ +/* + * 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.universal8895" + +#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 namespace android; + +int main() { + status_t status; + sp vibrator; + + LOG(INFO) << "Light 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; +}