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 * =========================================================================== * 19 * * 20 * * 21 * \file phHciNfc.c * 22 * \brief HCI Interface Source for the HCI Management. * 23 * * 24 * * 25 * Project: NFC-FRI-1.1 * 26 * * 27 * $Date: Thu Apr 22 17:49:47 2010 $ * 28 * $Author: ing04880 $ * 29 * $Revision: 1.90 $ * 30 * $Aliases: NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $ 31 * * 32 * =========================================================================== * 33 */ 34 35 36 /* 37 ################################################################################ 38 ***************************** Header File Inclusion **************************** 39 ################################################################################ 40 */ 41 42 #include <phNfcConfig.h> 43 #include <phNfcCompId.h> 44 #include <phNfcIoctlCode.h> 45 #include <phHciNfc.h> 46 #include <phHciNfc_Sequence.h> 47 #include <phHciNfc_RFReader.h> 48 #include <phHciNfc_LinkMgmt.h> 49 #ifdef ENABLE_P2P 50 #include <phHciNfc_NfcIPMgmt.h> 51 #endif 52 #include <phHciNfc_Emulation.h> 53 #include <phHciNfc_SWP.h> 54 #include <phHciNfc_DevMgmt.h> 55 #include <phOsalNfc.h> 56 57 /**/ 58 59 /* 60 *************************** Static Function Declaration ************************** 61 */ 62 63 64 static 65 NFCSTATUS 66 phHciNfc_Config_Emulation ( 67 void *psHciHandle, 68 void *pHwRef, 69 phHal_sEmulationCfg_t *pEmulationConfig 70 71 ); 72 73 74 /* 75 *************************** Function Definitions ************************** 76 */ 77 78 79 /*! 80 * \brief Initialises the HCI Interface 81 * 82 * This function initialises the resources for the HCI Command and 83 * Response Mechanism 84 */ 85 86 NFCSTATUS 87 phHciNfc_Initialise ( 88 void *psHciHandle, 89 void *pHwRef, 90 phHciNfc_Init_t init_mode, 91 phHal_sHwConfig_t *pHwConfig, 92 pphNfcIF_Notification_CB_t pHalNotify, 93 void *psContext, 94 phNfcLayer_sCfg_t *psHciLayerCfg 95 ) 96 { 97 phHciNfc_sContext_t *psHciContext = NULL; 98 phNfcIF_sReference_t hciReference = { NULL, 0, 0 }; 99 phNfcIF_sCallBack_t if_callback = { NULL, NULL, NULL, NULL }; 100 phNfc_sLowerIF_t *plower_if = NULL; 101 NFCSTATUS status = NFCSTATUS_SUCCESS; 102 uint8_t lower_index=0; 103 104 if( (NULL == psHciHandle) || (NULL == pHwRef) || (NULL == pHalNotify) 105 || (NULL== psContext) || (NULL == psHciLayerCfg) || (NULL == pHwConfig) 106 ) 107 { 108 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 109 } 110 else if ( NULL != *(phHciNfc_sContext_t **)psHciHandle ) 111 { 112 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_ALREADY_INITIALISED ); 113 } 114 else 115 { 116 /* Create the memory for HCI Context */ 117 psHciContext = (phHciNfc_sContext_t *) 118 phOsalNfc_GetMemory(sizeof(phHciNfc_sContext_t)); 119 120 if(psHciContext != NULL) 121 { 122 (void)memset((void *)psHciContext,0, 123 sizeof(phHciNfc_sContext_t)); 124 125 psHciContext->hci_state.cur_state = hciState_Reset; 126 psHciContext->hci_mode = hciMode_Reset; 127 psHciContext->p_hw_ref = pHwRef; 128 psHciContext->host_rf_type = phHal_eUnknown_DevType; 129 HCI_PRINT("HCI Initialisation in Progress.... \n"); 130 131 #ifdef ESTABLISH_SESSION 132 /*(void)memcpy(((phHal_sHwReference_t *)pHwRef)->session_id, 133 DEFAULT_SESSION, (sizeof(DEFAULT_SESSION) > 0x01) ? 134 sizeof(DEFAULT_SESSION): 135 sizeof(((phHal_sHwReference_t *)pHwRef)->session_id));*/ 136 (void)memcpy(pHwConfig->session_id, 137 DEFAULT_SESSION, ((sizeof(DEFAULT_SESSION) > 0x01) 138 && (sizeof(DEFAULT_SESSION) <= 0x08 )) ? 139 sizeof(DEFAULT_SESSION): 140 sizeof(pHwConfig->session_id)); 141 #endif 142 HCI_DEBUG("Sizeof Default Session %u\n",sizeof(DEFAULT_SESSION)); 143 psHciContext->p_upper_notify = pHalNotify; 144 psHciContext->p_upper_context = psContext; 145 146 if_callback.pif_ctxt = psHciContext ; 147 if_callback.send_complete = &phHciNfc_Send_Complete; 148 if_callback.receive_complete= &phHciNfc_Receive_Complete; 149 if_callback.notify = &phHciNfc_Notify_Event; 150 plower_if = hciReference.plower_if = &(psHciContext->lower_interface); 151 *((phHciNfc_sContext_t **)psHciHandle) = psHciContext; 152 psHciContext->init_mode = init_mode; 153 psHciContext->p_hci_layer = psHciLayerCfg ; 154 lower_index = psHciLayerCfg->layer_index - 1; 155 156 if(NULL != psHciLayerCfg->layer_next->layer_registry) 157 { 158 status = psHciLayerCfg->layer_next->layer_registry( 159 &hciReference, if_callback, 160 (void *)&psHciLayerCfg[lower_index]); 161 HCI_DEBUG("HCI Lower Layer Register, Status = %02X\n",status); 162 } 163 if( (NFCSTATUS_SUCCESS == status) && (NULL != plower_if->init) ) 164 { 165 status = phHciNfc_FSM_Update ( psHciContext, 166 hciState_Initialise 167 ); 168 if(NFCSTATUS_SUCCESS == status) 169 { 170 psHciContext->hci_seq = ADMIN_INIT_SEQ; 171 psHciContext->target_release = FALSE; 172 psHciContext->config_type = POLL_LOOP_CFG; 173 psHciContext->p_config_params = pHwConfig ; 174 status = plower_if->init((void *)plower_if->pcontext, 175 (void *)psHciContext->p_hw_ref); 176 HCI_DEBUG("HCI Lower Layer Initialisation, Status = %02X\n",status); 177 if( NFCSTATUS_PENDING != status ) 178 { 179 /* Roll Back the State Machine to its Original State */ 180 phHciNfc_FSM_Rollback ( psHciContext ); 181 } 182 } 183 else 184 { 185 /* TODO: Handle Initialisation in the Invalid State */ 186 } 187 }/* End of Lower Layer Init */ 188 } /* End of Status Check for Memory */ 189 else 190 { 191 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES); 192 193 HCI_PRINT("HCI Context Memory Allocation Failed\n"); 194 } 195 196 } 197 return status; 198 } 199 200 201 /*! 202 * \brief Release of the HCI Interface . 203 * 204 * This function Closes all the open pipes and frees all the resources used by 205 * HCI Layer 206 */ 207 208 NFCSTATUS 209 phHciNfc_Release ( 210 void *psHciHandle, 211 void *pHwRef, 212 pphNfcIF_Notification_CB_t pHalReleaseCB, 213 void *psContext 214 ) 215 { 216 phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle); 217 NFCSTATUS status = NFCSTATUS_SUCCESS; 218 219 if( (NULL == psHciHandle) 220 || (NULL == pHwRef) 221 ) 222 { 223 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 224 } 225 /* This Scenario Forces the HCI and the lower layers 226 * to release its Resources 227 */ 228 else if ( NULL == pHalReleaseCB ) 229 { 230 /* Release the lower layer Resources */ 231 phHciNfc_Release_Lower( psHciContext, pHwRef ); 232 /* Release the HCI layer Resources */ 233 phHciNfc_Release_Resources( &psHciContext ); 234 } 235 else if ( NULL == psContext ) 236 { 237 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 238 } 239 else 240 { 241 HCI_PRINT("HCI Release in Progress.... \n"); 242 psHciContext->p_hw_ref = pHwRef; 243 status = phHciNfc_FSM_Update ( psHciContext, hciState_Release ); 244 if ((NFCSTATUS_SUCCESS == status) 245 #ifdef NXP_HCI_SHUTDOWN_OVERRIDE 246 || (NFCSTATUS_INVALID_STATE == PHNFCSTATUS(status)) 247 #endif 248 ) 249 { 250 psHciContext->p_upper_notify = pHalReleaseCB; 251 psHciContext->p_upper_context = psContext; 252 /* psHciContext->hci_seq = EMULATION_REL_SEQ;*/ 253 /* psHciContext->hci_seq = READER_MGMT_REL_SEQ; */ 254 if (HCI_SELF_TEST != psHciContext->init_mode) 255 { 256 psHciContext->hci_seq = PL_STOP_SEQ; 257 } 258 else 259 { 260 psHciContext->hci_seq = ADMIN_REL_SEQ; 261 } 262 263 #ifdef NXP_HCI_SHUTDOWN_OVERRIDE 264 if (NFCSTATUS_SUCCESS != status) 265 { 266 psHciContext->hci_state.next_state = (uint8_t) hciState_Release; 267 status = NFCSTATUS_PENDING; 268 } 269 else 270 #endif 271 { 272 status = phHciNfc_Release_Sequence(psHciContext,pHwRef); 273 } 274 275 if( NFCSTATUS_PENDING != status ) 276 { 277 /* Roll Back the State Machine to its Original State */ 278 phHciNfc_FSM_Rollback ( psHciContext ); 279 } 280 } 281 else 282 { 283 /* TODO: Return appropriate Error */ 284 } 285 286 } 287 288 return status; 289 } 290 291 #if 0 292 /*! 293 * \brief Interface to Starts the RF Device Discovery. 294 * 295 * This function Starts the Discovery Wheel. 296 */ 297 298 299 NFCSTATUS 300 phHciNfc_Start_Discovery ( 301 void *psHciHandle, 302 void *pHwRef 303 ) 304 { 305 phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle); 306 NFCSTATUS status = NFCSTATUS_SUCCESS; 307 308 if ( (NULL == psHciHandle) 309 || (NULL == pHwRef) 310 ) 311 { 312 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 313 } 314 else 315 { 316 status = phHciNfc_ReaderMgmt_Enable_Discovery( psHciContext, pHwRef ); 317 } 318 319 return status; 320 } 321 322 323 /*! 324 * \brief Interface to Stop the RF Device Discovery. 325 * 326 * This function Stops the Discovery Wheel. 327 */ 328 329 330 NFCSTATUS 331 phHciNfc_Stop_Discovery ( 332 void *psHciHandle, 333 void *pHwRef 334 ) 335 { 336 phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle); 337 NFCSTATUS status = NFCSTATUS_SUCCESS; 338 339 if ( (NULL == psHciHandle) 340 || (NULL == pHwRef) 341 ) 342 { 343 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 344 } 345 else 346 { 347 status = phHciNfc_ReaderMgmt_Disable_Discovery( psHciContext, pHwRef ); 348 } 349 350 return status; 351 } 352 353 354 #endif 355 356 /*! 357 * \brief Interface to Configure the Device With the appropriate 358 * Configuration Parameters . 359 * 360 * This function configures the Devices with the provided 361 * configuration attributes. 362 */ 363 364 365 NFCSTATUS 366 phHciNfc_Configure ( 367 void *psHciHandle, 368 void *pHwRef, 369 phHal_eConfigType_t config_type, 370 phHal_uConfig_t *pConfig 371 ) 372 { 373 NFCSTATUS status = NFCSTATUS_SUCCESS; 374 375 if( (NULL == psHciHandle) 376 || (NULL == pHwRef) 377 || (NULL == pConfig) 378 ) 379 { 380 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 381 } 382 else 383 { 384 switch(config_type) 385 { 386 case NFC_P2P_CONFIG: 387 { 388 #ifdef ENABLE_P2P 389 phHciNfc_sContext_t *psHciContext = 390 ((phHciNfc_sContext_t *)psHciHandle); 391 status = phHciNfc_FSM_Update ( psHciContext, hciState_Config ); 392 393 if (NFCSTATUS_SUCCESS == status) 394 { 395 psHciContext->config_type = NFC_GENERAL_CFG; 396 psHciContext->p_config_params = &(pConfig->nfcIPConfig); 397 psHciContext->hci_seq = INITIATOR_GENERAL_SEQ; 398 status = phHciNfc_NfcIP_SetATRInfo( psHciHandle, 399 pHwRef, NFCIP_INITIATOR, 400 &(pConfig->nfcIPConfig)); 401 if( NFCSTATUS_PENDING != status ) 402 { 403 /* Roll Back the State Machine to its Original State */ 404 phHciNfc_FSM_Rollback ( psHciContext ); 405 } 406 else 407 { 408 psHciContext->hci_seq = TARGET_GENERAL_SEQ; 409 } 410 } 411 #else 412 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 413 414 #endif 415 break; 416 } 417 case NFC_EMULATION_CONFIG: 418 { 419 status = phHciNfc_Config_Emulation( psHciHandle, 420 pHwRef, &(pConfig->emuConfig)); 421 break; 422 } 423 case NFC_SE_PROTECTION_CONFIG: 424 { 425 phHciNfc_sContext_t *psHciContext = 426 ((phHciNfc_sContext_t *)psHciHandle); 427 status = phHciNfc_FSM_Update ( psHciContext, hciState_Config ); 428 429 if (NFCSTATUS_SUCCESS == status) 430 { 431 psHciContext->config_type = SWP_PROTECT_CFG; 432 psHciContext->p_config_params = &(pConfig->protectionConfig); 433 psHciContext->hci_seq = HCI_END_SEQ; 434 status = phHciNfc_SWP_Protection( psHciHandle, 435 pHwRef, pConfig->protectionConfig.mode); 436 if( NFCSTATUS_PENDING != status ) 437 { 438 /* Roll Back the State Machine to its Original State */ 439 phHciNfc_FSM_Rollback ( psHciContext ); 440 } 441 } 442 break; 443 } 444 default: 445 { 446 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 447 break; 448 } 449 }/* End of the Configuration Switch */ 450 } 451 452 return status; 453 } 454 455 456 /*! 457 * \brief Interface to Configure the RF Device Discovery using 458 * HCI Polling Loop Gate . 459 * 460 * This function configures the HCI Polling Loop Gate with the provided 461 * configuration attributes. 462 */ 463 464 NFCSTATUS 465 phHciNfc_Config_Discovery ( 466 void *psHciHandle, 467 void *pHwRef, 468 phHal_sADD_Cfg_t *pPollConfig 469 ) 470 { 471 phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle); 472 NFCSTATUS status = NFCSTATUS_SUCCESS; 473 474 if( (NULL == psHciHandle) 475 || (NULL == pHwRef) 476 || (NULL == pPollConfig) 477 ) 478 { 479 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 480 } 481 else 482 { 483 psHciContext->p_hw_ref = pHwRef; 484 HCI_PRINT("HCI Poll Configuration .... \n"); 485 status = phHciNfc_FSM_Update ( psHciContext, hciState_Config ); 486 487 if (NFCSTATUS_SUCCESS == status) 488 { 489 #if 0 490 if(pPollConfig->PollDevInfo.PollEnabled) 491 { 492 psHciContext->hci_seq = PL_DURATION_SEQ; 493 } 494 else 495 { 496 psHciContext->hci_seq = PL_CONFIG_PHASE_SEQ; 497 /* psHciContext->hci_seq = (pPollConfig->NfcIP_Mode != 0 )? 498 PL_CONFIG_PHASE_SEQ: 499 READER_DISABLE_SEQ; */ 500 } 501 #endif 502 psHciContext->hci_seq = PL_DURATION_SEQ; 503 psHciContext->config_type = POLL_LOOP_CFG; 504 psHciContext->p_config_params = pPollConfig; 505 status = phHciNfc_PollLoop_Sequence( psHciContext, pHwRef ); 506 507 if( NFCSTATUS_PENDING != status ) 508 { 509 /* Roll Back the State Machine to its Original State */ 510 phHciNfc_FSM_Rollback ( psHciContext ); 511 } 512 } 513 else 514 { 515 /* TODO: Return appropriate Error */ 516 } 517 } 518 return status; 519 } 520 521 /*! 522 * \brief Interface to Restart the RF Device Discovery. 523 * 524 * This function restarts the Discovery Wheel. 525 */ 526 527 528 NFCSTATUS 529 phHciNfc_Restart_Discovery ( 530 void *psHciHandle, 531 void *pHwRef, 532 uint8_t re_poll 533 ) 534 { 535 phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle); 536 NFCSTATUS status = NFCSTATUS_SUCCESS; 537 phHal_eRemDevType_t target_type = phHal_eUnknown_DevType; 538 539 if ( (NULL == psHciHandle) 540 || (NULL == pHwRef) 541 ) 542 { 543 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 544 } 545 else 546 { 547 psHciContext->p_hw_ref = pHwRef; 548 549 /* To be back in the Poll State to Re-Poll the Target */ 550 status = phHciNfc_FSM_Update ( psHciContext, hciState_Initialise ); 551 if (NFCSTATUS_SUCCESS == status) 552 { 553 switch (psHciContext->host_rf_type) 554 { 555 case phHal_eISO14443_A_PCD: 556 { 557 target_type = phHal_eISO14443_A_PICC; 558 break; 559 } 560 case phHal_eNfcIP1_Initiator: 561 { 562 target_type = phHal_eNfcIP1_Target; 563 break; 564 } 565 #ifdef TYPE_B 566 case phHal_eISO14443_B_PCD: 567 { 568 target_type = phHal_eISO14443_B_PICC; 569 break; 570 } 571 #endif 572 #ifdef TYPE_FELICA 573 case phHal_eFelica_PCD: 574 { 575 target_type = phHal_eFelica_PICC; 576 break; 577 } 578 #endif 579 #ifdef TYPE_JEWEL 580 case phHal_eJewel_PCD: 581 { 582 target_type = phHal_eJewel_PICC; 583 break; 584 } 585 #endif 586 #ifdef TYPE_ISO15693 587 case phHal_eISO15693_PCD: 588 { 589 target_type = phHal_eISO15693_PICC; 590 break; 591 } 592 #endif /* #ifdef TYPE_ISO15693 */ 593 #ifndef TYPE_B 594 case phHal_eISO14443_B_PCD: 595 #endif 596 #ifndef TYPE_FELICA 597 case phHal_eFelica_PCD: 598 #endif 599 #ifndef TYPE_JEWEL 600 case phHal_eJewel_PCD: 601 #endif 602 #ifndef TYPE_B_PRIME 603 case phHal_eISO14443_BPrime_PCD: 604 #endif 605 { 606 /* Roll Back the State Machine to its Original State */ 607 phHciNfc_FSM_Rollback ( psHciContext ); 608 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 609 break; 610 } 611 case phHal_eUnknown_DevType: 612 default: 613 { 614 /* Roll Back the State Machine to its Original State */ 615 phHciNfc_FSM_Rollback ( psHciContext ); 616 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 617 break; 618 } 619 }/* End of the Remote Target Type Switch */ 620 if( NFCSTATUS_SUCCESS == status ) 621 { 622 status = phHciNfc_ReaderMgmt_Deselect( 623 psHciContext, pHwRef, target_type, re_poll); 624 if( NFCSTATUS_PENDING != status ) 625 { 626 /* Roll Back the State Machine to its Original State */ 627 phHciNfc_FSM_Rollback ( psHciContext ); 628 } 629 else 630 { 631 psHciContext->host_rf_type = phHal_eUnknown_DevType; 632 } 633 } 634 } 635 else 636 { 637 /* TODO: Return appropriate Error */ 638 } 639 } 640 641 return status; 642 } 643 644 645 646 /*! 647 * \brief Interface to Configure the device to emulation as 648 * the tag, smart tag or p2p target . 649 * 650 * This function configures the HCI Polling Loop Gate with the provided 651 * configuration attributes. 652 */ 653 654 static 655 NFCSTATUS 656 phHciNfc_Config_Emulation ( 657 void *psHciHandle, 658 void *pHwRef, 659 phHal_sEmulationCfg_t *pEmulationCfg 660 ) 661 { 662 phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle); 663 NFCSTATUS status = NFCSTATUS_SUCCESS; 664 665 if( (NULL == psHciHandle) 666 || (NULL == pHwRef) 667 || (NULL == pEmulationCfg) 668 ) 669 { 670 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 671 } 672 else 673 { 674 psHciContext->p_hw_ref = pHwRef; 675 676 HCI_PRINT("HCI Configure Emulation .... \n"); 677 status = phHciNfc_FSM_Update ( psHciContext, hciState_Config ); 678 679 if (NFCSTATUS_SUCCESS == status) 680 { 681 psHciContext->hci_seq = EMULATION_CONFIG_SEQ; 682 psHciContext->p_config_params = pEmulationCfg; 683 switch( pEmulationCfg->emuType ) 684 { 685 case NFC_SMARTMX_EMULATION: 686 { 687 psHciContext->config_type = SMX_WI_CFG; 688 status = phHciNfc_Emulation_Cfg(psHciContext, 689 pHwRef, SMX_WI_CFG); 690 break; 691 } 692 case NFC_UICC_EMULATION: 693 { 694 psHciContext->config_type = UICC_SWP_CFG; 695 psHciContext->hci_seq = EMULATION_CONFIG_SEQ; 696 (void)phHciNfc_SWP_Update_Sequence( 697 psHciContext, CONFIG_SEQ ); 698 status = phHciNfc_EmulationCfg_Sequence( 699 psHciContext, pHwRef); 700 break; 701 } 702 case NFC_HOST_CE_A_EMULATION: 703 case NFC_HOST_CE_B_EMULATION: 704 #if defined(HOST_EMULATION) 705 { 706 if(TRUE == pEmulationCfg->config. 707 hostEmuCfg_A.enableEmulation) 708 { 709 psHciContext->hci_seq = ADMIN_CE_SEQ; 710 } 711 status = phHciNfc_EmulationCfg_Sequence( 712 psHciContext, pHwRef); 713 break; 714 } 715 #endif 716 default: 717 { 718 break; 719 } 720 721 } /* End of Config Switch */ 722 if( NFCSTATUS_PENDING != status ) 723 { 724 /* Roll Back the State Machine to its Original State */ 725 phHciNfc_FSM_Rollback ( psHciContext ); 726 } 727 } 728 else 729 { 730 /* TODO: Return appropriate Error */ 731 } 732 } 733 734 return status; 735 } 736 737 NFCSTATUS 738 phHciNfc_Switch_SwpMode ( 739 void *psHciHandle, 740 void *pHwRef, 741 phHal_eSWP_Mode_t swp_mode /* , 742 void *pSwpCfg */ 743 ) 744 { 745 phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle); 746 NFCSTATUS status = NFCSTATUS_SUCCESS; 747 748 if( (NULL == psHciHandle) 749 || (NULL == pHwRef) 750 ) 751 { 752 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 753 } 754 else 755 { 756 psHciContext->p_hw_ref = pHwRef; 757 758 HCI_PRINT("HCI SWP Switch .... "); 759 status = phHciNfc_FSM_Update ( psHciContext, hciState_Config ); 760 if (NFCSTATUS_SUCCESS == status) 761 { 762 psHciContext->config_type = SWP_EVT_CFG; 763 status = phHciNfc_SWP_Configure_Mode( psHciContext, pHwRef , 764 (uint8_t) swp_mode ); 765 766 /* Send the Success Status as this is an event */ 767 status = ((status == NFCSTATUS_SUCCESS)? 768 NFCSTATUS_PENDING : status); 769 770 if( NFCSTATUS_PENDING != status ) 771 { 772 /* Roll Back the State Machine to its Original State */ 773 phHciNfc_FSM_Rollback ( psHciContext ); 774 775 HCI_PRINT(" Execution Error \n"); 776 } 777 else 778 { 779 HCI_PRINT(" Successful \n"); 780 } 781 } 782 else 783 { 784 HCI_PRINT(" Not allowed - Invalid State \n"); 785 /* TODO: Return appropriate Error */ 786 } 787 } 788 789 return status; 790 } 791 792 793 794 /*! 795 * \brief Interface to Switch the Mode of the SmartMx from Virtual/Wired 796 * to the other mode. 797 * 798 * This function switches the mode of the SmartMX connected through WI(S2C) 799 * Interface to virtual/wired mode. 800 */ 801 802 803 NFCSTATUS 804 phHciNfc_Switch_SmxMode ( 805 void *psHciHandle, 806 void *pHwRef, 807 phHal_eSmartMX_Mode_t smx_mode, 808 phHal_sADD_Cfg_t *pPollConfig 809 ) 810 { 811 phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle); 812 NFCSTATUS status = NFCSTATUS_SUCCESS; 813 814 if( (NULL == psHciHandle) 815 || (NULL == pHwRef) 816 || (NULL == pPollConfig) 817 ) 818 { 819 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 820 } 821 else 822 { 823 psHciContext->p_hw_ref = pHwRef; 824 825 HCI_PRINT("HCI Smart MX Mode Switch .... \n"); 826 status = phHciNfc_FSM_Update ( psHciContext, hciState_Config ); 827 828 if (NFCSTATUS_SUCCESS == status) 829 { 830 psHciContext->hci_seq = READER_DISABLE_SEQ; 831 if ( (eSmartMx_Wired == psHciContext->smx_mode) 832 && ( hciState_Connect == psHciContext->hci_state.cur_state) 833 &&( eSmartMx_Wired != smx_mode) 834 ) 835 { 836 /* Workaround: For Wired Mode Disconnect 837 All the statemachine updates should be done only with the 838 Statemachine API and should not be overridden. 839 */ 840 psHciContext->hci_state.cur_state = hciState_Disconnect; 841 } 842 psHciContext->config_type = SMX_WI_MODE; 843 psHciContext->smx_mode = smx_mode; 844 psHciContext->p_config_params = pPollConfig; 845 status = phHciNfc_SmartMx_Mode_Sequence( psHciContext, pHwRef ); 846 if( NFCSTATUS_PENDING != status ) 847 { 848 /* Roll Back the State Machine to its Original State */ 849 phHciNfc_FSM_Rollback ( psHciContext ); 850 } 851 } 852 else 853 { 854 /* TODO: Return appropriate Error */ 855 } 856 } 857 858 return status; 859 } 860 861 862 /*! 863 * \brief Interface to Select the Next Remote Target Discovered during the 864 * discovery sequence using the particular HCI Reader Gate . 865 * 866 * 867 * This function Selects and Activates the next Remote Target 868 * Detected using the particular HCI Reader Gate. 869 */ 870 871 872 873 NFCSTATUS 874 phHciNfc_Select_Next_Target ( 875 void *psHciHandle, 876 void *pHwRef 877 ) 878 { 879 phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle); 880 NFCSTATUS status = NFCSTATUS_SUCCESS; 881 882 if( (NULL == psHciHandle) 883 || (NULL == pHwRef) 884 ) 885 { 886 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 887 } 888 else 889 { 890 psHciContext->p_hw_ref = pHwRef; 891 status = phHciNfc_FSM_Update ( psHciContext, hciState_Select ); 892 if (NFCSTATUS_SUCCESS == status) 893 { 894 psHciContext->hci_seq = READER_SELECT_SEQ; 895 status = phHciNfc_ReaderMgmt_Activate_Next( psHciContext, pHwRef ); 896 if( NFCSTATUS_PENDING != status ) 897 { 898 /* Roll Back the State Machine to its Original State */ 899 phHciNfc_FSM_Rollback ( psHciContext ); 900 } 901 } 902 else 903 { 904 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE); 905 } 906 } 907 908 return status; 909 910 } 911 912 913 /*! 914 * \brief Interface to Connect the Remote Target Discovered during the 915 * discovery sequence using the particular HCI Reader Gate . 916 * 917 * 918 * This function connects the Remote Target Detected using the particular 919 * HCI Reader Gate with the appropriate configuration setup. 920 */ 921 922 923 NFCSTATUS 924 phHciNfc_Connect ( 925 void *psHciHandle, 926 void *pHwRef, 927 phHal_sRemoteDevInformation_t *p_target_info 928 ) 929 { 930 phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle); 931 NFCSTATUS status = NFCSTATUS_SUCCESS; 932 /* phHal_eRemDevType_t target_type = phHal_eUnknown_DevType; */ 933 934 if( (NULL == psHciHandle) 935 || (NULL == pHwRef) 936 || (NULL == p_target_info) 937 ) 938 { 939 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 940 } 941 else 942 { 943 psHciContext->p_hw_ref = pHwRef; 944 status = phHciNfc_FSM_Update ( psHciContext, hciState_Connect ); 945 if (NFCSTATUS_SUCCESS == status) 946 { 947 psHciContext->hci_seq = READER_SELECT_SEQ; 948 switch (p_target_info->RemDevType) 949 { 950 case phHal_eISO14443_A_PICC: 951 case phHal_eISO14443_4A_PICC: 952 case phHal_eMifare_PICC: 953 case phHal_eISO14443_3A_PICC: 954 #ifdef ENABLE_P2P 955 case phHal_eNfcIP1_Target: 956 #endif 957 #ifdef TYPE_B 958 case phHal_eISO14443_B_PICC: 959 case phHal_eISO14443_4B_PICC: 960 #endif 961 #ifdef TYPE_FELICA 962 case phHal_eFelica_PICC: 963 #endif 964 #ifdef TYPE_JEWEL 965 case phHal_eJewel_PICC: 966 #endif 967 #ifdef TYPE_ISO15693 968 case phHal_eISO15693_PICC: 969 #endif /* #ifdef TYPE_ISO15693 */ 970 971 { 972 psHciContext->p_target_info = p_target_info; 973 status = phHciNfc_ReaderMgmt_Select( 974 psHciContext, pHwRef, 975 p_target_info->RemDevType ); 976 break; 977 } 978 #ifndef TYPE_B_PRIME 979 case phHal_eISO14443_BPrime_PICC: 980 #endif 981 case phHal_eUnknown_DevType: 982 default: 983 { 984 /* Roll Back the State Machine to its Original State */ 985 phHciNfc_FSM_Rollback ( psHciContext ); 986 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 987 break; 988 } 989 }/* End of the Remote Target Type Switch */ 990 if( NFCSTATUS_PENDING != status ) 991 { 992 /* Roll Back the State Machine to its Original State */ 993 phHciNfc_FSM_Rollback ( psHciContext ); 994 } 995 } 996 else 997 { 998 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE); 999 } 1000 1001 } /* End of the HCI Handle Validation */ 1002 1003 return status; 1004 } 1005 1006 1007 /*! 1008 * \brief Interface to Reactivate the Remote Targets Discovered during the 1009 * discovery sequence using the particular HCI Reader Gate . 1010 * 1011 * 1012 * This function reactivates the Remote Target Detected using the particular 1013 * HCI Reader Gate with the appropriate configuration setup. 1014 */ 1015 1016 1017 NFCSTATUS 1018 phHciNfc_Reactivate ( 1019 void *psHciHandle, 1020 void *pHwRef, 1021 phHal_sRemoteDevInformation_t *p_target_info 1022 ) 1023 { 1024 phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle); 1025 NFCSTATUS status = NFCSTATUS_SUCCESS; 1026 /* phHal_eRemDevType_t target_type = phHal_eUnknown_DevType; */ 1027 1028 if( (NULL == psHciHandle) 1029 || (NULL == pHwRef) 1030 || (NULL == p_target_info) 1031 ) 1032 { 1033 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 1034 } 1035 else 1036 { 1037 psHciContext->p_hw_ref = pHwRef; 1038 status = phHciNfc_FSM_Update ( psHciContext, hciState_Reactivate ); 1039 if (NFCSTATUS_SUCCESS == status) 1040 { 1041 psHciContext->hci_seq = READER_REACTIVATE_SEQ; 1042 switch (p_target_info->RemDevType) 1043 { 1044 case phHal_eISO14443_A_PICC: 1045 case phHal_eISO14443_4A_PICC: 1046 case phHal_eMifare_PICC: 1047 case phHal_eISO14443_3A_PICC: 1048 { 1049 psHciContext->host_rf_type = phHal_eISO14443_A_PCD; 1050 break; 1051 } 1052 case phHal_eNfcIP1_Target: 1053 { 1054 psHciContext->host_rf_type = phHal_eNfcIP1_Initiator; 1055 break; 1056 } 1057 #ifdef TYPE_B 1058 case phHal_eISO14443_4B_PICC: 1059 case phHal_eISO14443_B_PICC: 1060 { 1061 psHciContext->host_rf_type = phHal_eISO14443_B_PCD; 1062 break; 1063 } 1064 #endif 1065 #ifdef TYPE_FELICA 1066 case phHal_eFelica_PICC: 1067 { 1068 psHciContext->host_rf_type = phHal_eFelica_PCD; 1069 break; 1070 } 1071 #endif 1072 #ifdef TYPE_B_PRIME 1073 case phHal_eISO14443_BPrime_PICC: 1074 #endif 1075 /* Reactivate for Jewel is not Supported */ 1076 case phHal_eJewel_PICC: 1077 case phHal_eUnknown_DevType: 1078 default: 1079 { 1080 /* Roll Back the State Machine to its Original State */ 1081 phHciNfc_FSM_Rollback ( psHciContext ); 1082 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 1083 break; 1084 } 1085 }/* End of the Remote Target Type Switch */ 1086 } 1087 else 1088 { 1089 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE); 1090 } 1091 1092 if(NFCSTATUS_SUCCESS == status ) 1093 { 1094 psHciContext->p_target_info = p_target_info; 1095 status = phHciNfc_ReaderMgmt_Reactivate( 1096 psHciContext, pHwRef, p_target_info->RemDevType ); 1097 if( NFCSTATUS_PENDING != status ) 1098 { 1099 /* Roll Back the State Machine to its Original State */ 1100 phHciNfc_FSM_Rollback ( psHciContext ); 1101 } 1102 } 1103 } /* End of the HCI Handle Validation */ 1104 1105 1106 return status; 1107 } 1108 1109 1110 /*! 1111 * \brief Interface to Disconnect the selected target. 1112 * 1113 * This function disconnects the remote target selected. 1114 */ 1115 1116 1117 NFCSTATUS 1118 phHciNfc_Disconnect ( 1119 void *psHciHandle, 1120 void *pHwRef, 1121 uint8_t re_poll 1122 ) 1123 { 1124 phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle); 1125 NFCSTATUS status = NFCSTATUS_SUCCESS; 1126 phHal_eRemDevType_t target_type = phHal_eUnknown_DevType; 1127 /* phHal_eSmartMX_Mode_t smx_mode = (phHal_eSmartMX_Mode_t)type; */ 1128 static uint8_t repoll=0; 1129 1130 1131 if( (NULL == psHciHandle) 1132 || (NULL == pHwRef) 1133 || ( NULL == psHciContext->p_target_info) 1134 ) 1135 { 1136 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 1137 } 1138 else 1139 { 1140 psHciContext->p_hw_ref = pHwRef; 1141 repoll = re_poll; 1142 psHciContext->p_config_params = &repoll; 1143 /* psHciContext->hci_seq = HCI_END_SEQ; */ 1144 1145 /* To be back in the Poll State to Re-Poll the Target */ 1146 status = phHciNfc_FSM_Update ( psHciContext, hciState_Disconnect ); 1147 if (NFCSTATUS_SUCCESS == status) 1148 { 1149 psHciContext->hci_seq = READER_UICC_DISPATCH_SEQ; 1150 target_type = psHciContext->p_target_info->RemDevType; 1151 switch (target_type) 1152 { 1153 case phHal_eMifare_PICC: 1154 case phHal_eISO14443_A_PICC: 1155 case phHal_eISO14443_4A_PICC: 1156 case phHal_eISO14443_3A_PICC: 1157 case phHal_eNfcIP1_Target: 1158 #ifdef TYPE_B 1159 case phHal_eISO14443_B_PICC: 1160 case phHal_eISO14443_4B_PICC: 1161 #endif 1162 #ifdef TYPE_FELICA 1163 case phHal_eFelica_PICC: 1164 #endif 1165 #ifdef TYPE_JEWEL 1166 case phHal_eJewel_PICC: 1167 #endif 1168 #ifdef TYPE_ISO15693 1169 case phHal_eISO15693_PICC: 1170 #endif /* #ifdef TYPE_ISO15693 */ 1171 1172 { 1173 status = phHciNfc_Disconnect_Sequence( 1174 psHciContext, pHwRef ); 1175 break; 1176 } 1177 #ifndef TYPE_B 1178 case phHal_eISO14443_B_PICC: 1179 case phHal_eISO14443_4B_PICC: 1180 #endif 1181 #ifndef TYPE_FELICA 1182 case phHal_eFelica_PICC: 1183 #endif 1184 #ifndef TYPE_JEWEL 1185 case phHal_eJewel_PICC: 1186 #endif 1187 #ifndef TYPE_B_PRIME 1188 case phHal_eISO14443_BPrime_PICC: 1189 #endif 1190 { 1191 /* Roll Back the State Machine to its Original State */ 1192 phHciNfc_FSM_Rollback ( psHciContext ); 1193 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 1194 break; 1195 } 1196 case phHal_eUnknown_DevType: 1197 default: 1198 { 1199 /* Roll Back the State Machine to its Original State */ 1200 phHciNfc_FSM_Rollback ( psHciContext ); 1201 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 1202 break; 1203 } 1204 }/* End of the Remote Target Type Switch */ 1205 if( NFCSTATUS_PENDING != status ) 1206 { 1207 /* Roll Back the State Machine to its Original State */ 1208 phHciNfc_FSM_Rollback ( psHciContext ); 1209 } 1210 } 1211 else 1212 { 1213 /* TODO: Return appropriate Error */ 1214 } 1215 } /* End of the HCI Handle Validation */ 1216 1217 return status; 1218 } 1219 1220 /*! 1221 * \brief Interface to exchange the data to/from 1222 * the selected target. 1223 * 1224 * This function sends and receives the data to/from 1225 * the selected remote target. 1226 */ 1227 1228 NFCSTATUS 1229 phHciNfc_Exchange_Data ( 1230 void *psHciHandle, 1231 void *pHwRef, 1232 phHal_sRemoteDevInformation_t *p_target_info, 1233 phHciNfc_XchgInfo_t *p_xchg_info 1234 ) 1235 { 1236 phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle); 1237 NFCSTATUS status = NFCSTATUS_SUCCESS; 1238 1239 if( (NULL == psHciHandle) 1240 || (NULL == pHwRef) 1241 || (NULL == p_target_info) 1242 || (NULL == p_xchg_info) 1243 ) 1244 { 1245 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 1246 } 1247 else if (p_target_info != psHciContext->p_target_info ) 1248 { 1249 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_REMOTE_DEVICE); 1250 } 1251 else 1252 { 1253 psHciContext->p_hw_ref = pHwRef; 1254 status = phHciNfc_FSM_Update ( psHciContext, hciState_Transact ); 1255 if (NFCSTATUS_SUCCESS == status) 1256 { 1257 switch (p_target_info->RemDevType) 1258 { 1259 case phHal_eMifare_PICC: 1260 case phHal_eISO14443_A_PICC: 1261 case phHal_eISO14443_4A_PICC: 1262 case phHal_eISO14443_3A_PICC: 1263 #ifdef TYPE_B 1264 case phHal_eISO14443_B_PICC: 1265 case phHal_eISO14443_4B_PICC: 1266 #endif 1267 #ifdef TYPE_FELICA 1268 case phHal_eFelica_PICC: 1269 #endif 1270 #ifdef TYPE_JEWEL 1271 case phHal_eJewel_PICC: 1272 #endif 1273 #ifdef TYPE_ISO15693 1274 case phHal_eISO15693_PICC: 1275 #endif /* #ifdef TYPE_ISO15693 */ 1276 { 1277 psHciContext->p_xchg_info = p_xchg_info; 1278 status = phHciNfc_ReaderMgmt_Exchange_Data( 1279 psHciContext, pHwRef, p_xchg_info ); 1280 break; 1281 } 1282 #ifndef TYPE_B 1283 case phHal_eISO14443_B_PICC: 1284 case phHal_eISO14443_4B_PICC: 1285 #endif 1286 #ifndef TYPE_FELICA 1287 case phHal_eFelica_PICC: 1288 #endif 1289 #ifndef TYPE_JEWEL 1290 case phHal_eJewel_PICC: 1291 #endif 1292 case phHal_eNfcIP1_Target: 1293 #ifndef TYPE_B_PRIME 1294 case phHal_eISO14443_BPrime_PICC: 1295 #endif 1296 { 1297 /* Roll Back the State Machine to its Original State */ 1298 phHciNfc_FSM_Rollback ( psHciContext ); 1299 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 1300 break; 1301 } 1302 case phHal_eUnknown_DevType: 1303 default: 1304 { 1305 /* Roll Back the State Machine to its Original State */ 1306 phHciNfc_FSM_Rollback ( psHciContext ); 1307 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 1308 break; 1309 } 1310 1311 }/* End of the Remote Target Type Switch */ 1312 if( NFCSTATUS_PENDING != status ) 1313 { 1314 /* Roll Back the State Machine to its Original State */ 1315 phHciNfc_FSM_Rollback ( psHciContext ); 1316 } 1317 } 1318 else 1319 { 1320 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE); 1321 } 1322 } /* End of the HCI Handle Validation */ 1323 1324 return status; 1325 } 1326 1327 /*! 1328 * \brief Interface to Send the data to/from 1329 * the selected NfcIP. 1330 * 1331 * This function sends and receives the data to/from 1332 * the selected remote target. 1333 */ 1334 1335 NFCSTATUS 1336 phHciNfc_Send_Data ( 1337 void *psHciHandle, 1338 void *pHwRef, 1339 phHal_sRemoteDevInformation_t *p_remote_dev_info, 1340 phHciNfc_XchgInfo_t *p_send_param 1341 ) 1342 { 1343 phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle); 1344 NFCSTATUS status = NFCSTATUS_SUCCESS; 1345 1346 if( (NULL == psHciHandle) 1347 || (NULL == pHwRef) 1348 || (NULL == p_send_param) 1349 ) 1350 { 1351 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 1352 } 1353 else 1354 { 1355 psHciContext->p_hw_ref = pHwRef; 1356 status = phHciNfc_FSM_Update ( psHciContext, hciState_Transact ); 1357 if (NFCSTATUS_SUCCESS == status) 1358 { 1359 switch (psHciContext->host_rf_type) 1360 { 1361 case phHal_eISO14443_A_PICC: 1362 case phHal_eISO14443_B_PICC: 1363 case phHal_eISO14443_4A_PICC: 1364 case phHal_eISO14443_4B_PICC: 1365 { 1366 break; 1367 } 1368 #ifdef ENABLE_P2P 1369 case phHal_eNfcIP1_Initiator: 1370 { 1371 if (p_remote_dev_info != 1372 psHciContext->p_target_info ) 1373 { 1374 status = PHNFCSTVAL(CID_NFC_HCI, 1375 NFCSTATUS_INVALID_REMOTE_DEVICE); 1376 } 1377 else 1378 { 1379 psHciContext->p_xchg_info = p_send_param; 1380 status = phHciNfc_NfcIP_Send_Data( psHciContext, 1381 pHwRef, p_send_param ); 1382 } 1383 break; 1384 } 1385 case phHal_eNfcIP1_Target: 1386 { 1387 psHciContext->p_xchg_info = p_send_param; 1388 status = phHciNfc_NfcIP_Send_Data( psHciContext, 1389 pHwRef, p_send_param ); 1390 break; 1391 } 1392 #endif 1393 #ifdef TYPE_B_PRIME 1394 case phHal_eISO14443_BPrime_PCD: 1395 case phHal_eFelica_PCD: 1396 { 1397 /* Roll Back the State Machine to its Original State */ 1398 phHciNfc_FSM_Rollback ( psHciContext ); 1399 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 1400 break; 1401 } 1402 #endif 1403 case phHal_eUnknown_DevType: 1404 default: 1405 { 1406 /* Roll Back the State Machine to its Original State */ 1407 phHciNfc_FSM_Rollback ( psHciContext ); 1408 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 1409 break; 1410 } 1411 1412 }/* End of the Remote Target Type Switch */ 1413 #if defined( ENABLE_P2P ) || defined (TYPE_B_PRIME) 1414 if( NFCSTATUS_PENDING != status ) 1415 #endif 1416 { 1417 /* Roll Back the State Machine to its Original State */ 1418 phHciNfc_FSM_Rollback ( psHciContext ); 1419 } 1420 } 1421 else 1422 { 1423 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE); 1424 } 1425 } /* End of the HCI Handle Validation */ 1426 1427 return status; 1428 1429 } 1430 1431 #if 0 1432 1433 /*! 1434 * \brief Interface to Send the data from 1435 * the selected NfcIP. 1436 * 1437 * This function sends and receives the data to/from 1438 * the selected remote target. 1439 */ 1440 1441 NFCSTATUS 1442 phHciNfc_Receive_Data ( 1443 void *psHciHandle, 1444 void *pHwRef, 1445 uint8_t *p_data, 1446 uint8_t length 1447 ) 1448 { 1449 phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle); 1450 NFCSTATUS status = NFCSTATUS_SUCCESS; 1451 1452 if( (NULL == psHciHandle) 1453 || (NULL == pHwRef) 1454 ) 1455 { 1456 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 1457 } 1458 else 1459 { 1460 if (NFCSTATUS_SUCCESS == status) 1461 { 1462 status = phHciNfc_Receive(psHciHandle, pHwRef, p_data, length); 1463 if( NFCSTATUS_PENDING != status ) 1464 { 1465 /* Roll Back the State Machine to its Original State */ 1466 phHciNfc_FSM_Rollback ( psHciContext ); 1467 } 1468 } 1469 } 1470 return status; 1471 1472 } 1473 1474 #endif 1475 1476 /*! 1477 * \brief Interface to Check for the presence of 1478 * the selected target in the field . 1479 * 1480 * This function checks the presence of the 1481 * the selected remote target in the field . 1482 */ 1483 1484 1485 1486 NFCSTATUS 1487 phHciNfc_Presence_Check ( 1488 void *psHciHandle, 1489 void *pHwRef 1490 ) 1491 { 1492 NFCSTATUS status = NFCSTATUS_SUCCESS; 1493 phHciNfc_sContext_t *psHciContext = 1494 ((phHciNfc_sContext_t *)psHciHandle); 1495 phHal_eRemDevType_t target_type = phHal_eUnknown_DevType; 1496 1497 if( (NULL == psHciContext) 1498 || (NULL == pHwRef) 1499 ) 1500 { 1501 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 1502 } 1503 else 1504 { 1505 psHciContext->p_hw_ref = pHwRef; 1506 status = phHciNfc_FSM_Update ( psHciContext, hciState_Presence ); 1507 if (NFCSTATUS_SUCCESS == status) 1508 { 1509 target_type = psHciContext->p_target_info->RemDevType; 1510 switch (target_type) 1511 { 1512 case phHal_eISO14443_A_PICC: 1513 case phHal_eMifare_PICC: 1514 case phHal_eISO14443_4A_PICC: 1515 case phHal_eISO14443_3A_PICC: 1516 #ifdef TYPE_B 1517 case phHal_eISO14443_B_PICC: 1518 case phHal_eISO14443_4B_PICC: 1519 #endif 1520 #ifdef TYPE_FELICA 1521 case phHal_eFelica_PICC: 1522 #endif 1523 #ifdef TYPE_JEWEL 1524 case phHal_eJewel_PICC: 1525 #endif 1526 #ifdef TYPE_ISO15693 1527 case phHal_eISO15693_PICC: 1528 #endif /* #ifdef TYPE_ISO15693 */ 1529 #ifdef ENABLE_P2P 1530 case phHal_eNfcIP1_Target: 1531 #endif 1532 { 1533 status = phHciNfc_ReaderMgmt_Presence_Check( 1534 psHciContext, pHwRef ); 1535 break; 1536 } 1537 #ifdef TYPE_B_PRIME 1538 case phHal_eISO14443_BPrime_PICC: 1539 #endif 1540 #ifndef TYPE_B 1541 case phHal_eISO14443_B_PICC: 1542 case phHal_eISO14443_4B_PICC: 1543 #endif 1544 #ifndef TYPE_FELICA 1545 case phHal_eFelica_PICC: 1546 #endif 1547 #ifndef TYPE_JEWEL 1548 case phHal_eJewel_PICC: 1549 #endif 1550 case phHal_eUnknown_DevType: 1551 { 1552 /* Roll Back the State Machine to its Original State */ 1553 phHciNfc_FSM_Rollback ( psHciContext ); 1554 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 1555 break; 1556 } 1557 default: 1558 { 1559 /* Roll Back the State Machine to its Original State */ 1560 phHciNfc_FSM_Rollback ( psHciContext ); 1561 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 1562 break; 1563 } 1564 1565 }/* End of the Remote Target Type Switch */ 1566 if( NFCSTATUS_PENDING != status ) 1567 { 1568 /* Roll Back the State Machine to its Original State */ 1569 phHciNfc_FSM_Rollback ( psHciContext ); 1570 } 1571 } 1572 else 1573 { 1574 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE); 1575 } 1576 } /* End of the HCI Handle Validation */ 1577 1578 return status; 1579 } 1580 1581 NFCSTATUS 1582 phHciNfc_PRBS_Test ( 1583 void *psHciHandle, 1584 void *pHwRef, 1585 uint32_t test_type, 1586 phNfc_sData_t *test_param 1587 ) 1588 { 1589 NFCSTATUS status = NFCSTATUS_SUCCESS; 1590 phHciNfc_sContext_t *psHciContext = 1591 ((phHciNfc_sContext_t *)psHciHandle); 1592 1593 if( (NULL == psHciContext) 1594 || (NULL == pHwRef) 1595 || (test_type != DEVMGMT_PRBS_TEST) 1596 ) 1597 { 1598 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 1599 } 1600 else 1601 { 1602 psHciContext->p_hw_ref = pHwRef; 1603 status = phHciNfc_FSM_Update ( psHciContext, hciState_IO ); 1604 if (NFCSTATUS_SUCCESS == status) 1605 { 1606 status = phHciNfc_DevMgmt_Test(psHciContext, pHwRef, 1607 (uint8_t)(test_type & DEVMGMT_TEST_MASK), test_param); 1608 if( NFCSTATUS_PENDING != status ) 1609 { 1610 /* Roll Back the State Machine to its Original State */ 1611 phHciNfc_FSM_Rollback ( psHciContext ); 1612 } 1613 } 1614 } 1615 return status; 1616 } 1617 1618 1619 NFCSTATUS 1620 phHciNfc_System_Test ( 1621 void *psHciHandle, 1622 void *pHwRef, 1623 uint32_t test_type, 1624 phNfc_sData_t *test_param 1625 ) 1626 { 1627 NFCSTATUS status = NFCSTATUS_SUCCESS; 1628 phHciNfc_sContext_t *psHciContext = 1629 ((phHciNfc_sContext_t *)psHciHandle); 1630 static phNfc_sData_t test_result; 1631 static uint8_t gpio_status = 0; 1632 1633 if( (NULL == psHciContext) 1634 || (NULL == pHwRef) 1635 ) 1636 { 1637 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 1638 } 1639 else 1640 { 1641 psHciContext->p_hw_ref = pHwRef; 1642 status = phHciNfc_FSM_Update ( psHciContext, hciState_Test ); 1643 if (NFCSTATUS_SUCCESS == status) 1644 { 1645 if (test_type != NFC_GPIO_READ) 1646 { 1647 status = phHciNfc_DevMgmt_Test(psHciContext, pHwRef, 1648 (uint8_t)(test_type & DEVMGMT_TEST_MASK), test_param); 1649 } 1650 else 1651 { 1652 test_result.buffer = &gpio_status; 1653 status = phHciNfc_DevMgmt_Get_Info(psHciContext, pHwRef, 1654 (uint16_t)NFC_GPIO_READ, test_result.buffer); 1655 1656 } 1657 if( NFCSTATUS_PENDING != status ) 1658 { 1659 /* Roll Back the State Machine to its Original State */ 1660 phHciNfc_FSM_Rollback ( psHciContext ); 1661 } 1662 } 1663 } 1664 1665 return status; 1666 } 1667 1668 1669 NFCSTATUS 1670 phHciNfc_System_Configure ( 1671 void *psHciHandle, 1672 void *pHwRef, 1673 uint32_t config_type, 1674 uint8_t config_value 1675 ) 1676 { 1677 NFCSTATUS status = NFCSTATUS_SUCCESS; 1678 phHciNfc_sContext_t *psHciContext = 1679 ((phHciNfc_sContext_t *)psHciHandle); 1680 1681 if( (NULL == psHciContext) 1682 || (NULL == pHwRef) 1683 ) 1684 { 1685 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 1686 } 1687 else 1688 { 1689 psHciContext->p_hw_ref = pHwRef; 1690 status = phHciNfc_FSM_Update ( psHciContext, hciState_IO ); 1691 if (NFCSTATUS_SUCCESS == status) 1692 { 1693 status = phHciNfc_DevMgmt_Configure(psHciContext, pHwRef, 1694 (uint16_t)config_type, config_value); 1695 1696 if( NFCSTATUS_PENDING != status ) 1697 { 1698 /* Roll Back the State Machine to its Original State */ 1699 phHciNfc_FSM_Rollback ( psHciContext ); 1700 } 1701 } 1702 } 1703 return status; 1704 } 1705 1706 NFCSTATUS 1707 phHciNfc_System_Get_Info( 1708 void *psHciHandle, 1709 void *pHwRef, 1710 uint32_t config_type, 1711 uint8_t *p_config_value 1712 ) 1713 { 1714 NFCSTATUS status = NFCSTATUS_SUCCESS; 1715 phHciNfc_sContext_t *psHciContext = 1716 ((phHciNfc_sContext_t *)psHciHandle); 1717 1718 if( (NULL == psHciContext) 1719 || (NULL == pHwRef) 1720 || (NULL == p_config_value) 1721 ) 1722 { 1723 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 1724 } 1725 else 1726 { 1727 psHciContext->p_hw_ref = pHwRef; 1728 status = phHciNfc_FSM_Update ( psHciContext, hciState_IO ); 1729 if (NFCSTATUS_SUCCESS == status) 1730 { 1731 status = phHciNfc_DevMgmt_Get_Info(psHciContext, pHwRef, 1732 (uint16_t)config_type, p_config_value); 1733 1734 if( NFCSTATUS_PENDING != status ) 1735 { 1736 /* Roll Back the State Machine to its Original State */ 1737 phHciNfc_FSM_Rollback ( psHciContext ); 1738 } 1739 } 1740 } 1741 1742 return status; 1743 } 1744 1745 1746 NFCSTATUS 1747 phHciNfc_Get_Link_Status( 1748 void *psHciHandle, 1749 void *pHwRef 1750 ) 1751 { 1752 NFCSTATUS status = NFCSTATUS_SUCCESS; 1753 phHciNfc_sContext_t *psHciContext = 1754 ((phHciNfc_sContext_t *)psHciHandle); 1755 1756 if( (NULL == psHciContext) 1757 || (NULL == pHwRef) 1758 ) 1759 { 1760 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 1761 } 1762 else 1763 { 1764 psHciContext->p_hw_ref = pHwRef; 1765 status = phHciNfc_FSM_Update ( psHciContext, hciState_IO ); 1766 if (NFCSTATUS_SUCCESS == status) 1767 { 1768 status = phHciNfc_LinkMgmt_Open(psHciContext, pHwRef); 1769 1770 if( NFCSTATUS_PENDING != status ) 1771 { 1772 /* Roll Back the State Machine to its Original State */ 1773 phHciNfc_FSM_Rollback ( psHciContext ); 1774 } 1775 } 1776 } 1777 1778 return status; 1779 } 1780 1781 1782 1783