Change-Id: Ic048efcf18e07694fede4d90859663c391a1a02dfourteen-wip
parent
bb83af7561
commit
8798ac7cad
@ -1,63 +0,0 @@ |
|||||||
#
|
|
||||||
# Copyright (C) 2021 The LineageOS Project
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
#
|
|
||||||
|
|
||||||
LOCAL_PATH := $(call my-dir)
|
|
||||||
|
|
||||||
include $(CLEAR_VARS) |
|
||||||
|
|
||||||
LOCAL_SRC_FILES := \
|
|
||||||
BiometricsFingerprint.cpp \
|
|
||||||
service.cpp
|
|
||||||
|
|
||||||
LOCAL_SHARED_LIBRARIES := \
|
|
||||||
libbase \
|
|
||||||
libhardware \
|
|
||||||
libhidlbase \
|
|
||||||
liblog \
|
|
||||||
libutils \
|
|
||||||
android.hardware.biometrics.fingerprint@2.1 \
|
|
||||||
android.hardware.biometrics.fingerprint@2.2 \
|
|
||||||
android.hardware.biometrics.fingerprint@2.3
|
|
||||||
|
|
||||||
ifeq ($(TARGET_SEC_FP_CALL_NOTIFY_ON_CANCEL),true) |
|
||||||
LOCAL_CFLAGS += -DCALL_NOTIFY_ON_CANCEL
|
|
||||||
endif |
|
||||||
|
|
||||||
ifeq ($(TARGET_SEC_FP_USES_PERCENTAGE_SAMPLES),true) |
|
||||||
LOCAL_CFLAGS += -DUSES_PERCENTAGE_SAMPLES
|
|
||||||
endif |
|
||||||
|
|
||||||
ifeq ($(TARGET_SEC_FP_CALL_CANCEL_ON_ENROLL_COMPLETION),true) |
|
||||||
LOCAL_CFLAGS += -DCALL_CANCEL_ON_ENROLL_COMPLETION
|
|
||||||
endif |
|
||||||
|
|
||||||
ifeq ($(TARGET_SEC_FP_HAS_FINGERPRINT_GESTURES),true) |
|
||||||
LOCAL_CFLAGS += -DHAS_FINGERPRINT_GESTURES
|
|
||||||
endif |
|
||||||
|
|
||||||
ifeq ($(TARGET_SEC_FP_REQUEST_FORCE_CALIBRATE),true) |
|
||||||
LOCAL_CFLAGS += -DREQUEST_FORCE_CALIBRATE
|
|
||||||
endif |
|
||||||
|
|
||||||
LOCAL_MODULE := android.hardware.biometrics.fingerprint@2.3-service-samsung.sm7125
|
|
||||||
LOCAL_INIT_RC := android.hardware.biometrics.fingerprint@2.3-service-samsung.sm7125.rc
|
|
||||||
LOCAL_VINTF_FRAGMENTS := android.hardware.biometrics.fingerprint@2.3-service-samsung.sm7125.xml
|
|
||||||
LOCAL_MODULE_RELATIVE_PATH := hw
|
|
||||||
LOCAL_MODULE_TAGS := optional
|
|
||||||
LOCAL_MODULE_OWNER := samsung
|
|
||||||
LOCAL_VENDOR_MODULE := true
|
|
||||||
|
|
||||||
include $(BUILD_EXECUTABLE) |
|
@ -1,567 +0,0 @@ |
|||||||
/*
|
|
||||||
* Copyright (C) 2019 The LineageOS Project |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||||
* you may not use this file except in compliance with the License. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
#define LOG_TAG "android.hardware.biometrics.fingerprint@2.3-service-samsung.sm7125" |
|
||||||
|
|
||||||
#include <android-base/logging.h> |
|
||||||
|
|
||||||
#include <hardware/hw_auth_token.h> |
|
||||||
|
|
||||||
#include <hardware/fingerprint.h> |
|
||||||
#include <hardware/hardware.h> |
|
||||||
#include "BiometricsFingerprint.h" |
|
||||||
#include <android-base/properties.h> |
|
||||||
#include <dlfcn.h> |
|
||||||
#include <fstream> |
|
||||||
#include <inttypes.h> |
|
||||||
#include <unistd.h> |
|
||||||
#include <string.h> |
|
||||||
|
|
||||||
#ifdef HAS_FINGERPRINT_GESTURES |
|
||||||
#include <fcntl.h> |
|
||||||
#endif |
|
||||||
|
|
||||||
#define TSP_CMD_PATH "/sys/class/sec/tsp/cmd" |
|
||||||
#define HBM_PATH "/sys/class/lcd/panel/mask_brightness" |
|
||||||
#define MASK_BRIGHTNESS_PATH "/sys/class/lcd/panel/actual_mask_brightness" |
|
||||||
|
|
||||||
namespace android { |
|
||||||
namespace hardware { |
|
||||||
namespace biometrics { |
|
||||||
namespace fingerprint { |
|
||||||
namespace V2_3 { |
|
||||||
namespace implementation { |
|
||||||
|
|
||||||
using RequestStatus = android::hardware::biometrics::fingerprint::V2_1::RequestStatus; |
|
||||||
|
|
||||||
BiometricsFingerprint* BiometricsFingerprint::sInstance = nullptr; |
|
||||||
|
|
||||||
template <typename T> |
|
||||||
static void set(const std::string& path, const T& value) { |
|
||||||
std::ofstream file(path); |
|
||||||
file << value; |
|
||||||
} |
|
||||||
|
|
||||||
template <typename T> |
|
||||||
static T get(const std::string& path, const T& def) { |
|
||||||
std::ifstream file(path); |
|
||||||
T result; |
|
||||||
file >> result; |
|
||||||
return file.fail() ? def : result; |
|
||||||
} |
|
||||||
|
|
||||||
std::string getBootloader() { |
|
||||||
return android::base::GetProperty("ro.boot.bootloader", ""); |
|
||||||
} |
|
||||||
|
|
||||||
BiometricsFingerprint::BiometricsFingerprint() : mClientCallback(nullptr) { |
|
||||||
sInstance = this; // keep track of the most recent instance
|
|
||||||
if (!openHal()) { |
|
||||||
LOG(ERROR) << "Can't open HAL module"; |
|
||||||
} |
|
||||||
|
|
||||||
if (getBootloader().find("A525") != std::string::npos) { |
|
||||||
set(TSP_CMD_PATH, "set_fod_rect,421,2018,659,2256"); |
|
||||||
} else if (getBootloader().find("A725") != std::string::npos) { |
|
||||||
set(TSP_CMD_PATH, "set_fod_rect,426,2031,654,2259"); |
|
||||||
} else { |
|
||||||
LOG(ERROR) << "Device is not an A52 or A72, not setting set_fod_rect"; |
|
||||||
} |
|
||||||
|
|
||||||
std::ifstream in("/sys/devices/virtual/fingerprint/fingerprint/position"); |
|
||||||
mIsUdfps = !!in; |
|
||||||
if (in) |
|
||||||
in.close(); |
|
||||||
|
|
||||||
#ifdef HAS_FINGERPRINT_GESTURES |
|
||||||
request(FINGERPRINT_REQUEST_NAVIGATION_MODE_START, 1); |
|
||||||
|
|
||||||
uinputFd = open("/dev/uinput", O_WRONLY | O_NONBLOCK); |
|
||||||
if (uinputFd < 0) { |
|
||||||
LOG(ERROR) << "Unable to open uinput node"; |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
int err = ioctl(uinputFd, UI_SET_EVBIT, EV_KEY) | |
|
||||||
ioctl(uinputFd, UI_SET_KEYBIT, KEY_UP) | |
|
||||||
ioctl(uinputFd, UI_SET_KEYBIT, KEY_DOWN); |
|
||||||
if (err != 0) { |
|
||||||
LOG(ERROR) << "Unable to enable key events"; |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
struct uinput_user_dev uidev; |
|
||||||
sprintf(uidev.name, "uinput-sec-fp"); |
|
||||||
uidev.id.bustype = BUS_VIRTUAL; |
|
||||||
|
|
||||||
err = write(uinputFd, &uidev, sizeof(uidev)); |
|
||||||
if (err < 0) { |
|
||||||
LOG(ERROR) << "Write user device to uinput node failed"; |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
err = ioctl(uinputFd, UI_DEV_CREATE); |
|
||||||
if (err < 0) { |
|
||||||
LOG(ERROR) << "Unable to create uinput device"; |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
LOG(INFO) << "Successfully registered uinput-sec-fp for fingerprint gestures"; |
|
||||||
#endif |
|
||||||
|
|
||||||
set(TSP_CMD_PATH, "fod_enable,1,1,0"); |
|
||||||
} |
|
||||||
|
|
||||||
BiometricsFingerprint::~BiometricsFingerprint() { |
|
||||||
if (ss_fingerprint_close() != 0) { |
|
||||||
LOG(ERROR) << "Can't close HAL module"; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
Return<bool> BiometricsFingerprint::isUdfps(uint32_t) { |
|
||||||
return mIsUdfps; |
|
||||||
} |
|
||||||
|
|
||||||
Return<void> BiometricsFingerprint::onFingerDown(uint32_t, uint32_t, float, float) { |
|
||||||
std::thread([this]() { |
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(35)); |
|
||||||
set(HBM_PATH, "331"); |
|
||||||
}).detach(); |
|
||||||
|
|
||||||
request(SEM_REQUEST_TOUCH_EVENT, FINGERPRINT_REQUEST_SESSION_OPEN); |
|
||||||
|
|
||||||
return Void(); |
|
||||||
} |
|
||||||
|
|
||||||
Return<void> BiometricsFingerprint::onFingerUp() { |
|
||||||
if (strcmp(get<std::string>(MASK_BRIGHTNESS_PATH, "0").c_str(), "0") != 0) { |
|
||||||
request(SEM_REQUEST_TOUCH_EVENT, FINGERPRINT_REQUEST_RESUME); |
|
||||||
|
|
||||||
set(HBM_PATH, "0"); |
|
||||||
} |
|
||||||
|
|
||||||
return Void(); |
|
||||||
} |
|
||||||
|
|
||||||
Return<RequestStatus> BiometricsFingerprint::ErrorFilter(int32_t error) { |
|
||||||
switch (error) { |
|
||||||
case 0: |
|
||||||
return RequestStatus::SYS_OK; |
|
||||||
case -2: |
|
||||||
return RequestStatus::SYS_ENOENT; |
|
||||||
case -4: |
|
||||||
return RequestStatus::SYS_EINTR; |
|
||||||
case -5: |
|
||||||
return RequestStatus::SYS_EIO; |
|
||||||
case -11: |
|
||||||
return RequestStatus::SYS_EAGAIN; |
|
||||||
case -12: |
|
||||||
return RequestStatus::SYS_ENOMEM; |
|
||||||
case -13: |
|
||||||
return RequestStatus::SYS_EACCES; |
|
||||||
case -14: |
|
||||||
return RequestStatus::SYS_EFAULT; |
|
||||||
case -16: |
|
||||||
return RequestStatus::SYS_EBUSY; |
|
||||||
case -22: |
|
||||||
return RequestStatus::SYS_EINVAL; |
|
||||||
case -28: |
|
||||||
return RequestStatus::SYS_ENOSPC; |
|
||||||
case -110: |
|
||||||
return RequestStatus::SYS_ETIMEDOUT; |
|
||||||
default: |
|
||||||
LOG(ERROR) << "An unknown error returned from fingerprint vendor library: " << error; |
|
||||||
return RequestStatus::SYS_UNKNOWN; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// Translate from errors returned by traditional HAL (see fingerprint.h) to
|
|
||||||
// HIDL-compliant FingerprintError.
|
|
||||||
FingerprintError BiometricsFingerprint::VendorErrorFilter(int32_t error, int32_t* vendorCode) { |
|
||||||
switch (error) { |
|
||||||
case FINGERPRINT_ERROR_HW_UNAVAILABLE: |
|
||||||
return FingerprintError::ERROR_HW_UNAVAILABLE; |
|
||||||
case FINGERPRINT_ERROR_UNABLE_TO_PROCESS: |
|
||||||
return FingerprintError::ERROR_UNABLE_TO_PROCESS; |
|
||||||
case FINGERPRINT_ERROR_TIMEOUT: |
|
||||||
return FingerprintError::ERROR_TIMEOUT; |
|
||||||
case FINGERPRINT_ERROR_NO_SPACE: |
|
||||||
return FingerprintError::ERROR_NO_SPACE; |
|
||||||
case FINGERPRINT_ERROR_CANCELED: |
|
||||||
return FingerprintError::ERROR_CANCELED; |
|
||||||
case FINGERPRINT_ERROR_UNABLE_TO_REMOVE: |
|
||||||
return FingerprintError::ERROR_UNABLE_TO_REMOVE; |
|
||||||
case FINGERPRINT_ERROR_LOCKOUT: |
|
||||||
return FingerprintError::ERROR_LOCKOUT; |
|
||||||
default: |
|
||||||
if (error >= FINGERPRINT_ERROR_VENDOR_BASE) { |
|
||||||
// vendor specific code.
|
|
||||||
*vendorCode = error - FINGERPRINT_ERROR_VENDOR_BASE; |
|
||||||
return FingerprintError::ERROR_VENDOR; |
|
||||||
} |
|
||||||
} |
|
||||||
LOG(ERROR) << "Unknown error from fingerprint vendor library: " << error; |
|
||||||
return FingerprintError::ERROR_UNABLE_TO_PROCESS; |
|
||||||
} |
|
||||||
|
|
||||||
// Translate acquired messages returned by traditional HAL (see fingerprint.h)
|
|
||||||
// to HIDL-compliant FingerprintAcquiredInfo.
|
|
||||||
FingerprintAcquiredInfo BiometricsFingerprint::VendorAcquiredFilter(int32_t info, |
|
||||||
int32_t* vendorCode) { |
|
||||||
switch (info) { |
|
||||||
case FINGERPRINT_ACQUIRED_GOOD: |
|
||||||
return FingerprintAcquiredInfo::ACQUIRED_GOOD; |
|
||||||
case FINGERPRINT_ACQUIRED_PARTIAL: |
|
||||||
return FingerprintAcquiredInfo::ACQUIRED_PARTIAL; |
|
||||||
case FINGERPRINT_ACQUIRED_INSUFFICIENT: |
|
||||||
return FingerprintAcquiredInfo::ACQUIRED_INSUFFICIENT; |
|
||||||
case FINGERPRINT_ACQUIRED_IMAGER_DIRTY: |
|
||||||
return FingerprintAcquiredInfo::ACQUIRED_IMAGER_DIRTY; |
|
||||||
case FINGERPRINT_ACQUIRED_TOO_SLOW: |
|
||||||
return FingerprintAcquiredInfo::ACQUIRED_TOO_SLOW; |
|
||||||
case FINGERPRINT_ACQUIRED_TOO_FAST: |
|
||||||
return FingerprintAcquiredInfo::ACQUIRED_TOO_FAST; |
|
||||||
default: |
|
||||||
if (info >= FINGERPRINT_ACQUIRED_VENDOR_BASE) { |
|
||||||
// vendor specific code.
|
|
||||||
*vendorCode = info - FINGERPRINT_ACQUIRED_VENDOR_BASE; |
|
||||||
return FingerprintAcquiredInfo::ACQUIRED_VENDOR; |
|
||||||
} |
|
||||||
} |
|
||||||
LOG(ERROR) << "Unknown acquiredmsg from fingerprint vendor library: " << info; |
|
||||||
return FingerprintAcquiredInfo::ACQUIRED_INSUFFICIENT; |
|
||||||
} |
|
||||||
|
|
||||||
Return<uint64_t> BiometricsFingerprint::setNotify( |
|
||||||
const sp<IBiometricsFingerprintClientCallback>& clientCallback) { |
|
||||||
std::lock_guard<std::mutex> lock(mClientCallbackMutex); |
|
||||||
mClientCallback = clientCallback; |
|
||||||
// This is here because HAL 2.3 doesn't have a way to propagate a
|
|
||||||
// unique token for its driver. Subsequent versions should send a unique
|
|
||||||
// token for each call to setNotify(). This is fine as long as there's only
|
|
||||||
// one fingerprint device on the platform.
|
|
||||||
return reinterpret_cast<uint64_t>(this); |
|
||||||
} |
|
||||||
|
|
||||||
Return<uint64_t> BiometricsFingerprint::preEnroll() { |
|
||||||
return ss_fingerprint_pre_enroll(); |
|
||||||
} |
|
||||||
|
|
||||||
Return<RequestStatus> BiometricsFingerprint::enroll(const hidl_array<uint8_t, 69>& hat, |
|
||||||
uint32_t gid, uint32_t timeoutSec) { |
|
||||||
const hw_auth_token_t* authToken = reinterpret_cast<const hw_auth_token_t*>(hat.data()); |
|
||||||
|
|
||||||
#ifdef REQUEST_FORCE_CALIBRATE |
|
||||||
request(SEM_REQUEST_FORCE_CBGE, 1); |
|
||||||
#endif |
|
||||||
|
|
||||||
return ErrorFilter(ss_fingerprint_enroll(authToken, gid, timeoutSec)); |
|
||||||
} |
|
||||||
|
|
||||||
Return<RequestStatus> BiometricsFingerprint::postEnroll() { |
|
||||||
getInstance()->onFingerUp(); |
|
||||||
return ErrorFilter(ss_fingerprint_post_enroll()); |
|
||||||
} |
|
||||||
|
|
||||||
Return<uint64_t> BiometricsFingerprint::getAuthenticatorId() { |
|
||||||
return ss_fingerprint_get_auth_id(); |
|
||||||
} |
|
||||||
|
|
||||||
Return<RequestStatus> BiometricsFingerprint::cancel() { |
|
||||||
int32_t ret = ss_fingerprint_cancel(); |
|
||||||
getInstance()->onFingerUp(); |
|
||||||
|
|
||||||
#ifdef CALL_NOTIFY_ON_CANCEL |
|
||||||
if (ret == 0) { |
|
||||||
fingerprint_msg_t msg{}; |
|
||||||
msg.type = FINGERPRINT_ERROR; |
|
||||||
msg.data.error = FINGERPRINT_ERROR_CANCELED; |
|
||||||
notify(&msg); |
|
||||||
} |
|
||||||
#endif |
|
||||||
|
|
||||||
return ErrorFilter(ret); |
|
||||||
} |
|
||||||
|
|
||||||
Return<RequestStatus> BiometricsFingerprint::enumerate() { |
|
||||||
if (ss_fingerprint_enumerate != nullptr) { |
|
||||||
return ErrorFilter(ss_fingerprint_enumerate()); |
|
||||||
} |
|
||||||
|
|
||||||
return RequestStatus::SYS_UNKNOWN; |
|
||||||
} |
|
||||||
|
|
||||||
Return<RequestStatus> BiometricsFingerprint::remove(uint32_t gid, uint32_t fid) { |
|
||||||
return ErrorFilter(ss_fingerprint_remove(gid, fid)); |
|
||||||
} |
|
||||||
|
|
||||||
Return<RequestStatus> BiometricsFingerprint::setActiveGroup(uint32_t gid, |
|
||||||
const hidl_string& storePath) { |
|
||||||
if (storePath.size() >= PATH_MAX || storePath.size() <= 0) { |
|
||||||
LOG(ERROR) << "Bad path length: " << storePath.size(); |
|
||||||
return RequestStatus::SYS_EINVAL; |
|
||||||
} |
|
||||||
|
|
||||||
if (access(storePath.c_str(), W_OK)) { |
|
||||||
return RequestStatus::SYS_EINVAL; |
|
||||||
} |
|
||||||
|
|
||||||
return ErrorFilter(ss_fingerprint_set_active_group(gid, storePath.c_str())); |
|
||||||
} |
|
||||||
|
|
||||||
Return<RequestStatus> BiometricsFingerprint::authenticate(uint64_t operationId, uint32_t gid) { |
|
||||||
return ErrorFilter(ss_fingerprint_authenticate(operationId, gid)); |
|
||||||
} |
|
||||||
|
|
||||||
IBiometricsFingerprint* BiometricsFingerprint::getInstance() { |
|
||||||
if (!sInstance) { |
|
||||||
sInstance = new BiometricsFingerprint(); |
|
||||||
} |
|
||||||
return sInstance; |
|
||||||
} |
|
||||||
|
|
||||||
bool BiometricsFingerprint::openHal() { |
|
||||||
void* handle = dlopen("libbauthserver.so", RTLD_NOW); |
|
||||||
if (handle) { |
|
||||||
int err; |
|
||||||
|
|
||||||
ss_fingerprint_close = |
|
||||||
reinterpret_cast<typeof(ss_fingerprint_close)>(dlsym(handle, "ss_fingerprint_close")); |
|
||||||
ss_fingerprint_open = |
|
||||||
reinterpret_cast<typeof(ss_fingerprint_open)>(dlsym(handle, "ss_fingerprint_open")); |
|
||||||
|
|
||||||
ss_set_notify_callback = reinterpret_cast<typeof(ss_set_notify_callback)>( |
|
||||||
dlsym(handle, "ss_set_notify_callback")); |
|
||||||
ss_fingerprint_pre_enroll = reinterpret_cast<typeof(ss_fingerprint_pre_enroll)>( |
|
||||||
dlsym(handle, "ss_fingerprint_pre_enroll")); |
|
||||||
ss_fingerprint_enroll = |
|
||||||
reinterpret_cast<typeof(ss_fingerprint_enroll)>(dlsym(handle, "ss_fingerprint_enroll")); |
|
||||||
ss_fingerprint_post_enroll = reinterpret_cast<typeof(ss_fingerprint_post_enroll)>( |
|
||||||
dlsym(handle, "ss_fingerprint_post_enroll")); |
|
||||||
ss_fingerprint_get_auth_id = reinterpret_cast<typeof(ss_fingerprint_get_auth_id)>( |
|
||||||
dlsym(handle, "ss_fingerprint_get_auth_id")); |
|
||||||
ss_fingerprint_cancel = |
|
||||||
reinterpret_cast<typeof(ss_fingerprint_cancel)>(dlsym(handle, "ss_fingerprint_cancel")); |
|
||||||
ss_fingerprint_enumerate = reinterpret_cast<typeof(ss_fingerprint_enumerate)>( |
|
||||||
dlsym(handle, "ss_fingerprint_enumerate")); |
|
||||||
ss_fingerprint_remove = |
|
||||||
reinterpret_cast<typeof(ss_fingerprint_remove)>(dlsym(handle, "ss_fingerprint_remove")); |
|
||||||
ss_fingerprint_set_active_group = reinterpret_cast<typeof(ss_fingerprint_set_active_group)>( |
|
||||||
dlsym(handle, "ss_fingerprint_set_active_group")); |
|
||||||
ss_fingerprint_authenticate = reinterpret_cast<typeof(ss_fingerprint_authenticate)>( |
|
||||||
dlsym(handle, "ss_fingerprint_authenticate")); |
|
||||||
ss_fingerprint_request = reinterpret_cast<typeof(ss_fingerprint_request)>( |
|
||||||
dlsym(handle, "ss_fingerprint_request")); |
|
||||||
|
|
||||||
if ((err = ss_fingerprint_open(nullptr)) != 0) { |
|
||||||
LOG(ERROR) << "Can't open fingerprint, error: " << err; |
|
||||||
return false; |
|
||||||
} |
|
||||||
|
|
||||||
if ((err = ss_set_notify_callback(BiometricsFingerprint::notify)) != 0) { |
|
||||||
LOG(ERROR) << "Can't register fingerprint module callback, error: " << err; |
|
||||||
return false; |
|
||||||
} |
|
||||||
|
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
return false; |
|
||||||
} |
|
||||||
|
|
||||||
void BiometricsFingerprint::notify(const fingerprint_msg_t* msg) { |
|
||||||
BiometricsFingerprint* thisPtr = |
|
||||||
static_cast<BiometricsFingerprint*>(BiometricsFingerprint::getInstance()); |
|
||||||
std::lock_guard<std::mutex> lock(thisPtr->mClientCallbackMutex); |
|
||||||
if (thisPtr == nullptr || thisPtr->mClientCallback == nullptr) { |
|
||||||
LOG(ERROR) << "Receiving callbacks before the client callback is registered."; |
|
||||||
return; |
|
||||||
} |
|
||||||
const uint64_t devId = 1; |
|
||||||
switch (msg->type) { |
|
||||||
case FINGERPRINT_ERROR: { |
|
||||||
int32_t vendorCode = 0; |
|
||||||
FingerprintError result = VendorErrorFilter(msg->data.error, &vendorCode); |
|
||||||
LOG(DEBUG) << "onError(" << static_cast<int>(result) << ")"; |
|
||||||
if (!thisPtr->mClientCallback->onError(devId, result, vendorCode).isOk()) { |
|
||||||
LOG(ERROR) << "failed to invoke fingerprint onError callback"; |
|
||||||
} |
|
||||||
getInstance()->onFingerUp(); |
|
||||||
} break; |
|
||||||
case FINGERPRINT_ACQUIRED: { |
|
||||||
if (msg->data.acquired.acquired_info > SEM_FINGERPRINT_EVENT_BASE) { |
|
||||||
thisPtr->handleEvent(msg->data.acquired.acquired_info); |
|
||||||
return; |
|
||||||
} |
|
||||||
int32_t vendorCode = 0; |
|
||||||
FingerprintAcquiredInfo result = |
|
||||||
VendorAcquiredFilter(msg->data.acquired.acquired_info, &vendorCode); |
|
||||||
LOG(DEBUG) << "onAcquired(" << static_cast<int>(result) << ")"; |
|
||||||
if (!thisPtr->mClientCallback->onAcquired(devId, result, vendorCode).isOk()) { |
|
||||||
LOG(ERROR) << "failed to invoke fingerprint onAcquired callback"; |
|
||||||
} |
|
||||||
} break; |
|
||||||
case FINGERPRINT_TEMPLATE_ENROLLING: |
|
||||||
#ifdef USES_PERCENTAGE_SAMPLES |
|
||||||
const_cast<fingerprint_msg_t*>(msg)->data.enroll.samples_remaining = |
|
||||||
100 - msg->data.enroll.samples_remaining; |
|
||||||
#endif |
|
||||||
if(msg->data.enroll.samples_remaining == 0) { |
|
||||||
set(HBM_PATH, "0"); |
|
||||||
#ifdef CALL_CANCEL_ON_ENROLL_COMPLETION |
|
||||||
thisPtr->ss_fingerprint_cancel(); |
|
||||||
#endif |
|
||||||
} |
|
||||||
LOG(DEBUG) << "onEnrollResult(fid=" << msg->data.enroll.finger.fid |
|
||||||
<< ", gid=" << msg->data.enroll.finger.gid |
|
||||||
<< ", rem=" << msg->data.enroll.samples_remaining << ")"; |
|
||||||
if (!thisPtr->mClientCallback |
|
||||||
->onEnrollResult(devId, msg->data.enroll.finger.fid, |
|
||||||
msg->data.enroll.finger.gid, msg->data.enroll.samples_remaining) |
|
||||||
.isOk()) { |
|
||||||
LOG(ERROR) << "failed to invoke fingerprint onEnrollResult callback"; |
|
||||||
} |
|
||||||
break; |
|
||||||
case FINGERPRINT_TEMPLATE_REMOVED: |
|
||||||
LOG(DEBUG) << "onRemove(fid=" << msg->data.removed.finger.fid |
|
||||||
<< ", gid=" << msg->data.removed.finger.gid |
|
||||||
<< ", rem=" << msg->data.removed.remaining_templates << ")"; |
|
||||||
if (!thisPtr->mClientCallback |
|
||||||
->onRemoved(devId, msg->data.removed.finger.fid, msg->data.removed.finger.gid, |
|
||||||
msg->data.removed.remaining_templates) |
|
||||||
.isOk()) { |
|
||||||
LOG(ERROR) << "failed to invoke fingerprint onRemoved callback"; |
|
||||||
} |
|
||||||
break; |
|
||||||
case FINGERPRINT_AUTHENTICATED: |
|
||||||
LOG(DEBUG) << "onAuthenticated(fid=" << msg->data.authenticated.finger.fid |
|
||||||
<< ", gid=" << msg->data.authenticated.finger.gid << ")"; |
|
||||||
if (msg->data.authenticated.finger.fid != 0) { |
|
||||||
const uint8_t* hat = reinterpret_cast<const uint8_t*>(&msg->data.authenticated.hat); |
|
||||||
const hidl_vec<uint8_t> token( |
|
||||||
std::vector<uint8_t>(hat, hat + sizeof(msg->data.authenticated.hat))); |
|
||||||
if (!thisPtr->mClientCallback |
|
||||||
->onAuthenticated(devId, msg->data.authenticated.finger.fid, |
|
||||||
msg->data.authenticated.finger.gid, token) |
|
||||||
.isOk()) { |
|
||||||
LOG(ERROR) << "failed to invoke fingerprint onAuthenticated callback"; |
|
||||||
} |
|
||||||
getInstance()->onFingerUp(); |
|
||||||
} else { |
|
||||||
// Not a recognized fingerprint
|
|
||||||
if (!thisPtr->mClientCallback |
|
||||||
->onAuthenticated(devId, msg->data.authenticated.finger.fid, |
|
||||||
msg->data.authenticated.finger.gid, hidl_vec<uint8_t>()) |
|
||||||
.isOk()) { |
|
||||||
LOG(ERROR) << "failed to invoke fingerprint onAuthenticated callback"; |
|
||||||
} |
|
||||||
} |
|
||||||
break; |
|
||||||
case FINGERPRINT_TEMPLATE_ENUMERATING: |
|
||||||
LOG(DEBUG) << "onEnumerate(fid=" << msg->data.enumerated.finger.fid |
|
||||||
<< ", gid=" << msg->data.enumerated.finger.gid |
|
||||||
<< ", rem=" << msg->data.enumerated.remaining_templates << ")"; |
|
||||||
if (!thisPtr->mClientCallback |
|
||||||
->onEnumerate(devId, msg->data.enumerated.finger.fid, |
|
||||||
msg->data.enumerated.finger.gid, |
|
||||||
msg->data.enumerated.remaining_templates) |
|
||||||
.isOk()) { |
|
||||||
LOG(ERROR) << "failed to invoke fingerprint onEnumerate callback"; |
|
||||||
} |
|
||||||
break; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
void BiometricsFingerprint::handleEvent(int eventCode) { |
|
||||||
switch (eventCode) { |
|
||||||
#ifdef HAS_FINGERPRINT_GESTURES |
|
||||||
case SEM_FINGERPRINT_EVENT_GESTURE_SWIPE_DOWN: |
|
||||||
case SEM_FINGERPRINT_EVENT_GESTURE_SWIPE_UP: |
|
||||||
struct input_event event {}; |
|
||||||
int keycode = eventCode == SEM_FINGERPRINT_EVENT_GESTURE_SWIPE_UP ? |
|
||||||
KEY_UP : KEY_DOWN; |
|
||||||
|
|
||||||
// Report the key
|
|
||||||
event.type = EV_KEY; |
|
||||||
event.code = keycode; |
|
||||||
event.value = 1; |
|
||||||
if (write(uinputFd, &event, sizeof(event)) < 0) { |
|
||||||
LOG(ERROR) << "Write EV_KEY to uinput node failed"; |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
// Force a flush with an EV_SYN
|
|
||||||
event.type = EV_SYN; |
|
||||||
event.code = SYN_REPORT; |
|
||||||
event.value = 0; |
|
||||||
if (write(uinputFd, &event, sizeof(event)) < 0) { |
|
||||||
LOG(ERROR) << "Write EV_SYN to uinput node failed"; |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
// Report the key
|
|
||||||
event.type = EV_KEY; |
|
||||||
event.code = keycode; |
|
||||||
event.value = 0; |
|
||||||
if (write(uinputFd, &event, sizeof(event)) < 0) { |
|
||||||
LOG(ERROR) << "Write EV_KEY to uinput node failed"; |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
// Force a flush with an EV_SYN
|
|
||||||
event.type = EV_SYN; |
|
||||||
event.code = SYN_REPORT; |
|
||||||
event.value = 0; |
|
||||||
if (write(uinputFd, &event, sizeof(event)) < 0) { |
|
||||||
LOG(ERROR) << "Write EV_SYN to uinput node failed"; |
|
||||||
return; |
|
||||||
} |
|
||||||
break; |
|
||||||
#endif |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
int BiometricsFingerprint::request(int cmd, int param) { |
|
||||||
// TO-DO: input, output handling not implemented
|
|
||||||
int result = ss_fingerprint_request(cmd, nullptr, 0, nullptr, 0, param); |
|
||||||
LOG(INFO) << "request(cmd=" << cmd << ", param=" << param << ", result=" << result << ")"; |
|
||||||
return result; |
|
||||||
} |
|
||||||
|
|
||||||
int BiometricsFingerprint::waitForSensor(std::chrono::milliseconds pollWait, |
|
||||||
std::chrono::milliseconds timeOut) { |
|
||||||
int sensorStatus = SEM_SENSOR_STATUS_WORKING; |
|
||||||
std::chrono::milliseconds timeWaited = 0ms; |
|
||||||
while (sensorStatus != SEM_SENSOR_STATUS_OK) { |
|
||||||
if (sensorStatus == SEM_SENSOR_STATUS_CALIBRATION_ERROR |
|
||||||
|| sensorStatus == SEM_SENSOR_STATUS_ERROR){ |
|
||||||
return -1; |
|
||||||
} |
|
||||||
if (timeWaited >= timeOut) { |
|
||||||
return -2; |
|
||||||
} |
|
||||||
sensorStatus = request(FINGERPRINT_REQUEST_GET_SENSOR_STATUS, 0); |
|
||||||
std::this_thread::sleep_for(pollWait); |
|
||||||
timeWaited += pollWait; |
|
||||||
} |
|
||||||
return 0; |
|
||||||
} |
|
||||||
|
|
||||||
} // namespace implementation
|
|
||||||
} // namespace V2_3
|
|
||||||
} // namespace fingerprint
|
|
||||||
} // namespace biometrics
|
|
||||||
} // namespace hardware
|
|
||||||
} // namespace android
|
|
@ -1,119 +0,0 @@ |
|||||||
/*
|
|
||||||
* Copyright (C) 2019-2022 The LineageOS Project |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||||
* you may not use this file except in compliance with the License. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
|
|
||||||
#pragma once |
|
||||||
|
|
||||||
#include <chrono> |
|
||||||
#include <thread> |
|
||||||
|
|
||||||
#ifdef HAS_FINGERPRINT_GESTURES |
|
||||||
#include <linux/uinput.h> |
|
||||||
#endif |
|
||||||
|
|
||||||
#include <hardware/fingerprint.h> |
|
||||||
#include <hardware/hardware.h> |
|
||||||
#include <hidl/MQDescriptor.h> |
|
||||||
#include <hidl/Status.h> |
|
||||||
#include <android/hardware/biometrics/fingerprint/2.3/IBiometricsFingerprint.h> |
|
||||||
#include <android/hardware/biometrics/fingerprint/2.1/types.h> |
|
||||||
|
|
||||||
#include "VendorConstants.h" |
|
||||||
|
|
||||||
namespace android { |
|
||||||
namespace hardware { |
|
||||||
namespace biometrics { |
|
||||||
namespace fingerprint { |
|
||||||
namespace V2_3 { |
|
||||||
namespace implementation { |
|
||||||
|
|
||||||
using namespace std::chrono_literals; |
|
||||||
|
|
||||||
using ::android::sp; |
|
||||||
using ::android::hardware::hidl_string; |
|
||||||
using ::android::hardware::hidl_vec; |
|
||||||
using ::android::hardware::Return; |
|
||||||
using ::android::hardware::Void; |
|
||||||
using ::android::hardware::biometrics::fingerprint::V2_3::IBiometricsFingerprint; |
|
||||||
using ::android::hardware::biometrics::fingerprint::V2_1::IBiometricsFingerprintClientCallback; |
|
||||||
using ::android::hardware::biometrics::fingerprint::V2_1::FingerprintAcquiredInfo; |
|
||||||
using ::android::hardware::biometrics::fingerprint::V2_1::FingerprintError; |
|
||||||
using ::android::hardware::biometrics::fingerprint::V2_1::RequestStatus; |
|
||||||
|
|
||||||
struct BiometricsFingerprint : public IBiometricsFingerprint { |
|
||||||
BiometricsFingerprint(); |
|
||||||
~BiometricsFingerprint(); |
|
||||||
|
|
||||||
// Method to wrap legacy HAL with BiometricsFingerprint class
|
|
||||||
static IBiometricsFingerprint* getInstance(); |
|
||||||
|
|
||||||
// Methods from ::android::hardware::biometrics::fingerprint::V2_3::IBiometricsFingerprint follow.
|
|
||||||
Return<uint64_t> setNotify( |
|
||||||
const sp<IBiometricsFingerprintClientCallback>& clientCallback) override; |
|
||||||
Return<uint64_t> preEnroll() override; |
|
||||||
Return<RequestStatus> enroll(const hidl_array<uint8_t, 69>& hat, uint32_t gid, |
|
||||||
uint32_t timeoutSec) override; |
|
||||||
Return<RequestStatus> postEnroll() override; |
|
||||||
Return<uint64_t> getAuthenticatorId() override; |
|
||||||
Return<RequestStatus> cancel() override; |
|
||||||
Return<RequestStatus> enumerate() override; |
|
||||||
Return<RequestStatus> remove(uint32_t gid, uint32_t fid) override; |
|
||||||
Return<RequestStatus> setActiveGroup(uint32_t gid, const hidl_string& storePath) override; |
|
||||||
Return<RequestStatus> authenticate(uint64_t operationId, uint32_t gid) override; |
|
||||||
Return<bool> isUdfps(uint32_t sensorID) override; |
|
||||||
Return<void> onFingerDown(uint32_t x, uint32_t y, float minor, float major) override; |
|
||||||
Return<void> onFingerUp() override; |
|
||||||
|
|
||||||
private: |
|
||||||
bool openHal(); |
|
||||||
int request(int cmd, int param); |
|
||||||
int waitForSensor(std::chrono::milliseconds pollWait, std::chrono::milliseconds timeOut); |
|
||||||
static void notify( |
|
||||||
const fingerprint_msg_t* msg); /* Static callback for legacy HAL implementation */ |
|
||||||
void handleEvent(int eventCode); |
|
||||||
static Return<RequestStatus> ErrorFilter(int32_t error); |
|
||||||
static FingerprintError VendorErrorFilter(int32_t error, int32_t* vendorCode); |
|
||||||
static FingerprintAcquiredInfo VendorAcquiredFilter(int32_t error, int32_t* vendorCode); |
|
||||||
static BiometricsFingerprint* sInstance; |
|
||||||
|
|
||||||
std::mutex mClientCallbackMutex; |
|
||||||
sp<IBiometricsFingerprintClientCallback> mClientCallback; |
|
||||||
bool mIsUdfps; |
|
||||||
#ifdef HAS_FINGERPRINT_GESTURES |
|
||||||
int uinputFd; |
|
||||||
#endif |
|
||||||
|
|
||||||
int (*ss_fingerprint_close)(); |
|
||||||
int (*ss_fingerprint_open)(const char* id); |
|
||||||
|
|
||||||
int (*ss_set_notify_callback)(fingerprint_notify_t notify); |
|
||||||
uint64_t (*ss_fingerprint_pre_enroll)(); |
|
||||||
int (*ss_fingerprint_enroll)(const hw_auth_token_t* hat, uint32_t gid, uint32_t timeout_sec); |
|
||||||
int (*ss_fingerprint_post_enroll)(); |
|
||||||
uint64_t (*ss_fingerprint_get_auth_id)(); |
|
||||||
int (*ss_fingerprint_cancel)(); |
|
||||||
int (*ss_fingerprint_enumerate)(); |
|
||||||
int (*ss_fingerprint_remove)(uint32_t gid, uint32_t fid); |
|
||||||
int (*ss_fingerprint_set_active_group)(uint32_t gid, const char* store_path); |
|
||||||
int (*ss_fingerprint_authenticate)(uint64_t operation_id, uint32_t gid); |
|
||||||
int (*ss_fingerprint_request)(uint32_t cmd, char *inBuf, uint32_t inBuf_length, char *outBuf, uint32_t outBuf_length, uint32_t param); |
|
||||||
}; |
|
||||||
|
|
||||||
} // namespace implementation
|
|
||||||
} // namespace V2_3
|
|
||||||
} // namespace fingerprint
|
|
||||||
} // namespace biometrics
|
|
||||||
} // namespace hardware
|
|
||||||
} // namespace android
|
|
@ -1,101 +0,0 @@ |
|||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
// Copyright (C) 2020 The LineageOS Project
|
|
||||||
|
|
||||||
#pragma once |
|
||||||
|
|
||||||
// Fingerprint requests
|
|
||||||
#define FINGERPRINT_REQUEST_ENROLL_SESSION 1002 |
|
||||||
#define FINGERPRINT_REQUEST_ENROLL_TYPE 18 |
|
||||||
#define FINGERPRINT_REQUEST_ENUMERATE 11 |
|
||||||
#define FINGERPRINT_REQUEST_GET_FP_IDS 1003 |
|
||||||
#define FINGERPRINT_REQUEST_GET_MAX_TEMPLATE_NUMBER 1004 |
|
||||||
#define FINGERPRINT_REQUEST_GET_SENSOR_INFO 5 |
|
||||||
#define FINGERPRINT_REQUEST_GET_SENSOR_STATUS 6 |
|
||||||
#define FINGERPRINT_REQUEST_GET_TOUCH_CNT 1007 |
|
||||||
#define FINGERPRINT_REQUEST_GET_UNIQUE_ID 7 |
|
||||||
#define FINGERPRINT_REQUEST_GET_USERIDS 12 |
|
||||||
#define FINGERPRINT_REQUEST_GET_VERSION 4 |
|
||||||
#define FINGERPRINT_REQUEST_HAS_FEATURE 1006 |
|
||||||
#define FINGERPRINT_REQUEST_LOCKOUT 1001 |
|
||||||
#define FINGERPRINT_REQUEST_NAVIGATION_LCD_ONOFF 17 |
|
||||||
#define FINGERPRINT_REQUEST_NAVIGATION_MODE_END 16 |
|
||||||
#define FINGERPRINT_REQUEST_NAVIGATION_MODE_START 15 |
|
||||||
#define FINGERPRINT_REQUEST_PAUSE 0 |
|
||||||
#define FINGERPRINT_REQUEST_PROCESS_FIDO 9 |
|
||||||
#define FINGERPRINT_REQUEST_REMOVE_FINGER 1000 |
|
||||||
#define FINGERPRINT_REQUEST_RESUME 1 |
|
||||||
#define FINGERPRINT_REQUEST_SENSOR_TEST_NORMALSCAN 3 |
|
||||||
#define FINGERPRINT_REQUEST_SESSION_OPEN 2 |
|
||||||
#define FINGERPRINT_REQUEST_SET_ACTIVE_GROUP 8 |
|
||||||
#define FINGERPRINT_REQUEST_UPDATE_SID 10 |
|
||||||
|
|
||||||
#define SEM_REQUEST_FORCE_CBGE 21 |
|
||||||
#define SEM_REQUEST_GET_FINGER_ICON_REMAIN_TIME 1010 |
|
||||||
#define SEM_REQUEST_GET_SECURITY_LEVEL 30 |
|
||||||
#define SEM_REQUEST_GET_SENSOR_TEST_RESULT 19 |
|
||||||
#define SEM_REQUEST_GET_TA_VERSION 10000 |
|
||||||
#define SEM_REQUEST_GET_TSP_BLOCK_STATUS 0x3F9 |
|
||||||
#define SEM_REQUEST_HIDE_INDISPLAY_AUTH_ANIMATION 0x3F4 |
|
||||||
#define SEM_REQUEST_INSTALL_TA 10001 |
|
||||||
#define SEM_REQUEST_IS_NEW_MATCHER 27 |
|
||||||
#define SEM_REQUEST_IS_TEMPLATE_CHANGED 25 |
|
||||||
#define SEM_REQUEST_MASK_CTL 0x3F5 |
|
||||||
#define SEM_REQUEST_MOVE_INDISPLAY_ICON 0x3F3 |
|
||||||
#define SEM_REQUEST_OPTICAL_CALIBRATION 0x3F8 |
|
||||||
#define SEM_REQUEST_REMOVE_ALL_USER 0x3F6 |
|
||||||
#define SEM_REQUEST_SET_ASP_LEVEL 20 |
|
||||||
#define SEM_REQUEST_SET_BOUNCER_SCREEN_STATUS 0x3FA |
|
||||||
#define SEM_REQUEST_SET_SCREEN_STATUS 0x3F0 |
|
||||||
#define SEM_REQUEST_SHOW_INDISPLAY_AUTH_ANIMATION 1009 |
|
||||||
#define SEM_REQUEST_TOUCH_EVENT 22 |
|
||||||
#define SEM_REQUEST_TOUCH_SENSITIVE_CHANGE 0x3F7 |
|
||||||
#define SEM_REQUEST_UPDATE_MATCHER 28 |
|
||||||
#define SEM_REQUEST_VENDOR_EGIS_CALIBRATION 23 |
|
||||||
#define SEM_REQUEST_VENDOR_QCOM_REMOVE_CBGE 24 |
|
||||||
#define SEM_REQUEST_WIRELESS_CHARGER_STATUS 29 |
|
||||||
|
|
||||||
// Fingerprint aquired codes
|
|
||||||
#define SEM_FINGERPRINT_ACQUIRED_DUPLICATED_IMAGE 1002 |
|
||||||
#define SEM_FINGERPRINT_ACQUIRED_LIGHT_TOUCH 1003 |
|
||||||
#define SEM_FINGERPRINT_ACQUIRED_TSP_BLOCK 1004 |
|
||||||
#define SEM_FINGERPRINT_ACQUIRED_TSP_UNBLOCK 1005 |
|
||||||
#define SEM_FINGERPRINT_ACQUIRED_WET_FINGER 1001 |
|
||||||
|
|
||||||
// Fingerprint errors
|
|
||||||
#define SEM_FINGERPRINT_ERROR_CALIBRATION 1001 |
|
||||||
#define SEM_FINGERPRINT_ERROR_DISABLED_BIOMETRICS 5002 |
|
||||||
#define SEM_FINGERPRINT_ERROR_INVALID_HW 1005 |
|
||||||
#define SEM_FINGERPRINT_ERROR_NEED_TO_RETRY 5000 |
|
||||||
#define SEM_FINGERPRINT_ERROR_ONE_HAND_MODE 5001 |
|
||||||
#define SEM_FINGERPRINT_ERROR_PATTERN_DETECTED 1007 |
|
||||||
#define SEM_FINGERPRINT_ERROR_SERVICE_FAILURE 1003 |
|
||||||
#define SEM_FINGERPRINT_ERROR_SMART_VIEW 5003 |
|
||||||
#define SEM_FINGERPRINT_ERROR_SYSTEM_FAILURE 1002 |
|
||||||
#define SEM_FINGERPRINT_ERROR_TA_UPDATE -100 |
|
||||||
#define SEM_FINGERPRINT_ERROR_TEMPLATE_CORRUPTED 1004 |
|
||||||
#define SEM_FINGERPRINT_ERROR_TEMPLATE_FORMAT_CHANGED 1006 |
|
||||||
#define SEM_FINGERPRINT_ERROR_WIRELESS_CHARGING 5004 |
|
||||||
|
|
||||||
// Fingerprint events
|
|
||||||
#define SEM_FINGERPRINT_EVENT_BASE 10000 |
|
||||||
#define SEM_FINGERPRINT_EVENT_CAPTURE_COMPLETED 10003 |
|
||||||
#define SEM_FINGERPRINT_EVENT_CAPTURE_FAILED 10006 |
|
||||||
#define SEM_FINGERPRINT_EVENT_CAPTURE_READY 10001 |
|
||||||
#define SEM_FINGERPRINT_EVENT_CAPTURE_STARTED 10002 |
|
||||||
#define SEM_FINGERPRINT_EVENT_CAPTURE_SUCCESS 10005 |
|
||||||
#define SEM_FINGERPRINT_EVENT_FACTORY_SNSR_SCRIPT_END 10009 |
|
||||||
#define SEM_FINGERPRINT_EVENT_FACTORY_SNSR_SCRIPT_START 10008 |
|
||||||
#define SEM_FINGERPRINT_EVENT_FINGER_LEAVE 10004 |
|
||||||
#define SEM_FINGERPRINT_EVENT_FINGER_LEAVE_TIMEOUT 10007 |
|
||||||
#define SEM_FINGERPRINT_EVENT_GESTURE_DTAP 20003 |
|
||||||
#define SEM_FINGERPRINT_EVENT_GESTURE_LPRESS 20004 |
|
||||||
#define SEM_FINGERPRINT_EVENT_GESTURE_SWIPE_DOWN 20002 |
|
||||||
#define SEM_FINGERPRINT_EVENT_GESTURE_SWIPE_UP 20001 |
|
||||||
#define SEM_FINGERPRINT_EVENT_SPEN_CONTROL_OFF 30002 |
|
||||||
#define SEM_FINGERPRINT_EVENT_SPEN_CONTROL_ON 30001 |
|
||||||
|
|
||||||
// Fingerprint sensor status codes
|
|
||||||
#define SEM_SENSOR_STATUS_CALIBRATION_ERROR 100045 |
|
||||||
#define SEM_SENSOR_STATUS_ERROR 100042 |
|
||||||
#define SEM_SENSOR_STATUS_OK 100040 |
|
||||||
#define SEM_SENSOR_STATUS_WORKING 100041 |
|
@ -1,7 +0,0 @@ |
|||||||
service vendor.fps_hal /vendor/bin/hw/android.hardware.biometrics.fingerprint@2.3-service-samsung.sm7125 |
|
||||||
# "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. |
|
||||||
class late_start |
|
||||||
user system |
|
||||||
group system input |
|
@ -1,12 +0,0 @@ |
|||||||
<manifest version="1.0" type="device"> |
|
||||||
<hal format="hidl" override="true"> |
|
||||||
<name>android.hardware.biometrics.fingerprint</name> |
|
||||||
<transport>hwbinder</transport> |
|
||||||
<version>2.3</version> |
|
||||||
<interface> |
|
||||||
<name>IBiometricsFingerprint</name> |
|
||||||
<instance>default</instance> |
|
||||||
</interface> |
|
||||||
<fqname>@2.3::IBiometricsFingerprint/default</fqname> |
|
||||||
</hal> |
|
||||||
</manifest> |
|
@ -1,51 +0,0 @@ |
|||||||
/*
|
|
||||||
* Copyright (C) 2019 The LineageOS Project |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||||
* you may not use this file except in compliance with the License. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
|
|
||||||
#define LOG_TAG "android.hardware.biometrics.fingerprint@2.3-service-samsung.sm7125" |
|
||||||
|
|
||||||
#include <android-base/logging.h> |
|
||||||
#include <hidl/HidlTransportSupport.h> |
|
||||||
#include <utils/Errors.h> |
|
||||||
|
|
||||||
#include "BiometricsFingerprint.h" |
|
||||||
|
|
||||||
using android::hardware::configureRpcThreadpool; |
|
||||||
using android::hardware::joinRpcThreadpool; |
|
||||||
|
|
||||||
using android::hardware::biometrics::fingerprint::V2_3::IBiometricsFingerprint; |
|
||||||
using android::hardware::biometrics::fingerprint::V2_3::implementation::BiometricsFingerprint; |
|
||||||
|
|
||||||
using android::OK; |
|
||||||
using android::sp; |
|
||||||
|
|
||||||
int main() { |
|
||||||
android::sp<IBiometricsFingerprint> bio = BiometricsFingerprint::getInstance(); |
|
||||||
|
|
||||||
configureRpcThreadpool(1, true); |
|
||||||
|
|
||||||
if (bio == nullptr || bio->registerAsService() != OK) { |
|
||||||
LOG(ERROR) << "Could not register service for Fingerprint HAL"; |
|
||||||
goto shutdown; |
|
||||||
} |
|
||||||
|
|
||||||
LOG(INFO) << "Fingerprint HAL service is Ready."; |
|
||||||
joinRpcThreadpool(); |
|
||||||
|
|
||||||
shutdown: |
|
||||||
// In normal operation, we don't expect the thread pool to shutdown
|
|
||||||
LOG(ERROR) << "Fingerprint HAL failed to join thread pool."; |
|
||||||
return 1; |
|
||||||
} |
|
Loading…
Reference in new issue