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