1d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/****************************************************************************** 2d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna * 3d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna * 4d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna * Copyright (C) 2015 NXP Semiconductors 5d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna * 6d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna * Licensed under the Apache License, Version 2.0 (the "License"); 7d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna * you may not use this file except in compliance with the License. 8d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna * You may obtain a copy of the License at 9d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna * 10d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna * http://www.apache.org/licenses/LICENSE-2.0 11d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna * 12d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna * Unless required by applicable law or agreed to in writing, software 13d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna * distributed under the License is distributed on an "AS IS" BASIS, 14d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna * See the License for the specific language governing permissions and 16d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna * limitations under the License. 17d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna * 18d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna ******************************************************************************/ 19d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#define LOG_TAG "EseAdaptation" 20d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#include <android/hardware/secure_element/1.0/ISecureElement.h> 21d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#include <android/hardware/secure_element/1.0/ISecureElementHalCallback.h> 22d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#include <android/hardware/secure_element/1.0/types.h> 23d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#include <hwbinder/ProcessState.h> 24d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#include <pthread.h> 25d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#include "EseAdaptation.h" 26d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#include <log/log.h> 27d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 28d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannausing android::hardware::Return; 29d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannausing android::hardware::Void; 30d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannausing android::hardware::secure_element::V1_0::ISecureElement; 31d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannausing android::hardware::secure_element::V1_0::ISecureElementHalCallback; 32d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannausing android::hardware::hidl_vec; 33d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannausing android::sp; 34d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 35d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannausing vendor::nxp::nxpese::V1_0::INxpEse; 36d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 37d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannaextern bool nfc_debug_enabled; 38d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 39d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannaextern "C" void GKI_shutdown(); 40d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannaextern void resetConfig(); 41d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannaextern "C" void verify_stack_non_volatile_store(); 42d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannaextern "C" void delete_stack_non_volatile_store(bool forceDelete); 43d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 44d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaEseAdaptation* EseAdaptation::mpInstance = NULL; 45d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaThreadMutex EseAdaptation::sLock; 46d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaThreadMutex EseAdaptation::sIoctlLock; 47d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannasp<INxpEse> EseAdaptation::mHalNxpEse; 48d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannasp<ISecureElement> EseAdaptation::mHal; 49d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannatHAL_ESE_CBACK* EseAdaptation::mHalCallback = NULL; 50d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannatHAL_ESE_DATA_CBACK* EseAdaptation::mHalDataCallback = NULL; 51d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaThreadCondVar EseAdaptation::mHalOpenCompletedEvent; 52d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaThreadCondVar EseAdaptation::mHalCloseCompletedEvent; 53d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 54d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#if (NXP_EXTNS == TRUE) 55d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaThreadCondVar EseAdaptation::mHalCoreResetCompletedEvent; 56d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaThreadCondVar EseAdaptation::mHalCoreInitCompletedEvent; 57d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaThreadCondVar EseAdaptation::mHalInitCompletedEvent; 58d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#define SIGNAL_NONE 0 59d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#define SIGNAL_SIGNALED 1 60d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannastatic uint8_t isSignaled = SIGNAL_NONE; 61d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannastatic uint8_t evt_status; 62d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#endif 63d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 64d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************* 65d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 66d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function: EseAdaptation::EseAdaptation() 67d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 68d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: class constructor 69d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 70d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns: none 71d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 72d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/ 73d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaEseAdaptation::EseAdaptation() { 74d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna memset(&mSpiHalEntryFuncs, 0, sizeof(mSpiHalEntryFuncs)); 75d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna} 76d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 77d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************* 78d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 79d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function: EseAdaptation::~EseAdaptation() 80d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 81d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: class destructor 82d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 83d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns: none 84d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 85d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/ 86d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaEseAdaptation::~EseAdaptation() { mpInstance = NULL; } 87d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 88d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************* 89d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 90d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function: EseAdaptation::GetInstance() 91d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 92d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: access class singleton 93d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 94d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns: pointer to the singleton object 95d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 96d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/ 97d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaEseAdaptation& EseAdaptation::GetInstance() { 98d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna AutoThreadMutex a(sLock); 99d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 100d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna if (!mpInstance) mpInstance = new EseAdaptation; 101d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna return *mpInstance; 102d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna} 103d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 104d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************* 105d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 106d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function: EseAdaptation::Initialize() 107d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 108d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: class initializer 109d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 110d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns: none 111d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 112d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/ 113d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannavoid EseAdaptation::Initialize() { 114d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna const char* func = "EseAdaptation::Initialize"; 115d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna uint8_t cmd_ese_nxp[] = {0x2F, 0x01, 0x01, 0x01}; 116d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna ALOGD_IF(nfc_debug_enabled, "%s: enter", func); 117d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 118d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna mHalCallback = NULL; 119d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna ese_nxp_IoctlInOutData_t* pInpOutData; 120d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna pInpOutData = 121d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna (ese_nxp_IoctlInOutData_t*)malloc(sizeof(ese_nxp_IoctlInOutData_t)); 122d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna memset(pInpOutData, 0x00, sizeof(ese_nxp_IoctlInOutData_t)); 123d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna pInpOutData->inp.data.nxpCmd.cmd_len = sizeof(cmd_ese_nxp); 124d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna memcpy(pInpOutData->inp.data.nxpCmd.p_cmd, cmd_ese_nxp, sizeof(cmd_ese_nxp)); 125d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna InitializeHalDeviceContext(); 126d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna if (pInpOutData != NULL) free(pInpOutData); 127d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna ALOGD_IF(nfc_debug_enabled, "%s: exit", func); 128d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna} 129d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 130d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************* 131d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 132d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function: EseAdaptation::signal() 133d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 134d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: signal the CondVar to release the thread that is waiting 135d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 136d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns: none 137d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 138d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/ 139d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannavoid EseAdaptation::signal() { mCondVar.signal(); } 140d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 141d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************* 142d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 143d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function: EseAdaptation::Thread() 144d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 145d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: Creates work threads 146d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 147d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns: none 148d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 149d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/ 150d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannauint32_t EseAdaptation::Thread(uint32_t arg) { 151d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna const char* func = "EseAdaptation::Thread"; 152d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna ALOGD_IF(nfc_debug_enabled, "%s: enter", func); 153d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna arg = 0; 154d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna { ThreadCondVar CondVar; } 155d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 156d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna EseAdaptation::GetInstance().signal(); 157d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 158d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna ALOGD_IF(nfc_debug_enabled, "%s: exit", func); 159d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna return 0; 160d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna} 161d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 162d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************* 163d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 164d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function: EseAdaptation::GetHalEntryFuncs() 165d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 166d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: Get the set of HAL entry points. 167d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 168d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns: Functions pointers for HAL entry points. 169d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 170d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/ 171d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannatHAL_ESE_ENTRY* EseAdaptation::GetHalEntryFuncs() { 172d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna ALOGD_IF(nfc_debug_enabled, "GetHalEntryFuncs: enter"); 173d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna return &mSpiHalEntryFuncs; 174d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna} 175d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 176d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************* 177d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 178d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function: EseAdaptation::InitializeHalDeviceContext 179d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 180d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: Ask the generic Android HAL to find the Broadcom-specific HAL. 181d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 182d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns: None. 183d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 184d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/ 185d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 186d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannavoid EseAdaptation::InitializeHalDeviceContext() { 187d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna const char* func = "EseAdaptation::InitializeHalDeviceContext"; 188d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna ALOGD_IF(nfc_debug_enabled, "%s: enter", func); 189d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna ALOGD_IF(nfc_debug_enabled, "%s: INxpEse::tryGetService()", func); 190d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna mHalNxpEse = INxpEse::tryGetService(); 191a392053f9ac85446ef04ba62fb46ec77833478b0Jizhou Liao ALOGD_IF(mHalNxpEse == nullptr, "%s: Failed to retrieve the NXP ESE HAL!", func); 192d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna if(mHalNxpEse != nullptr) { 193d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna ALOGD_IF(nfc_debug_enabled, "%s: INxpEse::getService() returned %p (%s)", 194d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna func, mHalNxpEse.get(), 195d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna (mHalNxpEse->isRemote() ? "remote" : "local")); 196d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna } 197d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna /*Transceive NCI_INIT_CMD*/ 198d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna ALOGD_IF(nfc_debug_enabled, "%s: exit", func); 199d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna} 200d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************* 201d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 202d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function: EseAdaptation::HalDeviceContextDataCallback 203d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 204d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: Translate generic Android HAL's callback into Broadcom-specific 205d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** callback function. 206d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 207d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns: None. 208d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 209d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/ 210d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannavoid EseAdaptation::HalDeviceContextDataCallback(uint16_t data_len, 211d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna uint8_t* p_data) { 212d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna const char* func = "EseAdaptation::HalDeviceContextDataCallback"; 213d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna ALOGD_IF(nfc_debug_enabled, "%s: len=%u", func, data_len); 214d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna if (mHalDataCallback) mHalDataCallback(data_len, p_data); 215d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna} 216d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 217d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************* 218d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 219d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function: IoctlCallback 220d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 221d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: Callback from HAL stub for IOCTL api invoked. 222d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Output data for IOCTL is sent as argument 223d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 224d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns: None. 225d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 226d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/ 227d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannavoid IoctlCallback(hidl_vec<uint8_t> outputData) { 228d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna const char* func = "IoctlCallback"; 229d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna ese_nxp_ExtnOutputData_t* pOutData = 230d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna (ese_nxp_ExtnOutputData_t*)&outputData[0]; 231d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna ALOGD_IF(nfc_debug_enabled, "%s Ioctl Type=%lu", func, 232d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna (unsigned long)pOutData->ioctlType); 233d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna EseAdaptation* pAdaptation = (EseAdaptation*)pOutData->context; 234d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna /*Output Data from stub->Proxy is copied back to output data 235d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna * This data will be sent back to libese*/ 236d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna memcpy(&pAdaptation->mCurrentIoctlData->out, &outputData[0], 237d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna sizeof(ese_nxp_ExtnOutputData_t)); 238d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna} 239d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************* 240d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 241d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function: EseAdaptation::HalIoctl 242d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 243d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: Calls ioctl to the Ese driver. 244d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** If called with a arg value of 0x01 than wired access requested, 245d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** status of the requst would be updated to p_data. 246d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** If called with a arg value of 0x00 than wired access will be 247d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** released, status of the requst would be updated to p_data. 248d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** If called with a arg value of 0x02 than current p61 state would 249d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*be 250d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** updated to p_data. 251d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 252d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns: -1 or 0. 253d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 254d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/ 255d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannaint EseAdaptation::HalIoctl(long arg, void* p_data) { 256d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna const char* func = "EseAdaptation::HalIoctl"; 257d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna hidl_vec<uint8_t> data; 258d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna AutoThreadMutex a(sIoctlLock); 259d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna ese_nxp_IoctlInOutData_t* pInpOutData = (ese_nxp_IoctlInOutData_t*)p_data; 260d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna ALOGD_IF(nfc_debug_enabled, "%s arg=%ld", func, arg); 261d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna pInpOutData->inp.context = &EseAdaptation::GetInstance(); 262d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna EseAdaptation::GetInstance().mCurrentIoctlData = pInpOutData; 263d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna data.setToExternal((uint8_t*)pInpOutData, sizeof(ese_nxp_IoctlInOutData_t)); 264d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna if (mHalNxpEse != nullptr) mHalNxpEse->ioctl(arg, data, IoctlCallback); 265d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna ALOGD_IF(nfc_debug_enabled, "%s Ioctl Completed for Type=%lu", func, 266d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna (unsigned long)pInpOutData->out.ioctlType); 267d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna return (pInpOutData->out.result); 268d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna} 269d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 270d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************* 271d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 272d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function: ThreadMutex::ThreadMutex() 273d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 274d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: class constructor 275d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 276d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns: none 277d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 278d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/ 279d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaThreadMutex::ThreadMutex() { 280d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna pthread_mutexattr_t mutexAttr; 281d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 282d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna pthread_mutexattr_init(&mutexAttr); 283d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna pthread_mutex_init(&mMutex, &mutexAttr); 284d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna pthread_mutexattr_destroy(&mutexAttr); 285d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna} 286d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 287d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************* 288d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 289d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function: ThreadMutex::~ThreadMutex() 290d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 291d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: class destructor 292d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 293d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns: none 294d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 295d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/ 296d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaThreadMutex::~ThreadMutex() { pthread_mutex_destroy(&mMutex); } 297d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 298d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************* 299d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 300d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function: ThreadMutex::lock() 301d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 302d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: lock kthe mutex 303d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 304d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns: none 305d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 306d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/ 307d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannavoid ThreadMutex::lock() { pthread_mutex_lock(&mMutex); } 308d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 309d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************* 310d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 311d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function: ThreadMutex::unblock() 312d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 313d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: unlock the mutex 314d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 315d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns: none 316d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 317d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/ 318d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannavoid ThreadMutex::unlock() { pthread_mutex_unlock(&mMutex); } 319d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 320d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************* 321d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 322d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function: ThreadCondVar::ThreadCondVar() 323d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 324d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: class constructor 325d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 326d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns: none 327d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 328d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/ 329d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaThreadCondVar::ThreadCondVar() { 330d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna pthread_condattr_t CondAttr; 331d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 332d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna pthread_condattr_init(&CondAttr); 333d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna pthread_cond_init(&mCondVar, &CondAttr); 334d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 335d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna pthread_condattr_destroy(&CondAttr); 336d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna} 337d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 338d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************* 339d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 340d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function: ThreadCondVar::~ThreadCondVar() 341d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 342d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: class destructor 343d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 344d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns: none 345d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 346d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/ 347d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaThreadCondVar::~ThreadCondVar() { pthread_cond_destroy(&mCondVar); } 348d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 349d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************* 350d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 351d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function: ThreadCondVar::wait() 352d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 353d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: wait on the mCondVar 354d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 355d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns: none 356d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 357d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/ 358d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannavoid ThreadCondVar::wait() { 359d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna pthread_cond_wait(&mCondVar, *this); 360d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna pthread_mutex_unlock(*this); 361d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna} 362d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 363d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************* 364d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 365d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function: ThreadCondVar::signal() 366d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 367d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: signal the mCondVar 368d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 369d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns: none 370d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 371d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/ 372d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannavoid ThreadCondVar::signal() { 373d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna AutoThreadMutex a(*this); 374d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna pthread_cond_signal(&mCondVar); 375d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna} 376d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 377d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************* 378d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 379d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function: AutoThreadMutex::AutoThreadMutex() 380d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 381d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: class constructor, automatically lock the mutex 382d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 383d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns: none 384d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 385d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/ 386d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaAutoThreadMutex::AutoThreadMutex(ThreadMutex& m) : mm(m) { mm.lock(); } 387d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna 388d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************* 389d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 390d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function: AutoThreadMutex::~AutoThreadMutex() 391d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 392d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: class destructor, automatically unlock the mutex 393d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 394d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns: none 395d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** 396d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/ 397d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaAutoThreadMutex::~AutoThreadMutex() { mm.unlock(); } 398