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
This commit is contained in:
Sebastiano Barezzi 2022-05-01 00:06:27 +02:00
parent c3f110d5f8
commit 39bd52cad5
No known key found for this signature in database
GPG Key ID: 47760583F393BC44
2 changed files with 31 additions and 6 deletions

View File

@ -15,6 +15,20 @@
#include <inttypes.h>
#include <unistd.h>
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<RequestStatus> BiometricsFingerprint::authenticate(uint64_t operationId,
}
Return<bool> BiometricsFingerprint::isUdfps(uint32_t /*sensorId*/) {
return false;
return mIsUdfps;
}
Return<void> 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;
}

View File

@ -63,7 +63,7 @@ struct BiometricsFingerprint : public IBiometricsFingerprint {
Return<void> 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<RequestStatus> ErrorFilter(int32_t error);
@ -74,6 +74,7 @@ struct BiometricsFingerprint : public IBiometricsFingerprint {
std::mutex mClientCallbackMutex;
sp<IBiometricsFingerprintClientCallback> mClientCallback;
fingerprint_device_t* mDevice;
bool mIsUdfps;
};
} // namespace implementation