1 /****************************************************************************** 2 * 3 * Copyright (C) 1999-2012 Broadcom Corporation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 #include "OverrideLog.h" 19 #include "config.h" 20 #include "nfc_hal_int.h" 21 #include "userial.h" 22 extern "C" 23 { 24 #include "nfc_hal_post_reset.h" 25 } 26 #include <malloc.h> 27 #include <string> 28 #include <cutils/properties.h> 29 #include "spdhelper.h" 30 #include "StartupConfig.h" 31 32 #define LOG_TAG "NfcNciHal" 33 34 #define FW_PRE_PATCH "FW_PRE_PATCH" 35 #define FW_PATCH "FW_PATCH" 36 #define MAX_RF_DATA_CREDITS "MAX_RF_DATA_CREDITS" 37 38 #define MAX_BUFFER (512) 39 static char sPrePatchFn[MAX_BUFFER+1]; 40 static char sPatchFn[MAX_BUFFER+1]; 41 static void * sPrmBuf = NULL; 42 static void * sI2cFixPrmBuf = NULL; 43 44 #define CONFIG_MAX_LEN 256 45 static UINT8 sConfig [CONFIG_MAX_LEN]; 46 static StartupConfig sStartupConfig; 47 static StartupConfig sLptdConfig; 48 static StartupConfig sPreDiscoveryConfig; 49 static StartupConfig sXtalCustomParam; 50 extern UINT8 *p_nfc_hal_dm_start_up_cfg; //defined in the HAL 51 static UINT8 nfa_dm_start_up_vsc_cfg[CONFIG_MAX_LEN]; 52 extern UINT8 *p_nfc_hal_dm_start_up_vsc_cfg; //defined in the HAL 53 extern UINT8 *p_nfc_hal_dm_lptd_cfg; //defined in the HAL 54 static UINT8 sDontSendLptd[] = { 0 }; 55 extern UINT8 *p_nfc_hal_pre_discover_cfg; //defined in the HAL 56 extern UINT8 *p_nfc_hal_dm_xtal_params_cfg; //defined in HAL 57 58 extern tSNOOZE_MODE_CONFIG gSnoozeModeCfg; 59 extern tNFC_HAL_CFG *p_nfc_hal_cfg; 60 static void mayDisableSecureElement (StartupConfig& config); 61 62 /* Default patchfile (in NCD format) */ 63 #ifndef NFA_APP_DEFAULT_PATCHFILE_NAME 64 #define NFA_APP_DEFAULT_PATCHFILE_NAME "\0" 65 #endif 66 67 /* Default patchfile (in NCD format) */ 68 #ifndef NFA_APP_DEFAULT_I2C_PATCHFILE_NAME 69 #define NFA_APP_DEFAULT_I2C_PATCHFILE_NAME "\0" 70 #endif 71 72 tNFC_POST_RESET_CB nfc_post_reset_cb = 73 { 74 /* Default Patch & Pre-Patch */ 75 NFA_APP_DEFAULT_PATCHFILE_NAME, 76 NULL, 77 NFA_APP_DEFAULT_I2C_PATCHFILE_NAME, 78 NULL, 79 80 /* Default UART baud rate */ 81 NFC_HAL_DEFAULT_BAUD, 82 83 /* Default tNFC_HAL_DEV_INIT_CFG (flags, num_xtal_cfg, {brcm_hw_id, xtal-freq, xtal-index} ) */ 84 { 85 2, /* number of valid entries */ 86 { 87 {0x43341000, 37400, NFC_HAL_XTAL_INDEX_37400}, // All revisions of 43341 use 37,400 88 {0x20795000, 26000, NFC_HAL_XTAL_INDEX_26000}, 89 {0, 0, 0}, 90 {0, 0, 0}, 91 {0, 0, 0}, 92 } 93 }, 94 95 /* Default low power mode settings */ 96 NFC_HAL_LP_SNOOZE_MODE_NONE, /* Snooze Mode */ 97 NFC_HAL_LP_IDLE_THRESHOLD_HOST, /* Idle Threshold Host */ 98 NFC_HAL_LP_IDLE_THRESHOLD_HC, /* Idle Threshold HC */ 99 NFC_HAL_LP_ACTIVE_LOW, /* NFC_WAKE Active Mode */ 100 NFC_HAL_LP_ACTIVE_HIGH, /* DH_WAKE Active Mode */ 101 102 NFA_APP_MAX_NUM_REINIT, /* max retry to get NVM type */ 103 0, /* current retry count */ 104 TRUE, /* debug mode for downloading patchram */ 105 FALSE /* skip downloading patchram after reinit because of patch download failure */ 106 }; 107 108 109 /******************************************************************************* 110 ** 111 ** Function getFileLength 112 ** 113 ** Description return the size of a file 114 ** 115 ** Returns file size in number of bytes 116 ** 117 *******************************************************************************/ 118 static long getFileLength(FILE* fp) 119 { 120 long sz; 121 fseek(fp, 0L, SEEK_END); 122 sz = ftell(fp); 123 fseek(fp, 0L, SEEK_SET); 124 125 return (sz > 0) ? sz : 0; 126 } 127 128 /******************************************************************************* 129 ** 130 ** Function isFileExist 131 ** 132 ** Description Check if file name exists (android does not support fexists) 133 ** 134 ** Returns TRUE if file exists 135 ** 136 *******************************************************************************/ 137 static BOOLEAN isFileExist(const char *pFilename) 138 { 139 FILE *pf; 140 141 if ((pf = fopen(pFilename, "r")) != NULL) 142 { 143 fclose(pf); 144 return TRUE; 145 } 146 return FALSE; 147 } 148 149 /******************************************************************************* 150 ** 151 ** Function findPatchramFile 152 ** 153 ** Description Find the patchram file name specified in the .conf 154 ** 155 ** Returns pointer to the file name 156 ** 157 *******************************************************************************/ 158 static const char* findPatchramFile(const char * pConfigName, char * pBuffer, int bufferLen) 159 { 160 ALOGD("%s: config=%s", __FUNCTION__, pConfigName); 161 162 if (pConfigName == NULL) 163 { 164 ALOGD("%s No patchfile defined\n", __FUNCTION__); 165 return NULL; 166 } 167 168 if (GetStrValue(pConfigName, &pBuffer[0], bufferLen)) 169 { 170 ALOGD("%s found patchfile %s\n", __FUNCTION__, pBuffer); 171 return (pBuffer[0] == '\0') ? NULL : pBuffer; 172 } 173 174 ALOGD("%s Cannot find patchfile '%s'\n", __FUNCTION__, pConfigName); 175 return NULL; 176 } 177 178 /******************************************************************************* 179 ** 180 ** Function: continueAfterSetSnoozeMode 181 ** 182 ** Description: Called after Snooze Mode is enabled. 183 ** 184 ** Returns: none 185 ** 186 *******************************************************************************/ 187 static void continueAfterSetSnoozeMode(tHAL_NFC_STATUS status) 188 { 189 ALOGD("%s: status=%u", __FUNCTION__, status); 190 //let stack download firmware during next initialization 191 nfc_post_reset_cb.spd_skip_on_power_cycle = FALSE; 192 if (status == NCI_STATUS_OK) 193 HAL_NfcPreInitDone (HAL_NFC_STATUS_OK); 194 else 195 HAL_NfcPreInitDone (HAL_NFC_STATUS_FAILED); 196 } 197 198 /******************************************************************************* 199 ** 200 ** Function: postDownloadPatchram 201 ** 202 ** Description: Called after patch download 203 ** 204 ** Returns: none 205 ** 206 *******************************************************************************/ 207 static void postDownloadPatchram(tHAL_NFC_STATUS status) 208 { 209 ALOGD("%s: status=%i", __FUNCTION__, status); 210 GetStrValue (NAME_SNOOZE_MODE_CFG, (char*)&gSnoozeModeCfg, sizeof(gSnoozeModeCfg)); 211 if (status != HAL_NFC_STATUS_OK) 212 { 213 ALOGE("%s: Patch download failed", __FUNCTION__); 214 if (status == HAL_NFC_STATUS_REFUSED) 215 { 216 SpdHelper::setPatchAsBad(); 217 } 218 else 219 SpdHelper::incErrorCount(); 220 221 /* If in SPD Debug mode, fail immediately and obviously */ 222 if (SpdHelper::isSpdDebug()) 223 HAL_NfcPreInitDone (HAL_NFC_STATUS_FAILED); 224 else 225 { 226 /* otherwise, power cycle the chip and let the stack startup normally */ 227 ALOGD("%s: re-init; don't download firmware", __FUNCTION__); 228 //stop stack from downloading firmware during next initialization 229 nfc_post_reset_cb.spd_skip_on_power_cycle = TRUE; 230 USERIAL_PowerupDevice(0); 231 HAL_NfcReInit (); 232 } 233 } 234 /* Set snooze mode here */ 235 else if (gSnoozeModeCfg.snooze_mode != NFC_HAL_LP_SNOOZE_MODE_NONE) 236 { 237 status = HAL_NfcSetSnoozeMode(gSnoozeModeCfg.snooze_mode, 238 gSnoozeModeCfg.idle_threshold_dh, 239 gSnoozeModeCfg.idle_threshold_nfcc, 240 gSnoozeModeCfg.nfc_wake_active_mode, 241 gSnoozeModeCfg.dh_wake_active_mode, 242 continueAfterSetSnoozeMode); 243 if (status != NCI_STATUS_OK) 244 { 245 ALOGE("%s: Setting snooze mode failed, status=%i", __FUNCTION__, status); 246 HAL_NfcPreInitDone(HAL_NFC_STATUS_FAILED); 247 } 248 } 249 else 250 { 251 ALOGD("%s: Not using Snooze Mode", __FUNCTION__); 252 HAL_NfcPreInitDone(HAL_NFC_STATUS_OK); 253 } 254 } 255 256 257 /******************************************************************************* 258 ** 259 ** Function: prmCallback 260 ** 261 ** Description: Patchram callback (for static patchram mode) 262 ** 263 ** Returns: none 264 ** 265 *******************************************************************************/ 266 void prmCallback(UINT8 event) 267 { 268 ALOGD("%s: event=0x%x", __FUNCTION__, event); 269 switch (event) 270 { 271 case NFC_HAL_PRM_CONTINUE_EVT: 272 /* This event does not occur if static patchram buf is used */ 273 break; 274 275 case NFC_HAL_PRM_COMPLETE_EVT: 276 postDownloadPatchram(HAL_NFC_STATUS_OK); 277 break; 278 279 case NFC_HAL_PRM_ABORT_EVT: 280 postDownloadPatchram(HAL_NFC_STATUS_FAILED); 281 break; 282 283 case NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT: 284 ALOGD("%s: invalid patch...skipping patch download", __FUNCTION__); 285 postDownloadPatchram(HAL_NFC_STATUS_REFUSED); 286 break; 287 288 case NFC_HAL_PRM_ABORT_BAD_SIGNATURE_EVT: 289 ALOGD("%s: patch authentication failed", __FUNCTION__); 290 postDownloadPatchram(HAL_NFC_STATUS_REFUSED); 291 break; 292 293 case NFC_HAL_PRM_ABORT_NO_NVM_EVT: 294 ALOGD("%s: No NVM detected", __FUNCTION__); 295 HAL_NfcPreInitDone(HAL_NFC_STATUS_FAILED); 296 break; 297 298 default: 299 ALOGD("%s: not handled event=0x%x", __FUNCTION__, event); 300 break; 301 } 302 } 303 304 305 /******************************************************************************* 306 ** 307 ** Function getNfaValues 308 ** 309 ** Description Get configuration values needed by NFA layer 310 ** 311 ** Returns: None 312 ** 313 *******************************************************************************/ 314 static void getNfaValues (UINT32 chipid) 315 { 316 unsigned long num = 0; 317 int actualLen = 0; 318 319 sStartupConfig.initialize (); 320 sLptdConfig.initialize (); 321 sPreDiscoveryConfig.initialize(); 322 323 actualLen = GetStrValue (NAME_NFA_DM_START_UP_CFG, (char*)sConfig, sizeof(sConfig)); 324 if (actualLen) 325 sStartupConfig.append (sConfig, actualLen); 326 327 // Set antenna tuning configuration if configured. 328 actualLen = GetStrValue(NAME_PREINIT_DSP_CFG, (char*)sConfig, sizeof(sConfig)); 329 if (actualLen) 330 sStartupConfig.append (sConfig, actualLen); 331 332 if ( GetStrValue ( NAME_NFA_DM_START_UP_VSC_CFG, (char*)nfa_dm_start_up_vsc_cfg, sizeof (nfa_dm_start_up_vsc_cfg) ) ) 333 { 334 p_nfc_hal_dm_start_up_vsc_cfg = &nfa_dm_start_up_vsc_cfg[0]; 335 ALOGD ( "START_UP_VSC_CFG[0] = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", 336 nfa_dm_start_up_vsc_cfg[0], 337 nfa_dm_start_up_vsc_cfg[1], 338 nfa_dm_start_up_vsc_cfg[2], 339 nfa_dm_start_up_vsc_cfg[3], 340 nfa_dm_start_up_vsc_cfg[4], 341 nfa_dm_start_up_vsc_cfg[5], 342 nfa_dm_start_up_vsc_cfg[6], 343 nfa_dm_start_up_vsc_cfg[7] ); 344 } 345 346 actualLen = GetStrValue(NAME_LPTD_CFG, (char*)sConfig, sizeof(sConfig)); 347 if (actualLen) 348 { 349 sLptdConfig.append (sConfig, actualLen); 350 p_nfc_hal_dm_lptd_cfg = const_cast<UINT8*> (sLptdConfig.getInternalBuffer ()); 351 } 352 else 353 { 354 // Default to not sending any LPTD setting. 355 p_nfc_hal_dm_lptd_cfg = sDontSendLptd; 356 } 357 358 mayDisableSecureElement (sStartupConfig); 359 p_nfc_hal_dm_start_up_cfg = const_cast<UINT8*> (sStartupConfig.getInternalBuffer ()); 360 361 actualLen = GetStrValue(NAME_NFA_DM_PRE_DISCOVERY_CFG, (char*)sConfig, sizeof(sConfig)); 362 if (actualLen) 363 { 364 sPreDiscoveryConfig.append (sConfig, actualLen); 365 mayDisableSecureElement (sPreDiscoveryConfig); 366 p_nfc_hal_pre_discover_cfg = const_cast<UINT8*> (sPreDiscoveryConfig.getInternalBuffer ()); 367 } 368 369 //configure how many secure elements are available for each type of chip 370 if (p_nfc_hal_cfg->nfc_hal_hci_uicc_support > 0) 371 { 372 if ((chipid & BRCM_NFC_GEN_MASK) == BRCM_NFC_20791_GEN) 373 { 374 nfc_hal_cb.max_ee = BRCM_NFC_20791_GEN_MAX_EE; 375 p_nfc_hal_cfg->nfc_hal_hci_uicc_support = HAL_NFC_HCI_UICC0_HOST | HAL_NFC_HCI_UICC1_HOST; 376 } 377 else if ((chipid & BRCM_NFC_GEN_MASK) == BRCM_NFC_43341_GEN) 378 { 379 nfc_hal_cb.max_ee = BRCM_NFC_43341_GEN_MAX_EE; 380 p_nfc_hal_cfg->nfc_hal_hci_uicc_support = HAL_NFC_HCI_UICC0_HOST | HAL_NFC_HCI_UICC1_HOST; 381 } 382 else if ((chipid & BRCM_NFC_GEN_MASK) == BRCM_NFC_20795_GEN) 383 { 384 nfc_hal_cb.max_ee = BRCM_NFC_20795_GEN_MAX_EE; 385 p_nfc_hal_cfg->nfc_hal_hci_uicc_support = HAL_NFC_HCI_UICC0_HOST | HAL_NFC_HCI_UICC1_HOST | HAL_NFC_HCI_UICC2_HOST; 386 } 387 388 //let .conf variable determine how many EE's to discover 389 if (GetNumValue(NAME_NFA_MAX_EE_SUPPORTED, &num, sizeof(num))) 390 nfc_hal_cb.max_ee = num; 391 } 392 } 393 394 /******************************************************************************* 395 ** 396 ** Function StartPatchDownload 397 ** 398 ** Description Reads configuration settings, and begins the download 399 ** process if patch files are configured. 400 ** 401 ** Returns: None 402 ** 403 *******************************************************************************/ 404 static void StartPatchDownload(UINT32 chipid) 405 { 406 ALOGD ("%s: chipid=%lx",__FUNCTION__, chipid); 407 408 char chipID[30]; 409 sprintf(chipID, "%lx", chipid); 410 ALOGD ("%s: chidId=%s", __FUNCTION__, chipID); 411 412 readOptionalConfig(chipID); // Read optional chip specific settings 413 readOptionalConfig("fime"); // Read optional FIME specific settings 414 getNfaValues(chipid); // Get NFA configuration values into variables 415 416 findPatchramFile(FW_PATCH, sPatchFn, sizeof(sPatchFn)); 417 findPatchramFile(FW_PRE_PATCH, sPrePatchFn, sizeof(sPatchFn)); 418 419 { 420 FILE *fd; 421 /* If an I2C fix patch file was specified, then tell the stack about it */ 422 if (sPrePatchFn[0] != '\0') 423 { 424 if ((fd = fopen(sPrePatchFn, "rb")) != NULL) 425 { 426 UINT32 lenPrmBuffer = getFileLength(fd); 427 428 if ((sI2cFixPrmBuf = malloc(lenPrmBuffer)) != NULL) 429 { 430 size_t actualLen = fread(sI2cFixPrmBuf, 1, lenPrmBuffer, fd); 431 if (actualLen == lenPrmBuffer) 432 { 433 ALOGD("%s Setting I2C fix to %s (size: %lu)", __FUNCTION__, sPrePatchFn, lenPrmBuffer); 434 HAL_NfcPrmSetI2cPatch((UINT8*)sI2cFixPrmBuf, (UINT16)lenPrmBuffer, 0); 435 } 436 else 437 ALOGE("%s fail reading i2c fix; actual len=%u; expected len=%lu", __FUNCTION__, actualLen, lenPrmBuffer); 438 } 439 else 440 { 441 ALOGE("%s Unable to get buffer to i2c fix (%lu bytes)", __FUNCTION__, lenPrmBuffer); 442 } 443 444 fclose(fd); 445 } 446 else 447 { 448 ALOGE("%s Unable to open i2c fix patchfile %s", __FUNCTION__, sPrePatchFn); 449 } 450 } 451 } 452 453 { 454 FILE *fd; 455 456 /* If a patch file was specified, then download it now */ 457 if (sPatchFn[0] != '\0') 458 { 459 UINT32 bDownloadStarted = false; 460 461 /* open patchfile, read it into a buffer */ 462 if ((fd = fopen(sPatchFn, "rb")) != NULL) 463 { 464 UINT32 lenPrmBuffer = getFileLength(fd); 465 ALOGD("%s Downloading patchfile %s (size: %lu) format=%u", __FUNCTION__, sPatchFn, lenPrmBuffer, NFC_HAL_PRM_FORMAT_NCD); 466 if ((sPrmBuf = malloc(lenPrmBuffer)) != NULL) 467 { 468 size_t actualLen = fread(sPrmBuf, 1, lenPrmBuffer, fd); 469 if (actualLen == lenPrmBuffer) 470 { 471 if (!SpdHelper::isPatchBad((UINT8*)sPrmBuf, lenPrmBuffer)) 472 { 473 /* Download patch using static memeory mode */ 474 HAL_NfcPrmDownloadStart(NFC_HAL_PRM_FORMAT_NCD, 0, (UINT8*)sPrmBuf, lenPrmBuffer, 0, prmCallback); 475 bDownloadStarted = true; 476 } 477 } 478 else 479 ALOGE("%s fail reading patchram", __FUNCTION__); 480 } 481 else 482 ALOGE("%s Unable to buffer to hold patchram (%lu bytes)", __FUNCTION__, lenPrmBuffer); 483 484 fclose(fd); 485 } 486 else 487 ALOGE("%s Unable to open patchfile %s", __FUNCTION__, sPatchFn); 488 489 /* If the download never got started */ 490 if (!bDownloadStarted) 491 { 492 /* If debug mode, fail in an obvious way, otherwise try to start stack */ 493 postDownloadPatchram(SpdHelper::isSpdDebug() ? HAL_NFC_STATUS_FAILED : 494 HAL_NFC_STATUS_OK); 495 } 496 } 497 else 498 { 499 ALOGE("%s: No patchfile specified or disabled. Proceeding to post-download procedure...", __FUNCTION__); 500 postDownloadPatchram(HAL_NFC_STATUS_OK); 501 } 502 } 503 504 ALOGD ("%s: exit", __FUNCTION__); 505 } 506 507 /******************************************************************************* 508 ** 509 ** Function: nfc_hal_post_reset_init 510 ** 511 ** Description: Called by the NFC HAL after controller has been reset. 512 ** Begin to download firmware patch files. 513 ** 514 ** Returns: none 515 ** 516 *******************************************************************************/ 517 void nfc_hal_post_reset_init (UINT32 brcm_hw_id, UINT8 nvm_type) 518 { 519 ALOGD("%s: brcm_hw_id=0x%lx, nvm_type=%d", __FUNCTION__, brcm_hw_id, nvm_type); 520 tHAL_NFC_STATUS stat = HAL_NFC_STATUS_FAILED; 521 UINT8 max_credits = 1, allow_no_nvm=0; 522 523 p_nfc_hal_cfg->nfc_hal_prm_nvm_required = TRUE; //don't download firmware if controller cannot detect EERPOM 524 525 if (nvm_type == NCI_SPD_NVM_TYPE_NONE) 526 { 527 GetNumValue(NAME_ALLOW_NO_NVM, &allow_no_nvm, sizeof(allow_no_nvm)); 528 if (allow_no_nvm == 0) 529 { 530 ALOGD("%s: No NVM detected, FAIL the init stage to force a retry", __FUNCTION__); 531 USERIAL_PowerupDevice (0); 532 stat = HAL_NfcReInit (); 533 return; 534 } 535 536 p_nfc_hal_cfg->nfc_hal_prm_nvm_required = FALSE; //allow download firmware if controller cannot detect EERPOM 537 } 538 539 /* Start downloading the patch files */ 540 StartPatchDownload(brcm_hw_id); 541 542 if (GetNumValue(MAX_RF_DATA_CREDITS, &max_credits, sizeof(max_credits)) && (max_credits > 0)) 543 { 544 ALOGD("%s : max_credits=%d", __FUNCTION__, max_credits); 545 HAL_NfcSetMaxRfDataCredits(max_credits); 546 } 547 } 548 549 550 /******************************************************************************* 551 ** 552 ** Function: mayDisableSecureElement 553 ** 554 ** Description: Optionally adjust a TLV to disable secure element. This feature 555 ** is enabled by setting the system property 556 ** nfc.disable_secure_element to a bit mask represented by a hex 557 ** octet: C0 = do not detect any secure element. 558 ** 40 = do not detect secure element in slot 0. 559 ** 80 = do not detect secure element in slot 1. 560 ** 561 ** config: a sequence of TLV's. 562 ** 563 *******************************************************************************/ 564 void mayDisableSecureElement (StartupConfig& config) 565 { 566 unsigned int bitmask = 0; 567 char valueStr [PROPERTY_VALUE_MAX] = {0}; 568 int len = property_get ("nfc.disable_secure_element", valueStr, ""); 569 if (len > 0) 570 { 571 sscanf (valueStr, "%x", &bitmask); //read system property as a hex octet 572 ALOGD ("%s: disable 0x%02X", __FUNCTION__, (UINT8) bitmask); 573 config.disableSecureElement ((UINT8) (bitmask & 0xC0)); 574 } 575 } 576 577 578 /******************************************************************************* 579 ** 580 ** Function: configureCrystalFrequency 581 ** 582 ** Description: Configure controller's crystal frequency by reading values from 583 ** .conf file. If .conf file does not define any value, then use 584 ** default values defined in struct nfc_post_reset_cb. 585 ** 586 ** Returns: none 587 ** 588 *******************************************************************************/ 589 void configureCrystalFrequency () 590 { 591 unsigned long num = 0; 592 UINT32 hwId = 0; 593 UINT16 xtalFreq = 0; 594 UINT8 xtalIndex = 0; 595 int actualLen = 0; 596 597 if (GetNumValue (NAME_XTAL_HARDWARE_ID, &num, sizeof(num))) 598 hwId = num; 599 600 if (GetNumValue (NAME_XTAL_FREQUENCY, &num, sizeof(num))) 601 xtalFreq = (UINT16) num; 602 603 if (GetNumValue (NAME_XTAL_FREQ_INDEX, &num, sizeof(num))) 604 xtalIndex = (UINT8) num; 605 606 actualLen = GetStrValue (NAME_XTAL_PARAMS_CFG, (char*)sConfig, sizeof(sConfig)); 607 if (actualLen && (xtalIndex == NFC_HAL_XTAL_INDEX_SPECIAL)) //whether to use custom crystal frequency 608 { 609 sXtalCustomParam.append (sConfig, actualLen); 610 p_nfc_hal_dm_xtal_params_cfg = const_cast<UINT8*> (sXtalCustomParam.getInternalBuffer ()); 611 } 612 613 if ((hwId == 0) && (xtalFreq == 0) && (xtalIndex == 0)) 614 return; 615 616 ALOGD ("%s: hwId=0x%lX; freq=%u; index=%u", __FUNCTION__, hwId, xtalFreq, xtalIndex); 617 nfc_post_reset_cb.dev_init_config.xtal_cfg[0].brcm_hw_id = (hwId & BRCM_NFC_GEN_MASK); 618 nfc_post_reset_cb.dev_init_config.xtal_cfg[0].xtal_freq = xtalFreq; 619 nfc_post_reset_cb.dev_init_config.xtal_cfg[0].xtal_index = xtalIndex; 620 nfc_post_reset_cb.dev_init_config.num_xtal_cfg = 1; 621 } 622