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 "HalAdaptation.h" 286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include <cutils/properties.h> 296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include <errno.h> 306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include <pthread.h> 31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "SyncEvent.h" 326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "_OverrideLog.h" 336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "android_logmsg.h" 346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "buildcfg.h" 35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "config.h" 36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_int.h" 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_post_reset.h" 386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiextern void delete_hal_non_volatile_store(bool forceDelete); 396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiextern void verify_hal_non_volatile_store(); 406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiextern void resetConfig(); 416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiextern "C" { 425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#include "userial.h" 435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiextern void configureCrystalFrequency(); 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/////////////////////////////////////// 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project// private declaration, definition 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic nfc_stack_callback_t* gAndroidHalCallback = NULL; 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic nfc_stack_data_callback_t* gAndroidHalDataCallback = NULL; 52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic SyncEvent gOpenCompletedEvent; 53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic SyncEvent gPostInitCompletedEvent; 54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic SyncEvent gCloseCompletedEvent; 55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint32_t ScrProtocolTraceFlag = SCR_PROTO_TRACE_ALL; // 0x017F00; 57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void BroadcomHalCallback(uint8_t event, tHAL_NFC_STATUS status); 596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void BroadcomHalDataCallback(uint16_t data_len, uint8_t* p_data); 60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 61eecdc2f8c53010e74fb4953acbed6249580fef97Paul Chaissonstatic bool isColdBoot = true; 62eecdc2f8c53010e74fb4953acbed6249580fef97Paul Chaisson 636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiextern tNFC_HAL_CFG* p_nfc_hal_cfg; 646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiextern const uint8_t nfca_version_string[]; 656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiextern const uint8_t nfa_version_string[]; 66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 676fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_HAL_DM_PRE_SET_MEM nfc_hal_pre_set_mem_20795a1[] = { 686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi {0x0016403c, 0x00000008}, 696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi {0x0016403c, 0x00000000}, 706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi {0x0014008c, 0x00000001}, 716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi {0, 0}}; 72c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson 736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiextern tNFC_HAL_DM_PRE_SET_MEM* p_nfc_hal_dm_pre_set_mem; 74c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson 75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/////////////////////////////////////// 76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiint HaiInitializeLibrary(const bcm2079x_dev_t* device) { 786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: enter", __func__); 796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGE("%s: ver=%s nfa=%s", __func__, nfca_version_string, nfa_version_string); 806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int retval = EACCES; 816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi unsigned long freq = 0; 826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi unsigned long num = 0; 836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi char temp[120]; 846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int8_t prop_value; 856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t logLevel = 0; 866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi logLevel = InitializeGlobalAppLogLevel(); 886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (GetNumValue(NAME_GLOBAL_RESET, &num, sizeof(num))) { 906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (num == 1) { 916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // Send commands to disable boc 926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_nfc_hal_dm_pre_set_mem = nfc_hal_pre_set_mem_20795a1; 93c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson } 946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi configureCrystalFrequency(); 976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi verify_hal_non_volatile_store(); 986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (GetNumValue(NAME_PRESERVE_STORAGE, (char*)&num, sizeof(num)) && 996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (num == 1)) 1006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: preserve HAL NV store", __func__); 1016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else { 1026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi delete_hal_non_volatile_store(false); 1036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (GetNumValue(NAME_USE_RAW_NCI_TRACE, &num, sizeof(num))) { 1066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (num == 1) { 1076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // display protocol traces in raw format 1086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ProtoDispAdapterUseRawOutput(TRUE); 109a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 1106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // Initialize protocol logging level 1136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi InitializeProtocolLogLevel(); 1146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tUSERIAL_OPEN_CFG cfg; 1166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi struct tUART_CONFIG uart; 1176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (GetStrValue(NAME_UART_PARITY, temp, sizeof(temp))) { 1196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (strcmp(temp, "even") == 0) 1206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iParity = USERIAL_PARITY_EVEN; 1216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (strcmp(temp, "odd") == 0) 1226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iParity = USERIAL_PARITY_ODD; 1236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (strcmp(temp, "none") == 0) 1246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iParity = USERIAL_PARITY_NONE; 1256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else 1266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iParity = USERIAL_PARITY_NONE; 1276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (GetStrValue(NAME_UART_STOPBITS, temp, sizeof(temp))) { 1296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (strcmp(temp, "1") == 0) 1306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iStopbits = USERIAL_STOPBITS_1; 1316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (strcmp(temp, "2") == 0) 1326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iStopbits = USERIAL_STOPBITS_2; 1336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (strcmp(temp, "1.5") == 0) 1346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iStopbits = USERIAL_STOPBITS_1_5; 1356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (GetNumValue(NAME_UART_STOPBITS, &num, sizeof(num))) { 1366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (num == 1) 1376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iStopbits = USERIAL_STOPBITS_1; 1386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (num == 2) 1396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iStopbits = USERIAL_STOPBITS_2; 1406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else 1416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iStopbits = USERIAL_STOPBITS_1; 1426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (GetNumValue(NAME_UART_DATABITS, &num, sizeof(num))) { 1446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (5 <= num && num <= 8) uart.m_iDatabits = (1 << (num + 1)); 1456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else 1466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iDatabits = USERIAL_DATABITS_8; 1476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (GetNumValue(NAME_UART_BAUD, &num, sizeof(num))) { 1496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (num == 300) 1506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iBaudrate = USERIAL_BAUD_300; 1516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (num == 600) 1526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iBaudrate = USERIAL_BAUD_600; 1536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (num == 1200) 1546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iBaudrate = USERIAL_BAUD_1200; 1556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (num == 2400) 1566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iBaudrate = USERIAL_BAUD_2400; 1576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (num == 9600) 1586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iBaudrate = USERIAL_BAUD_9600; 1596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (num == 19200) 1606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iBaudrate = USERIAL_BAUD_19200; 1616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (num == 57600) 1626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iBaudrate = USERIAL_BAUD_57600; 1636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (num == 115200) 1646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iBaudrate = USERIAL_BAUD_115200; 1656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (num == 230400) 1666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iBaudrate = USERIAL_BAUD_230400; 1676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (num == 460800) 1686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iBaudrate = USERIAL_BAUD_460800; 1696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (num == 921600) 1706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iBaudrate = USERIAL_BAUD_921600; 1716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (GetStrValue(NAME_UART_BAUD, temp, sizeof(temp))) { 1726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (strcmp(temp, "auto") == 0) uart.m_iBaudrate = USERIAL_BAUD_AUTO; 1736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else 1746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uart.m_iBaudrate = USERIAL_BAUD_115200; 1756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memset(&cfg, 0, sizeof(tUSERIAL_OPEN_CFG)); 1776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi cfg.fmt = uart.m_iDatabits | uart.m_iParity | uart.m_iStopbits; 1786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi cfg.baud = uart.m_iBaudrate; 1796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: uart config=0x%04x, %d\n", __func__, cfg.fmt, cfg.baud); 1816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi USERIAL_Init(&cfg); 1826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (GetNumValue(NAME_NFCC_ENABLE_TIMEOUT, &num, sizeof(num))) { 1846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_nfc_hal_cfg->nfc_hal_nfcc_enable_timeout = num; 1856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (GetNumValue(NAME_NFA_MAX_EE_SUPPORTED, &num, sizeof(num)) && num == 0) { 1886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // Since NFA_MAX_EE_SUPPORTED is explicetly set to 0, no UICC support is 1896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // needed. 1906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_nfc_hal_cfg->nfc_hal_hci_uicc_support = 0; 1916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi prop_value = property_get_bool("nfc.bcm2079x.isColdboot", 0); 1946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (prop_value) { 1956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi isColdBoot = true; 1966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi property_set("nfc.bcm2079x.isColdboot", "0"); 1976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // Set 'first boot' flag based on static variable that will get set to false 1996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // after the stack has first initialized the EE. 2006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_nfc_hal_cfg->nfc_hal_first_boot = isColdBoot ? TRUE : FALSE; 2016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi HAL_NfcInitialize(); 2036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi HAL_NfcSetTraceLevel(logLevel); // Initialize HAL's logging level 2046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = 0; 2066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: exit %d", __func__, retval); 2076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return retval; 2086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi} 209a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 2106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiint HaiTerminateLibrary() { 2116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int retval = EACCES; 2126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: enter", __func__); 2136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi HAL_NfcTerminate(); 2156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi gAndroidHalCallback = NULL; 2166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi gAndroidHalDataCallback = NULL; 2176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_shutdown(); 2186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi resetConfig(); 2196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = 0; 2206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: exit %d", __func__, retval); 2216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return retval; 2226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi} 223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiint HaiOpen(const bcm2079x_dev_t* device, nfc_stack_callback_t* halCallbackFunc, 2256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_stack_data_callback_t* halDataCallbackFunc) { 2266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: enter", __func__); 2276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int retval = EACCES; 2285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 2296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi gAndroidHalCallback = halCallbackFunc; 2306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi gAndroidHalDataCallback = halDataCallbackFunc; 2315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 2326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi SyncEventGuard guard(gOpenCompletedEvent); 2336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi HAL_NfcOpen(BroadcomHalCallback, BroadcomHalDataCallback); 2346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi gOpenCompletedEvent.wait(); 2355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 2366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = 0; 2376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: exit %d", __func__, retval); 2386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return retval; 2396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi} 2405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 2416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid BroadcomHalCallback(uint8_t event, tHAL_NFC_STATUS status) { 2426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: enter; event=0x%X", __func__, event); 2436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (event) { 2446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case HAL_NFC_OPEN_CPLT_EVT: { 2456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: HAL_NFC_OPEN_CPLT_EVT; status=0x%X", __func__, status); 2466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi SyncEventGuard guard(gOpenCompletedEvent); 2476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi gOpenCompletedEvent.notifyOne(); 2486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2490eb7353a4877b921c2d4b9226ecad2d1cc672dcbPaul Chaisson } 2500eb7353a4877b921c2d4b9226ecad2d1cc672dcbPaul Chaisson 2516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case HAL_NFC_POST_INIT_CPLT_EVT: { 2526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: HAL_NFC_POST_INIT_CPLT_EVT", __func__); 2536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi SyncEventGuard guard(gPostInitCompletedEvent); 2546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi gPostInitCompletedEvent.notifyOne(); 2556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 256b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson } 257b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson 2586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case HAL_NFC_CLOSE_CPLT_EVT: { 2596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: HAL_NFC_CLOSE_CPLT_EVT", __func__); 2606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi SyncEventGuard guard(gCloseCompletedEvent); 2616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi gCloseCompletedEvent.notifyOne(); 2626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2638df564e55201ea56bea9da4587c0d25f5ecf90baMartijn Coenen } 264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case HAL_NFC_ERROR_EVT: { 2666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: HAL_NFC_ERROR_EVT", __func__); 2676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 2686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi SyncEventGuard guard(gOpenCompletedEvent); 2696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi gOpenCompletedEvent.notifyOne(); 2706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 2726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi SyncEventGuard guard(gPostInitCompletedEvent); 2736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi gPostInitCompletedEvent.notifyOne(); 2746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 2766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi SyncEventGuard guard(gCloseCompletedEvent); 2776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi gCloseCompletedEvent.notifyOne(); 2786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi gAndroidHalCallback(event, status); 2836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: exit; event=0x%X", __func__, event); 284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid BroadcomHalDataCallback(uint16_t data_len, uint8_t* p_data) { 2876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: enter; len=%u", __func__, data_len); 2886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi gAndroidHalDataCallback(data_len, p_data); 289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiint HaiClose(const bcm2079x_dev_t* device) { 2926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: enter", __func__); 2936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int retval = EACCES; 294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi SyncEventGuard guard(gCloseCompletedEvent); 2966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi HAL_NfcClose(); 2976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi gCloseCompletedEvent.wait(); 2986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = 0; 2996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: exit %d", __func__, retval); 3006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return retval; 301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiint HaiCoreInitialized(const bcm2079x_dev_t* device, 3046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* coreInitResponseParams) { 3056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: enter", __func__); 3066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int retval = EACCES; 3076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi SyncEventGuard guard(gPostInitCompletedEvent); 3096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi HAL_NfcCoreInitialized(0, coreInitResponseParams); 3106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi gPostInitCompletedEvent.wait(); 3116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = 0; 3126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: exit %d", __func__, retval); 3136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return retval; 314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiint HaiWrite(const bcm2079x_dev_t* dev, uint16_t dataLen, const uint8_t* data) { 3176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: enter; len=%u", __func__, dataLen); 3186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int retval = EACCES; 319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi HAL_NfcWrite(dataLen, const_cast<uint8_t*>(data)); 3216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = 0; 3226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: exit %d", __func__, retval); 3236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return retval; 324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiint HaiPreDiscover(const bcm2079x_dev_t* device) { 3276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: enter", __func__); 3286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int retval = EACCES; 329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // This function is a clear indication that the stack is initializing 3316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // EE. So we can reset the cold-boot flag here. 3326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi isColdBoot = false; 3336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = HAL_NfcPreDiscover() ? 1 : 0; 3346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: exit %d", __func__, retval); 3356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return retval; 336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiint HaiControlGranted(const bcm2079x_dev_t* device) { 3396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: enter", __func__); 3406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int retval = EACCES; 341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi HAL_NfcControlGranted(); 3436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = 0; 3446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: exit %d", __func__, retval); 3456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return retval; 346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiint HaiPowerCycle(const bcm2079x_dev_t* device) { 3496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: enter", __func__); 3506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int retval = EACCES; 351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi HAL_NfcPowerCycle(); 3536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = 0; 3546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: exit %d", __func__, retval); 3556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return retval; 356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiint HaiGetMaxNfcee(const bcm2079x_dev_t* device, uint8_t* maxNfcee) { 3596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: enter", __func__); 3606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int retval = EACCES; 361b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson 3626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // This function is a clear indication that the stack is initializing 3636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // EE. So we can reset the cold-boot flag here. 3646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi isColdBoot = false; 365eecdc2f8c53010e74fb4953acbed6249580fef97Paul Chaisson 3666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (maxNfcee) { 3676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *maxNfcee = HAL_NfcGetMaxNfcee(); 3686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: max_ee from HAL to use %d", __func__, *maxNfcee); 3696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = 0; 3706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 3716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGD("%s: exit %d", __func__, retval); 3726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return retval; 373b20cbf35a541d380f32d1f43a78feb44e9e0dc1bPaul Chaisson} 374