1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Copyright (C) 1999-2012 Broadcom Corporation
4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  you may not use this file except in compliance with the License.
7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  You may obtain a copy of the License at:
8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  See the License for the specific language governing permissions and
15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  limitations under the License.
16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "OverrideLog.h"
19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "NfcAdaptation.h"
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern "C"
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    #include "gki.h"
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    #include "nfa_api.h"
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    #include "nfc_int.h"
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "config.h"
27a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#include "android_logmsg.h"
28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define LOG_TAG "NfcAdaptation"
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern "C" void GKI_shutdown();
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern void resetConfig();
33edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chuextern "C" void verify_stack_non_volatile_store ();
34edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chuextern "C" void delete_stack_non_volatile_store (BOOLEAN forceDelete);
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectNfcAdaptation* NfcAdaptation::mpInstance = NULL;
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectThreadMutex NfcAdaptation::sLock;
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectnfc_nci_device_t* NfcAdaptation::mHalDeviceContext = NULL;
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttHAL_NFC_CBACK* NfcAdaptation::mHalCallback = NULL;
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttHAL_NFC_DATA_CBACK* NfcAdaptation::mHalDataCallback = NULL;
415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn CoenenThreadCondVar NfcAdaptation::mHalOpenCompletedEvent;
425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn CoenenThreadCondVar NfcAdaptation::mHalCloseCompletedEvent;
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT32 ScrProtocolTraceFlag = SCR_PROTO_TRACE_ALL; //0x017F00;
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8 appl_trace_level = 0xff;
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectchar bcm_nfc_location[120];
47077f48fc39770c8db3cdc27ba65c2f12299199ddMartijn Coenenchar nci_hal_module[64];
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic UINT8 nfa_dm_cfg[sizeof ( tNFA_DM_CFG ) ];
505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenextern tNFA_DM_CFG *p_nfa_dm_cfg;
515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenextern UINT8 nfa_ee_max_ee_cfg;
520976d37081fae8bcd4fc4dcf7996e1ce194fb4b1Evan Chuextern const UINT8  nfca_version_string [];
530976d37081fae8bcd4fc4dcf7996e1ce194fb4b1Evan Chuextern const UINT8  nfa_version_string [];
54b7cb567fb2a69c4f8afbb5c5f819e2390ba6424dEvan Chustatic UINT8 deviceHostWhiteList [NFA_HCI_MAX_HOST_IN_NETWORK];
55b7cb567fb2a69c4f8afbb5c5f819e2390ba6424dEvan Chustatic tNFA_HCI_CFG jni_nfa_hci_cfg;
56b7cb567fb2a69c4f8afbb5c5f819e2390ba6424dEvan Chuextern tNFA_HCI_CFG *p_nfa_hci_cfg;
575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    NfcAdaptation::NfcAdaptation()
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: class constructor
63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectNfcAdaptation::NfcAdaptation()
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
691569641423dac0a41af7596fdef972126e698f46Evan Chu    memset (&mHalEntryFuncs, 0, sizeof(mHalEntryFuncs));
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    NfcAdaptation::~NfcAdaptation()
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: class destructor
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectNfcAdaptation::~NfcAdaptation()
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    mpInstance = NULL;
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    NfcAdaptation::GetInstance()
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: access class singleton
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     pointer to the singleton object
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectNfcAdaptation& NfcAdaptation::GetInstance()
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    AutoThreadMutex  a(sLock);
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!mpInstance)
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        mpInstance = new NfcAdaptation;
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return *mpInstance;
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    NfcAdaptation::Initialize()
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: class initializer
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid NfcAdaptation::Initialize ()
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const char* func = "NfcAdaptation::Initialize";
1160976d37081fae8bcd4fc4dcf7996e1ce194fb4b1Evan Chu    ALOGD("%s: enter", func);
1170976d37081fae8bcd4fc4dcf7996e1ce194fb4b1Evan Chu    ALOGE("%s: ver=%s nfa=%s", func, nfca_version_string, nfa_version_string);
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    unsigned long num;
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
120a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    if ( GetNumValue ( NAME_USE_RAW_NCI_TRACE, &num, sizeof ( num ) ) )
121a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    {
122a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        if (num == 1)
123a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        {
124a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            // display protocol traces in raw format
125a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            ProtoDispAdapterUseRawOutput (TRUE);
126a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            ALOGD("%s: logging protocol in raw format", func);
127a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        }
128a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    }
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ( !GetStrValue ( NAME_NFA_STORAGE, bcm_nfc_location, sizeof ( bcm_nfc_location ) ) )
130d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu    {
131077f48fc39770c8db3cdc27ba65c2f12299199ddMartijn Coenen        strlcpy (bcm_nfc_location, "/data/nfc", sizeof(bcm_nfc_location));
132d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu    }
133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ( GetNumValue ( NAME_PROTOCOL_TRACE_LEVEL, &num, sizeof ( num ) ) )
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ScrProtocolTraceFlag = num;
1355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if ( GetStrValue ( NAME_NFA_DM_CFG, (char*)nfa_dm_cfg, sizeof ( nfa_dm_cfg ) ) )
1375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        p_nfa_dm_cfg = ( tNFA_DM_CFG * ) &nfa_dm_cfg[0];
1385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if ( GetNumValue ( NAME_NFA_MAX_EE_SUPPORTED, &num, sizeof ( num ) ) )
1405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
1415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfa_ee_max_ee_cfg = num;
1425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        ALOGD("%s: Overriding NFA_EE_MAX_EE_SUPPORTED to use %d", func, nfa_ee_max_ee_cfg);
1435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
1445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
145b7cb567fb2a69c4f8afbb5c5f819e2390ba6424dEvan Chu    //configure device host whitelist of HCI host ID's; see specification ETSI TS 102 622 V11.1.10
146b7cb567fb2a69c4f8afbb5c5f819e2390ba6424dEvan Chu    //(2012-10), section 6.1.3.1
147b7cb567fb2a69c4f8afbb5c5f819e2390ba6424dEvan Chu    num = GetStrValue ( NAME_DEVICE_HOST_WHITE_LIST, (char*) deviceHostWhiteList, sizeof ( deviceHostWhiteList ) );
148b7cb567fb2a69c4f8afbb5c5f819e2390ba6424dEvan Chu    if (num)
149b7cb567fb2a69c4f8afbb5c5f819e2390ba6424dEvan Chu    {
150b7cb567fb2a69c4f8afbb5c5f819e2390ba6424dEvan Chu        memmove (&jni_nfa_hci_cfg, p_nfa_hci_cfg, sizeof(jni_nfa_hci_cfg));
151b7cb567fb2a69c4f8afbb5c5f819e2390ba6424dEvan Chu        jni_nfa_hci_cfg.num_whitelist_host = (UINT8) num; //number of HCI host ID's in the whitelist
152b7cb567fb2a69c4f8afbb5c5f819e2390ba6424dEvan Chu        jni_nfa_hci_cfg.p_whitelist = deviceHostWhiteList; //array of HCI host ID's
153b7cb567fb2a69c4f8afbb5c5f819e2390ba6424dEvan Chu        p_nfa_hci_cfg = &jni_nfa_hci_cfg;
154b7cb567fb2a69c4f8afbb5c5f819e2390ba6424dEvan Chu    }
155b7cb567fb2a69c4f8afbb5c5f819e2390ba6424dEvan Chu
156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    initializeGlobalAppLogLevel ();
157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1585a7e857aee2ebba4e369936aa5acdc7bcecf83e7Evan Chu    verify_stack_non_volatile_store ();
1595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if ( GetNumValue ( NAME_PRESERVE_STORAGE, (char*)&num, sizeof ( num ) ) &&
1605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            (num == 1) )
1615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        ALOGD ("%s: preserve stack NV store", __FUNCTION__);
1625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    else
163edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    {
164edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        delete_stack_non_volatile_store (FALSE);
165edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    }
1665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GKI_init ();
168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GKI_enable ();
169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GKI_create_task ((TASKPTR)NFCA_TASK, BTU_TASK, (INT8*)"NFCA_TASK", 0, 0, (pthread_cond_t*)NULL, NULL);
170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        AutoThreadMutex guard(mCondVar);
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_create_task ((TASKPTR)Thread, MMI_TASK, (INT8*)"NFCA_THREAD", 0, 0, (pthread_cond_t*)NULL, NULL);
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        mCondVar.wait();
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    mHalDeviceContext = NULL;
177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    mHalCallback =  NULL;
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    memset (&mHalEntryFuncs, 0, sizeof(mHalEntryFuncs));
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    InitializeHalDeviceContext ();
180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: exit", func);
181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    NfcAdaptation::Finalize()
186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: class finalizer
188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid NfcAdaptation::Finalize()
193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const char* func = "NfcAdaptation::Finalize";
195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    AutoThreadMutex  a(sLock);
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: enter", func);
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GKI_shutdown ();
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    resetConfig();
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfc_nci_close(mHalDeviceContext); //close the HAL's device context
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    mHalDeviceContext = NULL;
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    mHalCallback = NULL;
205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    memset (&mHalEntryFuncs, 0, sizeof(mHalEntryFuncs));
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: exit", func);
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    delete this;
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    NfcAdaptation::signal()
214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: signal the CondVar to release the thread that is waiting
216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid NfcAdaptation::signal ()
221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    mCondVar.signal();
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    NfcAdaptation::NFCA_TASK()
228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: NFCA_TASK runs the GKI main task
230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT32 NfcAdaptation::NFCA_TASK (UINT32 arg)
235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const char* func = "NfcAdaptation::NFCA_TASK";
237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: enter", func);
238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GKI_run (0);
239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: exit", func);
2400a85f658ebd49b72be39fe0fb61fcca4ee0fbc82Martijn Coenen    return 0;
241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    NfcAdaptation::Thread()
246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Creates work threads
248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT32 NfcAdaptation::Thread (UINT32 arg)
253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const char* func = "NfcAdaptation::Thread";
255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: enter", func);
256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ThreadCondVar    CondVar;
259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        AutoThreadMutex  guard(CondVar);
260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_create_task ((TASKPTR)nfc_task, NFC_TASK, (INT8*)"NFC_TASK", 0, 0, (pthread_cond_t*)CondVar, (pthread_mutex_t*)CondVar);
261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CondVar.wait();
262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NfcAdaptation::GetInstance().signal();
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GKI_exit_task (GKI_get_taskid ());
267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: exit", func);
2680a85f658ebd49b72be39fe0fb61fcca4ee0fbc82Martijn Coenen    return 0;
269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    NfcAdaptation::GetHalEntryFuncs()
274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Get the set of HAL entry points.
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     Functions pointers for HAL entry points.
278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttHAL_NFC_ENTRY* NfcAdaptation::GetHalEntryFuncs ()
281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return &mHalEntryFuncs;
283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    NfcAdaptation::InitializeHalDeviceContext
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Ask the generic Android HAL to find the Broadcom-specific HAL.
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     None.
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid NfcAdaptation::InitializeHalDeviceContext ()
295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const char* func = "NfcAdaptation::InitializeHalDeviceContext";
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: enter", func);
298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int ret = 0; //0 means success
299077f48fc39770c8db3cdc27ba65c2f12299199ddMartijn Coenen    if ( !GetStrValue ( NAME_NCI_HAL_MODULE, nci_hal_module, sizeof ( nci_hal_module) ) )
300077f48fc39770c8db3cdc27ba65c2f12299199ddMartijn Coenen    {
301077f48fc39770c8db3cdc27ba65c2f12299199ddMartijn Coenen        ALOGE("No HAL module specified in config, falling back to BCM2079x");
302077f48fc39770c8db3cdc27ba65c2f12299199ddMartijn Coenen        strlcpy (nci_hal_module, "nfc_nci.bcm2079x", sizeof(nci_hal_module));
303077f48fc39770c8db3cdc27ba65c2f12299199ddMartijn Coenen    }
304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const hw_module_t* hw_module = NULL;
305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    mHalEntryFuncs.initialize = HalInitialize;
307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    mHalEntryFuncs.terminate = HalTerminate;
308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    mHalEntryFuncs.open = HalOpen;
309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    mHalEntryFuncs.close = HalClose;
310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    mHalEntryFuncs.core_initialized = HalCoreInitialized;
311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    mHalEntryFuncs.write = HalWrite;
312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    mHalEntryFuncs.prediscover = HalPrediscover;
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    mHalEntryFuncs.control_granted = HalControlGranted;
314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    mHalEntryFuncs.power_cycle = HalPowerCycle;
315b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson    mHalEntryFuncs.get_max_ee = HalGetMaxNfcee;
316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
317077f48fc39770c8db3cdc27ba65c2f12299199ddMartijn Coenen    ret = hw_get_module (nci_hal_module, &hw_module);
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (ret == 0)
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ret = nfc_nci_open (hw_module, &mHalDeviceContext);
321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (ret != 0)
322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGE ("%s: nfc_nci_open fail", func);
323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
325077f48fc39770c8db3cdc27ba65c2f12299199ddMartijn Coenen        ALOGE ("%s: fail hw_get_module %s", func, nci_hal_module);
326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: exit", func);
327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    NfcAdaptation::HalInitialize
332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Not implemented because this function is only needed
334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**              within the HAL.
335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     None.
337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid NfcAdaptation::HalInitialize ()
340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const char* func = "NfcAdaptation::HalInitialize";
342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s", func);
343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    NfcAdaptation::HalTerminate
348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Not implemented because this function is only needed
350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**              within the HAL.
351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     None.
353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid NfcAdaptation::HalTerminate ()
356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const char* func = "NfcAdaptation::HalTerminate";
358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s", func);
359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    NfcAdaptation::HalOpen
364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Turn on controller, download firmware.
366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     None.
368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid NfcAdaptation::HalOpen (tHAL_NFC_CBACK *p_hal_cback, tHAL_NFC_DATA_CBACK* p_data_cback)
371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const char* func = "NfcAdaptation::HalOpen";
373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s", func);
374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (mHalDeviceContext)
375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        mHalCallback = p_hal_cback;
377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        mHalDataCallback = p_data_cback;
378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        mHalDeviceContext->open (mHalDeviceContext, HalDeviceContextCallback, HalDeviceContextDataCallback);
379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    NfcAdaptation::HalClose
385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Turn off controller.
387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     None.
389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid NfcAdaptation::HalClose ()
392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const char* func = "NfcAdaptation::HalClose";
394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s", func);
395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (mHalDeviceContext)
396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        mHalDeviceContext->close (mHalDeviceContext);
398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    NfcAdaptation::HalDeviceContextCallback
404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Translate generic Android HAL's callback into Broadcom-specific
406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**              callback function.
407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     None.
409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid NfcAdaptation::HalDeviceContextCallback (nfc_event_t event, nfc_status_t event_status)
412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const char* func = "NfcAdaptation::HalDeviceContextCallback";
414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: event=%u", func, event);
415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (mHalCallback)
416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        mHalCallback (event, (tHAL_NFC_STATUS) event_status);
417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    NfcAdaptation::HalDeviceContextDataCallback
422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Translate generic Android HAL's callback into Broadcom-specific
424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**              callback function.
425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     None.
427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid NfcAdaptation::HalDeviceContextDataCallback (uint16_t data_len, uint8_t* p_data)
430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const char* func = "NfcAdaptation::HalDeviceContextDataCallback";
432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: len=%u", func, data_len);
433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (mHalDataCallback)
434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        mHalDataCallback (data_len, p_data);
435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    NfcAdaptation::HalWrite
440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Write NCI message to the controller.
442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     None.
444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid NfcAdaptation::HalWrite (UINT16 data_len, UINT8* p_data)
447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const char* func = "NfcAdaptation::HalWrite";
449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s", func);
450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (mHalDeviceContext)
451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        mHalDeviceContext->write (mHalDeviceContext, data_len, p_data);
453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    NfcAdaptation::HalCoreInitialized
459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Adjust the configurable parameters in the controller.
461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     None.
463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid NfcAdaptation::HalCoreInitialized (UINT8* p_core_init_rsp_params)
466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const char* func = "NfcAdaptation::HalCoreInitialized";
468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s", func);
469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (mHalDeviceContext)
470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        mHalDeviceContext->core_initialized (mHalDeviceContext, p_core_init_rsp_params);
472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    NfcAdaptation::HalPrediscover
478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description:     Perform any vendor-specific pre-discovery actions (if needed)
480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  If any actions were performed TRUE will be returned, and
481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  HAL_PRE_DISCOVER_CPLT_EVT will notify when actions are
482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  completed.
483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:          TRUE if vendor-specific pre-discovery actions initialized
485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  FALSE if no vendor-specific pre-discovery actions are needed.
486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN NfcAdaptation::HalPrediscover ()
489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const char* func = "NfcAdaptation::HalPrediscover";
491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s", func);
492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BOOLEAN retval = FALSE;
493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (mHalDeviceContext)
495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
49645e68232b8524aca5165dca28b994ec8c11593b1Evan Chu        retval = mHalDeviceContext->pre_discover (mHalDeviceContext);
497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return retval;
499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:        HAL_NfcControlGranted
504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description:     Grant control to HAL control for sending NCI commands.
506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Call in response to HAL_REQUEST_CONTROL_EVT.
507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Must only be called when there are no NCI commands pending.
508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  HAL_RELEASE_CONTROL_EVT will notify when HAL no longer
509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  needs control of NCI.
510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:         void
512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid NfcAdaptation::HalControlGranted ()
515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const char* func = "NfcAdaptation::HalControlGranted";
517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s", func);
518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (mHalDeviceContext)
519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        mHalDeviceContext->control_granted (mHalDeviceContext);
521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    NfcAdaptation::HalPowerCycle
527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Turn off and turn on the controller.
529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     None.
531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid NfcAdaptation::HalPowerCycle ()
534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const char* func = "NfcAdaptation::HalPowerCycle";
536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s", func);
537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (mHalDeviceContext)
538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        mHalDeviceContext->power_cycle (mHalDeviceContext);
540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
543b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson/*******************************************************************************
544b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson**
545b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson** Function:    NfcAdaptation::HalGetMaxNfcee
546b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson**
547b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson** Description: Turn off and turn on the controller.
548b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson**
549b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson** Returns:     None.
550b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson**
551b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson*******************************************************************************/
552b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul ChaissonUINT8 NfcAdaptation::HalGetMaxNfcee()
553b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson{
554b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson    const char* func = "NfcAdaptation::HalPowerCycle";
555b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson    UINT8 maxNfcee = 0;
556a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    ALOGD ("%s", func);
557b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson    if (mHalDeviceContext)
558b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson    {
559b4b1c46fa5346651a3554c83eb5005f942f1af0fMartijn Coenen        // TODO maco call into HAL when we figure out binary compatibility.
560b4b1c46fa5346651a3554c83eb5005f942f1af0fMartijn Coenen        return nfa_ee_max_ee_cfg;
561a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
562a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        //mHalDeviceContext->get_max_ee (mHalDeviceContext, &maxNfcee);
563b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson    }
564b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson
565b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson    return maxNfcee;
566b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson}
5675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
568a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
5695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
5705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
5715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function:    NfcAdaptation::DownloadFirmware
5725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
5735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description: Download firmware patch files.
5745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
5755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns:     None.
5765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
5775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
5785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenvoid NfcAdaptation::DownloadFirmware ()
5795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{
5805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    const char* func = "NfcAdaptation::DownloadFirmware";
5815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    ALOGD ("%s: enter", func);
5825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    HalInitialize ();
5835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
5845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    mHalOpenCompletedEvent.lock ();
5855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    ALOGD ("%s: try open HAL", func);
5865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    HalOpen (HalDownloadFirmwareCallback, HalDownloadFirmwareDataCallback);
5875c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    mHalOpenCompletedEvent.wait ();
5885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
5895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    mHalCloseCompletedEvent.lock ();
5905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    ALOGD ("%s: try close HAL", func);
5915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    HalClose ();
5925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    mHalCloseCompletedEvent.wait ();
5935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
5945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    HalTerminate ();
5955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    ALOGD ("%s: exit", func);
5965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
5975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
5985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
5995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
6005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function:    NfcAdaptation::HalDownloadFirmwareCallback
6015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
6025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description: Receive events from the HAL.
6035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
6045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns:     None.
6055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
6065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
6075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenvoid NfcAdaptation::HalDownloadFirmwareCallback (nfc_event_t event, nfc_status_t event_status)
6085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{
6095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    const char* func = "NfcAdaptation::HalDownloadFirmwareCallback";
6105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    ALOGD ("%s: event=0x%X", func, event);
6115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    switch (event)
6125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
6135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    case HAL_NFC_OPEN_CPLT_EVT:
6145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
6155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            ALOGD ("%s: HAL_NFC_OPEN_CPLT_EVT", func);
6165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            mHalOpenCompletedEvent.signal ();
6175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            break;
6185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
6195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    case HAL_NFC_CLOSE_CPLT_EVT:
6205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
6215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            ALOGD ("%s: HAL_NFC_CLOSE_CPLT_EVT", func);
6225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            mHalCloseCompletedEvent.signal ();
6235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            break;
6245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
6255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
6265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
6275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
6285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
6295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
6305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function:    NfcAdaptation::HalDownloadFirmwareDataCallback
6315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
6325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description: Receive data events from the HAL.
6335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
6345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns:     None.
6355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
6365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
6375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenvoid NfcAdaptation::HalDownloadFirmwareDataCallback (uint16_t data_len, uint8_t* p_data)
6385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{
6395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
6405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
6415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    ThreadMutex::ThreadMutex()
645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: class constructor
647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectThreadMutex::ThreadMutex()
652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pthread_mutexattr_t mutexAttr;
654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pthread_mutexattr_init(&mutexAttr);
656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pthread_mutex_init(&mMutex, &mutexAttr);
657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pthread_mutexattr_destroy(&mutexAttr);
658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    ThreadMutex::~ThreadMutex()
663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: class destructor
665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectThreadMutex::~ThreadMutex()
670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pthread_mutex_destroy(&mMutex);
672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    ThreadMutex::lock()
677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: lock kthe mutex
679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid ThreadMutex::lock()
684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pthread_mutex_lock(&mMutex);
686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    ThreadMutex::unblock()
691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: unlock the mutex
693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid ThreadMutex::unlock()
698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pthread_mutex_unlock(&mMutex);
700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    ThreadCondVar::ThreadCondVar()
705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: class constructor
707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectThreadCondVar::ThreadCondVar()
712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pthread_condattr_t CondAttr;
714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pthread_condattr_init(&CondAttr);
716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pthread_cond_init(&mCondVar, &CondAttr);
717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pthread_condattr_destroy(&CondAttr);
719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    ThreadCondVar::~ThreadCondVar()
724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: class destructor
726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectThreadCondVar::~ThreadCondVar()
731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pthread_cond_destroy(&mCondVar);
733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    ThreadCondVar::wait()
738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: wait on the mCondVar
740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid ThreadCondVar::wait()
745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pthread_cond_wait(&mCondVar, *this);
747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pthread_mutex_unlock(*this);
748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    ThreadCondVar::signal()
753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: signal the mCondVar
755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid ThreadCondVar::signal()
760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    AutoThreadMutex  a(*this);
762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    pthread_cond_signal(&mCondVar);
763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    AutoThreadMutex::AutoThreadMutex()
768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: class constructor, automatically lock the mutex
770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectAutoThreadMutex::AutoThreadMutex(ThreadMutex &m)
775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    : mm(m)
776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    mm.lock();
778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    AutoThreadMutex::~AutoThreadMutex()
783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: class destructor, automatically unlock the mutex
785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectAutoThreadMutex::~AutoThreadMutex()
790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    mm.unlock();
792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
793