aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelectimon <electimon@gmail.com>2024-01-07 10:51:54 +0000
committerMichael Bestas <mkbestas@lineageos.org>2025-05-05 05:23:15 +0300
commit7e962b8d8bad66f85cd9ac23ccd45e4b8a2efbe5 (patch)
treee59c4fcd5c4949cf1e82e4ad9a64e1016a19e61e
parent7f8637367bc81d6ff5df0308221d1aefd53b2b1a (diff)
miami: fingerprint: Switch to IOCTL for HBM
* On newer moto kernels it is possible to send a SET_PANEL_FEATURE ioctl to /dev/dri/card0 to set a panel feature such as HBM. Motorola has extended the HBM logic to allow FOD HBM to be set in additional to regular HBM. This is done by sending "2" with the HBM id through the ioctl. * Utilize the API provided by Egistec provides via vendor.egistec.hardware.fingerprint to send commands to the internal handler, this allows us to send the finger is on or off the sensor message directly to the HAL. Change-Id: I06ace29567900779e63b9826862964d20b267be6
-rw-r--r--Android.bp3
-rw-r--r--fingerprint/Android.bp3
-rw-r--r--fingerprint/BiometricsFingerprint.cpp110
-rw-r--r--fingerprint/BiometricsFingerprint.h10
4 files changed, 67 insertions, 59 deletions
diff --git a/Android.bp b/Android.bp
index 25aa1fe..2805bde 100644
--- a/Android.bp
+++ b/Android.bp
@@ -4,7 +4,4 @@
//
soong_namespace {
- imports: [
- "hardware/motorola",
- ],
}
diff --git a/fingerprint/Android.bp b/fingerprint/Android.bp
index 332f281..cd11d8d 100644
--- a/fingerprint/Android.bp
+++ b/fingerprint/Android.bp
@@ -17,6 +17,7 @@ cc_binary {
"android.hardware.biometrics.fingerprint@2.1",
"android.hardware.biometrics.fingerprint@2.2",
"android.hardware.biometrics.fingerprint@2.3",
- "com.motorola.hardware.biometric.fingerprint@1.0",
+ "vendor.egistec.hardware.fingerprint@4.0",
],
+ header_libs: ["generated_kernel_headers"]
}
diff --git a/fingerprint/BiometricsFingerprint.cpp b/fingerprint/BiometricsFingerprint.cpp
index 05626d7..025dedd 100644
--- a/fingerprint/BiometricsFingerprint.cpp
+++ b/fingerprint/BiometricsFingerprint.cpp
@@ -17,73 +17,55 @@
#include "BiometricsFingerprint.h"
+#include <android-base/file.h>
#include <android-base/logging.h>
-#include <cmath>
-#include <fstream>
-#include <thread>
-
#include <fcntl.h>
#include <poll.h>
+#include <sys/ioctl.h>
#include <sys/stat.h>
-#define NOTIFY_FINGER_UP IMotFodEventType::FINGER_UP
-#define NOTIFY_FINGER_DOWN IMotFodEventType::FINGER_DOWN
+#include <chrono>
+#include <cmath>
+#include <fstream>
+#include <thread>
-#define FOD_UI_PATH "/sys/devices/platform/soc/soc:qcom,dsi-display-primary/fod_ui"
+#include <display/drm/sde_drm.h>
-namespace android {
-namespace hardware {
-namespace biometrics {
-namespace fingerprint {
-namespace V2_3 {
-namespace implementation {
+enum HBM_STATE { OFF = 0, ON = 2 };
-static bool readBool(int fd) {
- char c;
- int rc;
+void setHbmState(int state) {
+ struct panel_param_info param_info;
+ int32_t node = open("/dev/dri/card0", O_RDWR);
+ int32_t ret = 0;
- rc = lseek(fd, 0, SEEK_SET);
- if (rc) {
- LOG(ERROR) << "failed to seek fd, err: " << rc;
- return false;
+ if (node < 0) {
+ LOG(ERROR) << "Failed to get card0!";
+ return;
}
- rc = read(fd, &c, sizeof(char));
- if (rc != 1) {
- LOG(ERROR) << "failed to read bool from fd, err: " << rc;
- return false;
+ param_info.param_idx = PARAM_HBM;
+ param_info.value = state;
+
+ ret = ioctl(node, DRM_IOCTL_SET_PANEL_FEATURE, &param_info);
+ if (ret < 0) {
+ LOG(ERROR) << "IOCTL call failed with ret = " << ret;
+ } else {
+ LOG(INFO) << "HBM state set successfully. New state: " << state;
}
- return c != '0';
+ close(node);
}
+namespace android {
+namespace hardware {
+namespace biometrics {
+namespace fingerprint {
+namespace V2_3 {
+namespace implementation {
+
BiometricsFingerprint::BiometricsFingerprint() {
biometrics_2_1_service = IBiometricsFingerprint_2_1::getService();
- mMotoFingerprint = IMotoFingerPrint::getService();
-
- std::thread([this]() {
- int fd = open(FOD_UI_PATH, O_RDONLY);
- if (fd < 0) {
- LOG(ERROR) << "failed to open fd, err: " << fd;
- return;
- }
-
- struct pollfd fodUiPoll = {
- .fd = fd,
- .events = POLLERR | POLLPRI,
- .revents = 0,
- };
-
- while (true) {
- int rc = poll(&fodUiPoll, 1, -1);
- if (rc < 0) {
- LOG(ERROR) << "failed to poll fd, err: " << rc;
- continue;
- }
- mMotoFingerprint->sendFodEvent(readBool(fd) ? NOTIFY_FINGER_DOWN : NOTIFY_FINGER_UP, {},
- [](IMotFodEventResult, const hidl_vec<signed char>&) {});
- }
- }).detach();
+ rbs_4_0_service = IBiometricsFingerprintRbs::getService();
}
Return<uint64_t> BiometricsFingerprint::setNotify(
@@ -109,6 +91,7 @@ Return<uint64_t> BiometricsFingerprint::getAuthenticatorId() {
}
Return<RequestStatus> BiometricsFingerprint::cancel() {
+ setHbmState(OFF);
return biometrics_2_1_service->cancel();
}
@@ -126,6 +109,7 @@ Return<RequestStatus> BiometricsFingerprint::setActiveGroup(uint32_t gid,
}
Return<RequestStatus> BiometricsFingerprint::authenticate(uint64_t operationId, uint32_t gid) {
+ setHbmState(OFF);
return biometrics_2_1_service->authenticate(operationId, gid);
}
@@ -134,10 +118,36 @@ Return<bool> BiometricsFingerprint::isUdfps(uint32_t) {
}
Return<void> BiometricsFingerprint::onFingerDown(uint32_t, uint32_t, float, float) {
+ setHbmState(ON);
+ extraApiWrapper(101);
+
+ std::thread([this]() {
+ std::this_thread::sleep_for(std::chrono::milliseconds(200));
+ BiometricsFingerprint::onFingerUp();
+ }).detach();
+
return Void();
}
Return<void> BiometricsFingerprint::onFingerUp() {
+ setHbmState(OFF);
+ extraApiWrapper(102);
+ return Void();
+}
+
+Return<void> BiometricsFingerprint::extraApiWrapper(int cidValue) {
+ int cid[1] = {cidValue};
+
+ // Create a std::vector<uint8_t> to store the data from 'cid'
+ std::vector<uint8_t> cid_data(reinterpret_cast<uint8_t*>(cid),
+ reinterpret_cast<uint8_t*>(cid) + sizeof(cid));
+
+ // Create the hidl_vec<uint8_t> from the std::vector<uint8_t>
+ ::android::hardware::hidl_vec<uint8_t> hidl_cid = cid_data;
+
+ // Call extra_api with the correct input buffer and an empty lambda callback
+ rbs_4_0_service->extra_api(7, hidl_cid, [](const ::android::hardware::hidl_vec<uint8_t>&) {});
+
return Void();
}
diff --git a/fingerprint/BiometricsFingerprint.h b/fingerprint/BiometricsFingerprint.h
index 7abf9af..3b88b63 100644
--- a/fingerprint/BiometricsFingerprint.h
+++ b/fingerprint/BiometricsFingerprint.h
@@ -18,9 +18,9 @@
#define ANDROID_HARDWARE_BIOMETRICS_FINGERPRINT_V2_3_BIOMETRICSFINGERPRINT_H
#include <android/hardware/biometrics/fingerprint/2.3/IBiometricsFingerprint.h>
-#include <com/motorola/hardware/biometric/fingerprint/1.0/IMotoFingerPrint.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>
+#include <vendor/egistec/hardware/fingerprint/4.0/IBiometricsFingerprintRbs.h>
namespace android {
namespace hardware {
@@ -40,9 +40,7 @@ using ::android::hardware::Return;
using ::android::hardware::Void;
using ::android::hardware::biometrics::fingerprint::V2_1::IBiometricsFingerprintClientCallback;
using ::android::hardware::biometrics::fingerprint::V2_1::RequestStatus;
-using ::com::motorola::hardware::biometric::fingerprint::V1_0::IMotFodEventResult;
-using ::com::motorola::hardware::biometric::fingerprint::V1_0::IMotFodEventType;
-using ::com::motorola::hardware::biometric::fingerprint::V1_0::IMotoFingerPrint;
+using ::vendor::egistec::hardware::fingerprint::V4_0::IBiometricsFingerprintRbs;
struct BiometricsFingerprint : public IBiometricsFingerprint {
BiometricsFingerprint();
@@ -65,9 +63,11 @@ struct BiometricsFingerprint : public IBiometricsFingerprint {
Return<void> onFingerDown(uint32_t x, uint32_t y, float minor, float major) override;
Return<void> onFingerUp() override;
+ Return<void> extraApiWrapper(int cidValue);
+
private:
sp<IBiometricsFingerprint_2_1> biometrics_2_1_service;
- sp<IMotoFingerPrint> mMotoFingerprint;
+ sp<IBiometricsFingerprintRbs> rbs_4_0_service;
};
} // namespace implementation