xref: /aosp_15_r20/external/libese/esed/esed.cpp (revision 5c4dab75aa57366379dce576b1a9e082a44e2b3a)
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 Worker int 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