From 39bd52cad5a83bd23f5207633b6f4bb7ed352277 Mon Sep 17 00:00:00 2001 From: Sebastiano Barezzi Date: Sun, 1 May 2022 00:06:27 +0200 Subject: [PATCH] hidl: biometrics: fingerprint: Add multiple HAL loading support * Support for sm8450, sm8350, sm6375, sm7325, sm7350, sm8250, sm7250, sm8150, sm6250, sm6150, sdm845, sdm710, msm8998, sdm660 Change-Id: I114640c8520c73213390ad35fa29d218e1852757 --- .../fingerprint/BiometricsFingerprint.cpp | 34 ++++++++++++++++--- .../fingerprint/BiometricsFingerprint.h | 3 +- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/hidl/biometrics/fingerprint/BiometricsFingerprint.cpp b/hidl/biometrics/fingerprint/BiometricsFingerprint.cpp index ae41a61..f009a9e 100644 --- a/hidl/biometrics/fingerprint/BiometricsFingerprint.cpp +++ b/hidl/biometrics/fingerprint/BiometricsFingerprint.cpp @@ -15,6 +15,20 @@ #include #include +namespace { + +typedef struct fingerprint_hal { + const char* class_name; + const bool is_udfps; +} fingerprint_hal_t; + +static const fingerprint_hal_t kModules[] = { + {"fpc", false}, {"fpc_fod", true}, {"goodix", false}, {"goodix_fod", true}, + {"goodix_fod6", true}, {"silead", false}, {"syna", true}, +}; + +} // anonymous namespace + namespace android { namespace hardware { namespace biometrics { @@ -31,9 +45,19 @@ BiometricsFingerprint* BiometricsFingerprint::sInstance = nullptr; BiometricsFingerprint::BiometricsFingerprint() : mClientCallback(nullptr), mDevice(nullptr) { sInstance = this; // keep track of the most recent instance - mDevice = openHal(); + for (auto& [class_name, is_udfps] : kModules) { + mDevice = openHal(class_name); + if (!mDevice) { + ALOGE("Can't open HAL module, class %s", class_name); + continue; + } + + ALOGI("Opened fingerprint HAL, class %s", class_name); + mIsUdfps = is_udfps; + break; + } if (!mDevice) { - ALOGE("Can't open HAL module"); + ALOGE("Can't open any HAL module"); } } @@ -201,7 +225,7 @@ Return BiometricsFingerprint::authenticate(uint64_t operationId, } Return BiometricsFingerprint::isUdfps(uint32_t /*sensorId*/) { - return false; + return mIsUdfps; } Return BiometricsFingerprint::onFingerDown(uint32_t /*x*/, uint32_t /*y*/, float /*minor*/, @@ -220,11 +244,11 @@ IBiometricsFingerprint* BiometricsFingerprint::getInstance() { return sInstance; } -fingerprint_device_t* BiometricsFingerprint::openHal() { +fingerprint_device_t* BiometricsFingerprint::openHal(const char* class_name) { int err; const hw_module_t* hw_mdl = nullptr; ALOGD("Opening fingerprint hal library..."); - if (0 != (err = hw_get_module(FINGERPRINT_HARDWARE_MODULE_ID, &hw_mdl))) { + if (0 != (err = hw_get_module_by_class(FINGERPRINT_HARDWARE_MODULE_ID, class_name, &hw_mdl))) { ALOGE("Can't open fingerprint HW Module, error: %d", err); return nullptr; } diff --git a/hidl/biometrics/fingerprint/BiometricsFingerprint.h b/hidl/biometrics/fingerprint/BiometricsFingerprint.h index 05e0a43..b48aeaa 100644 --- a/hidl/biometrics/fingerprint/BiometricsFingerprint.h +++ b/hidl/biometrics/fingerprint/BiometricsFingerprint.h @@ -63,7 +63,7 @@ struct BiometricsFingerprint : public IBiometricsFingerprint { Return onFingerUp() override; private: - static fingerprint_device_t* openHal(); + static fingerprint_device_t* openHal(const char* class_name); static void notify( const fingerprint_msg_t* msg); /* Static callback for legacy HAL implementation */ static Return ErrorFilter(int32_t error); @@ -74,6 +74,7 @@ struct BiometricsFingerprint : public IBiometricsFingerprint { std::mutex mClientCallbackMutex; sp mClientCallback; fingerprint_device_t* mDevice; + bool mIsUdfps; }; } // namespace implementation