From ac23ec6af9b7cbc8ed4cc2ba491b77ce63a1297b Mon Sep 17 00:00:00 2001 From: Demon000 Date: Tue, 2 Jul 2019 01:32:47 +0200 Subject: [PATCH] davinci: fod: Implement in-screen fingerprint HAL Change-Id: I8fd985bf4eab1747351f9e717cc33fa6d5ab1517 --- device.mk | 10 +- fod/Android.bp | 38 +++++ fod/FingerprintInscreen.cpp | 148 ++++++++++++++++++ fod/FingerprintInscreen.h | 67 ++++++++ fod/service.cpp | 50 ++++++ ...ingerprint.inscreen@1.0-service.davinci.rc | 13 ++ ...ngerprint.inscreen@1.0-service.davinci.xml | 11 ++ .../packages/SystemUI/res/values/config.xml | 3 + 8 files changed, 339 insertions(+), 1 deletion(-) create mode 100644 fod/Android.bp create mode 100644 fod/FingerprintInscreen.cpp create mode 100644 fod/FingerprintInscreen.h create mode 100644 fod/service.cpp create mode 100644 fod/vendor.lineage.biometrics.fingerprint.inscreen@1.0-service.davinci.rc create mode 100644 fod/vendor.lineage.biometrics.fingerprint.inscreen@1.0-service.davinci.xml diff --git a/device.mk b/device.mk index 1a2a923..2898601 100644 --- a/device.mk +++ b/device.mk @@ -55,6 +55,13 @@ PRODUCT_COPY_FILES += \ PRODUCT_PACKAGES += \ XiaomiParts +# Fingerprint +PRODUCT_PACKAGES += \ + vendor.lineage.biometrics.fingerprint.inscreen@1.0-service.davinci + +PRODUCT_COPY_FILES += \ + vendor/lineage/config/permissions/vendor.lineage.biometrics.fingerprint.inscreen.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/vendor.lineage.biometrics.fingerprint.inscreen.xml + # HIDL PRODUCT_PACKAGES += \ android.hidl.base@1.0 \ @@ -90,4 +97,5 @@ TARGET_SCREEN_DENSITY := 440 # Soong namespaces PRODUCT_SOONG_NAMESPACES += \ - $(LOCAL_PATH) + $(LOCAL_PATH) \ + hardware/xiaomi diff --git a/fod/Android.bp b/fod/Android.bp new file mode 100644 index 0000000..0263461 --- /dev/null +++ b/fod/Android.bp @@ -0,0 +1,38 @@ +// +// 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: "vendor.lineage.biometrics.fingerprint.inscreen@1.0-service.davinci", + vintf_fragments: ["vendor.lineage.biometrics.fingerprint.inscreen@1.0-service.davinci.xml"], + init_rc: ["vendor.lineage.biometrics.fingerprint.inscreen@1.0-service.davinci.rc"], + defaults: ["hidl_defaults"], + relative_install_path: "hw", + srcs: [ + "service.cpp", + "FingerprintInscreen.cpp", + ], + vendor: true, + shared_libs: [ + "libbase", + "libhardware", + "libhidlbase", + "libhidltransport", + "liblog", + "libhwbinder", + "libutils", + "vendor.lineage.biometrics.fingerprint.inscreen@1.0", + "vendor.xiaomi.hardware.fingerprintextension@1.0", + ], +} diff --git a/fod/FingerprintInscreen.cpp b/fod/FingerprintInscreen.cpp new file mode 100644 index 0000000..1f6c666 --- /dev/null +++ b/fod/FingerprintInscreen.cpp @@ -0,0 +1,148 @@ +/* + * 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 "FingerprintInscreenService" + +#include "FingerprintInscreen.h" + +#include +#include +#include + +#define COMMAND_NIT 10 +#define PARAM_NIT_FOD 3 +#define PARAM_NIT_NONE 0 + +#define FOD_HBM_PATH "/sys/devices/platform/soc/soc:qcom,dsi-display/fod_hbm" +#define FOD_HBM_ON 1 +#define FOD_HBM_OFF 0 + +#define FOD_STATUS_PATH "/sys/devices/virtual/touch/tp_dev/fod_status" +#define FOD_STATUS_ON 1 +#define FOD_STATUS_OFF 0 + +#define FOD_SENSOR_X 445 +#define FOD_SENSOR_Y 1931 +#define FOD_SENSOR_SIZE 190 + +namespace { + +template +static void set(const std::string& path, const T& value) { + std::ofstream file(path); + file << value; +} + +} // anonymous namespace + +namespace vendor { +namespace lineage { +namespace biometrics { +namespace fingerprint { +namespace inscreen { +namespace V1_0 { +namespace implementation { + +FingerprintInscreen::FingerprintInscreen() { + xiaomiFingerprintService = IXiaomiFingerprint::getService(); +} + +Return FingerprintInscreen::getPositionX() { + return FOD_SENSOR_X; +} + +Return FingerprintInscreen::getPositionY() { + return FOD_SENSOR_Y; +} + +Return FingerprintInscreen::getSize() { + return FOD_SENSOR_SIZE; +} + +Return FingerprintInscreen::onStartEnroll() { + return Void(); +} + +Return FingerprintInscreen::onFinishEnroll() { + return Void(); +} + +Return FingerprintInscreen::onPress() { + set(FOD_HBM_PATH, FOD_HBM_ON); + xiaomiFingerprintService->extCmd(COMMAND_NIT, PARAM_NIT_FOD); + return Void(); +} + +Return FingerprintInscreen::onRelease() { + set(FOD_HBM_PATH, FOD_HBM_OFF); + xiaomiFingerprintService->extCmd(COMMAND_NIT, PARAM_NIT_NONE); + return Void(); +} + +Return FingerprintInscreen::onShowFODView() { + set(FOD_STATUS_PATH, FOD_STATUS_ON); + return Void(); +} + +Return FingerprintInscreen::onHideFODView() { + set(FOD_STATUS_PATH, FOD_STATUS_OFF); + set(FOD_HBM_PATH, FOD_HBM_OFF); + xiaomiFingerprintService->extCmd(COMMAND_NIT, PARAM_NIT_NONE); + return Void(); +} + +Return FingerprintInscreen::handleAcquired(int32_t acquiredInfo, int32_t vendorCode) { + LOG(ERROR) << "acquiredInfo: " << acquiredInfo << ", vendorCode: " << vendorCode << "\n"; + return false; +} + +Return FingerprintInscreen::handleError(int32_t error, int32_t vendorCode) { + LOG(ERROR) << "error: " << error << ", vendorCode: " << vendorCode << "\n"; + return false; +} + +Return FingerprintInscreen::setLongPressEnabled(bool) { + return Void(); +} + +Return FingerprintInscreen::getDimAmount(int32_t brightness) { + float alpha; + + if (brightness > 62) { + alpha = 1.0 - pow(brightness / 255.0 * 430.0 / 600.0, 0.45); + } else { + alpha = 1.0 - pow(brightness / 200.0, 0.45); + } + + return 255 * alpha; +} + +Return FingerprintInscreen::shouldBoostBrightness() { + return false; +} + +Return FingerprintInscreen::setCallback(const sp<::vendor::lineage::biometrics::fingerprint::inscreen::V1_0::IFingerprintInscreenCallback>& callback) { + (void) callback; + return Void(); +} + +} // namespace implementation +} // namespace V1_0 +} // namespace inscreen +} // namespace fingerprint +} // namespace biometrics +} // namespace lineage +} // namespace vendor diff --git a/fod/FingerprintInscreen.h b/fod/FingerprintInscreen.h new file mode 100644 index 0000000..30f362b --- /dev/null +++ b/fod/FingerprintInscreen.h @@ -0,0 +1,67 @@ +/* + * 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 VENDOR_LINEAGE_BIOMETRICS_FINGERPRINT_INSCREEN_V1_0_FINGERPRINTINSCREEN_H +#define VENDOR_LINEAGE_BIOMETRICS_FINGERPRINT_INSCREEN_V1_0_FINGERPRINTINSCREEN_H + +#include +#include + +namespace vendor { +namespace lineage { +namespace biometrics { +namespace fingerprint { +namespace inscreen { +namespace V1_0 { +namespace implementation { + +using ::android::sp; +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::vendor::xiaomi::hardware::fingerprintextension::V1_0::IXiaomiFingerprint; + +class FingerprintInscreen : public IFingerprintInscreen { +public: + FingerprintInscreen(); + Return getPositionX() override; + Return getPositionY() override; + Return getSize() override; + Return onStartEnroll() override; + Return onFinishEnroll() override; + Return onPress() override; + Return onRelease() override; + Return onShowFODView() override; + Return onHideFODView() override; + Return handleAcquired(int32_t acquiredInfo, int32_t vendorCode) override; + Return handleError(int32_t error, int32_t vendorCode) override; + Return setLongPressEnabled(bool enabled) override; + Return getDimAmount(int32_t brightness) override; + Return shouldBoostBrightness() override; + Return setCallback(const sp<::vendor::lineage::biometrics::fingerprint::inscreen::V1_0::IFingerprintInscreenCallback>& callback) override; + +private: + sp xiaomiFingerprintService; +}; + +} // namespace implementation +} // namespace V1_0 +} // namespace inscreen +} // namespace fingerprint +} // namespace biometrics +} // namespace lineage +} // namespace vendor + +#endif // VENDOR_LINEAGE_BIOMETRICS_FINGERPRINT_INSCREEN_V1_0_FINGERPRINTINSCREEN_H diff --git a/fod/service.cpp b/fod/service.cpp new file mode 100644 index 0000000..8c53163 --- /dev/null +++ b/fod/service.cpp @@ -0,0 +1,50 @@ +/* + * 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 "vendor.lineage.biometrics.fingerprint.inscreen@1.0-service.davinci" + +#include +#include + +#include "FingerprintInscreen.h" + +using android::hardware::configureRpcThreadpool; +using android::hardware::joinRpcThreadpool; + +using vendor::lineage::biometrics::fingerprint::inscreen::V1_0::IFingerprintInscreen; +using vendor::lineage::biometrics::fingerprint::inscreen::V1_0::implementation::FingerprintInscreen; + +using android::OK; +using android::status_t; + +int main() { + android::sp service = new FingerprintInscreen(); + + configureRpcThreadpool(1, true); + + status_t status = service->registerAsService(); + if (status != OK) { + LOG(ERROR) << "Cannot register FOD HAL service."; + return 1; + } + + LOG(INFO) << "FOD HAL service ready."; + + joinRpcThreadpool(); + + LOG(ERROR) << "FOD HAL service failed to join thread pool."; + return 1; +} diff --git a/fod/vendor.lineage.biometrics.fingerprint.inscreen@1.0-service.davinci.rc b/fod/vendor.lineage.biometrics.fingerprint.inscreen@1.0-service.davinci.rc new file mode 100644 index 0000000..fd31135 --- /dev/null +++ b/fod/vendor.lineage.biometrics.fingerprint.inscreen@1.0-service.davinci.rc @@ -0,0 +1,13 @@ +on boot + chown system system /sys/devices/platform/soc/soc:qcom,dsi-display/fod_hbm + chown system system /sys/devices/virtual/touch/tp_dev/fod_status + + chmod 0644 /sys/devices/platform/soc/soc:qcom,dsi-display/fod_hbm + chmod 0644 /sys/devices/virtual/touch/tp_dev/fod_status + +service vendor.fingerprint-inscreen-1-0 /vendor/bin/hw/vendor.lineage.biometrics.fingerprint.inscreen@1.0-service.davinci + interface vendor.lineage.biometrics.fingerprint.inscreen@1.0::IFingerprintInscreen default + class hal + user system + group system + shutdown critical diff --git a/fod/vendor.lineage.biometrics.fingerprint.inscreen@1.0-service.davinci.xml b/fod/vendor.lineage.biometrics.fingerprint.inscreen@1.0-service.davinci.xml new file mode 100644 index 0000000..e03c70c --- /dev/null +++ b/fod/vendor.lineage.biometrics.fingerprint.inscreen@1.0-service.davinci.xml @@ -0,0 +1,11 @@ + + + vendor.lineage.biometrics.fingerprint.inscreen + hwbinder + 1.0 + + IFingerprintInscreen + default + + + diff --git a/overlay-lineage/frameworks/base/packages/SystemUI/res/values/config.xml b/overlay-lineage/frameworks/base/packages/SystemUI/res/values/config.xml index 8a564fa..ab70e62 100644 --- a/overlay-lineage/frameworks/base/packages/SystemUI/res/values/config.xml +++ b/overlay-lineage/frameworks/base/packages/SystemUI/res/values/config.xml @@ -17,4 +17,7 @@ 6 7 + + + #00ffff