浏览代码

sm8450-common: udfps: Update fod_finger_state node based on actual udfps state

Change-Id: I9f468457acfe373b9fdab7df7a9065905629263c
Arian 5 月之前
父节点
当前提交
bfb4f71ed5
共有 3 个文件被更改,包括 21 次插入0 次删除
  1. 2 0
      rootdir/etc/init.xiaomi_sm8450.rc
  2. 1 0
      sepolicy/vendor/genfs_contexts
  3. 18 0
      udfps/UdfpsHandler.cpp

+ 2 - 0
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
 

+ 1 - 0
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

+ 18 - 0
udfps/UdfpsHandler.cpp

@@ -17,6 +17,7 @@
 #include <thread>
 
 #include <display/drm/mi_disp.h>
+#include <linux/xiaomi_touch.h>
 
 #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() {