From bd7d6d7d596ff282a6fe6327a16e9f60d034e2c1 Mon Sep 17 00:00:00 2001 From: Cosmin Tanislav Date: Fri, 24 Sep 2021 16:08:16 +0300 Subject: [PATCH] sm6150-common: fingerprint: Add thread listening for fod_ui sysfs event Change-Id: I36f5789657daa70cf39fbdfe501392b9f96dbf2e --- fingerprint/BiometricsFingerprint.cpp | 55 +++++++++++++++++-- ...erprint@2.3-service.xiaomi_sm6150-udfps.rc | 3 + sepolicy/vendor/file_contexts | 1 + sepolicy/vendor/hal_fingerprint_default.te | 2 + 4 files changed, 57 insertions(+), 4 deletions(-) diff --git a/fingerprint/BiometricsFingerprint.cpp b/fingerprint/BiometricsFingerprint.cpp index 65e9850..0397158 100644 --- a/fingerprint/BiometricsFingerprint.cpp +++ b/fingerprint/BiometricsFingerprint.cpp @@ -18,6 +18,8 @@ #define LOG_VERBOSE "android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150" #include +#include +#include #include "BiometricsFingerprint.h" @@ -33,6 +35,31 @@ #define TOUCH_MAGIC 0x5400 #define TOUCH_IOC_SETMODE TOUCH_MAGIC + 0 +#define FOD_UI_PATH "/sys/devices/platform/soc/soc:qcom,dsi-display/fod_ui" + +#ifdef ENABLE_UDFPS +namespace { +static bool readBool(int fd) { + char c; + int rc; + + rc = lseek(fd, 0, SEEK_SET); + if (rc) { + ALOGE("failed to seek fd, err: %d", rc); + return false; + } + + rc = read(fd, &c, sizeof(char)); + if (rc != 1) { + ALOGE("failed to read bool from fd, err: %d", rc); + return false; + } + + return c != '0'; +} +} // anonymous namespace +#endif + namespace android { namespace hardware { namespace biometrics { @@ -54,6 +81,30 @@ BiometricsFingerprint::BiometricsFingerprint() : mClientCallback(nullptr), mDevi #ifdef ENABLE_UDFPS touch_fd_ = android::base::unique_fd(open(TOUCH_DEV_PATH, O_RDWR)); + + std::thread([this]() { + int fd = open(FOD_UI_PATH, O_RDONLY); + if (fd < 0) { + ALOGE("failed to open fd, err: %d", fd); + return; + } + + struct pollfd fodUiPoll = { + .fd = fd, + .events = POLLERR | POLLPRI, + .revents = 0, + }; + + while (true) { + int rc = poll(&fodUiPoll, 1, -1); + if (rc < 0) { + ALOGE("failed to poll fd, err: %d", rc); + continue; + } + + mDevice->extCmd(mDevice, COMMAND_NIT, readBool(fd) ? PARAM_NIT_FOD : PARAM_NIT_NONE); + } + }).detach(); #endif } @@ -425,8 +476,6 @@ Return BiometricsFingerprint::onFingerDown(uint32_t /* x */, uint32_t /* y #ifdef ENABLE_UDFPS int arg[2] = {Touch_Fod_Enable, FOD_STATUS_ON}; ioctl(touch_fd_.get(), TOUCH_IOC_SETMODE, &arg); - - mDevice->extCmd(mDevice, COMMAND_NIT, PARAM_NIT_FOD); #endif return Void(); @@ -444,8 +493,6 @@ Return BiometricsFingerprint::onFingerUp() { #ifdef ENABLE_UDFPS int arg[2] = {Touch_Fod_Enable, FOD_STATUS_OFF}; ioctl(touch_fd_.get(), TOUCH_IOC_SETMODE, &arg); - - mDevice->extCmd(mDevice, COMMAND_NIT, PARAM_NIT_NONE); #endif return Void(); diff --git a/fingerprint/android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150-udfps.rc b/fingerprint/android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150-udfps.rc index 993b9b3..62e5b47 100644 --- a/fingerprint/android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150-udfps.rc +++ b/fingerprint/android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150-udfps.rc @@ -1,3 +1,6 @@ +on boot + chown system system /sys/devices/platform/soc/soc:qcom,dsi-display/fod_ui + service vendor.fps_hal /vendor/bin/hw/android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150-udfps # "class hal" causes a race condition on some devices due to files created # in /data. As a workaround, postpone startup until later in boot once diff --git a/sepolicy/vendor/file_contexts b/sepolicy/vendor/file_contexts index d60a82a..c60426c 100644 --- a/sepolicy/vendor/file_contexts +++ b/sepolicy/vendor/file_contexts @@ -11,6 +11,7 @@ /dev/xiaomi-touch u:object_r:touchfeature_device:s0 /sys/devices/platform/soc/[a-f0-9]+.qcom,mdss_mdp/drm/card([0-3])+/card([0-3])+-DSI-1/panel_info u:object_r:vendor_sysfs_graphics:s0 /sys/devices/platform/soc/soc:qcom,dsi-display/dc_enable u:object_r:sysfs_anti_flicker:s0 +/sys/devices/platform/soc/soc:qcom,dsi-display/fod_ui u:object_r:vendor_sysfs_fod:s0 /sys/devices/platform/soc/soc:qcom,dsi-display/hbm u:object_r:sysfs_hbm:s0 /sys/devices/platform/soc/soc:qcom,dsi-display/doze_mode u:object_r:sysfs_doze:s0 /sys/devices/platform/soc/soc:qcom,dsi-display/doze_status u:object_r:sysfs_doze:s0 diff --git a/sepolicy/vendor/hal_fingerprint_default.te b/sepolicy/vendor/hal_fingerprint_default.te index 3784937..c8ba522 100644 --- a/sepolicy/vendor/hal_fingerprint_default.te +++ b/sepolicy/vendor/hal_fingerprint_default.te @@ -1,6 +1,7 @@ type hal_fingerprint_hwservice_xiaomi, hwservice_manager_type; type fingerprint_device, dev_type; type fingerprint_data_file, data_file_type, file_type; +type vendor_sysfs_fod, sysfs_type, fs_type; type vendor_fp_prop, property_type; allow hal_fingerprint_default fingerprint_device:chr_file rw_file_perms; @@ -12,6 +13,7 @@ allow hal_fingerprint_default tee_device:chr_file rw_file_perms; allow hal_fingerprint_default touchfeature_device:chr_file rw_file_perms; allow hal_fingerprint_default uhid_device:chr_file rw_file_perms; allow hal_fingerprint_default vendor_qdsp_device:chr_file r_file_perms; +allow hal_fingerprint_default vendor_sysfs_fod:file rw_file_perms; allow hal_fingerprint_default vendor_sysfs_graphics:file rw_file_perms; allow hal_fingerprint_default vendor_xdsp_device:chr_file r_file_perms;