1 /****************************************************************************** 2 * 3 * Copyright 2018 NXP 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 #define LOG_TAG "NxpEseHal" 19 #include <log/log.h> 20 21 #include <cutils/properties.h> 22 #include <ese_config.h> 23 #include <phNxpEseFeatures.h> 24 #include <phNxpEsePal.h> 25 #include <phNxpEsePal_spi.h> 26 #include <phNxpEseProto7816_3.h> 27 #include <phNxpEse_Internal.h> 28 29 #define RECIEVE_PACKET_SOF 0xA5 30 #define PH_PAL_ESE_PRINT_PACKET_TX(data, len) \ 31 ({ phPalEse_print_packet("SEND", data, len); }) 32 #define PH_PAL_ESE_PRINT_PACKET_RX(data, len) \ 33 ({ phPalEse_print_packet("RECV", data, len); }) 34 static int phNxpEse_readPacket(void* pDevHandle, uint8_t* pBuffer, 35 int nNbBytesToRead); 36 #ifdef NXP_ESE_JCOP_DWNLD_PROTECTION 37 static ESESTATUS phNxpEse_checkJcopDwnldState(void); 38 static ESESTATUS phNxpEse_setJcopDwnldState(phNxpEse_JcopDwnldState state); 39 #endif 40 #ifdef NXP_NFCC_SPI_FW_DOWNLOAD_SYNC 41 static ESESTATUS phNxpEse_checkFWDwnldStatus(void); 42 #endif 43 static void phNxpEse_GetMaxTimer(unsigned long* pMaxTimer); 44 #ifdef NXP_SECURE_TIMER_SESSION 45 static unsigned char* phNxpEse_GgetTimerTlvBuffer(unsigned char* timer_buffer, 46 unsigned int value); 47 #endif 48 /*********************** Global Variables *************************************/ 49 50 /* ESE Context structure */ 51 phNxpEse_Context_t nxpese_ctxt; 52 bool ese_debug_enabled = true; 53 54 /****************************************************************************** 55 * Function phNxpLog_InitializeLogLevel 56 * 57 * Description This function is called during phNxpEse_init to initialize 58 * debug log level. 59 * 60 * Returns None 61 * 62 ******************************************************************************/ 63 64 void phNxpLog_InitializeLogLevel() { 65 ese_debug_enabled = 66 (EseConfig::getUnsigned(NAME_SE_DEBUG_ENABLED, 0) != 0) ? true : false; 67 68 char valueStr[PROPERTY_VALUE_MAX] = {0}; 69 int len = property_get("vendor.ese.debug_enabled", valueStr, ""); 70 if (len > 0) { 71 // let Android property override .conf variable 72 unsigned debug_enabled = 0; 73 sscanf(valueStr, "%u", &debug_enabled); 74 ese_debug_enabled = (debug_enabled == 0) ? false : true; 75 } 76 77 ALOGD_IF(ese_debug_enabled, "%s: level=%u", __func__, ese_debug_enabled); 78 } 79 80 /****************************************************************************** 81 * Function phNxpEse_init 82 * 83 * Description This function is called by Jni/phNxpEse_open during the 84 * initialization of the ESE. It initializes protocol stack 85 *instance variable 86 * 87 * Returns This function return ESESTATUS_SUCCES (0) in case of success 88 * In case of failure returns other failure value. 89 * 90 ******************************************************************************/ 91 ESESTATUS phNxpEse_init(phNxpEse_initParams initParams) { 92 ESESTATUS wConfigStatus = ESESTATUS_FAILED; 93 unsigned long int num; 94 unsigned long maxTimer = 0; 95 phNxpEseProto7816InitParam_t protoInitParam; 96 phNxpEse_memset(&protoInitParam, 0x00, sizeof(phNxpEseProto7816InitParam_t)); 97 /* STATUS_OPEN */ 98 nxpese_ctxt.EseLibStatus = ESE_STATUS_OPEN; 99 100 if (EseConfig::hasKey(NAME_NXP_WTX_COUNT_VALUE)) { 101 num = EseConfig::getUnsigned(NAME_NXP_WTX_COUNT_VALUE); 102 protoInitParam.wtx_counter_limit = num; 103 ALOGD_IF(ese_debug_enabled, "Wtx_counter read from config file - %lu", 104 protoInitParam.wtx_counter_limit); 105 } else { 106 protoInitParam.wtx_counter_limit = PH_PROTO_WTX_DEFAULT_COUNT; 107 } 108 if (EseConfig::hasKey(NAME_NXP_MAX_RNACK_RETRY)) { 109 protoInitParam.rnack_retry_limit = 110 EseConfig::getUnsigned(NAME_NXP_MAX_RNACK_RETRY); 111 } else { 112 protoInitParam.rnack_retry_limit = MAX_RNACK_RETRY_LIMIT; 113 } 114 if (ESE_MODE_NORMAL == 115 initParams.initMode) /* TZ/Normal wired mode should come here*/ 116 { 117 if (EseConfig::hasKey(NAME_NXP_SPI_INTF_RST_ENABLE)) { 118 protoInitParam.interfaceReset = 119 (EseConfig::getUnsigned(NAME_NXP_SPI_INTF_RST_ENABLE) == 1) ? true 120 : false; 121 } else { 122 protoInitParam.interfaceReset = true; 123 } 124 } else /* OSU mode, no interface reset is required */ 125 { 126 protoInitParam.interfaceReset = false; 127 } 128 /* Sharing lib context for fetching secure timer values */ 129 protoInitParam.pSecureTimerParams = 130 (phNxpEseProto7816SecureTimer_t*)&nxpese_ctxt.secureTimerParams; 131 132 ALOGD_IF(ese_debug_enabled, 133 "%s secureTimer1 0x%x secureTimer2 0x%x secureTimer3 0x%x", 134 __FUNCTION__, nxpese_ctxt.secureTimerParams.secureTimer1, 135 nxpese_ctxt.secureTimerParams.secureTimer2, 136 nxpese_ctxt.secureTimerParams.secureTimer3); 137 138 phNxpEse_GetMaxTimer(&maxTimer); 139 140 /* T=1 Protocol layer open */ 141 wConfigStatus = phNxpEseProto7816_Open(protoInitParam); 142 if (ESESTATUS_FAILED == wConfigStatus) { 143 wConfigStatus = ESESTATUS_FAILED; 144 ALOGE("phNxpEseProto7816_Open failed"); 145 } 146 return wConfigStatus; 147 } 148 149 /****************************************************************************** 150 * Function phNxpEse_open 151 * 152 * Description This function is called by Jni during the 153 * initialization of the ESE. It opens the physical connection 154 * with ESE and creates required client thread for 155 * operation. 156 * Returns This function return ESESTATUS_SUCCES (0) in case of success 157 * In case of failure returns other failure value. 158 * 159 ******************************************************************************/ 160 ESESTATUS phNxpEse_open(phNxpEse_initParams initParams) { 161 phPalEse_Config_t tPalConfig; 162 ESESTATUS wConfigStatus = ESESTATUS_SUCCESS; 163 unsigned long int tpm_enable = 0; 164 char ese_dev_node[64]; 165 std::string ese_node; 166 #ifdef SPM_INTEGRATED 167 ESESTATUS wSpmStatus = ESESTATUS_SUCCESS; 168 spm_state_t current_spm_state = SPM_STATE_INVALID; 169 #endif 170 171 ALOGE("phNxpEse_open Enter"); 172 /*When spi channel is already opened return status as FAILED*/ 173 if (nxpese_ctxt.EseLibStatus != ESE_STATUS_CLOSE) { 174 ALOGD_IF(ese_debug_enabled, "already opened\n"); 175 return ESESTATUS_BUSY; 176 } 177 178 phNxpEse_memset(&nxpese_ctxt, 0x00, sizeof(nxpese_ctxt)); 179 phNxpEse_memset(&tPalConfig, 0x00, sizeof(tPalConfig)); 180 181 ALOGE("MW SEAccessKit Version"); 182 ALOGE("Android Version:0x%x", NXP_ANDROID_VER); 183 ALOGE("Major Version:0x%x", ESELIB_MW_VERSION_MAJ); 184 ALOGE("Minor Version:0x%x", ESELIB_MW_VERSION_MIN); 185 186 if (EseConfig::hasKey(NAME_NXP_TP_MEASUREMENT)) { 187 tpm_enable = EseConfig::getUnsigned(NAME_NXP_TP_MEASUREMENT); 188 ALOGE( 189 "SPI Throughput measurement enable/disable read from config file - %lu", 190 tpm_enable); 191 } else { 192 ALOGE("SPI Throughput not defined in config file - %lu", tpm_enable); 193 } 194 #ifdef NXP_POWER_SCHEME_SUPPORT 195 unsigned long int num = 0; 196 if (EseConfig::hasKey(NAME_NXP_POWER_SCHEME)) { 197 num = EseConfig::getUnsigned(NAME_NXP_POWER_SCHEME); 198 nxpese_ctxt.pwr_scheme = num; 199 ALOGE("Power scheme read from config file - %lu", num); 200 } else { 201 nxpese_ctxt.pwr_scheme = PN67T_POWER_SCHEME; 202 ALOGE("Power scheme not defined in config file - %lu", num); 203 } 204 #else 205 nxpese_ctxt.pwr_scheme = PN67T_POWER_SCHEME; 206 tpm_enable = 0x00; 207 #endif 208 /* initialize trace level */ 209 phNxpLog_InitializeLogLevel(); 210 211 /*Read device node path*/ 212 ese_node = EseConfig::getString(NAME_NXP_ESE_DEV_NODE, "/dev/pn81a"); 213 strcpy(ese_dev_node, ese_node.c_str()); 214 tPalConfig.pDevName = (int8_t*)ese_dev_node; 215 216 /* Initialize PAL layer */ 217 wConfigStatus = phPalEse_open_and_configure(&tPalConfig); 218 if (wConfigStatus != ESESTATUS_SUCCESS) { 219 ALOGE("phPalEse_Init Failed"); 220 goto clean_and_return; 221 } 222 /* Copying device handle to ESE Lib context*/ 223 nxpese_ctxt.pDevHandle = tPalConfig.pDevHandle; 224 225 #ifdef SPM_INTEGRATED 226 /* Get the Access of ESE*/ 227 wSpmStatus = phNxpEse_SPM_Init(nxpese_ctxt.pDevHandle); 228 if (wSpmStatus != ESESTATUS_SUCCESS) { 229 ALOGE("phNxpEse_SPM_Init Failed"); 230 wConfigStatus = ESESTATUS_FAILED; 231 goto clean_and_return_2; 232 } 233 wSpmStatus = phNxpEse_SPM_SetPwrScheme(nxpese_ctxt.pwr_scheme); 234 if (wSpmStatus != ESESTATUS_SUCCESS) { 235 ALOGE(" %s : phNxpEse_SPM_SetPwrScheme Failed", __FUNCTION__); 236 wConfigStatus = ESESTATUS_FAILED; 237 goto clean_and_return_1; 238 } 239 #ifdef NXP_NFCC_SPI_FW_DOWNLOAD_SYNC 240 wConfigStatus = phNxpEse_checkFWDwnldStatus(); 241 if (wConfigStatus != ESESTATUS_SUCCESS) { 242 ALOGD_IF(ese_debug_enabled, 243 "Failed to open SPI due to VEN pin used by FW download \n"); 244 wConfigStatus = ESESTATUS_FAILED; 245 goto clean_and_return_1; 246 } 247 #endif 248 wSpmStatus = phNxpEse_SPM_GetState(¤t_spm_state); 249 if (wSpmStatus != ESESTATUS_SUCCESS) { 250 ALOGE(" %s : phNxpEse_SPM_GetPwrState Failed", __FUNCTION__); 251 wConfigStatus = ESESTATUS_FAILED; 252 goto clean_and_return_1; 253 } else { 254 if ((current_spm_state & SPM_STATE_SPI) | 255 (current_spm_state & SPM_STATE_SPI_PRIO)) { 256 ALOGE(" %s : SPI is already opened...second instance not allowed", 257 __FUNCTION__); 258 wConfigStatus = ESESTATUS_FAILED; 259 goto clean_and_return_1; 260 } 261 } 262 #ifdef NXP_ESE_JCOP_DWNLD_PROTECTION 263 if (current_spm_state & SPM_STATE_JCOP_DWNLD) { 264 ALOGE(" %s : Denying to open JCOP Download in progress", __FUNCTION__); 265 wConfigStatus = ESESTATUS_FAILED; 266 goto clean_and_return_1; 267 } 268 #endif 269 phNxpEse_memcpy(&nxpese_ctxt.initParams, &initParams, 270 sizeof(phNxpEse_initParams)); 271 #ifdef NXP_ESE_JCOP_DWNLD_PROTECTION 272 /* Updating ESE power state based on the init mode */ 273 if (ESE_MODE_OSU == nxpese_ctxt.initParams.initMode) { 274 ALOGE("%s Init mode ---->OSU", __FUNCTION__); 275 wConfigStatus = phNxpEse_checkJcopDwnldState(); 276 if (wConfigStatus != ESESTATUS_SUCCESS) { 277 ALOGE("phNxpEse_checkJcopDwnldState failed"); 278 goto clean_and_return_1; 279 } 280 } 281 #endif 282 wSpmStatus = phNxpEse_SPM_ConfigPwr(SPM_POWER_ENABLE); 283 if (wSpmStatus != ESESTATUS_SUCCESS) { 284 ALOGE("phNxpEse_SPM_ConfigPwr: enabling power Failed"); 285 if (wSpmStatus == ESESTATUS_BUSY) { 286 wConfigStatus = ESESTATUS_BUSY; 287 } else if (wSpmStatus == ESESTATUS_DWNLD_BUSY) { 288 wConfigStatus = ESESTATUS_DWNLD_BUSY; 289 } else { 290 wConfigStatus = ESESTATUS_FAILED; 291 } 292 goto clean_and_return; 293 } else { 294 ALOGD_IF(ese_debug_enabled, "nxpese_ctxt.spm_power_state true"); 295 nxpese_ctxt.spm_power_state = true; 296 } 297 #endif 298 299 ALOGD_IF(ese_debug_enabled, "wConfigStatus %x", wConfigStatus); 300 return wConfigStatus; 301 302 clean_and_return: 303 #ifdef SPM_INTEGRATED 304 wSpmStatus = phNxpEse_SPM_ConfigPwr(SPM_POWER_DISABLE); 305 if (wSpmStatus != ESESTATUS_SUCCESS) { 306 ALOGE("phNxpEse_SPM_ConfigPwr: disabling power Failed"); 307 } 308 clean_and_return_1: 309 phNxpEse_SPM_DeInit(); 310 clean_and_return_2: 311 #endif 312 if (NULL != nxpese_ctxt.pDevHandle) { 313 phPalEse_close(nxpese_ctxt.pDevHandle); 314 phNxpEse_memset(&nxpese_ctxt, 0x00, sizeof(nxpese_ctxt)); 315 } 316 nxpese_ctxt.EseLibStatus = ESE_STATUS_CLOSE; 317 nxpese_ctxt.spm_power_state = false; 318 return ESESTATUS_FAILED; 319 } 320 321 /****************************************************************************** 322 * \ingroup spi_libese 323 * 324 * \brief Check if libese has opened 325 * 326 * \retval return false if it is close, otherwise true. 327 * 328 ******************************************************************************/ 329 bool phNxpEse_isOpen() { return nxpese_ctxt.EseLibStatus != ESE_STATUS_CLOSE; } 330 331 /****************************************************************************** 332 * Function phNxpEse_openPrioSession 333 * 334 * Description This function is called by Jni during the 335 * initialization of the ESE. It opens the physical connection 336 * with ESE () and creates required client thread for 337 * operation. This will get priority access to ESE for timeout 338 duration. 339 340 * Returns This function return ESESTATUS_SUCCES (0) in case of success 341 * In case of failure returns other failure value. 342 * 343 ******************************************************************************/ 344 ESESTATUS phNxpEse_openPrioSession(phNxpEse_initParams initParams) { 345 phPalEse_Config_t tPalConfig; 346 ESESTATUS wConfigStatus = ESESTATUS_SUCCESS; 347 unsigned long int num = 0, tpm_enable = 0; 348 349 ALOGE("phNxpEse_openPrioSession Enter"); 350 #ifdef SPM_INTEGRATED 351 ESESTATUS wSpmStatus = ESESTATUS_SUCCESS; 352 spm_state_t current_spm_state = SPM_STATE_INVALID; 353 #endif 354 phNxpEse_memset(&nxpese_ctxt, 0x00, sizeof(nxpese_ctxt)); 355 phNxpEse_memset(&tPalConfig, 0x00, sizeof(tPalConfig)); 356 357 ALOGE("MW SEAccessKit Version"); 358 ALOGE("Android Version:0x%x", NXP_ANDROID_VER); 359 ALOGE("Major Version:0x%x", ESELIB_MW_VERSION_MAJ); 360 ALOGE("Minor Version:0x%x", ESELIB_MW_VERSION_MIN); 361 362 #ifdef NXP_POWER_SCHEME_SUPPORT 363 if (EseConfig::hasKey(NAME_NXP_POWER_SCHEME)) { 364 num = EseConfig::getUnsigned(NAME_NXP_POWER_SCHEME); 365 nxpese_ctxt.pwr_scheme = num; 366 ALOGE("Power scheme read from config file - %lu", num); 367 } else 368 #endif 369 { 370 nxpese_ctxt.pwr_scheme = PN67T_POWER_SCHEME; 371 ALOGE("Power scheme not defined in config file - %lu", num); 372 } 373 if (EseConfig::hasKey(NAME_NXP_TP_MEASUREMENT)) { 374 num = EseConfig::getUnsigned(NAME_NXP_TP_MEASUREMENT); 375 ALOGE( 376 "SPI Throughput measurement enable/disable read from config file - %lu", 377 num); 378 } else { 379 ALOGE("SPI Throughput not defined in config file - %lu", num); 380 } 381 /* initialize trace level */ 382 phNxpLog_InitializeLogLevel(); 383 384 tPalConfig.pDevName = (int8_t*)"/dev/p73"; 385 386 /* Initialize PAL layer */ 387 wConfigStatus = phPalEse_open_and_configure(&tPalConfig); 388 if (wConfigStatus != ESESTATUS_SUCCESS) { 389 ALOGE("phPalEse_Init Failed"); 390 goto clean_and_return; 391 } 392 /* Copying device handle to hal context*/ 393 nxpese_ctxt.pDevHandle = tPalConfig.pDevHandle; 394 395 #ifdef SPM_INTEGRATED 396 /* Get the Access of ESE*/ 397 wSpmStatus = phNxpEse_SPM_Init(nxpese_ctxt.pDevHandle); 398 if (wSpmStatus != ESESTATUS_SUCCESS) { 399 ALOGE("phNxpEse_SPM_Init Failed"); 400 wConfigStatus = ESESTATUS_FAILED; 401 goto clean_and_return_2; 402 } 403 wSpmStatus = phNxpEse_SPM_SetPwrScheme(nxpese_ctxt.pwr_scheme); 404 if (wSpmStatus != ESESTATUS_SUCCESS) { 405 ALOGE(" %s : phNxpEse_SPM_SetPwrScheme Failed", __FUNCTION__); 406 wConfigStatus = ESESTATUS_FAILED; 407 goto clean_and_return_1; 408 } 409 wSpmStatus = phNxpEse_SPM_GetState(¤t_spm_state); 410 if (wSpmStatus != ESESTATUS_SUCCESS) { 411 ALOGE(" %s : phNxpEse_SPM_GetPwrState Failed", __FUNCTION__); 412 wConfigStatus = ESESTATUS_FAILED; 413 goto clean_and_return_1; 414 } else { 415 if ((current_spm_state & SPM_STATE_SPI) | 416 (current_spm_state & SPM_STATE_SPI_PRIO)) { 417 ALOGE(" %s : SPI is already opened...second instance not allowed", 418 __FUNCTION__); 419 wConfigStatus = ESESTATUS_FAILED; 420 goto clean_and_return_1; 421 } 422 #ifdef NXP_ESE_JCOP_DWNLD_PROTECTION 423 if (current_spm_state & SPM_STATE_JCOP_DWNLD) { 424 ALOGE(" %s : Denying to open JCOP Download in progress", __FUNCTION__); 425 wConfigStatus = ESESTATUS_FAILED; 426 goto clean_and_return_1; 427 } 428 #endif 429 #ifdef NXP_NFCC_SPI_FW_DOWNLOAD_SYNC 430 wConfigStatus = phNxpEse_checkFWDwnldStatus(); 431 if (wConfigStatus != ESESTATUS_SUCCESS) { 432 ALOGD_IF(ese_debug_enabled, 433 "Failed to open SPI due to VEN pin used by FW download \n"); 434 wConfigStatus = ESESTATUS_FAILED; 435 goto clean_and_return_1; 436 } 437 #endif 438 } 439 phNxpEse_memcpy(&nxpese_ctxt.initParams, &initParams.initMode, 440 sizeof(phNxpEse_initParams)); 441 #ifdef NXP_ESE_JCOP_DWNLD_PROTECTION 442 /* Updating ESE power state based on the init mode */ 443 if (ESE_MODE_OSU == nxpese_ctxt.initParams.initMode) { 444 wConfigStatus = phNxpEse_checkJcopDwnldState(); 445 if (wConfigStatus != ESESTATUS_SUCCESS) { 446 ALOGE("phNxpEse_checkJcopDwnldState failed"); 447 goto clean_and_return_1; 448 } 449 } 450 #endif 451 wSpmStatus = phNxpEse_SPM_ConfigPwr(SPM_POWER_PRIO_ENABLE); 452 if (wSpmStatus != ESESTATUS_SUCCESS) { 453 ALOGE("phNxpEse_SPM_ConfigPwr: enabling power for spi prio Failed"); 454 if (wSpmStatus == ESESTATUS_BUSY) { 455 wConfigStatus = ESESTATUS_BUSY; 456 } else if (wSpmStatus == ESESTATUS_DWNLD_BUSY) { 457 wConfigStatus = ESESTATUS_DWNLD_BUSY; 458 } else { 459 wConfigStatus = ESESTATUS_FAILED; 460 } 461 goto clean_and_return; 462 } else { 463 ALOGE("nxpese_ctxt.spm_power_state true"); 464 nxpese_ctxt.spm_power_state = true; 465 } 466 #endif 467 468 #ifndef SPM_INTEGRATED 469 wConfigStatus = 470 phPalEse_ioctl(phPalEse_e_ResetDevice, nxpese_ctxt.pDevHandle, 2); 471 if (wConfigStatus != ESESTATUS_SUCCESS) { 472 ALOGE("phPalEse_IoCtl Failed"); 473 goto clean_and_return; 474 } 475 #endif 476 wConfigStatus = 477 phPalEse_ioctl(phPalEse_e_EnableLog, nxpese_ctxt.pDevHandle, 0); 478 if (wConfigStatus != ESESTATUS_SUCCESS) { 479 ALOGE("phPalEse_IoCtl Failed"); 480 goto clean_and_return; 481 } 482 wConfigStatus = 483 phPalEse_ioctl(phPalEse_e_EnablePollMode, nxpese_ctxt.pDevHandle, 1); 484 if (tpm_enable) { 485 wConfigStatus = phPalEse_ioctl(phPalEse_e_EnableThroughputMeasurement, 486 nxpese_ctxt.pDevHandle, 0); 487 if (wConfigStatus != ESESTATUS_SUCCESS) { 488 ALOGE("phPalEse_IoCtl Failed"); 489 goto clean_and_return; 490 } 491 } 492 if (wConfigStatus != ESESTATUS_SUCCESS) { 493 ALOGE("phPalEse_IoCtl Failed"); 494 goto clean_and_return; 495 } 496 497 ALOGE("wConfigStatus %x", wConfigStatus); 498 499 return wConfigStatus; 500 501 clean_and_return: 502 #ifdef SPM_INTEGRATED 503 wSpmStatus = phNxpEse_SPM_ConfigPwr(SPM_POWER_DISABLE); 504 if (wSpmStatus != ESESTATUS_SUCCESS) { 505 ALOGE("phNxpEse_SPM_ConfigPwr: disabling power Failed"); 506 } 507 clean_and_return_1: 508 phNxpEse_SPM_DeInit(); 509 clean_and_return_2: 510 #endif 511 if (NULL != nxpese_ctxt.pDevHandle) { 512 phPalEse_close(nxpese_ctxt.pDevHandle); 513 phNxpEse_memset(&nxpese_ctxt, 0x00, sizeof(nxpese_ctxt)); 514 } 515 nxpese_ctxt.EseLibStatus = ESE_STATUS_CLOSE; 516 nxpese_ctxt.spm_power_state = false; 517 return ESESTATUS_FAILED; 518 } 519 #ifdef NXP_ESE_JCOP_DWNLD_PROTECTION 520 /****************************************************************************** 521 * Function phNxpEse_setJcopDwnldState 522 * 523 * Description This function is used to check whether JCOP OS 524 * download can be started or not. 525 * 526 * Returns returns ESESTATUS_SUCCESS or ESESTATUS_FAILED 527 * 528 ******************************************************************************/ 529 static ESESTATUS phNxpEse_setJcopDwnldState(phNxpEse_JcopDwnldState state) { 530 ESESTATUS wSpmStatus = ESESTATUS_SUCCESS; 531 ESESTATUS wConfigStatus = ESESTATUS_FAILED; 532 ALOGE("phNxpEse_setJcopDwnldState Enter"); 533 534 wSpmStatus = phNxpEse_SPM_SetJcopDwnldState(state); 535 if (wSpmStatus == ESESTATUS_SUCCESS) { 536 wConfigStatus = ESESTATUS_SUCCESS; 537 } 538 539 return wConfigStatus; 540 } 541 542 /****************************************************************************** 543 * Function phNxpEse_checkJcopDwnldState 544 * 545 * Description This function is used to check whether JCOP OS 546 * download can be started or not. 547 * 548 * Returns returns ESESTATUS_SUCCESS or ESESTATUS_BUSY 549 * 550 ******************************************************************************/ 551 static ESESTATUS phNxpEse_checkJcopDwnldState(void) { 552 ALOGE("phNxpEse_checkJcopDwnld Enter"); 553 ESESTATUS wSpmStatus = ESESTATUS_SUCCESS; 554 spm_state_t current_spm_state = SPM_STATE_INVALID; 555 uint8_t ese_dwnld_retry = 0x00; 556 ESESTATUS status = ESESTATUS_FAILED; 557 558 wSpmStatus = phNxpEse_SPM_GetState(¤t_spm_state); 559 if (wSpmStatus == ESESTATUS_SUCCESS) { 560 /* Check current_spm_state and update config/Spm status*/ 561 if ((current_spm_state & SPM_STATE_JCOP_DWNLD) || 562 (current_spm_state & SPM_STATE_WIRED)) 563 return ESESTATUS_BUSY; 564 565 status = phNxpEse_setJcopDwnldState(JCP_DWNLD_INIT); 566 if (status == ESESTATUS_SUCCESS) { 567 while (ese_dwnld_retry < ESE_JCOP_OS_DWNLD_RETRY_CNT) { 568 ALOGE("ESE_JCOP_OS_DWNLD_RETRY_CNT retry count"); 569 wSpmStatus = phNxpEse_SPM_GetState(¤t_spm_state); 570 if (wSpmStatus == ESESTATUS_SUCCESS) { 571 if ((current_spm_state & SPM_STATE_JCOP_DWNLD)) { 572 status = ESESTATUS_SUCCESS; 573 break; 574 } 575 } else { 576 status = ESESTATUS_FAILED; 577 break; 578 } 579 phNxpEse_Sleep( 580 200000); /*sleep for 200 ms checking for jcop dwnld status*/ 581 ese_dwnld_retry++; 582 } 583 } 584 } 585 586 ALOGE("phNxpEse_checkJcopDwnldState status %x", status); 587 return status; 588 } 589 #endif 590 /****************************************************************************** 591 * Function phNxpEse_Transceive 592 * 593 * Description This function update the len and provided buffer 594 * 595 * Returns On Success ESESTATUS_SUCCESS else proper error code 596 * 597 ******************************************************************************/ 598 ESESTATUS phNxpEse_Transceive(phNxpEse_data* pCmd, phNxpEse_data* pRsp) { 599 ESESTATUS status = ESESTATUS_FAILED; 600 601 if ((NULL == pCmd) || (NULL == pRsp)) return ESESTATUS_INVALID_PARAMETER; 602 603 if ((pCmd->len == 0) || pCmd->p_data == NULL) { 604 ALOGE(" phNxpEse_Transceive - Invalid Parameter no data\n"); 605 return ESESTATUS_INVALID_PARAMETER; 606 } else if ((ESE_STATUS_CLOSE == nxpese_ctxt.EseLibStatus)) { 607 ALOGE(" %s ESE Not Initialized \n", __FUNCTION__); 608 return ESESTATUS_NOT_INITIALISED; 609 } else if ((ESE_STATUS_BUSY == nxpese_ctxt.EseLibStatus)) { 610 ALOGE(" %s ESE - BUSY \n", __FUNCTION__); 611 return ESESTATUS_BUSY; 612 } else { 613 nxpese_ctxt.EseLibStatus = ESE_STATUS_BUSY; 614 status = phNxpEseProto7816_Transceive((phNxpEse_data*)pCmd, 615 (phNxpEse_data*)pRsp); 616 if (ESESTATUS_SUCCESS != status) { 617 ALOGE(" %s phNxpEseProto7816_Transceive- Failed \n", __FUNCTION__); 618 } 619 nxpese_ctxt.EseLibStatus = ESE_STATUS_IDLE; 620 621 ALOGD_IF(ese_debug_enabled, " %s Exit status 0x%x \n", __FUNCTION__, 622 status); 623 return status; 624 } 625 } 626 627 /****************************************************************************** 628 * Function phNxpEse_reset 629 * 630 * Description This function reset the ESE interface and free all 631 * 632 * Returns It returns ESESTATUS_SUCCESS (0) if the operation is 633 *successful else 634 * ESESTATUS_FAILED(1) 635 ******************************************************************************/ 636 ESESTATUS phNxpEse_reset(void) { 637 ESESTATUS status = ESESTATUS_SUCCESS; 638 unsigned long maxTimer = 0; 639 #ifdef SPM_INTEGRATED 640 ESESTATUS wSpmStatus = ESESTATUS_SUCCESS; 641 #endif 642 643 /* TBD : Call the ioctl to reset the ESE */ 644 ALOGD_IF(ese_debug_enabled, " %s Enter \n", __FUNCTION__); 645 /* Do an interface reset, don't wait to see if JCOP went through a full power 646 * cycle or not */ 647 ESESTATUS bStatus = phNxpEseProto7816_IntfReset( 648 (phNxpEseProto7816SecureTimer_t*)&nxpese_ctxt.secureTimerParams); 649 if (!bStatus) status = ESESTATUS_FAILED; 650 ALOGD_IF(ese_debug_enabled, 651 "%s secureTimer1 0x%x secureTimer2 0x%x secureTimer3 0x%x", 652 __FUNCTION__, nxpese_ctxt.secureTimerParams.secureTimer1, 653 nxpese_ctxt.secureTimerParams.secureTimer2, 654 nxpese_ctxt.secureTimerParams.secureTimer3); 655 phNxpEse_GetMaxTimer(&maxTimer); 656 #ifdef SPM_INTEGRATED 657 #ifdef NXP_SECURE_TIMER_SESSION 658 status = phNxpEse_SPM_DisablePwrControl(maxTimer); 659 if (status != ESESTATUS_SUCCESS) { 660 ALOGE("%s phNxpEse_SPM_DisablePwrControl: failed", __FUNCTION__); 661 } 662 #endif 663 if ((nxpese_ctxt.pwr_scheme == PN67T_POWER_SCHEME) || 664 (nxpese_ctxt.pwr_scheme == PN80T_LEGACY_SCHEME)) { 665 wSpmStatus = phNxpEse_SPM_ConfigPwr(SPM_POWER_RESET); 666 if (wSpmStatus != ESESTATUS_SUCCESS) { 667 ALOGE("phNxpEse_SPM_ConfigPwr: reset Failed"); 668 } 669 } 670 #else 671 /* if arg ==2 (hard reset) 672 * if arg ==1 (soft reset) 673 */ 674 status = phPalEse_ioctl(phPalEse_e_ResetDevice, nxpese_ctxt.pDevHandle, 2); 675 if (status != ESESTATUS_SUCCESS) { 676 ALOGE("phNxpEse_reset Failed"); 677 } 678 #endif 679 ALOGD_IF(ese_debug_enabled, " %s Exit \n", __FUNCTION__); 680 return status; 681 } 682 683 /****************************************************************************** 684 * Function phNxpEse_resetJcopUpdate 685 * 686 * Description This function reset the ESE interface during JCOP Update 687 * 688 * Returns It returns ESESTATUS_SUCCESS (0) if the operation is 689 *successful else 690 * ESESTATUS_FAILED(1) 691 ******************************************************************************/ 692 ESESTATUS phNxpEse_resetJcopUpdate(void) { 693 ESESTATUS status = ESESTATUS_SUCCESS; 694 695 #ifdef SPM_INTEGRATED 696 #ifdef NXP_POWER_SCHEME_SUPPORT 697 unsigned long int num = 0; 698 #endif 699 #endif 700 701 /* TBD : Call the ioctl to reset the */ 702 ALOGD_IF(ese_debug_enabled, " %s Enter \n", __FUNCTION__); 703 704 /* Reset interface after every reset irrespective of 705 whether JCOP did a full power cycle or not. */ 706 status = phNxpEseProto7816_Reset(); 707 708 #ifdef SPM_INTEGRATED 709 #ifdef NXP_POWER_SCHEME_SUPPORT 710 if (EseConfig::hasKey(NAME_NXP_POWER_SCHEME)) { 711 num = EseConfig::getUnsigned(NAME_NXP_POWER_SCHEME); 712 if ((num == 1) || (num == 2)) { 713 ALOGD_IF(ese_debug_enabled, " %s Call Config Pwr Reset \n", __FUNCTION__); 714 status = phNxpEse_SPM_ConfigPwr(SPM_POWER_RESET); 715 if (status != ESESTATUS_SUCCESS) { 716 ALOGE("phNxpEse_resetJcopUpdate: reset Failed"); 717 status = ESESTATUS_FAILED; 718 } 719 } else if (num == 3) { 720 ALOGD_IF(ese_debug_enabled, " %s Call eSE Chip Reset \n", __FUNCTION__); 721 status = phNxpEse_chipReset(); 722 if (status != ESESTATUS_SUCCESS) { 723 ALOGE("phNxpEse_resetJcopUpdate: chip reset Failed"); 724 status = ESESTATUS_FAILED; 725 } 726 } else { 727 ALOGD_IF(ese_debug_enabled, " %s Invalid Power scheme \n", __FUNCTION__); 728 } 729 } 730 #else 731 { 732 status = phNxpEse_SPM_ConfigPwr(SPM_POWER_RESET); 733 if (status != ESESTATUS_SUCCESS) { 734 ALOGE("phNxpEse_SPM_ConfigPwr: reset Failed"); 735 status = ESESTATUS_FAILED; 736 } 737 } 738 #endif 739 #else 740 /* if arg ==2 (hard reset) 741 * if arg ==1 (soft reset) 742 */ 743 status = phPalEse_ioctl(phPalEse_e_ResetDevice, nxpese_ctxt.pDevHandle, 2); 744 if (status != ESESTATUS_SUCCESS) { 745 ALOGE("phNxpEse_resetJcopUpdate Failed"); 746 } 747 #endif 748 749 ALOGD_IF(ese_debug_enabled, " %s Exit \n", __FUNCTION__); 750 return status; 751 } 752 /****************************************************************************** 753 * Function phNxpEse_EndOfApdu 754 * 755 * Description This function is used to send S-frame to indicate 756 *END_OF_APDU 757 * 758 * Returns It returns ESESTATUS_SUCCESS (0) if the operation is 759 *successful else 760 * ESESTATUS_FAILED(1) 761 * 762 ******************************************************************************/ 763 ESESTATUS phNxpEse_EndOfApdu(void) { 764 ESESTATUS status = ESESTATUS_SUCCESS; 765 #ifdef NXP_ESE_END_OF_SESSION 766 status = phNxpEseProto7816_Close( 767 (phNxpEseProto7816SecureTimer_t*)&nxpese_ctxt.secureTimerParams); 768 #endif 769 return status; 770 } 771 772 /****************************************************************************** 773 * Function phNxpEse_chipReset 774 * 775 * Description This function is used to reset the ESE. 776 * 777 * Returns Always return ESESTATUS_SUCCESS (0). 778 * 779 ******************************************************************************/ 780 ESESTATUS phNxpEse_chipReset(void) { 781 ESESTATUS status = ESESTATUS_SUCCESS; 782 ESESTATUS bStatus = ESESTATUS_FAILED; 783 if (nxpese_ctxt.pwr_scheme == PN80T_EXT_PMU_SCHEME) { 784 bStatus = phNxpEseProto7816_Reset(); 785 if (!bStatus) { 786 status = ESESTATUS_FAILED; 787 ALOGE("Inside phNxpEse_chipReset, phNxpEseProto7816_Reset Failed"); 788 } 789 status = phPalEse_ioctl(phPalEse_e_ChipRst, nxpese_ctxt.pDevHandle, 6); 790 if (status != ESESTATUS_SUCCESS) { 791 ALOGE("phNxpEse_chipReset Failed"); 792 } 793 } else { 794 ALOGE("phNxpEse_chipReset is not supported in legacy power scheme"); 795 status = ESESTATUS_FAILED; 796 } 797 return status; 798 } 799 800 /****************************************************************************** 801 * Function phNxpEse_deInit 802 * 803 * Description This function de-initializes all the ESE protocol params 804 * 805 * Returns Always return ESESTATUS_SUCCESS (0). 806 * 807 ******************************************************************************/ 808 ESESTATUS phNxpEse_deInit(void) { 809 ESESTATUS status = ESESTATUS_SUCCESS; 810 unsigned long maxTimer = 0; 811 status = phNxpEseProto7816_Close( 812 (phNxpEseProto7816SecureTimer_t*)&nxpese_ctxt.secureTimerParams); 813 if (status == ESESTATUS_FAILED) { 814 status = ESESTATUS_FAILED; 815 } else { 816 ALOGD_IF(ese_debug_enabled, 817 "%s secureTimer1 0x%x secureTimer2 0x%x secureTimer3 0x%x", 818 __FUNCTION__, nxpese_ctxt.secureTimerParams.secureTimer1, 819 nxpese_ctxt.secureTimerParams.secureTimer2, 820 nxpese_ctxt.secureTimerParams.secureTimer3); 821 phNxpEse_GetMaxTimer(&maxTimer); 822 #ifdef SPM_INTEGRATED 823 #ifdef NXP_SECURE_TIMER_SESSION 824 status = phNxpEse_SPM_DisablePwrControl(maxTimer); 825 if (status != ESESTATUS_SUCCESS) { 826 ALOGE("%s phNxpEseP61_DisablePwrCntrl: failed", __FUNCTION__); 827 } 828 #endif 829 #endif 830 } 831 return status; 832 } 833 834 /****************************************************************************** 835 * Function phNxpEse_close 836 * 837 * Description This function close the ESE interface and free all 838 * resources. 839 * 840 * Returns Always return ESESTATUS_SUCCESS (0). 841 * 842 ******************************************************************************/ 843 ESESTATUS phNxpEse_close(void) { 844 ESESTATUS status = ESESTATUS_SUCCESS; 845 846 if ((ESE_STATUS_CLOSE == nxpese_ctxt.EseLibStatus)) { 847 ALOGE(" %s ESE Not Initialized \n", __FUNCTION__); 848 return ESESTATUS_NOT_INITIALISED; 849 } 850 851 #ifdef SPM_INTEGRATED 852 ESESTATUS wSpmStatus = ESESTATUS_SUCCESS; 853 #endif 854 855 #ifdef SPM_INTEGRATED 856 /* Release the Access of */ 857 wSpmStatus = phNxpEse_SPM_ConfigPwr(SPM_POWER_DISABLE); 858 if (wSpmStatus != ESESTATUS_SUCCESS) { 859 ALOGE("phNxpEse_SPM_ConfigPwr: disabling power Failed"); 860 } else { 861 nxpese_ctxt.spm_power_state = false; 862 } 863 #ifdef NXP_ESE_JCOP_DWNLD_PROTECTION 864 if (ESE_MODE_OSU == nxpese_ctxt.initParams.initMode) { 865 status = phNxpEse_setJcopDwnldState(JCP_SPI_DWNLD_COMPLETE); 866 if (status != ESESTATUS_SUCCESS) { 867 ALOGE("%s: phNxpEse_setJcopDwnldState failed", __FUNCTION__); 868 } 869 } 870 #endif 871 wSpmStatus = phNxpEse_SPM_DeInit(); 872 if (wSpmStatus != ESESTATUS_SUCCESS) { 873 ALOGE("phNxpEse_SPM_DeInit Failed"); 874 } 875 876 #endif 877 if (NULL != nxpese_ctxt.pDevHandle) { 878 phPalEse_close(nxpese_ctxt.pDevHandle); 879 phNxpEse_memset(&nxpese_ctxt, 0x00, sizeof(nxpese_ctxt)); 880 ALOGD_IF(ese_debug_enabled, 881 "phNxpEse_close - ESE Context deinit completed"); 882 } 883 /* Return success always */ 884 return status; 885 } 886 887 /****************************************************************************** 888 * Function phNxpEse_read 889 * 890 * Description This function write the data to ESE through physical 891 * interface (e.g. I2C) using the driver interface. 892 * Before sending the data to ESE, phNxpEse_write_ext 893 * is called to check if there is any extension processing 894 * is required for the SPI packet being sent out. 895 * 896 * Returns It returns ESESTATUS_SUCCESS (0) if read successful else 897 * ESESTATUS_FAILED(1) 898 * 899 ******************************************************************************/ 900 ESESTATUS phNxpEse_read(uint32_t* data_len, uint8_t** pp_data) { 901 ESESTATUS status = ESESTATUS_SUCCESS; 902 int ret = -1; 903 904 ALOGD_IF(ese_debug_enabled, "%s Enter ..", __FUNCTION__); 905 906 ret = phNxpEse_readPacket(nxpese_ctxt.pDevHandle, nxpese_ctxt.p_read_buff, 907 MAX_DATA_LEN); 908 if (ret < 0) { 909 ALOGE("PAL Read status error status = %x", status); 910 *data_len = 2; 911 *pp_data = nxpese_ctxt.p_read_buff; 912 status = ESESTATUS_FAILED; 913 } else { 914 PH_PAL_ESE_PRINT_PACKET_RX(nxpese_ctxt.p_read_buff, ret); 915 *data_len = ret; 916 *pp_data = nxpese_ctxt.p_read_buff; 917 status = ESESTATUS_SUCCESS; 918 } 919 920 ALOGD_IF(ese_debug_enabled, "%s Exit", __FUNCTION__); 921 return status; 922 } 923 924 /****************************************************************************** 925 * Function phNxpEse_readPacket 926 * 927 * Description This function Reads requested number of bytes from 928 * pn547 device into given buffer. 929 * 930 * Returns nNbBytesToRead- number of successfully read bytes 931 * -1 - read operation failure 932 * 933 ******************************************************************************/ 934 static int phNxpEse_readPacket(void* pDevHandle, uint8_t* pBuffer, 935 int nNbBytesToRead) { 936 int ret = -1; 937 int sof_counter = 0; /* one read may take 1 ms*/ 938 int total_count = 0, numBytesToRead = 0, headerIndex = 0; 939 940 ALOGD_IF(ese_debug_enabled, "%s Enter", __FUNCTION__); 941 do { 942 sof_counter++; 943 ret = -1; 944 ret = phPalEse_read(pDevHandle, pBuffer, 2); 945 if (ret < 0) { 946 /*Polling for read on spi, hence Debug log*/ 947 ALOGD_IF(ese_debug_enabled, "_spi_read() [HDR]errno : %x ret : %X", errno, 948 ret); 949 } 950 if (pBuffer[0] == RECIEVE_PACKET_SOF) { 951 /* Read the HEADR of one byte*/ 952 ALOGD_IF(ese_debug_enabled, "%s Read HDR", __FUNCTION__); 953 numBytesToRead = 1; 954 headerIndex = 1; 955 break; 956 } else if (pBuffer[1] == RECIEVE_PACKET_SOF) { 957 /* Read the HEADR of Two bytes*/ 958 ALOGD_IF(ese_debug_enabled, "%s Read HDR", __FUNCTION__); 959 pBuffer[0] = RECIEVE_PACKET_SOF; 960 numBytesToRead = 2; 961 headerIndex = 0; 962 break; 963 } 964 ALOGD_IF(ese_debug_enabled, "%s Normal Pkt, delay read %dus", __FUNCTION__, 965 READ_WAKE_UP_DELAY * NAD_POLLING_SCALER); 966 phPalEse_sleep(READ_WAKE_UP_DELAY * NAD_POLLING_SCALER); 967 } while (sof_counter < ESE_NAD_POLLING_MAX); 968 if (pBuffer[0] == RECIEVE_PACKET_SOF) { 969 ALOGD_IF(ese_debug_enabled, "%s SOF FOUND", __FUNCTION__); 970 /* Read the HEADR of one/Two bytes based on how two bytes read A5 PCB or 00 971 * A5*/ 972 ret = phPalEse_read(pDevHandle, &pBuffer[1 + headerIndex], numBytesToRead); 973 if (ret < 0) { 974 ALOGE("_spi_read() [HDR]errno : %x ret : %X", errno, ret); 975 } 976 total_count = 3; 977 nNbBytesToRead = pBuffer[2]; 978 /* Read the Complete data + one byte CRC*/ 979 ret = phPalEse_read(pDevHandle, &pBuffer[3], (nNbBytesToRead + 1)); 980 if (ret < 0) { 981 ALOGE("_spi_read() [HDR]errno : %x ret : %X", errno, ret); 982 ret = -1; 983 } else { 984 ret = (total_count + (nNbBytesToRead + 1)); 985 } 986 } else if (ret < 0) { 987 /*In case of IO Error*/ 988 ret = -2; 989 pBuffer[0] = 0x64; 990 pBuffer[1] = 0xFF; 991 } else { 992 ret = -1; 993 } 994 ALOGD_IF(ese_debug_enabled, "%s Exit ret = %d", __FUNCTION__, ret); 995 return ret; 996 } 997 /****************************************************************************** 998 * Function phNxpEse_WriteFrame 999 * 1000 * Description This is the actual function which is being called by 1001 * phNxpEse_write. This function writes the data to ESE. 1002 * It waits till write callback provide the result of write 1003 * process. 1004 * 1005 * Returns It returns ESESTATUS_SUCCESS (0) if write successful else 1006 * ESESTATUS_FAILED(1) 1007 * 1008 ******************************************************************************/ 1009 ESESTATUS phNxpEse_WriteFrame(uint32_t data_len, const uint8_t* p_data) { 1010 ESESTATUS status = ESESTATUS_INVALID_PARAMETER; 1011 int32_t dwNoBytesWrRd = 0; 1012 ALOGD_IF(ese_debug_enabled, "Enter %s ", __FUNCTION__); 1013 1014 /* Create local copy of cmd_data */ 1015 phNxpEse_memcpy(nxpese_ctxt.p_cmd_data, p_data, data_len); 1016 nxpese_ctxt.cmd_len = data_len; 1017 1018 dwNoBytesWrRd = phPalEse_write(nxpese_ctxt.pDevHandle, nxpese_ctxt.p_cmd_data, 1019 nxpese_ctxt.cmd_len); 1020 if (-1 == dwNoBytesWrRd) { 1021 ALOGE(" - Error in SPI Write.....\n"); 1022 status = ESESTATUS_FAILED; 1023 } else { 1024 status = ESESTATUS_SUCCESS; 1025 PH_PAL_ESE_PRINT_PACKET_TX(nxpese_ctxt.p_cmd_data, nxpese_ctxt.cmd_len); 1026 } 1027 1028 ALOGD_IF(ese_debug_enabled, "Exit %s status %x\n", __FUNCTION__, status); 1029 return status; 1030 } 1031 1032 /****************************************************************************** 1033 * Function phNxpEse_setIfsc 1034 * 1035 * Description This function sets the IFSC size to 240/254 support JCOP OS 1036 *Update. 1037 * 1038 * Returns Always return ESESTATUS_SUCCESS (0). 1039 * 1040 ******************************************************************************/ 1041 ESESTATUS phNxpEse_setIfsc(uint16_t IFSC_Size) { 1042 /*SET the IFSC size to 240 bytes*/ 1043 phNxpEseProto7816_SetIfscSize(IFSC_Size); 1044 return ESESTATUS_SUCCESS; 1045 } 1046 1047 /****************************************************************************** 1048 * Function phNxpEse_Sleep 1049 * 1050 * Description This function suspends execution of the calling thread for 1051 * (at least) usec microseconds 1052 * 1053 * Returns Always return ESESTATUS_SUCCESS (0). 1054 * 1055 ******************************************************************************/ 1056 ESESTATUS phNxpEse_Sleep(uint32_t usec) { 1057 phPalEse_sleep(usec); 1058 return ESESTATUS_SUCCESS; 1059 } 1060 1061 /****************************************************************************** 1062 * Function phNxpEse_memset 1063 * 1064 * Description This function updates destination buffer with val 1065 * data in len size 1066 * 1067 * Returns Always return ESESTATUS_SUCCESS (0). 1068 * 1069 ******************************************************************************/ 1070 void* phNxpEse_memset(void* buff, int val, size_t len) { 1071 return phPalEse_memset(buff, val, len); 1072 } 1073 1074 /****************************************************************************** 1075 * Function phNxpEse_memcpy 1076 * 1077 * Description This function copies source buffer to destination buffer 1078 * data in len size 1079 * 1080 * Returns Return pointer to allocated memory location. 1081 * 1082 ******************************************************************************/ 1083 void* phNxpEse_memcpy(void* dest, const void* src, size_t len) { 1084 return phPalEse_memcpy(dest, src, len); 1085 } 1086 1087 /****************************************************************************** 1088 * Function phNxpEse_Memalloc 1089 * 1090 * Description This function allocation memory 1091 * 1092 * Returns Return pointer to allocated memory or NULL. 1093 * 1094 ******************************************************************************/ 1095 void* phNxpEse_memalloc(uint32_t size) { 1096 return phPalEse_memalloc(size); 1097 ; 1098 } 1099 1100 /****************************************************************************** 1101 * Function phNxpEse_calloc 1102 * 1103 * Description This is utility function for runtime heap memory allocation 1104 * 1105 * Returns Return pointer to allocated memory or NULL. 1106 * 1107 ******************************************************************************/ 1108 void* phNxpEse_calloc(size_t datatype, size_t size) { 1109 return phPalEse_calloc(datatype, size); 1110 } 1111 1112 /****************************************************************************** 1113 * Function phNxpEse_free 1114 * 1115 * Description This function de-allocation memory 1116 * 1117 * Returns void. 1118 * 1119 ******************************************************************************/ 1120 void phNxpEse_free(void* ptr) { 1121 if (ptr != NULL) { 1122 free(ptr); 1123 ptr = NULL; 1124 } 1125 return; 1126 } 1127 1128 /****************************************************************************** 1129 * Function phNxpEse_GetMaxTimer 1130 * 1131 * Description This function finds out the max. timer value returned from 1132 *JCOP 1133 * 1134 * Returns void. 1135 * 1136 ******************************************************************************/ 1137 static void phNxpEse_GetMaxTimer(unsigned long* pMaxTimer) { 1138 /* Finding the max. of the timer value */ 1139 *pMaxTimer = nxpese_ctxt.secureTimerParams.secureTimer1; 1140 if (*pMaxTimer < nxpese_ctxt.secureTimerParams.secureTimer2) 1141 *pMaxTimer = nxpese_ctxt.secureTimerParams.secureTimer2; 1142 *pMaxTimer = (*pMaxTimer < nxpese_ctxt.secureTimerParams.secureTimer3) 1143 ? (nxpese_ctxt.secureTimerParams.secureTimer3) 1144 : *pMaxTimer; 1145 1146 /* Converting timer to millisecond from sec */ 1147 *pMaxTimer = SECOND_TO_MILLISECOND(*pMaxTimer); 1148 /* Add extra 5% to the timer */ 1149 *pMaxTimer += 1150 CONVERT_TO_PERCENTAGE(*pMaxTimer, ADDITIONAL_SECURE_TIME_PERCENTAGE); 1151 ALOGE("%s Max timer value = %lu", __FUNCTION__, *pMaxTimer); 1152 return; 1153 } 1154 1155 /****************************************************************************** 1156 * Function phNxpEseP61_DisablePwrCntrl 1157 * 1158 * Description This function disables eSE GPIO power off/on control 1159 * when enabled 1160 * 1161 * Returns SUCCESS/FAIL. 1162 * 1163 ******************************************************************************/ 1164 ESESTATUS phNxpEse_DisablePwrCntrl(void) { 1165 ESESTATUS status = ESESTATUS_SUCCESS; 1166 unsigned long maxTimer = 0; 1167 ALOGE("%s Enter", __FUNCTION__); 1168 phNxpEse_GetMaxTimer(&maxTimer); 1169 #ifdef NXP_SECURE_TIMER_SESSION 1170 status = phNxpEse_SPM_DisablePwrControl(maxTimer); 1171 if (status != ESESTATUS_SUCCESS) { 1172 ALOGE("%s phNxpEseP61_DisablePwrCntrl: failed", __FUNCTION__); 1173 } 1174 #else 1175 ALOGE("%s phNxpEseP61_DisablePwrCntrl: not supported", __FUNCTION__); 1176 status = ESESTATUS_FAILED; 1177 #endif 1178 return status; 1179 } 1180 1181 #ifdef NXP_NFCC_SPI_FW_DOWNLOAD_SYNC 1182 /****************************************************************************** 1183 * Function phNxpEse_checkFWDwnldStatus 1184 * 1185 * Description This function is used to check whether FW download 1186 * is completed or not. 1187 * 1188 * Returns returns ESESTATUS_SUCCESS or ESESTATUS_BUSY 1189 * 1190 ******************************************************************************/ 1191 static ESESTATUS phNxpEse_checkFWDwnldStatus(void) { 1192 ALOGE("phNxpEse_checkFWDwnldStatus Enter"); 1193 ESESTATUS wSpmStatus = ESESTATUS_SUCCESS; 1194 spm_state_t current_spm_state = SPM_STATE_INVALID; 1195 uint8_t ese_dwnld_retry = 0x00; 1196 ESESTATUS status = ESESTATUS_FAILED; 1197 1198 wSpmStatus = phNxpEse_SPM_GetState(¤t_spm_state); 1199 if (wSpmStatus == ESESTATUS_SUCCESS) { 1200 /* Check current_spm_state and update config/Spm status*/ 1201 while (ese_dwnld_retry < ESE_FW_DWNLD_RETRY_CNT) { 1202 ALOGE("ESE_FW_DWNLD_RETRY_CNT retry count"); 1203 wSpmStatus = phNxpEse_SPM_GetState(¤t_spm_state); 1204 if (wSpmStatus == ESESTATUS_SUCCESS) { 1205 if ((current_spm_state & SPM_STATE_DWNLD)) { 1206 status = ESESTATUS_FAILED; 1207 } else { 1208 ALOGE("Exit polling no FW Download .."); 1209 status = ESESTATUS_SUCCESS; 1210 break; 1211 } 1212 } else { 1213 status = ESESTATUS_FAILED; 1214 break; 1215 } 1216 phNxpEse_Sleep(500000); /*sleep for 500 ms checking for fw dwnld status*/ 1217 ese_dwnld_retry++; 1218 } 1219 } 1220 1221 ALOGE("phNxpEse_checkFWDwnldStatus status %x", status); 1222 return status; 1223 } 1224 #endif 1225 /****************************************************************************** 1226 * Function phNxpEse_GetEseStatus(unsigned char *timer_buffer) 1227 * 1228 * Description This function returns the all three timer 1229 * Timeout buffer length should be minimum 18 bytes. Response will be in below 1230 format: 1231 * <0xF1><Len><Timer Value><0xF2><Len><Timer Value><0xF3><Len><Timer Value> 1232 * 1233 * Returns SUCCESS/FAIL. 1234 * ESESTATUS_SUCCESS if 0xF1 or 0xF2 tag timeout >= 0 & 0xF3 == 0 1235 * ESESTATUS_BUSY if 0xF3 tag timeout > 0 1236 * ESESTATUS_FAILED if any other error 1237 1238 ******************************************************************************/ 1239 ESESTATUS phNxpEse_GetEseStatus(phNxpEse_data* timer_buffer) { 1240 ESESTATUS status = ESESTATUS_FAILED; 1241 1242 phNxpEse_SecureTimer_t secureTimerParams; 1243 uint8_t* temp_timer_buffer = NULL; 1244 ALOGD_IF(ese_debug_enabled, "%s Enter", __FUNCTION__); 1245 1246 if (timer_buffer != NULL) { 1247 timer_buffer->len = 1248 (sizeof(secureTimerParams.secureTimer1) + 1249 sizeof(secureTimerParams.secureTimer2) + 1250 sizeof(secureTimerParams.secureTimer3)) + 1251 PH_PROPTO_7816_FRAME_LENGTH_OFFSET * PH_PROPTO_7816_FRAME_LENGTH_OFFSET; 1252 temp_timer_buffer = (uint8_t*)phNxpEse_memalloc(timer_buffer->len); 1253 timer_buffer->p_data = temp_timer_buffer; 1254 1255 #ifdef NXP_SECURE_TIMER_SESSION 1256 phNxpEse_memcpy(&secureTimerParams, &nxpese_ctxt.secureTimerParams, 1257 sizeof(phNxpEse_SecureTimer_t)); 1258 1259 ALOGD_IF( 1260 ese_debug_enabled, 1261 "%s secureTimer1 0x%x secureTimer2 0x%x secureTimer3 0x%x len = %d", 1262 __FUNCTION__, secureTimerParams.secureTimer1, 1263 secureTimerParams.secureTimer2, secureTimerParams.secureTimer3, 1264 timer_buffer->len); 1265 1266 *temp_timer_buffer++ = PH_PROPTO_7816_SFRAME_TIMER1; 1267 *temp_timer_buffer++ = sizeof(secureTimerParams.secureTimer1); 1268 temp_timer_buffer = phNxpEse_GgetTimerTlvBuffer( 1269 temp_timer_buffer, secureTimerParams.secureTimer1); 1270 if (temp_timer_buffer != NULL) { 1271 *temp_timer_buffer++ = PH_PROPTO_7816_SFRAME_TIMER2; 1272 *temp_timer_buffer++ = sizeof(secureTimerParams.secureTimer2); 1273 temp_timer_buffer = phNxpEse_GgetTimerTlvBuffer( 1274 temp_timer_buffer, secureTimerParams.secureTimer2); 1275 if (temp_timer_buffer != NULL) { 1276 *temp_timer_buffer++ = PH_PROPTO_7816_SFRAME_TIMER3; 1277 *temp_timer_buffer++ = sizeof(secureTimerParams.secureTimer3); 1278 temp_timer_buffer = phNxpEse_GgetTimerTlvBuffer( 1279 temp_timer_buffer, secureTimerParams.secureTimer3); 1280 if (temp_timer_buffer != NULL) { 1281 if (secureTimerParams.secureTimer3 > 0) { 1282 status = ESESTATUS_BUSY; 1283 } else { 1284 status = ESESTATUS_SUCCESS; 1285 } 1286 } 1287 } 1288 } 1289 #endif 1290 } else { 1291 ALOGE("%s Invalid timer buffer ", __FUNCTION__); 1292 } 1293 1294 ALOGD_IF(ese_debug_enabled, "%s Exit status = 0x%x", __FUNCTION__, status); 1295 return status; 1296 } 1297 #ifdef NXP_SECURE_TIMER_SESSION 1298 static unsigned char* phNxpEse_GgetTimerTlvBuffer(uint8_t* timer_buffer, 1299 unsigned int value) { 1300 short int count = 0, shift = 3; 1301 unsigned int mask = 0x000000FF; 1302 ALOGD_IF(ese_debug_enabled, "value = %x \n", value); 1303 for (count = 0; count < 4; count++) { 1304 if (timer_buffer != NULL) { 1305 *timer_buffer = (value >> (shift * 8) & mask); 1306 ALOGD_IF(ese_debug_enabled, "*timer_buffer=0x%x shift=0x%x", 1307 *timer_buffer, shift); 1308 timer_buffer++; 1309 shift--; 1310 } else { 1311 break; 1312 } 1313 } 1314 return timer_buffer; 1315 } 1316 #endif 1317