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_ndef_raw.c 19 20 * Project: NFC FRI 1.1 21 * 22 * $Date: Mon Dec 13 14:14:15 2010 $ 23 * $Author: ing02260 $ 24 * $Revision: 1.74 $ 25 * $Aliases: $ 26 * 27 */ 28 29 /* 30 ************************* Header Files **************************************** 31 */ 32 33 #include <phLibNfcStatus.h> 34 #include <phLibNfc.h> 35 #include <phHal4Nfc.h> 36 #include <phOsalNfc.h> 37 #include <phLibNfc_Internal.h> 38 #include <phLibNfc_ndef_raw.h> 39 #include <phLibNfc_initiator.h> 40 #include <phLibNfc_discovery.h> 41 #include <phFriNfc_NdefReg.h> 42 43 /* 44 *************************** Macro's **************************************** 45 */ 46 47 #ifndef STATIC_DISABLE 48 #define STATIC static 49 #else 50 //#undef STATIC 51 #define STATIC 52 #endif 53 54 #define TOPAZ_NDEF_BITMASK 0x10U 55 #define TOPAZ_LEN_BITMASK 0x02U 56 #define TOPAZ_DYNAMIC_LEN 460U 57 #define TOPAZ_STATIC_CARD_LEN 128U 58 #define MIFARE_STD_BLOCK_SIZE 0x10U 59 /* 60 *************************** Global Variables ********************************** 61 */ 62 phLibNfc_Ndef_Info_t NdefInfo; 63 phFriNfc_NdefRecord_t *pNdefRecord=NULL; 64 /* 65 *************************** Static Function Declaration *********************** 66 */ 67 68 /* Response callback for Check Ndef */ 69 STATIC 70 void phLibNfc_Ndef_CheckNdef_Cb(void *pContext, NFCSTATUS status); 71 72 /* Response callback for Ndef Write */ 73 STATIC 74 void phLibNfc_Ndef_Write_Cb(void* Context,NFCSTATUS status); 75 76 /* Response callback for Ndef Read*/ 77 STATIC 78 void phLibNfc_Ndef_Read_Cb(void* Context,NFCSTATUS status); 79 80 /* Response callback forNdef Format*/ 81 STATIC 82 void phLibNfc_Ndef_format_Cb(void *Context,NFCSTATUS status); 83 84 #ifdef LIBNFC_READONLY_NDEF 85 STATIC 86 void 87 phLibNfc_Ndef_ReadOnly_Cb ( 88 void *p_context, 89 NFCSTATUS status); 90 #endif /* #ifdef LIBNFC_READONLY_NDEF */ 91 92 /* Response callback for Search Ndef Content */ 93 STATIC 94 void phLibNfc_Ndef_SrchNdefCnt_Cb(void *context, NFCSTATUS status); 95 96 /* Response callback for Ndef Record Type Discovery */ 97 STATIC 98 void phLibNfc_Ndef_Rtd_Cb( void *CallBackParam); 99 100 /* Response callback for Check Ndef timer callback */ 101 STATIC void CheckNdef_timer_cb(uint32_t timer_id, void *pContext); 102 103 /*Callback for Presence check call from Chk Ndef*/ 104 STATIC void phLibNfc_Ndef_ChkNdef_Pchk_Cb(void *pContext, 105 NFCSTATUS status 106 ); 107 /* 108 *************************** Function Definitions ****************************** 109 */ 110 111 /** 112 * This function reads an NDEF message from already connected tag. 113 * the NDEF message is read starting after the position of the 114 * last read operation of the same tag during current session. 115 */ 116 117 NFCSTATUS phLibNfc_Ndef_Read( phLibNfc_Handle hRemoteDevice, 118 phNfc_sData_t *psRd, 119 phLibNfc_Ndef_EOffset_t Offset, 120 pphLibNfc_RspCb_t pNdefRead_RspCb, 121 void* pContext 122 ) 123 { 124 NFCSTATUS RetVal = NFCSTATUS_FAILED; 125 if((NULL == gpphLibContext)|| 126 (gpphLibContext->LibNfcState.cur_state == eLibNfcHalStateShutdown)) 127 { 128 RetVal = NFCSTATUS_NOT_INITIALISED; 129 } 130 else if((NULL == psRd) || (NULL == pNdefRead_RspCb) 131 || (NULL == psRd->buffer) 132 || (0 == psRd->length) 133 || (NULL == pContext) 134 || (0 == hRemoteDevice)) 135 { 136 RetVal= NFCSTATUS_INVALID_PARAMETER; 137 } 138 else if(gpphLibContext->LibNfcState.next_state == eLibNfcHalStateShutdown) 139 { 140 RetVal = NFCSTATUS_SHUTDOWN; 141 } 142 else if(0 == gpphLibContext->Connected_handle) 143 { /*presently no target or tag is connected*/ 144 RetVal=NFCSTATUS_TARGET_NOT_CONNECTED; 145 } 146 else if(hRemoteDevice != gpphLibContext->Connected_handle) 147 { /*This handle of the device sent by application is not connected */ 148 RetVal=NFCSTATUS_INVALID_HANDLE; 149 } 150 else if((TRUE == gpphLibContext->status.GenCb_pending_status) 151 ||(NULL!=gpphLibContext->CBInfo.pClientRdNdefCb) 152 ||(CHK_NDEF_NOT_DONE == gpphLibContext->ndef_cntx.is_ndef)) 153 { 154 /*Previous callback is pending*/ 155 RetVal = NFCSTATUS_REJECTED; 156 } 157 else if(gpphLibContext->ndef_cntx.is_ndef == FALSE) 158 { 159 /*no Ndef Support in tag*/ 160 RetVal = NFCSTATUS_NON_NDEF_COMPLIANT; 161 } 162 else if((gpphLibContext->ndef_cntx.is_ndef == TRUE) 163 &&(0 == gpphLibContext->ndef_cntx.NdefActualSize)) 164 { 165 /*Card is empty- So Returning length as zero*/ 166 psRd->length = 0; 167 RetVal = NFCSTATUS_SUCCESS; 168 } 169 #ifdef LLCP_TRANSACT_CHANGES 170 else if ((LLCP_STATE_RESET_INIT != gpphLibContext->llcp_cntx.sLlcpContext.state) 171 && (LLCP_STATE_CHECKED != gpphLibContext->llcp_cntx.sLlcpContext.state)) 172 { 173 RetVal= NFCSTATUS_BUSY; 174 } 175 #endif /* #ifdef LLCP_TRANSACT_CHANGES */ 176 else 177 { 178 gpphLibContext->psRemoteDevList->psRemoteDevInfo->SessionOpened = SESSION_OPEN; 179 gpphLibContext->ndef_cntx.eLast_Call = NdefRd; 180 if((((phHal_sRemoteDevInformation_t*)hRemoteDevice)->RemDevType == 181 phHal_eMifare_PICC) && (((phHal_sRemoteDevInformation_t*) 182 hRemoteDevice)->RemoteDevInfo.Iso14443A_Info.Sak != 0)&& 183 ((NULL == gpphLibContext->psBufferedAuth) 184 ||(phHal_eMifareAuthentA == gpphLibContext->psBufferedAuth->cmd.MfCmd)) 185 ) 186 { 187 if(NULL != gpphLibContext->psBufferedAuth) 188 { 189 if(NULL != gpphLibContext->psBufferedAuth->sRecvData.buffer) 190 { 191 phOsalNfc_FreeMemory( 192 gpphLibContext->psBufferedAuth->sRecvData.buffer); 193 } 194 if(NULL != gpphLibContext->psBufferedAuth->sSendData.buffer) 195 { 196 phOsalNfc_FreeMemory( 197 gpphLibContext->psBufferedAuth->sSendData.buffer); 198 } 199 phOsalNfc_FreeMemory(gpphLibContext->psBufferedAuth); 200 } 201 gpphLibContext->psBufferedAuth 202 =(phLibNfc_sTransceiveInfo_t *) 203 phOsalNfc_GetMemory(sizeof(phLibNfc_sTransceiveInfo_t)); 204 gpphLibContext->psBufferedAuth->addr = 205 (uint8_t)gpphLibContext->ndef_cntx.psNdefMap 206 ->StdMifareContainer.currentBlock; 207 gpphLibContext->psBufferedAuth->cmd.MfCmd = phHal_eMifareRead16; 208 gpphLibContext->psBufferedAuth->sSendData.length 209 = 0; 210 gpphLibContext->psBufferedAuth->sRecvData.length 211 = MIFARE_STD_BLOCK_SIZE; 212 gpphLibContext->psBufferedAuth->sRecvData.buffer 213 = (uint8_t *)phOsalNfc_GetMemory(MIFARE_STD_BLOCK_SIZE); 214 gpphLibContext->psBufferedAuth->sSendData.buffer 215 = (uint8_t *)phOsalNfc_GetMemory(MIFARE_STD_BLOCK_SIZE); 216 } 217 if(eLibNfcHalStatePresenceChk != 218 gpphLibContext->LibNfcState.next_state) 219 { 220 uint8_t cr_index = 0; 221 gpphLibContext->ndef_cntx.psUpperNdefMsg = psRd; 222 for (cr_index = 0; cr_index < PH_FRINFC_NDEFMAP_CR; cr_index++) 223 { 224 RetVal= phFriNfc_NdefMap_SetCompletionRoutine( 225 gpphLibContext->ndef_cntx.psNdefMap, 226 cr_index, 227 phLibNfc_Ndef_Read_Cb, 228 (void *)gpphLibContext); 229 230 } 231 gpphLibContext->ndef_cntx.NdefContinueRead =(uint8_t) ((phLibNfc_Ndef_EBegin==Offset) ? 232 PH_FRINFC_NDEFMAP_SEEK_BEGIN : 233 PH_FRINFC_NDEFMAP_SEEK_CUR); 234 /* call below layer Ndef Read*/ 235 RetVal = phFriNfc_NdefMap_RdNdef(gpphLibContext->ndef_cntx.psNdefMap, 236 gpphLibContext->ndef_cntx.psUpperNdefMsg->buffer, 237 (uint32_t*)&gpphLibContext->ndef_cntx.psUpperNdefMsg->length, 238 gpphLibContext->ndef_cntx.NdefContinueRead); 239 240 RetVal = PHNFCSTATUS(RetVal); 241 if(NFCSTATUS_INSUFFICIENT_STORAGE == RetVal) 242 { 243 gpphLibContext->ndef_cntx.psUpperNdefMsg->length = 0; 244 RetVal = NFCSTATUS_SUCCESS; 245 } 246 } 247 else 248 { 249 gpphLibContext->CBInfo.pClientRdNdefCb= NULL; 250 RetVal = NFCSTATUS_PENDING; 251 } 252 if(NFCSTATUS_PENDING == RetVal) 253 { 254 gpphLibContext->CBInfo.pClientRdNdefCb = pNdefRead_RspCb; 255 gpphLibContext->CBInfo.pClientRdNdefCntx = pContext; 256 gpphLibContext->status.GenCb_pending_status=TRUE; 257 gpphLibContext->LibNfcState.next_state = eLibNfcHalStateTransaction; 258 259 } 260 else if (NFCSTATUS_SUCCESS == RetVal) 261 { 262 RetVal= NFCSTATUS_SUCCESS; 263 } 264 else 265 { 266 /*Ndef read failed*/ 267 RetVal = NFCSTATUS_FAILED; 268 } 269 } 270 return RetVal; 271 } 272 /* Response callback for phLibNfc_Ndef_Read */ 273 STATIC 274 void phLibNfc_Ndef_Read_Cb(void* Context,NFCSTATUS status) 275 { 276 NFCSTATUS RetStatus = NFCSTATUS_SUCCESS; 277 pphLibNfc_RspCb_t pClientCb=NULL; 278 phLibNfc_LibContext_t *pLibNfc_Ctxt = (phLibNfc_LibContext_t *)Context; 279 void *pUpperLayerContext=NULL; 280 phHal_sRemoteDevInformation_t *ps_rem_dev_info = NULL; 281 282 if(pLibNfc_Ctxt != gpphLibContext) 283 { 284 /*wrong context returned*/ 285 phOsalNfc_RaiseException(phOsalNfc_e_InternalErr,1); 286 } 287 else 288 { 289 if(eLibNfcHalStateShutdown == gpphLibContext->LibNfcState.next_state) 290 { /*shutdown called before completion of Ndef read allow 291 shutdown to happen */ 292 phLibNfc_Pending_Shutdown(); 293 RetStatus = NFCSTATUS_SHUTDOWN; 294 } 295 else if(eLibNfcHalStateRelease == gpphLibContext->LibNfcState.next_state) 296 { 297 RetStatus = NFCSTATUS_ABORTED; 298 } 299 else 300 { 301 gpphLibContext->status.GenCb_pending_status = FALSE; 302 if (gpphLibContext->psBufferedAuth != NULL && gpphLibContext->ndef_cntx.psNdefMap != NULL) { 303 gpphLibContext->psBufferedAuth->addr = (uint8_t) 304 gpphLibContext->ndef_cntx.psNdefMap->StdMifareContainer.currentBlock; 305 } 306 307 if(NFCSTATUS_FAILED == status ) 308 { 309 /*During Ndef read operation tag was not present in RF 310 field of reader*/ 311 RetStatus = NFCSTATUS_FAILED; 312 gpphLibContext->LastTrancvSuccess = FALSE; 313 gpphLibContext->ndef_cntx.is_ndef = FALSE; 314 ps_rem_dev_info = (phHal_sRemoteDevInformation_t *) 315 gpphLibContext->Connected_handle; 316 if ((phHal_eMifare_PICC == ps_rem_dev_info->RemDevType) && 317 (0x08 == (ps_rem_dev_info->RemoteDevInfo.Iso14443A_Info.Sak & 0x08))) 318 { 319 320 /* card type is mifare 1k/4k, then reconnect */ 321 RetStatus = phHal4Nfc_Connect(gpphLibContext->psHwReference, 322 ps_rem_dev_info, 323 (pphHal4Nfc_ConnectCallback_t) 324 phLibNfc_Reconnect_Mifare_Cb, 325 (void *)gpphLibContext); 326 } 327 328 } 329 else if(status == NFCSTATUS_SUCCESS) 330 { 331 gpphLibContext->LastTrancvSuccess = TRUE; 332 RetStatus = NFCSTATUS_SUCCESS; 333 } 334 else 335 { 336 gpphLibContext->LastTrancvSuccess = FALSE; 337 RetStatus = NFCSTATUS_FAILED; 338 } 339 } 340 /*update the current state as connected*/ 341 phLibNfc_UpdateCurState(status,gpphLibContext); 342 343 pClientCb = gpphLibContext->CBInfo.pClientRdNdefCb; 344 pUpperLayerContext = gpphLibContext->CBInfo.pClientRdNdefCntx; 345 346 gpphLibContext->CBInfo.pClientRdNdefCb = NULL; 347 gpphLibContext->CBInfo.pClientRdNdefCntx = NULL; 348 if(NFCSTATUS_PENDING != RetStatus) 349 { 350 if (NULL != pClientCb) 351 { 352 /*Notify to upper layer status and read bytes*/ 353 pClientCb(pUpperLayerContext,RetStatus); 354 } 355 } 356 } 357 return; 358 } 359 360 /** 361 * Write NDEF to a tag. 362 * 363 * This function allows the user to write a NDEF data to already connected NFC 364 * tag.Function writes a complete NDEF message to a tag. If a NDEF message 365 * already exists in the tag, it will be overwritten. When the transaction is 366 * complete,a notification callback is notified. 367 */ 368 NFCSTATUS phLibNfc_Ndef_Write( 369 phLibNfc_Handle hRemoteDevice, 370 phNfc_sData_t *psWr, 371 pphLibNfc_RspCb_t pNdefWrite_RspCb, 372 void* pContext 373 ) 374 { 375 NFCSTATUS RetVal = NFCSTATUS_FAILED; 376 uint8_t NdefWriteType=0xFF; 377 /*LibNfc is initilized or not */ 378 if((NULL == gpphLibContext)|| 379 (gpphLibContext->LibNfcState.cur_state 380 == eLibNfcHalStateShutdown)) 381 { 382 RetVal = NFCSTATUS_NOT_INITIALISED; 383 }/*Check for application has sent the valid parameters*/ 384 else if((NULL == psWr) || (NULL == pNdefWrite_RspCb) 385 || (NULL == psWr->buffer) 386 || (NULL == pContext) 387 || (0 ==hRemoteDevice)) 388 { 389 RetVal= NFCSTATUS_INVALID_PARAMETER; 390 } 391 else if(gpphLibContext->LibNfcState.next_state 392 == eLibNfcHalStateShutdown) 393 { /* Lib Nfc Shutdown*/ 394 RetVal= NFCSTATUS_SHUTDOWN; 395 } 396 else if(0 == gpphLibContext->Connected_handle) 397 { 398 RetVal=NFCSTATUS_TARGET_NOT_CONNECTED; 399 } 400 else if(hRemoteDevice != gpphLibContext->Connected_handle) 401 { 402 RetVal=NFCSTATUS_INVALID_HANDLE; 403 } 404 else if((TRUE == gpphLibContext->status.GenCb_pending_status)|| 405 (gpphLibContext->ndef_cntx.is_ndef == CHK_NDEF_NOT_DONE)) 406 { 407 /* Previous callback is pending or Tag is not NDEF tag*/ 408 RetVal = NFCSTATUS_REJECTED; 409 PHDBG_INFO("LIbNfc:Previous Callback is Pending"); 410 } 411 else if(FALSE == gpphLibContext->ndef_cntx.is_ndef) 412 { 413 RetVal = NFCSTATUS_NON_NDEF_COMPLIANT; 414 } 415 else if(psWr->length > gpphLibContext->ndef_cntx.NdefLength) 416 { 417 RetVal = NFCSTATUS_NOT_ENOUGH_MEMORY; 418 } 419 #ifdef LLCP_TRANSACT_CHANGES 420 else if ((LLCP_STATE_RESET_INIT != gpphLibContext->llcp_cntx.sLlcpContext.state) 421 && (LLCP_STATE_CHECKED != gpphLibContext->llcp_cntx.sLlcpContext.state)) 422 { 423 RetVal= NFCSTATUS_BUSY; 424 } 425 #endif /* #ifdef LLCP_TRANSACT_CHANGES */ 426 else 427 { 428 uint8_t cr_index = 0; 429 gpphLibContext->ndef_cntx.psUpperNdefMsg = psWr; 430 gpphLibContext->ndef_cntx.AppWrLength= psWr->length; 431 gpphLibContext->ndef_cntx.eLast_Call = NdefWr; 432 gpphLibContext->psRemoteDevList->psRemoteDevInfo->SessionOpened 433 = SESSION_OPEN; 434 if((((phHal_sRemoteDevInformation_t*)hRemoteDevice)->RemDevType == 435 phHal_eMifare_PICC) && (((phHal_sRemoteDevInformation_t*) 436 hRemoteDevice)->RemoteDevInfo.Iso14443A_Info.Sak != 0)&& 437 ((NULL == gpphLibContext->psBufferedAuth) 438 ||(phHal_eMifareAuthentA == 439 gpphLibContext->psBufferedAuth->cmd.MfCmd)) 440 ) 441 { 442 if(NULL != gpphLibContext->psBufferedAuth) 443 { 444 if(NULL != gpphLibContext->psBufferedAuth->sRecvData.buffer) 445 { 446 phOsalNfc_FreeMemory( 447 gpphLibContext->psBufferedAuth->sRecvData.buffer); 448 } 449 if(NULL != gpphLibContext->psBufferedAuth->sSendData.buffer) 450 { 451 phOsalNfc_FreeMemory( 452 gpphLibContext->psBufferedAuth->sSendData.buffer); 453 } 454 phOsalNfc_FreeMemory(gpphLibContext->psBufferedAuth); 455 } 456 gpphLibContext->psBufferedAuth 457 =(phLibNfc_sTransceiveInfo_t *) 458 phOsalNfc_GetMemory(sizeof(phLibNfc_sTransceiveInfo_t)); 459 gpphLibContext->psBufferedAuth->addr = 460 (uint8_t)gpphLibContext->ndef_cntx.psNdefMap 461 ->StdMifareContainer.currentBlock; 462 gpphLibContext->psBufferedAuth->cmd.MfCmd = phHal_eMifareRead16; 463 gpphLibContext->psBufferedAuth->sSendData.length 464 = 0; 465 gpphLibContext->psBufferedAuth->sRecvData.length 466 = MIFARE_STD_BLOCK_SIZE; 467 gpphLibContext->psBufferedAuth->sRecvData.buffer 468 = (uint8_t *)phOsalNfc_GetMemory(MIFARE_STD_BLOCK_SIZE); 469 gpphLibContext->psBufferedAuth->sSendData.buffer 470 = (uint8_t *)phOsalNfc_GetMemory(MIFARE_STD_BLOCK_SIZE); 471 } 472 if(eLibNfcHalStatePresenceChk == 473 gpphLibContext->LibNfcState.next_state) 474 { 475 gpphLibContext->CBInfo.pClientWrNdefCb = NULL; 476 RetVal = NFCSTATUS_PENDING; 477 } 478 else 479 { 480 for (cr_index = 0; cr_index < PH_FRINFC_NDEFMAP_CR; cr_index++) 481 { 482 /* Registering the Completion Routine.*/ 483 RetVal= phFriNfc_NdefMap_SetCompletionRoutine( 484 gpphLibContext->ndef_cntx.psNdefMap, 485 cr_index, 486 phLibNfc_Ndef_Write_Cb, 487 (void *)gpphLibContext); 488 489 } 490 if(0 == psWr->length) 491 { 492 /* Length of bytes to be written Zero- Erase the Tag */ 493 RetVal = phFriNfc_NdefMap_EraseNdef(gpphLibContext->ndef_cntx.psNdefMap); 494 } 495 else 496 { 497 /*Write from beginning or current location*/ 498 NdefWriteType = PH_FRINFC_NDEFMAP_SEEK_BEGIN; 499 /*Call FRI Ndef Write*/ 500 RetVal=phFriNfc_NdefMap_WrNdef(gpphLibContext->ndef_cntx.psNdefMap, 501 gpphLibContext->ndef_cntx.psUpperNdefMsg->buffer, 502 (uint32_t*)&gpphLibContext->ndef_cntx.psUpperNdefMsg->length, 503 NdefWriteType); 504 } 505 if(NFCSTATUS_PENDING == RetVal) 506 { 507 gpphLibContext->CBInfo.pClientWrNdefCb = pNdefWrite_RspCb; 508 gpphLibContext->CBInfo.pClientWrNdefCntx = pContext; 509 gpphLibContext->status.GenCb_pending_status=TRUE; 510 gpphLibContext->LibNfcState.next_state = eLibNfcHalStateTransaction; 511 } 512 else 513 { 514 RetVal = NFCSTATUS_FAILED; 515 } 516 } 517 } 518 return RetVal; 519 } 520 521 /* Response callback for phLibNfc_Ndef_Write */ 522 STATIC 523 void phLibNfc_Ndef_Write_Cb(void* Context,NFCSTATUS status) 524 { 525 526 pphLibNfc_RspCb_t pClientCb=NULL; 527 phLibNfc_LibContext_t *pLibNfc_Ctxt = (phLibNfc_LibContext_t *)Context; 528 void *pUpperLayerContext=NULL; 529 phHal_sRemoteDevInformation_t *ps_rem_dev_info = NULL; 530 531 if(pLibNfc_Ctxt != gpphLibContext) 532 { /*wrong context returned*/ 533 phOsalNfc_RaiseException(phOsalNfc_e_InternalErr,1); 534 } 535 else 536 { 537 if(eLibNfcHalStateShutdown == gpphLibContext->LibNfcState.next_state) 538 { /*shutdown called before completion of Ndef write allow 539 shutdown to happen */ 540 phLibNfc_Pending_Shutdown(); 541 status = NFCSTATUS_SHUTDOWN; 542 } 543 else if(eLibNfcHalStateRelease == gpphLibContext->LibNfcState.next_state) 544 { 545 status = NFCSTATUS_ABORTED; 546 } 547 else 548 { 549 gpphLibContext->status.GenCb_pending_status = FALSE; 550 if (gpphLibContext->psBufferedAuth != NULL && gpphLibContext->ndef_cntx.psNdefMap != NULL) { 551 gpphLibContext->psBufferedAuth->addr = (uint8_t) 552 gpphLibContext->ndef_cntx.psNdefMap->TLVStruct.NdefTLVBlock; 553 } 554 if(status == NFCSTATUS_FAILED ) 555 { 556 status = NFCSTATUS_FAILED; 557 gpphLibContext->LastTrancvSuccess = FALSE; 558 /*During Ndef write operation tag was not present in RF 559 field of reader*/ 560 ps_rem_dev_info = (phHal_sRemoteDevInformation_t *) 561 gpphLibContext->Connected_handle; 562 if ((phHal_eMifare_PICC == ps_rem_dev_info->RemDevType) && 563 (0x08 == (ps_rem_dev_info->RemoteDevInfo.Iso14443A_Info.Sak & 0x08))) 564 { 565 566 567 /* card type is mifare 1k/4k, then reconnect */ 568 status = phHal4Nfc_Connect(gpphLibContext->psHwReference, 569 ps_rem_dev_info, 570 (pphHal4Nfc_ConnectCallback_t) 571 phLibNfc_Reconnect_Mifare_Cb, 572 (void *)gpphLibContext); 573 } 574 } 575 else if( status== NFCSTATUS_SUCCESS) 576 { 577 gpphLibContext->LastTrancvSuccess = TRUE; 578 status = NFCSTATUS_SUCCESS; 579 if(gpphLibContext->ndef_cntx.AppWrLength > 580 gpphLibContext->ndef_cntx.NdefLength) 581 { 582 status = NFCSTATUS_NOT_ENOUGH_MEMORY; 583 } 584 else 585 { 586 pLibNfc_Ctxt->ndef_cntx.NdefActualSize = 587 pLibNfc_Ctxt->ndef_cntx.psUpperNdefMsg->length; 588 } 589 } 590 else 591 { 592 gpphLibContext->LastTrancvSuccess = FALSE; 593 status = NFCSTATUS_FAILED;; 594 } 595 } 596 phLibNfc_UpdateCurState(status,gpphLibContext); 597 598 pClientCb = gpphLibContext->CBInfo.pClientWrNdefCb; 599 pUpperLayerContext = gpphLibContext->CBInfo.pClientWrNdefCntx; 600 601 gpphLibContext->CBInfo.pClientWrNdefCb = NULL; 602 gpphLibContext->CBInfo.pClientWrNdefCntx = NULL; 603 if(NFCSTATUS_PENDING !=status) 604 { 605 if (NULL != pClientCb) 606 { 607 /*Notify to upper layer status and No. of bytes 608 actually written */ 609 pClientCb(pUpperLayerContext, status); 610 } 611 } 612 } 613 return; 614 } 615 616 617 /** 618 * Initialize structures needed for the Ndef 619 * related operation such as Check Ndef, read, write 620 * and Ndef foramt.only once allocation 621 */ 622 void phLibNfc_Ndef_Init(void) 623 { 624 if(gpphLibContext->psTransInfo==NULL) 625 { 626 /*Allocate memory for Transceiveinformation Structure*/ 627 gpphLibContext->psTransInfo = (phLibNfc_sTransceiveInfo_t *) 628 phOsalNfc_GetMemory(sizeof(phLibNfc_sTransceiveInfo_t)); 629 } 630 if(gpphLibContext->psTransInfo==NULL) 631 { 632 /*exception: Not enough memory*/ 633 phOsalNfc_RaiseException(phOsalNfc_e_NoMemory,1); 634 635 } 636 if(NULL == gpphLibContext->ndef_cntx.psNdefMap) 637 { 638 /*Allocate memory for NDEF Mapping Component Context Structure*/ 639 gpphLibContext->ndef_cntx.psNdefMap = (phFriNfc_NdefMap_t *) 640 phOsalNfc_GetMemory(sizeof(phFriNfc_NdefMap_t)); 641 } 642 if(NULL != gpphLibContext->ndef_cntx.psNdefMap) 643 { 644 /*Allocation successful*/ 645 (void)memset(gpphLibContext->ndef_cntx.psNdefMap,0,sizeof(phFriNfc_NdefMap_t)); 646 gpphLibContext->ndef_cntx.NdefSendRecvLen = NDEF_SENDRCV_BUF_LEN; 647 gpphLibContext->ndef_cntx.psNdefMap->SendRecvBuf = 648 (uint8_t*) phOsalNfc_GetMemory(gpphLibContext-> 649 ndef_cntx.NdefSendRecvLen); 650 651 if(NULL != gpphLibContext->ndef_cntx.psNdefMap->SendRecvBuf) 652 { 653 (void)memset(gpphLibContext->ndef_cntx.psNdefMap->SendRecvBuf, 654 0, 655 gpphLibContext->ndef_cntx.NdefSendRecvLen); 656 657 gpphLibContext->psOverHalCtxt =(phFriNfc_OvrHal_t *) 658 phOsalNfc_GetMemory(sizeof(phFriNfc_OvrHal_t)); 659 } 660 } 661 if(NULL == gpphLibContext->psOverHalCtxt) 662 { /*exception: Not enough memory*/ 663 phOsalNfc_RaiseException(phOsalNfc_e_NoMemory,1); 664 } 665 else 666 { 667 668 (void)memset(gpphLibContext->psOverHalCtxt,0, 669 sizeof(phFriNfc_OvrHal_t)); 670 671 /* Initialize the Overlapped hal structure*/ 672 gpphLibContext->psOverHalCtxt->psHwReference = 673 gpphLibContext->psHwReference; 674 if(NULL == gpphLibContext->psDevInputParam ) 675 { 676 gpphLibContext->psDevInputParam = (phHal_sDevInputParam_t *) 677 phOsalNfc_GetMemory(sizeof(phHal_sDevInputParam_t)); 678 } 679 gpphLibContext->ndef_cntx.is_ndef = CHK_NDEF_NOT_DONE; 680 } 681 if(NULL == gpphLibContext->ndef_cntx.ndef_fmt) 682 { 683 /*Allocate memory for Ndef format structure*/ 684 gpphLibContext->ndef_cntx.ndef_fmt = (phFriNfc_sNdefSmtCrdFmt_t *) 685 phOsalNfc_GetMemory(sizeof(phFriNfc_sNdefSmtCrdFmt_t)); 686 } 687 if(NULL != gpphLibContext->ndef_cntx.ndef_fmt) 688 { 689 (void)memset(gpphLibContext->ndef_cntx.ndef_fmt, 690 0, 691 sizeof(phFriNfc_sNdefSmtCrdFmt_t)); 692 } 693 else 694 { 695 /*exception: Not enough memory*/ 696 phOsalNfc_RaiseException(phOsalNfc_e_NoMemory,1); 697 } 698 return; 699 } 700 /** 701 * Free the allocated memory used for Ndef operations 702 */ 703 void phLibNfc_Ndef_DeInit(void) 704 { 705 /* If only allocated then only free the memory*/ 706 if(gpphLibContext->ndef_cntx.psNdefMap !=NULL) 707 { 708 if(gpphLibContext->ndef_cntx.psNdefMap->SendRecvBuf !=NULL) 709 { 710 phOsalNfc_FreeMemory(gpphLibContext->ndef_cntx.psNdefMap->SendRecvBuf); 711 gpphLibContext->ndef_cntx.psNdefMap->SendRecvBuf=NULL; 712 } 713 phOsalNfc_FreeMemory(gpphLibContext->ndef_cntx.psNdefMap); 714 gpphLibContext->ndef_cntx.psNdefMap =NULL; 715 } 716 717 if(NULL != gpphLibContext->ndef_cntx.ndef_fmt) 718 { 719 phOsalNfc_FreeMemory(gpphLibContext->ndef_cntx.ndef_fmt); 720 gpphLibContext->ndef_cntx.ndef_fmt = NULL; 721 } 722 723 if(gpphLibContext->psOverHalCtxt !=NULL) 724 { 725 phOsalNfc_FreeMemory(gpphLibContext->psOverHalCtxt); 726 gpphLibContext->psOverHalCtxt =NULL; 727 } 728 if(gpphLibContext->psDevInputParam !=NULL) 729 { 730 phOsalNfc_FreeMemory(gpphLibContext->psDevInputParam); 731 gpphLibContext->psDevInputParam = NULL; 732 } 733 if(gpphLibContext->psTransInfo!=NULL) 734 { 735 phOsalNfc_FreeMemory(gpphLibContext->psTransInfo); 736 gpphLibContext->psTransInfo= NULL; 737 } 738 } 739 740 741 /** 742 * This function allows the user to check whether a particular Remote Device 743 * is NDEF compliant or not 744 */ 745 NFCSTATUS phLibNfc_Ndef_CheckNdef(phLibNfc_Handle hRemoteDevice, 746 pphLibNfc_ChkNdefRspCb_t pCheckNdef_RspCb, 747 void* pContext) 748 { 749 NFCSTATUS RetVal = NFCSTATUS_FAILED; 750 751 752 if((NULL == gpphLibContext)|| 753 (gpphLibContext->LibNfcState.cur_state == eLibNfcHalStateShutdown)) 754 { 755 /*Lib Nfc not initialized*/ 756 RetVal = NFCSTATUS_NOT_INITIALISED; 757 } 758 else if((NULL == pCheckNdef_RspCb)|| 759 (NULL==pContext)|| 760 (hRemoteDevice == 0)) 761 { 762 /*parameter sent by upper layer are not valid */ 763 RetVal= NFCSTATUS_INVALID_PARAMETER; 764 } 765 else if(gpphLibContext->LibNfcState.next_state == eLibNfcHalStateShutdown) 766 { 767 RetVal = NFCSTATUS_SHUTDOWN; 768 } 769 else if(0 == gpphLibContext->Connected_handle) 770 { 771 RetVal=NFCSTATUS_TARGET_NOT_CONNECTED; 772 } 773 else if(hRemoteDevice != gpphLibContext->Connected_handle) 774 { 775 RetVal=NFCSTATUS_INVALID_HANDLE; 776 } 777 #ifdef LLCP_TRANSACT_CHANGES 778 else if ((LLCP_STATE_RESET_INIT != gpphLibContext->llcp_cntx.sLlcpContext.state) 779 && (LLCP_STATE_CHECKED != gpphLibContext->llcp_cntx.sLlcpContext.state)) 780 { 781 RetVal= NFCSTATUS_BUSY; 782 } 783 #endif /* #ifdef LLCP_TRANSACT_CHANGES */ 784 else 785 { 786 uint8_t cr_index = 0; 787 static uint16_t data_cnt = 0; 788 /* Allocate memory for the ndef related structure */ 789 gpphLibContext->ndef_cntx.NdefSendRecvLen=300; 790 gpphLibContext->ndef_cntx.eLast_Call = ChkNdef; 791 792 /* Resets the component instance */ 793 RetVal = phFriNfc_NdefMap_Reset( gpphLibContext->ndef_cntx.psNdefMap, 794 gpphLibContext->psOverHalCtxt, 795 (phLibNfc_sRemoteDevInformation_t*)hRemoteDevice, 796 gpphLibContext->psDevInputParam, 797 gpphLibContext->ndef_cntx.psNdefMap->SendRecvBuf, 798 gpphLibContext->ndef_cntx.NdefSendRecvLen, 799 gpphLibContext->ndef_cntx.psNdefMap->SendRecvBuf, 800 &(gpphLibContext->ndef_cntx.NdefSendRecvLen), 801 &(data_cnt)); 802 803 804 for (cr_index = 0; cr_index < PH_FRINFC_NDEFMAP_CR; cr_index++) 805 { 806 /* Register the callback for the check ndef */ 807 RetVal = phFriNfc_NdefMap_SetCompletionRoutine( 808 gpphLibContext->ndef_cntx.psNdefMap, 809 cr_index, 810 phLibNfc_Ndef_CheckNdef_Cb, 811 (void *)gpphLibContext); 812 } 813 /*call below layer check Ndef function*/ 814 RetVal = phFriNfc_NdefMap_ChkNdef(gpphLibContext->ndef_cntx.psNdefMap); 815 RetVal =PHNFCSTATUS(RetVal); 816 817 if(RetVal== NFCSTATUS_PENDING) 818 { 819 RetVal = NFCSTATUS_PENDING; 820 } 821 else if((RetVal == NFCSTATUS_FAILED) || (RetVal ==(PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 822 NFCSTATUS_INVALID_REMOTE_DEVICE)))) 823 { 824 RetVal= NFCSTATUS_FAILED; 825 } 826 else 827 { 828 if((0x00 == gpphLibContext->ndef_cntx.Chk_Ndef_Timer_Id)|| 829 (PH_OSALNFC_INVALID_TIMER_ID == gpphLibContext->ndef_cntx.Chk_Ndef_Timer_Id)) 830 { 831 gpphLibContext->ndef_cntx.Chk_Ndef_Timer_Id = 832 phOsalNfc_Timer_Create(); 833 } 834 if((0x00 == gpphLibContext->ndef_cntx.Chk_Ndef_Timer_Id)|| 835 (PH_OSALNFC_INVALID_TIMER_ID == gpphLibContext->ndef_cntx.Chk_Ndef_Timer_Id)) 836 { 837 RetVal = NFCSTATUS_FAILED; 838 } 839 else 840 { 841 phOsalNfc_Timer_Start(gpphLibContext->ndef_cntx.Chk_Ndef_Timer_Id, 842 CHK_NDEF_TIMER_TIMEOUT,CheckNdef_timer_cb,NULL); 843 RetVal = NFCSTATUS_PENDING; 844 } 845 } 846 if(RetVal== NFCSTATUS_PENDING) 847 { 848 gpphLibContext->CBInfo.pClientCkNdefCb = pCheckNdef_RspCb; 849 gpphLibContext->CBInfo.pClientCkNdefCntx = pContext; 850 gpphLibContext->status.GenCb_pending_status=TRUE; 851 gpphLibContext->LibNfcState.next_state = eLibNfcHalStateTransaction; 852 } 853 854 } 855 return RetVal; 856 } 857 858 /* Response callback for phLibNfc_Ndef_CheckNdef */ 859 STATIC 860 void phLibNfc_Ndef_CheckNdef_Cb(void *pContext,NFCSTATUS status) 861 { 862 phLibNfc_ChkNdef_Info_t Ndef_Info; 863 NFCSTATUS RetStatus = NFCSTATUS_SUCCESS; 864 pphLibNfc_ChkNdefRspCb_t pClientCb=NULL; 865 phLibNfc_LibContext_t *pLibNfc_Ctxt = 866 (phLibNfc_LibContext_t *)pContext; 867 void *pUpperLayerContext=NULL; 868 phHal_sRemoteDevInformation_t *ps_rem_dev_info = NULL; 869 870 Ndef_Info.ActualNdefMsgLength = 0; 871 Ndef_Info.MaxNdefMsgLength = 0; 872 Ndef_Info.NdefCardState = PHLIBNFC_NDEF_CARD_INVALID; 873 if(pLibNfc_Ctxt != gpphLibContext) 874 { /*wrong context returned from below layer*/ 875 phOsalNfc_RaiseException(phOsalNfc_e_InternalErr,1); 876 } 877 else 878 { 879 ps_rem_dev_info = (phHal_sRemoteDevInformation_t *) 880 gpphLibContext->Connected_handle; 881 if(eLibNfcHalStateShutdown == gpphLibContext->LibNfcState.next_state) 882 { /*shutdown called before completion of check Ndef, allow 883 shutdown to happen */ 884 phLibNfc_Pending_Shutdown(); 885 RetStatus = NFCSTATUS_SHUTDOWN; 886 } 887 else if(eLibNfcHalStateRelease == gpphLibContext->LibNfcState.next_state) 888 { 889 RetStatus = NFCSTATUS_ABORTED; 890 } 891 else 892 { 893 if(status == NFCSTATUS_SUCCESS) 894 { 895 /*Tag is Ndef tag*/ 896 gpphLibContext->ndef_cntx.is_ndef = TRUE; 897 (void)phFriNfc_NdefMap_GetContainerSize( 898 pLibNfc_Ctxt->ndef_cntx.psNdefMap, 899 &(pLibNfc_Ctxt->ndef_cntx.NdefLength), 900 &(pLibNfc_Ctxt->ndef_cntx.NdefActualSize)); 901 /*Get the data size support by particular ndef card */ 902 Ndef_Info.ActualNdefMsgLength = pLibNfc_Ctxt->ndef_cntx.NdefActualSize; 903 Ndef_Info.MaxNdefMsgLength = pLibNfc_Ctxt->ndef_cntx.NdefLength; 904 gpphLibContext->LastTrancvSuccess = TRUE; 905 RetStatus =NFCSTATUS_SUCCESS; 906 } 907 else if (PHNFCSTATUS(status) != NFCSTATUS_MORE_INFORMATION ) 908 { 909 /*Ndef check Failed.Issue a PresenceChk to ascertain if tag is 910 still in the field*/ 911 RetStatus = phHal4Nfc_PresenceCheck( 912 gpphLibContext->psHwReference, 913 phLibNfc_Ndef_ChkNdef_Pchk_Cb, 914 (void *)gpphLibContext 915 ); 916 } 917 else 918 { 919 RetStatus = NFCSTATUS_FAILED; 920 gpphLibContext->LastTrancvSuccess = FALSE; 921 gpphLibContext->ndef_cntx.is_ndef = FALSE; 922 923 if ((phHal_eMifare_PICC == ps_rem_dev_info->RemDevType) && 924 (0x08 == (ps_rem_dev_info->RemoteDevInfo.Iso14443A_Info.Sak & 0x08))) 925 { 926 927 /* card type is mifare 1k/4k, then reconnect */ 928 RetStatus = phHal4Nfc_Connect(gpphLibContext->psHwReference, 929 ps_rem_dev_info, 930 (pphHal4Nfc_ConnectCallback_t) 931 phLibNfc_Reconnect_Mifare_Cb, 932 (void *)gpphLibContext); 933 } 934 else 935 { 936 if((phHal_eJewel_PICC == ps_rem_dev_info->RemDevType) 937 &&(TOPAZ_NDEF_BITMASK & 938 ps_rem_dev_info->RemoteDevInfo.Jewel_Info.HeaderRom0)) 939 { 940 gpphLibContext->ndef_cntx.is_ndef = TRUE; 941 RetStatus = phFriNfc_NdefMap_GetContainerSize( 942 pLibNfc_Ctxt->ndef_cntx.psNdefMap, 943 &(pLibNfc_Ctxt->ndef_cntx.NdefLength), 944 &(pLibNfc_Ctxt->ndef_cntx.NdefActualSize)); 945 /*Get the data size support by particular ndef card */ 946 Ndef_Info.ActualNdefMsgLength = 947 pLibNfc_Ctxt->ndef_cntx.NdefActualSize; 948 Ndef_Info.MaxNdefMsgLength 949 = pLibNfc_Ctxt->ndef_cntx.NdefLength 950 = (TOPAZ_LEN_BITMASK & 951 ps_rem_dev_info->RemoteDevInfo.Jewel_Info.HeaderRom0? 952 TOPAZ_DYNAMIC_LEN:TOPAZ_STATIC_CARD_LEN); 953 RetStatus = NFCSTATUS_SUCCESS; 954 } 955 } 956 } 957 gpphLibContext->LibNfcState.cur_state=eLibNfcHalStateConnect; 958 } 959 gpphLibContext->status.GenCb_pending_status = FALSE; 960 /* Update the current state */ 961 phLibNfc_UpdateCurState(RetStatus,gpphLibContext); 962 if(NFCSTATUS_PENDING != RetStatus) 963 { 964 if(((ps_rem_dev_info->RemDevType == phHal_eMifare_PICC) 965 && (ps_rem_dev_info->RemoteDevInfo.Iso14443A_Info.Sak != 0)&& 966 ((NULL == gpphLibContext->psBufferedAuth) 967 ||(phHal_eMifareAuthentA == gpphLibContext->psBufferedAuth->cmd.MfCmd))) 968 ) 969 { 970 if(NULL != gpphLibContext->psBufferedAuth) 971 { 972 if(NULL != gpphLibContext->psBufferedAuth->sRecvData.buffer) 973 { 974 phOsalNfc_FreeMemory( 975 gpphLibContext->psBufferedAuth->sRecvData.buffer); 976 } 977 if(NULL != gpphLibContext->psBufferedAuth->sSendData.buffer) 978 { 979 phOsalNfc_FreeMemory( 980 gpphLibContext->psBufferedAuth->sSendData.buffer); 981 } 982 phOsalNfc_FreeMemory(gpphLibContext->psBufferedAuth); 983 } 984 gpphLibContext->psBufferedAuth 985 =(phLibNfc_sTransceiveInfo_t *) 986 phOsalNfc_GetMemory(sizeof(phLibNfc_sTransceiveInfo_t)); 987 gpphLibContext->psBufferedAuth->addr = 988 (uint8_t)gpphLibContext->ndef_cntx.psNdefMap 989 ->StdMifareContainer.currentBlock; 990 gpphLibContext->psBufferedAuth->cmd.MfCmd = phHal_eMifareRead16; 991 gpphLibContext->psBufferedAuth->sSendData.length 992 = 0; 993 gpphLibContext->psBufferedAuth->sRecvData.length 994 = MIFARE_STD_BLOCK_SIZE; 995 gpphLibContext->psBufferedAuth->sRecvData.buffer 996 = (uint8_t *)phOsalNfc_GetMemory(MIFARE_STD_BLOCK_SIZE); 997 gpphLibContext->psBufferedAuth->sSendData.buffer 998 = (uint8_t *)phOsalNfc_GetMemory(MIFARE_STD_BLOCK_SIZE); 999 } 1000 pClientCb = gpphLibContext->CBInfo.pClientCkNdefCb; 1001 pUpperLayerContext = gpphLibContext->CBInfo.pClientCkNdefCntx; 1002 gpphLibContext->CBInfo.pClientCkNdefCb = NULL; 1003 gpphLibContext->CBInfo.pClientCkNdefCntx = NULL; 1004 if(NULL != pClientCb) 1005 { 1006 if (!RetStatus) 1007 { 1008 switch (pLibNfc_Ctxt->ndef_cntx.psNdefMap->CardState) 1009 { 1010 case PH_NDEFMAP_CARD_STATE_INITIALIZED: 1011 { 1012 Ndef_Info.NdefCardState = 1013 PHLIBNFC_NDEF_CARD_INITIALISED; 1014 break; 1015 } 1016 1017 case PH_NDEFMAP_CARD_STATE_READ_ONLY: 1018 { 1019 Ndef_Info.NdefCardState = 1020 PHLIBNFC_NDEF_CARD_READ_ONLY; 1021 break; 1022 } 1023 1024 case PH_NDEFMAP_CARD_STATE_READ_WRITE: 1025 { 1026 Ndef_Info.NdefCardState = 1027 PHLIBNFC_NDEF_CARD_READ_WRITE; 1028 break; 1029 } 1030 1031 default: 1032 { 1033 Ndef_Info.NdefCardState = 1034 PHLIBNFC_NDEF_CARD_INVALID; 1035 break; 1036 } 1037 } 1038 } 1039 /* call the upper check ndef callback */ 1040 pClientCb(pUpperLayerContext,Ndef_Info,RetStatus); 1041 } 1042 } 1043 } 1044 return; 1045 } 1046 1047 /*Callback for Presence check call from Chk Ndef*/ 1048 STATIC void phLibNfc_Ndef_ChkNdef_Pchk_Cb(void *pContext, 1049 NFCSTATUS status 1050 ) 1051 { 1052 phLibNfc_ChkNdef_Info_t Ndef_Info = {0,0,0}; 1053 NFCSTATUS RetStatus = NFCSTATUS_SUCCESS; 1054 pphLibNfc_ChkNdefRspCb_t pClientCb=NULL; 1055 phLibNfc_LibContext_t *pLibNfc_Ctxt = 1056 (phLibNfc_LibContext_t *)pContext; 1057 void *pUpperLayerContext=NULL; 1058 phHal_sRemoteDevInformation_t *ps_rem_dev_info = NULL; 1059 if(NFCSTATUS_SUCCESS == status) 1060 { 1061 RetStatus = NFCSTATUS_FAILED; 1062 gpphLibContext->ndef_cntx.is_ndef = FALSE; 1063 } 1064 else 1065 { 1066 RetStatus = NFCSTATUS_TARGET_LOST; 1067 } 1068 if(pLibNfc_Ctxt != gpphLibContext) 1069 { /*wrong context returned from below layer*/ 1070 phOsalNfc_RaiseException(phOsalNfc_e_InternalErr,1); 1071 } 1072 else 1073 { 1074 ps_rem_dev_info = (phHal_sRemoteDevInformation_t *) 1075 gpphLibContext->Connected_handle; 1076 if(((ps_rem_dev_info->RemDevType == phHal_eMifare_PICC) 1077 && (ps_rem_dev_info->RemoteDevInfo.Iso14443A_Info.Sak != 0)&& 1078 ((NULL == gpphLibContext->psBufferedAuth) 1079 ||(phHal_eMifareAuthentA == gpphLibContext->psBufferedAuth->cmd.MfCmd))) 1080 ) 1081 { 1082 if(NULL != gpphLibContext->psBufferedAuth) 1083 { 1084 if(NULL != gpphLibContext->psBufferedAuth->sRecvData.buffer) 1085 { 1086 phOsalNfc_FreeMemory( 1087 gpphLibContext->psBufferedAuth->sRecvData.buffer); 1088 } 1089 if(NULL != gpphLibContext->psBufferedAuth->sSendData.buffer) 1090 { 1091 phOsalNfc_FreeMemory( 1092 gpphLibContext->psBufferedAuth->sSendData.buffer); 1093 } 1094 phOsalNfc_FreeMemory(gpphLibContext->psBufferedAuth); 1095 } 1096 gpphLibContext->psBufferedAuth 1097 =(phLibNfc_sTransceiveInfo_t *) 1098 phOsalNfc_GetMemory(sizeof(phLibNfc_sTransceiveInfo_t)); 1099 gpphLibContext->psBufferedAuth->addr = 1100 (uint8_t)gpphLibContext->ndef_cntx.psNdefMap 1101 ->StdMifareContainer.currentBlock; 1102 gpphLibContext->psBufferedAuth->cmd.MfCmd = phHal_eMifareRead16; 1103 gpphLibContext->psBufferedAuth->sSendData.length 1104 = 0; 1105 gpphLibContext->psBufferedAuth->sRecvData.length 1106 = MIFARE_STD_BLOCK_SIZE; 1107 gpphLibContext->psBufferedAuth->sRecvData.buffer 1108 = (uint8_t *)phOsalNfc_GetMemory(MIFARE_STD_BLOCK_SIZE); 1109 gpphLibContext->psBufferedAuth->sSendData.buffer 1110 = (uint8_t *)phOsalNfc_GetMemory(MIFARE_STD_BLOCK_SIZE); 1111 } 1112 pClientCb = gpphLibContext->CBInfo.pClientCkNdefCb; 1113 pUpperLayerContext = gpphLibContext->CBInfo.pClientCkNdefCntx; 1114 gpphLibContext->CBInfo.pClientCkNdefCb = NULL; 1115 gpphLibContext->CBInfo.pClientCkNdefCntx = NULL; 1116 if(NULL != pClientCb) 1117 { 1118 Ndef_Info.NdefCardState = PHLIBNFC_NDEF_CARD_INVALID; 1119 /* call the upper check ndef callback */ 1120 pClientCb(pUpperLayerContext,Ndef_Info,RetStatus); 1121 } 1122 } 1123 return; 1124 } 1125 /* Check Ndef Timer Callback*/ 1126 STATIC void CheckNdef_timer_cb(uint32_t timer_id, void *pContext) 1127 { 1128 PHNFC_UNUSED_VARIABLE(pContext); 1129 phOsalNfc_Timer_Stop(timer_id); 1130 phOsalNfc_Timer_Delete(gpphLibContext->ndef_cntx.Chk_Ndef_Timer_Id); 1131 gpphLibContext->ndef_cntx.Chk_Ndef_Timer_Id = 0x00; 1132 phLibNfc_Ndef_CheckNdef_Cb((void *)gpphLibContext,NFCSTATUS_MORE_INFORMATION); 1133 } 1134 1135 void phLibNfc_Reconnect_Mifare_Cb ( 1136 void *pContext, 1137 phHal_sRemoteDevInformation_t *psRemoteDevInfo, 1138 NFCSTATUS status) 1139 { 1140 phLibNfc_ChkNdef_Info_t Ndef_Info; 1141 phLibNfc_LibContext_t *pLibNfc_Ctxt = 1142 (phLibNfc_LibContext_t *)pContext; 1143 void *pUpperLayerContext = NULL; 1144 switch(gpphLibContext->ndef_cntx.eLast_Call) 1145 { 1146 case ChkNdef: 1147 { 1148 pphLibNfc_ChkNdefRspCb_t pClientCb=NULL; 1149 pClientCb = pLibNfc_Ctxt->CBInfo.pClientCkNdefCb; 1150 pUpperLayerContext = pLibNfc_Ctxt->CBInfo.pClientCkNdefCntx; 1151 pLibNfc_Ctxt->CBInfo.pClientCkNdefCb = NULL; 1152 pLibNfc_Ctxt->CBInfo.pClientCkNdefCntx = NULL; 1153 if (NULL != pClientCb) 1154 { 1155 status = (NFCSTATUS_SUCCESS == status? 1156 NFCSTATUS_FAILED:NFCSTATUS_TARGET_LOST); 1157 Ndef_Info.ActualNdefMsgLength = 0; 1158 Ndef_Info.MaxNdefMsgLength = 0; 1159 /* call the upper check ndef callback */ 1160 pClientCb(pUpperLayerContext,Ndef_Info,status); 1161 } 1162 } 1163 break; 1164 case NdefRd: 1165 { 1166 pphLibNfc_RspCb_t pClientCb = pLibNfc_Ctxt->CBInfo.pClientRdNdefCb; 1167 pUpperLayerContext = pLibNfc_Ctxt->CBInfo.pClientRdNdefCntx; 1168 pLibNfc_Ctxt->CBInfo.pClientRdNdefCb = NULL; 1169 pLibNfc_Ctxt->CBInfo.pClientRdNdefCntx = NULL; 1170 if (NULL != pClientCb) 1171 { 1172 status = (NFCSTATUS_SUCCESS == status? 1173 NFCSTATUS_FAILED:NFCSTATUS_TARGET_LOST); 1174 /* call the upper ndef read callback */ 1175 pClientCb(pUpperLayerContext,status); 1176 } 1177 } 1178 break; 1179 case NdefWr: 1180 { 1181 pphLibNfc_RspCb_t pClientCb = pLibNfc_Ctxt->CBInfo.pClientWrNdefCb; 1182 pUpperLayerContext = pLibNfc_Ctxt->CBInfo.pClientWrNdefCntx; 1183 pLibNfc_Ctxt->CBInfo.pClientWrNdefCb = NULL; 1184 pLibNfc_Ctxt->CBInfo.pClientWrNdefCntx = NULL; 1185 if (NULL != pClientCb) 1186 { 1187 status = (NFCSTATUS_SUCCESS == status? 1188 NFCSTATUS_FAILED:NFCSTATUS_TARGET_LOST); 1189 /* call the upper ndef write callback */ 1190 pClientCb(pUpperLayerContext,status); 1191 } 1192 } 1193 break; 1194 case NdefFmt: 1195 #ifdef LIBNFC_READONLY_NDEF 1196 case NdefReadOnly: 1197 #endif /* #ifdef LIBNFC_READONLY_NDEF */ 1198 { 1199 pphLibNfc_RspCb_t pClientCb = 1200 pLibNfc_Ctxt->ndef_cntx.pClientNdefFmtCb; 1201 pUpperLayerContext= pLibNfc_Ctxt->ndef_cntx.pClientNdefFmtCntx; 1202 pLibNfc_Ctxt->ndef_cntx.pClientNdefFmtCb = NULL; 1203 pLibNfc_Ctxt->ndef_cntx.pClientNdefFmtCntx = NULL; 1204 if (NULL != pClientCb) 1205 { 1206 status = (NFCSTATUS_SUCCESS == status? 1207 NFCSTATUS_FAILED:NFCSTATUS_TARGET_LOST); 1208 /* call the upper ndef format callback */ 1209 pClientCb(pUpperLayerContext,status); 1210 } 1211 } 1212 break; 1213 case RawTrans: 1214 { 1215 phNfc_sData_t trans_resp; 1216 pphLibNfc_TransceiveCallback_t pClientCb = 1217 pLibNfc_Ctxt->CBInfo.pClientTransceiveCb; 1218 trans_resp.length = 0; 1219 pUpperLayerContext = pLibNfc_Ctxt->CBInfo.pClientTranseCntx; 1220 pLibNfc_Ctxt->CBInfo.pClientTranseCntx= NULL; 1221 pLibNfc_Ctxt->CBInfo.pClientTransceiveCb= NULL; 1222 if (NULL != pClientCb) 1223 { 1224 status = (NFCSTATUS_SUCCESS == status? 1225 NFCSTATUS_FAILED:NFCSTATUS_TARGET_LOST); 1226 /* call the upper transceive callback */ 1227 pClientCb(pUpperLayerContext, 1228 (uint32_t)psRemoteDevInfo, 1229 & trans_resp, 1230 status); 1231 } 1232 } 1233 break; 1234 default: 1235 { 1236 } 1237 break; 1238 } 1239 1240 } 1241 /** 1242 * Target format to make it NDEF compliant 1243 */ 1244 NFCSTATUS phLibNfc_RemoteDev_FormatNdef(phLibNfc_Handle hRemoteDevice, 1245 phNfc_sData_t* pScrtKey, 1246 pphLibNfc_RspCb_t pNdefformat_RspCb, 1247 void* pContext 1248 ) 1249 { 1250 NFCSTATUS RetVal = NFCSTATUS_FAILED; 1251 1252 static uint8_t mif_std_key[6] ={0}, 1253 Index = 0; 1254 if((NULL == gpphLibContext) 1255 ||(gpphLibContext->LibNfcState.cur_state 1256 == eLibNfcHalStateShutdown)) 1257 { 1258 /*Lib Nfc not initialized*/ 1259 RetVal = NFCSTATUS_NOT_INITIALISED; 1260 } 1261 else if((NULL == pContext) 1262 || (NULL == pNdefformat_RspCb) 1263 ||(NULL == pScrtKey) 1264 ||(0 == hRemoteDevice)) 1265 { 1266 RetVal= NFCSTATUS_INVALID_PARAMETER; 1267 } 1268 else if(gpphLibContext->LibNfcState.next_state 1269 == eLibNfcHalStateShutdown) 1270 { 1271 RetVal= NFCSTATUS_SHUTDOWN; 1272 } 1273 else if(0 == gpphLibContext->Connected_handle) 1274 { 1275 RetVal=NFCSTATUS_TARGET_NOT_CONNECTED; 1276 } 1277 else if(hRemoteDevice != gpphLibContext->Connected_handle) 1278 { 1279 RetVal=NFCSTATUS_INVALID_HANDLE; 1280 } 1281 else if((TRUE == gpphLibContext->status.GenCb_pending_status)|| 1282 (NULL != gpphLibContext->ndef_cntx.pClientNdefFmtCb) 1283 ||(gpphLibContext->ndef_cntx.is_ndef == TRUE)) 1284 { 1285 /*Previous Callback is Pending*/ 1286 RetVal = NFCSTATUS_REJECTED; 1287 PHDBG_INFO("LIbNfc:Previous Callback is Pending"); 1288 } 1289 #ifdef LLCP_TRANSACT_CHANGES 1290 else if ((LLCP_STATE_RESET_INIT != gpphLibContext->llcp_cntx.sLlcpContext.state) 1291 && (LLCP_STATE_CHECKED != gpphLibContext->llcp_cntx.sLlcpContext.state)) 1292 { 1293 RetVal= NFCSTATUS_BUSY; 1294 } 1295 #endif /* #ifdef LLCP_TRANSACT_CHANGES */ 1296 else 1297 { 1298 uint8_t fun_id; 1299 gpphLibContext->ndef_cntx.eLast_Call = NdefFmt; 1300 gpphLibContext->ndef_cntx.NdefSendRecvLen = NDEF_SENDRCV_BUF_LEN; 1301 1302 /* Call ndef format reset, this will initialize the ndef 1303 format structure, and appropriate values are filled */ 1304 RetVal = phFriNfc_NdefSmtCrd_Reset(gpphLibContext->ndef_cntx.ndef_fmt, 1305 gpphLibContext->psOverHalCtxt, 1306 (phHal_sRemoteDevInformation_t*)hRemoteDevice, 1307 gpphLibContext->psDevInputParam, 1308 gpphLibContext->ndef_cntx.psNdefMap->SendRecvBuf, 1309 &(gpphLibContext->ndef_cntx.NdefSendRecvLen)); 1310 for(fun_id = 0; fun_id < PH_FRINFC_SMTCRDFMT_CR; fun_id++) 1311 { 1312 /* Register for all the callbacks */ 1313 RetVal = phFriNfc_NdefSmtCrd_SetCR(gpphLibContext->ndef_cntx.ndef_fmt, 1314 fun_id, 1315 phLibNfc_Ndef_format_Cb, 1316 gpphLibContext); 1317 } 1318 /* mif_std_key is required to format the mifare 1k/4k card */ 1319 for (Index =0 ;Index < (pScrtKey->length); Index++ ) 1320 { 1321 mif_std_key[Index] = *(pScrtKey->buffer++); 1322 } 1323 /* Start smart card formatting function */ 1324 RetVal = phFriNfc_NdefSmtCrd_Format(gpphLibContext->ndef_cntx.ndef_fmt, 1325 mif_std_key); 1326 RetVal = PHNFCSTATUS(RetVal); 1327 if(RetVal== NFCSTATUS_PENDING) 1328 { 1329 gpphLibContext->ndef_cntx.pClientNdefFmtCb = pNdefformat_RspCb; 1330 gpphLibContext->ndef_cntx.pClientNdefFmtCntx = pContext; 1331 gpphLibContext->status.GenCb_pending_status=TRUE; 1332 gpphLibContext->LibNfcState.next_state = eLibNfcHalStateTransaction; 1333 } 1334 else 1335 { 1336 RetVal = NFCSTATUS_FAILED; 1337 } 1338 } 1339 return RetVal; 1340 } 1341 1342 #ifdef LIBNFC_READONLY_NDEF 1343 1344 NFCSTATUS 1345 phLibNfc_ConvertToReadOnlyNdef ( 1346 phLibNfc_Handle hRemoteDevice, 1347 pphLibNfc_RspCb_t pNdefReadOnly_RspCb, 1348 void* pContext 1349 ) 1350 { 1351 NFCSTATUS ret_val = NFCSTATUS_FAILED; 1352 1353 if ((NULL == gpphLibContext) 1354 || (gpphLibContext->LibNfcState.cur_state 1355 == eLibNfcHalStateShutdown)) 1356 { 1357 /* LibNfc not initialized */ 1358 ret_val = NFCSTATUS_NOT_INITIALISED; 1359 } 1360 else if ((NULL == pContext) 1361 || (NULL == pNdefReadOnly_RspCb) 1362 || (0 == hRemoteDevice)) 1363 { 1364 ret_val = NFCSTATUS_INVALID_PARAMETER; 1365 } 1366 else if (gpphLibContext->LibNfcState.next_state 1367 == eLibNfcHalStateShutdown) 1368 { 1369 ret_val = NFCSTATUS_SHUTDOWN; 1370 } 1371 else if (0 == gpphLibContext->Connected_handle) 1372 { 1373 ret_val = NFCSTATUS_TARGET_NOT_CONNECTED; 1374 } 1375 else if (hRemoteDevice != gpphLibContext->Connected_handle) 1376 { 1377 ret_val = NFCSTATUS_INVALID_HANDLE; 1378 } 1379 else if ((TRUE == gpphLibContext->status.GenCb_pending_status) 1380 || (NULL != gpphLibContext->ndef_cntx.pClientNdefFmtCb) 1381 || (FALSE == gpphLibContext->ndef_cntx.is_ndef)) 1382 { 1383 /* Previous Callback is Pending */ 1384 ret_val = NFCSTATUS_REJECTED; 1385 PHDBG_INFO("LIbNfc:Previous Callback is Pending"); 1386 } 1387 else if (PH_NDEFMAP_CARD_STATE_READ_WRITE != 1388 gpphLibContext->ndef_cntx.psNdefMap->CardState) 1389 { 1390 /* Tag is in different state */ 1391 ret_val = NFCSTATUS_REJECTED; 1392 } 1393 else 1394 { 1395 gpphLibContext->ndef_cntx.eLast_Call = NdefReadOnly; 1396 1397 if(eLibNfcHalStatePresenceChk != gpphLibContext->LibNfcState.next_state) 1398 { 1399 phHal_sRemoteDevInformation_t *ps_rem_dev_info = 1400 (phHal_sRemoteDevInformation_t *)hRemoteDevice; 1401 uint8_t fun_id; 1402 1403 switch (ps_rem_dev_info->RemDevType) 1404 { 1405 case phHal_eMifare_PICC: 1406 case phHal_eISO14443_A_PICC: 1407 { 1408 if ((phHal_eMifare_PICC == ps_rem_dev_info->RemDevType) 1409 && (0x00 != ps_rem_dev_info->RemoteDevInfo.Iso14443A_Info.Sak)) 1410 { 1411 /* Mifare classic 1k/4k not supported */ 1412 ret_val = NFCSTATUS_REJECTED; 1413 } 1414 else 1415 { 1416 gpphLibContext->ndef_cntx.NdefSendRecvLen = NDEF_SENDRCV_BUF_LEN; 1417 1418 /* Call ndef format reset, this will initialize the ndef 1419 format structure, and appropriate values are filled */ 1420 ret_val = phFriNfc_NdefSmtCrd_Reset (gpphLibContext->ndef_cntx.ndef_fmt, 1421 gpphLibContext->psOverHalCtxt, 1422 (phHal_sRemoteDevInformation_t*)hRemoteDevice, 1423 gpphLibContext->psDevInputParam, 1424 gpphLibContext->ndef_cntx.psNdefMap->SendRecvBuf, 1425 &(gpphLibContext->ndef_cntx.NdefSendRecvLen)); 1426 1427 for(fun_id = 0; fun_id < PH_FRINFC_SMTCRDFMT_CR; fun_id++) 1428 { 1429 /* Register for all the callbacks */ 1430 ret_val = phFriNfc_NdefSmtCrd_SetCR (gpphLibContext->ndef_cntx.ndef_fmt, 1431 fun_id, phLibNfc_Ndef_ReadOnly_Cb, 1432 gpphLibContext); 1433 } 1434 1435 /* Start smart card formatting function */ 1436 ret_val = phFriNfc_NdefSmtCrd_ConvertToReadOnly ( 1437 gpphLibContext->ndef_cntx.ndef_fmt); 1438 ret_val = PHNFCSTATUS(ret_val); 1439 } 1440 break; 1441 } 1442 1443 case phHal_eJewel_PICC: 1444 case phHal_eISO15693_PICC: 1445 { 1446 // MC: Got the feedback this was #if 0'd because it was resetting the lock bits 1447 // read in check NDEF, and these should not be reset here already. 1448 #if 0 1449 static uint16_t data_cnt = 0; 1450 1451 /* Resets the component instance */ 1452 ret_val = phFriNfc_NdefMap_Reset (gpphLibContext->ndef_cntx.psNdefMap, 1453 gpphLibContext->psOverHalCtxt, 1454 (phLibNfc_sRemoteDevInformation_t*)hRemoteDevice, 1455 gpphLibContext->psDevInputParam, 1456 gpphLibContext->ndef_cntx.psNdefMap->SendRecvBuf, 1457 gpphLibContext->ndef_cntx.NdefSendRecvLen, 1458 gpphLibContext->ndef_cntx.psNdefMap->SendRecvBuf, 1459 &(gpphLibContext->ndef_cntx.NdefSendRecvLen), 1460 &(data_cnt)); 1461 #endif /* #if 0 */ 1462 1463 1464 for (fun_id = 0; fun_id < PH_FRINFC_NDEFMAP_CR; fun_id++) 1465 { 1466 /* Register the callback for the check ndef */ 1467 ret_val = phFriNfc_NdefMap_SetCompletionRoutine ( 1468 gpphLibContext->ndef_cntx.psNdefMap, 1469 fun_id, phLibNfc_Ndef_ReadOnly_Cb, 1470 (void *)gpphLibContext); 1471 } 1472 1473 /* call below layer check Ndef function */ 1474 ret_val = phFriNfc_NdefMap_ConvertToReadOnly ( 1475 gpphLibContext->ndef_cntx.psNdefMap); 1476 ret_val = PHNFCSTATUS(ret_val); 1477 break; 1478 } 1479 1480 default: 1481 { 1482 /* Tag not supported */ 1483 ret_val = NFCSTATUS_REJECTED; 1484 break; 1485 } 1486 } 1487 } 1488 else 1489 { 1490 gpphLibContext->ndef_cntx.pClientNdefFmtCb= NULL; 1491 ret_val = NFCSTATUS_PENDING; 1492 } 1493 1494 if (NFCSTATUS_PENDING == ret_val) 1495 { 1496 gpphLibContext->ndef_cntx.pClientNdefFmtCb = pNdefReadOnly_RspCb; 1497 gpphLibContext->ndef_cntx.pClientNdefFmtCntx = pContext; 1498 1499 gpphLibContext->status.GenCb_pending_status = TRUE; 1500 gpphLibContext->LibNfcState.next_state = eLibNfcHalStateTransaction; 1501 } 1502 else 1503 { 1504 ret_val = NFCSTATUS_FAILED; 1505 } 1506 } 1507 return ret_val; 1508 } 1509 1510 #endif /* #ifdef LIBNFC_READONLY_NDEF */ 1511 1512 /** 1513 * Response callback for NDEF format. 1514 */ 1515 STATIC 1516 void phLibNfc_Ndef_format_Cb(void *Context,NFCSTATUS status) 1517 { 1518 NFCSTATUS RetStatus = NFCSTATUS_SUCCESS; 1519 pphLibNfc_RspCb_t pClientCb=NULL; 1520 phLibNfc_LibContext_t *pLibNfc_Ctxt = (phLibNfc_LibContext_t *)Context; 1521 void *pUpperLayerContext=NULL; 1522 phHal_sRemoteDevInformation_t *ps_rem_dev_info = NULL; 1523 if(pLibNfc_Ctxt != gpphLibContext) 1524 { /*wrong context returned*/ 1525 phOsalNfc_RaiseException(phOsalNfc_e_InternalErr,1); 1526 } 1527 else 1528 { 1529 if(eLibNfcHalStateShutdown == gpphLibContext->LibNfcState.next_state) 1530 { 1531 /*shutdown is pending so issue shutdown*/ 1532 phLibNfc_Pending_Shutdown(); 1533 RetStatus = NFCSTATUS_SHUTDOWN; 1534 } 1535 else if(eLibNfcHalStateRelease == gpphLibContext->LibNfcState.next_state) 1536 { 1537 RetStatus = NFCSTATUS_ABORTED; 1538 } 1539 else 1540 { 1541 gpphLibContext->status.GenCb_pending_status = FALSE; 1542 if(NFCSTATUS_SUCCESS == status) 1543 { 1544 RetStatus = NFCSTATUS_SUCCESS; 1545 } 1546 else if(PHNFCSTATUS(status)==NFCSTATUS_FAILED) 1547 { 1548 RetStatus = NFCSTATUS_FAILED; 1549 ps_rem_dev_info = (phHal_sRemoteDevInformation_t *) 1550 gpphLibContext->Connected_handle; 1551 if ((phHal_eMifare_PICC == ps_rem_dev_info->RemDevType) && 1552 (0x08 == (ps_rem_dev_info->RemoteDevInfo.Iso14443A_Info.Sak & 0x08))) 1553 { 1554 1555 /* card type is mifare 1k/4k, then reconnect */ 1556 RetStatus = phHal4Nfc_Connect(gpphLibContext->psHwReference, 1557 (phHal_sRemoteDevInformation_t *) 1558 gpphLibContext->Connected_handle, 1559 (pphHal4Nfc_ConnectCallback_t) 1560 phLibNfc_Reconnect_Mifare_Cb, 1561 (void *)gpphLibContext); 1562 } 1563 } 1564 else 1565 { 1566 /*Target was removed during transaction*/ 1567 RetStatus = NFCSTATUS_FAILED; 1568 } 1569 gpphLibContext->LibNfcState.cur_state =eLibNfcHalStateConnect; 1570 } 1571 phLibNfc_UpdateCurState(status,gpphLibContext); 1572 1573 pClientCb = gpphLibContext->ndef_cntx.pClientNdefFmtCb; 1574 pUpperLayerContext= gpphLibContext->ndef_cntx.pClientNdefFmtCntx; 1575 gpphLibContext->ndef_cntx.pClientNdefFmtCb = NULL; 1576 gpphLibContext->ndef_cntx.pClientNdefFmtCntx = NULL; 1577 if(NFCSTATUS_PENDING != RetStatus) 1578 { 1579 if (NULL != pClientCb) 1580 { 1581 /* Call the tag format upper layer callback */ 1582 pClientCb(pUpperLayerContext,RetStatus); 1583 } 1584 } 1585 } 1586 return; 1587 } 1588 1589 #ifdef LIBNFC_READONLY_NDEF 1590 STATIC 1591 void 1592 phLibNfc_Ndef_ReadOnly_Cb ( 1593 void *p_context, 1594 NFCSTATUS status) 1595 { 1596 NFCSTATUS ret_status = NFCSTATUS_SUCCESS; 1597 pphLibNfc_RspCb_t p_client_cb = NULL; 1598 phLibNfc_LibContext_t *pLibNfc_Ctxt = (phLibNfc_LibContext_t *)p_context; 1599 void *p_upper_layer_ctxt = NULL; 1600 1601 if(pLibNfc_Ctxt != gpphLibContext) 1602 { 1603 /*wrong context returned*/ 1604 phOsalNfc_RaiseException(phOsalNfc_e_InternalErr,1); 1605 } 1606 else 1607 { 1608 if(eLibNfcHalStateShutdown == gpphLibContext->LibNfcState.next_state) 1609 { 1610 /*shutdown is pending so issue shutdown*/ 1611 phLibNfc_Pending_Shutdown(); 1612 ret_status = NFCSTATUS_SHUTDOWN; 1613 } 1614 else if(eLibNfcHalStateRelease == gpphLibContext->LibNfcState.next_state) 1615 { 1616 ret_status = NFCSTATUS_ABORTED; 1617 } 1618 else 1619 { 1620 gpphLibContext->status.GenCb_pending_status = FALSE; 1621 if(NFCSTATUS_SUCCESS == status) 1622 { 1623 gpphLibContext->ndef_cntx.psNdefMap->CardState = 1624 PH_NDEFMAP_CARD_STATE_READ_ONLY; 1625 ret_status = NFCSTATUS_SUCCESS; 1626 } 1627 else 1628 { 1629 ret_status = NFCSTATUS_FAILED; 1630 } 1631 gpphLibContext->LibNfcState.cur_state =eLibNfcHalStateConnect; 1632 } 1633 1634 phLibNfc_UpdateCurState(status, gpphLibContext); 1635 1636 p_client_cb = gpphLibContext->ndef_cntx.pClientNdefFmtCb; 1637 p_upper_layer_ctxt = gpphLibContext->ndef_cntx.pClientNdefFmtCntx; 1638 gpphLibContext->ndef_cntx.pClientNdefFmtCb = NULL; 1639 gpphLibContext->ndef_cntx.pClientNdefFmtCntx = NULL; 1640 if(NFCSTATUS_PENDING != ret_status) 1641 { 1642 if (NULL != p_client_cb) 1643 { 1644 /* Call the tag format upper layer callback */ 1645 p_client_cb (p_upper_layer_ctxt, ret_status); 1646 } 1647 } 1648 } 1649 } 1650 #endif /* #ifdef LIBNFC_READONLY_NDEF */ 1651 1652 STATIC 1653 void phLibNfc_Ndef_SrchNdefCnt_Cb(void *context, NFCSTATUS status) 1654 { 1655 static NFCSTATUS RegPrSt=FALSE; 1656 uint8_t RegStatus=0; 1657 NFCSTATUS RetVal = NFCSTATUS_SUCCESS ; 1658 uint32_t Index=0; 1659 1660 1661 PHNFC_UNUSED_VARIABLE(context); 1662 if(eLibNfcHalStateShutdown == gpphLibContext->LibNfcState.next_state) 1663 { /*shutdown called before completion of Ndef read allow 1664 shutdown to happen */ 1665 phLibNfc_Pending_Shutdown(); 1666 RetVal = NFCSTATUS_SHUTDOWN; 1667 } 1668 else if(eLibNfcHalStateRelease == gpphLibContext->LibNfcState.next_state) 1669 { 1670 RetVal = NFCSTATUS_ABORTED; 1671 } 1672 else if(NFCSTATUS_SUCCESS != status) 1673 { 1674 RetVal = status; 1675 } 1676 else 1677 { 1678 /* This conditional branch is for QMORE fix */ 1679 } 1680 gpphLibContext->status.GenCb_pending_status = FALSE; 1681 1682 phLibNfc_UpdateCurState(status,gpphLibContext); 1683 /* Read is not success send failed to upperlayer Call back*/ 1684 if( RetVal!= NFCSTATUS_SUCCESS ) 1685 { 1686 if((RetVal!=NFCSTATUS_SHUTDOWN)&& (RetVal!=NFCSTATUS_ABORTED)) 1687 { 1688 RetVal= NFCSTATUS_FAILED; 1689 } 1690 gpphLibContext->CBInfo.pClientNdefNtfRespCb( 1691 gpphLibContext->CBInfo.pClientNdefNtfRespCntx, 1692 NULL, 1693 gpphLibContext->Connected_handle, 1694 RetVal); 1695 gpphLibContext->CBInfo.pClientNdefNtfRespCb = NULL; 1696 gpphLibContext->CBInfo.pClientNdefNtfRespCntx = NULL; 1697 return; 1698 } 1699 1700 /*Get the Number of records ( If Raw record parameter is null then API gives number of Records*/ 1701 RetVal = phFriNfc_NdefRecord_GetRecords( 1702 gpphLibContext->phLib_NdefRecCntx.ndef_message.buffer, 1703 gpphLibContext->phLib_NdefRecCntx.ndef_message.length, 1704 NULL, 1705 gpphLibContext->phLib_NdefRecCntx.IsChunked, 1706 &(gpphLibContext->phLib_NdefRecCntx.NumberOfRawRecords)); 1707 1708 NdefInfo.pNdefMessage = gpphLibContext->phLib_NdefRecCntx.ndef_message.buffer; 1709 NdefInfo.NdefMessageLengthActual = gpphLibContext->ndef_cntx.NdefActualSize; 1710 NdefInfo.NdefMessageLengthMaximum = gpphLibContext->ndef_cntx.NdefLength; 1711 NdefInfo.NdefRecordCount =0; 1712 1713 /*Allocate memory to hold the records Read*/ 1714 NdefInfo.pNdefRecord = phOsalNfc_GetMemory 1715 (sizeof(phFriNfc_NdefRecord_t)* gpphLibContext->phLib_NdefRecCntx.NumberOfRawRecords ); 1716 if(NULL==NdefInfo.pNdefRecord) 1717 { 1718 gpphLibContext->CBInfo.pClientNdefNtfRespCb( 1719 gpphLibContext->CBInfo.pClientNdefNtfRespCntx, 1720 NULL, 1721 gpphLibContext->Connected_handle, 1722 NFCSTATUS_FAILED); 1723 gpphLibContext->CBInfo.pClientNdefNtfRespCb = NULL; 1724 gpphLibContext->CBInfo.pClientNdefNtfRespCntx = NULL; 1725 return; 1726 } 1727 1728 pNdefRecord=NdefInfo.pNdefRecord; 1729 /*If phLibNfc_Ndef_SearchNdefContent Reg type is NULL return all the Records*/ 1730 if(gpphLibContext->ndef_cntx.pNdef_NtfSrch_Type==NULL) 1731 { 1732 RetVal = phFriNfc_NdefRecord_GetRecords( 1733 gpphLibContext->phLib_NdefRecCntx.ndef_message.buffer, 1734 gpphLibContext->phLib_NdefRecCntx.ndef_message.length, 1735 gpphLibContext->phLib_NdefRecCntx.RawRecords, 1736 gpphLibContext->phLib_NdefRecCntx.IsChunked, 1737 &(gpphLibContext->phLib_NdefRecCntx.NumberOfRawRecords)); 1738 1739 for (Index = 0; Index < gpphLibContext->phLib_NdefRecCntx.NumberOfRawRecords; Index++) 1740 { 1741 RetVal = phFriNfc_NdefRecord_Parse( 1742 pNdefRecord, 1743 gpphLibContext->phLib_NdefRecCntx.RawRecords[Index]); 1744 pNdefRecord++; 1745 NdefInfo.NdefRecordCount++; 1746 } 1747 } 1748 else 1749 { 1750 1751 /* Look for registerd TNF */ 1752 RetVal = phFriNfc_NdefReg_DispatchPacket( 1753 &(gpphLibContext->phLib_NdefRecCntx.NdefReg), 1754 gpphLibContext->phLib_NdefRecCntx.ndef_message.buffer, 1755 (uint16_t)gpphLibContext->phLib_NdefRecCntx.ndef_message.length); 1756 if(NFCSTATUS_SUCCESS != RetVal) 1757 { 1758 /*phFriNfc_NdefReg_DispatchPacket is failed call upper layer*/ 1759 gpphLibContext->CBInfo.pClientNdefNtfRespCb(gpphLibContext->CBInfo.pClientNdefNtfRespCntx, 1760 NULL,gpphLibContext->Connected_handle,NFCSTATUS_FAILED); 1761 gpphLibContext->CBInfo.pClientNdefNtfRespCb = NULL; 1762 gpphLibContext->CBInfo.pClientNdefNtfRespCntx = NULL; 1763 return; 1764 } 1765 1766 while(1 != RegStatus) 1767 { 1768 /* Process the NDEF records, If match FOUND we will get Call back*/ 1769 RegStatus = phFriNfc_NdefReg_Process( &(gpphLibContext->phLib_NdefRecCntx.NdefReg), 1770 &RegPrSt); 1771 if(RegPrSt == TRUE) 1772 { 1773 /* Processing Done */ 1774 break; 1775 } 1776 /*If match found the CbParam will be updated by lower layer, copy the record info*/ 1777 for(Index=0;Index<gpphLibContext->phLib_NdefRecCntx.CbParam.Count;Index++) 1778 { 1779 pNdefRecord->Tnf = gpphLibContext->phLib_NdefRecCntx.CbParam.Records[Index].Tnf; 1780 pNdefRecord->TypeLength = 1781 gpphLibContext->phLib_NdefRecCntx.CbParam.Records[Index].TypeLength; 1782 pNdefRecord->PayloadLength = 1783 gpphLibContext->phLib_NdefRecCntx.CbParam.Records[Index].PayloadLength; 1784 pNdefRecord->IdLength = 1785 gpphLibContext->phLib_NdefRecCntx.CbParam.Records[Index].IdLength; 1786 pNdefRecord->Flags = 1787 gpphLibContext->phLib_NdefRecCntx.CbParam.Records[Index].Flags; 1788 1789 pNdefRecord->Id = phOsalNfc_GetMemory(pNdefRecord->IdLength); 1790 pNdefRecord->Type = phOsalNfc_GetMemory(pNdefRecord->TypeLength); 1791 pNdefRecord->PayloadData = phOsalNfc_GetMemory(pNdefRecord->PayloadLength); 1792 1793 (void)memcpy(pNdefRecord->Id, 1794 gpphLibContext->phLib_NdefRecCntx.CbParam.Records[Index].Id, 1795 pNdefRecord->IdLength); 1796 (void)memcpy(pNdefRecord->PayloadData, 1797 gpphLibContext->phLib_NdefRecCntx.CbParam.Records[Index].PayloadData, 1798 pNdefRecord->PayloadLength); 1799 (void)memcpy(pNdefRecord->Type, 1800 gpphLibContext->phLib_NdefRecCntx.CbParam.Records[Index].Type, 1801 pNdefRecord->TypeLength); 1802 1803 pNdefRecord++; 1804 NdefInfo.NdefRecordCount++; 1805 } 1806 } 1807 } 1808 /* If no record found call upper layer with failed status*/ 1809 if(pNdefRecord == NdefInfo.pNdefRecord) 1810 { 1811 NdefInfo.NdefRecordCount =0; 1812 gpphLibContext->CBInfo.pClientNdefNtfRespCb( 1813 gpphLibContext->CBInfo.pClientNdefNtfRespCntx, 1814 &NdefInfo,gpphLibContext->Connected_handle, 1815 NFCSTATUS_SUCCESS); 1816 1817 } 1818 else 1819 { 1820 /*Call upperlayer Call back with match records*/ 1821 1822 gpphLibContext->CBInfo.pClientNdefNtfRespCb( 1823 gpphLibContext->CBInfo.pClientNdefNtfRespCntx, 1824 &NdefInfo,gpphLibContext->Connected_handle, 1825 NFCSTATUS_SUCCESS); 1826 /*Remove entry from FRI*/ 1827 RetVal = phFriNfc_NdefReg_RmCb( 1828 &(gpphLibContext->phLib_NdefRecCntx.NdefReg), 1829 gpphLibContext->phLib_NdefRecCntx.NdefCb ); 1830 /*Free the memory*/ 1831 if(gpphLibContext->ndef_cntx.pNdef_NtfSrch_Type!=NULL) 1832 { 1833 pNdefRecord=NdefInfo.pNdefRecord; 1834 for(Index=0;Index<gpphLibContext->phLib_NdefRecCntx.CbParam.Count;Index++) 1835 { 1836 phOsalNfc_FreeMemory(pNdefRecord->Id); 1837 phOsalNfc_FreeMemory(pNdefRecord->PayloadData); 1838 phOsalNfc_FreeMemory(pNdefRecord->Type); 1839 pNdefRecord++; 1840 } 1841 } 1842 } 1843 1844 gpphLibContext->CBInfo.pClientNdefNtfRespCb = NULL; 1845 gpphLibContext->CBInfo.pClientNdefNtfRespCntx = NULL; 1846 1847 } 1848 1849 STATIC 1850 void phLibNfc_Ndef_Rtd_Cb( void *CallBackParam) 1851 { 1852 /*There will be single call back given to all match 1853 It's processed in phLibNfc_Ndef_SrchNdefCnt_Cb*/ 1854 PHNFC_UNUSED_VARIABLE(CallBackParam); 1855 } 1856 1857 NFCSTATUS phLibNfc_Ndef_SearchNdefContent( 1858 phLibNfc_Handle hRemoteDevice, 1859 phLibNfc_Ndef_SrchType_t* psSrchTypeList, 1860 uint8_t uNoSrchRecords, 1861 pphLibNfc_Ndef_Search_RspCb_t pNdefNtfRspCb, 1862 void * pContext 1863 ) 1864 { 1865 1866 NFCSTATUS RetVal =NFCSTATUS_SUCCESS; 1867 uint32_t Index=0; 1868 uint8_t cr_index = 0; 1869 1870 1871 if((NULL == gpphLibContext) || 1872 (gpphLibContext->LibNfcState.cur_state 1873 == eLibNfcHalStateShutdown)) 1874 { 1875 RetVal = NFCSTATUS_NOT_INITIALISED; 1876 } 1877 /* Check the state for DeInit is called or not,if yes return NFCSTATUS_SHUTDOWN*/ 1878 else if(gpphLibContext->LibNfcState.next_state 1879 == eLibNfcHalStateShutdown) 1880 { 1881 RetVal= NFCSTATUS_SHUTDOWN; 1882 } 1883 else if( (NULL == pNdefNtfRspCb) || 1884 (NULL == pContext ) || 1885 (0 == hRemoteDevice)) 1886 { 1887 RetVal= NFCSTATUS_INVALID_PARAMETER; 1888 } 1889 else if( (NULL != psSrchTypeList) && (0==uNoSrchRecords)) 1890 { 1891 RetVal= NFCSTATUS_INVALID_PARAMETER; 1892 } 1893 else if(0 == gpphLibContext->Connected_handle) 1894 { /*presently no target or tag is connected*/ 1895 RetVal=NFCSTATUS_TARGET_NOT_CONNECTED; 1896 } 1897 else if(hRemoteDevice != gpphLibContext->Connected_handle) 1898 { /*This handle of the device sent by application is not connected */ 1899 RetVal=NFCSTATUS_INVALID_HANDLE; 1900 } 1901 else if((TRUE == gpphLibContext->status.GenCb_pending_status) 1902 ||(NULL!=gpphLibContext->CBInfo.pClientNdefNtfRespCb)) 1903 { 1904 /*Previous callback is pending*/ 1905 RetVal = NFCSTATUS_REJECTED; 1906 } 1907 else 1908 { 1909 gpphLibContext->ndef_cntx.pNdef_NtfSrch_Type = psSrchTypeList; 1910 1911 if(psSrchTypeList!=NULL) 1912 { 1913 /*Maximum records supported*/ 1914 gpphLibContext->phLib_NdefRecCntx.NumberOfRecords = 255; 1915 /*Reset the FRI component to add the Reg type*/ 1916 RetVal = phFriNfc_NdefReg_Reset( 1917 &(gpphLibContext->phLib_NdefRecCntx.NdefReg), 1918 gpphLibContext->phLib_NdefRecCntx.NdefTypes_array, 1919 &(gpphLibContext->phLib_NdefRecCntx.RecordsExtracted), 1920 &(gpphLibContext->phLib_NdefRecCntx.CbParam), 1921 gpphLibContext->phLib_NdefRecCntx.ChunkedRecordsarray, 1922 gpphLibContext->phLib_NdefRecCntx.NumberOfRecords); 1923 1924 gpphLibContext->phLib_NdefRecCntx.NdefCb = phOsalNfc_GetMemory(sizeof(phFriNfc_NdefReg_Cb_t)); 1925 if(gpphLibContext->phLib_NdefRecCntx.NdefCb==NULL) 1926 { 1927 /*exception: Not enough memory*/ 1928 phOsalNfc_RaiseException(phOsalNfc_e_NoMemory,1); 1929 } 1930 gpphLibContext->phLib_NdefRecCntx.NdefCb->NdefCallback = phLibNfc_Ndef_Rtd_Cb; 1931 /*Copy the TNF types to search in global structure*/ 1932 gpphLibContext->phLib_NdefRecCntx.NdefCb->NumberOfRTDs = uNoSrchRecords; 1933 for(Index=0;Index<uNoSrchRecords;Index++) 1934 { 1935 gpphLibContext->phLib_NdefRecCntx.NdefCb->NdefType[Index] = psSrchTypeList->Type; 1936 gpphLibContext->phLib_NdefRecCntx.NdefCb->Tnf[Index] = psSrchTypeList->Tnf ; 1937 gpphLibContext->phLib_NdefRecCntx.NdefCb->NdeftypeLength[Index] = psSrchTypeList->TypeLength; 1938 psSrchTypeList++; 1939 } 1940 /* Add the TNF type to FRI component*/ 1941 1942 RetVal = phFriNfc_NdefReg_AddCb(&(gpphLibContext->phLib_NdefRecCntx.NdefReg), 1943 gpphLibContext->phLib_NdefRecCntx.NdefCb ); 1944 1945 } 1946 gpphLibContext->phLib_NdefRecCntx.ndef_message.buffer = 1947 phOsalNfc_GetMemory(gpphLibContext->ndef_cntx.NdefActualSize); 1948 gpphLibContext->phLib_NdefRecCntx.ndef_message.length = 1949 gpphLibContext->ndef_cntx.NdefActualSize; 1950 /*Set Complete routine for NDEF Read*/ 1951 for (cr_index = 0; cr_index < PH_FRINFC_NDEFMAP_CR; cr_index++) 1952 { 1953 RetVal= phFriNfc_NdefMap_SetCompletionRoutine( 1954 gpphLibContext->ndef_cntx.psNdefMap, 1955 cr_index, 1956 phLibNfc_Ndef_SrchNdefCnt_Cb, 1957 (void *)gpphLibContext); 1958 1959 } 1960 gpphLibContext->ndef_cntx.NdefContinueRead = PH_FRINFC_NDEFMAP_SEEK_BEGIN; 1961 /* call below layer Ndef Read*/ 1962 RetVal = phFriNfc_NdefMap_RdNdef(gpphLibContext->ndef_cntx.psNdefMap, 1963 gpphLibContext->phLib_NdefRecCntx.ndef_message.buffer, 1964 (uint32_t*)&gpphLibContext->phLib_NdefRecCntx.ndef_message.length, 1965 PH_FRINFC_NDEFMAP_SEEK_BEGIN); 1966 1967 if(NFCSTATUS_PENDING == RetVal) 1968 { 1969 gpphLibContext->CBInfo.pClientNdefNtfRespCb = pNdefNtfRspCb; 1970 gpphLibContext->CBInfo.pClientNdefNtfRespCntx = pContext; 1971 gpphLibContext->status.GenCb_pending_status=TRUE; 1972 gpphLibContext->LibNfcState.next_state = eLibNfcHalStateTransaction; 1973 } 1974 else if (NFCSTATUS_SUCCESS == RetVal) 1975 { 1976 RetVal= NFCSTATUS_SUCCESS; 1977 } 1978 else 1979 { 1980 /*Ndef read failed*/ 1981 RetVal = NFCSTATUS_FAILED; 1982 } 1983 } 1984 return RetVal; 1985 1986 } 1987 1988