diff --git a/rootdir/etc/init.xiaomi_sm8450.rc b/rootdir/etc/init.xiaomi_sm8450.rc index 7b1a61b..dd0072e 100644 --- a/rootdir/etc/init.xiaomi_sm8450.rc +++ b/rootdir/etc/init.xiaomi_sm8450.rc @@ -49,8 +49,10 @@ on boot chmod 0660 /dev/xiaomi-touch # Touchscreen sensors + chown system system /sys/class/touch/touch_dev/fod_finger_state chown system system /sys/class/touch/touch_dev/fod_longpress_gesture_enabled chown system system /sys/class/touch/touch_dev/fod_press_status + chmod 0660 /sys/class/touch/touch_dev/fod_finger_state chmod 0660 /sys/class/touch/touch_dev/fod_longpress_gesture_enabled chmod 0660 /sys/class/touch/touch_dev/fod_press_status diff --git a/sepolicy/vendor/genfs_contexts b/sepolicy/vendor/genfs_contexts index 8067757..8036524 100644 --- a/sepolicy/vendor/genfs_contexts +++ b/sepolicy/vendor/genfs_contexts @@ -7,6 +7,7 @@ genfscon sysfs /devices/platform/soc/soc:xm_battmngr/power_supply/usb u:object_r genfscon sysfs /devices/platform/soc/soc:fingerprint_fpc u:object_r:vendor_sysfs_fingerprint:s0 # Sensors +genfscon sysfs /devices/virtual/touch/touch_dev/fod_finger_state u:object_r:vendor_sysfs_sensors:s0 genfscon sysfs /devices/virtual/touch/touch_dev/fod_longpress_gesture_enabled u:object_r:vendor_sysfs_sensors:s0 genfscon sysfs /devices/virtual/touch/touch_dev/fod_press_status u:object_r:vendor_sysfs_sensors:s0 genfscon sysfs /devices/virtual/touch/touch_dev/gesture_double_tap_enabled u:object_r:vendor_sysfs_sensors:s0 diff --git a/udfps/UdfpsHandler.cpp b/udfps/UdfpsHandler.cpp index 74c89d9..e3c2f24 100644 --- a/udfps/UdfpsHandler.cpp +++ b/udfps/UdfpsHandler.cpp @@ -17,6 +17,7 @@ #include #include +#include #include "UdfpsHandler.h" @@ -34,6 +35,7 @@ #define PARAM_FOD_RELEASED 0 #define DISP_FEATURE_PATH "/dev/mi_display/disp_feature" +#define TOUCH_DEV_PATH "/dev/xiaomi-touch" using ::aidl::android::hardware::biometrics::fingerprint::AcquiredInfo; @@ -73,6 +75,7 @@ class XiaomiSm8450UdfpsHander : public UdfpsHandler { void init(fingerprint_device_t* device) { mDevice = device; disp_fd_ = android::base::unique_fd(open(DISP_FEATURE_PATH, O_RDWR)); + touch_fd_ = android::base::unique_fd(open(TOUCH_DEV_PATH, O_RDWR)); // Thread to listen for fod ui changes std::thread([this]() { @@ -134,6 +137,13 @@ class XiaomiSm8450UdfpsHander : public UdfpsHandler { mDevice->extCmd(mDevice, COMMAND_FOD_PRESS_Y, y); mDevice->extCmd(mDevice, COMMAND_FOD_PRESS_STATUS, PARAM_FOD_PRESSED); + // Update fod_finger_state node in case hwmodule polls it + struct touch_mode_request touchRequest = { + .mode = TOUCH_MODE_FOD_FINGER_STATE, + .value = 1, + }; + ioctl(touch_fd_.get(), TOUCH_IOC_SET_CUR_VALUE, &touchRequest); + // Request HBM disp_local_hbm_req req; req.base.flag = 0; @@ -155,6 +165,13 @@ class XiaomiSm8450UdfpsHander : public UdfpsHandler { req.base.disp_id = MI_DISP_PRIMARY; req.local_hbm_value = LHBM_TARGET_BRIGHTNESS_OFF_FINGER_UP; ioctl(disp_fd_.get(), MI_DISP_IOCTL_SET_LOCAL_HBM, &req); + + // Update fod_finger_state node in case hwmodule polls it + struct touch_mode_request touchRequest = { + .mode = TOUCH_MODE_FOD_FINGER_STATE, + .value = 0, + }; + ioctl(touch_fd_.get(), TOUCH_IOC_SET_CUR_VALUE, &touchRequest); } void onAcquired(int32_t result, int32_t vendorCode) { @@ -171,6 +188,7 @@ class XiaomiSm8450UdfpsHander : public UdfpsHandler { private: fingerprint_device_t* mDevice; android::base::unique_fd disp_fd_; + android::base::unique_fd touch_fd_; }; static UdfpsHandler* create() {