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_Emulation.c * 22 * \brief HCI Emulation management routines. * 23 * * 24 * * 25 * Project: NFC-FRI-1.1 * 26 * * 27 * $Date: Tue Jun 8 09:30:37 2010 $ * 28 * $Author: ing04880 $ * 29 * $Revision: 1.52 $ * 30 * $Aliases: NFC_FRI1.1_WK1023_R35_1 $ 31 * * 32 * =========================================================================== * 33 */ 34 35 /* 36 ***************************** Header File Inclusion **************************** 37 */ 38 #include <phNfcConfig.h> 39 #include <phNfcCompId.h> 40 #include <phNfcHalTypes.h> 41 #include <phHciNfc_Pipe.h> 42 #include <phHciNfc_Emulation.h> 43 #include <phHciNfc_WI.h> 44 #include <phHciNfc_SWP.h> 45 #ifdef ENABLE_P2P 46 #include <phHciNfc_NfcIPMgmt.h> 47 #endif 48 #ifdef HOST_EMULATION 49 #include <phHciNfc_CE_A.h> 50 #include <phHciNfc_CE_B.h> 51 #endif 52 #include <phOsalNfc.h> 53 /* 54 ****************************** Macro Definitions ******************************* 55 */ 56 57 58 59 /* 60 *************************** Structure and Enumeration *************************** 61 */ 62 63 /** \defgroup grp_hci_nfc HCI Emulation Management Component 64 * 65 * 66 */ 67 68 typedef enum phHciNfc_EmulationMgmt_Seq{ 69 NFCIP_TARGET_PIPE_OPEN = 0x00U, 70 NFCIP_TARGET_MODE_CONFIG, 71 NFCIP_TARGET_MERGE_SAK, 72 NFCIP_TARGET_PIPE_CLOSE, 73 74 HOST_CE_A_INIT, 75 HOST_CE_A_RELEASE, 76 77 HOST_CE_B_INIT, 78 HOST_CE_B_RELEASE, 79 80 WI_PIPE_OPEN, 81 WI_ENABLE_EMULATION, 82 WI_DEFAULT_EMULATION, 83 WI_DISABLE_EMULATION, 84 85 WI_ENABLE_NOTIFICATION, 86 WI_DISABLE_NOTIFICATION, 87 88 WI_SWITCH_WIRED_MODE, 89 WI_SWITCH_DEFAULT_MODE, 90 91 WI_PIPE_CLOSE, 92 93 SWP_PIPE_OPEN, 94 SWP_ENABLE_EMULATION, 95 SWP_DEFAULT_EMULATION, 96 SWP_DETECTION, 97 SWP_DISABLE_EMULATION, 98 SWP_GET_BIT_RATE, 99 SWP_PIPE_CLOSE, 100 101 CONFIG_DEFAULT_EMULATION, 102 103 END_EMULATION_SEQ 104 } phHciNfc_EmulationMgmt_Seq_t; 105 106 typedef struct phHciNfc_EmulationMgmt_Info{ 107 phHal_eEmulationType_t se_default; 108 uint8_t smx_powerless; 109 uint8_t uicc_enable; 110 uint8_t uicc_powerless; 111 uint8_t uicc_id; 112 /* Application ID of the UICC Transaction performed */ 113 uint8_t uicc_aid[MAX_AID_LEN]; 114 uint8_t uicc_param[MAX_UICC_PARAM_LEN]; 115 uint8_t uicc_param_len; 116 phHciNfc_Pipe_Info_t *p_uicc_pipe_info; 117 phHciNfc_EmulationMgmt_Seq_t emulation_cur_seq; 118 phHciNfc_EmulationMgmt_Seq_t emulation_next_seq; 119 120 121 } phHciNfc_EmulationMgmt_Info_t; 122 123 124 /* 125 *************************** Static Function Declaration ************************** 126 */ 127 128 static 129 NFCSTATUS 130 phHciNfc_Recv_Uicc_Cmd ( 131 void *psContext, 132 void *pHwRef, 133 uint8_t *pCmd, 134 #ifdef ONE_BYTE_LEN 135 uint8_t length 136 #else 137 uint16_t length 138 #endif 139 ); 140 141 static 142 NFCSTATUS 143 phHciNfc_Recv_Uicc_Event ( 144 void *psContext, 145 void *pHwRef, 146 uint8_t *pEvent, 147 #ifdef ONE_BYTE_LEN 148 uint8_t length 149 #else 150 uint16_t length 151 #endif 152 ); 153 154 155 /* 156 *************************** Function Definitions *************************** 157 */ 158 159 void 160 phHciNfc_Uicc_Connectivity( 161 phHciNfc_sContext_t *psHciContext, 162 void *pHwRef 163 ) 164 { 165 NFCSTATUS status = NFCSTATUS_SUCCESS; 166 phHciNfc_Pipe_Info_t *pPipeInfo = NULL; 167 phHciNfc_EmulationMgmt_Info_t *p_emulation_mgmt_info = NULL; 168 169 if( NULL != psHciContext->p_emulation_mgmt_info ) 170 { 171 p_emulation_mgmt_info = (phHciNfc_EmulationMgmt_Info_t *) 172 psHciContext->p_emulation_mgmt_info ; 173 pPipeInfo = psHciContext->p_pipe_list[NXP_PIPE_CONNECTIVITY]; 174 if( (TRUE == ((phHal_sHwReference_t *)pHwRef)->uicc_connected) 175 && (NULL == pPipeInfo)) 176 { 177 status = phHciNfc_Allocate_Resource((void **)&pPipeInfo, 178 sizeof(phHciNfc_Pipe_Info_t)); 179 if((NULL != pPipeInfo) 180 && (NFCSTATUS_SUCCESS == status)) 181 { 182 /* The Source Host is the UICC Host */ 183 pPipeInfo->pipe.source.host_id = 184 (uint8_t) phHciNfc_UICCHostID; 185 /* The Source Gate is same as the Destination Gate */ 186 pPipeInfo->pipe.source.gate_id = 187 (uint8_t) phHciNfc_ConnectivityGate; 188 /* The Destination Host is the Terminal Host */ 189 pPipeInfo->pipe.dest.host_id = 190 (uint8_t) phHciNfc_TerminalHostID; 191 /* The Source Gate is same as the Destination Gate */ 192 pPipeInfo->pipe.dest.gate_id = 193 (uint8_t) phHciNfc_ConnectivityGate; 194 /* The Pipe ID is Hardcoded to Connectivity */ 195 pPipeInfo->pipe.pipe_id = (uint8_t) NXP_PIPE_CONNECTIVITY; 196 197 198 status = phHciNfc_Uicc_Update_PipeInfo(psHciContext, 199 NXP_PIPE_CONNECTIVITY, pPipeInfo); 200 if (NFCSTATUS_SUCCESS == status) 201 { 202 psHciContext->p_pipe_list[NXP_PIPE_CONNECTIVITY] = pPipeInfo; 203 p_emulation_mgmt_info->uicc_enable = TRUE; 204 } 205 else 206 { 207 (void)phOsalNfc_FreeMemory(pPipeInfo); 208 } 209 } 210 } 211 } 212 return; 213 } 214 215 /*! 216 * \brief Get the pipe_id of Connectivity Managment Gate. 217 * 218 * This function Get the pipe_id of Connectivity Managment Gate. 219 * 220 */ 221 222 223 NFCSTATUS 224 phHciNfc_Uicc_Get_PipeID( 225 phHciNfc_sContext_t *psHciContext, 226 uint8_t *ppipe_id 227 ) 228 { 229 NFCSTATUS status = NFCSTATUS_SUCCESS; 230 phHciNfc_EmulationMgmt_Info_t *p_emulation_mgmt_info = NULL; 231 if( (NULL != psHciContext) 232 && ( NULL != ppipe_id ) 233 && ( NULL != psHciContext->p_emulation_mgmt_info ) 234 ) 235 { 236 p_emulation_mgmt_info = (phHciNfc_EmulationMgmt_Info_t *) 237 psHciContext->p_emulation_mgmt_info ; 238 *ppipe_id = p_emulation_mgmt_info->uicc_id ; 239 } 240 else 241 { 242 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 243 } 244 return status; 245 } 246 247 248 /* Function to Update the Pipe Information */ 249 NFCSTATUS 250 phHciNfc_Uicc_Update_PipeInfo( 251 phHciNfc_sContext_t *psHciContext, 252 uint8_t pipe_id, 253 phHciNfc_Pipe_Info_t *pPipeInfo 254 ) 255 { 256 phHciNfc_EmulationMgmt_Info_t *p_emulation_mgmt_info=NULL; 257 NFCSTATUS status = NFCSTATUS_SUCCESS; 258 259 if( NULL == psHciContext ) 260 { 261 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 262 } 263 else if ( NULL == psHciContext->p_emulation_mgmt_info ) 264 { 265 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); 266 } 267 else 268 { 269 p_emulation_mgmt_info = (phHciNfc_EmulationMgmt_Info_t *) 270 psHciContext->p_emulation_mgmt_info ; 271 /* Update the pipe_id of the Connectivity Gate 272 * obtained from the HCI Response */ 273 p_emulation_mgmt_info->uicc_id = pipe_id; 274 p_emulation_mgmt_info->p_uicc_pipe_info = pPipeInfo; 275 if ( NULL != pPipeInfo) 276 { 277 /* Update the Response Receive routine of the Connectivity Gate */ 278 /* pPipeInfo->recv_resp = phHciNfc_Recv_Uicc_Response; */ 279 pPipeInfo->recv_cmd = &phHciNfc_Recv_Uicc_Cmd; 280 pPipeInfo->recv_event = &phHciNfc_Recv_Uicc_Event; 281 } 282 } 283 284 return status; 285 } 286 287 288 /*! 289 * \brief Updates the Sequence of Emulation Managment Gate. 290 * 291 * This function Resets/Updates the sequence of the Emulation Management 292 * gate. 293 * 294 */ 295 296 297 NFCSTATUS 298 phHciNfc_EmuMgmt_Update_Seq( 299 phHciNfc_sContext_t *psHciContext, 300 phHciNfc_eSeqType_t seq_type 301 ) 302 { 303 phHciNfc_EmulationMgmt_Info_t *p_emulation_mgmt_info=NULL; 304 NFCSTATUS status = NFCSTATUS_SUCCESS; 305 if( NULL == psHciContext ) 306 { 307 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 308 } 309 else 310 { 311 if( NULL == psHciContext->p_emulation_mgmt_info ) 312 { 313 status = PHNFCSTVAL(CID_NFC_HCI, 314 NFCSTATUS_INVALID_HCI_INFORMATION); 315 } 316 else 317 { 318 p_emulation_mgmt_info = (phHciNfc_EmulationMgmt_Info_t *) 319 psHciContext->p_emulation_mgmt_info ; 320 switch(seq_type) 321 { 322 case RESET_SEQ: 323 case INIT_SEQ: 324 { 325 #ifdef ENABLE_P2P 326 p_emulation_mgmt_info->emulation_cur_seq = NFCIP_TARGET_PIPE_OPEN; 327 #else 328 p_emulation_mgmt_info->emulation_cur_seq = WI_PIPE_OPEN; 329 #endif 330 p_emulation_mgmt_info->emulation_next_seq = END_EMULATION_SEQ ; 331 break; 332 } 333 case UPDATE_SEQ: 334 { 335 p_emulation_mgmt_info->emulation_cur_seq = 336 p_emulation_mgmt_info->emulation_next_seq; 337 break; 338 } 339 case INFO_SEQ: 340 { 341 p_emulation_mgmt_info->emulation_cur_seq = SWP_ENABLE_EMULATION; 342 p_emulation_mgmt_info->emulation_next_seq = END_EMULATION_SEQ ; 343 break; 344 } 345 case REL_SEQ: 346 { 347 p_emulation_mgmt_info->emulation_cur_seq = WI_DISABLE_EMULATION; 348 p_emulation_mgmt_info->emulation_next_seq = END_EMULATION_SEQ ; 349 break; 350 } 351 default: 352 { 353 break; 354 } 355 } 356 } 357 } 358 359 return status; 360 } 361 362 363 /*! 364 * \brief Initialisation of RF Emulation Gates. 365 * 366 * This function initialses the RF Emulation Management and 367 * populates the Reader Management Information Structure 368 * 369 */ 370 371 372 NFCSTATUS 373 phHciNfc_EmuMgmt_Initialise( 374 phHciNfc_sContext_t *psHciContext, 375 void *pHwRef 376 ) 377 { 378 NFCSTATUS status = NFCSTATUS_SUCCESS; 379 phHciNfc_Pipe_Info_t *p_pipe_info = NULL; 380 phHciNfc_EmulationMgmt_Info_t *p_emulation_mgmt_info=NULL; 381 382 if( NULL == psHciContext ) 383 { 384 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 385 } 386 else 387 { 388 389 if( ( NULL == psHciContext->p_emulation_mgmt_info ) 390 && (phHciNfc_Allocate_Resource((void **)(&p_emulation_mgmt_info), 391 sizeof(phHciNfc_EmulationMgmt_Info_t))== NFCSTATUS_SUCCESS) 392 ) 393 { 394 psHciContext->p_emulation_mgmt_info = p_emulation_mgmt_info; 395 #ifdef ENABLE_P2P 396 p_emulation_mgmt_info->emulation_cur_seq = NFCIP_TARGET_PIPE_OPEN; 397 #else 398 p_emulation_mgmt_info->emulation_cur_seq = WI_PIPE_OPEN; 399 #endif 400 p_emulation_mgmt_info->emulation_next_seq = END_EMULATION_SEQ; 401 p_emulation_mgmt_info->uicc_id = (uint8_t)HCI_UNKNOWN_PIPE_ID; 402 } 403 else 404 { 405 p_emulation_mgmt_info = (phHciNfc_EmulationMgmt_Info_t *) 406 psHciContext->p_emulation_mgmt_info ; 407 } 408 409 if( NULL == psHciContext->p_emulation_mgmt_info ) 410 { 411 status = PHNFCSTVAL(CID_NFC_HCI, 412 NFCSTATUS_INSUFFICIENT_RESOURCES); 413 } 414 #ifdef ESTABLISH_SESSION 415 else if(( hciMode_Session == psHciContext->hci_mode ) 416 && (NFCIP_TARGET_PIPE_OPEN == p_emulation_mgmt_info->emulation_cur_seq ) 417 ) 418 { 419 status = NFCSTATUS_SUCCESS; 420 } 421 #endif 422 else 423 { 424 switch(p_emulation_mgmt_info->emulation_cur_seq ) 425 { 426 #ifdef ENABLE_P2P 427 /* NFCIP Target Open sequence */ 428 case NFCIP_TARGET_PIPE_OPEN: 429 { 430 p_pipe_info = ((phHciNfc_NfcIP_Info_t *) 431 psHciContext->p_nfcip_info)->p_tgt_pipe_info; 432 if(NULL == p_pipe_info ) 433 { 434 status = PHNFCSTVAL(CID_NFC_HCI, 435 NFCSTATUS_INVALID_HCI_INFORMATION); 436 } 437 else 438 { 439 status = phHciNfc_Open_Pipe( psHciContext, 440 pHwRef, p_pipe_info ); 441 if(status == NFCSTATUS_SUCCESS) 442 { 443 p_emulation_mgmt_info->emulation_next_seq = 444 NFCIP_TARGET_MODE_CONFIG; 445 status = NFCSTATUS_PENDING; 446 } 447 } 448 break; 449 } 450 /* NFCIP Target Mode Config sequence */ 451 case NFCIP_TARGET_MODE_CONFIG: 452 { 453 #define NFCIP_ACTIVE_SHIFT 0x03U 454 #define NFCIP_PASSIVE_MASK 0x07U 455 uint8_t mode = ( NXP_NFCIP_ACTIVE_DEFAULT << NFCIP_ACTIVE_SHIFT ) | 456 ( DEFAULT_NFCIP_TARGET_MODE_SUPPORT & NFCIP_PASSIVE_MASK ); 457 status = phHciNfc_NfcIP_SetMode( psHciContext, pHwRef, 458 NFCIP_TARGET, mode); 459 if(status == NFCSTATUS_PENDING ) 460 { 461 #ifdef TGT_MERGE_SAK 462 p_emulation_mgmt_info->emulation_next_seq = 463 NFCIP_TARGET_MERGE_SAK; 464 #else 465 p_emulation_mgmt_info->emulation_next_seq = 466 WI_PIPE_OPEN; 467 #endif /* #ifdef TGT_MERGE_SAK */ 468 /* status = NFCSTATUS_SUCCESS; */ 469 } 470 break; 471 } 472 #ifdef TGT_MERGE_SAK 473 /* NFCIP Target SAK Merge sequence */ 474 case NFCIP_TARGET_MERGE_SAK: 475 { 476 status = phHciNfc_NfcIP_SetMergeSak( psHciContext, pHwRef, 477 TRUE ); 478 if(status == NFCSTATUS_PENDING ) 479 { 480 p_emulation_mgmt_info->emulation_next_seq = 481 WI_PIPE_OPEN; 482 /* status = NFCSTATUS_SUCCESS; */ 483 } 484 break; 485 } 486 #endif /* #ifdef TGT_MERGE_SAK */ 487 #endif /* #ifdef ENABLE_P2P */ 488 /* Secure Element WI pipe open sequence */ 489 case WI_PIPE_OPEN: 490 { 491 p_pipe_info = ((phHciNfc_WI_Info_t *) 492 psHciContext->p_wi_info)->p_pipe_info; 493 if(NULL == p_pipe_info ) 494 { 495 status = PHNFCSTVAL(CID_NFC_HCI, 496 NFCSTATUS_INVALID_HCI_INFORMATION); 497 } 498 else 499 { 500 status = phHciNfc_Open_Pipe( psHciContext, 501 pHwRef, p_pipe_info ); 502 if(status == NFCSTATUS_SUCCESS) 503 { 504 #ifdef DISABLE_WI_NOTIFICATION 505 p_emulation_mgmt_info->emulation_next_seq = 506 SWP_PIPE_OPEN; 507 #else 508 p_emulation_mgmt_info->emulation_next_seq = 509 WI_ENABLE_NOTIFICATION; 510 #endif 511 status = NFCSTATUS_PENDING; 512 } 513 } 514 break; 515 } 516 /* Enable the SmartMx Notifications through WI */ 517 case WI_ENABLE_NOTIFICATION: 518 { 519 p_pipe_info = ((phHciNfc_WI_Info_t *) 520 psHciContext->p_wi_info)->p_pipe_info; 521 if(NULL == p_pipe_info ) 522 { 523 status = PHNFCSTVAL(CID_NFC_HCI, 524 NFCSTATUS_INVALID_HCI_INFORMATION); 525 } 526 else 527 { 528 status = phHciNfc_WI_Configure_Notifications( 529 psHciContext, pHwRef, eEnableEvents ); 530 if(status == NFCSTATUS_PENDING) 531 { 532 p_emulation_mgmt_info->emulation_next_seq = 533 SWP_PIPE_OPEN; 534 } 535 } 536 break; 537 } 538 /* Enable the SmartMx Emulation by Default through WI */ 539 case WI_ENABLE_EMULATION: 540 { 541 p_pipe_info = ((phHciNfc_WI_Info_t *) 542 psHciContext->p_wi_info)->p_pipe_info; 543 if(NULL == p_pipe_info ) 544 { 545 status = PHNFCSTVAL(CID_NFC_HCI, 546 NFCSTATUS_INVALID_HCI_INFORMATION); 547 } 548 else 549 { 550 status = phHciNfc_WI_Configure_Default( psHciContext, 551 pHwRef, TRUE ); 552 if(status == NFCSTATUS_PENDING) 553 { 554 p_emulation_mgmt_info->emulation_next_seq = 555 SWP_PIPE_OPEN; 556 } 557 } 558 break; 559 } 560 /* SWP pipe open sequence */ 561 case SWP_PIPE_OPEN: 562 { 563 p_pipe_info = ((phHciNfc_SWP_Info_t *) 564 psHciContext->p_swp_info)->p_pipe_info; 565 if(NULL == p_pipe_info ) 566 { 567 status = PHNFCSTVAL(CID_NFC_HCI, 568 NFCSTATUS_INVALID_HCI_INFORMATION); 569 } 570 else 571 { 572 status = phHciNfc_Open_Pipe( psHciContext, 573 pHwRef, p_pipe_info ); 574 if(status == NFCSTATUS_SUCCESS) 575 { 576 p_emulation_mgmt_info->emulation_next_seq = 577 SWP_ENABLE_EMULATION; 578 #ifndef ESTABLISH_SESSION 579 status = NFCSTATUS_PENDING; 580 #endif 581 } 582 } 583 break; 584 } 585 /* Enable the UICC Emulation through SWP */ 586 case SWP_ENABLE_EMULATION: 587 { 588 p_pipe_info = ((phHciNfc_SWP_Info_t *) 589 psHciContext->p_swp_info)->p_pipe_info; 590 if(NULL == p_pipe_info ) 591 { 592 status = PHNFCSTVAL(CID_NFC_HCI, 593 NFCSTATUS_INVALID_HCI_INFORMATION); 594 } 595 else 596 { 597 #ifdef SWP_EVENT_USAGE 598 status = phHciNfc_SWP_Configure_Mode( psHciContext, pHwRef, 599 UICC_SWITCH_MODE_ON ); 600 /* UICC_SWITCH_MODE_DEFAULT */ 601 #else 602 status = phHciNfc_SWP_Configure_Default( psHciContext, 603 pHwRef, TRUE ); 604 #endif 605 if(status == NFCSTATUS_PENDING) 606 { 607 p_emulation_mgmt_info->emulation_next_seq = 608 SWP_DETECTION; 609 /* status = NFCSTATUS_SUCCESS; */ 610 } 611 } 612 break; 613 } 614 /* Disable the UICC Emulation through SWP */ 615 case SWP_DETECTION: 616 { 617 p_pipe_info = ((phHciNfc_SWP_Info_t *) 618 psHciContext->p_swp_info)->p_pipe_info; 619 if(NULL == p_pipe_info ) 620 { 621 status = PHNFCSTVAL(CID_NFC_HCI, 622 NFCSTATUS_INVALID_HCI_INFORMATION); 623 break; 624 } 625 else 626 { 627 status = phHciNfc_Uicc_Connect_Status( 628 psHciContext, pHwRef ); 629 if(status == NFCSTATUS_SUCCESS) 630 { 631 uint8_t uicc_connect = ((phHciNfc_SWP_Info_t *) 632 psHciContext->p_swp_info)->uicc_status; 633 if(UICC_CONNECTED == uicc_connect) 634 { 635 #ifdef SWP_EVENT_USAGE 636 p_emulation_mgmt_info->emulation_next_seq = 637 SWP_DISABLE_EMULATION; 638 #else 639 p_emulation_mgmt_info->emulation_next_seq = 640 WI_DISABLE_EMULATION; 641 #endif 642 ((phHal_sHwReference_t *) 643 pHwRef)->uicc_connected = TRUE; 644 status = NFCSTATUS_PENDING; 645 } 646 else 647 { 648 status = phHciNfc_SWP_Configure_Mode( psHciContext, 649 pHwRef, UICC_SWITCH_MODE_DEFAULT ); 650 (NFCSTATUS_PENDING == status)? 651 (p_emulation_mgmt_info->emulation_next_seq = 652 WI_DISABLE_EMULATION): 653 (p_emulation_mgmt_info->emulation_next_seq = 654 SWP_DETECTION); 655 break; 656 } 657 } 658 else 659 { 660 break; 661 } 662 } 663 } 664 /* fall through */ 665 /* Disable the SmartMx Emulation through WI */ 666 case WI_DISABLE_EMULATION: 667 { 668 p_pipe_info = ((phHciNfc_WI_Info_t *) 669 psHciContext->p_wi_info)->p_pipe_info; 670 if(NULL == p_pipe_info ) 671 { 672 status = PHNFCSTVAL(CID_NFC_HCI, 673 NFCSTATUS_INVALID_HCI_INFORMATION); 674 } 675 else 676 { 677 status = phHciNfc_WI_Configure_Mode( psHciContext, 678 pHwRef, eSmartMx_Default ); 679 if(status == NFCSTATUS_PENDING) 680 { 681 p_emulation_mgmt_info->emulation_next_seq = 682 SWP_DISABLE_EMULATION; 683 status = NFCSTATUS_SUCCESS; 684 } 685 } 686 break; 687 } 688 #ifndef SWP_EVENT_USAGE 689 /* fall through */ 690 /* Get the UICC Baud Rate Status */ 691 case SWP_GET_BIT_RATE: 692 { 693 p_pipe_info = ((phHciNfc_SWP_Info_t *) 694 psHciContext->p_swp_info)->p_pipe_info; 695 if(NULL == p_pipe_info ) 696 { 697 status = PHNFCSTVAL(CID_NFC_HCI, 698 NFCSTATUS_INVALID_HCI_INFORMATION); 699 } 700 else 701 { 702 status = phHciNfc_SWP_Get_Bitrate( 703 psHciContext, pHwRef ); 704 if(status == NFCSTATUS_PENDING) 705 { 706 p_emulation_mgmt_info->emulation_next_seq = 707 SWP_DISABLE_EMULATION; 708 status = NFCSTATUS_SUCCESS; 709 } 710 } 711 break; 712 } 713 #endif 714 /* fall through */ 715 /* Disable the UICC Emulation through SWP */ 716 case SWP_DISABLE_EMULATION: 717 { 718 p_pipe_info = ((phHciNfc_SWP_Info_t *) 719 psHciContext->p_swp_info)->p_pipe_info; 720 if(NULL == p_pipe_info ) 721 { 722 status = PHNFCSTVAL(CID_NFC_HCI, 723 NFCSTATUS_INVALID_HCI_INFORMATION); 724 } 725 else 726 { 727 status = phHciNfc_SWP_Configure_Mode( psHciContext, 728 pHwRef, UICC_SWITCH_MODE_DEFAULT ); 729 if(status == NFCSTATUS_PENDING) 730 { 731 p_emulation_mgmt_info->emulation_next_seq = 732 WI_DISABLE_EMULATION; 733 /* Disable WI Emulation for Previous Wired 734 * Mode Set */ 735 /* status = NFCSTATUS_SUCCESS; */ 736 } 737 } 738 break; 739 } 740 default: 741 { 742 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE); 743 break; 744 } 745 746 }/* End of the Sequence Switch */ 747 748 }/* End of the Reader Info Memory Check */ 749 750 } /* End of Null Context Check */ 751 752 return status; 753 } 754 755 /*! 756 * \brief Connection Routine for the Uicc. 757 * 758 * This function tries to enable and initialise the UICC connected 759 * through SWP. 760 * 761 */ 762 763 764 NFCSTATUS 765 phHciNfc_Uicc_Connect_Status( 766 phHciNfc_sContext_t *psHciContext, 767 void *pHwRef 768 ) 769 { 770 NFCSTATUS status = NFCSTATUS_SUCCESS; 771 /* phHciNfc_Pipe_Info_t *p_pipe_info = NULL; */ 772 /* phHciNfc_EmulationMgmt_Info_t *p_emulation_mgmt_info=NULL; */ 773 static uint32_t uicc_connection_retry = 0; 774 775 if( NULL == psHciContext ) 776 { 777 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 778 } 779 else 780 { 781 phHciNfc_SWP_Status_t uicc_status = 782 ((phHciNfc_SWP_Info_t *) 783 psHciContext->p_swp_info)->uicc_status; 784 if(uicc_connection_retry == 0) 785 { 786 #ifdef UICC_STATUS_DELAY 787 for( ;uicc_connection_retry < UICC_STATUS_DELAY_COUNT; 788 uicc_connection_retry ++ ); 789 uicc_connection_retry = 0; 790 #endif 791 status = phHciNfc_SWP_Get_Status( 792 psHciContext, pHwRef ); 793 if (NFCSTATUS_PENDING == status) 794 { 795 uicc_connection_retry++; 796 } 797 } 798 else 799 { 800 switch(uicc_status) 801 { 802 case UICC_CONNECTION_ONGOING: 803 case UICC_DISCONNECTION_ONGOING: 804 case UICC_NOT_CONNECTED: 805 { 806 if(uicc_connection_retry < 807 UICC_MAX_CONNECT_RETRY) 808 { 809 status = phHciNfc_SWP_Get_Status( 810 psHciContext, pHwRef ); 811 if (NFCSTATUS_PENDING == status) 812 { 813 uicc_connection_retry++; 814 } 815 } 816 break; 817 } 818 case UICC_CONNECTED: 819 { 820 break; 821 } 822 case UICC_CONNECTION_LOST: 823 case UICC_CONNECTION_FAILED: 824 default: 825 { 826 uicc_connection_retry = 0; 827 break; 828 } 829 } /* End of the Status Switch */ 830 } 831 832 if( NFCSTATUS_PENDING != status ) 833 { 834 uicc_connection_retry = 0; 835 /* Error Scenario due to SWP Disable Config */ 836 } 837 838 } /* End of Null Context Check */ 839 840 return status; 841 } 842 843 /*! 844 * \brief Release of RF Emulation Gate Configuration. 845 * 846 * This function initialses the RF Emulation Management and 847 * populates the Reader Management Information Structure 848 * 849 */ 850 851 852 NFCSTATUS 853 phHciNfc_EmuMgmt_Release( 854 phHciNfc_sContext_t *psHciContext, 855 void *pHwRef 856 ) 857 { 858 NFCSTATUS status = NFCSTATUS_SUCCESS; 859 phHciNfc_Pipe_Info_t *p_pipe_info = NULL; 860 phHciNfc_EmulationMgmt_Info_t *p_emulation_mgmt_info=NULL; 861 862 if( NULL == psHciContext ) 863 { 864 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 865 } 866 else 867 { 868 869 p_emulation_mgmt_info = (phHciNfc_EmulationMgmt_Info_t *) 870 psHciContext->p_emulation_mgmt_info ; 871 872 if( NULL == psHciContext->p_emulation_mgmt_info ) 873 { 874 status = PHNFCSTVAL(CID_NFC_HCI, 875 NFCSTATUS_INSUFFICIENT_RESOURCES); 876 } 877 else 878 { 879 switch(p_emulation_mgmt_info->emulation_cur_seq ) 880 { 881 /* Enable/Disable the SmartMx Emulation through WI 882 * After the power down 883 */ 884 /* Enable the SmartMx Emulation by Default through WI */ 885 case WI_DEFAULT_EMULATION: 886 { 887 p_pipe_info = ((phHciNfc_WI_Info_t *) 888 psHciContext->p_wi_info)->p_pipe_info; 889 if(NULL == p_pipe_info ) 890 { 891 status = PHNFCSTVAL(CID_NFC_HCI, 892 NFCSTATUS_INVALID_HCI_INFORMATION); 893 } 894 else 895 { 896 status = phHciNfc_WI_Configure_Default( psHciContext, 897 pHwRef, p_emulation_mgmt_info->smx_powerless ); 898 if(status == NFCSTATUS_PENDING) 899 { 900 p_emulation_mgmt_info->emulation_next_seq = 901 WI_DISABLE_EMULATION; 902 } 903 } 904 break; 905 } 906 /* SmartMx In Default Mode */ 907 case WI_DISABLE_EMULATION: 908 { 909 p_pipe_info = ((phHciNfc_WI_Info_t *) 910 psHciContext->p_wi_info)->p_pipe_info; 911 if(NULL == p_pipe_info ) 912 { 913 status = PHNFCSTVAL(CID_NFC_HCI, 914 NFCSTATUS_INVALID_HCI_INFORMATION); 915 } 916 else 917 { 918 status = phHciNfc_WI_Configure_Mode( psHciContext, 919 pHwRef, eSmartMx_Default ); 920 if(status == NFCSTATUS_SUCCESS ) 921 { 922 p_emulation_mgmt_info->emulation_next_seq = 923 SWP_DISABLE_EMULATION; 924 status = phHciNfc_EmuMgmt_Update_Seq(psHciContext, 925 UPDATE_SEQ); 926 /* status = NFCSTATUS_PENDING; */ 927 } 928 } 929 break; 930 } 931 /* Enable/Disable the UICC Emulation through SWP 932 * After the power down 933 */ 934 /* Enable the UICC Emulation by Default through SWP */ 935 case SWP_DEFAULT_EMULATION: 936 { 937 p_pipe_info = ((phHciNfc_SWP_Info_t *) 938 psHciContext->p_swp_info)->p_pipe_info; 939 if(NULL == p_pipe_info ) 940 { 941 status = PHNFCSTVAL(CID_NFC_HCI, 942 NFCSTATUS_INVALID_HCI_INFORMATION); 943 } 944 else 945 { 946 status = phHciNfc_SWP_Configure_Default( psHciContext, 947 pHwRef, p_emulation_mgmt_info->uicc_powerless ); 948 if(status == NFCSTATUS_PENDING) 949 { 950 p_emulation_mgmt_info->emulation_next_seq = 951 SWP_DISABLE_EMULATION; 952 /* status = NFCSTATUS_SUCCESS; */ 953 } 954 } 955 break; 956 } 957 /* Disable the UICC Emulation through SWP */ 958 case SWP_DISABLE_EMULATION: 959 { 960 p_pipe_info = ((phHciNfc_SWP_Info_t *) 961 psHciContext->p_swp_info)->p_pipe_info; 962 if(NULL == p_pipe_info ) 963 { 964 status = PHNFCSTVAL(CID_NFC_HCI, 965 NFCSTATUS_INVALID_HCI_INFORMATION); 966 } 967 else 968 { 969 status = phHciNfc_SWP_Configure_Mode( psHciContext, 970 pHwRef, UICC_SWITCH_MODE_DEFAULT ); 971 if(status == NFCSTATUS_PENDING) 972 { 973 p_emulation_mgmt_info->emulation_next_seq = 974 CONFIG_DEFAULT_EMULATION; 975 status = phHciNfc_EmuMgmt_Update_Seq(psHciContext, 976 UPDATE_SEQ); 977 status = NFCSTATUS_SUCCESS; 978 } 979 } 980 break; 981 } 982 /* Configure the Default Secure Element Emulation */ 983 case CONFIG_DEFAULT_EMULATION: 984 { 985 #if 0 986 if(NULL == p_pipe_info ) 987 { 988 status = PHNFCSTVAL(CID_NFC_HCI, 989 NFCSTATUS_INVALID_HCI_INFORMATION); 990 } 991 else 992 { 993 /* status = phHciNfc_DevMgmt_Configure( psHciContext, 994 pHwRef, , ); */ 995 if(status == NFCSTATUS_PENDING) 996 { 997 p_emulation_mgmt_info->emulation_next_seq = 998 END_EMULATION_SEQ; 999 status = phHciNfc_EmuMgmt_Update_Seq(psHciContext, 1000 UPDATE_SEQ); 1001 status = NFCSTATUS_SUCCESS; 1002 } 1003 } 1004 #endif 1005 break; 1006 } 1007 default: 1008 { 1009 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE); 1010 break; 1011 } 1012 1013 }/* End of the Sequence Switch */ 1014 1015 }/* End of the Reader Info Memory Check */ 1016 1017 } /* End of Null Context Check */ 1018 1019 return status; 1020 } 1021 1022 #if 0 1023 NFCSTATUS 1024 phHciNfc_Emulation_Start ( 1025 phHciNfc_sContext_t *psHciContext, 1026 void *pHwRef 1027 ) 1028 { 1029 NFCSTATUS status = NFCSTATUS_SUCCESS; 1030 1031 return status; 1032 } 1033 #endif 1034 1035 NFCSTATUS 1036 phHciNfc_Emulation_Cfg ( 1037 phHciNfc_sContext_t *psHciContext, 1038 void *pHwRef, 1039 phHciNfc_eConfigType_t cfg_type 1040 ) 1041 { 1042 NFCSTATUS status = NFCSTATUS_SUCCESS; 1043 phHciNfc_EmulationMgmt_Info_t *p_emulation_mgmt_info=NULL; 1044 phHal_sEmulationCfg_t *p_emulation_cfg = NULL; 1045 1046 if( (NULL == psHciContext) || (NULL == pHwRef) ) 1047 { 1048 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 1049 } 1050 else if ( ( NULL == psHciContext->p_emulation_mgmt_info ) 1051 || ( NULL == psHciContext->p_config_params ) ) 1052 { 1053 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); 1054 } 1055 else 1056 { 1057 p_emulation_mgmt_info = (phHciNfc_EmulationMgmt_Info_t *) 1058 psHciContext->p_emulation_mgmt_info ; 1059 p_emulation_cfg = psHciContext->p_config_params; 1060 switch(cfg_type) 1061 { 1062 case SMX_WI_CFG: 1063 { 1064 phHal_sSmartMX_Cfg_t *smx_config = 1065 &p_emulation_cfg->config.smartMxCfg; 1066 p_emulation_mgmt_info->smx_powerless = 1067 (uint8_t)(FALSE != smx_config->lowPowerMode ); 1068 status = phHciNfc_WI_Configure_Default( psHciContext, pHwRef, 1069 smx_config->enableEmulation ); 1070 break; 1071 } 1072 case UICC_SWP_CFG: 1073 { 1074 #ifdef SWP_CFG_SEQ 1075 phHal_sUiccEmuCfg_t *uicc_config = 1076 &p_emulation_cfg->config.uiccEmuCfg; 1077 p_emulation_mgmt_info->uicc_powerless = 1078 (uint8_t)(FALSE != uicc_config->lowPowerMode ); 1079 { 1080 #ifdef SWP_EVENT_USAGE 1081 status = phHciNfc_SWP_Configure_Mode( psHciContext, pHwRef, 1082 ((TRUE == uicc_config->enableUicc)? /* UICC_SWITCH_MODE_DEFAULT */ 1083 UICC_SWITCH_MODE_ON :UICC_SWITCH_MODE_OFF)); 1084 #else 1085 status = phHciNfc_SWP_Configure_Default( psHciContext, pHwRef, 1086 uicc_config->enableUicc ); 1087 #endif 1088 } 1089 #else 1090 status = phHciNfc_SWP_Config_Sequence( psHciContext, 1091 pHwRef, p_emulation_cfg); 1092 #endif 1093 break; 1094 } 1095 case SWP_EVT_CFG: 1096 { 1097 phHal_sUiccEmuCfg_t *uicc_config = 1098 &p_emulation_cfg->config.uiccEmuCfg; 1099 p_emulation_mgmt_info->uicc_powerless = 1100 (uint8_t)(FALSE != uicc_config->lowPowerMode ); 1101 { 1102 status = phHciNfc_SWP_Configure_Mode( psHciContext, pHwRef, 1103 ((TRUE == uicc_config->enableUicc)? /* UICC_SWITCH_MODE_DEFAULT */ 1104 UICC_SWITCH_MODE_ON :UICC_SWITCH_MODE_DEFAULT)); 1105 } 1106 break; 1107 } 1108 #ifdef HOST_EMULATION 1109 case NFC_CE_A_CFG: 1110 { 1111 phHal_sHostEmuCfg_A_t *host_ce_a_cfg = 1112 &p_emulation_cfg->config.hostEmuCfg_A; 1113 if(host_ce_a_cfg->enableEmulation == TRUE ) 1114 { 1115 status = phHciNfc_CE_A_Initialise( psHciContext, pHwRef); 1116 } 1117 else 1118 { 1119 status = phHciNfc_CE_A_Release( psHciContext, pHwRef); 1120 } 1121 break; 1122 } 1123 case NFC_CE_B_CFG: 1124 { 1125 phHal_sHostEmuCfg_B_t *host_ce_b_cfg = 1126 &p_emulation_cfg->config.hostEmuCfg_B; 1127 if(host_ce_b_cfg->enableEmulation == TRUE ) 1128 { 1129 status = phHciNfc_CE_B_Initialise( psHciContext, pHwRef); 1130 } 1131 else 1132 { 1133 status = phHciNfc_CE_B_Release( psHciContext, pHwRef); 1134 } 1135 break; 1136 } 1137 #endif 1138 /* case INVALID_CFG: 1139 case POLL_LOOP_CFG: */ 1140 default: 1141 { 1142 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); 1143 break; 1144 } 1145 1146 } /* End of the Configuration Switch */ 1147 } 1148 1149 return status; 1150 } 1151 1152 1153 static 1154 NFCSTATUS 1155 phHciNfc_Recv_Uicc_Cmd ( 1156 void *psContext, 1157 void *pHwRef, 1158 uint8_t *pCmd, 1159 #ifdef ONE_BYTE_LEN 1160 uint8_t length 1161 #else 1162 uint16_t length 1163 #endif 1164 ) 1165 { 1166 uint8_t pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; 1167 uint8_t cmd = (uint8_t) HCP_MSG_INSTRUCTION_INVALID; 1168 uint8_t response = (uint8_t) ANY_OK; 1169 NFCSTATUS status = NFCSTATUS_SUCCESS; 1170 phHciNfc_sContext_t *psHciContext = 1171 (phHciNfc_sContext_t *)psContext ; 1172 phHciNfc_HCP_Packet_t *hcp_packet = NULL; 1173 phHciNfc_HCP_Message_t *hcp_message = NULL; 1174 phHciNfc_Pipe_Info_t *p_pipe_info = NULL; 1175 phHciNfc_EmulationMgmt_Info_t *p_emulation_mgmt_info=NULL; 1176 1177 if( (NULL == psHciContext) 1178 || (NULL == pHwRef) 1179 || (HCP_HEADER_LEN > length ) 1180 ) 1181 { 1182 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 1183 } 1184 else 1185 { 1186 hcp_packet = (phHciNfc_HCP_Packet_t *)pCmd; 1187 hcp_message = &hcp_packet->msg.message; 1188 p_emulation_mgmt_info = psHciContext->p_emulation_mgmt_info; 1189 1190 /* Get the Command instruction bits from the Message Header */ 1191 cmd = (uint8_t) GET_BITS8( hcp_message->msg_header, 1192 HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN); 1193 pipe_id = p_emulation_mgmt_info->uicc_id; 1194 p_pipe_info = psHciContext->p_pipe_list[pipe_id]; 1195 1196 switch( cmd ) 1197 { 1198 /* These are Commands are sent from the UICC Controller */ 1199 case ANY_OPEN_PIPE: 1200 { 1201 p_emulation_mgmt_info->uicc_enable = TRUE ; 1202 break; 1203 } 1204 case ANY_CLOSE_PIPE: 1205 { 1206 if(TRUE != p_emulation_mgmt_info->uicc_enable) 1207 { 1208 response = ANY_E_PIPE_NOT_OPENED; 1209 /* status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FAILED); */ 1210 } 1211 else 1212 { 1213 p_emulation_mgmt_info->uicc_enable = FALSE; 1214 } 1215 break; 1216 } 1217 case ANY_SET_PARAMETER: 1218 case ANY_GET_PARAMETER: 1219 case PRO_HOST_REQUEST: 1220 { 1221 response = ANY_E_CMD_NOT_SUPPORTED; 1222 /* status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_COMMAND_NOT_SUPPORTED);*/ 1223 break; 1224 } 1225 default: 1226 { 1227 response = ANY_E_NOK; 1228 /* status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_COMMAND); */ 1229 break; 1230 } 1231 } 1232 hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer; 1233 phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT, 1234 pipe_id, HCP_MSG_TYPE_RESPONSE, response ); 1235 psHciContext->tx_total = HCP_HEADER_LEN; 1236 status = phHciNfc_Send_HCP( (void *)psHciContext, (void *)pHwRef ); 1237 1238 p_pipe_info->recv_msg_type = HCP_MSG_TYPE_COMMAND; 1239 p_pipe_info->sent_msg_type = HCP_MSG_TYPE_RESPONSE; 1240 p_pipe_info->prev_msg = response ; 1241 p_pipe_info->prev_status = status; 1242 status = NFCSTATUS_SUCCESS; 1243 1244 } 1245 return status; 1246 } 1247 1248 static 1249 NFCSTATUS 1250 phHciNfc_Recv_Uicc_Event ( 1251 void *psContext, 1252 void *pHwRef, 1253 uint8_t *pEvent, 1254 #ifdef ONE_BYTE_LEN 1255 uint8_t length 1256 #else 1257 uint16_t length 1258 #endif 1259 ) 1260 { 1261 uint8_t event = (uint8_t) HCP_MSG_INSTRUCTION_INVALID; 1262 uint32_t i = 0; 1263 NFCSTATUS status = NFCSTATUS_SUCCESS; 1264 phHciNfc_sContext_t *psHciContext = 1265 (phHciNfc_sContext_t *)psContext ; 1266 phHciNfc_HCP_Packet_t *hcp_packet = NULL; 1267 phHciNfc_HCP_Message_t *hcp_message = NULL; 1268 phHal_sEventInfo_t event_info; 1269 phHciNfc_EmulationMgmt_Info_t *p_emulation_mgmt_info = 1270 psHciContext->p_emulation_mgmt_info ; 1271 1272 1273 if( (NULL == p_emulation_mgmt_info) 1274 || ( TRUE != p_emulation_mgmt_info->uicc_enable) 1275 ) 1276 { 1277 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 1278 } 1279 else 1280 { 1281 hcp_packet = (phHciNfc_HCP_Packet_t *)pEvent; 1282 hcp_message = &hcp_packet->msg.message; 1283 1284 /* Get the Event instruction bits from the Message Header */ 1285 event = (uint8_t) GET_BITS8( hcp_message->msg_header, 1286 HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN); 1287 event_info.eventHost = phHal_eUICCHost ; 1288 event_info.eventSource = phHal_ePICC_DevType ; 1289 1290 switch( event ) 1291 { 1292 case EVT_END_OF_TRANSACTION: 1293 { 1294 event_info.eventType = NFC_EVT_END_OF_TRANSACTION; 1295 break; 1296 } 1297 case EVT_TRANSACTION: 1298 { 1299 if(length > HCP_HEADER_LEN + TRANSACTION_MIN_LEN) 1300 { 1301 event_info.eventType = NFC_EVT_TRANSACTION; 1302 1303 for(;i<(length-HCP_HEADER_LEN);) 1304 { 1305 switch (hcp_message->payload[i]) 1306 { 1307 case TRANSACTION_AID: 1308 { 1309 /* AID LENGTH INDEX */ 1310 i++; 1311 /* Fill the event_info.eventInfo.aid 1312 * Structure with the Received Transaction AID. 1313 */ 1314 event_info.eventInfo.aid.length = 1315 hcp_message->payload[i++]; 1316 (void) memcpy((void *)p_emulation_mgmt_info->uicc_aid, 1317 &(hcp_message->payload[i]), 1318 event_info.eventInfo.aid.length ); 1319 event_info.eventInfo.aid.buffer = (uint8_t *) 1320 p_emulation_mgmt_info->uicc_aid; 1321 i = i + event_info.eventInfo.aid.length; 1322 break; 1323 } 1324 case TRANSACTION_PARAM: 1325 { 1326 /* Parameter Length Index */ 1327 i++; 1328 /* Fill the event_info.eventInfo.param 1329 * Structure with the Received Parameter. 1330 */ 1331 p_emulation_mgmt_info->uicc_param_len = 1332 hcp_message->payload[i++]; 1333 (void) memcpy((void *)p_emulation_mgmt_info->uicc_param, 1334 &(hcp_message->payload[i]), 1335 p_emulation_mgmt_info->uicc_param_len ); 1336 event_info.eventInfo.uicc_info.param.length = 1337 p_emulation_mgmt_info->uicc_param_len; 1338 event_info.eventInfo.uicc_info.param.buffer = (uint8_t *) 1339 p_emulation_mgmt_info->uicc_param; 1340 i = i + event_info.eventInfo.uicc_info.param.length; 1341 break; 1342 } 1343 default: 1344 { 1345 1346 status = PHNFCSTVAL( CID_NFC_HCI, 1347 NFCSTATUS_FEATURE_NOT_SUPPORTED ); 1348 i = length; 1349 HCI_DEBUG("%s: Statement Should Not Occur \n", 1350 "phHciNfc_Recv_Uicc_Event"); 1351 break; 1352 } 1353 } /* End of Transaction Switch */ 1354 } 1355 } 1356 break; 1357 } 1358 case EVT_CONNECTIVITY: 1359 { 1360 event_info.eventType = NFC_EVT_CONNECTIVITY; 1361 break; 1362 } 1363 case EVT_OPERATION_ENDED: 1364 { 1365 event_info.eventType = NFC_EVT_OPERATION_ENDED; 1366 break; 1367 } 1368 default: 1369 { 1370 status = PHNFCSTVAL( CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED ); 1371 HCI_DEBUG("%s: Statement Should Not Occur \n","phHciNfc_Recv_Uicc_Event"); 1372 break; 1373 } 1374 } 1375 if ( NFCSTATUS_SUCCESS == status ) 1376 { 1377 phHciNfc_Notify_Event( psHciContext, pHwRef, 1378 NFC_NOTIFY_EVENT, (void *)&event_info ); 1379 } 1380 } 1381 return status; 1382 } 1383 1384 1385