NfcAdaptation.cpp revision 0976d37081fae8bcd4fc4dcf7996e1ce194fb4b1
144d362409d5469aed47d19e7908d19bd194493aThomas Graf/****************************************************************************** 244d362409d5469aed47d19e7908d19bd194493aThomas Graf * 344d362409d5469aed47d19e7908d19bd194493aThomas Graf * Copyright (C) 1999-2012 Broadcom Corporation 444d362409d5469aed47d19e7908d19bd194493aThomas Graf * 544d362409d5469aed47d19e7908d19bd194493aThomas Graf * Licensed under the Apache License, Version 2.0 (the "License"); 644d362409d5469aed47d19e7908d19bd194493aThomas Graf * you may not use this file except in compliance with the License. 744d362409d5469aed47d19e7908d19bd194493aThomas Graf * You may obtain a copy of the License at: 844d362409d5469aed47d19e7908d19bd194493aThomas Graf * 944d362409d5469aed47d19e7908d19bd194493aThomas Graf * http://www.apache.org/licenses/LICENSE-2.0 1044d362409d5469aed47d19e7908d19bd194493aThomas Graf * 1144d362409d5469aed47d19e7908d19bd194493aThomas Graf * Unless required by applicable law or agreed to in writing, software 1244d362409d5469aed47d19e7908d19bd194493aThomas Graf * distributed under the License is distributed on an "AS IS" BASIS, 1344d362409d5469aed47d19e7908d19bd194493aThomas Graf * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1444d362409d5469aed47d19e7908d19bd194493aThomas Graf * See the License for the specific language governing permissions and 1544d362409d5469aed47d19e7908d19bd194493aThomas Graf * limitations under the License. 1644d362409d5469aed47d19e7908d19bd194493aThomas Graf * 1744d362409d5469aed47d19e7908d19bd194493aThomas Graf ******************************************************************************/ 1844d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "OverrideLog.h" 1944d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "NfcAdaptation.h" 2044d362409d5469aed47d19e7908d19bd194493aThomas Grafextern "C" 2144d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 2244d362409d5469aed47d19e7908d19bd194493aThomas Graf #include "gki.h" 2344d362409d5469aed47d19e7908d19bd194493aThomas Graf #include "nfa_api.h" 2444d362409d5469aed47d19e7908d19bd194493aThomas Graf #include "nfc_int.h" 2544d362409d5469aed47d19e7908d19bd194493aThomas Graf} 2644d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "config.h" 2744d362409d5469aed47d19e7908d19bd194493aThomas Graf 2844d362409d5469aed47d19e7908d19bd194493aThomas Graf#define LOG_TAG "NfcAdaptation" 2944d362409d5469aed47d19e7908d19bd194493aThomas Graf 3044d362409d5469aed47d19e7908d19bd194493aThomas Grafextern "C" void GKI_shutdown(); 3144d362409d5469aed47d19e7908d19bd194493aThomas Grafextern void resetConfig(); 3244d362409d5469aed47d19e7908d19bd194493aThomas Grafextern "C" void verify_stack_non_volatile_store (); 3344d362409d5469aed47d19e7908d19bd194493aThomas Grafextern "C" void delete_stack_non_volatile_store (BOOLEAN forceDelete); 3444d362409d5469aed47d19e7908d19bd194493aThomas Graf 3544d362409d5469aed47d19e7908d19bd194493aThomas GrafNfcAdaptation* NfcAdaptation::mpInstance = NULL; 3644d362409d5469aed47d19e7908d19bd194493aThomas GrafThreadMutex NfcAdaptation::sLock; 3744d362409d5469aed47d19e7908d19bd194493aThomas Grafnfc_nci_device_t* NfcAdaptation::mHalDeviceContext = NULL; 3844d362409d5469aed47d19e7908d19bd194493aThomas GraftHAL_NFC_CBACK* NfcAdaptation::mHalCallback = NULL; 3944d362409d5469aed47d19e7908d19bd194493aThomas GraftHAL_NFC_DATA_CBACK* NfcAdaptation::mHalDataCallback = NULL; 4044d362409d5469aed47d19e7908d19bd194493aThomas GrafThreadCondVar NfcAdaptation::mHalOpenCompletedEvent; 4144d362409d5469aed47d19e7908d19bd194493aThomas GrafThreadCondVar NfcAdaptation::mHalCloseCompletedEvent; 4244d362409d5469aed47d19e7908d19bd194493aThomas Graf 4344d362409d5469aed47d19e7908d19bd194493aThomas GrafUINT32 ScrProtocolTraceFlag = SCR_PROTO_TRACE_ALL; //0x017F00; 4444d362409d5469aed47d19e7908d19bd194493aThomas GrafUINT8 appl_trace_level = 0xff; 4544d362409d5469aed47d19e7908d19bd194493aThomas Grafchar bcm_nfc_location[120]; 4644d362409d5469aed47d19e7908d19bd194493aThomas Graf 4744d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic UINT8 nfa_dm_cfg[sizeof ( tNFA_DM_CFG ) ]; 4844d362409d5469aed47d19e7908d19bd194493aThomas Grafextern tNFA_DM_CFG *p_nfa_dm_cfg; 4944d362409d5469aed47d19e7908d19bd194493aThomas Grafextern UINT8 nfa_ee_max_ee_cfg; 5044d362409d5469aed47d19e7908d19bd194493aThomas Grafextern const UINT8 nfca_version_string []; 5144d362409d5469aed47d19e7908d19bd194493aThomas Grafextern const UINT8 nfa_version_string []; 5244d362409d5469aed47d19e7908d19bd194493aThomas Graf 5344d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 5444d362409d5469aed47d19e7908d19bd194493aThomas Graf** 5544d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::NfcAdaptation() 5644d362409d5469aed47d19e7908d19bd194493aThomas Graf** 5744d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: class constructor 5844d362409d5469aed47d19e7908d19bd194493aThomas Graf** 5944d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: none 6044d362409d5469aed47d19e7908d19bd194493aThomas Graf** 6144d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 6244d362409d5469aed47d19e7908d19bd194493aThomas GrafNfcAdaptation::NfcAdaptation() 6344d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 6444d362409d5469aed47d19e7908d19bd194493aThomas Graf} 6544d362409d5469aed47d19e7908d19bd194493aThomas Graf 6644d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 6744d362409d5469aed47d19e7908d19bd194493aThomas Graf** 6844d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::~NfcAdaptation() 6944d362409d5469aed47d19e7908d19bd194493aThomas Graf** 7044d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: class destructor 7144d362409d5469aed47d19e7908d19bd194493aThomas Graf** 7244d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: none 7344d362409d5469aed47d19e7908d19bd194493aThomas Graf** 7444d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 7544d362409d5469aed47d19e7908d19bd194493aThomas GrafNfcAdaptation::~NfcAdaptation() 7644d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 7744d362409d5469aed47d19e7908d19bd194493aThomas Graf mpInstance = NULL; 7844d362409d5469aed47d19e7908d19bd194493aThomas Graf} 7944d362409d5469aed47d19e7908d19bd194493aThomas Graf 8044d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 8144d362409d5469aed47d19e7908d19bd194493aThomas Graf** 8244d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::GetInstance() 8344d362409d5469aed47d19e7908d19bd194493aThomas Graf** 8444d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: access class singleton 8544d362409d5469aed47d19e7908d19bd194493aThomas Graf** 8644d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: pointer to the singleton object 8744d362409d5469aed47d19e7908d19bd194493aThomas Graf** 8844d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 8944d362409d5469aed47d19e7908d19bd194493aThomas GrafNfcAdaptation& NfcAdaptation::GetInstance() 9044d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 9144d362409d5469aed47d19e7908d19bd194493aThomas Graf AutoThreadMutex a(sLock); 9244d362409d5469aed47d19e7908d19bd194493aThomas Graf 9344d362409d5469aed47d19e7908d19bd194493aThomas Graf if (!mpInstance) 9444d362409d5469aed47d19e7908d19bd194493aThomas Graf mpInstance = new NfcAdaptation; 9544d362409d5469aed47d19e7908d19bd194493aThomas Graf return *mpInstance; 9644d362409d5469aed47d19e7908d19bd194493aThomas Graf} 9744d362409d5469aed47d19e7908d19bd194493aThomas Graf 9844d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 9944d362409d5469aed47d19e7908d19bd194493aThomas Graf** 10044d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::Initialize() 10144d362409d5469aed47d19e7908d19bd194493aThomas Graf** 10244d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: class initializer 10344d362409d5469aed47d19e7908d19bd194493aThomas Graf** 10444d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: none 10544d362409d5469aed47d19e7908d19bd194493aThomas Graf** 10644d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 10744d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid NfcAdaptation::Initialize () 10844d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 10944d362409d5469aed47d19e7908d19bd194493aThomas Graf const char* func = "NfcAdaptation::Initialize"; 11044d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD("%s: enter", func); 11144d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGE("%s: ver=%s nfa=%s", func, nfca_version_string, nfa_version_string); 11244d362409d5469aed47d19e7908d19bd194493aThomas Graf unsigned long num; 11344d362409d5469aed47d19e7908d19bd194493aThomas Graf 11444d362409d5469aed47d19e7908d19bd194493aThomas Graf if ( !GetStrValue ( NAME_NFA_STORAGE, bcm_nfc_location, sizeof ( bcm_nfc_location ) ) ) 11544d362409d5469aed47d19e7908d19bd194493aThomas Graf strcpy ( bcm_nfc_location, "/data/nfc" ); 11644d362409d5469aed47d19e7908d19bd194493aThomas Graf if ( GetNumValue ( NAME_PROTOCOL_TRACE_LEVEL, &num, sizeof ( num ) ) ) 11744d362409d5469aed47d19e7908d19bd194493aThomas Graf ScrProtocolTraceFlag = num; 11844d362409d5469aed47d19e7908d19bd194493aThomas Graf 11944d362409d5469aed47d19e7908d19bd194493aThomas Graf if ( GetStrValue ( NAME_NFA_DM_CFG, (char*)nfa_dm_cfg, sizeof ( nfa_dm_cfg ) ) ) 12044d362409d5469aed47d19e7908d19bd194493aThomas Graf p_nfa_dm_cfg = ( tNFA_DM_CFG * ) &nfa_dm_cfg[0]; 12144d362409d5469aed47d19e7908d19bd194493aThomas Graf 12244d362409d5469aed47d19e7908d19bd194493aThomas Graf if ( GetNumValue ( NAME_NFA_MAX_EE_SUPPORTED, &num, sizeof ( num ) ) ) 12344d362409d5469aed47d19e7908d19bd194493aThomas Graf { 12444d362409d5469aed47d19e7908d19bd194493aThomas Graf nfa_ee_max_ee_cfg = num; 12544d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD("%s: Overriding NFA_EE_MAX_EE_SUPPORTED to use %d", func, nfa_ee_max_ee_cfg); 12644d362409d5469aed47d19e7908d19bd194493aThomas Graf } 12744d362409d5469aed47d19e7908d19bd194493aThomas Graf 12844d362409d5469aed47d19e7908d19bd194493aThomas Graf initializeGlobalAppLogLevel (); 12944d362409d5469aed47d19e7908d19bd194493aThomas Graf 13044d362409d5469aed47d19e7908d19bd194493aThomas Graf if ( GetNumValue ( NAME_PRESERVE_STORAGE, (char*)&num, sizeof ( num ) ) && 13144d362409d5469aed47d19e7908d19bd194493aThomas Graf (num == 1) ) 13244d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s: preserve stack NV store", __FUNCTION__); 13344d362409d5469aed47d19e7908d19bd194493aThomas Graf else 13444d362409d5469aed47d19e7908d19bd194493aThomas Graf { 13544d362409d5469aed47d19e7908d19bd194493aThomas Graf verify_stack_non_volatile_store (); 13644d362409d5469aed47d19e7908d19bd194493aThomas Graf delete_stack_non_volatile_store (FALSE); 13744d362409d5469aed47d19e7908d19bd194493aThomas Graf } 13844d362409d5469aed47d19e7908d19bd194493aThomas Graf 13944d362409d5469aed47d19e7908d19bd194493aThomas Graf GKI_init (); 14044d362409d5469aed47d19e7908d19bd194493aThomas Graf GKI_enable (); 14144d362409d5469aed47d19e7908d19bd194493aThomas Graf GKI_create_task ((TASKPTR)NFCA_TASK, BTU_TASK, (INT8*)"NFCA_TASK", 0, 0, (pthread_cond_t*)NULL, NULL); 14244d362409d5469aed47d19e7908d19bd194493aThomas Graf { 14344d362409d5469aed47d19e7908d19bd194493aThomas Graf AutoThreadMutex guard(mCondVar); 14444d362409d5469aed47d19e7908d19bd194493aThomas Graf GKI_create_task ((TASKPTR)Thread, MMI_TASK, (INT8*)"NFCA_THREAD", 0, 0, (pthread_cond_t*)NULL, NULL); 14544d362409d5469aed47d19e7908d19bd194493aThomas Graf mCondVar.wait(); 14644d362409d5469aed47d19e7908d19bd194493aThomas Graf } 14744d362409d5469aed47d19e7908d19bd194493aThomas Graf 14844d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalDeviceContext = NULL; 14944d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalCallback = NULL; 15044d362409d5469aed47d19e7908d19bd194493aThomas Graf memset (&mHalEntryFuncs, 0, sizeof(mHalEntryFuncs)); 15144d362409d5469aed47d19e7908d19bd194493aThomas Graf InitializeHalDeviceContext (); 15244d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s: exit", func); 15344d362409d5469aed47d19e7908d19bd194493aThomas Graf} 15444d362409d5469aed47d19e7908d19bd194493aThomas Graf 15544d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 15644d362409d5469aed47d19e7908d19bd194493aThomas Graf** 15744d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::Finalize() 15844d362409d5469aed47d19e7908d19bd194493aThomas Graf** 15944d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: class finalizer 16044d362409d5469aed47d19e7908d19bd194493aThomas Graf** 16144d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: none 16244d362409d5469aed47d19e7908d19bd194493aThomas Graf** 16344d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 16444d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid NfcAdaptation::Finalize() 16544d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 16644d362409d5469aed47d19e7908d19bd194493aThomas Graf const char* func = "NfcAdaptation::Finalize"; 16744d362409d5469aed47d19e7908d19bd194493aThomas Graf AutoThreadMutex a(sLock); 16844d362409d5469aed47d19e7908d19bd194493aThomas Graf 16944d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s: enter", func); 17044d362409d5469aed47d19e7908d19bd194493aThomas Graf GKI_shutdown (); 17144d362409d5469aed47d19e7908d19bd194493aThomas Graf 17244d362409d5469aed47d19e7908d19bd194493aThomas Graf resetConfig(); 17344d362409d5469aed47d19e7908d19bd194493aThomas Graf 17444d362409d5469aed47d19e7908d19bd194493aThomas Graf nfc_nci_close(mHalDeviceContext); //close the HAL's device context 17544d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalDeviceContext = NULL; 1763ad4665be2f192291238cbe78118a57ec42436c6Thomas Graf mHalCallback = NULL; 1773ad4665be2f192291238cbe78118a57ec42436c6Thomas Graf memset (&mHalEntryFuncs, 0, sizeof(mHalEntryFuncs)); 17844d362409d5469aed47d19e7908d19bd194493aThomas Graf 17944d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s: exit", func); 18044d362409d5469aed47d19e7908d19bd194493aThomas Graf delete this; 18144d362409d5469aed47d19e7908d19bd194493aThomas Graf} 18244d362409d5469aed47d19e7908d19bd194493aThomas Graf 18344d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 18444d362409d5469aed47d19e7908d19bd194493aThomas Graf** 18544d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::signal() 18644d362409d5469aed47d19e7908d19bd194493aThomas Graf** 18744d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: signal the CondVar to release the thread that is waiting 18844d362409d5469aed47d19e7908d19bd194493aThomas Graf** 18944d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: none 19044d362409d5469aed47d19e7908d19bd194493aThomas Graf** 19144d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 19244d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid NfcAdaptation::signal () 19344d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 19444d362409d5469aed47d19e7908d19bd194493aThomas Graf mCondVar.signal(); 19544d362409d5469aed47d19e7908d19bd194493aThomas Graf} 19644d362409d5469aed47d19e7908d19bd194493aThomas Graf 19744d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 19844d362409d5469aed47d19e7908d19bd194493aThomas Graf** 19944d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::NFCA_TASK() 20044d362409d5469aed47d19e7908d19bd194493aThomas Graf** 20144d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: NFCA_TASK runs the GKI main task 20244d362409d5469aed47d19e7908d19bd194493aThomas Graf** 20344d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: none 20444d362409d5469aed47d19e7908d19bd194493aThomas Graf** 20544d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 20644d362409d5469aed47d19e7908d19bd194493aThomas GrafUINT32 NfcAdaptation::NFCA_TASK (UINT32 arg) 20744d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 20844d362409d5469aed47d19e7908d19bd194493aThomas Graf const char* func = "NfcAdaptation::NFCA_TASK"; 20944d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s: enter", func); 21044d362409d5469aed47d19e7908d19bd194493aThomas Graf GKI_run (0); 21144d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s: exit", func); 21244d362409d5469aed47d19e7908d19bd194493aThomas Graf return NULL; 21344d362409d5469aed47d19e7908d19bd194493aThomas Graf} 21444d362409d5469aed47d19e7908d19bd194493aThomas Graf 21544d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 21644d362409d5469aed47d19e7908d19bd194493aThomas Graf** 21744d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::Thread() 21844d362409d5469aed47d19e7908d19bd194493aThomas Graf** 21944d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: Creates work threads 22044d362409d5469aed47d19e7908d19bd194493aThomas Graf** 22144d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: none 22244d362409d5469aed47d19e7908d19bd194493aThomas Graf** 22344d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 22444d362409d5469aed47d19e7908d19bd194493aThomas GrafUINT32 NfcAdaptation::Thread (UINT32 arg) 22544d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 22644d362409d5469aed47d19e7908d19bd194493aThomas Graf const char* func = "NfcAdaptation::Thread"; 22744d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s: enter", func); 22844d362409d5469aed47d19e7908d19bd194493aThomas Graf 22944d362409d5469aed47d19e7908d19bd194493aThomas Graf { 23044d362409d5469aed47d19e7908d19bd194493aThomas Graf ThreadCondVar CondVar; 23144d362409d5469aed47d19e7908d19bd194493aThomas Graf AutoThreadMutex guard(CondVar); 23244d362409d5469aed47d19e7908d19bd194493aThomas Graf GKI_create_task ((TASKPTR)nfc_task, NFC_TASK, (INT8*)"NFC_TASK", 0, 0, (pthread_cond_t*)CondVar, (pthread_mutex_t*)CondVar); 23344d362409d5469aed47d19e7908d19bd194493aThomas Graf CondVar.wait(); 23444d362409d5469aed47d19e7908d19bd194493aThomas Graf } 23544d362409d5469aed47d19e7908d19bd194493aThomas Graf 23644d362409d5469aed47d19e7908d19bd194493aThomas Graf NfcAdaptation::GetInstance().signal(); 23744d362409d5469aed47d19e7908d19bd194493aThomas Graf 23844d362409d5469aed47d19e7908d19bd194493aThomas Graf GKI_exit_task (GKI_get_taskid ()); 23944d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s: exit", func); 24044d362409d5469aed47d19e7908d19bd194493aThomas Graf return NULL; 24144d362409d5469aed47d19e7908d19bd194493aThomas Graf} 24244d362409d5469aed47d19e7908d19bd194493aThomas Graf 24344d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 24444d362409d5469aed47d19e7908d19bd194493aThomas Graf** 24544d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::GetHalEntryFuncs() 24644d362409d5469aed47d19e7908d19bd194493aThomas Graf** 24744d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: Get the set of HAL entry points. 24844d362409d5469aed47d19e7908d19bd194493aThomas Graf** 24944d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: Functions pointers for HAL entry points. 25044d362409d5469aed47d19e7908d19bd194493aThomas Graf** 25144d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 25244d362409d5469aed47d19e7908d19bd194493aThomas GraftHAL_NFC_ENTRY* NfcAdaptation::GetHalEntryFuncs () 25344d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 25444d362409d5469aed47d19e7908d19bd194493aThomas Graf return &mHalEntryFuncs; 25544d362409d5469aed47d19e7908d19bd194493aThomas Graf} 25644d362409d5469aed47d19e7908d19bd194493aThomas Graf 25744d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 25844d362409d5469aed47d19e7908d19bd194493aThomas Graf** 25944d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::InitializeHalDeviceContext 26044d362409d5469aed47d19e7908d19bd194493aThomas Graf** 26144d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: Ask the generic Android HAL to find the Broadcom-specific HAL. 26244d362409d5469aed47d19e7908d19bd194493aThomas Graf** 26344d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: None. 26444d362409d5469aed47d19e7908d19bd194493aThomas Graf** 26544d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 26644d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid NfcAdaptation::InitializeHalDeviceContext () 26744d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 26844d362409d5469aed47d19e7908d19bd194493aThomas Graf const char* func = "NfcAdaptation::InitializeHalDeviceContext"; 26944d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s: enter", func); 27044d362409d5469aed47d19e7908d19bd194493aThomas Graf int ret = 0; //0 means success 27144d362409d5469aed47d19e7908d19bd194493aThomas Graf const hw_module_t* hw_module = NULL; 27244d362409d5469aed47d19e7908d19bd194493aThomas Graf 27344d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalEntryFuncs.initialize = HalInitialize; 27444d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalEntryFuncs.terminate = HalTerminate; 27544d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalEntryFuncs.open = HalOpen; 27644d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalEntryFuncs.close = HalClose; 27744d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalEntryFuncs.core_initialized = HalCoreInitialized; 27844d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalEntryFuncs.write = HalWrite; 27944d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalEntryFuncs.prediscover = HalPrediscover; 28044d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalEntryFuncs.control_granted = HalControlGranted; 28144d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalEntryFuncs.power_cycle = HalPowerCycle; 28244d362409d5469aed47d19e7908d19bd194493aThomas Graf 28344d362409d5469aed47d19e7908d19bd194493aThomas Graf ret = hw_get_module (NFC_NCI_HARDWARE_MODULE_ID, &hw_module); 28444d362409d5469aed47d19e7908d19bd194493aThomas Graf if (ret == 0) 28544d362409d5469aed47d19e7908d19bd194493aThomas Graf { 28644d362409d5469aed47d19e7908d19bd194493aThomas Graf ret = nfc_nci_open (hw_module, &mHalDeviceContext); 28744d362409d5469aed47d19e7908d19bd194493aThomas Graf if (ret != 0) 28844d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGE ("%s: nfc_nci_open fail", func); 28944d362409d5469aed47d19e7908d19bd194493aThomas Graf } 29044d362409d5469aed47d19e7908d19bd194493aThomas Graf else 29144d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGE ("%s: fail hw_get_module", func); 29244d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s: exit", func); 29344d362409d5469aed47d19e7908d19bd194493aThomas Graf} 29444d362409d5469aed47d19e7908d19bd194493aThomas Graf 29544d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 29644d362409d5469aed47d19e7908d19bd194493aThomas Graf** 29744d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::HalInitialize 29844d362409d5469aed47d19e7908d19bd194493aThomas Graf** 29944d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: Not implemented because this function is only needed 30044d362409d5469aed47d19e7908d19bd194493aThomas Graf** within the HAL. 30144d362409d5469aed47d19e7908d19bd194493aThomas Graf** 30244d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: None. 30344d362409d5469aed47d19e7908d19bd194493aThomas Graf** 30444d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 30544d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid NfcAdaptation::HalInitialize () 30644d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 30744d362409d5469aed47d19e7908d19bd194493aThomas Graf const char* func = "NfcAdaptation::HalInitialize"; 30844d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s", func); 30944d362409d5469aed47d19e7908d19bd194493aThomas Graf} 31044d362409d5469aed47d19e7908d19bd194493aThomas Graf 31144d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 31244d362409d5469aed47d19e7908d19bd194493aThomas Graf** 31344d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::HalTerminate 31444d362409d5469aed47d19e7908d19bd194493aThomas Graf** 31544d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: Not implemented because this function is only needed 31644d362409d5469aed47d19e7908d19bd194493aThomas Graf** within the HAL. 31744d362409d5469aed47d19e7908d19bd194493aThomas Graf** 31844d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: None. 31944d362409d5469aed47d19e7908d19bd194493aThomas Graf** 32044d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 32144d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid NfcAdaptation::HalTerminate () 32244d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 32344d362409d5469aed47d19e7908d19bd194493aThomas Graf const char* func = "NfcAdaptation::HalTerminate"; 32444d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s", func); 32544d362409d5469aed47d19e7908d19bd194493aThomas Graf} 32644d362409d5469aed47d19e7908d19bd194493aThomas Graf 32744d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 32844d362409d5469aed47d19e7908d19bd194493aThomas Graf** 32944d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::HalOpen 33044d362409d5469aed47d19e7908d19bd194493aThomas Graf** 33144d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: Turn on controller, download firmware. 33244d362409d5469aed47d19e7908d19bd194493aThomas Graf** 33344d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: None. 33444d362409d5469aed47d19e7908d19bd194493aThomas Graf** 33544d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 33644d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid NfcAdaptation::HalOpen (tHAL_NFC_CBACK *p_hal_cback, tHAL_NFC_DATA_CBACK* p_data_cback) 33744d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 33844d362409d5469aed47d19e7908d19bd194493aThomas Graf const char* func = "NfcAdaptation::HalOpen"; 33944d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s", func); 34044d362409d5469aed47d19e7908d19bd194493aThomas Graf if (mHalDeviceContext) 34144d362409d5469aed47d19e7908d19bd194493aThomas Graf { 34244d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalCallback = p_hal_cback; 34344d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalDataCallback = p_data_cback; 34444d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalDeviceContext->open (mHalDeviceContext, HalDeviceContextCallback, HalDeviceContextDataCallback); 34544d362409d5469aed47d19e7908d19bd194493aThomas Graf } 34644d362409d5469aed47d19e7908d19bd194493aThomas Graf} 34744d362409d5469aed47d19e7908d19bd194493aThomas Graf 34844d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 34944d362409d5469aed47d19e7908d19bd194493aThomas Graf** 35044d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::HalClose 35144d362409d5469aed47d19e7908d19bd194493aThomas Graf** 35244d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: Turn off controller. 35344d362409d5469aed47d19e7908d19bd194493aThomas Graf** 35444d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: None. 35544d362409d5469aed47d19e7908d19bd194493aThomas Graf** 35644d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 35744d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid NfcAdaptation::HalClose () 35844d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 35944d362409d5469aed47d19e7908d19bd194493aThomas Graf const char* func = "NfcAdaptation::HalClose"; 36044d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s", func); 36144d362409d5469aed47d19e7908d19bd194493aThomas Graf if (mHalDeviceContext) 36244d362409d5469aed47d19e7908d19bd194493aThomas Graf { 36344d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalDeviceContext->close (mHalDeviceContext); 36444d362409d5469aed47d19e7908d19bd194493aThomas Graf } 36544d362409d5469aed47d19e7908d19bd194493aThomas Graf} 36644d362409d5469aed47d19e7908d19bd194493aThomas Graf 36744d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 36844d362409d5469aed47d19e7908d19bd194493aThomas Graf** 36944d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::HalDeviceContextCallback 37044d362409d5469aed47d19e7908d19bd194493aThomas Graf** 37144d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: Translate generic Android HAL's callback into Broadcom-specific 37244d362409d5469aed47d19e7908d19bd194493aThomas Graf** callback function. 37344d362409d5469aed47d19e7908d19bd194493aThomas Graf** 37444d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: None. 37544d362409d5469aed47d19e7908d19bd194493aThomas Graf** 37644d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 37744d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid NfcAdaptation::HalDeviceContextCallback (nfc_event_t event, nfc_status_t event_status) 37844d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 37944d362409d5469aed47d19e7908d19bd194493aThomas Graf const char* func = "NfcAdaptation::HalDeviceContextCallback"; 38044d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s: event=%u", func, event); 38144d362409d5469aed47d19e7908d19bd194493aThomas Graf if (mHalCallback) 38244d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalCallback (event, (tHAL_NFC_STATUS) event_status); 38344d362409d5469aed47d19e7908d19bd194493aThomas Graf} 38444d362409d5469aed47d19e7908d19bd194493aThomas Graf 38544d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 38644d362409d5469aed47d19e7908d19bd194493aThomas Graf** 38744d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::HalDeviceContextDataCallback 38844d362409d5469aed47d19e7908d19bd194493aThomas Graf** 38944d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: Translate generic Android HAL's callback into Broadcom-specific 39044d362409d5469aed47d19e7908d19bd194493aThomas Graf** callback function. 39144d362409d5469aed47d19e7908d19bd194493aThomas Graf** 39244d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: None. 39344d362409d5469aed47d19e7908d19bd194493aThomas Graf** 39444d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 39544d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid NfcAdaptation::HalDeviceContextDataCallback (uint16_t data_len, uint8_t* p_data) 39644d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 39744d362409d5469aed47d19e7908d19bd194493aThomas Graf const char* func = "NfcAdaptation::HalDeviceContextDataCallback"; 39844d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s: len=%u", func, data_len); 39944d362409d5469aed47d19e7908d19bd194493aThomas Graf if (mHalDataCallback) 40044d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalDataCallback (data_len, p_data); 40144d362409d5469aed47d19e7908d19bd194493aThomas Graf} 40244d362409d5469aed47d19e7908d19bd194493aThomas Graf 40344d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 40444d362409d5469aed47d19e7908d19bd194493aThomas Graf** 40544d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::HalWrite 40644d362409d5469aed47d19e7908d19bd194493aThomas Graf** 40744d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: Write NCI message to the controller. 40844d362409d5469aed47d19e7908d19bd194493aThomas Graf** 40944d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: None. 41044d362409d5469aed47d19e7908d19bd194493aThomas Graf** 41144d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 41244d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid NfcAdaptation::HalWrite (UINT16 data_len, UINT8* p_data) 41344d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 41444d362409d5469aed47d19e7908d19bd194493aThomas Graf const char* func = "NfcAdaptation::HalWrite"; 41544d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s", func); 41644d362409d5469aed47d19e7908d19bd194493aThomas Graf if (mHalDeviceContext) 41744d362409d5469aed47d19e7908d19bd194493aThomas Graf { 41844d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalDeviceContext->write (mHalDeviceContext, data_len, p_data); 41944d362409d5469aed47d19e7908d19bd194493aThomas Graf } 42044d362409d5469aed47d19e7908d19bd194493aThomas Graf} 42144d362409d5469aed47d19e7908d19bd194493aThomas Graf 42244d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 42344d362409d5469aed47d19e7908d19bd194493aThomas Graf** 42444d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::HalCoreInitialized 42544d362409d5469aed47d19e7908d19bd194493aThomas Graf** 42644d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: Adjust the configurable parameters in the controller. 42744d362409d5469aed47d19e7908d19bd194493aThomas Graf** 42844d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: None. 42944d362409d5469aed47d19e7908d19bd194493aThomas Graf** 43044d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 43144d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid NfcAdaptation::HalCoreInitialized (UINT8* p_core_init_rsp_params) 43244d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 43344d362409d5469aed47d19e7908d19bd194493aThomas Graf const char* func = "NfcAdaptation::HalCoreInitialized"; 43444d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s", func); 43544d362409d5469aed47d19e7908d19bd194493aThomas Graf if (mHalDeviceContext) 43644d362409d5469aed47d19e7908d19bd194493aThomas Graf { 43744d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalDeviceContext->core_initialized (mHalDeviceContext, p_core_init_rsp_params); 43844d362409d5469aed47d19e7908d19bd194493aThomas Graf } 43944d362409d5469aed47d19e7908d19bd194493aThomas Graf} 44044d362409d5469aed47d19e7908d19bd194493aThomas Graf 44144d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 44244d362409d5469aed47d19e7908d19bd194493aThomas Graf** 44344d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::HalPrediscover 44444d362409d5469aed47d19e7908d19bd194493aThomas Graf** 44544d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: Perform any vendor-specific pre-discovery actions (if needed) 44644d362409d5469aed47d19e7908d19bd194493aThomas Graf** If any actions were performed TRUE will be returned, and 44744d362409d5469aed47d19e7908d19bd194493aThomas Graf** HAL_PRE_DISCOVER_CPLT_EVT will notify when actions are 44844d362409d5469aed47d19e7908d19bd194493aThomas Graf** completed. 44944d362409d5469aed47d19e7908d19bd194493aThomas Graf** 45044d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: TRUE if vendor-specific pre-discovery actions initialized 45144d362409d5469aed47d19e7908d19bd194493aThomas Graf** FALSE if no vendor-specific pre-discovery actions are needed. 45244d362409d5469aed47d19e7908d19bd194493aThomas Graf** 45344d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 45444d362409d5469aed47d19e7908d19bd194493aThomas GrafBOOLEAN NfcAdaptation::HalPrediscover () 45544d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 45644d362409d5469aed47d19e7908d19bd194493aThomas Graf const char* func = "NfcAdaptation::HalPrediscover"; 45744d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s", func); 45844d362409d5469aed47d19e7908d19bd194493aThomas Graf BOOLEAN retval = FALSE; 45944d362409d5469aed47d19e7908d19bd194493aThomas Graf 46044d362409d5469aed47d19e7908d19bd194493aThomas Graf if (mHalDeviceContext) 46144d362409d5469aed47d19e7908d19bd194493aThomas Graf { 46244d362409d5469aed47d19e7908d19bd194493aThomas Graf retval = mHalDeviceContext->pre_discover (mHalDeviceContext); 46344d362409d5469aed47d19e7908d19bd194493aThomas Graf } 46444d362409d5469aed47d19e7908d19bd194493aThomas Graf return retval; 46544d362409d5469aed47d19e7908d19bd194493aThomas Graf} 46644d362409d5469aed47d19e7908d19bd194493aThomas Graf 46744d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 46844d362409d5469aed47d19e7908d19bd194493aThomas Graf** 46944d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: HAL_NfcControlGranted 47044d362409d5469aed47d19e7908d19bd194493aThomas Graf** 47144d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: Grant control to HAL control for sending NCI commands. 47244d362409d5469aed47d19e7908d19bd194493aThomas Graf** Call in response to HAL_REQUEST_CONTROL_EVT. 47344d362409d5469aed47d19e7908d19bd194493aThomas Graf** Must only be called when there are no NCI commands pending. 47444d362409d5469aed47d19e7908d19bd194493aThomas Graf** HAL_RELEASE_CONTROL_EVT will notify when HAL no longer 47544d362409d5469aed47d19e7908d19bd194493aThomas Graf** needs control of NCI. 47644d362409d5469aed47d19e7908d19bd194493aThomas Graf** 47744d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: void 47844d362409d5469aed47d19e7908d19bd194493aThomas Graf** 47944d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 48044d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid NfcAdaptation::HalControlGranted () 48144d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 48244d362409d5469aed47d19e7908d19bd194493aThomas Graf const char* func = "NfcAdaptation::HalControlGranted"; 48344d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s", func); 48444d362409d5469aed47d19e7908d19bd194493aThomas Graf if (mHalDeviceContext) 48544d362409d5469aed47d19e7908d19bd194493aThomas Graf { 48644d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalDeviceContext->control_granted (mHalDeviceContext); 48744d362409d5469aed47d19e7908d19bd194493aThomas Graf } 48844d362409d5469aed47d19e7908d19bd194493aThomas Graf} 48944d362409d5469aed47d19e7908d19bd194493aThomas Graf 49044d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 49144d362409d5469aed47d19e7908d19bd194493aThomas Graf** 49244d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::HalPowerCycle 49344d362409d5469aed47d19e7908d19bd194493aThomas Graf** 49444d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: Turn off and turn on the controller. 49544d362409d5469aed47d19e7908d19bd194493aThomas Graf** 49644d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: None. 49744d362409d5469aed47d19e7908d19bd194493aThomas Graf** 49844d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 49944d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid NfcAdaptation::HalPowerCycle () 50044d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 50144d362409d5469aed47d19e7908d19bd194493aThomas Graf const char* func = "NfcAdaptation::HalPowerCycle"; 50244d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s", func); 50344d362409d5469aed47d19e7908d19bd194493aThomas Graf if (mHalDeviceContext) 50444d362409d5469aed47d19e7908d19bd194493aThomas Graf { 50544d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalDeviceContext->power_cycle (mHalDeviceContext); 50644d362409d5469aed47d19e7908d19bd194493aThomas Graf } 50744d362409d5469aed47d19e7908d19bd194493aThomas Graf} 50844d362409d5469aed47d19e7908d19bd194493aThomas Graf 50944d362409d5469aed47d19e7908d19bd194493aThomas Graf 51044d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 51144d362409d5469aed47d19e7908d19bd194493aThomas Graf** 51244d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::DownloadFirmware 51344d362409d5469aed47d19e7908d19bd194493aThomas Graf** 51444d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: Download firmware patch files. 51544d362409d5469aed47d19e7908d19bd194493aThomas Graf** 51644d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: None. 51744d362409d5469aed47d19e7908d19bd194493aThomas Graf** 51844d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 51944d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid NfcAdaptation::DownloadFirmware () 52044d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 52144d362409d5469aed47d19e7908d19bd194493aThomas Graf const char* func = "NfcAdaptation::DownloadFirmware"; 52244d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s: enter", func); 52344d362409d5469aed47d19e7908d19bd194493aThomas Graf HalInitialize (); 52444d362409d5469aed47d19e7908d19bd194493aThomas Graf 52544d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalOpenCompletedEvent.lock (); 52644d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s: try open HAL", func); 52744d362409d5469aed47d19e7908d19bd194493aThomas Graf HalOpen (HalDownloadFirmwareCallback, HalDownloadFirmwareDataCallback); 52844d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalOpenCompletedEvent.wait (); 52944d362409d5469aed47d19e7908d19bd194493aThomas Graf 53044d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalCloseCompletedEvent.lock (); 53144d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s: try close HAL", func); 53244d362409d5469aed47d19e7908d19bd194493aThomas Graf HalClose (); 53344d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalCloseCompletedEvent.wait (); 53444d362409d5469aed47d19e7908d19bd194493aThomas Graf 53544d362409d5469aed47d19e7908d19bd194493aThomas Graf HalTerminate (); 53644d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s: exit", func); 53744d362409d5469aed47d19e7908d19bd194493aThomas Graf} 53844d362409d5469aed47d19e7908d19bd194493aThomas Graf 53944d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 54044d362409d5469aed47d19e7908d19bd194493aThomas Graf** 54144d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::HalDownloadFirmwareCallback 54244d362409d5469aed47d19e7908d19bd194493aThomas Graf** 54344d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: Receive events from the HAL. 54444d362409d5469aed47d19e7908d19bd194493aThomas Graf** 54544d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: None. 54644d362409d5469aed47d19e7908d19bd194493aThomas Graf** 54744d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 54844d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid NfcAdaptation::HalDownloadFirmwareCallback (nfc_event_t event, nfc_status_t event_status) 54944d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 55044d362409d5469aed47d19e7908d19bd194493aThomas Graf const char* func = "NfcAdaptation::HalDownloadFirmwareCallback"; 55144d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s: event=0x%X", func, event); 55244d362409d5469aed47d19e7908d19bd194493aThomas Graf switch (event) 55344d362409d5469aed47d19e7908d19bd194493aThomas Graf { 55444d362409d5469aed47d19e7908d19bd194493aThomas Graf case HAL_NFC_OPEN_CPLT_EVT: 55544d362409d5469aed47d19e7908d19bd194493aThomas Graf { 55644d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s: HAL_NFC_OPEN_CPLT_EVT", func); 55744d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalOpenCompletedEvent.signal (); 55844d362409d5469aed47d19e7908d19bd194493aThomas Graf break; 55944d362409d5469aed47d19e7908d19bd194493aThomas Graf } 56044d362409d5469aed47d19e7908d19bd194493aThomas Graf case HAL_NFC_CLOSE_CPLT_EVT: 56144d362409d5469aed47d19e7908d19bd194493aThomas Graf { 56244d362409d5469aed47d19e7908d19bd194493aThomas Graf ALOGD ("%s: HAL_NFC_CLOSE_CPLT_EVT", func); 56344d362409d5469aed47d19e7908d19bd194493aThomas Graf mHalCloseCompletedEvent.signal (); 56444d362409d5469aed47d19e7908d19bd194493aThomas Graf break; 56544d362409d5469aed47d19e7908d19bd194493aThomas Graf } 56644d362409d5469aed47d19e7908d19bd194493aThomas Graf } 56744d362409d5469aed47d19e7908d19bd194493aThomas Graf} 56844d362409d5469aed47d19e7908d19bd194493aThomas Graf 56944d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 57044d362409d5469aed47d19e7908d19bd194493aThomas Graf** 57144d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: NfcAdaptation::HalDownloadFirmwareDataCallback 57244d362409d5469aed47d19e7908d19bd194493aThomas Graf** 57344d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: Receive data events from the HAL. 57444d362409d5469aed47d19e7908d19bd194493aThomas Graf** 57544d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: None. 57644d362409d5469aed47d19e7908d19bd194493aThomas Graf** 57744d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 57844d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid NfcAdaptation::HalDownloadFirmwareDataCallback (uint16_t data_len, uint8_t* p_data) 57944d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 58044d362409d5469aed47d19e7908d19bd194493aThomas Graf} 58144d362409d5469aed47d19e7908d19bd194493aThomas Graf 58244d362409d5469aed47d19e7908d19bd194493aThomas Graf 58344d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 58444d362409d5469aed47d19e7908d19bd194493aThomas Graf** 58544d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: ThreadMutex::ThreadMutex() 58644d362409d5469aed47d19e7908d19bd194493aThomas Graf** 58744d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: class constructor 58844d362409d5469aed47d19e7908d19bd194493aThomas Graf** 58944d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: none 59044d362409d5469aed47d19e7908d19bd194493aThomas Graf** 59144d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 59244d362409d5469aed47d19e7908d19bd194493aThomas GrafThreadMutex::ThreadMutex() 59344d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 59444d362409d5469aed47d19e7908d19bd194493aThomas Graf pthread_mutexattr_t mutexAttr; 59544d362409d5469aed47d19e7908d19bd194493aThomas Graf 59644d362409d5469aed47d19e7908d19bd194493aThomas Graf pthread_mutexattr_init(&mutexAttr); 59744d362409d5469aed47d19e7908d19bd194493aThomas Graf pthread_mutex_init(&mMutex, &mutexAttr); 59844d362409d5469aed47d19e7908d19bd194493aThomas Graf pthread_mutexattr_destroy(&mutexAttr); 59944d362409d5469aed47d19e7908d19bd194493aThomas Graf} 60044d362409d5469aed47d19e7908d19bd194493aThomas Graf 60144d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 60244d362409d5469aed47d19e7908d19bd194493aThomas Graf** 60344d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: ThreadMutex::~ThreadMutex() 60444d362409d5469aed47d19e7908d19bd194493aThomas Graf** 60544d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: class destructor 60644d362409d5469aed47d19e7908d19bd194493aThomas Graf** 60744d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: none 60844d362409d5469aed47d19e7908d19bd194493aThomas Graf** 60944d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 61044d362409d5469aed47d19e7908d19bd194493aThomas GrafThreadMutex::~ThreadMutex() 61144d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 61244d362409d5469aed47d19e7908d19bd194493aThomas Graf pthread_mutex_destroy(&mMutex); 61344d362409d5469aed47d19e7908d19bd194493aThomas Graf} 61444d362409d5469aed47d19e7908d19bd194493aThomas Graf 61544d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 61644d362409d5469aed47d19e7908d19bd194493aThomas Graf** 61744d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: ThreadMutex::lock() 61844d362409d5469aed47d19e7908d19bd194493aThomas Graf** 61944d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: lock kthe mutex 62044d362409d5469aed47d19e7908d19bd194493aThomas Graf** 62144d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: none 62244d362409d5469aed47d19e7908d19bd194493aThomas Graf** 62344d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 62444d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid ThreadMutex::lock() 62544d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 62644d362409d5469aed47d19e7908d19bd194493aThomas Graf pthread_mutex_lock(&mMutex); 62744d362409d5469aed47d19e7908d19bd194493aThomas Graf} 62844d362409d5469aed47d19e7908d19bd194493aThomas Graf 62944d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 63044d362409d5469aed47d19e7908d19bd194493aThomas Graf** 63144d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: ThreadMutex::unblock() 63244d362409d5469aed47d19e7908d19bd194493aThomas Graf** 63344d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: unlock the mutex 63444d362409d5469aed47d19e7908d19bd194493aThomas Graf** 63544d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: none 63644d362409d5469aed47d19e7908d19bd194493aThomas Graf** 63744d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 63844d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid ThreadMutex::unlock() 63944d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 64044d362409d5469aed47d19e7908d19bd194493aThomas Graf pthread_mutex_unlock(&mMutex); 64144d362409d5469aed47d19e7908d19bd194493aThomas Graf} 64244d362409d5469aed47d19e7908d19bd194493aThomas Graf 64344d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 64444d362409d5469aed47d19e7908d19bd194493aThomas Graf** 64544d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: ThreadCondVar::ThreadCondVar() 64644d362409d5469aed47d19e7908d19bd194493aThomas Graf** 64744d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: class constructor 64844d362409d5469aed47d19e7908d19bd194493aThomas Graf** 64944d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: none 65044d362409d5469aed47d19e7908d19bd194493aThomas Graf** 65144d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 65244d362409d5469aed47d19e7908d19bd194493aThomas GrafThreadCondVar::ThreadCondVar() 65344d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 65444d362409d5469aed47d19e7908d19bd194493aThomas Graf pthread_condattr_t CondAttr; 65544d362409d5469aed47d19e7908d19bd194493aThomas Graf 65644d362409d5469aed47d19e7908d19bd194493aThomas Graf pthread_condattr_init(&CondAttr); 65744d362409d5469aed47d19e7908d19bd194493aThomas Graf pthread_cond_init(&mCondVar, &CondAttr); 65844d362409d5469aed47d19e7908d19bd194493aThomas Graf 65944d362409d5469aed47d19e7908d19bd194493aThomas Graf pthread_condattr_destroy(&CondAttr); 66044d362409d5469aed47d19e7908d19bd194493aThomas Graf} 66144d362409d5469aed47d19e7908d19bd194493aThomas Graf 66244d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 66344d362409d5469aed47d19e7908d19bd194493aThomas Graf** 66444d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: ThreadCondVar::~ThreadCondVar() 66544d362409d5469aed47d19e7908d19bd194493aThomas Graf** 66644d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: class destructor 66744d362409d5469aed47d19e7908d19bd194493aThomas Graf** 66844d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: none 66944d362409d5469aed47d19e7908d19bd194493aThomas Graf** 67044d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 67144d362409d5469aed47d19e7908d19bd194493aThomas GrafThreadCondVar::~ThreadCondVar() 67244d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 67344d362409d5469aed47d19e7908d19bd194493aThomas Graf pthread_cond_destroy(&mCondVar); 67444d362409d5469aed47d19e7908d19bd194493aThomas Graf} 67544d362409d5469aed47d19e7908d19bd194493aThomas Graf 67644d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 67744d362409d5469aed47d19e7908d19bd194493aThomas Graf** 67844d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: ThreadCondVar::wait() 67944d362409d5469aed47d19e7908d19bd194493aThomas Graf** 68044d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: wait on the mCondVar 68144d362409d5469aed47d19e7908d19bd194493aThomas Graf** 68244d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: none 68344d362409d5469aed47d19e7908d19bd194493aThomas Graf** 68444d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 68544d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid ThreadCondVar::wait() 68644d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 68744d362409d5469aed47d19e7908d19bd194493aThomas Graf pthread_cond_wait(&mCondVar, *this); 68844d362409d5469aed47d19e7908d19bd194493aThomas Graf pthread_mutex_unlock(*this); 68944d362409d5469aed47d19e7908d19bd194493aThomas Graf} 69044d362409d5469aed47d19e7908d19bd194493aThomas Graf 69144d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 69244d362409d5469aed47d19e7908d19bd194493aThomas Graf** 69344d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: ThreadCondVar::signal() 69444d362409d5469aed47d19e7908d19bd194493aThomas Graf** 69544d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: signal the mCondVar 69644d362409d5469aed47d19e7908d19bd194493aThomas Graf** 69744d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: none 69844d362409d5469aed47d19e7908d19bd194493aThomas Graf** 69944d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 70044d362409d5469aed47d19e7908d19bd194493aThomas Grafvoid ThreadCondVar::signal() 70144d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 70244d362409d5469aed47d19e7908d19bd194493aThomas Graf AutoThreadMutex a(*this); 70344d362409d5469aed47d19e7908d19bd194493aThomas Graf pthread_cond_signal(&mCondVar); 70444d362409d5469aed47d19e7908d19bd194493aThomas Graf} 70544d362409d5469aed47d19e7908d19bd194493aThomas Graf 70644d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 70744d362409d5469aed47d19e7908d19bd194493aThomas Graf** 70844d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: AutoThreadMutex::AutoThreadMutex() 70944d362409d5469aed47d19e7908d19bd194493aThomas Graf** 71044d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: class constructor, automatically lock the mutex 71144d362409d5469aed47d19e7908d19bd194493aThomas Graf** 71244d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: none 71344d362409d5469aed47d19e7908d19bd194493aThomas Graf** 71444d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 71544d362409d5469aed47d19e7908d19bd194493aThomas GrafAutoThreadMutex::AutoThreadMutex(ThreadMutex &m) 71644d362409d5469aed47d19e7908d19bd194493aThomas Graf : mm(m) 71744d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 71844d362409d5469aed47d19e7908d19bd194493aThomas Graf mm.lock(); 71944d362409d5469aed47d19e7908d19bd194493aThomas Graf} 72044d362409d5469aed47d19e7908d19bd194493aThomas Graf 72144d362409d5469aed47d19e7908d19bd194493aThomas Graf/******************************************************************************* 722cbe8902265ccc9f6aa6453aeb3a2a4631ed0eb01Philip Craig** 72344d362409d5469aed47d19e7908d19bd194493aThomas Graf** Function: AutoThreadMutex::~AutoThreadMutex() 72444d362409d5469aed47d19e7908d19bd194493aThomas Graf** 72544d362409d5469aed47d19e7908d19bd194493aThomas Graf** Description: class destructor, automatically unlock the mutex 72644d362409d5469aed47d19e7908d19bd194493aThomas Graf** 72744d362409d5469aed47d19e7908d19bd194493aThomas Graf** Returns: none 72844d362409d5469aed47d19e7908d19bd194493aThomas Graf** 72944d362409d5469aed47d19e7908d19bd194493aThomas Graf*******************************************************************************/ 73044d362409d5469aed47d19e7908d19bd194493aThomas GrafAutoThreadMutex::~AutoThreadMutex() 73144d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 73244d362409d5469aed47d19e7908d19bd194493aThomas Graf mm.unlock(); 73344d362409d5469aed47d19e7908d19bd194493aThomas Graf} 73444d362409d5469aed47d19e7908d19bd194493aThomas Graf