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