1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Copyright (C) 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
19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  HAL Adaptation Interface (HAI). This interface regulates the interaction
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  between standard Android HAL and Broadcom-specific HAL.  It adapts
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Broadcom-specific features to the Android framework.
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define LOG_TAG "NfcNciHal"
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "OverrideLog.h"
28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "HalAdaptation.h"
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "SyncEvent.h"
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "config.h"
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_int.h"
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_post_reset.h"
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <errno.h>
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <pthread.h>
358df564e55201ea56bea9da4587c0d25f5ecf90baMartijn Coenen#include <cutils/properties.h>
365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#include "buildcfg.h"
37a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#include "android_logmsg.h"
38edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chuextern void delete_hal_non_volatile_store (bool forceDelete);
39edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chuextern void verify_hal_non_volatile_store ();
40a5c7b4468b580946f0dd6ab73168071be5214ab3Evan Chuextern void resetConfig ();
415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenextern "C"
425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{
435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#include "userial.h"
445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
46a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chuextern void configureCrystalFrequency ();
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project///////////////////////////////////////
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project// private declaration, definition
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic nfc_stack_callback_t* gAndroidHalCallback = NULL;
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic nfc_stack_data_callback_t* gAndroidHalDataCallback = NULL;
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic SyncEvent gOpenCompletedEvent;
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic SyncEvent gPostInitCompletedEvent;
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic SyncEvent gCloseCompletedEvent;
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT32 ScrProtocolTraceFlag = SCR_PROTO_TRACE_ALL; //0x017F00;
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void BroadcomHalCallback (UINT8 event, tHAL_NFC_STATUS status);
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void BroadcomHalDataCallback (UINT16 data_len, UINT8* p_data);
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
63eecdc2f8c53010e74fb4953acbed6249580fef97Paul Chaissonstatic bool isColdBoot = true;
64eecdc2f8c53010e74fb4953acbed6249580fef97Paul Chaisson
650eb7353a4877b921c2d4b9226ecad2d1cc672dcbPaul Chaissonextern tNFC_HAL_CFG *p_nfc_hal_cfg;
660976d37081fae8bcd4fc4dcf7996e1ce194fb4b1Evan Chuextern const UINT8  nfca_version_string [];
670976d37081fae8bcd4fc4dcf7996e1ce194fb4b1Evan Chuextern const UINT8  nfa_version_string [];
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
69c6d8cda88d41587a86032d6cc778e920dab94cf8Paul ChaissontNFC_HAL_DM_PRE_SET_MEM nfc_hal_pre_set_mem_20795a1 [] =
70c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson{
71c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson    {0x0016403c,    0x00000008},
72c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson    {0x0016403c,    0x00000000},
73c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson    {0x0014008c,    0x00000001},
74c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson    {0,         0}
75c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson};
76c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson
77c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaissonextern tNFC_HAL_DM_PRE_SET_MEM *p_nfc_hal_dm_pre_set_mem;
78c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project///////////////////////////////////////
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectint HaiInitializeLibrary (const bcm2079x_dev_t* device)
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
850976d37081fae8bcd4fc4dcf7996e1ce194fb4b1Evan Chu    ALOGE ("%s: ver=%s nfa=%s", __FUNCTION__, nfca_version_string, nfa_version_string);
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int retval = EACCES;
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    unsigned long freq = 0;
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    unsigned long num = 0;
895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    char temp[120];
908df564e55201ea56bea9da4587c0d25f5ecf90baMartijn Coenen    int8_t prop_value;
915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8 logLevel = 0;
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    logLevel = InitializeGlobalAppLogLevel ();
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
95c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson    if ( GetNumValue ( NAME_GLOBAL_RESET, &num, sizeof ( num ) ) )
96c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson    {
97c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson        if (num == 1)
98c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson        {
99c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson            // Send commands to disable boc
100c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson            p_nfc_hal_dm_pre_set_mem = nfc_hal_pre_set_mem_20795a1;
101c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson        }
102c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson    }
103c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson
104a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    configureCrystalFrequency ();
1055a7e857aee2ebba4e369936aa5acdc7bcecf83e7Evan Chu    verify_hal_non_volatile_store ();
1065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if ( GetNumValue ( NAME_PRESERVE_STORAGE, (char*)&num, sizeof ( num ) ) &&
1075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            (num == 1) )
1085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        ALOGD ("%s: preserve HAL NV store", __FUNCTION__);
1095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    else
110edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    {
111edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        delete_hal_non_volatile_store (false);
112edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    }
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
114a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    if ( GetNumValue ( NAME_USE_RAW_NCI_TRACE, &num, sizeof ( num ) ) )
115a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    {
116a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        if (num == 1)
117a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        {
118a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            // display protocol traces in raw format
119a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            ProtoDispAdapterUseRawOutput (TRUE);
120a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        }
121a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    }
122a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    // Initialize protocol logging level
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ( GetNumValue ( NAME_PROTOCOL_TRACE_LEVEL, &num, sizeof ( num ) ) )
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ScrProtocolTraceFlag = num;
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    tUSERIAL_OPEN_CFG cfg;
1285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    struct tUART_CONFIG  uart;
1295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if ( GetStrValue ( NAME_UART_PARITY, temp, sizeof ( temp ) ) )
1315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
1325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if ( strcmp ( temp, "even" ) == 0 )
1335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            uart.m_iParity = USERIAL_PARITY_EVEN;
1345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else if ( strcmp ( temp, "odd" ) == 0 )
1355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            uart.m_iParity = USERIAL_PARITY_ODD;
1365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else if ( strcmp ( temp, "none" ) == 0 )
1375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            uart.m_iParity = USERIAL_PARITY_NONE;
1385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
1395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    else
1405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        uart.m_iParity = USERIAL_PARITY_NONE;
1415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if ( GetStrValue ( NAME_UART_STOPBITS, temp, sizeof ( temp ) ) )
1435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
1445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if ( strcmp ( temp, "1" ) == 0 )
1455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            uart.m_iStopbits = USERIAL_STOPBITS_1;
1465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else if ( strcmp ( temp, "2" ) == 0 )
1475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            uart.m_iStopbits = USERIAL_STOPBITS_2;
1485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else if ( strcmp ( temp, "1.5" ) == 0 )
1495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            uart.m_iStopbits = USERIAL_STOPBITS_1_5;
1505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
1515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    else if ( GetNumValue ( NAME_UART_STOPBITS, &num, sizeof ( num ) ) )
1525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
1535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if ( num == 1 )
1545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            uart.m_iStopbits = USERIAL_STOPBITS_1;
1555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else if ( num == 2 )
1565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            uart.m_iStopbits = USERIAL_STOPBITS_2;
1575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
1585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    else
1595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        uart.m_iStopbits = USERIAL_STOPBITS_1;
1605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if ( GetNumValue ( NAME_UART_DATABITS, &num, sizeof ( num ) ) )
1625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
1635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if ( 5 <= num && num <= 8 )
1645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            uart.m_iDatabits = ( 1 << ( num + 1 ) );
1655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
1665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    else
1675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        uart.m_iDatabits = USERIAL_DATABITS_8;
168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if ( GetNumValue ( NAME_UART_BAUD, &num, sizeof ( num ) ) )
1705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
1715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if ( num == 300 ) uart.m_iBaudrate = USERIAL_BAUD_300;
1725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else if ( num == 600 ) uart.m_iBaudrate = USERIAL_BAUD_600;
1735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else if ( num == 1200 ) uart.m_iBaudrate = USERIAL_BAUD_1200;
1745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else if ( num == 2400 ) uart.m_iBaudrate = USERIAL_BAUD_2400;
1755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else if ( num == 9600 ) uart.m_iBaudrate = USERIAL_BAUD_9600;
1765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else if ( num == 19200 ) uart.m_iBaudrate = USERIAL_BAUD_19200;
1775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else if ( num == 57600 ) uart.m_iBaudrate = USERIAL_BAUD_57600;
1785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else if ( num == 115200 ) uart.m_iBaudrate = USERIAL_BAUD_115200;
1795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else if ( num == 230400 ) uart.m_iBaudrate = USERIAL_BAUD_230400;
1805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else if ( num == 460800 ) uart.m_iBaudrate = USERIAL_BAUD_460800;
1815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else if ( num == 921600 ) uart.m_iBaudrate = USERIAL_BAUD_921600;
1825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
1835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    else if ( GetStrValue ( NAME_UART_BAUD, temp, sizeof ( temp ) ) )
1845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
1855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if ( strcmp ( temp, "auto" ) == 0 )
1865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            uart.m_iBaudrate = USERIAL_BAUD_AUTO;
187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    else
1895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        uart.m_iBaudrate = USERIAL_BAUD_115200;
1905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    memset (&cfg, 0, sizeof(tUSERIAL_OPEN_CFG));
1925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    cfg.fmt = uart.m_iDatabits | uart.m_iParity | uart.m_iStopbits;
1935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    cfg.baud = uart.m_iBaudrate;
1945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    ALOGD ("%s: uart config=0x%04x, %d\n", __func__, cfg.fmt, cfg.baud);
1965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    USERIAL_Init(&cfg);
1975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1980eb7353a4877b921c2d4b9226ecad2d1cc672dcbPaul Chaisson    if ( GetNumValue ( NAME_NFCC_ENABLE_TIMEOUT, &num, sizeof ( num ) ) )
1990eb7353a4877b921c2d4b9226ecad2d1cc672dcbPaul Chaisson    {
2000eb7353a4877b921c2d4b9226ecad2d1cc672dcbPaul Chaisson        p_nfc_hal_cfg->nfc_hal_nfcc_enable_timeout = num;
2010eb7353a4877b921c2d4b9226ecad2d1cc672dcbPaul Chaisson    }
2020eb7353a4877b921c2d4b9226ecad2d1cc672dcbPaul Chaisson
203b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson    if ( GetNumValue ( NAME_NFA_MAX_EE_SUPPORTED, &num, sizeof ( num ) ) && num == 0 )
204b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson    {
205b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson        // Since NFA_MAX_EE_SUPPORTED is explicetly set to 0, no UICC support is needed.
206b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson        p_nfc_hal_cfg->nfc_hal_hci_uicc_support = 0;
207b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson    }
208b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson
2098df564e55201ea56bea9da4587c0d25f5ecf90baMartijn Coenen    prop_value = property_get_bool("nfc.bcm2079x.isColdboot", 0);
2108df564e55201ea56bea9da4587c0d25f5ecf90baMartijn Coenen    if (prop_value) {
2118df564e55201ea56bea9da4587c0d25f5ecf90baMartijn Coenen        isColdBoot = true;
2128df564e55201ea56bea9da4587c0d25f5ecf90baMartijn Coenen        property_set("nfc.bcm2079x.isColdboot", "0");
2138df564e55201ea56bea9da4587c0d25f5ecf90baMartijn Coenen    }
214eecdc2f8c53010e74fb4953acbed6249580fef97Paul Chaisson    // Set 'first boot' flag based on static variable that will get set to false
215eecdc2f8c53010e74fb4953acbed6249580fef97Paul Chaisson    // after the stack has first initialized the EE.
216eecdc2f8c53010e74fb4953acbed6249580fef97Paul Chaisson    p_nfc_hal_cfg->nfc_hal_first_boot = isColdBoot ? TRUE : FALSE;
217a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
2185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    HAL_NfcInitialize ();
2195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    HAL_NfcSetTraceLevel (logLevel); // Initialize HAL's logging level
220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    retval = 0;
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: exit %d", __FUNCTION__, retval);
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return retval;
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectint HaiTerminateLibrary ()
228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int retval = EACCES;
230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    HAL_NfcTerminate ();
233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    gAndroidHalCallback = NULL;
234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    gAndroidHalDataCallback = NULL;
235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GKI_shutdown ();
236a5c7b4468b580946f0dd6ab73168071be5214ab3Evan Chu    resetConfig ();
237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    retval = 0;
238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: exit %d", __FUNCTION__, retval);
239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return retval;
240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectint HaiOpen (const bcm2079x_dev_t* device, nfc_stack_callback_t* halCallbackFunc, nfc_stack_data_callback_t* halDataCallbackFunc)
244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int retval = EACCES;
247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    gAndroidHalCallback = halCallbackFunc;
249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    gAndroidHalDataCallback = halDataCallbackFunc;
250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    SyncEventGuard guard (gOpenCompletedEvent);
252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    HAL_NfcOpen (BroadcomHalCallback, BroadcomHalDataCallback);
253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    gOpenCompletedEvent.wait ();
254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    retval = 0;
256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: exit %d", __FUNCTION__, retval);
257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return retval;
258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid BroadcomHalCallback (UINT8 event, tHAL_NFC_STATUS status)
262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: enter; event=0x%X", __FUNCTION__, event);
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (event)
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case HAL_NFC_OPEN_CPLT_EVT:
267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGD ("%s: HAL_NFC_OPEN_CPLT_EVT; status=0x%X", __FUNCTION__, status);
269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            SyncEventGuard guard (gOpenCompletedEvent);
270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            gOpenCompletedEvent.notifyOne ();
271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case HAL_NFC_POST_INIT_CPLT_EVT:
275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGD ("%s: HAL_NFC_POST_INIT_CPLT_EVT", __FUNCTION__);
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            SyncEventGuard guard (gPostInitCompletedEvent);
278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            gPostInitCompletedEvent.notifyOne ();
279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case HAL_NFC_CLOSE_CPLT_EVT:
283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGD ("%s: HAL_NFC_CLOSE_CPLT_EVT", __FUNCTION__);
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            SyncEventGuard guard (gCloseCompletedEvent);
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            gCloseCompletedEvent.notifyOne ();
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case HAL_NFC_ERROR_EVT:
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGD ("%s: HAL_NFC_ERROR_EVT", __FUNCTION__);
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                SyncEventGuard guard (gOpenCompletedEvent);
295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                gOpenCompletedEvent.notifyOne ();
296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                SyncEventGuard guard (gPostInitCompletedEvent);
299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                gPostInitCompletedEvent.notifyOne ();
300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                SyncEventGuard guard (gCloseCompletedEvent);
303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                gCloseCompletedEvent.notifyOne ();
304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    gAndroidHalCallback (event, status);
309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: exit; event=0x%X", __FUNCTION__, event);
310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid BroadcomHalDataCallback (UINT16 data_len, UINT8* p_data)
314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: enter; len=%u", __FUNCTION__, data_len);
316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    gAndroidHalDataCallback (data_len, p_data);
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectint HaiClose (const bcm2079x_dev_t* device)
321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int retval = EACCES;
324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    SyncEventGuard guard (gCloseCompletedEvent);
326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    HAL_NfcClose ();
327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    gCloseCompletedEvent.wait ();
328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    retval = 0;
329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: exit %d", __FUNCTION__, retval);
330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return retval;
331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectint HaiCoreInitialized (const bcm2079x_dev_t* device, uint8_t* coreInitResponseParams)
335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int retval = EACCES;
338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    SyncEventGuard guard (gPostInitCompletedEvent);
340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    HAL_NfcCoreInitialized (coreInitResponseParams);
341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    gPostInitCompletedEvent.wait ();
342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    retval = 0;
343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: exit %d", __FUNCTION__, retval);
344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return retval;
345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectint HaiWrite (const bcm2079x_dev_t* dev, uint16_t dataLen, const uint8_t* data)
349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: enter; len=%u", __FUNCTION__, dataLen);
351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int retval = EACCES;
352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    HAL_NfcWrite (dataLen, const_cast<UINT8*> (data));
354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    retval = 0;
355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: exit %d", __FUNCTION__, retval);
356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return retval;
357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectint HaiPreDiscover (const bcm2079x_dev_t* device)
361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int retval = EACCES;
364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
365c517d0ed11a775fd7d102ec2d0345275e7ecf71aEvan Chu    // This function is a clear indication that the stack is initializing
366c517d0ed11a775fd7d102ec2d0345275e7ecf71aEvan Chu    // EE.  So we can reset the cold-boot flag here.
367c517d0ed11a775fd7d102ec2d0345275e7ecf71aEvan Chu    isColdBoot = false;
36845e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    retval = HAL_NfcPreDiscover () ? 1 : 0;
369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: exit %d", __FUNCTION__, retval);
370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return retval;
371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectint HaiControlGranted (const bcm2079x_dev_t* device)
375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int retval = EACCES;
378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    HAL_NfcControlGranted ();
380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    retval = 0;
381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: exit %d", __FUNCTION__, retval);
382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return retval;
383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectint HaiPowerCycle (const bcm2079x_dev_t* device)
387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int retval = EACCES;
390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    HAL_NfcPowerCycle ();
392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    retval = 0;
393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: exit %d", __FUNCTION__, retval);
394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return retval;
395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
397b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson
398b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaissonint HaiGetMaxNfcee (const bcm2079x_dev_t* device, uint8_t* maxNfcee)
399b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson{
400b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson    ALOGD ("%s: enter", __FUNCTION__);
401b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson    int retval = EACCES;
402b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson
403eecdc2f8c53010e74fb4953acbed6249580fef97Paul Chaisson    // This function is a clear indication that the stack is initializing
404eecdc2f8c53010e74fb4953acbed6249580fef97Paul Chaisson    // EE.  So we can reset the cold-boot flag here.
405eecdc2f8c53010e74fb4953acbed6249580fef97Paul Chaisson    isColdBoot = false;
406eecdc2f8c53010e74fb4953acbed6249580fef97Paul Chaisson
407b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson    if ( maxNfcee )
408b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson    {
409a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        *maxNfcee = HAL_NfcGetMaxNfcee ();
410b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson        ALOGD("%s: max_ee from HAL to use %d", __FUNCTION__, *maxNfcee);
411b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson        retval = 0;
412b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson    }
413b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson    ALOGD ("%s: exit %d", __FUNCTION__, retval);
414b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson    return retval;
415b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson}
416a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
417