xref: /aosp_15_r20/system/nfc/src/include/NfcAdaptation.h (revision 7eba2f3b06c51ae21384f6a4f14577b668a869b3)
1*7eba2f3bSAndroid Build Coastguard Worker /******************************************************************************
2*7eba2f3bSAndroid Build Coastguard Worker  *
3*7eba2f3bSAndroid Build Coastguard Worker  *  Copyright (C) 2011-2012 Broadcom Corporation
4*7eba2f3bSAndroid Build Coastguard Worker  *
5*7eba2f3bSAndroid Build Coastguard Worker  *  Licensed under the Apache License, Version 2.0 (the "License");
6*7eba2f3bSAndroid Build Coastguard Worker  *  you may not use this file except in compliance with the License.
7*7eba2f3bSAndroid Build Coastguard Worker  *  You may obtain a copy of the License at:
8*7eba2f3bSAndroid Build Coastguard Worker  *
9*7eba2f3bSAndroid Build Coastguard Worker  *  http://www.apache.org/licenses/LICENSE-2.0
10*7eba2f3bSAndroid Build Coastguard Worker  *
11*7eba2f3bSAndroid Build Coastguard Worker  *  Unless required by applicable law or agreed to in writing, software
12*7eba2f3bSAndroid Build Coastguard Worker  *  distributed under the License is distributed on an "AS IS" BASIS,
13*7eba2f3bSAndroid Build Coastguard Worker  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*7eba2f3bSAndroid Build Coastguard Worker  *  See the License for the specific language governing permissions and
15*7eba2f3bSAndroid Build Coastguard Worker  *  limitations under the License.
16*7eba2f3bSAndroid Build Coastguard Worker  *
17*7eba2f3bSAndroid Build Coastguard Worker  ******************************************************************************/
18*7eba2f3bSAndroid Build Coastguard Worker #pragma once
19*7eba2f3bSAndroid Build Coastguard Worker 
20*7eba2f3bSAndroid Build Coastguard Worker #include <pthread.h>
21*7eba2f3bSAndroid Build Coastguard Worker #include <utils/RefBase.h>
22*7eba2f3bSAndroid Build Coastguard Worker 
23*7eba2f3bSAndroid Build Coastguard Worker #include "config.h"
24*7eba2f3bSAndroid Build Coastguard Worker #include "nfc_hal_api.h"
25*7eba2f3bSAndroid Build Coastguard Worker #include "nfc_target.h"
26*7eba2f3bSAndroid Build Coastguard Worker 
27*7eba2f3bSAndroid Build Coastguard Worker using ::android::sp;
28*7eba2f3bSAndroid Build Coastguard Worker 
29*7eba2f3bSAndroid Build Coastguard Worker namespace android {
30*7eba2f3bSAndroid Build Coastguard Worker namespace hardware {
31*7eba2f3bSAndroid Build Coastguard Worker namespace nfc {
32*7eba2f3bSAndroid Build Coastguard Worker namespace V1_0 {
33*7eba2f3bSAndroid Build Coastguard Worker struct INfc;
34*7eba2f3bSAndroid Build Coastguard Worker struct INfcClientCallback;
35*7eba2f3bSAndroid Build Coastguard Worker }  // namespace V1_0
36*7eba2f3bSAndroid Build Coastguard Worker namespace V1_1 {
37*7eba2f3bSAndroid Build Coastguard Worker struct INfc;
38*7eba2f3bSAndroid Build Coastguard Worker struct INfcClientCallback;
39*7eba2f3bSAndroid Build Coastguard Worker }  // namespace V1_1
40*7eba2f3bSAndroid Build Coastguard Worker namespace V1_2 {
41*7eba2f3bSAndroid Build Coastguard Worker struct INfc;
42*7eba2f3bSAndroid Build Coastguard Worker }
43*7eba2f3bSAndroid Build Coastguard Worker }  // namespace nfc
44*7eba2f3bSAndroid Build Coastguard Worker }  // namespace hardware
45*7eba2f3bSAndroid Build Coastguard Worker }  // namespace android
46*7eba2f3bSAndroid Build Coastguard Worker 
47*7eba2f3bSAndroid Build Coastguard Worker class ThreadMutex {
48*7eba2f3bSAndroid Build Coastguard Worker  public:
49*7eba2f3bSAndroid Build Coastguard Worker   ThreadMutex();
50*7eba2f3bSAndroid Build Coastguard Worker   virtual ~ThreadMutex();
51*7eba2f3bSAndroid Build Coastguard Worker   void lock();
52*7eba2f3bSAndroid Build Coastguard Worker   void unlock();
53*7eba2f3bSAndroid Build Coastguard Worker   explicit operator pthread_mutex_t*() { return &mMutex; }
54*7eba2f3bSAndroid Build Coastguard Worker 
55*7eba2f3bSAndroid Build Coastguard Worker  private:
56*7eba2f3bSAndroid Build Coastguard Worker   pthread_mutex_t mMutex;
57*7eba2f3bSAndroid Build Coastguard Worker };
58*7eba2f3bSAndroid Build Coastguard Worker 
59*7eba2f3bSAndroid Build Coastguard Worker class ThreadCondVar : public ThreadMutex {
60*7eba2f3bSAndroid Build Coastguard Worker  public:
61*7eba2f3bSAndroid Build Coastguard Worker   ThreadCondVar();
62*7eba2f3bSAndroid Build Coastguard Worker   virtual ~ThreadCondVar();
63*7eba2f3bSAndroid Build Coastguard Worker   void signal();
64*7eba2f3bSAndroid Build Coastguard Worker   void wait();
65*7eba2f3bSAndroid Build Coastguard Worker   explicit operator pthread_cond_t*() { return &mCondVar; }
66*7eba2f3bSAndroid Build Coastguard Worker   // NOLINTNEXTLINE(google-explicit-constructor)
67*7eba2f3bSAndroid Build Coastguard Worker   operator pthread_mutex_t*() {
68*7eba2f3bSAndroid Build Coastguard Worker     return ThreadMutex::operator pthread_mutex_t*();
69*7eba2f3bSAndroid Build Coastguard Worker   }
70*7eba2f3bSAndroid Build Coastguard Worker 
71*7eba2f3bSAndroid Build Coastguard Worker  private:
72*7eba2f3bSAndroid Build Coastguard Worker   pthread_cond_t mCondVar;
73*7eba2f3bSAndroid Build Coastguard Worker };
74*7eba2f3bSAndroid Build Coastguard Worker 
75*7eba2f3bSAndroid Build Coastguard Worker class AutoThreadMutex {
76*7eba2f3bSAndroid Build Coastguard Worker  public:
77*7eba2f3bSAndroid Build Coastguard Worker   explicit AutoThreadMutex(ThreadMutex& m);
78*7eba2f3bSAndroid Build Coastguard Worker   virtual ~AutoThreadMutex();
79*7eba2f3bSAndroid Build Coastguard Worker   explicit operator ThreadMutex&() { return mm; }
80*7eba2f3bSAndroid Build Coastguard Worker   explicit operator pthread_mutex_t*() { return (pthread_mutex_t*)mm; }
81*7eba2f3bSAndroid Build Coastguard Worker 
82*7eba2f3bSAndroid Build Coastguard Worker  private:
83*7eba2f3bSAndroid Build Coastguard Worker   ThreadMutex& mm;
84*7eba2f3bSAndroid Build Coastguard Worker };
85*7eba2f3bSAndroid Build Coastguard Worker 
86*7eba2f3bSAndroid Build Coastguard Worker class NfcHalDeathRecipient;
87*7eba2f3bSAndroid Build Coastguard Worker 
88*7eba2f3bSAndroid Build Coastguard Worker class NfcAdaptation {
89*7eba2f3bSAndroid Build Coastguard Worker  public:
90*7eba2f3bSAndroid Build Coastguard Worker   virtual ~NfcAdaptation();
91*7eba2f3bSAndroid Build Coastguard Worker   void Initialize();
92*7eba2f3bSAndroid Build Coastguard Worker   void Finalize();
93*7eba2f3bSAndroid Build Coastguard Worker   void FactoryReset();
94*7eba2f3bSAndroid Build Coastguard Worker   void DeviceShutdown();
95*7eba2f3bSAndroid Build Coastguard Worker   static NfcAdaptation& GetInstance();
96*7eba2f3bSAndroid Build Coastguard Worker   tHAL_NFC_ENTRY* GetHalEntryFuncs();
97*7eba2f3bSAndroid Build Coastguard Worker   bool DownloadFirmware();
98*7eba2f3bSAndroid Build Coastguard Worker   void GetVendorConfigs(std::map<std::string, ConfigValue>& configMap);
99*7eba2f3bSAndroid Build Coastguard Worker   void Dump(int fd);
100*7eba2f3bSAndroid Build Coastguard Worker 
101*7eba2f3bSAndroid Build Coastguard Worker  private:
102*7eba2f3bSAndroid Build Coastguard Worker   NfcAdaptation();
103*7eba2f3bSAndroid Build Coastguard Worker   void signal();
104*7eba2f3bSAndroid Build Coastguard Worker   static NfcAdaptation* mpInstance;
105*7eba2f3bSAndroid Build Coastguard Worker   static ThreadMutex sLock;
106*7eba2f3bSAndroid Build Coastguard Worker   ThreadCondVar mCondVar;
107*7eba2f3bSAndroid Build Coastguard Worker   tHAL_NFC_ENTRY mHalEntryFuncs;  // function pointers for HAL entry points
108*7eba2f3bSAndroid Build Coastguard Worker   static android::sp<android::hardware::nfc::V1_0::INfc> mHal;
109*7eba2f3bSAndroid Build Coastguard Worker   static android::sp<android::hardware::nfc::V1_1::INfc> mHal_1_1;
110*7eba2f3bSAndroid Build Coastguard Worker   static android::sp<android::hardware::nfc::V1_2::INfc> mHal_1_2;
111*7eba2f3bSAndroid Build Coastguard Worker   static android::hardware::nfc::V1_1::INfcClientCallback* mCallback;
112*7eba2f3bSAndroid Build Coastguard Worker   sp<NfcHalDeathRecipient> mNfcHalDeathRecipient;
113*7eba2f3bSAndroid Build Coastguard Worker   static tHAL_NFC_CBACK* mHalCallback;
114*7eba2f3bSAndroid Build Coastguard Worker   static tHAL_NFC_DATA_CBACK* mHalDataCallback;
115*7eba2f3bSAndroid Build Coastguard Worker   static ThreadCondVar mHalOpenCompletedEvent;
116*7eba2f3bSAndroid Build Coastguard Worker   static ThreadCondVar mHalCloseCompletedEvent;
117*7eba2f3bSAndroid Build Coastguard Worker 
118*7eba2f3bSAndroid Build Coastguard Worker   static uint32_t NFCA_TASK(uint32_t arg);
119*7eba2f3bSAndroid Build Coastguard Worker   static uint32_t Thread(uint32_t arg);
120*7eba2f3bSAndroid Build Coastguard Worker   void InitializeHalDeviceContext();
121*7eba2f3bSAndroid Build Coastguard Worker   static void HalDeviceContextCallback(nfc_event_t event,
122*7eba2f3bSAndroid Build Coastguard Worker                                        nfc_status_t event_status);
123*7eba2f3bSAndroid Build Coastguard Worker   static void HalDeviceContextDataCallback(uint16_t data_len, uint8_t* p_data);
124*7eba2f3bSAndroid Build Coastguard Worker 
125*7eba2f3bSAndroid Build Coastguard Worker   static void HalInitialize();
126*7eba2f3bSAndroid Build Coastguard Worker   static void HalTerminate();
127*7eba2f3bSAndroid Build Coastguard Worker   static void HalOpen(tHAL_NFC_CBACK* p_hal_cback,
128*7eba2f3bSAndroid Build Coastguard Worker                       tHAL_NFC_DATA_CBACK* p_data_cback);
129*7eba2f3bSAndroid Build Coastguard Worker   static void HalClose();
130*7eba2f3bSAndroid Build Coastguard Worker   static void HalCoreInitialized(uint16_t data_len,
131*7eba2f3bSAndroid Build Coastguard Worker                                  uint8_t* p_core_init_rsp_params);
132*7eba2f3bSAndroid Build Coastguard Worker   static void HalWrite(uint16_t data_len, uint8_t* p_data);
133*7eba2f3bSAndroid Build Coastguard Worker   static bool HalPrediscover();
134*7eba2f3bSAndroid Build Coastguard Worker   static void HalControlGranted();
135*7eba2f3bSAndroid Build Coastguard Worker   static void HalPowerCycle();
136*7eba2f3bSAndroid Build Coastguard Worker   static uint8_t HalGetMaxNfcee();
137*7eba2f3bSAndroid Build Coastguard Worker   static void HalDownloadFirmwareCallback(nfc_event_t event,
138*7eba2f3bSAndroid Build Coastguard Worker                                           nfc_status_t event_status);
139*7eba2f3bSAndroid Build Coastguard Worker   static void HalDownloadFirmwareDataCallback(uint16_t data_len,
140*7eba2f3bSAndroid Build Coastguard Worker                                               uint8_t* p_data);
141*7eba2f3bSAndroid Build Coastguard Worker };
142