HalAdaptation.cpp revision a5c7b4468b580946f0dd6ab73168071be5214ab3
1d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar/******************************************************************************
2d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar *
3d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar *  Copyright (C) 2012 Broadcom Corporation
4d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar *
5d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar *  Licensed under the Apache License, Version 2.0 (the "License");
6d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar *  you may not use this file except in compliance with the License.
7d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar *  You may obtain a copy of the License at:
8d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar *
9d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar *  http://www.apache.org/licenses/LICENSE-2.0
10d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar *
11d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar *  Unless required by applicable law or agreed to in writing, software
12d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar *  distributed under the License is distributed on an "AS IS" BASIS,
13d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar *  See the License for the specific language governing permissions and
15d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar *  limitations under the License.
16d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar *
17d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar ******************************************************************************/
18d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
19d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar/******************************************************************************
20d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar *
21d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar *  HAL Adaptation Interface (HAI). This interface regulates the interaction
22d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar *  between standard Android HAL and Broadcom-specific HAL.  It adapts
23d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar *  Broadcom-specific features to the Android framework.
24d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar *
25d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar ******************************************************************************/
26d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar#define LOG_TAG "NfcNciHal"
27d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar#include "OverrideLog.h"
28d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar#include "HalAdaptation.h"
29d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar#include "SyncEvent.h"
30d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar#include "config.h"
31d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar#include "nfc_hal_int.h"
32d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar#include "nfc_hal_post_reset.h"
33d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar#include <errno.h>
34d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar#include <pthread.h>
35d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar#include "buildcfg.h"
36d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar#include "android_logmsg.h"
37d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarextern void delete_hal_non_volatile_store (bool forceDelete);
38d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarextern void verify_hal_non_volatile_store ();
39d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarextern void resetConfig ();
40d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarextern "C"
41d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar{
42d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar#include "userial.h"
43d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar}
44d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
45d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarextern void configureCrystalFrequency ();
46d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
47d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar///////////////////////////////////////
48d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar// private declaration, definition
49d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
50d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
51d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarstatic nfc_stack_callback_t* gAndroidHalCallback = NULL;
52d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarstatic nfc_stack_data_callback_t* gAndroidHalDataCallback = NULL;
53d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarstatic SyncEvent gOpenCompletedEvent;
54d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarstatic SyncEvent gPostInitCompletedEvent;
55d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarstatic SyncEvent gCloseCompletedEvent;
56d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
57d6e59084d07500f68548652b8197325809a0c0c2Daniel DunbarUINT32 ScrProtocolTraceFlag = SCR_PROTO_TRACE_ALL; //0x017F00;
58d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
59d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarstatic void BroadcomHalCallback (UINT8 event, tHAL_NFC_STATUS status);
60d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarstatic void BroadcomHalDataCallback (UINT16 data_len, UINT8* p_data);
61d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
62d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarstatic bool isColdBoot = true;
63d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
64d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarextern tNFC_HAL_CFG *p_nfc_hal_cfg;
65d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarextern const UINT8  nfca_version_string [];
66d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarextern const UINT8  nfa_version_string [];
67d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
68d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar///////////////////////////////////////
69d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
70d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
71d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarint HaiInitializeLibrary (const bcm2079x_dev_t* device)
72d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar{
73d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: enter", __FUNCTION__);
74d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGE ("%s: ver=%s nfa=%s", __FUNCTION__, nfca_version_string, nfa_version_string);
75d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    int retval = EACCES;
76d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    unsigned long freq = 0;
77d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    unsigned long num = 0;
78d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    char temp[120];
79d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    UINT8 logLevel = 0;
80d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
81d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    logLevel = InitializeGlobalAppLogLevel ();
82d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
83d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    configureCrystalFrequency ();
84d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    verify_hal_non_volatile_store ();
85d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    if ( GetNumValue ( NAME_PRESERVE_STORAGE, (char*)&num, sizeof ( num ) ) &&
86d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            (num == 1) )
87d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        ALOGD ("%s: preserve HAL NV store", __FUNCTION__);
88d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    else
89d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    {
90d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        delete_hal_non_volatile_store (false);
91d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    }
92d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
93d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    if ( GetNumValue ( NAME_USE_RAW_NCI_TRACE, &num, sizeof ( num ) ) )
94d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    {
95d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        if (num == 1)
96d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        {
97d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            // display protocol traces in raw format
98d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            ProtoDispAdapterUseRawOutput (TRUE);
99d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        }
100d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    }
101d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
102d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    // Initialize protocol logging level
103d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    if ( GetNumValue ( NAME_PROTOCOL_TRACE_LEVEL, &num, sizeof ( num ) ) )
104d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        ScrProtocolTraceFlag = num;
105d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
106d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    tUSERIAL_OPEN_CFG cfg;
107d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    struct tUART_CONFIG  uart;
108d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
109d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    if ( GetStrValue ( NAME_UART_PARITY, temp, sizeof ( temp ) ) )
110d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    {
111d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        if ( strcmp ( temp, "even" ) == 0 )
112d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            uart.m_iParity = USERIAL_PARITY_EVEN;
113d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        else if ( strcmp ( temp, "odd" ) == 0 )
114d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            uart.m_iParity = USERIAL_PARITY_ODD;
115d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        else if ( strcmp ( temp, "none" ) == 0 )
116d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            uart.m_iParity = USERIAL_PARITY_NONE;
117d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    }
118d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    else
119d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        uart.m_iParity = USERIAL_PARITY_NONE;
120d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
121d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    if ( GetStrValue ( NAME_UART_STOPBITS, temp, sizeof ( temp ) ) )
122d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    {
123d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        if ( strcmp ( temp, "1" ) == 0 )
124d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            uart.m_iStopbits = USERIAL_STOPBITS_1;
125d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        else if ( strcmp ( temp, "2" ) == 0 )
126d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            uart.m_iStopbits = USERIAL_STOPBITS_2;
12744fa0473ae9144a8cfb4a500ae9de17239e69d2eDaniel Dunbar        else if ( strcmp ( temp, "1.5" ) == 0 )
128d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            uart.m_iStopbits = USERIAL_STOPBITS_1_5;
129d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    }
130d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    else if ( GetNumValue ( NAME_UART_STOPBITS, &num, sizeof ( num ) ) )
131d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    {
132d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        if ( num == 1 )
133d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            uart.m_iStopbits = USERIAL_STOPBITS_1;
134d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        else if ( num == 2 )
135d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            uart.m_iStopbits = USERIAL_STOPBITS_2;
136d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    }
137d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    else
138d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        uart.m_iStopbits = USERIAL_STOPBITS_1;
139d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
140d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    if ( GetNumValue ( NAME_UART_DATABITS, &num, sizeof ( num ) ) )
141d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    {
142d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        if ( 5 <= num && num <= 8 )
143d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            uart.m_iDatabits = ( 1 << ( num + 1 ) );
144d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    }
145d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    else
146d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        uart.m_iDatabits = USERIAL_DATABITS_8;
147d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
148d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    if ( GetNumValue ( NAME_UART_BAUD, &num, sizeof ( num ) ) )
149d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    {
150d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        if ( num == 300 ) uart.m_iBaudrate = USERIAL_BAUD_300;
151d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        else if ( num == 600 ) uart.m_iBaudrate = USERIAL_BAUD_600;
152d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        else if ( num == 1200 ) uart.m_iBaudrate = USERIAL_BAUD_1200;
153d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        else if ( num == 2400 ) uart.m_iBaudrate = USERIAL_BAUD_2400;
154d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        else if ( num == 9600 ) uart.m_iBaudrate = USERIAL_BAUD_9600;
155d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        else if ( num == 19200 ) uart.m_iBaudrate = USERIAL_BAUD_19200;
156d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        else if ( num == 57600 ) uart.m_iBaudrate = USERIAL_BAUD_57600;
157d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        else if ( num == 115200 ) uart.m_iBaudrate = USERIAL_BAUD_115200;
158d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        else if ( num == 230400 ) uart.m_iBaudrate = USERIAL_BAUD_230400;
159d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        else if ( num == 460800 ) uart.m_iBaudrate = USERIAL_BAUD_460800;
160d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        else if ( num == 921600 ) uart.m_iBaudrate = USERIAL_BAUD_921600;
161d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    }
162d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    else if ( GetStrValue ( NAME_UART_BAUD, temp, sizeof ( temp ) ) )
163d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    {
164d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        if ( strcmp ( temp, "auto" ) == 0 )
165d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            uart.m_iBaudrate = USERIAL_BAUD_AUTO;
166d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    }
167d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    else
168d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        uart.m_iBaudrate = USERIAL_BAUD_115200;
169d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
170d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    memset (&cfg, 0, sizeof(tUSERIAL_OPEN_CFG));
171d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    cfg.fmt = uart.m_iDatabits | uart.m_iParity | uart.m_iStopbits;
172d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    cfg.baud = uart.m_iBaudrate;
173d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
174d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: uart config=0x%04x, %d\n", __func__, cfg.fmt, cfg.baud);
175d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    USERIAL_Init(&cfg);
176d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
177d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    if ( GetNumValue ( NAME_NFCC_ENABLE_TIMEOUT, &num, sizeof ( num ) ) )
178d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    {
179d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        p_nfc_hal_cfg->nfc_hal_nfcc_enable_timeout = num;
180d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    }
181d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
182d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    if ( GetNumValue ( NAME_NFA_MAX_EE_SUPPORTED, &num, sizeof ( num ) ) && num == 0 )
183d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    {
184d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        // Since NFA_MAX_EE_SUPPORTED is explicetly set to 0, no UICC support is needed.
185d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        p_nfc_hal_cfg->nfc_hal_hci_uicc_support = 0;
186d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    }
187d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
188d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    // Set 'first boot' flag based on static variable that will get set to false
189d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    // after the stack has first initialized the EE.
190d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    p_nfc_hal_cfg->nfc_hal_first_boot = isColdBoot ? TRUE : FALSE;
191d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
192d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    HAL_NfcInitialize ();
193d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    HAL_NfcSetTraceLevel (logLevel); // Initialize HAL's logging level
194d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
195d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    retval = 0;
196d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: exit %d", __FUNCTION__, retval);
197d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    return retval;
198d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar}
199d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
200d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
201d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarint HaiTerminateLibrary ()
202d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar{
203d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    int retval = EACCES;
204d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: enter", __FUNCTION__);
205d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
206d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    HAL_NfcTerminate ();
207d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    gAndroidHalCallback = NULL;
208d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    gAndroidHalDataCallback = NULL;
209d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    GKI_shutdown ();
210d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    resetConfig ();
211d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    retval = 0;
212d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: exit %d", __FUNCTION__, retval);
213d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    return retval;
214d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar}
215d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
216d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
217d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarint HaiOpen (const bcm2079x_dev_t* device, nfc_stack_callback_t* halCallbackFunc, nfc_stack_data_callback_t* halDataCallbackFunc)
218d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar{
219d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: enter", __FUNCTION__);
220d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    int retval = EACCES;
221d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
222d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    gAndroidHalCallback = halCallbackFunc;
223d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    gAndroidHalDataCallback = halDataCallbackFunc;
224d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
225d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    SyncEventGuard guard (gOpenCompletedEvent);
226d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    HAL_NfcOpen (BroadcomHalCallback, BroadcomHalDataCallback);
227d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    gOpenCompletedEvent.wait ();
228d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
229d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    retval = 0;
230d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: exit %d", __FUNCTION__, retval);
231d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    return retval;
232d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar}
233d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
234d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
235d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarvoid BroadcomHalCallback (UINT8 event, tHAL_NFC_STATUS status)
236d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar{
237d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: enter; event=0x%X", __FUNCTION__, event);
238d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    switch (event)
239d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    {
240d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    case HAL_NFC_OPEN_CPLT_EVT:
241d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        {
242d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            ALOGD ("%s: HAL_NFC_OPEN_CPLT_EVT; status=0x%X", __FUNCTION__, status);
243d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            SyncEventGuard guard (gOpenCompletedEvent);
244d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            gOpenCompletedEvent.notifyOne ();
245d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            break;
246d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        }
247d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
248d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    case HAL_NFC_POST_INIT_CPLT_EVT:
249d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        {
250d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            ALOGD ("%s: HAL_NFC_POST_INIT_CPLT_EVT", __FUNCTION__);
251d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            SyncEventGuard guard (gPostInitCompletedEvent);
252d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            gPostInitCompletedEvent.notifyOne ();
253d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            break;
254d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        }
255d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
256d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    case HAL_NFC_CLOSE_CPLT_EVT:
257d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        {
258d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            ALOGD ("%s: HAL_NFC_CLOSE_CPLT_EVT", __FUNCTION__);
259d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            SyncEventGuard guard (gCloseCompletedEvent);
260d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            gCloseCompletedEvent.notifyOne ();
261d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            break;
262d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        }
263d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
264d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    case HAL_NFC_ERROR_EVT:
265d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        {
266d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            ALOGD ("%s: HAL_NFC_ERROR_EVT", __FUNCTION__);
267d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            {
268d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar                SyncEventGuard guard (gOpenCompletedEvent);
269d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar                gOpenCompletedEvent.notifyOne ();
270d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            }
271d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            {
272d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar                SyncEventGuard guard (gPostInitCompletedEvent);
273d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar                gPostInitCompletedEvent.notifyOne ();
274d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            }
275d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            {
276d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar                SyncEventGuard guard (gCloseCompletedEvent);
277d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar                gCloseCompletedEvent.notifyOne ();
278d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            }
279d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar            break;
280d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        }
281d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    }
282d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    gAndroidHalCallback (event, status);
283d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: exit; event=0x%X", __FUNCTION__, event);
284d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar}
285d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
286d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
287d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarvoid BroadcomHalDataCallback (UINT16 data_len, UINT8* p_data)
288d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar{
289d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: enter; len=%u", __FUNCTION__, data_len);
290d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    gAndroidHalDataCallback (data_len, p_data);
291d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar}
292d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
293d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
294d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarint HaiClose (const bcm2079x_dev_t* device)
295d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar{
296d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: enter", __FUNCTION__);
297d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    int retval = EACCES;
298d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
299d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    SyncEventGuard guard (gCloseCompletedEvent);
300d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    HAL_NfcClose ();
301d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    gCloseCompletedEvent.wait ();
302d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    retval = 0;
303d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: exit %d", __FUNCTION__, retval);
304d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    return retval;
305d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar}
306d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
307d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
308d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarint HaiCoreInitialized (const bcm2079x_dev_t* device, uint8_t* coreInitResponseParams)
309d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar{
310d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: enter", __FUNCTION__);
311d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    int retval = EACCES;
312d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
313d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    SyncEventGuard guard (gPostInitCompletedEvent);
314d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    HAL_NfcCoreInitialized (coreInitResponseParams);
315d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    gPostInitCompletedEvent.wait ();
316d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    retval = 0;
317d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: exit %d", __FUNCTION__, retval);
318d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    return retval;
319d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar}
320d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
321d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
322d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarint HaiWrite (const bcm2079x_dev_t* dev, uint16_t dataLen, const uint8_t* data)
323d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar{
324d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: enter; len=%u", __FUNCTION__, dataLen);
325d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    int retval = EACCES;
326d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
327d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    HAL_NfcWrite (dataLen, const_cast<UINT8*> (data));
328d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    retval = 0;
329d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: exit %d", __FUNCTION__, retval);
330d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    return retval;
331d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar}
332d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
333d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
334d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarint HaiPreDiscover (const bcm2079x_dev_t* device)
335d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar{
336d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: enter", __FUNCTION__);
337d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    int retval = EACCES;
338d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
339d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    retval = HAL_NfcPreDiscover () ? 1 : 0;
340d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: exit %d", __FUNCTION__, retval);
341d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    return retval;
342d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar}
343d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
344d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
345d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarint HaiControlGranted (const bcm2079x_dev_t* device)
346d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar{
347d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: enter", __FUNCTION__);
348d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    int retval = EACCES;
349d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
350d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    HAL_NfcControlGranted ();
351d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    retval = 0;
352d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: exit %d", __FUNCTION__, retval);
353d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    return retval;
354d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar}
355d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
356d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
357d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarint HaiPowerCycle (const bcm2079x_dev_t* device)
358d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar{
359d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: enter", __FUNCTION__);
360d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    int retval = EACCES;
361d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
362d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    HAL_NfcPowerCycle ();
363d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    retval = 0;
364d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: exit %d", __FUNCTION__, retval);
365d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    return retval;
366d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar}
367d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
368d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
369d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbarint HaiGetMaxNfcee (const bcm2079x_dev_t* device, uint8_t* maxNfcee)
370d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar{
371d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: enter", __FUNCTION__);
372d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    int retval = EACCES;
373d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
374d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    // This function is a clear indication that the stack is initializing
375d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    // EE.  So we can reset the cold-boot flag here.
376d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    isColdBoot = false;
377d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
378d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    if ( maxNfcee )
379d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    {
380d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        *maxNfcee = HAL_NfcGetMaxNfcee ();
381d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        ALOGD("%s: max_ee from HAL to use %d", __FUNCTION__, *maxNfcee);
382d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar        retval = 0;
383d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    }
384d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    ALOGD ("%s: exit %d", __FUNCTION__, retval);
385d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar    return retval;
386d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar}
387d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar
388d6e59084d07500f68548652b8197325809a0c0c2Daniel Dunbar