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