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_Jewel.c * 22 * \brief HCI Jewel/Topaz Management Routines. * 23 * * 24 * * 25 * Project: NFC-FRI-1.1 * 26 * * 27 * $Date: Mon Mar 29 17:34:47 2010 $ * 28 * $Author: ing04880 $ * 29 * $Revision: 1.8 $ * 30 * $Aliases: NFC_FRI1.1_WK1007_R33_4,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 ***************************** Header File Inclusion **************************** 37 */ 38 #include <phNfcCompId.h> 39 #include <phHciNfc_Pipe.h> 40 #include <phHciNfc_RFReader.h> 41 #include <phOsalNfc.h> 42 43 #if defined(TYPE_JEWEL) 44 #include <phHciNfc_Jewel.h> 45 46 /* 47 ****************************** Macro Definitions ******************************* 48 */ 49 #define JEWEL_SINGLE_TAG_FOUND 0x00U 50 #define JEWEL_MULTIPLE_TAGS_FOUND 0x03U 51 #define NXP_WRA_CONTINUE_ACTIVATION 0x12U 52 53 #define NXP_JEWEL_READID 0x78U 54 #define NXP_JEWEL_READID_LENGTH 0x06U 55 56 /* 57 *************************** Structure and Enumeration *************************** 58 */ 59 60 /* 61 *************************** Static Function Declaration ************************** 62 */ 63 64 static 65 NFCSTATUS 66 phHciNfc_Recv_Jewel_Response( 67 void *psContext, 68 void *pHwRef, 69 uint8_t *pResponse, 70 #ifdef ONE_BYTE_LEN 71 uint8_t length 72 #else 73 uint16_t length 74 #endif 75 ); 76 77 static 78 NFCSTATUS 79 phHciNfc_Recv_Jewel_Event( 80 void *psContext, 81 void *pHwRef, 82 uint8_t *pEvent, 83 #ifdef ONE_BYTE_LEN 84 uint8_t length 85 #else 86 uint16_t length 87 #endif 88 ); 89 90 static 91 NFCSTATUS 92 phHciNfc_Jewel_InfoUpdate( 93 phHciNfc_sContext_t *psHciContext, 94 uint8_t index, 95 uint8_t *reg_value, 96 uint8_t reg_length 97 ); 98 99 static 100 NFCSTATUS 101 phHciNfc_Recv_Jewel_Packet( 102 phHciNfc_sContext_t *psHciContext, 103 uint8_t *pResponse, 104 #ifdef ONE_BYTE_LEN 105 uint8_t length 106 #else 107 uint16_t length 108 #endif 109 ); 110 111 112 NFCSTATUS 113 phHciNfc_Jewel_Get_PipeID( 114 phHciNfc_sContext_t *psHciContext, 115 uint8_t *ppipe_id 116 ) 117 { 118 NFCSTATUS status = NFCSTATUS_SUCCESS; 119 120 if( (NULL != psHciContext) 121 && ( NULL != ppipe_id ) 122 && ( NULL != psHciContext->p_jewel_info ) 123 ) 124 { 125 phHciNfc_Jewel_Info_t *ps_jewel_info = NULL; 126 ps_jewel_info = (phHciNfc_Jewel_Info_t *)psHciContext->p_jewel_info; 127 *ppipe_id = ps_jewel_info->pipe_id; 128 } 129 else 130 { 131 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 132 } 133 return status; 134 } 135 136 NFCSTATUS 137 phHciNfc_Jewel_Init_Resources( 138 phHciNfc_sContext_t *psHciContext 139 ) 140 { 141 NFCSTATUS status = NFCSTATUS_SUCCESS; 142 phHciNfc_Jewel_Info_t *ps_jewel_info = NULL; 143 if( NULL == psHciContext ) 144 { 145 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 146 } 147 else 148 { 149 if( 150 ( NULL == psHciContext->p_jewel_info ) && 151 (phHciNfc_Allocate_Resource((void **)(&ps_jewel_info), 152 sizeof(phHciNfc_Jewel_Info_t))== NFCSTATUS_SUCCESS) 153 ) 154 { 155 psHciContext->p_jewel_info = ps_jewel_info; 156 ps_jewel_info->current_seq = JEWEL_INVALID_SEQ; 157 ps_jewel_info->next_seq = JEWEL_INVALID_SEQ; 158 ps_jewel_info->pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID; 159 } 160 else 161 { 162 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES); 163 } 164 165 } 166 return status; 167 } 168 169 NFCSTATUS 170 phHciNfc_Jewel_Update_PipeInfo( 171 phHciNfc_sContext_t *psHciContext, 172 uint8_t pipeID, 173 phHciNfc_Pipe_Info_t *pPipeInfo 174 ) 175 { 176 NFCSTATUS status = NFCSTATUS_SUCCESS; 177 178 if( NULL == psHciContext ) 179 { 180 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 181 } 182 else if(NULL == psHciContext->p_jewel_info) 183 { 184 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 185 } 186 else 187 { 188 phHciNfc_Jewel_Info_t *ps_jewel_info=NULL; 189 ps_jewel_info = (phHciNfc_Jewel_Info_t *)psHciContext->p_jewel_info ; 190 191 /* Update the pipe_id of the Jewel Gate obtained from the HCI 192 Response */ 193 ps_jewel_info->pipe_id = pipeID; 194 ps_jewel_info->p_pipe_info = pPipeInfo; 195 /* Update the Response Receive routine of the Jewel Gate */ 196 pPipeInfo->recv_resp = phHciNfc_Recv_Jewel_Response; 197 /* Update the event Receive routine of the Jewel Gate */ 198 pPipeInfo->recv_event = phHciNfc_Recv_Jewel_Event; 199 } 200 201 return status; 202 } 203 204 205 NFCSTATUS 206 phHciNfc_Jewel_Update_Info( 207 phHciNfc_sContext_t *psHciContext, 208 uint8_t infotype, 209 void *jewel_info 210 ) 211 { 212 NFCSTATUS status = NFCSTATUS_SUCCESS; 213 214 if (NULL == psHciContext) 215 { 216 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 217 } 218 else if(NULL == psHciContext->p_jewel_info) 219 { 220 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 221 } 222 else 223 { 224 phHciNfc_Jewel_Info_t *ps_jewel_info=NULL; 225 ps_jewel_info = (phHciNfc_Jewel_Info_t *) 226 psHciContext->p_jewel_info ; 227 228 switch(infotype) 229 { 230 case HCI_JEWEL_ENABLE: 231 { 232 if (NULL != jewel_info) 233 { 234 ps_jewel_info->enable_jewel_gate = 235 *((uint8_t *)jewel_info); 236 } 237 break; 238 } 239 case HCI_JEWEL_INFO_SEQ: 240 { 241 ps_jewel_info->current_seq = JEWEL_READID_SEQUENCE; 242 ps_jewel_info->next_seq = JEWEL_READID_SEQUENCE; 243 break; 244 } 245 default: 246 { 247 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 248 break; 249 } 250 } 251 } 252 return status; 253 } 254 255 NFCSTATUS 256 phHciNfc_Jewel_Info_Sequence ( 257 void *psHciHandle, 258 void *pHwRef 259 ) 260 { 261 NFCSTATUS status = NFCSTATUS_SUCCESS; 262 phHciNfc_sContext_t *psHciContext = 263 ((phHciNfc_sContext_t *)psHciHandle); 264 static uint8_t paraminfo[NXP_JEWEL_READID_LENGTH + 1] = {0}; 265 266 if( (NULL == psHciContext) 267 || (NULL == pHwRef) 268 ) 269 { 270 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 271 } 272 else if((NULL == psHciContext->p_jewel_info) || 273 (HCI_JEWEL_ENABLE != 274 ((phHciNfc_Jewel_Info_t *)(psHciContext->p_jewel_info))-> 275 enable_jewel_gate)) 276 { 277 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 278 } 279 else 280 { 281 phHciNfc_Jewel_Info_t *ps_jewel_info=NULL; 282 phHciNfc_Pipe_Info_t *ps_pipe_info=NULL; 283 uint8_t pipeid = 0; 284 285 ps_jewel_info = (phHciNfc_Jewel_Info_t *) 286 psHciContext->p_jewel_info ; 287 ps_pipe_info = ps_jewel_info->p_pipe_info; 288 if(NULL == ps_pipe_info ) 289 { 290 status = PHNFCSTVAL(CID_NFC_HCI, 291 NFCSTATUS_INVALID_HCI_SEQUENCE); 292 } 293 else 294 { 295 switch(ps_jewel_info->current_seq) 296 { 297 case JEWEL_READID_SEQUENCE: 298 { 299 pipeid = ps_pipe_info->pipe.pipe_id; 300 ps_pipe_info->reg_index = NXP_JEWEL_READID; 301 paraminfo[0] = NXP_JEWEL_READID; 302 303 ps_pipe_info->param_info = (void *)¶minfo; 304 ps_pipe_info->param_length = NXP_JEWEL_READID_LENGTH + 1; 305 306 status = phHciNfc_Send_Jewel_Command(psHciContext, 307 pHwRef, pipeid, 308 NXP_JEWEL_RAW); 309 310 if(NFCSTATUS_PENDING == status ) 311 { 312 ps_jewel_info->next_seq = JEWEL_END_SEQUENCE; 313 } 314 break; 315 } 316 case JEWEL_END_SEQUENCE: 317 { 318 phNfc_sCompletionInfo_t CompInfo; 319 320 ps_pipe_info->reg_index = JEWEL_END_SEQUENCE; 321 if (JEWEL_MULTIPLE_TAGS_FOUND == 322 ps_jewel_info->multiple_tgts_found) 323 { 324 CompInfo.status = NFCSTATUS_MULTIPLE_TAGS; 325 } 326 else 327 { 328 CompInfo.status = NFCSTATUS_SUCCESS; 329 } 330 331 CompInfo.info = &(ps_jewel_info->s_jewel_info); 332 333 ps_jewel_info->s_jewel_info.RemDevType = phHal_eJewel_PICC; 334 ps_jewel_info->current_seq = JEWEL_READID_SEQUENCE; 335 ps_jewel_info->next_seq = JEWEL_READID_SEQUENCE; 336 status = NFCSTATUS_SUCCESS; 337 /* Notify to the upper layer */ 338 phHciNfc_Tag_Notify(psHciContext, pHwRef, 339 NFC_NOTIFY_TARGET_DISCOVERED, 340 &CompInfo); 341 break; 342 } 343 default: 344 { 345 status = PHNFCSTVAL(CID_NFC_HCI, 346 NFCSTATUS_INVALID_HCI_RESPONSE); 347 break; 348 } 349 } 350 } 351 } 352 return status; 353 } 354 355 static 356 NFCSTATUS 357 phHciNfc_Jewel_InfoUpdate( 358 phHciNfc_sContext_t *psHciContext, 359 uint8_t index, 360 uint8_t *reg_value, 361 uint8_t reg_length 362 ) 363 { 364 NFCSTATUS status = NFCSTATUS_SUCCESS; 365 phHciNfc_Jewel_Info_t *ps_jewel_info = NULL; 366 phHal_sJewelInfo_t *ps_jewel_tag_info = NULL; 367 368 ps_jewel_info = (phHciNfc_Jewel_Info_t *)(psHciContext->p_jewel_info); 369 ps_jewel_tag_info = &(ps_jewel_info->s_jewel_info.RemoteDevInfo.Jewel_Info); 370 371 switch(index) 372 { 373 case NXP_JEWEL_READID: 374 { 375 HCI_PRINT_BUFFER("\tJewel ID", reg_value, reg_length); 376 if(NXP_JEWEL_READID_LENGTH == reg_length) 377 { 378 uint8_t i = 0; 379 ps_jewel_tag_info->HeaderRom0 = reg_value[i++]; 380 ps_jewel_tag_info->HeaderRom1 = reg_value[i++]; 381 (void)memcpy(ps_jewel_tag_info->Uid, 382 &(reg_value[i]), 383 (reg_length - i)); 384 385 ps_jewel_tag_info->UidLength = (reg_length - i); 386 } 387 else 388 { 389 status = PHNFCSTVAL(CID_NFC_HCI, 390 NFCSTATUS_INVALID_HCI_RESPONSE); 391 } 392 break; 393 } 394 default: 395 { 396 status = PHNFCSTVAL(CID_NFC_HCI, 397 NFCSTATUS_INVALID_HCI_RESPONSE); 398 break; 399 } 400 } 401 return status; 402 } 403 404 static 405 NFCSTATUS 406 phHciNfc_Recv_Jewel_Packet( 407 phHciNfc_sContext_t *psHciContext, 408 uint8_t *pResponse, 409 #ifdef ONE_BYTE_LEN 410 uint8_t length 411 #else 412 uint16_t length 413 #endif 414 ) 415 { 416 NFCSTATUS status = NFCSTATUS_SUCCESS; 417 phHciNfc_Jewel_Info_t *ps_jewel_info = (phHciNfc_Jewel_Info_t *) 418 (psHciContext->p_jewel_info); 419 420 if (NXP_JEWEL_READID == ps_jewel_info->p_pipe_info->reg_index) 421 { 422 status = phHciNfc_Jewel_InfoUpdate(psHciContext, 423 ps_jewel_info->p_pipe_info->reg_index, 424 pResponse, (uint8_t)length); 425 } 426 else 427 { 428 /* Send Jewel data to the upper layer */ 429 HCI_PRINT_BUFFER("Jewel Bytes received", pResponse, length); 430 psHciContext->rx_index = HCP_HEADER_LEN; 431 } 432 return status; 433 } 434 435 436 static 437 NFCSTATUS 438 phHciNfc_Recv_Jewel_Response( 439 void *psContext, 440 void *pHwRef, 441 uint8_t *pResponse, 442 #ifdef ONE_BYTE_LEN 443 uint8_t length 444 #else 445 uint16_t length 446 #endif 447 ) 448 { 449 NFCSTATUS status = NFCSTATUS_SUCCESS; 450 phHciNfc_sContext_t *psHciContext = 451 (phHciNfc_sContext_t *)psContext; 452 453 454 if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pResponse) 455 || (0 == length)) 456 { 457 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 458 } 459 else if(NULL == psHciContext->p_jewel_info) 460 { 461 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 462 } 463 else 464 { 465 phHciNfc_Jewel_Info_t *ps_jewel_info=NULL; 466 uint8_t prev_cmd = ANY_GET_PARAMETER; 467 ps_jewel_info = (phHciNfc_Jewel_Info_t *) 468 psHciContext->p_jewel_info ; 469 if( NULL == ps_jewel_info->p_pipe_info) 470 { 471 status = PHNFCSTVAL(CID_NFC_HCI, 472 NFCSTATUS_INVALID_HCI_SEQUENCE); 473 } 474 else 475 { 476 prev_cmd = ps_jewel_info->p_pipe_info->prev_msg ; 477 switch(prev_cmd) 478 { 479 case ANY_GET_PARAMETER: 480 { 481 if (length >= HCP_HEADER_LEN) 482 { 483 status = phHciNfc_Jewel_InfoUpdate(psHciContext, 484 ps_jewel_info->p_pipe_info->reg_index, 485 &pResponse[HCP_HEADER_LEN], 486 (uint8_t)(length - HCP_HEADER_LEN)); 487 } 488 else 489 { 490 status = PHNFCSTVAL(CID_NFC_HCI, 491 NFCSTATUS_INVALID_HCI_RESPONSE); 492 } 493 break; 494 } 495 case ANY_SET_PARAMETER: 496 { 497 HCI_PRINT("Jewel Parameter Set \n"); 498 status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext, 499 UPDATE_SEQ); 500 ps_jewel_info->next_seq = JEWEL_READID_SEQUENCE; 501 break; 502 } 503 case ANY_OPEN_PIPE: 504 { 505 HCI_PRINT("Jewel open pipe complete\n"); 506 status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext, 507 UPDATE_SEQ); 508 ps_jewel_info->next_seq = JEWEL_READID_SEQUENCE; 509 break; 510 } 511 case ANY_CLOSE_PIPE: 512 { 513 HCI_PRINT("Jewel close pipe complete\n"); 514 status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext, 515 UPDATE_SEQ); 516 break; 517 } 518 case NXP_JEWEL_RAW: 519 { 520 HCI_PRINT("Jewel packet received \n"); 521 if (length >= HCP_HEADER_LEN) 522 { 523 phHciNfc_Append_HCPFrame(psHciContext->recv_buffer, 524 0, pResponse, length); 525 psHciContext->rx_total = length; 526 status = phHciNfc_Recv_Jewel_Packet(psHciContext, 527 &pResponse[HCP_HEADER_LEN], 528 (length - HCP_HEADER_LEN)); 529 } 530 else 531 { 532 status = PHNFCSTVAL(CID_NFC_HCI, 533 NFCSTATUS_INVALID_HCI_RESPONSE); 534 } 535 break; 536 } 537 case NXP_WRA_CONTINUE_ACTIVATION: 538 case NXP_WR_ACTIVATE_ID: 539 { 540 HCI_PRINT("Jewel continue activation or "); 541 HCI_PRINT("reactivation completed \n"); 542 status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext, 543 UPDATE_SEQ); 544 break; 545 } 546 case NXP_WR_PRESCHECK: 547 { 548 HCI_PRINT("Presence check completed \n"); 549 break; 550 } 551 case NXP_WR_ACTIVATE_NEXT: 552 { 553 HCI_PRINT("Activate next completed \n"); 554 if (length > HCP_HEADER_LEN) 555 { 556 if (JEWEL_MULTIPLE_TAGS_FOUND == 557 pResponse[HCP_HEADER_LEN]) 558 { 559 ps_jewel_info->multiple_tgts_found = 560 JEWEL_MULTIPLE_TAGS_FOUND; 561 } 562 else 563 { 564 ps_jewel_info->multiple_tgts_found = FALSE; 565 } 566 } 567 else 568 { 569 status = PHNFCSTVAL(CID_NFC_HCI, 570 NFCSTATUS_INVALID_HCI_RESPONSE); 571 } 572 break; 573 } 574 case NXP_WR_DISPATCH_TO_UICC: 575 { 576 switch(length) 577 { 578 case HCP_HEADER_LEN: 579 { 580 /* Optional error code, if no error code field 581 in the response, then this command is 582 successfully completed */ 583 ps_jewel_info->uicc_activation = 584 UICC_CARD_ACTIVATION_SUCCESS; 585 break; 586 } 587 case (HCP_HEADER_LEN + 1): 588 { 589 ps_jewel_info->uicc_activation = 590 pResponse[HCP_HEADER_LEN]; 591 break; 592 } /* End of case (HCP_HEADER_LEN + index) */ 593 default: 594 { 595 status = PHNFCSTVAL(CID_NFC_HCI, 596 NFCSTATUS_INVALID_HCI_RESPONSE); 597 break; 598 } 599 } 600 if (NFCSTATUS_SUCCESS == status) 601 { 602 status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext, 603 UPDATE_SEQ); 604 } 605 break; 606 } 607 default: 608 { 609 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE); 610 break; 611 } 612 } 613 if( NFCSTATUS_SUCCESS == status ) 614 { 615 ps_jewel_info->p_pipe_info->prev_status = NFCSTATUS_SUCCESS; 616 ps_jewel_info->current_seq = ps_jewel_info->next_seq; 617 } 618 } 619 } 620 return status; 621 } 622 623 static 624 NFCSTATUS 625 phHciNfc_Recv_Jewel_Event( 626 void *psContext, 627 void *pHwRef, 628 uint8_t *pEvent, 629 #ifdef ONE_BYTE_LEN 630 uint8_t length 631 #else 632 uint16_t length 633 #endif 634 ) 635 { 636 NFCSTATUS status = NFCSTATUS_SUCCESS; 637 phHciNfc_sContext_t *psHciContext = 638 (phHciNfc_sContext_t *)psContext ; 639 640 if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pEvent) 641 || (0 == length)) 642 { 643 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 644 } 645 else if((NULL == psHciContext->p_jewel_info) || 646 (HCI_JEWEL_ENABLE != 647 ((phHciNfc_Jewel_Info_t *)(psHciContext->p_jewel_info))-> 648 enable_jewel_gate)) 649 { 650 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 651 } 652 else 653 { 654 phHciNfc_HCP_Packet_t *p_packet = NULL; 655 phHciNfc_Jewel_Info_t *ps_jewel_info = NULL; 656 phHciNfc_HCP_Message_t *message = NULL; 657 uint8_t instruction=0, 658 i = 0; 659 660 ps_jewel_info = (phHciNfc_Jewel_Info_t *) 661 psHciContext->p_jewel_info ; 662 p_packet = (phHciNfc_HCP_Packet_t *)pEvent; 663 message = &p_packet->msg.message; 664 /* Get the instruction bits from the Message Header */ 665 instruction = (uint8_t) GET_BITS8( message->msg_header, 666 HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN); 667 668 if ((EVT_TARGET_DISCOVERED == instruction) 669 && ((JEWEL_MULTIPLE_TAGS_FOUND == message->payload[i] ) 670 || (JEWEL_SINGLE_TAG_FOUND == message->payload[i])) 671 ) 672 { 673 static phNfc_sCompletionInfo_t pCompInfo; 674 675 if (JEWEL_MULTIPLE_TAGS_FOUND == message->payload[i]) 676 { 677 ps_jewel_info->multiple_tgts_found = 678 JEWEL_MULTIPLE_TAGS_FOUND; 679 pCompInfo.status = NFCSTATUS_MULTIPLE_TAGS; 680 } 681 else 682 { 683 ps_jewel_info->multiple_tgts_found = FALSE; 684 pCompInfo.status = NFCSTATUS_SUCCESS; 685 } 686 687 psHciContext->host_rf_type = phHal_eJewel_PCD; 688 ps_jewel_info->s_jewel_info.RemDevType = phHal_eJewel_PICC; 689 ps_jewel_info->current_seq = JEWEL_READID_SEQUENCE; 690 691 /* Notify to the HCI Generic layer To Update the FSM */ 692 phHciNfc_Notify_Event(psHciContext, pHwRef, 693 NFC_NOTIFY_TARGET_DISCOVERED, 694 &pCompInfo); 695 696 } 697 else 698 { 699 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE); 700 } 701 } 702 return status; 703 } 704 705 NFCSTATUS 706 phHciNfc_Send_Jewel_Command( 707 phHciNfc_sContext_t *psContext, 708 void *pHwRef, 709 uint8_t pipe_id, 710 uint8_t cmd 711 ) 712 { 713 NFCSTATUS status = NFCSTATUS_SUCCESS; 714 phHciNfc_sContext_t *psHciContext = 715 (phHciNfc_sContext_t *)psContext ; 716 if( (NULL == psHciContext) || (NULL == pHwRef) ) 717 { 718 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 719 } 720 else if((NULL == psHciContext->p_jewel_info) || 721 (HCI_JEWEL_ENABLE != 722 ((phHciNfc_Jewel_Info_t *)(psHciContext->p_jewel_info))-> 723 enable_jewel_gate) || 724 (HCI_UNKNOWN_PIPE_ID == 725 ((phHciNfc_Jewel_Info_t *)(psHciContext->p_jewel_info))-> 726 pipe_id) || 727 (pipe_id != 728 ((phHciNfc_Jewel_Info_t *)(psHciContext->p_jewel_info))-> 729 pipe_id)) 730 { 731 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 732 } 733 else 734 { 735 phHciNfc_Jewel_Info_t *ps_jewel_info=NULL; 736 phHciNfc_Pipe_Info_t *ps_pipe_info=NULL; 737 phHciNfc_HCP_Packet_t *hcp_packet = NULL; 738 phHciNfc_HCP_Message_t *hcp_message = NULL; 739 uint8_t i = 0, 740 length = HCP_HEADER_LEN; 741 742 ps_jewel_info = (phHciNfc_Jewel_Info_t *) 743 psHciContext->p_jewel_info ; 744 ps_pipe_info = ps_jewel_info->p_pipe_info; 745 if(NULL == ps_pipe_info ) 746 { 747 status = PHNFCSTVAL(CID_NFC_HCI, 748 NFCSTATUS_INVALID_HCI_SEQUENCE); 749 } 750 else 751 { 752 psHciContext->tx_total = 0 ; 753 hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer; 754 755 if (NXP_JEWEL_RAW == cmd) 756 { 757 /* Construct the HCP Frame */ 758 phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT, 759 (uint8_t) pipe_id, HCP_MSG_TYPE_COMMAND, cmd); 760 hcp_message = &(hcp_packet->msg.message); 761 phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload, 762 i, (uint8_t *)ps_pipe_info->param_info, 763 ps_pipe_info->param_length); 764 length =(uint8_t)(length + i + ps_pipe_info->param_length); 765 } 766 else 767 { 768 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_COMMAND); 769 } 770 771 if (NFCSTATUS_SUCCESS == status) 772 { 773 ps_pipe_info->sent_msg_type = (uint8_t)HCP_MSG_TYPE_COMMAND; 774 ps_pipe_info->prev_msg = cmd; 775 psHciContext->tx_total = length; 776 psHciContext->response_pending = TRUE; 777 778 /* Send the Constructed HCP packet to the lower layer */ 779 status = phHciNfc_Send_HCP( psHciContext, pHwRef); 780 ps_pipe_info->prev_status = status; 781 } 782 } 783 } 784 return status; 785 } 786 787 NFCSTATUS 788 phHciNfc_Jewel_GetRID( 789 phHciNfc_sContext_t *psHciContext, 790 void *pHwRef) 791 { 792 NFCSTATUS status = NFCSTATUS_SUCCESS; 793 static uint8_t reader_id_info[NXP_JEWEL_READID_LENGTH] = {0}; 794 795 if( (NULL == psHciContext) || (NULL == pHwRef)) 796 { 797 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 798 } 799 else if((NULL == psHciContext->p_jewel_info) || 800 (HCI_JEWEL_ENABLE != 801 ((phHciNfc_Jewel_Info_t *)(psHciContext->p_jewel_info))-> 802 enable_jewel_gate)) 803 { 804 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 805 } 806 else 807 { 808 phHciNfc_Jewel_Info_t *ps_jewel_info=NULL; 809 phHciNfc_Pipe_Info_t *ps_pipe_info=NULL; 810 uint8_t pipeid = 0; 811 812 ps_jewel_info = (phHciNfc_Jewel_Info_t *) 813 psHciContext->p_jewel_info ; 814 815 ps_pipe_info = ps_jewel_info->p_pipe_info; 816 if(NULL == ps_pipe_info ) 817 { 818 status = PHNFCSTVAL(CID_NFC_HCI, 819 NFCSTATUS_INVALID_HCI_SEQUENCE); 820 } 821 else 822 { 823 pipeid = ps_jewel_info->pipe_id ; 824 reader_id_info[0] = NXP_JEWEL_READID; 825 826 ps_pipe_info->param_info = (void *)&reader_id_info; 827 ps_pipe_info->param_length = NXP_JEWEL_READID_LENGTH + 1 ; 828 829 status = phHciNfc_Send_Jewel_Command(psHciContext, 830 pHwRef, pipeid, 831 NXP_JEWEL_RAW); 832 } 833 } 834 return status; 835 } 836 837 #endif /* #if defined(TYPE_JEWEL) */ 838 839 840