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