diff --git a/device.mk b/device.mk index 06a3506..dee5ec8 100644 --- a/device.mk +++ b/device.mk @@ -61,7 +61,9 @@ PRODUCT_PACKAGES += \ # Fingerprint PRODUCT_PACKAGES += \ - android.hardware.biometrics.fingerprint@2.3-service.bangkk + android.hardware.biometrics.fingerprint@2.3-service.bangkk \ + com.motorola.hardware.biometric.fingerprint@1.0.vendor \ + vendor.egistec.hardware.fingerprint@4.0.vendor # Init $(foreach f,$(wildcard $(LOCAL_PATH)/rootdir/etc/init/hw/*.rc),\ diff --git a/fingerprint/Android.bp b/fingerprint/Android.bp index 19ec8c7..e929afc 100644 --- a/fingerprint/Android.bp +++ b/fingerprint/Android.bp @@ -17,8 +17,9 @@ 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"] } cc_library_static { diff --git a/fingerprint/BiometricsFingerprint.cpp b/fingerprint/BiometricsFingerprint.cpp index d1f0351..ebe5be0 100644 --- a/fingerprint/BiometricsFingerprint.cpp +++ b/fingerprint/BiometricsFingerprint.cpp @@ -13,23 +13,51 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#define LOG_TAG "android.hardware.biometrics.fingerprint@2.3-service.bangkk" +#define LOG_TAG "fingerprint@2.3-service.bangkk" #include "BiometricsFingerprint.h" +#include #include -#include -#include -#include - #include #include #include +#include -#define NOTIFY_FINGER_UP IMotFodEventType::FINGER_UP -#define NOTIFY_FINGER_DOWN IMotFodEventType::FINGER_DOWN +#include +#include +#include +#include -#define FOD_UI_PATH "/sys/devices/platform/soc/soc:qcom,dsi-display-primary/fod_ui" +#include + +enum HBM_STATE { + OFF = 0, + ON = 2 +}; + +void setHbmState(int state) { + struct panel_param_info param_info; + int32_t node = open("/dev/dri/card0", O_RDWR); + int32_t ret = 0; + + if (node < 0) { + LOG(ERROR) << "Failed to get card0!"; + return; + } + + param_info.param_idx = PARAM_HBM; + param_info.value = state; + + ret = ioctl(node, DRM_IOCTL_SET_PANEL_FEATURE, ¶m_info); + if (ret < 0) { + LOG(ERROR) << "IOCTL call failed with ret = " << ret; + } else { + LOG(INFO) << "HBM state set successfully. New state: " << state; + } + + close(node); +} namespace android { namespace hardware { @@ -38,55 +66,13 @@ namespace fingerprint { namespace V2_3 { namespace implementation { -static bool readBool(int fd) { - char c; - int rc; - - rc = lseek(fd, 0, SEEK_SET); - if (rc) { - LOG(ERROR) << "failed to seek fd, err: " << rc; - return false; - } - - rc = read(fd, &c, sizeof(char)); - if (rc != 1) { - LOG(ERROR) << "failed to read bool from fd, err: " << rc; - return false; - } - - return c != '0'; -} - 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&) {}); - } - }).detach(); + rbs_4_0_service = IBiometricsFingerprintRbs::getService(); } -Return BiometricsFingerprint::setNotify(const sp& clientCallback) { +Return BiometricsFingerprint::setNotify( + const sp &clientCallback) { return biometrics_2_1_service->setNotify(clientCallback); } @@ -94,7 +80,8 @@ Return BiometricsFingerprint::preEnroll() { return biometrics_2_1_service->preEnroll(); } -Return BiometricsFingerprint::enroll(const hidl_array& hat, uint32_t gid, uint32_t timeoutSec) { +Return BiometricsFingerprint::enroll(const hidl_array &hat, + uint32_t gid, uint32_t timeoutSec) { return biometrics_2_1_service->enroll(hat, gid, timeoutSec); } @@ -107,6 +94,7 @@ Return BiometricsFingerprint::getAuthenticatorId() { } Return BiometricsFingerprint::cancel() { + setHbmState(OFF); return biometrics_2_1_service->cancel(); } @@ -118,11 +106,13 @@ Return BiometricsFingerprint::remove(uint32_t gid, uint32_t fid) return biometrics_2_1_service->remove(gid, fid); } -Return BiometricsFingerprint::setActiveGroup(uint32_t gid, const hidl_string& storePath) { +Return BiometricsFingerprint::setActiveGroup(uint32_t gid, + const hidl_string &storePath) { return biometrics_2_1_service->setActiveGroup(gid, storePath); } Return BiometricsFingerprint::authenticate(uint64_t operationId, uint32_t gid) { + setHbmState(OFF); return biometrics_2_1_service->authenticate(operationId, gid); } @@ -131,10 +121,35 @@ Return BiometricsFingerprint::isUdfps(uint32_t) { } Return 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 BiometricsFingerprint::onFingerUp() { + setHbmState(OFF); + extraApiWrapper(102); + return Void(); +} + +Return BiometricsFingerprint::extraApiWrapper(int cidValue) { + int cid[1] = {cidValue}; + + // Create a std::vector to store the data from 'cid' + std::vector cid_data(reinterpret_cast(cid), reinterpret_cast(cid) + sizeof(cid)); + + // Create the hidl_vec from the std::vector + ::android::hardware::hidl_vec 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&){}); + return Void(); } diff --git a/fingerprint/BiometricsFingerprint.h b/fingerprint/BiometricsFingerprint.h index aed29e0..c13f6be 100644 --- a/fingerprint/BiometricsFingerprint.h +++ b/fingerprint/BiometricsFingerprint.h @@ -18,9 +18,9 @@ #define ANDROID_HARDWARE_BIOMETRICS_FINGERPRINT_V2_3_BIOMETRICSFINGERPRINT_H #include +#include #include #include -#include namespace android { namespace hardware { @@ -29,32 +29,33 @@ namespace fingerprint { namespace V2_3 { namespace implementation { -using IBiometricsFingerprint_2_1 = ::android::hardware::biometrics::fingerprint::V2_1::IBiometricsFingerprint; -using ::android::hardware::biometrics::fingerprint::V2_1::IBiometricsFingerprintClientCallback; -using ::android::hardware::biometrics::fingerprint::V2_1::RequestStatus; +using IBiometricsFingerprint_2_1 = + ::android::hardware::biometrics::fingerprint::V2_1::IBiometricsFingerprint; +using ::android::sp; using ::android::hardware::hidl_array; using ::android::hardware::hidl_memory; using ::android::hardware::hidl_string; using ::android::hardware::hidl_vec; using ::android::hardware::Return; using ::android::hardware::Void; -using ::android::sp; -using ::com::motorola::hardware::biometric::fingerprint::V1_0::IMotoFingerPrint; -using ::com::motorola::hardware::biometric::fingerprint::V1_0::IMotFodEventType; -using ::com::motorola::hardware::biometric::fingerprint::V1_0::IMotFodEventResult; +using ::android::hardware::biometrics::fingerprint::V2_1::IBiometricsFingerprintClientCallback; +using ::android::hardware::biometrics::fingerprint::V2_1::RequestStatus; +using ::vendor::egistec::hardware::fingerprint::V4_0::IBiometricsFingerprintRbs; struct BiometricsFingerprint : public IBiometricsFingerprint { BiometricsFingerprint(); // Methods from ::V2_1::IBiometricsFingerprint follow. - Return setNotify(const sp& clientCallback) override; + Return setNotify( + const sp &clientCallback) override; Return preEnroll() override; - Return enroll(const hidl_array& hat, uint32_t gid, uint32_t timeoutSec) override; + Return enroll(const hidl_array &hat, uint32_t gid, + uint32_t timeoutSec) override; Return postEnroll() override; Return getAuthenticatorId() override; Return cancel() override; Return enumerate() override; Return remove(uint32_t gid, uint32_t fid) override; - Return setActiveGroup(uint32_t gid, const hidl_string& storePath) override; + Return setActiveGroup(uint32_t gid, const hidl_string &storePath) override; Return authenticate(uint64_t operationId, uint32_t gid) override; // ::V2_3::IBiometricsFingerprint follow. @@ -62,9 +63,10 @@ struct BiometricsFingerprint : public IBiometricsFingerprint { Return onFingerDown(uint32_t x, uint32_t y, float minor, float major) override; Return onFingerUp() override; -private: + Return extraApiWrapper(int cidValue); + private: sp biometrics_2_1_service; - sp mMotoFingerprint; + sp rbs_4_0_service; }; } // namespace implementation diff --git a/fingerprint/android.hardware.biometrics.fingerprint@2.3-service.bangkk.rc b/fingerprint/android.hardware.biometrics.fingerprint@2.3-service.bangkk.rc index 190d1df..0405837 100644 --- a/fingerprint/android.hardware.biometrics.fingerprint@2.3-service.bangkk.rc +++ b/fingerprint/android.hardware.biometrics.fingerprint@2.3-service.bangkk.rc @@ -1,4 +1,4 @@ -service fps_hal.bangkk /vendor/bin/hw/android.hardware.biometrics.fingerprint@2.3-service.bangkk +service vendor.fps_hal.bangkk /vendor/bin/hw/android.hardware.biometrics.fingerprint@2.3-service.bangkk # "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 # /data is mounted. diff --git a/proprietary-files.txt b/proprietary-files.txt index 559edbb..5d38ea5 100644 --- a/proprietary-files.txt +++ b/proprietary-files.txt @@ -369,10 +369,8 @@ vendor/etc/qdcm_calib_data_mipi_moto_vid_tm_u8_1080p_dsc_655.xml # Fingerprint vendor/bin/hw/android.hardware.biometrics.fingerprint@2.1-service-ets -vendor/etc/init/android.hardware.biometrics.fingerprint@2.1-service-ets.rc vendor/lib64/libRbsFlow.so vendor/lib64/libets_teeclient_v3.so -vendor/lib64/vendor.egistec.hardware.fingerprint@4.0.so vendor/lib64/vendor.qti.hardware.fingerprint@1.0.so # Firmware - From Bangkk