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_IDMgmt.c * 22 * \brief HCI Identity Management Gate Routines. * 23 * * 24 * * 25 * Project: NFC-FRI-1.1 * 26 * * 27 * $Date: Fri Jun 11 11:19:25 2010 $ * 28 * $Author: ing04880 $ * 29 * $Revision: 1.23 $ * 30 * $Aliases: 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_IDMgmt.h> 41 #include <phOsalNfc.h> 42 43 /* 44 ****************************** Macro Definitions ******************************* 45 */ 46 47 #define FW_VERSION_INDEX 0x01U 48 #define HCI_VERSION_INDEX 0x02U 49 #define HW_VERSION_INDEX 0x03U 50 #define VENDOR_NAME_INDEX 0x04U 51 #define MODEL_ID_INDEX 0x05U 52 #define GATES_LIST_INDEX 0x06U 53 #define FULL_VERSION_INDEX 0x10U 54 55 #define VERSION_LEN 0x03U 56 #define GATES_LIST_LEN 0x20U 57 58 /* 59 *************************** Structure and Enumeration *************************** 60 */ 61 62 63 /** \defgroup grp_hci_nfc HCI Identity Management Component 64 * 65 * 66 */ 67 68 typedef enum phHciNfc_IDMgmt_Seq{ 69 IDMGMT_PIPE_OPEN = 0x00U, 70 IDMGMT_GET_FULL_VERSION, 71 IDMGMT_GET_FW_VERSION, 72 IDMGMT_GET_HW_VERSION, 73 IDMGMT_GET_HCI_VERSION, 74 IDMGMT_GET_VENDOR_NAME, 75 IDMGMT_GET_MODEL_ID, 76 IDMGMT_GET_GATES_LIST, 77 IDMGMT_PIPE_CLOSE 78 } phHciNfc_IDMgmt_Seq_t; 79 80 typedef struct phHciNfc_IDMgmt_Info{ 81 phHciNfc_IDMgmt_Seq_t id_cur_seq; 82 phHciNfc_IDMgmt_Seq_t id_next_seq; 83 phHciNfc_Pipe_Info_t *p_pipe_info; 84 uint8_t pipe_id; 85 uint32_t fw_version; 86 uint32_t hw_version; 87 utf8_t vendor_name[VENDOR_NAME_LEN]; 88 uint8_t model_id; 89 uint8_t hci_version; 90 uint8_t gates_list[GATES_LIST_LEN]; 91 uint8_t full_version[NXP_FULL_VERSION_LEN]; 92 } phHciNfc_IDMgmt_Info_t; 93 94 /* 95 *************************** Static Function Declaration ************************** 96 */ 97 98 static 99 NFCSTATUS 100 phHciNfc_IDMgmt_InfoUpdate( 101 phHciNfc_sContext_t *psHciContext, 102 phHal_sHwReference_t *pHwRef, 103 uint8_t index, 104 uint8_t *reg_value, 105 uint8_t reg_length 106 ); 107 108 static 109 NFCSTATUS 110 phHciNfc_Recv_IDMgmt_Response( 111 void *psHciContext, 112 void *pHwRef, 113 uint8_t *pResponse, 114 #ifdef ONE_BYTE_LEN 115 uint8_t length 116 #else 117 uint16_t length 118 #endif 119 ); 120 121 122 /* 123 *************************** Function Definitions *************************** 124 */ 125 126 /*! 127 * \brief Allocates the resources of Identity Managment Gate. 128 * 129 * This function Allocates the resources of the Identity Management 130 * gate Information Structure. 131 * 132 */ 133 134 NFCSTATUS 135 phHciNfc_IDMgmt_Init_Resources( 136 phHciNfc_sContext_t *psHciContext 137 ) 138 { 139 NFCSTATUS status = NFCSTATUS_SUCCESS; 140 phHciNfc_IDMgmt_Info_t *p_identity_info=NULL; 141 if( NULL == psHciContext ) 142 { 143 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 144 } 145 else 146 { 147 if( ( NULL == psHciContext->p_identity_info ) 148 && (phHciNfc_Allocate_Resource((void **)(&p_identity_info), 149 sizeof(phHciNfc_IDMgmt_Info_t))== NFCSTATUS_SUCCESS) 150 ) 151 { 152 psHciContext->p_identity_info = p_identity_info; 153 p_identity_info->id_cur_seq = IDMGMT_PIPE_OPEN; 154 p_identity_info->id_next_seq = IDMGMT_PIPE_OPEN; 155 p_identity_info->pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID; 156 } 157 else 158 { 159 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES); 160 } 161 } 162 return status; 163 } 164 165 /*! 166 * \brief Get the pipe_id of Identity Managment Gate. 167 * 168 * This function Get the pipe_id of Identity Managment Gate. 169 * 170 */ 171 172 173 NFCSTATUS 174 phHciNfc_IDMgmt_Get_PipeID( 175 phHciNfc_sContext_t *psHciContext, 176 uint8_t *ppipe_id 177 ) 178 { 179 NFCSTATUS status = NFCSTATUS_SUCCESS; 180 phHciNfc_IDMgmt_Info_t *p_identity_info=NULL; 181 if( (NULL != psHciContext) 182 && ( NULL != ppipe_id ) 183 && ( NULL != psHciContext->p_identity_info ) 184 ) 185 { 186 p_identity_info = (phHciNfc_IDMgmt_Info_t *) 187 psHciContext->p_identity_info ; 188 *ppipe_id = p_identity_info->pipe_id ; 189 } 190 else 191 { 192 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 193 } 194 return status; 195 } 196 197 NFCSTATUS 198 phHciNfc_IDMgmt_Update_Sequence( 199 phHciNfc_sContext_t *psHciContext, 200 phHciNfc_eSeqType_t reader_seq 201 ) 202 { 203 NFCSTATUS status = NFCSTATUS_SUCCESS; 204 phHciNfc_IDMgmt_Info_t *p_identity_info=NULL; 205 if( NULL == psHciContext ) 206 { 207 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 208 } 209 else 210 { 211 if( NULL == psHciContext->p_identity_info ) 212 { 213 status = PHNFCSTVAL(CID_NFC_HCI, 214 NFCSTATUS_INVALID_HCI_INFORMATION); 215 } 216 else 217 { 218 p_identity_info = (phHciNfc_IDMgmt_Info_t *) 219 psHciContext->p_identity_info ; 220 switch(reader_seq) 221 { 222 case RESET_SEQ: 223 case INIT_SEQ: 224 { 225 p_identity_info->id_cur_seq = IDMGMT_PIPE_OPEN; 226 p_identity_info->id_next_seq = IDMGMT_PIPE_OPEN; 227 break; 228 } 229 case UPDATE_SEQ: 230 { 231 p_identity_info->id_cur_seq = 232 p_identity_info->id_next_seq; 233 break; 234 } 235 case INFO_SEQ: 236 { 237 p_identity_info->id_cur_seq = IDMGMT_GET_FW_VERSION; 238 p_identity_info->id_next_seq = IDMGMT_GET_FW_VERSION; 239 break; 240 } 241 case REL_SEQ: 242 { 243 p_identity_info->id_cur_seq = IDMGMT_PIPE_CLOSE; 244 p_identity_info->id_next_seq = IDMGMT_PIPE_CLOSE; 245 break; 246 } 247 default: 248 { 249 break; 250 } 251 } 252 } 253 } 254 255 return status; 256 257 } 258 259 260 261 /*! 262 * \brief Initialisation of Identity Managment Gate. 263 * 264 * This function initialses the Identity Management gate and 265 * populates the Identity Management Information Structure 266 * 267 */ 268 269 NFCSTATUS 270 phHciNfc_IDMgmt_Initialise( 271 phHciNfc_sContext_t *psHciContext, 272 void *pHwRef 273 ) 274 { 275 NFCSTATUS status = NFCSTATUS_SUCCESS; 276 phHciNfc_Pipe_Info_t *p_pipe_info = NULL; 277 phHciNfc_IDMgmt_Info_t *p_identity_info=NULL; 278 #ifndef ESTABLISH_SESSION 279 uint8_t id_pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID; 280 #endif 281 282 if( NULL == psHciContext ) 283 { 284 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 285 } 286 else 287 { 288 289 if( NULL == psHciContext->p_identity_info ) 290 { 291 status = PHNFCSTVAL(CID_NFC_HCI, 292 NFCSTATUS_INVALID_HCI_INFORMATION); 293 } 294 else 295 { 296 p_identity_info = (phHciNfc_IDMgmt_Info_t *) 297 psHciContext->p_identity_info ; 298 p_pipe_info = p_identity_info->p_pipe_info; 299 if(NULL == p_pipe_info ) 300 { 301 status = PHNFCSTVAL(CID_NFC_HCI, 302 NFCSTATUS_NOT_ALLOWED); 303 } 304 else 305 { 306 switch(p_identity_info->id_cur_seq ) 307 { 308 /* Identity Mgmt pipe open sequence */ 309 case IDMGMT_PIPE_OPEN: 310 { 311 status = phHciNfc_Open_Pipe( psHciContext, 312 pHwRef, p_pipe_info ); 313 if(status == NFCSTATUS_SUCCESS) 314 { 315 p_identity_info->id_next_seq = IDMGMT_GET_FW_VERSION; 316 #ifndef ESTABLISH_SESSION 317 status = NFCSTATUS_PENDING; 318 #endif 319 } 320 break; 321 } 322 #ifndef ESTABLISH_SESSION 323 case IDMGMT_GET_FW_VERSION: 324 { 325 p_pipe_info->reg_index = FW_VERSION_INDEX; 326 id_pipe_id = p_identity_info->pipe_id ; 327 status = 328 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, 329 id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); 330 if(NFCSTATUS_PENDING == status ) 331 { 332 p_identity_info->id_next_seq = IDMGMT_GET_HW_VERSION; 333 /* status = NFCSTATUS_SUCCESS; */ 334 } 335 break; 336 } 337 case IDMGMT_GET_HW_VERSION: 338 { 339 p_pipe_info->reg_index = HW_VERSION_INDEX; 340 id_pipe_id = p_identity_info->pipe_id ; 341 status = 342 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, 343 id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); 344 if(NFCSTATUS_PENDING == status ) 345 { 346 p_identity_info->id_next_seq = IDMGMT_GET_HCI_VERSION; 347 /* status = NFCSTATUS_SUCCESS; */ 348 } 349 break; 350 } 351 case IDMGMT_GET_HCI_VERSION: 352 { 353 p_pipe_info->reg_index = HCI_VERSION_INDEX; 354 id_pipe_id = p_identity_info->pipe_id ; 355 status = 356 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, 357 id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); 358 if(NFCSTATUS_PENDING == status ) 359 { 360 p_identity_info->id_next_seq = IDMGMT_GET_VENDOR_NAME; 361 /* status = NFCSTATUS_SUCCESS; */ 362 } 363 break; 364 } 365 case IDMGMT_GET_VENDOR_NAME: 366 { 367 p_pipe_info->reg_index = VENDOR_NAME_INDEX; 368 id_pipe_id = p_identity_info->pipe_id ; 369 status = 370 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, 371 id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); 372 if(NFCSTATUS_PENDING == status ) 373 { 374 p_identity_info->id_next_seq = IDMGMT_GET_MODEL_ID; 375 /* status = NFCSTATUS_SUCCESS; */ 376 } 377 break; 378 } 379 case IDMGMT_GET_MODEL_ID: 380 { 381 p_pipe_info->reg_index = MODEL_ID_INDEX; 382 id_pipe_id = p_identity_info->pipe_id ; 383 status = 384 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, 385 id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); 386 if(NFCSTATUS_PENDING == status ) 387 { 388 p_identity_info->id_next_seq = IDMGMT_GET_GATES_LIST; 389 /* status = NFCSTATUS_SUCCESS; */ 390 } 391 break; 392 } 393 case IDMGMT_GET_GATES_LIST: 394 { 395 p_pipe_info->reg_index = GATES_LIST_INDEX; 396 id_pipe_id = p_identity_info->pipe_id ; 397 status = 398 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, 399 id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); 400 if(NFCSTATUS_PENDING == status ) 401 { 402 p_identity_info->id_next_seq = IDMGMT_GET_FULL_VERSION; 403 /* status = NFCSTATUS_SUCCESS; */ 404 } 405 break; 406 } 407 case IDMGMT_GET_FULL_VERSION: 408 { 409 p_pipe_info->reg_index = FULL_VERSION_INDEX; 410 id_pipe_id = p_identity_info->pipe_id ; 411 status = 412 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, 413 id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); 414 if(NFCSTATUS_PENDING == status ) 415 { 416 p_identity_info->id_next_seq = IDMGMT_PIPE_CLOSE; 417 status = NFCSTATUS_SUCCESS; 418 } 419 break; 420 } 421 #endif 422 default: 423 { 424 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE); 425 break; 426 } 427 428 }/* End of the Sequence Switch */ 429 }/* End of Pipe Info Memory Check */ 430 431 }/* End of the Identity Info Memory Check */ 432 433 } /* End of Null Context Check */ 434 435 return status; 436 } 437 438 439 440 /*! 441 * \brief Initialisation of Identity Managment Gate. 442 * 443 * This function initialses the Identity Management gate and 444 * populates the Identity Management Information Structure 445 * 446 */ 447 448 NFCSTATUS 449 phHciNfc_IDMgmt_Info_Sequence( 450 phHciNfc_sContext_t *psHciContext, 451 void *pHwRef 452 ) 453 { 454 NFCSTATUS status = NFCSTATUS_SUCCESS; 455 phHciNfc_Pipe_Info_t *p_pipe_info = NULL; 456 phHciNfc_IDMgmt_Info_t *p_identity_info=NULL; 457 uint8_t id_pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID; 458 459 if( NULL == psHciContext ) 460 { 461 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 462 } 463 else 464 { 465 466 if( NULL == psHciContext->p_identity_info ) 467 { 468 status = PHNFCSTVAL(CID_NFC_HCI, 469 NFCSTATUS_INVALID_HCI_INFORMATION); 470 } 471 else 472 { 473 p_identity_info = (phHciNfc_IDMgmt_Info_t *) 474 psHciContext->p_identity_info ; 475 p_pipe_info = p_identity_info->p_pipe_info; 476 if(NULL == p_pipe_info ) 477 { 478 status = PHNFCSTVAL(CID_NFC_HCI, 479 NFCSTATUS_NOT_ALLOWED); 480 } 481 else 482 { 483 switch(p_identity_info->id_cur_seq ) 484 { 485 case IDMGMT_GET_FW_VERSION: 486 { 487 p_pipe_info->reg_index = FW_VERSION_INDEX; 488 id_pipe_id = p_identity_info->pipe_id ; 489 status = 490 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, 491 id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); 492 if(NFCSTATUS_PENDING == status ) 493 { 494 p_identity_info->id_next_seq = IDMGMT_GET_HW_VERSION; 495 /* status = NFCSTATUS_SUCCESS; */ 496 } 497 break; 498 } 499 case IDMGMT_GET_HW_VERSION: 500 { 501 p_pipe_info->reg_index = HW_VERSION_INDEX; 502 id_pipe_id = p_identity_info->pipe_id ; 503 status = 504 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, 505 id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); 506 if(NFCSTATUS_PENDING == status ) 507 { 508 p_identity_info->id_next_seq = IDMGMT_GET_HCI_VERSION; 509 /* status = NFCSTATUS_SUCCESS; */ 510 } 511 break; 512 } 513 case IDMGMT_GET_HCI_VERSION: 514 { 515 p_pipe_info->reg_index = HCI_VERSION_INDEX; 516 id_pipe_id = p_identity_info->pipe_id ; 517 status = 518 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, 519 id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); 520 if(NFCSTATUS_PENDING == status ) 521 { 522 p_identity_info->id_next_seq = IDMGMT_GET_VENDOR_NAME; 523 /* status = NFCSTATUS_SUCCESS; */ 524 } 525 break; 526 } 527 case IDMGMT_GET_VENDOR_NAME: 528 { 529 p_pipe_info->reg_index = VENDOR_NAME_INDEX; 530 id_pipe_id = p_identity_info->pipe_id ; 531 status = 532 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, 533 id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); 534 if(NFCSTATUS_PENDING == status ) 535 { 536 p_identity_info->id_next_seq = IDMGMT_GET_MODEL_ID; 537 /* status = NFCSTATUS_SUCCESS; */ 538 } 539 break; 540 } 541 case IDMGMT_GET_MODEL_ID: 542 { 543 p_pipe_info->reg_index = MODEL_ID_INDEX; 544 id_pipe_id = p_identity_info->pipe_id ; 545 status = 546 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, 547 id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); 548 if(NFCSTATUS_PENDING == status ) 549 { 550 p_identity_info->id_next_seq = IDMGMT_GET_GATES_LIST; 551 /* status = NFCSTATUS_SUCCESS; */ 552 } 553 break; 554 } 555 case IDMGMT_GET_GATES_LIST: 556 { 557 p_pipe_info->reg_index = GATES_LIST_INDEX; 558 id_pipe_id = p_identity_info->pipe_id ; 559 status = 560 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, 561 id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); 562 if(NFCSTATUS_PENDING == status ) 563 { 564 p_identity_info->id_next_seq = IDMGMT_GET_FULL_VERSION; 565 /* status = NFCSTATUS_SUCCESS; */ 566 } 567 break; 568 } 569 case IDMGMT_GET_FULL_VERSION: 570 { 571 p_pipe_info->reg_index = FULL_VERSION_INDEX; 572 id_pipe_id = p_identity_info->pipe_id ; 573 status = 574 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, 575 id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); 576 if(NFCSTATUS_PENDING == status ) 577 { 578 p_identity_info->id_next_seq = IDMGMT_PIPE_CLOSE; 579 status = NFCSTATUS_SUCCESS; 580 } 581 break; 582 } 583 default: 584 { 585 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE); 586 break; 587 } 588 589 }/* End of the Sequence Switch */ 590 }/* End of Pipe Info Memory Check */ 591 592 }/* End of the Identity Info Memory Check */ 593 594 } /* End of Null Context Check */ 595 596 return status; 597 } 598 599 /*! 600 * \brief Releases the resources allocated the Identity Management. 601 * 602 * This function Releases the resources allocated the Identity Management. 603 */ 604 605 NFCSTATUS 606 phHciNfc_IDMgmt_Release( 607 phHciNfc_sContext_t *psHciContext, 608 void *pHwRef 609 ) 610 { 611 NFCSTATUS status = NFCSTATUS_SUCCESS; 612 phHciNfc_Pipe_Info_t *p_pipe_info = NULL; 613 phHciNfc_IDMgmt_Info_t *p_identity_info=NULL; 614 /* static phHciNfc_IDMgmt_Seq_t identity_init_seq = IDMGMT_PIPE_CREATE; */ 615 616 if( (NULL == psHciContext) || (NULL == pHwRef) ) 617 { 618 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 619 } 620 else 621 { 622 if( NULL != psHciContext->p_identity_info ) 623 { 624 p_identity_info = (phHciNfc_IDMgmt_Info_t *) 625 psHciContext->p_identity_info ; 626 p_pipe_info = p_identity_info->p_pipe_info; 627 628 status = phHciNfc_Close_Pipe( psHciContext, 629 pHwRef, p_pipe_info ); 630 } 631 else 632 { 633 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_NOT_ALLOWED); 634 635 }/* End of the Identity Info Memory Check */ 636 637 } /* End of Null Context Check */ 638 639 return status; 640 } 641 642 643 /*! 644 * \brief Receives the HCI Response from the corresponding peripheral device. 645 * 646 * This function receives the HCI Command Response from the connected NFC 647 * Pheripheral device. 648 */ 649 static 650 NFCSTATUS 651 phHciNfc_Recv_IDMgmt_Response( 652 void *psContext, 653 void *pHwRef, 654 uint8_t *pResponse, 655 #ifdef ONE_BYTE_LEN 656 uint8_t length 657 #else 658 uint16_t length 659 #endif 660 ) 661 { 662 phHciNfc_sContext_t *psHciContext = 663 (phHciNfc_sContext_t *)psContext ; 664 phHciNfc_IDMgmt_Info_t *p_identity_info=NULL; 665 NFCSTATUS status = NFCSTATUS_SUCCESS; 666 uint8_t prev_cmd = ANY_GET_PARAMETER; 667 668 if( (NULL == psHciContext) || (NULL == pHwRef) ) 669 { 670 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 671 } 672 else if( NULL == psHciContext->p_identity_info ) 673 { 674 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 675 } 676 else 677 { 678 p_identity_info = (phHciNfc_IDMgmt_Info_t *) 679 psHciContext->p_identity_info ; 680 if( NULL != p_identity_info->p_pipe_info) 681 { 682 prev_cmd = p_identity_info->p_pipe_info->prev_msg ; 683 switch(prev_cmd) 684 { 685 case ANY_GET_PARAMETER: 686 { 687 status = phHciNfc_IDMgmt_InfoUpdate(psHciContext, 688 (phHal_sHwReference_t *)pHwRef, 689 p_identity_info->p_pipe_info->reg_index, 690 &pResponse[HCP_HEADER_LEN], 691 (uint8_t)(length - HCP_HEADER_LEN)); 692 break; 693 } 694 case ANY_SET_PARAMETER: 695 { 696 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 697 break; 698 } 699 case ANY_OPEN_PIPE: 700 { 701 break; 702 } 703 case ANY_CLOSE_PIPE: 704 { 705 break; 706 } 707 default: 708 { 709 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE); 710 break; 711 } 712 } 713 if( NFCSTATUS_SUCCESS == status ) 714 { 715 p_identity_info->p_pipe_info->prev_status = NFCSTATUS_SUCCESS; 716 p_identity_info->id_cur_seq = p_identity_info->id_next_seq; 717 } 718 } 719 } 720 return status; 721 } 722 723 /* Function to Update the Pipe Information */ 724 NFCSTATUS 725 phHciNfc_IDMgmt_Update_PipeInfo( 726 phHciNfc_sContext_t *psHciContext, 727 uint8_t pipe_id, 728 phHciNfc_Pipe_Info_t *pPipeInfo 729 ) 730 { 731 phHciNfc_IDMgmt_Info_t *p_identity_info=NULL; 732 NFCSTATUS status = NFCSTATUS_SUCCESS; 733 734 if( NULL == psHciContext ) 735 { 736 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 737 } 738 else if ( NULL == psHciContext->p_identity_info ) 739 { 740 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); 741 } 742 else 743 { 744 p_identity_info = (phHciNfc_IDMgmt_Info_t *) 745 psHciContext->p_identity_info ; 746 /* Update the pipe_id of the ID Mgmt Gate obtained from the HCI Response */ 747 p_identity_info->pipe_id = pipe_id; 748 p_identity_info->p_pipe_info = pPipeInfo; 749 if ( NULL != pPipeInfo) 750 { 751 /* Update the Response Receive routine of the IDMgmt Gate */ 752 pPipeInfo->recv_resp = &phHciNfc_Recv_IDMgmt_Response; 753 } 754 } 755 756 return status; 757 } 758 759 static 760 NFCSTATUS 761 phHciNfc_IDMgmt_InfoUpdate( 762 phHciNfc_sContext_t *psHciContext, 763 phHal_sHwReference_t *pHwRef, 764 uint8_t index, 765 uint8_t *reg_value, 766 uint8_t reg_length 767 ) 768 { 769 phHciNfc_IDMgmt_Info_t *p_identity_info=NULL; 770 NFCSTATUS status = NFCSTATUS_SUCCESS; 771 uint8_t i=0; 772 if( (NULL == psHciContext) 773 || (NULL == reg_value) 774 || (reg_length == 0) 775 ) 776 { 777 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 778 } 779 else if ( NULL == psHciContext->p_identity_info ) 780 { 781 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); 782 } 783 else 784 { 785 p_identity_info = (phHciNfc_IDMgmt_Info_t *) 786 psHciContext->p_identity_info ; 787 788 switch(index) 789 { 790 case FW_VERSION_INDEX : 791 { 792 HCI_PRINT_BUFFER("\tFW Version:",reg_value,reg_length); 793 for(i=0 ;(reg_length == VERSION_LEN)&&(i < reg_length); i++) 794 { 795 p_identity_info->fw_version |= 796 (uint32_t)(reg_value[VERSION_LEN - i - 1] << (BYTE_SIZE * i)); 797 } 798 pHwRef->device_info.fw_version = p_identity_info->fw_version ; 799 break; 800 } 801 case HW_VERSION_INDEX : 802 { 803 HCI_PRINT_BUFFER("\tHW Version:",reg_value,reg_length); 804 for(i=0 ;(reg_length == VERSION_LEN)&&(i < reg_length); i++) 805 { 806 p_identity_info->hw_version |= 807 (uint32_t)(reg_value[VERSION_LEN - i - 1] << (BYTE_SIZE * i)); 808 } 809 pHwRef->device_info.hw_version = p_identity_info->hw_version ; 810 break; 811 } 812 case VENDOR_NAME_INDEX : 813 { 814 for(i=0 ;(reg_length <= VENDOR_NAME_LEN)&&(i < reg_length); i++) 815 { 816 p_identity_info->vendor_name[i] = reg_value[i]; 817 pHwRef->device_info.vendor_name[i]= reg_value[i]; 818 } 819 HCI_DEBUG("\tVendor Name:%s",p_identity_info->vendor_name); 820 break; 821 } 822 case MODEL_ID_INDEX : 823 { 824 HCI_PRINT_BUFFER("\tModel ID:",reg_value,reg_length); 825 p_identity_info->model_id = reg_value[i] ; 826 pHwRef->device_info.model_id = p_identity_info->model_id ; 827 #ifndef NXP_HAL_ENABLE_SMX 828 if( NFC_HW_PN65N == pHwRef->device_info.model_id) 829 #endif 830 { 831 pHwRef->smx_connected = TRUE; 832 } 833 break; 834 } 835 case HCI_VERSION_INDEX : 836 { 837 HCI_PRINT_BUFFER("\tHCI Version:",reg_value,reg_length); 838 p_identity_info->hci_version = reg_value[i] ; 839 pHwRef->device_info.hci_version = p_identity_info->hci_version ; 840 break; 841 } 842 case GATES_LIST_INDEX : 843 { 844 HCI_PRINT_BUFFER("\tGates List:",reg_value,reg_length); 845 for(i=0 ;(reg_length <= GATES_LIST_LEN)&&(i < reg_length); i++) 846 { 847 p_identity_info->gates_list[i] = reg_value[i]; 848 } 849 break; 850 } 851 case FULL_VERSION_INDEX : 852 { 853 HCI_PRINT_BUFFER("\tVERSION INFO:",reg_value,reg_length); 854 for(i=0 ;(reg_length <= NXP_FULL_VERSION_LEN)&&(i < reg_length); i++) 855 { 856 p_identity_info->full_version[i] = reg_value[i]; 857 pHwRef->device_info.full_version[i]= reg_value[i]; 858 } 859 break; 860 } 861 default: 862 { 863 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); 864 break; 865 } /*End of the default Switch Case */ 866 867 } /*End of the Index Switch */ 868 869 } /* End of Context and the Identity information validity check */ 870 871 return status; 872 } 873