1*5c4dab75SAndroid Build Coastguard Worker /* 2*5c4dab75SAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project 3*5c4dab75SAndroid Build Coastguard Worker * 4*5c4dab75SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*5c4dab75SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*5c4dab75SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*5c4dab75SAndroid Build Coastguard Worker * 8*5c4dab75SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*5c4dab75SAndroid Build Coastguard Worker * 10*5c4dab75SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*5c4dab75SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*5c4dab75SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*5c4dab75SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*5c4dab75SAndroid Build Coastguard Worker * limitations under the License. 15*5c4dab75SAndroid Build Coastguard Worker */ 16*5c4dab75SAndroid Build Coastguard Worker 17*5c4dab75SAndroid Build Coastguard Worker #include <chrono> 18*5c4dab75SAndroid Build Coastguard Worker #include <string> 19*5c4dab75SAndroid Build Coastguard Worker #include <thread> 20*5c4dab75SAndroid Build Coastguard Worker 21*5c4dab75SAndroid Build Coastguard Worker #include <android-base/logging.h> 22*5c4dab75SAndroid Build Coastguard Worker #include <android-base/properties.h> 23*5c4dab75SAndroid Build Coastguard Worker #include <hidl/HidlTransportSupport.h> 24*5c4dab75SAndroid Build Coastguard Worker #include <utils/StrongPointer.h> 25*5c4dab75SAndroid Build Coastguard Worker 26*5c4dab75SAndroid Build Coastguard Worker // Select the implementation 27*5c4dab75SAndroid Build Coastguard Worker #include <esecpp/NxpPn80tNqNci.h> 28*5c4dab75SAndroid Build Coastguard Worker using EseInterfaceImpl = android::NxpPn80tNqNci; 29*5c4dab75SAndroid Build Coastguard Worker 30*5c4dab75SAndroid Build Coastguard Worker #include "Weaver.h" 31*5c4dab75SAndroid Build Coastguard Worker 32*5c4dab75SAndroid Build Coastguard Worker using android::OK; 33*5c4dab75SAndroid Build Coastguard Worker using android::sp; 34*5c4dab75SAndroid Build Coastguard Worker using android::status_t; 35*5c4dab75SAndroid Build Coastguard Worker using android::hardware::configureRpcThreadpool; 36*5c4dab75SAndroid Build Coastguard Worker using android::hardware::joinRpcThreadpool; 37*5c4dab75SAndroid Build Coastguard Worker 38*5c4dab75SAndroid Build Coastguard Worker using namespace std::chrono_literals; 39*5c4dab75SAndroid Build Coastguard Worker 40*5c4dab75SAndroid Build Coastguard Worker // HALs 41*5c4dab75SAndroid Build Coastguard Worker using android::esed::Weaver; 42*5c4dab75SAndroid Build Coastguard Worker main(int,char **)43*5c4dab75SAndroid Build Coastguard Workerint main(int /* argc */, char** /* argv */) { 44*5c4dab75SAndroid Build Coastguard Worker LOG(INFO) << "Waiting for property..."; 45*5c4dab75SAndroid Build Coastguard Worker android::base::WaitForProperty("init.svc.vendor.ese_load", "stopped"); 46*5c4dab75SAndroid Build Coastguard Worker LOG(INFO) << "Starting esed..."; 47*5c4dab75SAndroid Build Coastguard Worker 48*5c4dab75SAndroid Build Coastguard Worker // Open connection to the eSE 49*5c4dab75SAndroid Build Coastguard Worker EseInterfaceImpl ese; 50*5c4dab75SAndroid Build Coastguard Worker uint32_t failCount = 0; 51*5c4dab75SAndroid Build Coastguard Worker while (true) { 52*5c4dab75SAndroid Build Coastguard Worker ese.init(); 53*5c4dab75SAndroid Build Coastguard Worker if (ese.open() < 0) { 54*5c4dab75SAndroid Build Coastguard Worker std::string errMsg = "Failed to open connection to eSE"; 55*5c4dab75SAndroid Build Coastguard Worker if (ese.error()) { 56*5c4dab75SAndroid Build Coastguard Worker errMsg += " (" + std::to_string(ese.error_code()) + "): " + ese.error_message(); 57*5c4dab75SAndroid Build Coastguard Worker } else { 58*5c4dab75SAndroid Build Coastguard Worker errMsg += ": reason unknown"; 59*5c4dab75SAndroid Build Coastguard Worker } 60*5c4dab75SAndroid Build Coastguard Worker LOG(ERROR) << errMsg; 61*5c4dab75SAndroid Build Coastguard Worker 62*5c4dab75SAndroid Build Coastguard Worker // FIXME: this loop with sleep is a hack to avoid the process repeatedly crashing 63*5c4dab75SAndroid Build Coastguard Worker ++failCount; 64*5c4dab75SAndroid Build Coastguard Worker std::this_thread::sleep_for(failCount * 5s); 65*5c4dab75SAndroid Build Coastguard Worker continue; 66*5c4dab75SAndroid Build Coastguard Worker } 67*5c4dab75SAndroid Build Coastguard Worker LOG(INFO) << "Opened connection to the eSE"; 68*5c4dab75SAndroid Build Coastguard Worker break; 69*5c4dab75SAndroid Build Coastguard Worker } 70*5c4dab75SAndroid Build Coastguard Worker // Close it until use. 71*5c4dab75SAndroid Build Coastguard Worker ese.close(); 72*5c4dab75SAndroid Build Coastguard Worker 73*5c4dab75SAndroid Build Coastguard Worker 74*5c4dab75SAndroid Build Coastguard Worker // This will be a single threaded daemon. This is important as libese is not 75*5c4dab75SAndroid Build Coastguard Worker // thread safe so we use binder to synchronize requests for us. 76*5c4dab75SAndroid Build Coastguard Worker constexpr bool thisThreadWillJoinPool = true; 77*5c4dab75SAndroid Build Coastguard Worker configureRpcThreadpool(1, thisThreadWillJoinPool); 78*5c4dab75SAndroid Build Coastguard Worker 79*5c4dab75SAndroid Build Coastguard Worker // Create Weaver HAL instance 80*5c4dab75SAndroid Build Coastguard Worker sp<Weaver> weaver = new Weaver{ese}; 81*5c4dab75SAndroid Build Coastguard Worker const status_t status = weaver->registerAsService(); 82*5c4dab75SAndroid Build Coastguard Worker if (status != OK) { 83*5c4dab75SAndroid Build Coastguard Worker LOG(ERROR) << "Failed to register Weaver as a service (status: " << status << ")"; 84*5c4dab75SAndroid Build Coastguard Worker } 85*5c4dab75SAndroid Build Coastguard Worker 86*5c4dab75SAndroid Build Coastguard Worker 87*5c4dab75SAndroid Build Coastguard Worker joinRpcThreadpool(); 88*5c4dab75SAndroid Build Coastguard Worker return -1; // Should never reach here 89*5c4dab75SAndroid Build Coastguard Worker } 90