/* * Copyright (C) 2017 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. */ #define LOG_TAG "fingerprint@2.3-service.bangkk" #include "BiometricsFingerprint.h" #include #include #include #include #include #include #include #include #include #include #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 { namespace biometrics { namespace fingerprint { namespace V2_3 { namespace implementation { BiometricsFingerprint::BiometricsFingerprint() { biometrics_2_1_service = IBiometricsFingerprint_2_1::getService(); rbs_4_0_service = IBiometricsFingerprintRbs::getService(); } Return BiometricsFingerprint::setNotify( const sp &clientCallback) { return biometrics_2_1_service->setNotify(clientCallback); } Return BiometricsFingerprint::preEnroll() { return biometrics_2_1_service->preEnroll(); } Return BiometricsFingerprint::enroll(const hidl_array &hat, uint32_t gid, uint32_t timeoutSec) { return biometrics_2_1_service->enroll(hat, gid, timeoutSec); } Return BiometricsFingerprint::postEnroll() { return biometrics_2_1_service->postEnroll(); } Return BiometricsFingerprint::getAuthenticatorId() { return biometrics_2_1_service->getAuthenticatorId(); } Return BiometricsFingerprint::cancel() { setHbmState(OFF); return biometrics_2_1_service->cancel(); } Return BiometricsFingerprint::enumerate() { return biometrics_2_1_service->enumerate(); } 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 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); } Return BiometricsFingerprint::isUdfps(uint32_t) { return true; } 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(); } } // namespace implementation } // namespace V2_3 } // namespace fingerprint } // namespace biometrics } // namespace hardware } // namespace android