1 /* 2 * Copyright (C) 2010 NXP Semiconductors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /*! 18 * \file phLibNfc.c 19 20 * Project: NFC FRI / HALDL 21 * 22 * $Date: Tue Jun 1 14:53:48 2010 $ 23 * $Author: ing07385 $ 24 * $Revision: 1.89 $ 25 * $Aliases: NFC_FRI1.1_WK1024_SDK $ 26 * 27 */ 28 29 30 /* 31 ************************* Header Files **************************************** 32 */ 33 34 #define LOG_TAG "NFC" 35 36 #include <phLibNfc.h> 37 #include <phDal4Nfc.h> 38 #include <phHal4Nfc.h> 39 #include <phOsalNfc.h> 40 #include <phLibNfc_Internal.h> 41 #include <phLibNfc_ndef_raw.h> 42 #include <phLibNfc_initiator.h> 43 #include <phLibNfc_discovery.h> 44 #include <phNfcStatus.h> 45 #include <cutils/log.h> 46 /* 47 *************************** Macro's ****************************************** 48 */ 49 50 extern int dlopen_firmware(); 51 52 #ifndef STATIC_DISABLE 53 #define STATIC static 54 #else 55 #define STATIC 56 #endif 57 58 59 /* 60 *************************** Global Variables ********************************** 61 */ 62 63 64 pphLibNfc_LibContext_t gpphLibContext=NULL; 65 66 /* 67 *************************** Static Function Declaration *********************** 68 */ 69 70 /* Init callback */ 71 STATIC void phLibNfc_InitCb(void *pContext,NFCSTATUS status); 72 73 /* Shutdown callback */ 74 STATIC void phLibNfc_ShutdownCb(void *pContext,NFCSTATUS status); 75 76 /**Default notification handler registered with lower layer immediately after 77 successful initialization*/ 78 STATIC void phLibNfc_DefaultHandler( 79 void *context, 80 phHal_eNotificationType_t type, 81 phHal4Nfc_NotificationInfo_t info, 82 NFCSTATUS status 83 ); 84 /* 85 *************************** Function Definitions ****************************** 86 */ 87 88 NFCSTATUS phLibNfc_Mgt_ConfigureDriver (pphLibNfc_sConfig_t psConfig, 89 void ** ppDriverHandle) 90 { 91 if(NULL != gpphLibContext) 92 { 93 return NFCSTATUS_ALREADY_INITIALISED; 94 } 95 96 return phDal4Nfc_Config(psConfig, ppDriverHandle); 97 } 98 99 NFCSTATUS phLibNfc_Mgt_UnConfigureDriver (void * pDriverHandle) 100 { 101 if(NULL != gpphLibContext) 102 { 103 return NFCSTATUS_ALREADY_INITIALISED; 104 } 105 106 return phDal4Nfc_ConfigRelease(pDriverHandle); 107 } 108 109 NFCSTATUS phLibNfc_HW_Reset () 110 { 111 NFCSTATUS Status = NFCSTATUS_SUCCESS; 112 113 Status = phDal4Nfc_Reset(1); 114 Status = phDal4Nfc_Reset(0); 115 Status = phDal4Nfc_Reset(1); 116 117 return Status; 118 } 119 120 NFCSTATUS phLibNfc_Download_Mode () 121 { 122 return phDal4Nfc_Download(); 123 } 124 125 int phLibNfc_Load_Firmware_Image () 126 { 127 int status; 128 status = dlopen_firmware(); 129 return status; 130 } 131 132 133 extern uint8_t nxp_nfc_isoxchg_timeout; 134 NFCSTATUS phLibNfc_SetIsoXchgTimeout(uint8_t timeout) { 135 nxp_nfc_isoxchg_timeout = timeout; 136 return NFCSTATUS_SUCCESS; 137 } 138 139 int phLibNfc_GetIsoXchgTimeout() { 140 return nxp_nfc_isoxchg_timeout; 141 } 142 143 extern uint32_t nxp_nfc_hci_response_timeout; 144 NFCSTATUS phLibNfc_SetHciTimeout(uint32_t timeout_in_ms) { 145 nxp_nfc_hci_response_timeout = timeout_in_ms; 146 return NFCSTATUS_SUCCESS; 147 } 148 149 int phLibNfc_GetHciTimeout() { 150 return nxp_nfc_hci_response_timeout; 151 } 152 153 extern uint32_t nxp_nfc_felica_timeout; 154 NFCSTATUS phLibNfc_SetFelicaTimeout(uint8_t timeout_in_ms) { 155 nxp_nfc_felica_timeout = timeout_in_ms; 156 return NFCSTATUS_SUCCESS; 157 } 158 159 int phLibNfc_GetFelicaTimeout() { 160 return nxp_nfc_felica_timeout; 161 } 162 163 extern uint8_t nxp_nfc_mifareraw_timeout; 164 NFCSTATUS phLibNfc_SetMifareRawTimeout(uint8_t timeout) { 165 nxp_nfc_mifareraw_timeout = timeout; 166 return NFCSTATUS_SUCCESS; 167 } 168 169 int phLibNfc_GetMifareRawTimeout() { 170 return nxp_nfc_mifareraw_timeout; 171 } 172 173 /** 174 * Initialize the phLibNfc interface. 175 */ 176 177 NFCSTATUS phLibNfc_Mgt_Initialize(void *pDriverHandle, 178 pphLibNfc_RspCb_t pInitCb, 179 void *pContext) 180 { 181 NFCSTATUS Status = NFCSTATUS_SUCCESS; 182 if((NULL == pDriverHandle)||(NULL == pInitCb)) 183 { 184 Status = NFCSTATUS_INVALID_PARAMETER; 185 } 186 else if(NULL == gpphLibContext) 187 { 188 /* Initialize the Lib context */ 189 gpphLibContext=(pphLibNfc_LibContext_t)phOsalNfc_GetMemory( 190 (uint32_t)sizeof(phLibNfc_LibContext_t)); 191 if(NULL == gpphLibContext) 192 { 193 Status=NFCSTATUS_INSUFFICIENT_RESOURCES; 194 } 195 else 196 { 197 (void)memset((void *)gpphLibContext,0,( 198 (uint32_t)sizeof(phLibNfc_LibContext_t))); 199 200 /* Store the Callback and context in LibContext structure*/ 201 gpphLibContext->CBInfo.pClientInitCb=pInitCb; 202 gpphLibContext->CBInfo.pClientInitCntx=pContext; 203 /* Initialize the HwReferece structure */ 204 gpphLibContext->psHwReference=(phHal_sHwReference_t *) 205 phOsalNfc_GetMemory((uint32_t)sizeof(phHal_sHwReference_t)); 206 (void)memset((void *)gpphLibContext->psHwReference,0, 207 ((uint32_t)sizeof(phHal_sHwReference_t))); 208 /* Allocate the Memory for the Transceive info */ 209 if( gpphLibContext->psHwReference!=NULL) 210 { 211 gpphLibContext->psHwReference->p_board_driver = pDriverHandle; 212 Status = phLibNfc_UpdateNextState(gpphLibContext, 213 eLibNfcHalStateInitandIdle); 214 if(Status==NFCSTATUS_SUCCESS) 215 { 216 Status=phHal4Nfc_Open( 217 gpphLibContext->psHwReference, 218 eInitDefault, 219 phLibNfc_InitCb, 220 (void *)gpphLibContext); 221 } 222 } 223 else 224 { 225 Status = NFCSTATUS_INSUFFICIENT_RESOURCES; 226 } 227 phLibNfc_Ndef_Init(); 228 } 229 } 230 else if(gpphLibContext->LibNfcState.next_state==eLibNfcHalStateShutdown) 231 { 232 Status = NFCSTATUS_SHUTDOWN; 233 } 234 else 235 { 236 Status=NFCSTATUS_ALREADY_INITIALISED; 237 } 238 return Status; 239 } 240 241 /* 242 * This function called by the HAL4 when the initialization seq is completed. 243 */ 244 STATIC void phLibNfc_InitCb(void *pContext,NFCSTATUS status) 245 { 246 pphLibNfc_LibContext_t pLibContext=NULL; 247 pphLibNfc_RspCb_t pClientCb=NULL; 248 void *pUpperLayerContext=NULL; 249 250 251 /* Initialize the local variable */ 252 pLibContext = (pphLibNfc_LibContext_t)pContext; 253 254 pClientCb =pLibContext->CBInfo.pClientInitCb; 255 pUpperLayerContext=pLibContext->CBInfo.pClientInitCntx; 256 if(status == NFCSTATUS_SUCCESS) 257 { 258 /* Get the Lib context */ 259 pLibContext=(pphLibNfc_LibContext_t)gpphLibContext; 260 gpphLibContext->sSeContext.eActivatedMode = phLibNfc_SE_ActModeOff; 261 if(pLibContext->psHwReference->uicc_connected==TRUE) 262 { 263 /* populate state of the secured element */ 264 gpphLibContext->sSeContext.eActivatedMode = phLibNfc_SE_ActModeDefault; 265 sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].eSE_CurrentState=phLibNfc_SE_Active; 266 pLibContext->sSeContext.uUiccActivate=TRUE; 267 } 268 if(pLibContext->psHwReference->smx_connected==TRUE) 269 { 270 /* populate state of the secured element */ 271 gpphLibContext->sSeContext.eActivatedMode = phLibNfc_SE_ActModeDefault; 272 sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].eSE_CurrentState=phLibNfc_SE_Inactive; 273 pLibContext->sSeContext.uSmxActivate =FALSE; 274 } 275 276 phLibNfc_UpdateCurState(status,pLibContext); 277 (void)phHal4Nfc_RegisterNotification( 278 pLibContext->psHwReference, 279 eRegisterDefault, 280 phLibNfc_DefaultHandler, 281 (void*)pLibContext 282 ); 283 /* call the upper layer register function */ 284 (*pClientCb)(pUpperLayerContext,status); 285 286 } 287 else 288 { 289 /*Change the status code failed*/ 290 status = NFCSTATUS_FAILED; 291 /* Get the Lib context */ 292 pLibContext=(pphLibNfc_LibContext_t)gpphLibContext; 293 294 phLibNfc_UpdateCurState(status,pLibContext); 295 296 297 298 /* Allocate the Memory for the Transceive info */ 299 if(pLibContext->psHwReference!= NULL) 300 { 301 phOsalNfc_FreeMemory(pLibContext->psHwReference); 302 pLibContext->psHwReference = NULL; 303 } 304 (*pClientCb)(pUpperLayerContext, status); 305 306 phOsalNfc_FreeMemory(pLibContext); 307 pLibContext= NULL; 308 gpphLibContext = NULL; 309 310 } 311 return; 312 } 313 314 /**Default notification handler registered with lower layer immediately after 315 successful initialization*/ 316 STATIC void phLibNfc_DefaultHandler( 317 void *context, 318 phHal_eNotificationType_t type, 319 phHal4Nfc_NotificationInfo_t info, 320 NFCSTATUS status 321 ) 322 { 323 if(context != (void *)gpphLibContext) 324 { 325 phOsalNfc_RaiseException(phOsalNfc_e_InternalErr,1); 326 } 327 else 328 { 329 info = info; 330 if((NFC_EVENT_NOTIFICATION == type) && 331 (NFCSTATUS_BOARD_COMMUNICATION_ERROR == status)) 332 { 333 phLibNfc_UpdateCurState(NFCSTATUS_FAILED,gpphLibContext); 334 phOsalNfc_RaiseException(phOsalNfc_e_UnrecovFirmwareErr,1); 335 } 336 } 337 return; 338 } 339 /** 340 * De-Initialize the LIB NFC. 341 */ 342 NFCSTATUS phLibNfc_Mgt_DeInitialize(void * pDriverHandle, 343 pphLibNfc_RspCb_t pDeInitCb, 344 void* pContext 345 ) 346 { 347 NFCSTATUS Status = NFCSTATUS_SUCCESS; 348 pphLibNfc_LibContext_t pLibContext = gpphLibContext; 349 if(NULL==pDriverHandle) 350 { 351 /*Check for valid parameters */ 352 Status = NFCSTATUS_INVALID_PARAMETER; 353 } 354 else if((pLibContext==NULL) 355 || (pLibContext->LibNfcState.cur_state 356 == eLibNfcHalStateShutdown)) 357 { /*Lib Nfc not initlized*/ 358 Status = NFCSTATUS_NOT_INITIALISED; 359 } 360 else 361 { 362 if(pDeInitCb==NULL) 363 { 364 phHal4Nfc_Hal4Reset(pLibContext->psHwReference,(void *)pLibContext); 365 if(pLibContext->psHwReference!=NULL) 366 { 367 phOsalNfc_FreeMemory(pLibContext->psHwReference); 368 pLibContext->psHwReference = NULL; 369 } 370 /*Free the memory allocated during NDEF read,write 371 and NDEF formatting*/ 372 phLibNfc_Ndef_DeInit(); 373 phOsalNfc_FreeMemory(pLibContext); 374 gpphLibContext=NULL; 375 pLibContext= NULL; 376 } 377 else 378 { 379 if (NULL!= pLibContext->CBInfo.pClientShutdownCb) 380 { 381 /* Previous callback pending */ 382 Status = NFCSTATUS_BUSY; 383 } 384 Status = NFCSTATUS_PENDING; 385 if(TRUE != pLibContext->status.GenCb_pending_status) 386 { 387 Status = phHal4Nfc_Close(pLibContext->psHwReference, 388 phLibNfc_ShutdownCb, 389 (void *)pLibContext); 390 } 391 if(Status== NFCSTATUS_PENDING) 392 { 393 pLibContext->CBInfo.pClientShutdownCb = pDeInitCb; 394 pLibContext->CBInfo.pClientShtdwnCntx = pContext; 395 pLibContext->status.GenCb_pending_status=TRUE; 396 pLibContext->LibNfcState.next_state= eLibNfcHalStateShutdown; 397 } 398 else 399 { 400 Status =NFCSTATUS_FAILED; 401 } 402 } 403 } 404 return Status; 405 } 406 /* shutdown callback - 407 Free the allocated memory here */ 408 STATIC void phLibNfc_ShutdownCb(void *pContext,NFCSTATUS status) 409 { 410 pphLibNfc_RspCb_t pClientCb=NULL; 411 void *pUpperLayerContext=NULL; 412 pphLibNfc_LibContext_t pLibContext=NULL; 413 414 PHNFC_UNUSED_VARIABLE(pContext); 415 /* Get the Lib context */ 416 pLibContext=(pphLibNfc_LibContext_t)gpphLibContext; 417 418 if(pLibContext == NULL) 419 { 420 status = NFCSTATUS_FAILED; 421 } 422 else 423 { 424 /* Initialize the local variable */ 425 pClientCb =pLibContext->CBInfo.pClientShutdownCb; 426 pUpperLayerContext=pLibContext->CBInfo.pClientShtdwnCntx; 427 if(status == NFCSTATUS_SUCCESS) 428 { 429 pLibContext->LibNfcState.cur_state = eLibNfcHalStateShutdown; 430 phLibNfc_UpdateCurState(status,pLibContext); 431 432 pLibContext->status.GenCb_pending_status=FALSE; 433 434 /* Allocate the Memory for the Transceive info */ 435 if(pClientCb!=NULL) 436 { 437 (*pClientCb)(pUpperLayerContext, status); 438 } 439 if(pLibContext->psHwReference!=NULL) 440 { 441 phOsalNfc_FreeMemory(pLibContext->psHwReference); 442 pLibContext->psHwReference = NULL; 443 } 444 if(NULL != gpphLibContext->psBufferedAuth) 445 { 446 if(NULL != gpphLibContext->psBufferedAuth->sRecvData.buffer) 447 { 448 phOsalNfc_FreeMemory( 449 gpphLibContext->psBufferedAuth->sRecvData.buffer); 450 } 451 if(NULL != gpphLibContext->psBufferedAuth->sSendData.buffer) 452 { 453 phOsalNfc_FreeMemory( 454 gpphLibContext->psBufferedAuth->sSendData.buffer); 455 } 456 phOsalNfc_FreeMemory(gpphLibContext->psBufferedAuth); 457 gpphLibContext->psBufferedAuth = NULL; 458 } 459 /*Free the memory allocated during NDEF read,write 460 and NDEF formatting*/ 461 phLibNfc_Ndef_DeInit(); 462 phOsalNfc_FreeMemory(pLibContext); 463 gpphLibContext=NULL; 464 pLibContext= NULL; 465 466 } 467 else 468 { 469 /* shutdown sequence failed by HAL 4 */ 470 status= NFCSTATUS_FAILED; 471 pLibContext=(pphLibNfc_LibContext_t)gpphLibContext; 472 phLibNfc_UpdateCurState(status,pLibContext); 473 pLibContext->status.GenCb_pending_status=FALSE; 474 if(pClientCb!=NULL) 475 { 476 (*pClientCb)(pUpperLayerContext,status); 477 } 478 } 479 } 480 } 481 /** 482 * Pending shutdown call. 483 */ 484 485 486 void phLibNfc_Pending_Shutdown(void) 487 { 488 NFCSTATUS RetStatus = NFCSTATUS_SUCCESS ; 489 gpphLibContext->status.GenCb_pending_status = FALSE; 490 RetStatus = phHal4Nfc_Close( 491 gpphLibContext->psHwReference, 492 phLibNfc_ShutdownCb, 493 (void *)gpphLibContext); 494 PHNFC_UNUSED_VARIABLE(RetStatus); 495 return; 496 } 497 498 499 /** 500 * Reset the LIB NFC. 501 */ 502 NFCSTATUS phLibNfc_Mgt_Reset(void *pContext) 503 { 504 NFCSTATUS Status = NFCSTATUS_SUCCESS; 505 phLibNfc_LibContext_t *pLibNfc_Ctxt = (phLibNfc_LibContext_t *)pContext; 506 507 if((pLibNfc_Ctxt == NULL) 508 || (gpphLibContext->LibNfcState.cur_state 509 == eLibNfcHalStateShutdown)) 510 { /*Lib Nfc not initlized*/ 511 Status = NFCSTATUS_NOT_INITIALISED; 512 } 513 else if(NULL == pContext) 514 { 515 Status = NFCSTATUS_INVALID_PARAMETER; 516 } 517 /* Check for valid state,If De initialize is called then 518 return NFCSTATUS_SHUTDOWN */ 519 else if(gpphLibContext->LibNfcState.next_state 520 == eLibNfcHalStateShutdown) 521 { 522 Status = NFCSTATUS_SHUTDOWN; 523 } 524 else 525 { 526 /*Reset all callback status*/ 527 (void) memset(&(gpphLibContext->RegNtfType),0, 528 sizeof(phLibNfc_Registry_Info_t)); 529 (void) memset(&(gpphLibContext->sADDconfig),0, 530 sizeof(phLibNfc_sADD_Cfg_t)); 531 (void) memset(&(gpphLibContext->ndef_cntx),0, 532 sizeof(phLibNfc_NdefInfo_t)); 533 (void) memset(&(gpphLibContext->sNfcIp_Context),0, 534 sizeof(phLibNfc_NfcIpInfo_t)); 535 (void) memset(&(gpphLibContext->sCardEmulCfg),0, 536 sizeof(phHal_sEmulationCfg_t)); 537 (void) memset(&(gpphLibContext->Discov_handle),0, 538 MAX_REMOTE_DEVICES); 539 540 /*Free memory allocated for NDEF records*/ 541 if(NULL != gpphLibContext->psBufferedAuth) 542 { 543 if(NULL != gpphLibContext->psBufferedAuth->sRecvData.buffer) 544 { 545 phOsalNfc_FreeMemory( 546 gpphLibContext->psBufferedAuth->sRecvData.buffer); 547 gpphLibContext->psBufferedAuth->sRecvData.buffer = NULL; 548 } 549 if(NULL != gpphLibContext->psBufferedAuth->sSendData.buffer) 550 { 551 phOsalNfc_FreeMemory( 552 gpphLibContext->psBufferedAuth->sSendData.buffer); 553 gpphLibContext->psBufferedAuth->sSendData.buffer = NULL; 554 } 555 phOsalNfc_FreeMemory(gpphLibContext->psBufferedAuth); 556 gpphLibContext->psBufferedAuth = NULL; 557 } 558 if(NULL != gpphLibContext->psTransInfo) 559 { 560 phOsalNfc_FreeMemory(gpphLibContext->psTransInfo); 561 gpphLibContext->psTransInfo = NULL; 562 } 563 if(NULL != gpphLibContext->ndef_cntx.psNdefMap) 564 { 565 if(NULL != gpphLibContext->ndef_cntx.psNdefMap->SendRecvBuf) 566 { 567 phOsalNfc_FreeMemory(gpphLibContext->ndef_cntx.psNdefMap->SendRecvBuf); 568 gpphLibContext->ndef_cntx.psNdefMap->SendRecvBuf = NULL; 569 } 570 phOsalNfc_FreeMemory(gpphLibContext->ndef_cntx.psNdefMap); 571 gpphLibContext->ndef_cntx.psNdefMap = NULL; 572 } 573 if(NULL != gpphLibContext->psOverHalCtxt) 574 { 575 phOsalNfc_FreeMemory(gpphLibContext->psOverHalCtxt); 576 gpphLibContext->psTransInfo = NULL; 577 } 578 if(NULL != gpphLibContext->psDevInputParam) 579 { 580 phOsalNfc_FreeMemory(gpphLibContext->psDevInputParam); 581 gpphLibContext->psDevInputParam = NULL; 582 } 583 if(NULL != gpphLibContext->ndef_cntx.ndef_fmt) 584 { 585 phOsalNfc_FreeMemory(gpphLibContext->ndef_cntx.ndef_fmt); 586 gpphLibContext->ndef_cntx.ndef_fmt = NULL; 587 } 588 if(NULL != pNdefRecord) 589 { 590 if(NULL != pNdefRecord->Id) 591 { 592 phOsalNfc_FreeMemory(pNdefRecord->Id); 593 pNdefRecord->Id = NULL; 594 } 595 if(NULL != pNdefRecord->Type) 596 { 597 phOsalNfc_FreeMemory(pNdefRecord->Type); 598 pNdefRecord->Type = NULL; 599 } 600 if(NULL != pNdefRecord->PayloadData) 601 { 602 phOsalNfc_FreeMemory(pNdefRecord->PayloadData); 603 pNdefRecord->PayloadData = NULL; 604 } 605 } 606 if(NULL != NdefInfo.pNdefRecord) 607 { 608 phOsalNfc_FreeMemory(NdefInfo.pNdefRecord); 609 NdefInfo.pNdefRecord = NULL; 610 } 611 if(NULL != gpphLibContext->phLib_NdefRecCntx.NdefCb) 612 { 613 phOsalNfc_FreeMemory(gpphLibContext->phLib_NdefRecCntx.NdefCb); 614 gpphLibContext->phLib_NdefRecCntx.NdefCb = NULL; 615 } 616 if(NULL != gpphLibContext->phLib_NdefRecCntx.ndef_message.buffer) 617 { 618 phOsalNfc_FreeMemory(gpphLibContext->phLib_NdefRecCntx.ndef_message.buffer); 619 gpphLibContext->phLib_NdefRecCntx.ndef_message.buffer = NULL; 620 } 621 /* No device is connected */ 622 gpphLibContext->Connected_handle = 0x00; 623 gpphLibContext->Prev_Connected_handle = 0x00; 624 gpphLibContext->ReleaseType = NFC_INVALID_RELEASE_TYPE; 625 gpphLibContext->eLibNfcCfgMode = NFC_DISCOVERY_STOP; 626 /*Lib Nfc Stack is initilized and in idle state*/ 627 gpphLibContext->LibNfcState.cur_state = eLibNfcHalStateInitandIdle; 628 629 /* Reset all callback status */ 630 gpphLibContext->CBInfo.pClientCkNdefCb = NULL; 631 gpphLibContext->CBInfo.pClientCkNdefCntx = NULL; 632 gpphLibContext->CBInfo.pClientConCntx = NULL; 633 gpphLibContext->CBInfo.pClientConnectCb = NULL; 634 gpphLibContext->CBInfo.pClientDConCntx = NULL; 635 gpphLibContext->CBInfo.pClientDisCfgCntx = NULL; 636 gpphLibContext->CBInfo.pClientDisConfigCb = NULL; 637 gpphLibContext->CBInfo.pClientInitCb = NULL; 638 gpphLibContext->CBInfo.pClientInitCntx = gpphLibContext; 639 gpphLibContext->CBInfo.pClientNdefNtfRespCb = NULL; 640 gpphLibContext->CBInfo.pClientNdefNtfRespCntx = NULL; 641 gpphLibContext->CBInfo.pClientNtfRegRespCB = NULL; 642 gpphLibContext->CBInfo.pClientNtfRegRespCntx = NULL; 643 gpphLibContext->CBInfo.pClientPresChkCb = NULL; 644 gpphLibContext->CBInfo.pClientPresChkCntx = NULL; 645 gpphLibContext->CBInfo.pClientRdNdefCb = NULL; 646 gpphLibContext->CBInfo.pClientRdNdefCntx = NULL; 647 gpphLibContext->CBInfo.pClientShtdwnCntx = NULL; 648 gpphLibContext->CBInfo.pClientShutdownCb = NULL; 649 gpphLibContext->CBInfo.pClientTransceiveCb = NULL; 650 gpphLibContext->CBInfo.pClientTranseCntx = NULL; 651 gpphLibContext->CBInfo.pClientWrNdefCb = NULL; 652 gpphLibContext->CBInfo.pClientWrNdefCntx = NULL; 653 gpphLibContext->sNfcIp_Context.pClientNfcIpCfgCb = NULL; 654 gpphLibContext->sNfcIp_Context.pClientNfcIpCfgCntx = NULL; 655 gpphLibContext->sNfcIp_Context.pClientNfcIpRxCb = NULL; 656 gpphLibContext->sNfcIp_Context.pClientNfcIpRxCntx = NULL; 657 gpphLibContext->sNfcIp_Context.pClientNfcIpTxCb = NULL; 658 gpphLibContext->sNfcIp_Context.pClientNfcIpTxCntx = NULL; 659 gpphLibContext->sSeContext.sSeCallabackInfo.pSeListenerNtfCb = NULL; 660 gpphLibContext->sSeContext.sSeCallabackInfo.pSeListenerCtxt = NULL; 661 gpphLibContext->sSeContext.sSeCallabackInfo.pSEsetModeCb = NULL; 662 gpphLibContext->sSeContext.sSeCallabackInfo.pSEsetModeCtxt = NULL; 663 /*No callback is pending*/ 664 gpphLibContext->status.GenCb_pending_status = FALSE; 665 666 } 667 return Status; 668 } 669 /** 670 * LibNfc state machine next state update. 671 */ 672 673 NFCSTATUS 674 phLibNfc_UpdateNextState( 675 pphLibNfc_LibContext_t pLibContext, 676 phLibNfc_State_t next_state 677 ) 678 { 679 NFCSTATUS status = NFCSTATUS_INVALID_STATE; 680 switch(pLibContext->LibNfcState.cur_state) 681 { 682 case eLibNfcHalStateShutdown: 683 { 684 switch(next_state) 685 { 686 case eLibNfcHalStateShutdown: 687 case eLibNfcHalStateInitandIdle: 688 status = NFCSTATUS_SUCCESS; 689 break; 690 default: 691 break; 692 } 693 } 694 break; 695 case eLibNfcHalStateConfigReady: 696 { 697 switch(next_state) 698 { 699 case eLibNfcHalStateShutdown: 700 case eLibNfcHalStateConfigReady: 701 case eLibNfcHalStateInitandIdle: 702 case eLibNfcHalStateConnect: 703 status = NFCSTATUS_SUCCESS; 704 break; 705 default: 706 break; 707 } 708 } 709 break; 710 case eLibNfcHalStateConnect: 711 { 712 switch(next_state) 713 { 714 case eLibNfcHalStateShutdown: 715 case eLibNfcHalStateRelease: 716 case eLibNfcHalStateTransaction: 717 case eLibNfcHalStatePresenceChk: 718 status = NFCSTATUS_SUCCESS; 719 break; 720 default: 721 break; 722 } 723 } 724 break; 725 case eLibNfcHalStatePresenceChk: 726 { 727 switch(next_state) 728 { 729 case eLibNfcHalStateShutdown: 730 case eLibNfcHalStateConfigReady: 731 case eLibNfcHalStateRelease: 732 case eLibNfcHalStateTransaction: 733 case eLibNfcHalStatePresenceChk: 734 status = NFCSTATUS_SUCCESS; 735 break; 736 default: 737 break; 738 } 739 } 740 break; 741 case eLibNfcHalStateInitandIdle: 742 { 743 switch(next_state) 744 { 745 case eLibNfcHalStateShutdown: 746 case eLibNfcHalStateConfigReady: 747 status = NFCSTATUS_SUCCESS; 748 break; 749 default: 750 break; 751 } 752 } 753 break; 754 default: 755 break; 756 } 757 pLibContext->LibNfcState.next_state = 758 (uint8_t)((NFCSTATUS_SUCCESS == status)?next_state:pLibContext->LibNfcState.next_state); 759 760 return status; 761 } 762 763 /** 764 * LibNfc state machine current state update. 765 */ 766 767 void 768 phLibNfc_UpdateCurState( 769 NFCSTATUS status, 770 pphLibNfc_LibContext_t psLibContext 771 ) 772 { 773 switch(psLibContext->LibNfcState.next_state) 774 { 775 case eLibNfcHalStateTransaction: 776 psLibContext->LibNfcState.cur_state = (uint8_t)eLibNfcHalStateConnect; 777 break; 778 case eLibNfcHalStateRelease: 779 psLibContext->LibNfcState.cur_state 780 = (uint8_t)(psLibContext->status.DiscEnbl_status == TRUE? 781 eLibNfcHalStateInitandIdle:eLibNfcHalStateConfigReady); 782 break; 783 case eLibNfcHalStateInvalid: 784 break; 785 default: 786 psLibContext->LibNfcState.cur_state 787 = (uint8_t)((NFCSTATUS_SUCCESS == status)? 788 psLibContext->LibNfcState.next_state: 789 psLibContext->LibNfcState.cur_state); 790 } 791 psLibContext->LibNfcState.next_state = (uint8_t)eLibNfcHalStateInvalid; 792 return; 793 } 794 /* Interface to stack capabilities */ 795 796 NFCSTATUS phLibNfc_Mgt_GetstackCapabilities( 797 phLibNfc_StackCapabilities_t *phLibNfc_StackCapabilities, 798 void *pContext) 799 { 800 NFCSTATUS RetVal = NFCSTATUS_FAILED; 801 /*Check Lib Nfc stack is initilized*/ 802 if((NULL == gpphLibContext)|| 803 (gpphLibContext->LibNfcState.cur_state == eLibNfcHalStateShutdown)) 804 { 805 RetVal = NFCSTATUS_NOT_INITIALISED; 806 } 807 /*Check application has sent the valid parameters*/ 808 else if((NULL == phLibNfc_StackCapabilities) 809 || (NULL == pContext)) 810 { 811 RetVal= NFCSTATUS_INVALID_PARAMETER; 812 } 813 else if(gpphLibContext->LibNfcState.next_state == eLibNfcHalStateShutdown) 814 { 815 RetVal = NFCSTATUS_SHUTDOWN; 816 } 817 else if(TRUE == gpphLibContext->status.GenCb_pending_status) 818 { 819 /*Previous operation is pending */ 820 RetVal = NFCSTATUS_BUSY; 821 } 822 else 823 { 824 /* Tag Format Capabilities*/ 825 phLibNfc_StackCapabilities->psFormatCapabilities.Desfire = TRUE; 826 phLibNfc_StackCapabilities->psFormatCapabilities.MifareStd = TRUE; 827 phLibNfc_StackCapabilities->psFormatCapabilities.MifareUL = TRUE; 828 phLibNfc_StackCapabilities->psFormatCapabilities.FeliCa = FALSE; 829 phLibNfc_StackCapabilities->psFormatCapabilities.Jewel = FALSE; 830 phLibNfc_StackCapabilities->psFormatCapabilities.ISO14443_4A = FALSE; 831 phLibNfc_StackCapabilities->psFormatCapabilities.ISO14443_4B = FALSE; 832 phLibNfc_StackCapabilities->psFormatCapabilities.MifareULC = TRUE; 833 phLibNfc_StackCapabilities->psFormatCapabilities.ISO15693 = FALSE; 834 835 /* Tag Mapping Capabilities */ 836 phLibNfc_StackCapabilities->psMappingCapabilities.FeliCa = TRUE; 837 phLibNfc_StackCapabilities->psMappingCapabilities.Desfire = TRUE; 838 phLibNfc_StackCapabilities->psMappingCapabilities.ISO14443_4A = TRUE; 839 phLibNfc_StackCapabilities->psMappingCapabilities.ISO14443_4B = TRUE; 840 phLibNfc_StackCapabilities->psMappingCapabilities.MifareStd = TRUE; 841 phLibNfc_StackCapabilities->psMappingCapabilities.MifareUL = TRUE; 842 phLibNfc_StackCapabilities->psMappingCapabilities.MifareULC = TRUE; 843 phLibNfc_StackCapabilities->psMappingCapabilities.Jewel = TRUE; 844 phLibNfc_StackCapabilities->psMappingCapabilities.ISO15693 = FALSE; 845 846 /*Call Hal4 Get Dev Capabilities to get info about protocols supported 847 by Lib Nfc*/ 848 PHDBG_INFO("LibNfc:Get Stack capabilities "); 849 RetVal= phHal4Nfc_GetDeviceCapabilities( 850 gpphLibContext->psHwReference, 851 &(phLibNfc_StackCapabilities->psDevCapabilities), 852 (void *)gpphLibContext); 853 854 LIB_NFC_VERSION_SET(phLibNfc_StackCapabilities->psDevCapabilities.hal_version, 855 PH_HAL4NFC_VERSION, 856 PH_HAL4NFC_REVISION, 857 PH_HAL4NFC_PATCH, 858 PH_HAL4NFC_BUILD); 859 860 phLibNfc_StackCapabilities->psDevCapabilities.fw_version= 861 gpphLibContext->psHwReference->device_info.fw_version; 862 phLibNfc_StackCapabilities->psDevCapabilities.hci_version= 863 gpphLibContext->psHwReference->device_info.hci_version; 864 phLibNfc_StackCapabilities->psDevCapabilities.hw_version= 865 gpphLibContext->psHwReference->device_info.hw_version; 866 phLibNfc_StackCapabilities->psDevCapabilities.model_id= 867 gpphLibContext->psHwReference->device_info.model_id; 868 (void)memcpy(phLibNfc_StackCapabilities->psDevCapabilities.full_version, 869 gpphLibContext->psHwReference->device_info.full_version,NXP_FULL_VERSION_LEN); 870 /* Check the firmware version */ 871 if (nxp_nfc_full_version == NULL) { 872 // Couldn't load firmware, just pretend we're up to date. 873 LOGW("Firmware image not available: this device might be running old NFC firmware!"); 874 phLibNfc_StackCapabilities->psDevCapabilities.firmware_update_info = 0; 875 } else { 876 phLibNfc_StackCapabilities->psDevCapabilities.firmware_update_info = memcmp(phLibNfc_StackCapabilities->psDevCapabilities.full_version, nxp_nfc_full_version, 877 NXP_FULL_VERSION_LEN); 878 } 879 880 if(NFCSTATUS_SUCCESS != RetVal) 881 { 882 RetVal = NFCSTATUS_FAILED; 883 } 884 } 885 return RetVal; 886 } 887 888 889 890 891 892 893 NFCSTATUS phLibNfc_Mgt_ConfigureTestMode(void *pDriverHandle, 894 pphLibNfc_RspCb_t pTestModeCb, 895 phLibNfc_Cfg_Testmode_t eTstmode, 896 void *pContext) 897 { 898 NFCSTATUS Status = NFCSTATUS_SUCCESS; 899 phHal4Nfc_InitType_t eInitType=eInitDefault; 900 901 if((NULL == pDriverHandle)||(NULL == pTestModeCb)) 902 { 903 Status = NFCSTATUS_INVALID_PARAMETER; 904 } 905 else if((NULL != gpphLibContext) && \ 906 (gpphLibContext->LibNfcState.next_state==eLibNfcHalStateShutdown)) 907 { 908 Status = NFCSTATUS_SHUTDOWN; 909 } 910 else if( (eTstmode == phLibNfc_TstMode_On) && (NULL != gpphLibContext)) 911 { 912 Status=NFCSTATUS_ALREADY_INITIALISED; 913 } 914 else if( (eTstmode == phLibNfc_TstMode_Off) && (NULL == gpphLibContext)) 915 { 916 Status = NFCSTATUS_NOT_INITIALISED; 917 } 918 else if( (eTstmode == phLibNfc_TstMode_Off) && (NULL != gpphLibContext)) 919 { 920 if (NULL!= gpphLibContext->CBInfo.pClientShutdownCb) 921 { /* Previous callback pending */ 922 Status = NFCSTATUS_BUSY; 923 } 924 else 925 { 926 Status = NFCSTATUS_PENDING; 927 if(TRUE != gpphLibContext->status.GenCb_pending_status) 928 { 929 Status = phHal4Nfc_Close(gpphLibContext->psHwReference, 930 phLibNfc_ShutdownCb, 931 (void *)gpphLibContext); 932 } 933 if(Status== NFCSTATUS_PENDING) 934 { 935 gpphLibContext->CBInfo.pClientShutdownCb = pTestModeCb; 936 gpphLibContext->CBInfo.pClientShtdwnCntx = pContext; 937 gpphLibContext->status.GenCb_pending_status=TRUE; 938 gpphLibContext->LibNfcState.next_state= eLibNfcHalStateShutdown; 939 } 940 else 941 { 942 Status =NFCSTATUS_FAILED; 943 } 944 } 945 } 946 else 947 { 948 /* Initialize the Lib context */ 949 gpphLibContext=(pphLibNfc_LibContext_t)phOsalNfc_GetMemory( 950 (uint32_t)sizeof(phLibNfc_LibContext_t)); 951 if(NULL == gpphLibContext) 952 { 953 Status=NFCSTATUS_INSUFFICIENT_RESOURCES; 954 } 955 else 956 { 957 (void)memset((void *)gpphLibContext,0,( 958 (uint32_t)sizeof(phLibNfc_LibContext_t))); 959 960 /* Store the Callback and context in LibContext structure*/ 961 gpphLibContext->CBInfo.pClientInitCb=pTestModeCb; 962 gpphLibContext->CBInfo.pClientInitCntx=pContext; 963 /* Initialize the HwReferece structure */ 964 gpphLibContext->psHwReference=(phHal_sHwReference_t *) 965 phOsalNfc_GetMemory((uint32_t)sizeof(phHal_sHwReference_t)); 966 (void)memset((void *)gpphLibContext->psHwReference,0, 967 ((uint32_t)sizeof(phHal_sHwReference_t))); 968 /* Allocate the Memory for the Transceive info */ 969 if( gpphLibContext->psHwReference!=NULL) 970 { 971 gpphLibContext->psHwReference->p_board_driver = pDriverHandle; 972 Status = phLibNfc_UpdateNextState(gpphLibContext, 973 eLibNfcHalStateInitandIdle); 974 if(Status==NFCSTATUS_SUCCESS) 975 { 976 if(eTstmode == phLibNfc_TstMode_On) 977 eInitType = eInitTestModeOn; 978 if(eTstmode == phLibNfc_TstMode_Off) 979 eInitType = eInitDefault; 980 Status=phHal4Nfc_Open( 981 gpphLibContext->psHwReference, 982 eInitType, 983 phLibNfc_InitCb, 984 (void *)gpphLibContext); 985 } 986 } 987 else 988 { 989 Status = NFCSTATUS_INSUFFICIENT_RESOURCES; 990 } 991 phLibNfc_Ndef_Init(); 992 } 993 } 994 995 return Status; 996 } 997 998