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 ******************************************************************************/
18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "OverrideLog.h"
19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "config.h"
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_int.h"
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "userial.h"
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern "C"
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    #include "nfc_hal_post_reset.h"
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
26be6e6864e012010919062e94a71989efc77592fbElliott Hughes#include <malloc.h>
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string>
285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#include <cutils/properties.h>
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "spdhelper.h"
305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#include "StartupConfig.h"
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define LOG_TAG "NfcNciHal"
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define FW_PRE_PATCH                        "FW_PRE_PATCH"
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define FW_PATCH                            "FW_PATCH"
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define MAX_RF_DATA_CREDITS                 "MAX_RF_DATA_CREDITS"
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define MAX_BUFFER      (512)
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char sPrePatchFn[MAX_BUFFER+1];
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char sPatchFn[MAX_BUFFER+1];
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void * sPrmBuf = NULL;
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void * sI2cFixPrmBuf = NULL;
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define CONFIG_MAX_LEN 256
455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic UINT8 sConfig [CONFIG_MAX_LEN];
465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic StartupConfig sStartupConfig;
475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic StartupConfig sLptdConfig;
4845e68232b8524aca5165dca28b994ec8c11593b1Evan Chustatic StartupConfig sPreDiscoveryConfig;
493c8ee3d9f5df8d315dc9d47a4fb05d6411028e8aEvan Chustatic StartupConfig sXtalCustomParam;
505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenextern UINT8 *p_nfc_hal_dm_start_up_cfg; //defined in the HAL
515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic UINT8 nfa_dm_start_up_vsc_cfg[CONFIG_MAX_LEN];
525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenextern UINT8 *p_nfc_hal_dm_start_up_vsc_cfg; //defined in the HAL
535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenextern UINT8 *p_nfc_hal_dm_lptd_cfg; //defined in the HAL
54a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chustatic UINT8 sDontSendLptd[] = { 0 };
5545e68232b8524aca5165dca28b994ec8c11593b1Evan Chuextern UINT8 *p_nfc_hal_pre_discover_cfg; //defined in the HAL
563c8ee3d9f5df8d315dc9d47a4fb05d6411028e8aEvan Chuextern UINT8 *p_nfc_hal_dm_xtal_params_cfg; //defined in HAL
5745e68232b8524aca5165dca28b994ec8c11593b1Evan Chu
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern tSNOOZE_MODE_CONFIG gSnoozeModeCfg;
595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenextern tNFC_HAL_CFG *p_nfc_hal_cfg;
605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic void mayDisableSecureElement (StartupConfig& config);
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/* Default patchfile (in NCD format) */
635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#ifndef NFA_APP_DEFAULT_PATCHFILE_NAME
645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define NFA_APP_DEFAULT_PATCHFILE_NAME      "\0"
655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#endif
665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/* Default patchfile (in NCD format) */
685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#ifndef NFA_APP_DEFAULT_I2C_PATCHFILE_NAME
695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define NFA_APP_DEFAULT_I2C_PATCHFILE_NAME  "\0"
705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#endif
715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_POST_RESET_CB nfc_post_reset_cb =
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
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
835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    /* Default tNFC_HAL_DEV_INIT_CFG (flags, num_xtal_cfg, {brcm_hw_id, xtal-freq, xtal-index} ) */
845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
85f8de60cb50fffb38ac70e9e29ffdc956f4bac1d8Evan Chu        2, /* number of valid entries */
865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
8745e4bfb9d330c6a097b16ea70b4c236687006eaaPaul Chaisson            {0x43341000, 37400, NFC_HAL_XTAL_INDEX_37400},      // All revisions of 43341 use 37,400
88f8de60cb50fffb38ac70e9e29ffdc956f4bac1d8Evan Chu            {0x20795000, 26000, NFC_HAL_XTAL_INDEX_26000},
895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {0, 0, 0},
905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {0, 0, 0},
915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {0, 0, 0},
925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    },
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
1025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    NFA_APP_MAX_NUM_REINIT,         /* max retry to get NVM type */
1035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    0,                              /* current retry count */
1045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    TRUE,                           /* debug mode for downloading patchram */
1055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    FALSE                           /* skip downloading patchram after reinit because of patch download failure */
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project};
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*******************************************************************************/
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic long getFileLength(FILE* fp)
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    long sz;
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    fseek(fp, 0L, SEEK_END);
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    sz = ftell(fp);
123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    fseek(fp, 0L, SEEK_SET);
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
125d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu    return (sz > 0) ? sz : 0;
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         isFileExist
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Check if file name exists (android does not support fexists)
133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if file exists
135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN isFileExist(const char *pFilename)
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    FILE *pf;
140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((pf = fopen(pFilename, "r")) != NULL)
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        fclose(pf);
144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return TRUE;
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return FALSE;
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         findPatchramFile
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Find the patchram file name specified in the .conf
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to the file name
156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic const char* findPatchramFile(const char * pConfigName, char * pBuffer, int bufferLen)
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD("%s: config=%s", __FUNCTION__, pConfigName);
161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (pConfigName == NULL)
163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD("%s No patchfile defined\n", __FUNCTION__);
165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return NULL;
166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (GetStrValue(pConfigName, &pBuffer[0], bufferLen))
169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD("%s found patchfile %s\n", __FUNCTION__, pBuffer);
171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (pBuffer[0] == '\0') ? NULL : pBuffer;
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD("%s Cannot find patchfile '%s'\n", __FUNCTION__, pConfigName);
175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return NULL;
176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    continueAfterSetSnoozeMode
181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Called after Snooze Mode is enabled.
183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void continueAfterSetSnoozeMode(tHAL_NFC_STATUS status)
188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD("%s: status=%u", __FUNCTION__, status);
190ef9d04e0f3e01d213d74a09b6e0b2d065361e794Evan Chu    //let stack download firmware during next initialization
191ef9d04e0f3e01d213d74a09b6e0b2d065361e794Evan Chu    nfc_post_reset_cb.spd_skip_on_power_cycle = FALSE;
192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status == NCI_STATUS_OK)
193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        HAL_NfcPreInitDone (HAL_NFC_STATUS_OK);
194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        HAL_NfcPreInitDone (HAL_NFC_STATUS_FAILED);
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    postDownloadPatchram
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Called after patch download
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void postDownloadPatchram(tHAL_NFC_STATUS status)
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD("%s: status=%i", __FUNCTION__, status);
210a6652474ff594ad4a884e905b13e284232e770efEvan Chu    GetStrValue (NAME_SNOOZE_MODE_CFG, (char*)&gSnoozeModeCfg, sizeof(gSnoozeModeCfg));
211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status != HAL_NFC_STATUS_OK)
212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
213ef9d04e0f3e01d213d74a09b6e0b2d065361e794Evan Chu        ALOGE("%s: Patch download failed", __FUNCTION__);
214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (status == HAL_NFC_STATUS_REFUSED)
215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            SpdHelper::setPatchAsBad();
217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            SpdHelper::incErrorCount();
220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* If in SPD Debug mode, fail immediately and obviously */
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (SpdHelper::isSpdDebug())
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            HAL_NfcPreInitDone (HAL_NFC_STATUS_FAILED);
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* otherwise, power cycle the chip and let the stack startup normally */
227ef9d04e0f3e01d213d74a09b6e0b2d065361e794Evan Chu            ALOGD("%s: re-init; don't download firmware", __FUNCTION__);
228ef9d04e0f3e01d213d74a09b6e0b2d065361e794Evan Chu            //stop stack from downloading firmware during next initialization
229ef9d04e0f3e01d213d74a09b6e0b2d065361e794Evan Chu            nfc_post_reset_cb.spd_skip_on_power_cycle = TRUE;
230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            USERIAL_PowerupDevice(0);
231ef9d04e0f3e01d213d74a09b6e0b2d065361e794Evan Chu            HAL_NfcReInit ();
232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Set snooze mode here */
235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (gSnoozeModeCfg.snooze_mode != NFC_HAL_LP_SNOOZE_MODE_NONE)
236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = HAL_NfcSetSnoozeMode(gSnoozeModeCfg.snooze_mode,
238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                       gSnoozeModeCfg.idle_threshold_dh,
239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                       gSnoozeModeCfg.idle_threshold_nfcc,
240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                       gSnoozeModeCfg.nfc_wake_active_mode,
241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                       gSnoozeModeCfg.dh_wake_active_mode,
242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                       continueAfterSetSnoozeMode);
243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (status != NCI_STATUS_OK)
244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGE("%s: Setting snooze mode failed, status=%i", __FUNCTION__, status);
246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            HAL_NfcPreInitDone(HAL_NFC_STATUS_FAILED);
247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD("%s: Not using Snooze Mode", __FUNCTION__);
252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        HAL_NfcPreInitDone(HAL_NFC_STATUS_OK);
253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    prmCallback
260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Patchram callback (for static patchram mode)
262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid prmCallback(UINT8 event)
267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD("%s: event=0x%x", __FUNCTION__, event);
269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (event)
270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_HAL_PRM_CONTINUE_EVT:
272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* This event does not occur if static patchram buf is used */
273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_HAL_PRM_COMPLETE_EVT:
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        postDownloadPatchram(HAL_NFC_STATUS_OK);
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_HAL_PRM_ABORT_EVT:
280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        postDownloadPatchram(HAL_NFC_STATUS_FAILED);
281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT:
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD("%s: invalid patch...skipping patch download", __FUNCTION__);
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        postDownloadPatchram(HAL_NFC_STATUS_REFUSED);
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_HAL_PRM_ABORT_BAD_SIGNATURE_EVT:
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD("%s: patch authentication failed", __FUNCTION__);
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        postDownloadPatchram(HAL_NFC_STATUS_REFUSED);
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_HAL_PRM_ABORT_NO_NVM_EVT:
294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD("%s: No NVM detected", __FUNCTION__);
295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        HAL_NfcPreInitDone(HAL_NFC_STATUS_FAILED);
296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD("%s: not handled event=0x%x", __FUNCTION__, event);
300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         getNfaValues
308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Get configuration values needed by NFA layer
310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:         None
312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
314a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chustatic void getNfaValues (UINT32 chipid)
315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
3165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    unsigned long num = 0;
3175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    int actualLen = 0;
3185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    sStartupConfig.initialize ();
3205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    sLptdConfig.initialize ();
32145e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    sPreDiscoveryConfig.initialize();
322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    actualLen = GetStrValue (NAME_NFA_DM_START_UP_CFG, (char*)sConfig, sizeof(sConfig));
324fca15e562a5a4651a489f7ebcba5ba03f952bc36Evan Chu    if (actualLen)
3255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        sStartupConfig.append (sConfig, actualLen);
3265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    // Set antenna tuning configuration if configured.
3285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    actualLen = GetStrValue(NAME_PREINIT_DSP_CFG, (char*)sConfig, sizeof(sConfig));
3295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (actualLen)
3305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        sStartupConfig.append (sConfig, actualLen);
3315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ( GetStrValue ( NAME_NFA_DM_START_UP_VSC_CFG, (char*)nfa_dm_start_up_vsc_cfg, sizeof (nfa_dm_start_up_vsc_cfg) ) )
333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_nfc_hal_dm_start_up_vsc_cfg = &nfa_dm_start_up_vsc_cfg[0];
335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD ( "START_UP_VSC_CFG[0] = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                                                            nfa_dm_start_up_vsc_cfg[0],
337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                                                            nfa_dm_start_up_vsc_cfg[1],
338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                                                            nfa_dm_start_up_vsc_cfg[2],
339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                                                            nfa_dm_start_up_vsc_cfg[3],
340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                                                            nfa_dm_start_up_vsc_cfg[4],
341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                                                            nfa_dm_start_up_vsc_cfg[5],
342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                                                            nfa_dm_start_up_vsc_cfg[6],
343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                                                            nfa_dm_start_up_vsc_cfg[7] );
344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
3455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    actualLen = GetStrValue(NAME_LPTD_CFG, (char*)sConfig, sizeof(sConfig));
3475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (actualLen)
3485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
3495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        sLptdConfig.append (sConfig, actualLen);
3505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        p_nfc_hal_dm_lptd_cfg = const_cast<UINT8*> (sLptdConfig.getInternalBuffer ());
3515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
352a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    else
353a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    {
354a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        // Default to not sending any LPTD setting.
355a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        p_nfc_hal_dm_lptd_cfg = sDontSendLptd;
356a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    }
3575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    mayDisableSecureElement (sStartupConfig);
3595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    p_nfc_hal_dm_start_up_cfg = const_cast<UINT8*> (sStartupConfig.getInternalBuffer ());
36045e68232b8524aca5165dca28b994ec8c11593b1Evan Chu
36145e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    actualLen = GetStrValue(NAME_NFA_DM_PRE_DISCOVERY_CFG, (char*)sConfig, sizeof(sConfig));
36245e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    if (actualLen)
36345e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    {
36445e68232b8524aca5165dca28b994ec8c11593b1Evan Chu        sPreDiscoveryConfig.append (sConfig, actualLen);
365fca15e562a5a4651a489f7ebcba5ba03f952bc36Evan Chu        mayDisableSecureElement (sPreDiscoveryConfig);
36645e68232b8524aca5165dca28b994ec8c11593b1Evan Chu        p_nfc_hal_pre_discover_cfg = const_cast<UINT8*> (sPreDiscoveryConfig.getInternalBuffer ());
36745e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    }
368a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
369a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    //configure how many secure elements are available for each type of chip
370a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    if (p_nfc_hal_cfg->nfc_hal_hci_uicc_support > 0)
371a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    {
37240f9717d1d3b664f23724f3457f97164b23d7614Evan Chu        if ((chipid & BRCM_NFC_GEN_MASK) == BRCM_NFC_20791_GEN)
373a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        {
374a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            nfc_hal_cb.max_ee = BRCM_NFC_20791_GEN_MAX_EE;
375a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            p_nfc_hal_cfg->nfc_hal_hci_uicc_support = HAL_NFC_HCI_UICC0_HOST | HAL_NFC_HCI_UICC1_HOST;
376a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        }
377a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        else if ((chipid & BRCM_NFC_GEN_MASK) == BRCM_NFC_43341_GEN)
378a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        {
379a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            nfc_hal_cb.max_ee = BRCM_NFC_43341_GEN_MAX_EE;
380a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            p_nfc_hal_cfg->nfc_hal_hci_uicc_support = HAL_NFC_HCI_UICC0_HOST | HAL_NFC_HCI_UICC1_HOST;
381a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        }
382a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        else if ((chipid & BRCM_NFC_GEN_MASK) == BRCM_NFC_20795_GEN)
383a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        {
384a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            nfc_hal_cb.max_ee = BRCM_NFC_20795_GEN_MAX_EE;
385a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            p_nfc_hal_cfg->nfc_hal_hci_uicc_support = HAL_NFC_HCI_UICC0_HOST | HAL_NFC_HCI_UICC1_HOST | HAL_NFC_HCI_UICC2_HOST;
386a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        }
38740f9717d1d3b664f23724f3457f97164b23d7614Evan Chu
38840f9717d1d3b664f23724f3457f97164b23d7614Evan Chu        //let .conf variable determine how many EE's to discover
38940f9717d1d3b664f23724f3457f97164b23d7614Evan Chu        if (GetNumValue(NAME_NFA_MAX_EE_SUPPORTED, &num, sizeof(num)))
39040f9717d1d3b664f23724f3457f97164b23d7614Evan Chu            nfc_hal_cb.max_ee = num;
391a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    }
392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         StartPatchDownload
397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Reads configuration settings, and begins the download
399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  process if patch files are configured.
400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:         None
402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void StartPatchDownload(UINT32 chipid)
405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: chipid=%lx",__FUNCTION__, chipid);
407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    char chipID[30];
409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    sprintf(chipID, "%lx", chipid);
410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: chidId=%s", __FUNCTION__, chipID);
411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    readOptionalConfig(chipID);     // Read optional chip specific settings
413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    readOptionalConfig("fime");     // Read optional FIME specific settings
414a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    getNfaValues(chipid);                 // Get NFA configuration values into variables
415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    findPatchramFile(FW_PATCH, sPatchFn, sizeof(sPatchFn));
417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    findPatchramFile(FW_PRE_PATCH, sPrePatchFn, sizeof(sPatchFn));
418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        FILE *fd;
421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* If an I2C fix patch file was specified, then tell the stack about it */
422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (sPrePatchFn[0] != '\0')
423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if ((fd = fopen(sPrePatchFn, "rb")) != NULL)
425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                UINT32 lenPrmBuffer = getFileLength(fd);
427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if ((sI2cFixPrmBuf = malloc(lenPrmBuffer)) != NULL)
429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
430d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu                    size_t actualLen = fread(sI2cFixPrmBuf, 1, lenPrmBuffer, fd);
431d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu                    if (actualLen == lenPrmBuffer)
432d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu                    {
433d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu                        ALOGD("%s Setting I2C fix to %s (size: %lu)", __FUNCTION__, sPrePatchFn, lenPrmBuffer);
434d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu                        HAL_NfcPrmSetI2cPatch((UINT8*)sI2cFixPrmBuf, (UINT16)lenPrmBuffer, 0);
435d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu                    }
436d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu                    else
437d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu                        ALOGE("%s fail reading i2c fix; actual len=%u; expected len=%lu", __FUNCTION__, actualLen, lenPrmBuffer);
438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ALOGE("%s Unable to get buffer to i2c fix (%lu bytes)", __FUNCTION__, lenPrmBuffer);
442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                fclose(fd);
445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ALOGE("%s Unable to open i2c fix patchfile %s", __FUNCTION__, sPrePatchFn);
449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        FILE *fd;
455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* If a patch file was specified, then download it now */
457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (sPatchFn[0] != '\0')
458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            UINT32 bDownloadStarted = false;
460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* open patchfile, read it into a buffer */
462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if ((fd = fopen(sPatchFn, "rb")) != NULL)
463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                UINT32 lenPrmBuffer = getFileLength(fd);
4655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                ALOGD("%s Downloading patchfile %s (size: %lu) format=%u", __FUNCTION__, sPatchFn, lenPrmBuffer, NFC_HAL_PRM_FORMAT_NCD);
466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if ((sPrmBuf = malloc(lenPrmBuffer)) != NULL)
467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
468d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu                    size_t actualLen = fread(sPrmBuf, 1, lenPrmBuffer, fd);
469d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu                    if (actualLen == lenPrmBuffer)
470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
471d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu                        if (!SpdHelper::isPatchBad((UINT8*)sPrmBuf, lenPrmBuffer))
472d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu                        {
473d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu                            /* Download patch using static memeory mode */
474d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu                            HAL_NfcPrmDownloadStart(NFC_HAL_PRM_FORMAT_NCD, 0, (UINT8*)sPrmBuf, lenPrmBuffer, 0, prmCallback);
475d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu                            bDownloadStarted = true;
476d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu                        }
477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
478d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu                    else
479d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu                        ALOGE("%s fail reading patchram", __FUNCTION__);
480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ALOGE("%s Unable to buffer to hold patchram (%lu bytes)", __FUNCTION__, lenPrmBuffer);
483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                fclose(fd);
485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ALOGE("%s Unable to open patchfile %s", __FUNCTION__, sPatchFn);
488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* If the download never got started */
490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (!bDownloadStarted)
491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* If debug mode, fail in an obvious way, otherwise try to start stack */
493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                postDownloadPatchram(SpdHelper::isSpdDebug() ? HAL_NFC_STATUS_FAILED :
494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        HAL_NFC_STATUS_OK);
495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGE("%s: No patchfile specified or disabled. Proceeding to post-download procedure...", __FUNCTION__);
500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            postDownloadPatchram(HAL_NFC_STATUS_OK);
501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function:    nfc_hal_post_reset_init
510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Called by the NFC HAL after controller has been reset.
512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**              Begin to download firmware patch files.
513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:     none
515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_post_reset_init (UINT32 brcm_hw_id, UINT8 nvm_type)
518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
5195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    ALOGD("%s: brcm_hw_id=0x%lx, nvm_type=%d", __FUNCTION__, brcm_hw_id, nvm_type);
520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tHAL_NFC_STATUS stat = HAL_NFC_STATUS_FAILED;
521a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    UINT8 max_credits = 1, allow_no_nvm=0;
522a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
523a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    p_nfc_hal_cfg->nfc_hal_prm_nvm_required = TRUE; //don't download firmware if controller cannot detect EERPOM
524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nvm_type == NCI_SPD_NVM_TYPE_NONE)
526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
527a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        GetNumValue(NAME_ALLOW_NO_NVM, &allow_no_nvm, sizeof(allow_no_nvm));
528a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        if (allow_no_nvm == 0)
529a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        {
530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD("%s: No NVM detected, FAIL the init stage to force a retry", __FUNCTION__);
531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        USERIAL_PowerupDevice (0);
5325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        stat = HAL_NfcReInit ();
533a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            return;
534a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        }
535a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
536a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        p_nfc_hal_cfg->nfc_hal_prm_nvm_required = FALSE; //allow download firmware if controller cannot detect EERPOM
537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
538a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Start downloading the patch files */
540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        StartPatchDownload(brcm_hw_id);
541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (GetNumValue(MAX_RF_DATA_CREDITS, &max_credits, sizeof(max_credits)) && (max_credits > 0))
543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGD("%s : max_credits=%d", __FUNCTION__, max_credits);
545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            HAL_NfcSetMaxRfDataCredits(max_credits);
546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
5525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function:        mayDisableSecureElement
553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
5545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description:     Optionally adjust a TLV to disable secure element.  This feature
5555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**                  is enabled by setting the system property
5565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**                  nfc.disable_secure_element to a bit mask represented by a hex
5575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**                  octet: C0 = do not detect any secure element.
5585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**                         40 = do not detect secure element in slot 0.
5595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**                         80 = do not detect secure element in slot 1.
560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
5615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**                  config: a sequence of TLV's.
562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenvoid mayDisableSecureElement (StartupConfig& config)
565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
5665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    unsigned int bitmask = 0;
5675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    char valueStr [PROPERTY_VALUE_MAX] = {0};
5685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    int len = property_get ("nfc.disable_secure_element", valueStr, "");
5695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (len > 0)
570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
5715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        sscanf (valueStr, "%x", &bitmask); //read system property as a hex octet
5725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        ALOGD ("%s: disable 0x%02X", __FUNCTION__, (UINT8) bitmask);
5735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        config.disableSecureElement ((UINT8) (bitmask & 0xC0));
574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
576a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
577a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
578a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu/*******************************************************************************
579a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**
580a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Function:    configureCrystalFrequency
581a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**
582a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Description: Configure controller's crystal frequency by reading values from
583a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**              .conf file.  If .conf file does not define any value, then use
584a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**              default values defined in struct nfc_post_reset_cb.
585a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**
586a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Returns:     none
587a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**
588a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu*******************************************************************************/
589a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chuvoid configureCrystalFrequency ()
590a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu{
591a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    unsigned long num = 0;
592a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    UINT32 hwId = 0;
593a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    UINT16 xtalFreq = 0;
594a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    UINT8 xtalIndex = 0;
5953c8ee3d9f5df8d315dc9d47a4fb05d6411028e8aEvan Chu    int actualLen = 0;
596a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
5971569641423dac0a41af7596fdef972126e698f46Evan Chu    if (GetNumValue (NAME_XTAL_HARDWARE_ID, &num, sizeof(num)))
5981569641423dac0a41af7596fdef972126e698f46Evan Chu        hwId = num;
599a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
6001569641423dac0a41af7596fdef972126e698f46Evan Chu    if (GetNumValue (NAME_XTAL_FREQUENCY, &num, sizeof(num)))
6011569641423dac0a41af7596fdef972126e698f46Evan Chu        xtalFreq = (UINT16) num;
602a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
6031569641423dac0a41af7596fdef972126e698f46Evan Chu    if (GetNumValue (NAME_XTAL_FREQ_INDEX, &num, sizeof(num)))
6041569641423dac0a41af7596fdef972126e698f46Evan Chu        xtalIndex = (UINT8) num;
605a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
6063c8ee3d9f5df8d315dc9d47a4fb05d6411028e8aEvan Chu    actualLen = GetStrValue (NAME_XTAL_PARAMS_CFG, (char*)sConfig, sizeof(sConfig));
6073c8ee3d9f5df8d315dc9d47a4fb05d6411028e8aEvan Chu    if (actualLen && (xtalIndex == NFC_HAL_XTAL_INDEX_SPECIAL)) //whether to use custom crystal frequency
6083c8ee3d9f5df8d315dc9d47a4fb05d6411028e8aEvan Chu    {
6093c8ee3d9f5df8d315dc9d47a4fb05d6411028e8aEvan Chu        sXtalCustomParam.append (sConfig, actualLen);
6103c8ee3d9f5df8d315dc9d47a4fb05d6411028e8aEvan Chu        p_nfc_hal_dm_xtal_params_cfg = const_cast<UINT8*> (sXtalCustomParam.getInternalBuffer ());
6113c8ee3d9f5df8d315dc9d47a4fb05d6411028e8aEvan Chu    }
6123c8ee3d9f5df8d315dc9d47a4fb05d6411028e8aEvan Chu
613a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    if ((hwId == 0) && (xtalFreq == 0) && (xtalIndex == 0))
614a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        return;
615a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
616a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    ALOGD ("%s: hwId=0x%lX; freq=%u; index=%u", __FUNCTION__, hwId, xtalFreq, xtalIndex);
617a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    nfc_post_reset_cb.dev_init_config.xtal_cfg[0].brcm_hw_id = (hwId & BRCM_NFC_GEN_MASK);
618a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    nfc_post_reset_cb.dev_init_config.xtal_cfg[0].xtal_freq  = xtalFreq;
619a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    nfc_post_reset_cb.dev_init_config.xtal_cfg[0].xtal_index = xtalIndex;
620a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    nfc_post_reset_cb.dev_init_config.num_xtal_cfg = 1;
621a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu}
622