1b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu/******************************************************************************
2b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
3b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  Copyright (C) 1999-2012 Broadcom Corporation
4b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
5b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  Licensed under the Apache License, Version 2.0 (the "License");
6b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  you may not use this file except in compliance with the License.
7b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  You may obtain a copy of the License at:
8b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
9b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  http://www.apache.org/licenses/LICENSE-2.0
10b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
11b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  Unless required by applicable law or agreed to in writing, software
12b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  distributed under the License is distributed on an "AS IS" BASIS,
13b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  See the License for the specific language governing permissions and
15b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  limitations under the License.
16b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
17b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu ******************************************************************************/
18e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu#include "OverrideLog.h"
1945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "NfcAdaptation.h"
2045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuextern "C"
2145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
2245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    #include "gki.h"
2345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    #include "nfa_api.h"
2445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    #include "nfc_int.h"
2545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
2645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "config.h"
2745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
2845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#define LOG_TAG "NfcAdaptation"
2945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
3045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuextern "C" void GKI_shutdown();
3145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuextern void resetConfig();
3245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
3345faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuNfcAdaptation* NfcAdaptation::mpInstance = NULL;
3445faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuThreadMutex NfcAdaptation::sLock;
35eb190654c5fbaea2f396bb5523f57062f291879aEvan Chunfc_nci_device_t* NfcAdaptation::mHalDeviceContext = NULL;
36eb190654c5fbaea2f396bb5523f57062f291879aEvan ChutHAL_NFC_CBACK* NfcAdaptation::mHalCallback = NULL;
37ba4c17ee1d31e1b9f396292711f1414d449dd361Evan ChutHAL_NFC_DATA_CBACK* NfcAdaptation::mHalDataCallback = NULL;
3845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
3963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn CoenenUINT32 ScrProtocolTraceFlag = SCR_PROTO_TRACE_ALL; //0x017F00;
4063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn CoenenUINT8 appl_trace_level = 0xff;
4163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenchar bcm_nfc_location[120];
4263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen
4345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
4445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
4545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    NfcAdaptation::NfcAdaptation()
4645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
4745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: class constructor
4845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
4945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
5045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
5145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
5245faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuNfcAdaptation::NfcAdaptation()
5345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
5445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
5545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
5645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
5745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
5845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    NfcAdaptation::~NfcAdaptation()
5945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
6045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: class destructor
6145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
6245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
6345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
6445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
6545faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuNfcAdaptation::~NfcAdaptation()
6645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
6745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    mpInstance = NULL;
6845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
6945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
7045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
7145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
7245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    NfcAdaptation::GetInstance()
7345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
7445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: access class singleton
7545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
7645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     pointer to the singleton object
7745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
7845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
7945faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuNfcAdaptation& NfcAdaptation::GetInstance()
8045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
8145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    AutoThreadMutex  a(sLock);
8245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
8345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (!mpInstance)
8445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        mpInstance = new NfcAdaptation;
8545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return *mpInstance;
8645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
8745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
8845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
8945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
9045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    NfcAdaptation::Initialize()
9145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
9245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: class initializer
9345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
9445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
9545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
9645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
9745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid NfcAdaptation::Initialize ()
9845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
9945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    const char* func = "NfcAdaptation::Initialize";
10045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    ALOGD("%s: enter\n", func);
10163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    unsigned long num;
10245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
10363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    if ( !GetStrValue ( NAME_NFA_STORAGE, bcm_nfc_location, sizeof ( bcm_nfc_location ) ) )
104ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu        strcpy ( bcm_nfc_location, "/data/nfc" );
105e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    if ( GetNumValue ( NAME_PROTOCOL_TRACE_LEVEL, &num, sizeof ( num ) ) )
10663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        ScrProtocolTraceFlag = num;
107e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    initializeGlobalAppLogLevel ();
10845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
10945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    GKI_init ();
11045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    GKI_enable ();
11145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    GKI_create_task ((TASKPTR)NFCA_TASK, BTU_TASK, (INT8*)"NFCA_TASK", 0, 0, (pthread_cond_t*)NULL, NULL);
11245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
11345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        AutoThreadMutex guard(mCondVar);
11445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        GKI_create_task ((TASKPTR)Thread, MMI_TASK, (INT8*)"NFCA_THREAD", 0, 0, (pthread_cond_t*)NULL, NULL);
11545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        mCondVar.wait();
11645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
117eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
118eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    mHalDeviceContext = NULL;
119eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    mHalCallback =  NULL;
120eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    memset (&mHalEntryFuncs, 0, sizeof(mHalEntryFuncs));
121eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    InitializeHalDeviceContext ();
12245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    ALOGD ("%s: exit", func);
12345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
12445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
12545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
12645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
12745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    NfcAdaptation::Finalize()
12845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
12945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: class finalizer
13045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
13145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
13245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
13345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
13445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid NfcAdaptation::Finalize()
13545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
136eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    const char* func = "NfcAdaptation::Finalize";
13745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    AutoThreadMutex  a(sLock);
13845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
139eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    ALOGD ("%s: enter", func);
14045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    GKI_shutdown ();
14145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
14245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    resetConfig();
143eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
144eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    nfc_nci_close(mHalDeviceContext); //close the HAL's device context
145eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    mHalDeviceContext = NULL;
146eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    mHalCallback = NULL;
147eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    memset (&mHalEntryFuncs, 0, sizeof(mHalEntryFuncs));
148eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
149eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    ALOGD ("%s: exit", func);
15045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    delete this;
15145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
15245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
15345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
15445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
15545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    NfcAdaptation::signal()
15645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
15745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: signal the CondVar to release the thread that is waiting
15845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
15945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
16045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
16145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
16245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid NfcAdaptation::signal ()
16345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
16445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    mCondVar.signal();
16545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
16645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
16745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
16845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
16945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    NfcAdaptation::NFCA_TASK()
17045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
17145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: NFCA_TASK runs the GKI main task
17245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
17345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
17445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
17545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
17645faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuUINT32 NfcAdaptation::NFCA_TASK (UINT32 arg)
17745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
178eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    const char* func = "NfcAdaptation::NFCA_TASK";
179eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    ALOGD ("%s: enter", func);
18045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    GKI_run (0);
181eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    ALOGD ("%s: exit", func);
18245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return NULL;
18345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
18445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
18545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
18645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
18745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    NfcAdaptation::Thread()
18845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
18945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: Creates work threads
19045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
19145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
19245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
19345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
19445faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuUINT32 NfcAdaptation::Thread (UINT32 arg)
19545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
196eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    const char* func = "NfcAdaptation::Thread";
19763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    unsigned long num;
19863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    char temp[120];
199eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    ALOGD ("%s: enter", func);
20063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen
20163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    {
202eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        ThreadCondVar    CondVar;
203eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        AutoThreadMutex  guard(CondVar);
204eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        GKI_create_task ((TASKPTR)nfc_task, NFC_TASK, (INT8*)"NFC_TASK", 0, 0, (pthread_cond_t*)CondVar, (pthread_mutex_t*)CondVar);
205eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        CondVar.wait();
20663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    }
20763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen
208eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    NfcAdaptation::GetInstance().signal();
209eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
210eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    GKI_exit_task (GKI_get_taskid ());
211eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    ALOGD ("%s: exit", func);
212eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    return NULL;
213eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
214eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
215eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
216eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
217eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function:    NfcAdaptation::GetHalEntryFuncs()
218eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
219eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description: Get the set of HAL entry points.
220eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
221eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns:     Functions pointers for HAL entry points.
222eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
223eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
224eb190654c5fbaea2f396bb5523f57062f291879aEvan ChutHAL_NFC_ENTRY* NfcAdaptation::GetHalEntryFuncs ()
225eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
226eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    return &mHalEntryFuncs;
227eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
228eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
229eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
230eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
231eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function:    NfcAdaptation::InitializeHalDeviceContext
232eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
233eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description: Ask the generic Android HAL to find the Broadcom-specific HAL.
234eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
235eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns:     None.
236eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
237eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
238eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid NfcAdaptation::InitializeHalDeviceContext ()
239eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
240eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    const char* func = "NfcAdaptation::InitializeHalDeviceContext";
241eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    ALOGD ("%s: enter", func);
242eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    int ret = 0; //0 means success
243eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    const hw_module_t* hw_module = NULL;
244eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
245eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    mHalEntryFuncs.initialize = HalInitialize;
246eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    mHalEntryFuncs.terminate = HalTerminate;
247eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    mHalEntryFuncs.open = HalOpen;
248eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    mHalEntryFuncs.close = HalClose;
249eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    mHalEntryFuncs.core_initialized = HalCoreInitialized;
250eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    mHalEntryFuncs.write = HalWrite;
251eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    mHalEntryFuncs.prediscover = HalPrediscover;
252eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    mHalEntryFuncs.control_granted = HalControlGranted;
253eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    mHalEntryFuncs.power_cycle = HalPowerCycle;
254eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
255eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    ret = hw_get_module (NFC_NCI_HARDWARE_MODULE_ID, &hw_module);
256eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (ret == 0)
25763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    {
258eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        ret = nfc_nci_open (hw_module, &mHalDeviceContext);
259eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        if (ret != 0)
260eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu            ALOGE ("%s: nfc_nci_open fail", func);
26163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    }
262eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    else
263eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        ALOGE ("%s: fail hw_get_module", func);
264eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    ALOGD ("%s: exit", func);
265eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
266eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
267eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
268eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
269eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function:    NfcAdaptation::HalInitialize
270eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
271eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description: Not implemented because this function is only needed
272eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**              within the HAL.
273eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
274eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns:     None.
275eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
276eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
277eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid NfcAdaptation::HalInitialize ()
278eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
279eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    const char* func = "NfcAdaptation::HalInitialize";
280eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    ALOGD ("%s", func);
281eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
282eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
283eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
284eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
285eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function:    NfcAdaptation::HalTerminate
286eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
287eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description: Not implemented because this function is only needed
288eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**              within the HAL.
289eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
290eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns:     None.
291eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
292eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
293eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid NfcAdaptation::HalTerminate ()
294eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
295eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    const char* func = "NfcAdaptation::HalTerminate";
296eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    ALOGD ("%s", func);
297eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
298eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
299eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
300eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
301eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function:    NfcAdaptation::HalOpen
302eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
303eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description: Turn on controller, download firmware.
304eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
305eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns:     None.
306eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
307eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
308ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chuvoid NfcAdaptation::HalOpen (tHAL_NFC_CBACK *p_hal_cback, tHAL_NFC_DATA_CBACK* p_data_cback)
309eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
310eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    const char* func = "NfcAdaptation::HalOpen";
311eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    ALOGD ("%s", func);
312eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (mHalDeviceContext)
31363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    {
314eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        mHalCallback = p_hal_cback;
315ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu        mHalDataCallback = p_data_cback;
316ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu        mHalDeviceContext->open (mHalDeviceContext, HalDeviceContextCallback, HalDeviceContextDataCallback);
31763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    }
318eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
31963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen
320eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
321eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
322eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function:    NfcAdaptation::HalClose
323eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
324eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description: Turn off controller.
325eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
326eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns:     None.
327eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
328eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
329eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid NfcAdaptation::HalClose ()
330eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
331eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    const char* func = "NfcAdaptation::HalClose";
332eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    ALOGD ("%s", func);
333eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (mHalDeviceContext)
33463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    {
335eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        mHalDeviceContext->close (mHalDeviceContext);
33663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    }
337eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
33863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen
339eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
340eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
341eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function:    NfcAdaptation::HalDeviceContextCallback
342eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
343eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description: Translate generic Android HAL's callback into Broadcom-specific
344eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**              callback function.
345eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
346eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns:     None.
347eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
348eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
349ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chuvoid NfcAdaptation::HalDeviceContextCallback (nfc_event_t event, nfc_status_t event_status)
350eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
351eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    const char* func = "NfcAdaptation::HalDeviceContextCallback";
352eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    ALOGD ("%s: event=%u", func, event);
353eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (mHalCallback)
354ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu        mHalCallback (event, (tHAL_NFC_STATUS) event_status);
355ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu}
356ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu
357ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu/*******************************************************************************
358ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu**
359ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu** Function:    NfcAdaptation::HalDeviceContextDataCallback
360ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu**
361ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu** Description: Translate generic Android HAL's callback into Broadcom-specific
362ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu**              callback function.
363ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu**
364ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu** Returns:     None.
365ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu**
366ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu*******************************************************************************/
367ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chuvoid NfcAdaptation::HalDeviceContextDataCallback (uint16_t data_len, uint8_t* p_data)
368ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu{
369ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu    const char* func = "NfcAdaptation::HalDeviceContextDataCallback";
370ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu    ALOGD ("%s: len=%u", func, data_len);
371ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu    if (mHalDataCallback)
372ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chu        mHalDataCallback (data_len, p_data);
373eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
374eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
375eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
376eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
377eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function:    NfcAdaptation::HalWrite
378eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
379eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description: Write NCI message to the controller.
380eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
381eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns:     None.
382eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
383eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
384eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid NfcAdaptation::HalWrite (UINT16 data_len, UINT8* p_data)
385eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
386eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    const char* func = "NfcAdaptation::HalWrite";
387eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    ALOGD ("%s", func);
388eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (mHalDeviceContext)
38963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    {
390eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        mHalDeviceContext->write (mHalDeviceContext, data_len, p_data);
39163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    }
392eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
393eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
394eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
395eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
396eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function:    NfcAdaptation::HalCoreInitialized
397eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
398eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description: Adjust the configurable parameters in the controller.
399eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
400eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns:     None.
401eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
402eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
403eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid NfcAdaptation::HalCoreInitialized (UINT8* p_core_init_rsp_params)
404eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
405eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    const char* func = "NfcAdaptation::HalCoreInitialized";
406eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    ALOGD ("%s", func);
407eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (mHalDeviceContext)
40863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    {
409eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        mHalDeviceContext->core_initialized (mHalDeviceContext, p_core_init_rsp_params);
41063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    }
411eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
41245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
413eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
414eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
415eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function:    NfcAdaptation::HalPrediscover
416eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
417eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description:     Perform any vendor-specific pre-discovery actions (if needed)
418eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  If any actions were performed TRUE will be returned, and
419eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  HAL_PRE_DISCOVER_CPLT_EVT will notify when actions are
420eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  completed.
421eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
422eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns:          TRUE if vendor-specific pre-discovery actions initialized
423eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  FALSE if no vendor-specific pre-discovery actions are needed.
424eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
425eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
426eb190654c5fbaea2f396bb5523f57062f291879aEvan ChuBOOLEAN NfcAdaptation::HalPrediscover ()
427eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
428eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    const char* func = "NfcAdaptation::HalPrediscover";
429eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    ALOGD ("%s", func);
430eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    BOOLEAN retval = FALSE;
43145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
432eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (mHalDeviceContext)
43345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
434eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        mHalDeviceContext->pre_discover (mHalDeviceContext);
43545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
436eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    return retval;
437eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
438eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu
439eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
440eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
441eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function:        HAL_NfcControlGranted
442eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
443eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description:     Grant control to HAL control for sending NCI commands.
444eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  Call in response to HAL_REQUEST_CONTROL_EVT.
445eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  Must only be called when there are no NCI commands pending.
446eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  HAL_RELEASE_CONTROL_EVT will notify when HAL no longer
447eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**                  needs control of NCI.
448eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
449eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns:         void
450eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
451eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
452eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid NfcAdaptation::HalControlGranted ()
453eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
454eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    const char* func = "NfcAdaptation::HalControlGranted";
455eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    ALOGD ("%s", func);
456eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (mHalDeviceContext)
45745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
458eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        mHalDeviceContext->control_granted (mHalDeviceContext);
45945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
460eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}
46145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
462eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/*******************************************************************************
463eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
464eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function:    NfcAdaptation::HalPowerCycle
465eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
466eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description: Turn off and turn on the controller.
467eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
468eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns:     None.
469eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu**
470eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/
471eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid NfcAdaptation::HalPowerCycle ()
472eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{
473eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    const char* func = "NfcAdaptation::HalPowerCycle";
474eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    ALOGD ("%s", func);
475eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    if (mHalDeviceContext)
476eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    {
477eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu        mHalDeviceContext->power_cycle (mHalDeviceContext);
478eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu    }
47945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
48045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
48145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
48245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
48345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    ThreadMutex::ThreadMutex()
48445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
48545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: class constructor
48645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
48745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
48845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
48945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
49045faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuThreadMutex::ThreadMutex()
49145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
49245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    pthread_mutexattr_t mutexAttr;
49345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
49445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    pthread_mutexattr_init(&mutexAttr);
49545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    pthread_mutex_init(&mMutex, &mutexAttr);
49645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    pthread_mutexattr_destroy(&mutexAttr);
49745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
49845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
49945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
50045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
50145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    ThreadMutex::~ThreadMutex()
50245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
50345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: class destructor
50445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
50545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
50645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
50745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
50845faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuThreadMutex::~ThreadMutex()
50945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
51045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    pthread_mutex_destroy(&mMutex);
51145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
51245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
51345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
51445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
51545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    ThreadMutex::lock()
51645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
51745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: lock kthe mutex
51845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
51945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
52045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
52145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
52245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid ThreadMutex::lock()
52345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
52445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    pthread_mutex_lock(&mMutex);
52545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
52645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
52745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
52845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
52945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    ThreadMutex::unblock()
53045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
53145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: unlock the mutex
53245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
53345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
53445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
53545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
53645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid ThreadMutex::unlock()
53745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
53845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    pthread_mutex_unlock(&mMutex);
53945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
54045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
54145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
54245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
54345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    ThreadCondVar::ThreadCondVar()
54445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
54545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: class constructor
54645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
54745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
54845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
54945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
55045faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuThreadCondVar::ThreadCondVar()
55145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
55245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    pthread_condattr_t CondAttr;
55345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
55445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    pthread_condattr_init(&CondAttr);
55545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    pthread_cond_init(&mCondVar, &CondAttr);
55645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
55745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    pthread_condattr_destroy(&CondAttr);
55845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
55945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
56045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
56145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
56245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    ThreadCondVar::~ThreadCondVar()
56345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
56445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: class destructor
56545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
56645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
56745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
56845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
56945faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuThreadCondVar::~ThreadCondVar()
57045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
57145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    pthread_cond_destroy(&mCondVar);
57245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
57345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
57445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
57545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
57645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    ThreadCondVar::wait()
57745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
57845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: wait on the mCondVar
57945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
58045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
58145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
58245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
58345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid ThreadCondVar::wait()
58445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
58545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    pthread_cond_wait(&mCondVar, *this);
58645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    pthread_mutex_unlock(*this);
58745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
58845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
58945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
59045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
59145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    ThreadCondVar::signal()
59245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
59345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: signal the mCondVar
59445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
59545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
59645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
59745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
59845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid ThreadCondVar::signal()
59945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
60045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    AutoThreadMutex  a(*this);
60145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    pthread_cond_signal(&mCondVar);
60245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
60345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
60445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
60545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
60645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    AutoThreadMutex::AutoThreadMutex()
60745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
60845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: class constructor, automatically lock the mutex
60945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
61045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
61145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
61245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
61345faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuAutoThreadMutex::AutoThreadMutex(ThreadMutex &m)
61445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    : mm(m)
61545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
61645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    mm.lock();
61745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
61845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
61945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
62045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
62145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    AutoThreadMutex::~AutoThreadMutex()
62245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
62345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: class destructor, automatically unlock the mutex
62445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
62545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
62645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
62745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
62845faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuAutoThreadMutex::~AutoThreadMutex()
62945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
63045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    mm.unlock();
63145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
632