diff --git a/fingerprint/Android.bp b/fingerprint/Android.bp deleted file mode 100644 index ed17973..0000000 --- a/fingerprint/Android.bp +++ /dev/null @@ -1,37 +0,0 @@ -cc_defaults { - name: "xiaomi_sm6150-fingerprint_defaults", - defaults: ["hidl_defaults"], - vintf_fragments: ["android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150.xml"], - vendor: true, - relative_install_path: "hw", - srcs: [ - "BiometricsFingerprint.cpp", - "service.cpp", - ], - - shared_libs: [ - "libbase", - "libcutils", - "liblog", - "libhidlbase", - "libhardware", - "libutils", - "android.hardware.biometrics.fingerprint@2.1", - "android.hardware.biometrics.fingerprint@2.2", - "android.hardware.biometrics.fingerprint@2.3", - ], - -} - -cc_binary { - name: "android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150", - defaults: ["xiaomi_sm6150-fingerprint_defaults"], - init_rc: ["android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150.rc"], -} - -cc_binary { - name: "android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150-udfps", - defaults: ["xiaomi_sm6150-fingerprint_defaults"], - init_rc: ["android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150-udfps.rc"], - cflags: ["-DENABLE_UDFPS"], -} diff --git a/fingerprint/BiometricsFingerprint.cpp b/fingerprint/BiometricsFingerprint.cpp deleted file mode 100644 index 60041e6..0000000 --- a/fingerprint/BiometricsFingerprint.cpp +++ /dev/null @@ -1,508 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * Copyright (C) 2018-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. - */ -#define LOG_TAG "android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150" -#define LOG_VERBOSE "android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150" - -#include -#include -#include - -#include "BiometricsFingerprint.h" - -#define COMMAND_NIT 10 -#define PARAM_NIT_FOD 1 -#define PARAM_NIT_NONE 0 - -#define FOD_STATUS_ON 1 -#define FOD_STATUS_OFF -1 - -#define TOUCH_DEV_PATH "/dev/xiaomi-touch" -#define Touch_Fod_Enable 10 -#define TOUCH_MAGIC 0x5400 -#define TOUCH_IOC_SETMODE TOUCH_MAGIC + 0 - -#define FOD_UI_PATH "/sys/devices/platform/soc/soc:qcom,dsi-display/fod_ui" - -#ifdef ENABLE_UDFPS -namespace { -static bool readBool(int fd) { - char c; - int rc; - - rc = lseek(fd, 0, SEEK_SET); - if (rc) { - ALOGE("failed to seek fd, err: %d", rc); - return false; - } - - rc = read(fd, &c, sizeof(char)); - if (rc != 1) { - ALOGE("failed to read bool from fd, err: %d", rc); - return false; - } - - return c != '0'; -} -} // anonymous namespace -#endif - -namespace android { -namespace hardware { -namespace biometrics { -namespace fingerprint { -namespace V2_3 { -namespace implementation { - -// Supported fingerprint HAL version -static const uint16_t kVersion = HARDWARE_MODULE_API_VERSION(2, 1); - -BiometricsFingerprint* BiometricsFingerprint::sInstance = nullptr; - -BiometricsFingerprint::BiometricsFingerprint() : mClientCallback(nullptr), mDevice(nullptr) { - sInstance = this; // keep track of the most recent instance - mDevice = openHal(); - if (!mDevice) { - ALOGE("Can't open HAL module"); - } - -#ifdef ENABLE_UDFPS - touch_fd_ = android::base::unique_fd(open(TOUCH_DEV_PATH, O_RDWR)); - - std::thread([this]() { - int fd = open(FOD_UI_PATH, O_RDONLY); - if (fd < 0) { - ALOGE("failed to open fd, err: %d", fd); - return; - } - - struct pollfd fodUiPoll = { - .fd = fd, - .events = POLLERR | POLLPRI, - .revents = 0, - }; - - while (true) { - int rc = poll(&fodUiPoll, 1, -1); - if (rc < 0) { - ALOGE("failed to poll fd, err: %d", rc); - continue; - } - - bool fingerDown = readBool(fd); - ALOGI("fod_ui status: %d", fingerDown); - mDevice->extCmd(mDevice, COMMAND_NIT, fingerDown ? PARAM_NIT_FOD : PARAM_NIT_NONE); - if (!fingerDown) { - int arg[2] = {Touch_Fod_Enable, FOD_STATUS_OFF}; - ioctl(touch_fd_.get(), TOUCH_IOC_SETMODE, &arg); - } - } - }).detach(); -#endif -} - -BiometricsFingerprint::~BiometricsFingerprint() { - ALOGV("~BiometricsFingerprint()"); - if (mDevice == nullptr) { - ALOGE("No valid device"); - return; - } - int err; - if (0 != (err = mDevice->common.close(reinterpret_cast(mDevice)))) { - ALOGE("Can't close fingerprint module, error: %d", err); - return; - } - mDevice = nullptr; -} - -Return 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: - ALOGE("An unknown error returned from fingerprint vendor library: %d", 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) { - *vendorCode = 0; - 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; - } - } - ALOGE("Unknown error from fingerprint vendor library: %d", 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) { - *vendorCode = 0; - 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; - } - } - ALOGE("Unknown acquiredmsg from fingerprint vendor library: %d", info); - return FingerprintAcquiredInfo::ACQUIRED_INSUFFICIENT; -} - -Return BiometricsFingerprint::setNotify( - const sp& clientCallback) { - std::lock_guard lock(mClientCallbackMutex); - mClientCallback = clientCallback; - // This is here because HAL 2.1 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(mDevice); -} - -Return BiometricsFingerprint::preEnroll() { - return mDevice->pre_enroll(mDevice); -} - -Return BiometricsFingerprint::enroll(const hidl_array& hat, - uint32_t gid, uint32_t timeoutSec) { - const hw_auth_token_t* authToken = reinterpret_cast(hat.data()); - return ErrorFilter(mDevice->enroll(mDevice, authToken, gid, timeoutSec)); -} - -Return BiometricsFingerprint::postEnroll() { - return ErrorFilter(mDevice->post_enroll(mDevice)); -} - -Return BiometricsFingerprint::getAuthenticatorId() { - return mDevice->get_authenticator_id(mDevice); -} - -Return BiometricsFingerprint::cancel() { - return ErrorFilter(mDevice->cancel(mDevice)); -} - -Return BiometricsFingerprint::enumerate() { - return ErrorFilter(mDevice->enumerate(mDevice)); -} - -Return BiometricsFingerprint::remove(uint32_t gid, uint32_t fid) { - return ErrorFilter(mDevice->remove(mDevice, gid, fid)); -} - -Return BiometricsFingerprint::setActiveGroup(uint32_t gid, - const hidl_string& storePath) { - if (storePath.size() >= PATH_MAX || storePath.size() <= 0) { - ALOGE("Bad path length: %zd", storePath.size()); - return RequestStatus::SYS_EINVAL; - } - if (access(storePath.c_str(), W_OK)) { - return RequestStatus::SYS_EINVAL; - } - - return ErrorFilter(mDevice->set_active_group(mDevice, gid, storePath.c_str())); -} - -Return BiometricsFingerprint::authenticate(uint64_t operationId, uint32_t gid) { - return ErrorFilter(mDevice->authenticate(mDevice, operationId, gid)); -} - -IBiometricsFingerprint* BiometricsFingerprint::getInstance() { - if (!sInstance) { - sInstance = new BiometricsFingerprint(); - } - return sInstance; -} - -fingerprint_device_t* getDeviceForVendor(const char* class_name) { - int err; - const hw_module_t* hw_mdl = nullptr; - ALOGD("Opening fingerprint hal library..."); - if (0 != (err = hw_get_module_by_class(FINGERPRINT_HARDWARE_MODULE_ID, class_name, &hw_mdl))) { - ALOGE("Can't open fingerprint HW Module, class: %s, error: %d", class_name, err); - return nullptr; - } - - if (hw_mdl == nullptr) { - ALOGE("No valid fingerprint module, class: %s", class_name); - return nullptr; - } - - fingerprint_module_t const* module = reinterpret_cast(hw_mdl); - if (module->common.methods->open == nullptr) { - ALOGE("No valid open method, class: %s", class_name); - return nullptr; - } - - hw_device_t* device = nullptr; - - if (0 != (err = module->common.methods->open(hw_mdl, nullptr, &device))) { - ALOGE("Can't open fingerprint methods, class: %s, error: %d", class_name, err); - return nullptr; - } - - if (kVersion != device->version) { - // enforce version on new devices because of HIDL@2.1 translation layer - ALOGE("Wrong fp version. Expected %d, got %d", kVersion, device->version); - return nullptr; - } - - fingerprint_device_t* fp_device = reinterpret_cast(device); - - ALOGI("Loaded fingerprint module, class: %s", class_name); - return fp_device; -} - -fingerprint_device_t* getFingerprintDevice() { - fingerprint_device_t* fp_device; - std::string vendor_modules[] = {"fpc", "fpc_fod", "goodix", "goodix_fod"}; - - for (const auto& vendor : vendor_modules) { - if ((fp_device = getDeviceForVendor(vendor.c_str())) == nullptr) { - ALOGE("Failed to load %s fingerprint module", vendor.c_str()); - continue; - } - return fp_device; - } - - return nullptr; -} - -fingerprint_device_t* BiometricsFingerprint::openHal() { - int err; - - fingerprint_device_t* fp_device; - fp_device = getFingerprintDevice(); - if (fp_device == nullptr) { - return nullptr; - } - - if (0 != (err = fp_device->set_notify(fp_device, BiometricsFingerprint::notify))) { - ALOGE("Can't register fingerprint module callback, error: %d", err); - return nullptr; - } - - return fp_device; -} - -void BiometricsFingerprint::notify(const fingerprint_msg_t* msg) { - BiometricsFingerprint* thisPtr = - static_cast(BiometricsFingerprint::getInstance()); - std::lock_guard lock(thisPtr->mClientCallbackMutex); - if (thisPtr == nullptr || thisPtr->mClientCallback == nullptr) { - ALOGE("Receiving callbacks before the client callback is registered."); - return; - } - const uint64_t devId = reinterpret_cast(thisPtr->mDevice); - switch (msg->type) { - case FINGERPRINT_ERROR: { - int32_t vendorCode = 0; - FingerprintError result = VendorErrorFilter(msg->data.error, &vendorCode); - ALOGD("onError(%d)", result); - if (!thisPtr->mClientCallback->onError(devId, result, vendorCode).isOk()) { - ALOGE("failed to invoke fingerprint onError callback"); - } - } break; - case FINGERPRINT_ACQUIRED: { - int32_t vendorCode = 0; - FingerprintAcquiredInfo result = - VendorAcquiredFilter(msg->data.acquired.acquired_info, &vendorCode); - ALOGD("onAcquired(%d)", result); - if (!thisPtr->mClientCallback->onAcquired(devId, result, vendorCode).isOk()) { - ALOGE("failed to invoke fingerprint onAcquired callback"); - } - } break; - case FINGERPRINT_TEMPLATE_ENROLLING: - ALOGD("onEnrollResult(fid=%d, gid=%d, rem=%d)", msg->data.enroll.finger.fid, - msg->data.enroll.finger.gid, 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()) { - ALOGE("failed to invoke fingerprint onEnrollResult callback"); - } - break; - case FINGERPRINT_TEMPLATE_REMOVED: - ALOGD("onRemove(fid=%d, gid=%d, rem=%d)", msg->data.removed.finger.fid, - msg->data.removed.finger.gid, 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()) { - ALOGE("failed to invoke fingerprint onRemoved callback"); - } - break; - case FINGERPRINT_AUTHENTICATED: - if (msg->data.authenticated.finger.fid != 0) { - ALOGD("onAuthenticated(fid=%d, gid=%d)", msg->data.authenticated.finger.fid, - msg->data.authenticated.finger.gid); - const uint8_t* hat = reinterpret_cast(&msg->data.authenticated.hat); - const hidl_vec token( - std::vector(hat, hat + sizeof(msg->data.authenticated.hat))); - if (!thisPtr->mClientCallback - ->onAuthenticated(devId, msg->data.authenticated.finger.fid, - msg->data.authenticated.finger.gid, token) - .isOk()) { - ALOGE("failed to invoke fingerprint onAuthenticated callback"); - } - } else { - // Not a recognized fingerprint - if (!thisPtr->mClientCallback - ->onAuthenticated(devId, msg->data.authenticated.finger.fid, - msg->data.authenticated.finger.gid, - hidl_vec()) - .isOk()) { - ALOGE("failed to invoke fingerprint onAuthenticated callback"); - } - } - break; - case FINGERPRINT_TEMPLATE_ENUMERATING: - ALOGD("onEnumerate(fid=%d, gid=%d, rem=%d)", msg->data.enumerated.finger.fid, - msg->data.enumerated.finger.gid, 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()) { - ALOGE("failed to invoke fingerprint onEnumerate callback"); - } - break; - } -} - -/** - * Returns whether the fingerprint sensor is an under-display fingerprint - * sensor. - * @param sensorId the unique sensor ID for which the operation should be - * performed. - * @return isUdfps indicating whether the specified sensor is an - * under-display fingerprint sensor. - */ -Return BiometricsFingerprint::isUdfps(uint32_t /* sensorId */) { -#ifdef ENABLE_UDFPS - return true; -#else - return false; -#endif -} - -/** - * Notifies about a touch occurring within the under-display fingerprint - * sensor area. - * - * It it assumed that the device can only have one active under-display - * fingerprint sensor at a time. - * - * If multiple fingers are detected within the sensor area, only the - * chronologically first event will be reported. - * - * @param x The screen x-coordinate of the center of the touch contact area, in - * display pixels. - * @param y The screen y-coordinate of the center of the touch contact area, in - * display pixels. - * @param minor The length of the minor axis of an ellipse that describes the - * touch area, in display pixels. - * @param major The length of the major axis of an ellipse that describes the - * touch area, in display pixels. - */ -Return BiometricsFingerprint::onFingerDown(uint32_t /* x */, uint32_t /* y */, - float /* minor */, float /* major */) { -#ifdef ENABLE_UDFPS - int arg[2] = {Touch_Fod_Enable, FOD_STATUS_ON}; - ioctl(touch_fd_.get(), TOUCH_IOC_SETMODE, &arg); -#endif - - return Void(); -} -/** - * Notifies about a finger leaving the under-display fingerprint sensor area. - * - * It it assumed that the device can only have one active under-display - * fingerprint sensor at a time. - * - * If multiple fingers have left the sensor area, only the finger which - * previously caused a "finger down" event will be reported. - */ -Return BiometricsFingerprint::onFingerUp() { - - return Void(); -} - -} // namespace implementation -} // namespace V2_3 -} // namespace fingerprint -} // namespace biometrics -} // namespace hardware -} // namespace android diff --git a/fingerprint/BiometricsFingerprint.h b/fingerprint/BiometricsFingerprint.h deleted file mode 100644 index 203b4a2..0000000 --- a/fingerprint/BiometricsFingerprint.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * 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. - */ - -#ifndef ANDROID_HARDWARE_BIOMETRICS_FINGERPRINT_V2_3_BIOMETRICSFINGERPRINT_H -#define ANDROID_HARDWARE_BIOMETRICS_FINGERPRINT_V2_3_BIOMETRICSFINGERPRINT_H - - -#ifdef ENABLE_UDFPS -#include -#include "hardware/fingerprint.h" -#else -#include -#endif - -#include - -namespace android { -namespace hardware { -namespace biometrics { -namespace fingerprint { -namespace V2_3 { -namespace implementation { - -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_1::FingerprintAcquiredInfo; -using ::android::hardware::biometrics::fingerprint::V2_1::FingerprintError; -using ::android::hardware::biometrics::fingerprint::V2_1::IBiometricsFingerprintClientCallback; -using ::android::hardware::biometrics::fingerprint::V2_1::RequestStatus; -using ::android::hardware::biometrics::fingerprint::V2_3::IBiometricsFingerprint; - -struct BiometricsFingerprint : public IBiometricsFingerprint { - public: - BiometricsFingerprint(); - ~BiometricsFingerprint(); - - // Method to wrap legacy HAL with BiometricsFingerprint class - static IBiometricsFingerprint* getInstance(); - - // Methods from ::android::hardware::biometrics::fingerprint::V2_1::IBiometricsFingerprint - // follow. - Return setNotify( - const sp& clientCallback) override; - Return preEnroll() 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 authenticate(uint64_t operationId, uint32_t gid) override; - Return isUdfps(uint32_t sensorId) override; - Return onFingerDown(uint32_t x, uint32_t y, float minor, float major) override; - Return onFingerUp() override; - - private: - static fingerprint_device_t* openHal(); - static void notify( - const fingerprint_msg_t* msg); /* Static callback for legacy HAL implementation */ - static Return 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 mClientCallback; - fingerprint_device_t* mDevice; - -#ifdef ENABLE_UDFPS - android::base::unique_fd touch_fd_; -#endif -}; - -} // namespace implementation -} // namespace V2_3 -} // namespace fingerprint -} // namespace biometrics -} // namespace hardware -} // namespace android - -#endif // ANDROID_HARDWARE_BIOMETRICS_FINGERPRINT_V2_3_BIOMETRICSFINGERPRINT_H diff --git a/fingerprint/android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150-udfps.rc b/fingerprint/android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150-udfps.rc deleted file mode 100644 index 60bd225..0000000 --- a/fingerprint/android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150-udfps.rc +++ /dev/null @@ -1,18 +0,0 @@ -on init - # Goodix fingerprint - chown system system /dev/goodix_fp - -on boot - chown system system /sys/devices/platform/soc/soc:qcom,dsi-display/fod_ui - -on post-fs-data - mkdir /data/vendor/goodix 0770 system system - mkdir /mnt/vendor/persist/goodix 0770 system system - -service vendor.fps_hal /vendor/bin/hw/android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150-udfps - # "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 uhid diff --git a/fingerprint/android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150.rc b/fingerprint/android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150.rc deleted file mode 100644 index 5414c6c..0000000 --- a/fingerprint/android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150.rc +++ /dev/null @@ -1,18 +0,0 @@ -on init - chown system system /dev/goodix_fp - -on boot - chown system system /sys/bus/platform/devices/soc/soc:fpc1020/irq - chown system system /sys/bus/platform/devices/soc/soc:fpc1020/wakeup_enable - -on post-fs-data - mkdir /data/vendor/fpc 0770 system system - mkdir /data/vendor/goodix 0770 system system - -service vendor.fps_hal /vendor/bin/hw/android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150 - # "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 uhid diff --git a/fingerprint/android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150.xml b/fingerprint/android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150.xml deleted file mode 100644 index 4931b8a..0000000 --- a/fingerprint/android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - android.hardware.biometrics.fingerprint - hwbinder - 2.3 - - IBiometricsFingerprint - default - - - diff --git a/fingerprint/hardware/fingerprint.h b/fingerprint/hardware/fingerprint.h deleted file mode 100644 index b6e455d..0000000 --- a/fingerprint/hardware/fingerprint.h +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source 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. - */ - -#ifndef ANDROID_INCLUDE_HARDWARE_FINGERPRINT_H -#define ANDROID_INCLUDE_HARDWARE_FINGERPRINT_H - -#include -#include - -#define FINGERPRINT_MODULE_API_VERSION_1_0 HARDWARE_MODULE_API_VERSION(1, 0) -#define FINGERPRINT_MODULE_API_VERSION_2_0 HARDWARE_MODULE_API_VERSION(2, 0) -#define FINGERPRINT_MODULE_API_VERSION_2_1 HARDWARE_MODULE_API_VERSION(2, 1) -#define FINGERPRINT_MODULE_API_VERSION_3_0 HARDWARE_MODULE_API_VERSION(3, 0) -#define FINGERPRINT_HARDWARE_MODULE_ID "fingerprint" - -typedef enum fingerprint_msg_type { - FINGERPRINT_ERROR = -1, - FINGERPRINT_ACQUIRED = 1, - FINGERPRINT_TEMPLATE_ENROLLING = 3, - FINGERPRINT_TEMPLATE_REMOVED = 4, - FINGERPRINT_AUTHENTICATED = 5, - FINGERPRINT_TEMPLATE_ENUMERATING = 6, -} fingerprint_msg_type_t; - -/* - * Fingerprint errors are meant to tell the framework to terminate the current operation and ask - * for the user to correct the situation. These will almost always result in messaging and user - * interaction to correct the problem. - * - * For example, FINGERPRINT_ERROR_CANCELED should follow any acquisition message that results in - * a situation where the current operation can't continue without user interaction. For example, - * if the sensor is dirty during enrollment and no further enrollment progress can be made, - * send FINGERPRINT_ACQUIRED_IMAGER_DIRTY followed by FINGERPRINT_ERROR_CANCELED. - */ -typedef enum fingerprint_error { - FINGERPRINT_ERROR_HW_UNAVAILABLE = 1, /* The hardware has an error that can't be resolved. */ - FINGERPRINT_ERROR_UNABLE_TO_PROCESS = 2, /* Bad data; operation can't continue */ - FINGERPRINT_ERROR_TIMEOUT = 3, /* The operation has timed out waiting for user input. */ - FINGERPRINT_ERROR_NO_SPACE = 4, /* No space available to store a template */ - FINGERPRINT_ERROR_CANCELED = 5, /* The current operation can't proceed. See above. */ - FINGERPRINT_ERROR_UNABLE_TO_REMOVE = 6, /* fingerprint with given id can't be removed */ - FINGERPRINT_ERROR_LOCKOUT = - 7, /* the fingerprint hardware is in lockout due to too many attempts */ - FINGERPRINT_ERROR_VENDOR_BASE = 1000 /* vendor-specific error messages start here */ -} fingerprint_error_t; - -/* - * Fingerprint acquisition info is meant as feedback for the current operation. Anything but - * FINGERPRINT_ACQUIRED_GOOD will be shown to the user as feedback on how to take action on the - * current operation. For example, FINGERPRINT_ACQUIRED_IMAGER_DIRTY can be used to tell the user - * to clean the sensor. If this will cause the current operation to fail, an additional - * FINGERPRINT_ERROR_CANCELED can be sent to stop the operation in progress (e.g. enrollment). - * In general, these messages will result in a "Try again" message. - */ -typedef enum fingerprint_acquired_info { - FINGERPRINT_ACQUIRED_GOOD = 0, - FINGERPRINT_ACQUIRED_PARTIAL = 1, /* sensor needs more data, i.e. longer swipe. */ - FINGERPRINT_ACQUIRED_INSUFFICIENT = 2, /* image doesn't contain enough detail for recognition*/ - FINGERPRINT_ACQUIRED_IMAGER_DIRTY = 3, /* sensor needs to be cleaned */ - FINGERPRINT_ACQUIRED_TOO_SLOW = 4, /* mostly swipe-type sensors; not enough data collected */ - FINGERPRINT_ACQUIRED_TOO_FAST = 5, /* for swipe and area sensors; tell user to slow down*/ - FINGERPRINT_ACQUIRED_DETECTED = 6, /* when the finger is first detected. Used to optimize - wakeup. Should be followed by one of the above messages */ - FINGERPRINT_ACQUIRED_VENDOR_BASE = 1000 /* vendor-specific acquisition messages start here */ -} fingerprint_acquired_info_t; - -typedef struct fingerprint_finger_id { - uint32_t gid; - uint32_t fid; -} fingerprint_finger_id_t; - -typedef struct fingerprint_enroll { - fingerprint_finger_id_t finger; - /* samples_remaining goes from N (no data collected, but N scans needed) - * to 0 (no more data is needed to build a template). */ - uint32_t samples_remaining; - uint64_t msg; /* Vendor specific message. Used for user guidance */ -} fingerprint_enroll_t; - -typedef struct fingerprint_iterator { - fingerprint_finger_id_t finger; - uint32_t remaining_templates; -} fingerprint_iterator_t; - -typedef fingerprint_iterator_t fingerprint_enumerated_t; -typedef fingerprint_iterator_t fingerprint_removed_t; - -typedef struct fingerprint_acquired { - fingerprint_acquired_info_t acquired_info; /* information about the image */ -} fingerprint_acquired_t; - -typedef struct fingerprint_authenticated { - fingerprint_finger_id_t finger; - hw_auth_token_t hat; -} fingerprint_authenticated_t; - -typedef struct fingerprint_msg { - fingerprint_msg_type_t type; - union { - fingerprint_error_t error; - fingerprint_enroll_t enroll; - fingerprint_enumerated_t enumerated; - fingerprint_removed_t removed; - fingerprint_acquired_t acquired; - fingerprint_authenticated_t authenticated; - } data; -} fingerprint_msg_t; - -/* Callback function type */ -typedef void (*fingerprint_notify_t)(const fingerprint_msg_t* msg); - -/* Synchronous operation */ -typedef struct fingerprint_device { - /** - * Common methods of the fingerprint device. This *must* be the first member - * of fingerprint_device as users of this structure will cast a hw_device_t - * to fingerprint_device pointer in contexts where it's known - * the hw_device_t references a fingerprint_device. - */ - struct hw_device_t common; - - /* - * Client provided callback function to receive notifications. - * Do not set by hand, use the function above instead. - */ - fingerprint_notify_t notify; - - /* - * Set notification callback: - * Registers a user function that would receive notifications from the HAL - * The call will block if the HAL state machine is in busy state until HAL - * leaves the busy state. - * - * Function return: 0 if callback function is successfuly registered - * or a negative number in case of error, generally from the errno.h set. - */ - int (*set_notify)(struct fingerprint_device* dev, fingerprint_notify_t notify); - - /* - * Fingerprint pre-enroll enroll request: - * Generates a unique token to upper layers to indicate the start of an enrollment transaction. - * This token will be wrapped by security for verification and passed to enroll() for - * verification before enrollment will be allowed. This is to ensure adding a new fingerprint - * template was preceded by some kind of credential confirmation (e.g. device password). - * - * Function return: 0 if function failed - * otherwise, a uint64_t of token - */ - uint64_t (*pre_enroll)(struct fingerprint_device* dev); - - /* - * Fingerprint enroll request: - * Switches the HAL state machine to collect and store a new fingerprint - * template. Switches back as soon as enroll is complete - * (fingerprint_msg.type == FINGERPRINT_TEMPLATE_ENROLLING && - * fingerprint_msg.data.enroll.samples_remaining == 0) - * or after timeout_sec seconds. - * The fingerprint template will be assigned to the group gid. User has a choice - * to supply the gid or set it to 0 in which case a unique group id will be generated. - * - * Function return: 0 if enrollment process can be successfully started - * or a negative number in case of error, generally from the errno.h set. - * A notify() function may be called indicating the error condition. - */ - int (*enroll)(struct fingerprint_device* dev, const hw_auth_token_t* hat, uint32_t gid, - uint32_t timeout_sec); - - /* - * Finishes the enroll operation and invalidates the pre_enroll() generated challenge. - * This will be called at the end of a multi-finger enrollment session to indicate - * that no more fingers will be added. - * - * Function return: 0 if the request is accepted - * or a negative number in case of error, generally from the errno.h set. - */ - int (*post_enroll)(struct fingerprint_device* dev); - - /* - * get_authenticator_id: - * Returns a token associated with the current fingerprint set. This value will - * change whenever a new fingerprint is enrolled, thus creating a new fingerprint - * set. - * - * Function return: current authenticator id or 0 if function failed. - */ - uint64_t (*get_authenticator_id)(struct fingerprint_device* dev); - - /* - * Cancel pending enroll or authenticate, sending FINGERPRINT_ERROR_CANCELED - * to all running clients. Switches the HAL state machine back to the idle state. - * Unlike enroll_done() doesn't invalidate the pre_enroll() challenge. - * - * Function return: 0 if cancel request is accepted - * or a negative number in case of error, generally from the errno.h set. - */ - int (*cancel)(struct fingerprint_device* dev); - - /* - * Enumerate all the fingerprint templates found in the directory set by - * set_active_group() - * For each template found a notify() will be called with: - * fingerprint_msg.type == FINGERPRINT_TEMPLATE_ENUMERATED - * fingerprint_msg.data.enumerated.finger indicating a template id - * fingerprint_msg.data.enumerated.remaining_templates indicating how many more - * enumeration messages to expect. - * Note: If there are no fingerprints, then this should return 0 and the first fingerprint - * enumerated should have fingerid=0 and remaining=0 - * Function return: 0 if enumerate request is accepted - * or a negative number in case of error, generally from the errno.h set. - */ - int (*enumerate)(struct fingerprint_device* dev); - - /* - * Fingerprint remove request: - * Deletes a fingerprint template. - * Works only within the path set by set_active_group(). - * The fid parameter can be used as a widcard: - * * fid == 0 -- delete all the templates in the group. - * * fid != 0 -- delete this specific template from the group. - * For each template found a notify() will be called with: - * fingerprint_msg.type == FINGERPRINT_TEMPLATE_REMOVED - * fingerprint_msg.data.removed.finger indicating a template id deleted - * fingerprint_msg.data.removed.remaining_templates indicating how many more - * templates will be deleted by this operation. - * - * Function return: 0 if fingerprint template(s) can be successfully deleted - * or a negative number in case of error, generally from the errno.h set. - */ - int (*remove)(struct fingerprint_device* dev, uint32_t gid, uint32_t fid); - - /* - * Restricts the HAL operation to a set of fingerprints belonging to a - * group provided. - * The caller must provide a path to a storage location within the user's - * data directory. - * - * Function return: 0 on success - * or a negative number in case of error, generally from the errno.h set. - */ - int (*set_active_group)(struct fingerprint_device* dev, uint32_t gid, const char* store_path); - - /* - * Authenticates an operation identifed by operation_id - * - * Function return: 0 on success - * or a negative number in case of error, generally from the errno.h set. - */ - int (*authenticate)(struct fingerprint_device* dev, uint64_t operation_id, uint32_t gid); - - /** - * Call a Xiaomi fingerprint extension command. - */ - int (*extCmd)(struct fingerprint_device* dev, int32_t cmd, int32_t param); - - /* Reserved for backward binary compatibility */ - void* reserved[4]; -} fingerprint_device_t; - -typedef struct fingerprint_module { - /** - * Common methods of the fingerprint module. This *must* be the first member - * of fingerprint_module as users of this structure will cast a hw_module_t - * to fingerprint_module pointer in contexts where it's known - * the hw_module_t references a fingerprint_module. - */ - struct hw_module_t common; -} fingerprint_module_t; - -#endif /* ANDROID_INCLUDE_HARDWARE_FINGERPRINT_H */ diff --git a/fingerprint/service.cpp b/fingerprint/service.cpp deleted file mode 100644 index bff5028..0000000 --- a/fingerprint/service.cpp +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * 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. - */ - -#define LOG_TAG "android.hardware.biometrics.fingerprint@2.3-service.xiaomi_sm6150" - -#include - -#include "BiometricsFingerprint.h" - -using android::sp; -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; - -int main() { - android::sp bio = BiometricsFingerprint::getInstance(); - - configureRpcThreadpool(1, true /*callerWillJoin*/); - - if (bio != nullptr) { - if (::android::OK != bio->registerAsService()) { - return 1; - } - } else { - ALOGE("Can't create instance of BiometricsFingerprint, nullptr"); - } - - joinRpcThreadpool(); - - return 0; // should never get here -} diff --git a/rootdir/etc/init.target.rc b/rootdir/etc/init.target.rc index 8dc51a3..21f257d 100644 --- a/rootdir/etc/init.target.rc +++ b/rootdir/etc/init.target.rc @@ -77,6 +77,10 @@ on post-fs-data mkdir /data/vendor/thermal 0771 root system mkdir /data/vendor/thermal/config 0771 root system + # Create fingerprint related directory + mkdir /data/vendor/fpc 0770 system system + mkdir /data/vendor/goodix 0770 system system + on boot start rmt_storage start rfs_access @@ -95,6 +99,14 @@ on boot chown system system /dev/xiaomi-touch chmod 0660 /dev/xiaomi-touch + # Set fingerprint related permissions + chown system system /sys/bus/platform/devices/soc/soc:fpc1020/irq + chown system system /sys/bus/platform/devices/soc/soc:fpc1020/wakeup_enable + chown system system /sys/devices/platform/soc/soc:qcom,dsi-display/fod_ui + + # Create fingerprint related directory + mkdir /mnt/vendor/persist/goodix 0770 system system + on property:sys.boot_completed=1 # Set allocstall_threshold to 0 # Set swappiness to 100 diff --git a/rootdir/etc/ueventd.rc b/rootdir/etc/ueventd.rc index de600ca..e68cbc2 100644 --- a/rootdir/etc/ueventd.rc +++ b/rootdir/etc/ueventd.rc @@ -171,3 +171,6 @@ firmware_directories /vendor/firmware_mnt/image/ /dev/ir_spi 0660 system system /dev/spidev0.0 0660 system audio /dev/spidev0.1 0660 system system + +# Fingerprint +/dev/goodix_fp 0660 system system diff --git a/sepolicy/vendor/file_contexts b/sepolicy/vendor/file_contexts index a9ef2a7..4e147fd 100644 --- a/sepolicy/vendor/file_contexts +++ b/sepolicy/vendor/file_contexts @@ -23,8 +23,7 @@ /data/vendor/goodix(/.*)? u:object_r:fingerprint_data_file:s0 # HALs -/(vendor|system/vendor)/bin/hw/android\.hardware\.biometrics\.fingerprint@2\.3-service\.xiaomi_sm6150 u:object_r:hal_fingerprint_default_exec:s0 -/(vendor|system/vendor)/bin/hw/android\.hardware\.biometrics\.fingerprint@2\.3-service\.xiaomi_sm6150-udfps u:object_r:hal_fingerprint_default_exec:s0 +/(vendor|system/vendor)/bin/hw/android\.hardware\.biometrics\.fingerprint@2\.3-service\.xiaomi u:object_r:hal_fingerprint_default_exec:s0 /vendor/bin/hw/android\.hardware\.light@2\.0-service\.xiaomi_sm6150 u:object_r:hal_light_default_exec:s0 /vendor/bin/hw/android\.hardware\.power-service\.xiaomi-libperfmgr u:object_r:hal_power_default_exec:s0 /vendor/bin/hw/vendor\.lineage\.livedisplay@2\.1-service\.xiaomi_sm6150 u:object_r:hal_lineage_livedisplay_qti_exec:s0 diff --git a/sm6150.mk b/sm6150.mk index cbf306e..7816430 100644 --- a/sm6150.mk +++ b/sm6150.mk @@ -138,6 +138,9 @@ PRODUCT_PACKAGES += \ android.hardware.drm@1.4-service.clearkey # Fingerprint +PRODUCT_PACKAGES += \ + android.hardware.biometrics.fingerprint@2.3-service.xiaomi + PRODUCT_COPY_FILES += \ frameworks/native/data/etc/android.hardware.fingerprint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.fingerprint.xml