1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Copyright (C) 1999-2012 Broadcom Corporation
4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  you may not use this file except in compliance with the License.
7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  You may obtain a copy of the License at:
8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  See the License for the specific language governing permissions and
15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  limitations under the License.
16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
18e10478dd5869b974085e7c55737c4fce7b3bb1e2Colin Cross
19e10478dd5869b974085e7c55737c4fce7b3bb1e2Colin Cross#define LOG_TAG "NfcNciHal"
20e10478dd5869b974085e7c55737c4fce7b3bb1e2Colin Cross
21d03c06e4c5dc9b5561d084d173d34e731304e604Ruchi Kandoi#include "_OverrideLog.h"
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "config.h"
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_int.h"
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "userial.h"
256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiextern "C" {
266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfc_hal_post_reset.h"
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include <cutils/properties.h>
299c7452d05d7cd7b8381236a92fa4edcdab2cd107George Burgess IV#include <inttypes.h>
30be6e6864e012010919062e94a71989efc77592fbElliott Hughes#include <malloc.h>
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string>
325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#include "StartupConfig.h"
336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "spdhelper.h"
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define FW_PRE_PATCH "FW_PRE_PATCH"
366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define FW_PATCH "FW_PATCH"
376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define MAX_RF_DATA_CREDITS "MAX_RF_DATA_CREDITS"
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define MAX_BUFFER (512)
406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic char sPrePatchFn[MAX_BUFFER + 1];
416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic char sPatchFn[MAX_BUFFER + 1];
426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void* sPrmBuf = NULL;
436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void* sI2cFixPrmBuf = NULL;
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define CONFIG_MAX_LEN 256
466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic uint8_t sConfig[CONFIG_MAX_LEN];
475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic StartupConfig sStartupConfig;
485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic StartupConfig sLptdConfig;
4945e68232b8524aca5165dca28b994ec8c11593b1Evan Chustatic StartupConfig sPreDiscoveryConfig;
503c8ee3d9f5df8d315dc9d47a4fb05d6411028e8aEvan Chustatic StartupConfig sXtalCustomParam;
516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiextern uint8_t* p_nfc_hal_dm_start_up_cfg;  // defined in the HAL
52512ee63c7cc8feb016863e507a5d33cd0f4242bfRuchi Kandoistatic uint8_t nfa_dm_start_up_vsc_cfg[CONFIG_MAX_LEN];
536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiextern uint8_t* p_nfc_hal_dm_start_up_vsc_cfg;  // defined in the HAL
546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiextern uint8_t* p_nfc_hal_dm_lptd_cfg;          // defined in the HAL
556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic uint8_t sDontSendLptd[] = {0};
566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiextern uint8_t* p_nfc_hal_pre_discover_cfg;    // defined in the HAL
576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiextern uint8_t* p_nfc_hal_dm_xtal_params_cfg;  // defined in HAL
5845e68232b8524aca5165dca28b994ec8c11593b1Evan Chu
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern tSNOOZE_MODE_CONFIG gSnoozeModeCfg;
606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiextern tNFC_HAL_CFG* p_nfc_hal_cfg;
616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void mayDisableSecureElement(StartupConfig& config);
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/* Default patchfile (in NCD format) */
645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#ifndef NFA_APP_DEFAULT_PATCHFILE_NAME
656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define NFA_APP_DEFAULT_PATCHFILE_NAME "\0"
665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#endif
675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/* Default patchfile (in NCD format) */
695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#ifndef NFA_APP_DEFAULT_I2C_PATCHFILE_NAME
706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define NFA_APP_DEFAULT_I2C_PATCHFILE_NAME "\0"
715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#endif
725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
736fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_POST_RESET_CB nfc_post_reset_cb = {
745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    /* Default Patch & Pre-Patch */
755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    NFA_APP_DEFAULT_PATCHFILE_NAME,
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NULL,
775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    NFA_APP_DEFAULT_I2C_PATCHFILE_NAME,
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NULL,
795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    /* Default UART baud rate */
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_HAL_DEFAULT_BAUD,
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Default tNFC_HAL_DEV_INIT_CFG (flags, num_xtal_cfg, {brcm_hw_id,
846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       xtal-freq, xtal-index} ) */
856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    {2, /* number of valid entries */
866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     {
876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         {0x43341000, 37400,
886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          NFC_HAL_XTAL_INDEX_37400},  // All revisions of 43341 use 37,400
896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         {0x20795000, 26000, NFC_HAL_XTAL_INDEX_26000},
906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         {0, 0, 0},
916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         {0, 0, 0},
926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         {0, 0, 0},
936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     }},
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    /* Default low power mode settings */
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_HAL_LP_SNOOZE_MODE_NONE,    /* Snooze Mode          */
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_HAL_LP_IDLE_THRESHOLD_HOST, /* Idle Threshold Host  */
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_HAL_LP_IDLE_THRESHOLD_HC,   /* Idle Threshold HC    */
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_HAL_LP_ACTIVE_LOW,          /* NFC_WAKE Active Mode */
1005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    NFC_HAL_LP_ACTIVE_HIGH,         /* DH_WAKE Active Mode  */
1015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NFA_APP_MAX_NUM_REINIT, /* max retry to get NVM type */
1036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0,                      /* current retry count */
1046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    TRUE,                   /* debug mode for downloading patchram */
1056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    FALSE /* skip downloading patchram after reinit because of patch download
1066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             failure */
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project};
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         getFileLength
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      return the size of a file
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          file size in number of bytes
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic long getFileLength(FILE* fp) {
1196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  long sz;
1206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  fseek(fp, 0L, SEEK_END);
1216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  sz = ftell(fp);
1226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  fseek(fp, 0L, SEEK_SET);
1236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (sz > 0) ? sz : 0;
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         isFileExist
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Check if file name exists (android does not support fexists)
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if file exists
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic bool isFileExist(const char* pFilename) {
1376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  FILE* pf;
1386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1390c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  pf = fopen(pFilename, "r");
1400c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  if (pf != NULL) {
1416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    fclose(pf);
1426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return TRUE;
1436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return FALSE;
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         findPatchramFile
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Find the patchram file name specified in the .conf
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to the file name
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic const char* findPatchramFile(const char* pConfigName, char* pBuffer,
1576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                    int bufferLen) {
1586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ALOGD("%s: config=%s", __func__, pConfigName);
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (pConfigName == NULL) {
1616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ALOGD("%s No patchfile defined\n", __func__);
162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return NULL;
1636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (GetStrValue(pConfigName, &pBuffer[0], bufferLen)) {
1666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ALOGD("%s found patchfile %s\n", __func__, pBuffer);
1676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (pBuffer[0] == '\0') ? NULL : pBuffer;
1686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ALOGD("%s Cannot find patchfile '%s'\n", __func__, pConfigName);
1716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return NULL;
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    continueAfterSetSnoozeMode
177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Called after Snooze Mode is enabled.
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void continueAfterSetSnoozeMode(tHAL_NFC_STATUS status) {
1846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ALOGD("%s: status=%u", __func__, status);
1856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  // let stack download firmware during next initialization
1866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfc_post_reset_cb.spd_skip_on_power_cycle = FALSE;
1876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == NCI_STATUS_OK)
1886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    HAL_NfcPreInitDone(HAL_NFC_STATUS_OK);
1896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else
1906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    HAL_NfcPreInitDone(HAL_NFC_STATUS_FAILED);
191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    postDownloadPatchram
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Called after patch download
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void postDownloadPatchram(tHAL_NFC_STATUS status) {
2036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ALOGD("%s: status=%i", __func__, status);
2046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  GetStrValue(NAME_SNOOZE_MODE_CFG, (char*)&gSnoozeModeCfg,
2056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              sizeof(gSnoozeModeCfg));
2066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status != HAL_NFC_STATUS_OK) {
2076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ALOGE("%s: Patch download failed", __func__);
2086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (status == HAL_NFC_STATUS_REFUSED) {
2096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      SpdHelper::setPatchAsBad();
2106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else
2116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      SpdHelper::incErrorCount();
2126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* If in SPD Debug mode, fail immediately and obviously */
2146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (SpdHelper::isSpdDebug())
2156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      HAL_NfcPreInitDone(HAL_NFC_STATUS_FAILED);
2166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    else {
2176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* otherwise, power cycle the chip and let the stack startup normally */
2186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ALOGD("%s: re-init; don't download firmware", __func__);
2196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      // stop stack from downloading firmware during next initialization
2206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_post_reset_cb.spd_skip_on_power_cycle = TRUE;
2216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      USERIAL_PowerupDevice(0);
2226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      HAL_NfcReInit();
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Set snooze mode here */
2266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else if (gSnoozeModeCfg.snooze_mode != NFC_HAL_LP_SNOOZE_MODE_NONE) {
2276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = HAL_NfcSetSnoozeMode(
2286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        gSnoozeModeCfg.snooze_mode, gSnoozeModeCfg.idle_threshold_dh,
2296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        gSnoozeModeCfg.idle_threshold_nfcc, gSnoozeModeCfg.nfc_wake_active_mode,
2306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        gSnoozeModeCfg.dh_wake_active_mode, continueAfterSetSnoozeMode);
2316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (status != NCI_STATUS_OK) {
2326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ALOGE("%s: Setting snooze mode failed, status=%i", __func__, status);
2336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      HAL_NfcPreInitDone(HAL_NFC_STATUS_FAILED);
234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
2366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ALOGD("%s: Not using Snooze Mode", __func__);
2376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    HAL_NfcPreInitDone(HAL_NFC_STATUS_OK);
2386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    prmCallback
244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Patchram callback (for static patchram mode)
246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid prmCallback(uint8_t event) {
2516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ALOGD("%s: event=0x%x", __func__, event);
2526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (event) {
253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_HAL_PRM_CONTINUE_EVT:
2546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* This event does not occur if static patchram buf is used */
2556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_HAL_PRM_COMPLETE_EVT:
2586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      postDownloadPatchram(HAL_NFC_STATUS_OK);
2596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_HAL_PRM_ABORT_EVT:
2626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      postDownloadPatchram(HAL_NFC_STATUS_FAILED);
2636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT:
2666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ALOGD("%s: invalid patch...skipping patch download", __func__);
2676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      postDownloadPatchram(HAL_NFC_STATUS_REFUSED);
2686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_HAL_PRM_ABORT_BAD_SIGNATURE_EVT:
2716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ALOGD("%s: patch authentication failed", __func__);
2726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      postDownloadPatchram(HAL_NFC_STATUS_REFUSED);
2736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_HAL_PRM_ABORT_NO_NVM_EVT:
2766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ALOGD("%s: No NVM detected", __func__);
2776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      HAL_NfcPreInitDone(HAL_NFC_STATUS_FAILED);
2786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
2816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ALOGD("%s: not handled event=0x%x", __func__, event);
2826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
2836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         getNfaValues
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Get configuration values needed by NFA layer
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:         None
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void getNfaValues(uint32_t chipid) {
2966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  unsigned long num = 0;
2976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int actualLen = 0;
2986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  sStartupConfig.initialize();
3006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  sLptdConfig.initialize();
3016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  sPreDiscoveryConfig.initialize();
3026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  actualLen =
3046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      GetStrValue(NAME_NFA_DM_START_UP_CFG, (char*)sConfig, sizeof(sConfig));
3056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (actualLen) sStartupConfig.append(sConfig, actualLen);
3066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  // Set antenna tuning configuration if configured.
3086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  actualLen =
3096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      GetStrValue(NAME_PREINIT_DSP_CFG, (char*)sConfig, sizeof(sConfig));
3106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (actualLen) sStartupConfig.append(sConfig, actualLen);
3116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (GetStrValue(NAME_NFA_DM_START_UP_VSC_CFG, (char*)nfa_dm_start_up_vsc_cfg,
3136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  sizeof(nfa_dm_start_up_vsc_cfg))) {
3146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_nfc_hal_dm_start_up_vsc_cfg = &nfa_dm_start_up_vsc_cfg[0];
3156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ALOGD("START_UP_VSC_CFG[0] = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
3166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          nfa_dm_start_up_vsc_cfg[0], nfa_dm_start_up_vsc_cfg[1],
3176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          nfa_dm_start_up_vsc_cfg[2], nfa_dm_start_up_vsc_cfg[3],
3186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          nfa_dm_start_up_vsc_cfg[4], nfa_dm_start_up_vsc_cfg[5],
3196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          nfa_dm_start_up_vsc_cfg[6], nfa_dm_start_up_vsc_cfg[7]);
3206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  actualLen = GetStrValue(NAME_LPTD_CFG, (char*)sConfig, sizeof(sConfig));
3236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (actualLen) {
3246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    sLptdConfig.append(sConfig, actualLen);
3256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_nfc_hal_dm_lptd_cfg =
3266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        const_cast<uint8_t*>(sLptdConfig.getInternalBuffer());
3276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
3286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    // Default to not sending any LPTD setting.
3296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_nfc_hal_dm_lptd_cfg = sDontSendLptd;
3306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  mayDisableSecureElement(sStartupConfig);
3336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_nfc_hal_dm_start_up_cfg =
3346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      const_cast<uint8_t*>(sStartupConfig.getInternalBuffer());
3356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  actualLen = GetStrValue(NAME_NFA_DM_PRE_DISCOVERY_CFG, (char*)sConfig,
3376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                          sizeof(sConfig));
3386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (actualLen) {
3396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    sPreDiscoveryConfig.append(sConfig, actualLen);
3406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    mayDisableSecureElement(sPreDiscoveryConfig);
3416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_nfc_hal_pre_discover_cfg =
3426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        const_cast<uint8_t*>(sPreDiscoveryConfig.getInternalBuffer());
3436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  // configure how many secure elements are available for each type of chip
3466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_nfc_hal_cfg->nfc_hal_hci_uicc_support > 0) {
3476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((chipid & BRCM_NFC_GEN_MASK) == BRCM_NFC_20791_GEN) {
3486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_hal_cb.max_ee = BRCM_NFC_20791_GEN_MAX_EE;
3496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_nfc_hal_cfg->nfc_hal_hci_uicc_support =
3506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          HAL_NFC_HCI_UICC0_HOST | HAL_NFC_HCI_UICC1_HOST;
3516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else if ((chipid & BRCM_NFC_GEN_MASK) == BRCM_NFC_43341_GEN) {
3526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_hal_cb.max_ee = BRCM_NFC_43341_GEN_MAX_EE;
3536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_nfc_hal_cfg->nfc_hal_hci_uicc_support =
3546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          HAL_NFC_HCI_UICC0_HOST | HAL_NFC_HCI_UICC1_HOST;
3556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else if ((chipid & BRCM_NFC_GEN_MASK) == BRCM_NFC_20795_GEN) {
3566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_hal_cb.max_ee = BRCM_NFC_20795_GEN_MAX_EE;
3576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_nfc_hal_cfg->nfc_hal_hci_uicc_support = HAL_NFC_HCI_UICC0_HOST |
3586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                                HAL_NFC_HCI_UICC1_HOST |
3596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                                HAL_NFC_HCI_UICC2_HOST;
36045e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    }
361a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
3626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    // let .conf variable determine how many EE's to discover
3636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (GetNumValue(NAME_NFA_MAX_EE_SUPPORTED, &num, sizeof(num)))
3646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_hal_cb.max_ee = num;
3656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         StartPatchDownload
371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Reads configuration settings, and begins the download
373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  process if patch files are configured.
374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:         None
376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void StartPatchDownload(uint32_t chipid) {
3799c7452d05d7cd7b8381236a92fa4edcdab2cd107George Burgess IV  ALOGD("%s: chipid=%" PRIu32, __func__, chipid);
3806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  char chipID[30];
3829c7452d05d7cd7b8381236a92fa4edcdab2cd107George Burgess IV  sprintf(chipID, "%" PRIu32, chipid);
3836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ALOGD("%s: chidId=%s", __func__, chipID);
3846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  readOptionalConfig(chipID);  // Read optional chip specific settings
3866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  readOptionalConfig("fime");  // Read optional FIME specific settings
3876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  getNfaValues(chipid);        // Get NFA configuration values into variables
3886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  findPatchramFile(FW_PATCH, sPatchFn, sizeof(sPatchFn));
3906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  findPatchramFile(FW_PRE_PATCH, sPrePatchFn, sizeof(sPatchFn));
3916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  {
3936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    FILE* fd;
3946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* If an I2C fix patch file was specified, then tell the stack about it */
3956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (sPrePatchFn[0] != '\0') {
3960c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi      fd = fopen(sPrePatchFn, "rb");
3970c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi      if (fd != NULL) {
3986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        uint32_t lenPrmBuffer = getFileLength(fd);
3996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4000c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi        sI2cFixPrmBuf = malloc(lenPrmBuffer);
4010c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi        if (sI2cFixPrmBuf != NULL) {
4026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          size_t actualLen = fread(sI2cFixPrmBuf, 1, lenPrmBuffer, fd);
4036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (actualLen == lenPrmBuffer) {
4049c7452d05d7cd7b8381236a92fa4edcdab2cd107George Burgess IV            ALOGD("%s Setting I2C fix to %s (size: %" PRIu32 ")", __func__,
4059c7452d05d7cd7b8381236a92fa4edcdab2cd107George Burgess IV                  sPrePatchFn, lenPrmBuffer);
4066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            HAL_NfcPrmSetI2cPatch((uint8_t*)sI2cFixPrmBuf,
4076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                  (uint16_t)lenPrmBuffer, 0);
4086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          } else
4099c7452d05d7cd7b8381236a92fa4edcdab2cd107George Burgess IV            ALOGE(
4109c7452d05d7cd7b8381236a92fa4edcdab2cd107George Burgess IV                "%s fail reading i2c fix; actual len=%zu; expected len="
4119c7452d05d7cd7b8381236a92fa4edcdab2cd107George Burgess IV                "%" PRIu32,
4129c7452d05d7cd7b8381236a92fa4edcdab2cd107George Burgess IV                __func__, actualLen, lenPrmBuffer);
4136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
4149c7452d05d7cd7b8381236a92fa4edcdab2cd107George Burgess IV          ALOGE("%s Unable to get buffer to i2c fix (%" PRIu32 " bytes)",
4159c7452d05d7cd7b8381236a92fa4edcdab2cd107George Burgess IV                __func__, lenPrmBuffer);
416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        fclose(fd);
4196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
4206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        ALOGE("%s Unable to open i2c fix patchfile %s", __func__, sPrePatchFn);
4216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
4226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
4236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
4246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  {
4266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    FILE* fd;
4276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* If a patch file was specified, then download it now */
4296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (sPatchFn[0] != '\0') {
4306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      uint32_t bDownloadStarted = false;
4316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* open patchfile, read it into a buffer */
4330c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi      fd = fopen(sPatchFn, "rb");
4340c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi      if (fd != NULL) {
4356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        uint32_t lenPrmBuffer = getFileLength(fd);
4369c7452d05d7cd7b8381236a92fa4edcdab2cd107George Burgess IV        ALOGD("%s Downloading patchfile %s (size: %" PRIu32 ") format=%u",
4379c7452d05d7cd7b8381236a92fa4edcdab2cd107George Burgess IV              __func__, sPatchFn, lenPrmBuffer, NFC_HAL_PRM_FORMAT_NCD);
4380c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi        sPrmBuf = malloc(lenPrmBuffer);
4390c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi        if (sPrmBuf != NULL) {
4406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          size_t actualLen = fread(sPrmBuf, 1, lenPrmBuffer, fd);
4416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (actualLen == lenPrmBuffer) {
4426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            if (!SpdHelper::isPatchBad((uint8_t*)sPrmBuf, lenPrmBuffer)) {
4436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              /* Download patch using static memeory mode */
4446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              HAL_NfcPrmDownloadStart(NFC_HAL_PRM_FORMAT_NCD, 0,
4456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                      (uint8_t*)sPrmBuf, lenPrmBuffer, 0,
4466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                      prmCallback);
4476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              bDownloadStarted = true;
448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
4496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          } else
4506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            ALOGE("%s fail reading patchram", __func__);
4516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else
4529c7452d05d7cd7b8381236a92fa4edcdab2cd107George Burgess IV          ALOGE("%s Unable to buffer to hold patchram (%" PRIu32 " bytes)",
4539c7452d05d7cd7b8381236a92fa4edcdab2cd107George Burgess IV                __func__, lenPrmBuffer);
4546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        fclose(fd);
4566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else
4576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        ALOGE("%s Unable to open patchfile %s", __func__, sPatchFn);
4586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* If the download never got started */
4606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (!bDownloadStarted) {
4616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* If debug mode, fail in an obvious way, otherwise try to start stack
4626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         */
4636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        postDownloadPatchram(SpdHelper::isSpdDebug() ? HAL_NFC_STATUS_FAILED
4646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                                     : HAL_NFC_STATUS_OK);
4656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
4666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
4676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ALOGE(
4686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "%s: No patchfile specified or disabled. Proceeding to post-download "
4696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "procedure...",
4706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          __func__);
4716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      postDownloadPatchram(HAL_NFC_STATUS_OK);
472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
4736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ALOGD("%s: exit", __func__);
476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    nfc_hal_post_reset_init
481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Called by the NFC HAL after controller has been reset.
483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**              Begin to download firmware patch files.
484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
4886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfc_hal_post_reset_init(uint32_t brcm_hw_id, uint8_t nvm_type) {
4899c7452d05d7cd7b8381236a92fa4edcdab2cd107George Burgess IV  ALOGD("%s: brcm_hw_id=0x%" PRIu32 ", nvm_type=%d", __func__, brcm_hw_id,
4909c7452d05d7cd7b8381236a92fa4edcdab2cd107George Burgess IV        nvm_type);
4916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tHAL_NFC_STATUS stat = HAL_NFC_STATUS_FAILED;
4926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t max_credits = 1, allow_no_nvm = 0;
4936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_nfc_hal_cfg->nfc_hal_prm_nvm_required =
4956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      TRUE;  // don't download firmware if controller cannot detect EERPOM
4966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nvm_type == NCI_SPD_NVM_TYPE_NONE) {
4986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GetNumValue(NAME_ALLOW_NO_NVM, &allow_no_nvm, sizeof(allow_no_nvm));
4996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (allow_no_nvm == 0) {
5006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ALOGD("%s: No NVM detected, FAIL the init stage to force a retry",
5016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            __func__);
5026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      USERIAL_PowerupDevice(0);
5036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      stat = HAL_NfcReInit();
5046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return;
505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
506a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
5076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_nfc_hal_cfg->nfc_hal_prm_nvm_required =
5086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        FALSE;  // allow download firmware if controller cannot detect EERPOM
5096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Start downloading the patch files */
5126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  StartPatchDownload(brcm_hw_id);
513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (GetNumValue(MAX_RF_DATA_CREDITS, &max_credits, sizeof(max_credits)) &&
5156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (max_credits > 0)) {
5166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ALOGD("%s : max_credits=%d", __func__, max_credits);
5176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    HAL_NfcSetMaxRfDataCredits(max_credits);
5186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
5196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi}
520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
5235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function:        mayDisableSecureElement
524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
5256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi** Description:     Optionally adjust a TLV to disable secure element.  This
5266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi*feature
5275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**                  is enabled by setting the system property
5286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi**                  nfc.disable_secure_element to a bit mask represented by a
5296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi*hex
5305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**                  octet: C0 = do not detect any secure element.
5315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**                         40 = do not detect secure element in slot 0.
5325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**                         80 = do not detect secure element in slot 1.
533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
5345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**                  config: a sequence of TLV's.
535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid mayDisableSecureElement(StartupConfig& config) {
5386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  unsigned int bitmask = 0;
5396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  char valueStr[PROPERTY_VALUE_MAX] = {0};
5406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int len = property_get("nfc.disable_secure_element", valueStr, "");
5416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (len > 0) {
5426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    sscanf(valueStr, "%x", &bitmask);  // read system property as a hex octet
5436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ALOGD("%s: disable 0x%02X", __func__, (uint8_t)bitmask);
5446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    config.disableSecureElement((uint8_t)(bitmask & 0xC0));
5456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
547a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
548a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu/*******************************************************************************
549a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**
550a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Function:    configureCrystalFrequency
551a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**
552a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Description: Configure controller's crystal frequency by reading values from
553a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**              .conf file.  If .conf file does not define any value, then use
554a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**              default values defined in struct nfc_post_reset_cb.
555a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**
556a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Returns:     none
557a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**
558a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu*******************************************************************************/
5596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid configureCrystalFrequency() {
5606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  unsigned long num = 0;
5616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint32_t hwId = 0;
5626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t xtalFreq = 0;
5636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t xtalIndex = 0;
5646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int actualLen = 0;
5656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (GetNumValue(NAME_XTAL_HARDWARE_ID, &num, sizeof(num))) hwId = num;
5676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (GetNumValue(NAME_XTAL_FREQUENCY, &num, sizeof(num)))
5696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    xtalFreq = (uint16_t)num;
5706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (GetNumValue(NAME_XTAL_FREQ_INDEX, &num, sizeof(num)))
5726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    xtalIndex = (uint8_t)num;
5736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  actualLen =
5756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      GetStrValue(NAME_XTAL_PARAMS_CFG, (char*)sConfig, sizeof(sConfig));
5766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (actualLen &&
5776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (xtalIndex ==
5786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       NFC_HAL_XTAL_INDEX_SPECIAL))  // whether to use custom crystal frequency
5796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  {
5806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    sXtalCustomParam.append(sConfig, actualLen);
5816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_nfc_hal_dm_xtal_params_cfg =
5826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        const_cast<uint8_t*>(sXtalCustomParam.getInternalBuffer());
5836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
5846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((hwId == 0) && (xtalFreq == 0) && (xtalIndex == 0)) return;
5866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5879c7452d05d7cd7b8381236a92fa4edcdab2cd107George Burgess IV  ALOGD("%s: hwId=0x%" PRIX32 "; freq=%u; index=%u", __func__, hwId, xtalFreq,
5886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        xtalIndex);
5896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfc_post_reset_cb.dev_init_config.xtal_cfg[0].brcm_hw_id =
5906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (hwId & BRCM_NFC_GEN_MASK);
5916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfc_post_reset_cb.dev_init_config.xtal_cfg[0].xtal_freq = xtalFreq;
5926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfc_post_reset_cb.dev_init_config.xtal_cfg[0].xtal_index = xtalIndex;
5936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfc_post_reset_cb.dev_init_config.num_xtal_cfg = 1;
594a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu}
595