1 /* 2 * Copyright (C) 2012-2014 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 #ifdef NXP_HW_SELF_TEST 18 19 20 #include <phNxpNciHal_SelfTest.h> 21 #include <phNxpLog.h> 22 #include <pthread.h> 23 #include <phOsalNfc_Timer.h> 24 #include <phNxpConfig.h> 25 26 #define HAL_WRITE_RSP_TIMEOUT (2000) /* Timeout value to wait for response from PN54X */ 27 #define HAL_WRITE_MAX_RETRY (10) 28 29 /******************* Structures and definitions *******************************/ 30 31 typedef uint8_t (*st_validator_t)(nci_data_t *exp, phTmlNfc_TransactInfo_t *act); 32 33 phAntenna_St_Resp_t phAntenna_resp; 34 35 typedef struct nci_test_data 36 { 37 nci_data_t cmd; 38 nci_data_t exp_rsp; 39 nci_data_t exp_ntf; 40 st_validator_t rsp_validator; 41 st_validator_t ntf_validator; 42 43 }nci_test_data_t; 44 45 /******************* Global variables *****************************************/ 46 47 static int thread_running = 0; 48 static uint32_t timeoutTimerId = 0; 49 static int hal_write_timer_fired = 0; 50 51 /* TML Context */ 52 extern phTmlNfc_Context_t *gpphTmlNfc_Context; 53 54 /* Global HAL Ref */ 55 extern phNxpNciHal_Control_t nxpncihal_ctrl; 56 57 /* Driver parameters */ 58 phLibNfc_sConfig_t gDrvCfg; 59 60 NFCSTATUS gtxldo_status = NFCSTATUS_FAILED; 61 NFCSTATUS gagc_value_status = NFCSTATUS_FAILED; 62 NFCSTATUS gagc_nfcld_status = NFCSTATUS_FAILED; 63 NFCSTATUS gagc_differential_status = NFCSTATUS_FAILED; 64 65 66 static uint8_t st_validator_testEquals(nci_data_t *exp, phTmlNfc_TransactInfo_t *act); 67 static uint8_t st_validator_null(nci_data_t *exp, phTmlNfc_TransactInfo_t *act); 68 static uint8_t st_validator_testSWP1_vltg(nci_data_t *exp, phTmlNfc_TransactInfo_t *act); 69 static uint8_t st_validator_testAntenna_Txldo(nci_data_t *exp, phTmlNfc_TransactInfo_t *act); 70 static uint8_t st_validator_testAntenna_AgcVal(nci_data_t *exp, phTmlNfc_TransactInfo_t *act); 71 static uint8_t st_validator_testAntenna_AgcVal_FixedNfcLd(nci_data_t *exp, phTmlNfc_TransactInfo_t *act); 72 static uint8_t st_validator_testAntenna_AgcVal_Differential(nci_data_t *exp, phTmlNfc_TransactInfo_t *act); 73 74 #if(NFC_NXP_CHIP_TYPE != PN547C2) 75 NFCSTATUS phNxpNciHal_getPrbsCmd (phNxpNfc_PrbsType_t prbs_type, phNxpNfc_PrbsHwType_t hw_prbs_type, 76 uint8_t tech, uint8_t bitrate, uint8_t *prbs_cmd, uint8_t prbs_cmd_len); 77 #else 78 NFCSTATUS phNxpNciHal_getPrbsCmd (uint8_t tech, uint8_t bitrate, uint8_t *prbs_cmd, uint8_t prbs_cmd_len); 79 #endif 80 /* Test data to validate SWP line 2*/ 81 static nci_test_data_t swp2_test_data[] = { 82 { 83 { 84 0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */ 85 }, 86 { 87 #if(NFC_NXP_CHIP_TYPE != PN547C2) 88 0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */ 89 #else 90 0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00} /* exp_rsp */ 91 #endif 92 }, 93 { 94 0x00, {0x00} /* ext_ntf */ 95 }, 96 st_validator_testEquals, /* validator */ 97 st_validator_null 98 }, 99 { 100 { 101 #if(NFC_NXP_CHIP_TYPE != PN547C2) 102 0x05, {0x20,0x01,0x02,0x00,0x00} /* cmd */ 103 #else 104 0x03, {0x20,0x01,0x00} 105 #endif 106 }, 107 { 108 #if(NFC_NXP_CHIP_TYPE != PN547C2) 109 0x4, {0x40,0x01,0x19,0x00 } /* exp_rsp */ 110 #else 111 0x4, {0x40,0x01,0x17,0x00 } 112 #endif 113 }, 114 { 115 0x00, {0x00} /* ext_ntf */ 116 }, 117 st_validator_testEquals, /* validator */ 118 st_validator_null 119 }, 120 { 121 { 122 0x03, {0x2F,0x02,0x00} /* cmd */ 123 }, 124 { 125 0x04, {0x4F,0x02,0x05,0x00} /* exp_rsp */ 126 }, 127 { 128 0x00, {0x00} /* ext_ntf */ 129 }, 130 st_validator_testEquals, /* validator */ 131 st_validator_null 132 }, 133 { 134 { 135 0x04, {0x2F,0x3E,0x01,0x01} /* cmd */ 136 }, 137 { 138 0x04, {0x4F,0x3E,0x01,0x00} /* exp_rsp */ 139 }, 140 { 141 0x04, {0x6F,0x3E,0x02,0x00} /* ext_ntf */ 142 }, 143 st_validator_testEquals, /* validator */ 144 st_validator_testEquals 145 }, 146 147 }; 148 149 /* Test data to validate SWP line 1*/ 150 static nci_test_data_t swp1_test_data[] = { 151 152 { 153 { 154 0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */ 155 }, 156 { 157 #if(NFC_NXP_CHIP_TYPE != PN547C2) 158 0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */ 159 #else 160 0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00} /* exp_rsp */ 161 #endif 162 }, 163 { 164 0x00, {0x00} /* ext_ntf */ 165 }, 166 st_validator_testEquals, /* validator */ 167 st_validator_null 168 }, 169 { 170 { 171 #if(NFC_NXP_CHIP_TYPE != PN547C2) 172 0x05, {0x20,0x01,0x02,0x00,0x00} /* cmd */ 173 #else 174 0x03, {0x20,0x01,0x00} 175 #endif 176 }, 177 { 178 #if(NFC_NXP_CHIP_TYPE != PN547C2) 179 0x4, {0x40,0x01,0x19,0x00 } /* exp_rsp */ 180 #else 181 0x4, {0x40,0x01,0x17,0x00 } 182 #endif 183 }, 184 { 185 0x00, {0x00} /* ext_ntf */ 186 }, 187 st_validator_testEquals, /* validator */ 188 st_validator_null 189 }, 190 { 191 { 192 0x03, {0x2F,0x02,0x00} /* cmd */ 193 }, 194 { 195 0x04, {0x4F,0x02,0x05,0x00} /* exp_rsp */ 196 }, 197 { 198 0x00, {0x00} /* ext_ntf */ 199 }, 200 st_validator_testEquals, /* validator */ 201 st_validator_null 202 }, 203 { 204 { 205 0x04, {0x2F,0x3E,0x01,0x00} /* cmd */ 206 }, 207 { 208 0x04, {0x4F,0x3E,0x01,0x00} /* exp_rsp */ 209 }, 210 { 211 0x04, {0x6F,0x3E,0x02,0x00} /* ext_ntf */ 212 }, 213 214 st_validator_testEquals, /* validator */ 215 st_validator_testSWP1_vltg 216 }, 217 }; 218 219 static nci_test_data_t prbs_test_data[] = { 220 { 221 { 222 0x04, {0x20,0x00,0x01,0x00} /* cmd */ 223 }, 224 { 225 #if(NFC_NXP_CHIP_TYPE != PN547C2) 226 0x06, {0x40,0x00,0x03,0x00,0x11,0x00} /* exp_rsp */ 227 #else 228 0x06, {0x40,0x00,0x03,0x00,0x10,0x00} /* exp_rsp */ 229 #endif 230 }, 231 { 232 0x00, {0x00} /* ext_ntf */ 233 }, 234 st_validator_testEquals, /* validator */ 235 st_validator_null 236 }, 237 { 238 { 239 #if(NFC_NXP_CHIP_TYPE != PN547C2) 240 0x05, {0x20,0x01,0x02,0x00,0x00} /* cmd */ 241 #else 242 0x03, {0x20,0x01,0x00} /* cmd */ 243 #endif 244 }, 245 { 246 #if(NFC_NXP_CHIP_TYPE != PN547C2) 247 0x4, {0x40,0x01,0x19,0x00 } /* exp_rsp */ 248 #else 249 0x4, {0x40,0x01,0x17,0x00 } /* exp_rsp */ 250 #endif 251 }, 252 { 253 0x00, {0x00} /* ext_ntf */ 254 }, 255 st_validator_testEquals, /* validator */ 256 st_validator_null 257 #if(NFC_NXP_CHIP_TYPE != PN547C2) 258 }, 259 { 260 { 261 0x04, {0x2F,0x00,0x01,0x00} /* cmd */ 262 }, 263 { 264 0x04, {0x4F,0x00,0x01,0x00} /* exp_rsp */ 265 }, 266 { 267 0x00, {0x00} /* ext_ntf */ 268 }, 269 st_validator_testEquals, /* validator */ 270 st_validator_null 271 #endif 272 } 273 }; 274 275 /* for rf field test, first requires to disable the standby mode */ 276 static nci_test_data_t rf_field_on_test_data[] = { 277 { 278 { 279 0x04, {0x20,0x00,0x01,0x00} /* cmd */ 280 }, 281 { 282 #if(NFC_NXP_CHIP_TYPE != PN547C2) 283 0x06, {0x40,0x00,0x03,0x00,0x11,0x00} /* exp_rsp */ 284 #else 285 0x06, {0x40,0x00,0x03,0x00,0x10,0x00} /* exp_rsp */ 286 #endif 287 }, 288 { 289 0x00, {0x00} /* ext_ntf */ 290 }, 291 st_validator_testEquals, /* validator */ 292 st_validator_null 293 }, 294 { 295 { 296 #if(NFC_NXP_CHIP_TYPE != PN547C2) 297 0x05, {0x20,0x01,0x02,0x00,0x00} /* cmd */ 298 #else 299 0x03, {0x20,0x01,0x00} /* cmd */ 300 #endif 301 }, 302 { 303 #if(NFC_NXP_CHIP_TYPE != PN547C2) 304 0x4, {0x40,0x01,0x19,0x00 } /* exp_rsp */ 305 #else 306 0x4, {0x40,0x01,0x17,0x00 } /* exp_rsp */ 307 #endif 308 }, 309 { 310 0x00, {0x00} /* ext_ntf */ 311 }, 312 st_validator_testEquals, /* validator */ 313 st_validator_null 314 }, 315 #if(NFC_NXP_CHIP_TYPE != PN547C2) 316 { 317 { 318 0x03, {0x2F,0x02,0x00} /* cmd */ 319 }, 320 { 321 0x04, {0x4F,0x02,0x05,0x00} /* exp_rsp */ 322 }, 323 { 324 0x00, {0x00} /* ext_ntf */ 325 }, 326 st_validator_testEquals, /* validator */ 327 st_validator_null 328 }, 329 { 330 { 331 0x04, {0x2F,0x00,0x01,0x00} /* cmd */ 332 }, 333 { 334 0x04, {0x4F,0x00,0x01,0x00} /* exp_rsp */ 335 }, 336 { 337 0x00, {0x00} /* ext_ntf */ 338 }, 339 st_validator_testEquals, /* validator */ 340 st_validator_null 341 }, 342 #endif 343 { 344 { 345 #if(NFC_NXP_CHIP_TYPE != PN547C2) 346 0x05, {0x2F,0x3D,0x02,0x20,0x01} /* cmd */ 347 #else 348 0x08, {0x2F,0x3D,0x05,0x20,0x01,0x00,0x00,0x00} /* cmd */ 349 #endif 350 }, 351 { 352 0x04, {0x4F,0x3D,0x05,0x00} /* exp_rsp */ 353 }, 354 { 355 0x00, {0x00} /* ext_ntf */ 356 }, 357 st_validator_testEquals, /* validator */ 358 st_validator_null 359 #if(NFC_NXP_CHIP_TYPE != PN547C2) 360 }, 361 { 362 { 363 0x04, {0x2F,0x00,0x01,0x01} /* cmd */ 364 }, 365 { 366 0x04, {0x4F,0x00,0x01,0x00} /* exp_rsp */ 367 }, 368 { 369 0x00, {0x00} /* ext_ntf */ 370 }, 371 st_validator_testEquals, /* validator */ 372 st_validator_null 373 #endif 374 } 375 }; 376 377 static nci_test_data_t rf_field_off_test_data[] = { 378 { 379 { 380 0x04, {0x20,0x00,0x01,0x00} /* cmd */ 381 }, 382 { 383 #if(NFC_NXP_CHIP_TYPE != PN547C2) 384 0x06, {0x40,0x00,0x03,0x00,0x11,0x00} /* exp_rsp */ 385 #else 386 0x06, {0x40,0x00,0x03,0x00,0x10,0x00} /* exp_rsp */ 387 #endif 388 }, 389 { 390 0x00, {0x00} /* ext_ntf */ 391 }, 392 st_validator_testEquals, /* validator */ 393 st_validator_null 394 }, 395 { 396 { 397 #if(NFC_NXP_CHIP_TYPE != PN547C2) 398 0x05, {0x20,0x01,0x02,0x00,0x00} /* cmd */ 399 #else 400 0x03, {0x20,0x01,0x00} /* cmd */ 401 #endif 402 }, 403 { 404 #if(NFC_NXP_CHIP_TYPE != PN547C2) 405 0x4, {0x40,0x01,0x19,0x00 } /* exp_rsp */ 406 #else 407 0x4, {0x40,0x01,0x17,0x00 } /* exp_rsp */ 408 #endif 409 }, 410 { 411 0x00, {0x00} /* ext_ntf */ 412 }, 413 st_validator_testEquals, /* validator */ 414 st_validator_null 415 }, 416 #if(NFC_NXP_CHIP_TYPE != PN547C2) 417 { 418 { 419 0x03, {0x2F,0x02,0x00} /* cmd */ 420 }, 421 { 422 0x04, {0x4F,0x02,0x05,0x00} /* exp_rsp */ 423 }, 424 { 425 0x00, {0x00} /* ext_ntf */ 426 }, 427 st_validator_testEquals, /* validator */ 428 st_validator_null 429 }, 430 { 431 { 432 0x04, {0x2F,0x00,0x01,0x00} /* cmd */ 433 }, 434 { 435 0x04, {0x4F,0x00,0x01,0x00} /* exp_rsp */ 436 }, 437 { 438 0x00, {0x00} /* ext_ntf */ 439 }, 440 st_validator_testEquals, /* validator */ 441 st_validator_null 442 }, 443 #endif 444 { 445 { 446 #if(NFC_NXP_CHIP_TYPE != PN547C2) 447 0x05, {0x2F,0x3D,0x02,0x20,0x00} /* cmd */ 448 #else 449 0x08, {0x2F,0x3D,0x05,0x20,0x00,0x00,0x00,0x00} /* cmd */ 450 #endif 451 }, 452 { 453 0x04, {0x4F,0x3D,0x05,0x00} /* exp_rsp */ 454 }, 455 { 456 0x00, {0x00} /* ext_ntf */ 457 }, 458 st_validator_testEquals, /* validator */ 459 st_validator_null 460 #if(NFC_NXP_CHIP_TYPE != PN547C2) 461 }, 462 { 463 { 464 0x04, {0x2F,0x00,0x01,0x01} /* cmd */ 465 }, 466 { 467 0x04, {0x4F,0x00,0x01,0x00} /* exp_rsp */ 468 }, 469 { 470 0x00, {0x00} /* ext_ntf */ 471 }, 472 st_validator_testEquals, /* validator */ 473 st_validator_null 474 #endif 475 } 476 }; 477 478 /* Download pin test data 1 */ 479 static nci_test_data_t download_pin_test_data1[] = { 480 { 481 { 482 0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */ 483 }, 484 { 485 #if(NFC_NXP_CHIP_TYPE != PN547C2) 486 0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */ 487 #else 488 0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00} /* exp_rsp */ 489 #endif 490 }, 491 { 492 0x00, {0x00} /* ext_ntf */ 493 }, 494 st_validator_testEquals, /* validator */ 495 st_validator_null 496 }, 497 }; 498 499 /* Download pin test data 2 */ 500 static nci_test_data_t download_pin_test_data2[] = { 501 { 502 { 503 0x08, {0x00, 0x04, 0xD0, 0x11, 0x00, 0x00, 0x5B, 0x46} /* cmd */ 504 }, 505 { 506 0x08, {0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x87, 0x16} /* exp_rsp */ 507 }, 508 { 509 0x00, {0x00} /* ext_ntf */ 510 }, 511 st_validator_testEquals, /* validator */ 512 st_validator_null 513 }, 514 }; 515 /* Antenna self test data*/ 516 static nci_test_data_t antenna_self_test_data[] = { 517 { 518 { 519 0x04, {0x20,0x00,0x01,0x00} /* cmd */ 520 }, 521 { 522 #if(NFC_NXP_CHIP_TYPE != PN547C2) 523 0x06, {0x40,0x00,0x03,0x00,0x11,0x00} /* exp_rsp */ 524 #else 525 0x06, {0x40,0x00,0x03,0x00,0x10,0x00} /* exp_rsp */ 526 #endif 527 }, 528 { 529 0x00, {0x00} /* ext_ntf */ 530 }, 531 st_validator_testEquals, /* validator */ 532 st_validator_null 533 }, 534 { 535 { 536 #if(NFC_NXP_CHIP_TYPE != PN547C2) 537 0x05, {0x20,0x01,0x02,0x00,0x00} /* cmd */ 538 #else 539 0x03, {0x20,0x01,0x00} /* cmd */ 540 #endif 541 }, 542 { 543 #if(NFC_NXP_CHIP_TYPE != PN547C2) 544 0x4, {0x40,0x01,0x19,0x00 } /* exp_rsp */ 545 #else 546 0x4, {0x40,0x01,0x17,0x00 } /* exp_rsp */ 547 #endif 548 }, 549 { 550 0x00, {0x00} /* ext_ntf */ 551 }, 552 st_validator_testEquals, /* validator */ 553 st_validator_null 554 }, 555 { 556 { 557 0x03, {0x2F,0x02,0x00} /* cmd */ 558 }, 559 { 560 0x04, {0x4F,0x02,0x05,0x00} /* exp_rsp */ 561 }, 562 { 563 0x00, {0x00} /* ext_ntf */ 564 }, 565 st_validator_testEquals, /* validator */ 566 st_validator_null 567 }, 568 #if(NFC_NXP_CHIP_TYPE != PN547C2) 569 { 570 { 571 0x04, {0x2F,0x00,0x01,0x00} /* cmd */ 572 }, 573 { 574 0x04, {0x4F,0x00,0x01,0x00} /* exp_rsp */ 575 }, 576 { 577 0x00, {0x00} /* ext_ntf */ 578 }, 579 st_validator_testEquals, /* validator */ 580 st_validator_null 581 }, 582 #endif 583 { 584 { 585 0x05, {0x2F, 0x3D, 0x02, 0x01, 0x80} /* TxLDO cureent measurement cmd */ 586 }, 587 { 588 0x03, {0x4F, 0x3D, 05} /* exp_rsp */ 589 }, 590 { 591 0x00, {0x00} /* ext_ntf */ 592 }, 593 st_validator_testAntenna_Txldo, 594 st_validator_null 595 }, 596 { 597 { 598 #if(NFC_NXP_CHIP_TYPE != PN547C2) 599 0x07, {0x2F, 0x3D, 0x04, 0x02, 0xC8, 0x60, 0x03} /* AGC measurement cmd */ 600 #else 601 0x07, {0x2F, 0x3D, 0x04, 0x02, 0xCD, 0x60, 0x03} /* AGC measurement cmd */ 602 #endif 603 }, 604 { 605 0x03, {0x4F, 0x3D, 05} /* exp_rsp */ 606 }, 607 { 608 0x00, {0x00} /* ext_ntf */ 609 }, 610 st_validator_testAntenna_AgcVal, 611 st_validator_null 612 }, 613 { 614 { 615 0x07, {0x2F, 0x3D, 0x04, 0x04, 0x20, 0x08, 0x20} /* AGC with NFCLD measurement cmd */ 616 }, 617 { 618 0x03, {0x4F, 0x3D, 05} /* exp_rsp */ 619 }, 620 { 621 0x00, {0x00} /* ext_ntf */ 622 }, 623 st_validator_testAntenna_AgcVal_FixedNfcLd, 624 st_validator_null 625 }, 626 { 627 { 628 0x07, {0x2F, 0x3D, 0x04, 0x08, 0x8C, 0x60, 0x03} /* AGC with NFCLD measurement cmd */ 629 }, 630 { 631 0x03, {0x4F, 0x3D, 05} /* exp_rsp */ 632 }, 633 { 634 0x00, {0x00} /* ext_ntf */ 635 }, 636 st_validator_testAntenna_AgcVal_Differential, 637 st_validator_null 638 #if(NFC_NXP_CHIP_TYPE != PN547C2) 639 }, 640 { 641 { 642 0x04, {0x2F,0x00,0x01,0x01} /* cmd */ 643 }, 644 { 645 0x04, {0x4F,0x00,0x01,0x00} /* exp_rsp */ 646 }, 647 { 648 0x00, {0x00} /* ext_ntf */ 649 }, 650 st_validator_testEquals, /* validator */ 651 st_validator_null 652 #endif 653 } 654 }; 655 656 657 /************** Self test functions ***************************************/ 658 659 static uint8_t st_validator_testEquals(nci_data_t *exp, phTmlNfc_TransactInfo_t *act); 660 static void hal_write_cb(void *pContext, phTmlNfc_TransactInfo_t *pInfo); 661 static void hal_write_rsp_timeout_cb(uint32_t TimerId, void *pContext); 662 static void hal_read_cb(void *pContext, phTmlNfc_TransactInfo_t *pInfo); 663 664 /******************************************************************************* 665 ** 666 ** Function st_validator_null 667 ** 668 ** Description Null Validator 669 ** 670 ** Returns One 671 ** 672 *******************************************************************************/ 673 static uint8_t st_validator_null(nci_data_t *exp, phTmlNfc_TransactInfo_t *act) 674 { 675 UNUSED(exp); 676 UNUSED(act); 677 return 1; 678 } 679 680 /******************************************************************************* 681 ** 682 ** Function st_validator_testSWP1_vltg 683 ** 684 ** Description Validator function to validate swp1 connection. 685 ** 686 ** Returns One if successful otherwise Zero. 687 ** 688 *******************************************************************************/ 689 static uint8_t st_validator_testSWP1_vltg(nci_data_t *exp, phTmlNfc_TransactInfo_t *act) 690 { 691 uint8_t result = 0; 692 693 if(NULL == exp || NULL == act) 694 { 695 return result; 696 } 697 698 if( (act->wLength == 0x05) && 699 (memcmp(exp->p_data,act->pBuff,exp->len) == 0)) 700 { 701 if(act->pBuff[4] == 0x01 || act->pBuff[4] == 0x02) 702 { 703 result = 1; 704 } 705 } 706 707 return result; 708 } 709 710 /******************************************************************************* 711 ** 712 ** Function st_validator_testAntenna_Txldo 713 ** 714 ** Description Validator function to validate Antenna TxLDO current measurement. 715 ** 716 ** Returns One if successful otherwise Zero. 717 ** 718 *******************************************************************************/ 719 static uint8_t st_validator_testAntenna_Txldo(nci_data_t *exp, phTmlNfc_TransactInfo_t *act) 720 { 721 uint8_t result = 0; 722 uint8_t mesuredrange =0; 723 long measured_val = 0; 724 int tolerance = 0; 725 726 if(NULL == exp || NULL == act) 727 { 728 return result; 729 } 730 731 NXPLOG_NCIHAL_D("st_validator_testAntenna_Txldo = 0x%x", act->pBuff[3]); 732 if (0x05 == act->pBuff[2]) 733 { 734 if (NFCSTATUS_SUCCESS == act->pBuff[3]) 735 { 736 result = 1; 737 NXPLOG_NCIHAL_D("Antenna: TxLDO current measured raw value in mA : 0x%x", act->pBuff[4]); 738 if(0x00 == act->pBuff[5]) 739 { 740 NXPLOG_NCIHAL_D("Measured range : 0x00 = 50 - 100 mA"); 741 measured_val = ((0.40 * act->pBuff[4]) + 50); 742 NXPLOG_NCIHAL_D("TxLDO current absolute value in mA = %ld", measured_val); 743 } 744 else 745 { 746 NXPLOG_NCIHAL_D("Measured range : 0x01 = 20 - 70 mA"); 747 measured_val = ((0.40 * act->pBuff[4]) + 20); 748 NXPLOG_NCIHAL_D("TxLDO current absolute value in mA = %ld", measured_val); 749 } 750 751 tolerance = (phAntenna_resp.wTxdoMeasuredRangeMax * 752 phAntenna_resp.wTxdoMeasuredTolerance)/100; 753 if ((measured_val <= phAntenna_resp.wTxdoMeasuredRangeMax + tolerance)) 754 { 755 tolerance = (phAntenna_resp.wTxdoMeasuredRangeMin * 756 phAntenna_resp.wTxdoMeasuredTolerance)/100; 757 if((measured_val >= phAntenna_resp.wTxdoMeasuredRangeMin - tolerance)) 758 { 759 gtxldo_status = NFCSTATUS_SUCCESS; 760 NXPLOG_NCIHAL_E("Test Antenna Response for TxLDO measurement PASS"); 761 } 762 else 763 { 764 gtxldo_status = NFCSTATUS_FAILED; 765 NXPLOG_NCIHAL_E("Test Antenna Response for TxLDO measurement FAIL"); 766 } 767 } 768 else 769 { 770 gtxldo_status = NFCSTATUS_FAILED; 771 NXPLOG_NCIHAL_E("Test Antenna Response for TxLDO measurement FAIL"); 772 } 773 } 774 else 775 { 776 gtxldo_status = NFCSTATUS_FAILED; 777 NXPLOG_NCIHAL_E("Test Antenna Response for TxLDO measurement failed: Invalid status"); 778 } 779 780 } 781 else 782 { 783 gtxldo_status = NFCSTATUS_FAILED; 784 NXPLOG_NCIHAL_E("Test Antenna Response for TxLDO measurement failed: Invalid payload length"); 785 } 786 787 return result; 788 } 789 790 /******************************************************************************* 791 ** 792 ** Function st_validator_testAntenna_AgcVal 793 ** 794 ** Description Validator function reads AGC value of antenna and print the info 795 ** 796 ** Returns One if successful otherwise Zero. 797 ** 798 *******************************************************************************/ 799 static uint8_t st_validator_testAntenna_AgcVal(nci_data_t *exp, phTmlNfc_TransactInfo_t *act) 800 { 801 uint8_t result = 0; 802 int agc_tolerance = 0; 803 long agc_val = 0; 804 805 if(NULL == exp || NULL == act) 806 { 807 return result; 808 } 809 810 if (0x05 == act->pBuff[2]) 811 { 812 if (NFCSTATUS_SUCCESS == act->pBuff[3]) 813 { 814 result = 1; 815 agc_tolerance = (phAntenna_resp.wAgcValue * phAntenna_resp.wAgcValueTolerance)/100; 816 agc_val = ((act->pBuff[5] << 8) | (act->pBuff[4])); 817 NXPLOG_NCIHAL_D("AGC value : %ld", agc_val); 818 if(((phAntenna_resp.wAgcValue - agc_tolerance) <= agc_val) && 819 (agc_val <= (phAntenna_resp.wAgcValue + agc_tolerance))) 820 { 821 gagc_value_status = NFCSTATUS_SUCCESS; 822 NXPLOG_NCIHAL_E("Test Antenna Response for AGC Values PASS"); 823 } 824 else 825 { 826 gagc_value_status = NFCSTATUS_FAILED; 827 NXPLOG_NCIHAL_E("Test Antenna Response for AGC Values FAIL"); 828 } 829 } 830 else 831 { 832 gagc_value_status = NFCSTATUS_FAILED; 833 NXPLOG_NCIHAL_E("Test Antenna Response for AGC Values FAIL"); 834 } 835 } 836 else 837 { 838 gagc_value_status = NFCSTATUS_FAILED; 839 NXPLOG_NCIHAL_E("Test Antenna Response for AGC value failed: Invalid payload length"); 840 } 841 842 return result; 843 } 844 /******************************************************************************* 845 ** 846 ** Function st_validator_testAntenna_AgcVal_FixedNfcLd 847 ** 848 ** Description Validator function reads and print AGC value of 849 ** antenna with fixed NFCLD 850 ** 851 ** Returns One if successful otherwise Zero. 852 ** 853 *******************************************************************************/ 854 static uint8_t st_validator_testAntenna_AgcVal_FixedNfcLd(nci_data_t *exp, phTmlNfc_TransactInfo_t *act) 855 { 856 uint8_t result = 0; 857 int agc_nfcld_tolerance = 0; 858 long agc_nfcld = 0; 859 860 if(NULL == exp || NULL == act) 861 { 862 return result; 863 } 864 865 if(0x05 == act->pBuff[2]) 866 { 867 if(NFCSTATUS_SUCCESS == act->pBuff[3]) 868 { 869 result = 1; 870 agc_nfcld_tolerance = (phAntenna_resp.wAgcValuewithfixedNFCLD * 871 phAntenna_resp.wAgcValuewithfixedNFCLDTolerance)/100; 872 agc_nfcld = ((act->pBuff[5] << 8) | (act->pBuff[4])); 873 NXPLOG_NCIHAL_D("AGC value with Fixed Nfcld : %ld", agc_nfcld); 874 875 if(((phAntenna_resp.wAgcValuewithfixedNFCLD - agc_nfcld_tolerance) <= agc_nfcld) && 876 (agc_nfcld <= (phAntenna_resp.wAgcValuewithfixedNFCLD + agc_nfcld_tolerance))) 877 { 878 gagc_nfcld_status = NFCSTATUS_SUCCESS; 879 NXPLOG_NCIHAL_E("Test Antenna Response for AGC value with fixed NFCLD PASS"); 880 } 881 else 882 { 883 gagc_nfcld_status = NFCSTATUS_FAILED; 884 NXPLOG_NCIHAL_E("Test Antenna Response for AGC value with fixed NFCLD FAIL"); 885 } 886 } 887 else 888 { 889 gagc_nfcld_status = NFCSTATUS_FAILED; 890 NXPLOG_NCIHAL_E("Test Antenna Response for AGC value with fixed NFCLD failed: Invalid status"); 891 } 892 } 893 else 894 { 895 gagc_nfcld_status = NFCSTATUS_FAILED; 896 NXPLOG_NCIHAL_E("Test Antenna Response for AGC value with fixed NFCLD failed: Invalid payload length"); 897 } 898 899 return result; 900 } 901 902 /******************************************************************************* 903 ** 904 ** Function st_validator_testAntenna_AgcVal_Differential 905 ** 906 ** Description Reads the AGC value with open/short RM from buffer and print 907 ** 908 ** Returns One if successful otherwise Zero. 909 ** 910 *******************************************************************************/ 911 static uint8_t st_validator_testAntenna_AgcVal_Differential(nci_data_t *exp, phTmlNfc_TransactInfo_t *act) 912 { 913 uint8_t result = 0; 914 int agc_toleranceopne1 = 0; 915 int agc_toleranceopne2 = 0; 916 long agc_differentialOpne1 = 0; 917 long agc_differentialOpne2 = 0; 918 919 if(NULL == exp || NULL == act) 920 { 921 return result; 922 } 923 924 if (0x05 == act->pBuff[2]) 925 { 926 if (NFCSTATUS_SUCCESS == act->pBuff[3]) 927 { 928 result = 1; 929 agc_toleranceopne1=(phAntenna_resp.wAgcDifferentialWithOpen1 * 930 phAntenna_resp.wAgcDifferentialWithOpenTolerance1)/100; 931 agc_toleranceopne2=(phAntenna_resp.wAgcDifferentialWithOpen2 * 932 phAntenna_resp.wAgcDifferentialWithOpenTolerance2)/100; 933 agc_differentialOpne1 = ((act->pBuff[5] << 8) | (act->pBuff[4])); 934 agc_differentialOpne2 = ((act->pBuff[7] << 8) | (act->pBuff[6])); 935 NXPLOG_NCIHAL_D("AGC value differential Opne 1 : %ld", agc_differentialOpne1); 936 NXPLOG_NCIHAL_D("AGC value differentialOpne 2 : %ld", agc_differentialOpne2); 937 938 if(((agc_differentialOpne1 >= phAntenna_resp.wAgcDifferentialWithOpen1 - agc_toleranceopne1) && 939 (agc_differentialOpne1 <= phAntenna_resp.wAgcDifferentialWithOpen1 + agc_toleranceopne1)) && 940 ((agc_differentialOpne2 >= phAntenna_resp.wAgcDifferentialWithOpen2 - agc_toleranceopne2) && 941 (agc_differentialOpne2 <= phAntenna_resp.wAgcDifferentialWithOpen2 + agc_toleranceopne2))) 942 { 943 gagc_differential_status = NFCSTATUS_SUCCESS; 944 NXPLOG_NCIHAL_E("Test Antenna Response for AGC Differential Open PASS"); 945 } 946 else 947 { 948 gagc_differential_status = NFCSTATUS_FAILED; 949 NXPLOG_NCIHAL_E("Test Antenna Response for AGC Differential Open FAIL"); 950 } 951 } 952 else 953 { 954 NXPLOG_NCIHAL_E("Test Antenna Response for AGC Differential failed: Invalid status"); 955 gagc_differential_status = NFCSTATUS_FAILED; 956 } 957 958 } 959 else 960 { 961 NXPLOG_NCIHAL_E("Test Antenna Response for AGC Differential failed: Invalid payload length"); 962 gagc_differential_status = NFCSTATUS_FAILED; 963 } 964 965 return result; 966 } 967 /******************************************************************************* 968 ** 969 ** Function st_validator_testEquals 970 ** 971 ** Description Validator function to validate for equality between actual 972 ** and expected values. 973 ** 974 ** Returns One if successful otherwise Zero. 975 ** 976 *******************************************************************************/ 977 static uint8_t st_validator_testEquals(nci_data_t *exp, phTmlNfc_TransactInfo_t *act) 978 { 979 uint8_t result = 0; 980 981 if(NULL == exp || NULL == act) 982 { 983 return result; 984 } 985 if(exp->len <= act->wLength && 986 (memcmp(exp->p_data,act->pBuff,exp->len) == 0)) 987 { 988 result = 1; 989 } 990 991 return result; 992 } 993 994 /******************************************************************************* 995 ** 996 ** Function hal_write_rsp_timeout_cb 997 ** 998 ** Description Callback function for hal write response timer. 999 ** 1000 ** Returns None 1001 ** 1002 *******************************************************************************/ 1003 static void hal_write_rsp_timeout_cb(uint32_t timerId, void *pContext) 1004 { 1005 UNUSED(timerId); 1006 NXPLOG_NCIHAL_E("hal_write_rsp_timeout_cb - write timeout!!!"); 1007 hal_write_timer_fired = 1; 1008 hal_read_cb(pContext,NULL); 1009 } 1010 1011 /******************************************************************************* 1012 ** 1013 ** Function hal_write_cb 1014 ** 1015 ** Description Callback function for hal write. 1016 ** 1017 ** Returns None 1018 ** 1019 *******************************************************************************/ 1020 static void hal_write_cb(void *pContext, phTmlNfc_TransactInfo_t *pInfo) 1021 { 1022 phNxpNciHal_Sem_t *p_cb_data = (phNxpNciHal_Sem_t*) pContext; 1023 1024 if (pInfo->wStatus == NFCSTATUS_SUCCESS) 1025 { 1026 NXPLOG_NCIHAL_D("write successful status = 0x%x", pInfo->wStatus); 1027 } 1028 else 1029 { 1030 NXPLOG_NCIHAL_E("write error status = 0x%x", pInfo->wStatus); 1031 } 1032 1033 p_cb_data->status = pInfo->wStatus; 1034 SEM_POST(p_cb_data); 1035 1036 return; 1037 } 1038 1039 /******************************************************************************* 1040 ** 1041 ** Function hal_read_cb 1042 ** 1043 ** Description Callback function for hal read. 1044 ** 1045 ** Returns None 1046 ** 1047 *******************************************************************************/ 1048 static void hal_read_cb(void *pContext, phTmlNfc_TransactInfo_t *pInfo) 1049 { 1050 phNxpNciHal_Sem_t *p_cb_data = (phNxpNciHal_Sem_t*) pContext; 1051 NFCSTATUS status; 1052 if(hal_write_timer_fired == 1) 1053 { 1054 NXPLOG_NCIHAL_D("hal_read_cb - response timeout occurred"); 1055 1056 hal_write_timer_fired = 0; 1057 p_cb_data->status = NFCSTATUS_RESPONSE_TIMEOUT; 1058 status = phTmlNfc_ReadAbort(); 1059 } 1060 else 1061 { 1062 NFCSTATUS status = phOsalNfc_Timer_Stop(timeoutTimerId); 1063 1064 if (NFCSTATUS_SUCCESS == status) 1065 { 1066 NXPLOG_NCIHAL_D("Response timer stopped"); 1067 } 1068 else 1069 { 1070 NXPLOG_NCIHAL_E("Response timer stop ERROR!!!"); 1071 p_cb_data->status = NFCSTATUS_FAILED; 1072 } 1073 if (pInfo == NULL) 1074 { 1075 NXPLOG_NCIHAL_E ("Empty TransactInfo"); 1076 p_cb_data->status = NFCSTATUS_FAILED; 1077 } 1078 else 1079 { 1080 if (pInfo->wStatus == NFCSTATUS_SUCCESS) 1081 { 1082 NXPLOG_NCIHAL_D ("hal_read_cb successful status = 0x%x", pInfo->wStatus); 1083 p_cb_data->status = NFCSTATUS_SUCCESS; 1084 } 1085 else 1086 { 1087 NXPLOG_NCIHAL_E ("hal_read_cb error status = 0x%x", pInfo->wStatus); 1088 p_cb_data->status = NFCSTATUS_FAILED; 1089 } 1090 1091 p_cb_data->status = pInfo->wStatus; 1092 nci_test_data_t *test_data = (nci_test_data_t*) p_cb_data->pContext; 1093 1094 if (test_data->exp_rsp.len == 0) 1095 { 1096 /* Compare the actual notification with expected notification.*/ 1097 if(test_data->ntf_validator (&(test_data->exp_ntf), pInfo) == 1 ) 1098 { 1099 p_cb_data->status = NFCSTATUS_SUCCESS; 1100 } 1101 else 1102 { 1103 p_cb_data->status = NFCSTATUS_FAILED; 1104 } 1105 } 1106 1107 /* Compare the actual response with expected response.*/ 1108 else if (test_data->rsp_validator (&(test_data->exp_rsp), pInfo) == 1) 1109 { 1110 p_cb_data->status = NFCSTATUS_SUCCESS; 1111 } 1112 else 1113 { 1114 p_cb_data->status = NFCSTATUS_FAILED; 1115 } 1116 1117 test_data->exp_rsp.len = 0; 1118 } 1119 } 1120 1121 SEM_POST (p_cb_data); 1122 1123 return; 1124 } 1125 1126 /******************************************************************************* 1127 ** 1128 ** Function phNxpNciHal_test_rx_thread 1129 ** 1130 ** Description Thread to fetch and process messages from message queue. 1131 ** 1132 ** Returns NULL 1133 ** 1134 *******************************************************************************/ 1135 static void *phNxpNciHal_test_rx_thread(void *arg) 1136 { 1137 phLibNfc_Message_t msg; 1138 UNUSED(arg); 1139 NXPLOG_NCIHAL_D("Self test thread started"); 1140 1141 thread_running = 1; 1142 1143 while (thread_running == 1) 1144 { 1145 /* Fetch next message from the NFC stack message queue */ 1146 if (phDal4Nfc_msgrcv(gDrvCfg.nClientId, 1147 &msg, 0, 0) == -1) 1148 { 1149 NXPLOG_NCIHAL_E("Received bad message"); 1150 continue; 1151 } 1152 1153 if(thread_running == 0) 1154 { 1155 break; 1156 } 1157 1158 switch (msg.eMsgType) 1159 { 1160 case PH_LIBNFC_DEFERREDCALL_MSG: 1161 { 1162 phLibNfc_DeferredCall_t *deferCall = 1163 (phLibNfc_DeferredCall_t *) (msg.pMsgData); 1164 1165 REENTRANCE_LOCK(); 1166 deferCall->pCallback(deferCall->pParameter); 1167 REENTRANCE_UNLOCK(); 1168 1169 break; 1170 } 1171 } 1172 } 1173 1174 NXPLOG_NCIHAL_D("Self test thread stopped"); 1175 1176 return NULL; 1177 } 1178 1179 /******************************************************************************* 1180 ** 1181 ** Function phNxpNciHal_readLocked 1182 ** 1183 ** Description Reads response and notification from NFCC and waits for 1184 ** read completion, for a definitive timeout value. 1185 ** 1186 ** Returns NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED, 1187 ** NFCSTATUS_RESPONSE_TIMEOUT in case of timeout. 1188 ** 1189 *******************************************************************************/ 1190 static NFCSTATUS phNxpNciHal_readLocked(nci_test_data_t *pData ) 1191 { 1192 NFCSTATUS status = NFCSTATUS_SUCCESS; 1193 phNxpNciHal_Sem_t cb_data; 1194 uint16_t read_len = 16; 1195 /* RX Buffer */ 1196 uint32_t rx_data[NCI_MAX_DATA_LEN]; 1197 1198 /* Create the local semaphore */ 1199 if (phNxpNciHal_init_cb_data(&cb_data, pData) != NFCSTATUS_SUCCESS) 1200 { 1201 NXPLOG_NCIHAL_D("phTmlNfc_Read Create cb data failed"); 1202 status = NFCSTATUS_FAILED; 1203 goto clean_and_return; 1204 } 1205 1206 /* call read pending */ 1207 status = phTmlNfc_Read( 1208 (uint8_t *) rx_data, 1209 (uint16_t) read_len, 1210 (pphTmlNfc_TransactCompletionCb_t) &hal_read_cb, 1211 &cb_data); 1212 1213 if (status != NFCSTATUS_PENDING) 1214 { 1215 NXPLOG_NCIHAL_E("TML Read status error status = %x", status); 1216 status = NFCSTATUS_FAILED; 1217 goto clean_and_return; 1218 } 1219 1220 status = phOsalNfc_Timer_Start(timeoutTimerId, 1221 HAL_WRITE_RSP_TIMEOUT, 1222 &hal_write_rsp_timeout_cb, 1223 &cb_data); 1224 1225 if (NFCSTATUS_SUCCESS == status) 1226 { 1227 NXPLOG_NCIHAL_D("Response timer started"); 1228 } 1229 else 1230 { 1231 NXPLOG_NCIHAL_E("Response timer not started"); 1232 status = NFCSTATUS_FAILED; 1233 goto clean_and_return; 1234 } 1235 1236 /* Wait for callback response */ 1237 if (SEM_WAIT(cb_data)) 1238 { 1239 NXPLOG_NCIHAL_E("phTmlNfc_Read semaphore error"); 1240 status = NFCSTATUS_FAILED; 1241 goto clean_and_return; 1242 } 1243 1244 if(cb_data.status == NFCSTATUS_RESPONSE_TIMEOUT) 1245 { 1246 NXPLOG_NCIHAL_E("Response timeout!!!"); 1247 status = NFCSTATUS_RESPONSE_TIMEOUT; 1248 goto clean_and_return; 1249 1250 } 1251 1252 if (cb_data.status != NFCSTATUS_SUCCESS) 1253 { 1254 NXPLOG_NCIHAL_E("phTmlNfc_Read failed "); 1255 status = NFCSTATUS_FAILED; 1256 goto clean_and_return; 1257 } 1258 1259 clean_and_return: 1260 phNxpNciHal_cleanup_cb_data(&cb_data); 1261 1262 return status; 1263 } 1264 1265 /******************************************************************************* 1266 ** 1267 ** Function phNxpNciHal_writeLocked 1268 ** 1269 ** Description Send command to NFCC and waits for cmd write completion, for 1270 ** a definitive timeout value. 1271 ** 1272 ** Returns NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED, 1273 ** NFCSTATUS_RESPONSE_TIMEOUT in case of timeout. 1274 ** 1275 *******************************************************************************/ 1276 static NFCSTATUS phNxpNciHal_writeLocked(nci_test_data_t *pData ) 1277 { 1278 NFCSTATUS status = NFCSTATUS_SUCCESS; 1279 1280 phNxpNciHal_Sem_t cb_data; 1281 int retryCnt = 0; 1282 1283 /* Create the local semaphore */ 1284 if (phNxpNciHal_init_cb_data(&cb_data, NULL) != NFCSTATUS_SUCCESS) 1285 { 1286 NXPLOG_NCIHAL_D("phTmlNfc_Write Create cb data failed"); 1287 goto clean_and_return; 1288 } 1289 1290 retry: 1291 status = phTmlNfc_Write(pData->cmd.p_data, pData->cmd.len, 1292 (pphTmlNfc_TransactCompletionCb_t) &hal_write_cb, &cb_data); 1293 1294 if (status != NFCSTATUS_PENDING) 1295 { 1296 NXPLOG_NCIHAL_E("phTmlNfc_Write status error"); 1297 goto clean_and_return; 1298 } 1299 1300 /* Wait for callback response */ 1301 if (SEM_WAIT(cb_data)) 1302 { 1303 NXPLOG_NCIHAL_E("write_unlocked semaphore error"); 1304 status = NFCSTATUS_FAILED; 1305 goto clean_and_return; 1306 } 1307 1308 if (cb_data.status != NFCSTATUS_SUCCESS && retryCnt < HAL_WRITE_MAX_RETRY) 1309 { 1310 retryCnt++; 1311 NXPLOG_NCIHAL_E("write_unlocked failed - PN54X Maybe in Standby Mode - Retry %d",retryCnt); 1312 goto retry; 1313 } 1314 1315 status = cb_data.status; 1316 1317 clean_and_return: 1318 phNxpNciHal_cleanup_cb_data(&cb_data); 1319 1320 return status; 1321 } 1322 1323 /******************************************************************************* 1324 ** 1325 ** Function phNxpNciHal_performTest 1326 ** 1327 ** Description Performs a single cycle of command,response and 1328 ** notification. 1329 ** 1330 ** Returns NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED, 1331 ** 1332 *******************************************************************************/ 1333 NFCSTATUS phNxpNciHal_performTest(nci_test_data_t *pData ) 1334 { 1335 NFCSTATUS status = NFCSTATUS_SUCCESS; 1336 1337 if(NULL == pData) 1338 { 1339 return NFCSTATUS_FAILED; 1340 } 1341 1342 CONCURRENCY_LOCK(); 1343 1344 status = phNxpNciHal_writeLocked(pData); 1345 1346 if(status == NFCSTATUS_RESPONSE_TIMEOUT) 1347 { 1348 goto clean_and_return; 1349 } 1350 if(status != NFCSTATUS_SUCCESS) 1351 { 1352 goto clean_and_return; 1353 } 1354 1355 status = phNxpNciHal_readLocked(pData); 1356 1357 if(status != NFCSTATUS_SUCCESS) 1358 { 1359 goto clean_and_return; 1360 } 1361 1362 if(0 != pData->exp_ntf.len) 1363 { 1364 status = phNxpNciHal_readLocked(pData); 1365 1366 if(status != NFCSTATUS_SUCCESS) 1367 { 1368 goto clean_and_return; 1369 } 1370 } 1371 1372 clean_and_return: 1373 CONCURRENCY_UNLOCK(); 1374 return status; 1375 } 1376 1377 /******************************************************************************* 1378 ** 1379 ** Function phNxpNciHal_TestMode_open 1380 ** 1381 ** Description It opens the physical connection with NFCC (PN54X) and 1382 ** creates required client thread for operation. 1383 ** 1384 ** Returns NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED. 1385 ** 1386 *******************************************************************************/ 1387 NFCSTATUS phNxpNciHal_TestMode_open (void) 1388 { 1389 /* Thread */ 1390 pthread_t test_rx_thread; 1391 1392 phOsalNfc_Config_t tOsalConfig; 1393 phTmlNfc_Config_t tTmlConfig; 1394 char *nfc_dev_node = NULL; 1395 const uint16_t max_len = 260; 1396 NFCSTATUS status = NFCSTATUS_SUCCESS; 1397 uint16_t read_len = 255; 1398 int8_t ret_val = 0x00; 1399 /* initialize trace level */ 1400 phNxpLog_InitializeLogLevel(); 1401 1402 if (phNxpNciHal_init_monitor() == NULL) 1403 { 1404 NXPLOG_NCIHAL_E("Init monitor failed"); 1405 return NFCSTATUS_FAILED; 1406 } 1407 1408 CONCURRENCY_LOCK(); 1409 1410 memset(&tOsalConfig, 0x00, sizeof(tOsalConfig)); 1411 memset(&tTmlConfig, 0x00, sizeof(tTmlConfig)); 1412 1413 /* Read the nfc device node name */ 1414 nfc_dev_node = (char*) malloc (max_len * sizeof (char*)); 1415 if (nfc_dev_node == NULL) 1416 { 1417 NXPLOG_NCIHAL_E ("malloc of nfc_dev_node failed "); 1418 goto clean_and_return; 1419 } 1420 else if (!GetNxpStrValue (NAME_NXP_NFC_DEV_NODE, nfc_dev_node, sizeof (nfc_dev_node))) 1421 { 1422 NXPLOG_NCIHAL_E ("Invalid nfc device node name keeping the default device node /dev/pn544"); 1423 strcpy (nfc_dev_node, "/dev/pn544"); 1424 } 1425 1426 gDrvCfg.nClientId = phDal4Nfc_msgget(0, 0600); 1427 gDrvCfg.nLinkType = ENUM_LINK_TYPE_I2C;/* For PN54X */ 1428 tTmlConfig.pDevName = (int8_t *) nfc_dev_node; 1429 tOsalConfig.dwCallbackThreadId = (uintptr_t) gDrvCfg.nClientId; 1430 tOsalConfig.pLogFile = NULL; 1431 tTmlConfig.dwGetMsgThreadId = (uintptr_t) gDrvCfg.nClientId; 1432 nxpncihal_ctrl.gDrvCfg.nClientId = (uintptr_t) gDrvCfg.nClientId; 1433 1434 /* Initialize TML layer */ 1435 status = phTmlNfc_Init(&tTmlConfig); 1436 if (status != NFCSTATUS_SUCCESS) 1437 { 1438 NXPLOG_NCIHAL_E("phTmlNfc_Init Failed"); 1439 goto clean_and_return; 1440 } 1441 else 1442 { 1443 if (nfc_dev_node != NULL) 1444 { 1445 free (nfc_dev_node); 1446 nfc_dev_node = NULL; 1447 } 1448 } 1449 1450 pthread_attr_t attr; 1451 pthread_attr_init (&attr); 1452 pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); 1453 ret_val = pthread_create (&test_rx_thread, &attr, 1454 phNxpNciHal_test_rx_thread, NULL); 1455 pthread_attr_destroy (&attr); 1456 if (ret_val != 0) 1457 { 1458 NXPLOG_NCIHAL_E("pthread_create failed"); 1459 phTmlNfc_Shutdown(); 1460 goto clean_and_return; 1461 } 1462 1463 timeoutTimerId = phOsalNfc_Timer_Create(); 1464 1465 if(timeoutTimerId == 0xFFFF) 1466 { 1467 NXPLOG_NCIHAL_E("phOsalNfc_Timer_Create failed"); 1468 } 1469 else 1470 { 1471 NXPLOG_NCIHAL_D("phOsalNfc_Timer_Create SUCCESS"); 1472 } 1473 CONCURRENCY_UNLOCK(); 1474 1475 return NFCSTATUS_SUCCESS; 1476 1477 clean_and_return: 1478 CONCURRENCY_UNLOCK (); 1479 if (nfc_dev_node != NULL) 1480 { 1481 free (nfc_dev_node); 1482 nfc_dev_node = NULL; 1483 } 1484 phNxpNciHal_cleanup_monitor (); 1485 return NFCSTATUS_FAILED; 1486 } 1487 1488 /******************************************************************************* 1489 ** 1490 ** Function phNxpNciHal_TestMode_close 1491 ** 1492 ** Description This function close the NFCC interface and free all 1493 ** resources. 1494 ** 1495 ** Returns None. 1496 ** 1497 *******************************************************************************/ 1498 1499 void phNxpNciHal_TestMode_close () 1500 { 1501 1502 NFCSTATUS status = NFCSTATUS_SUCCESS; 1503 1504 CONCURRENCY_LOCK(); 1505 1506 if (NULL != gpphTmlNfc_Context->pDevHandle) 1507 { 1508 /* Abort any pending read and write */ 1509 status = phTmlNfc_ReadAbort(); 1510 status = phTmlNfc_WriteAbort(); 1511 1512 phOsalNfc_Timer_Cleanup(); 1513 1514 status = phTmlNfc_Shutdown(); 1515 1516 NXPLOG_NCIHAL_D("phNxpNciHal_close return status = %d", status); 1517 1518 thread_running = 0; 1519 1520 phDal4Nfc_msgrelease(gDrvCfg.nClientId); 1521 1522 status = phOsalNfc_Timer_Delete(timeoutTimerId); 1523 } 1524 1525 CONCURRENCY_UNLOCK(); 1526 1527 phNxpNciHal_cleanup_monitor(); 1528 1529 /* Return success always */ 1530 return; 1531 } 1532 1533 /******************************************************************************* 1534 ** 1535 ** Function phNxpNciHal_SwpTest 1536 ** 1537 ** Description Test function to validate the SWP line. SWP line number is 1538 ** is sent as parameter to the API. 1539 ** 1540 ** Returns NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED. 1541 ** 1542 *******************************************************************************/ 1543 1544 NFCSTATUS phNxpNciHal_SwpTest(uint8_t swp_line) 1545 { 1546 NFCSTATUS status = NFCSTATUS_SUCCESS; 1547 int len = 0; 1548 int cnt = 0; 1549 1550 NXPLOG_NCIHAL_D("phNxpNciHal_SwpTest - start\n"); 1551 1552 if(swp_line == 0x01) 1553 { 1554 len = (sizeof(swp1_test_data)/sizeof(swp1_test_data[0])); 1555 1556 for(cnt = 0; cnt < len; cnt++) 1557 { 1558 status = phNxpNciHal_performTest(&(swp1_test_data[cnt])); 1559 if(status == NFCSTATUS_RESPONSE_TIMEOUT || 1560 status == NFCSTATUS_FAILED 1561 ) 1562 { 1563 break; 1564 } 1565 } 1566 } 1567 else if(swp_line == 0x02) 1568 { 1569 len = (sizeof(swp2_test_data)/sizeof(swp2_test_data[0])); 1570 1571 for(cnt = 0; cnt < len; cnt++) 1572 { 1573 status = phNxpNciHal_performTest(&(swp2_test_data[cnt])); 1574 if(status == NFCSTATUS_RESPONSE_TIMEOUT || 1575 status == NFCSTATUS_FAILED 1576 ) 1577 { 1578 break; 1579 } 1580 } 1581 } 1582 else 1583 { 1584 status = NFCSTATUS_FAILED; 1585 } 1586 1587 if( status == NFCSTATUS_SUCCESS) 1588 { 1589 NXPLOG_NCIHAL_D("phNxpNciHal_SwpTest - SUCCESSS\n"); 1590 } 1591 else 1592 { 1593 NXPLOG_NCIHAL_D("phNxpNciHal_SwpTest - FAILED\n"); 1594 } 1595 1596 NXPLOG_NCIHAL_D("phNxpNciHal_SwpTest - end\n"); 1597 1598 return status; 1599 } 1600 1601 /******************************************************************************* 1602 ** 1603 ** Function phNxpNciHal_PrbsTestStart 1604 ** 1605 ** Description Test function start RF generation for RF technology and bit 1606 ** rate. RF technology and bit rate are sent as parameter to 1607 ** the API. 1608 ** 1609 ** Returns NFCSTATUS_SUCCESS if RF generation successful, 1610 ** otherwise NFCSTATUS_FAILED. 1611 ** 1612 *******************************************************************************/ 1613 1614 #if(NFC_NXP_CHIP_TYPE != PN547C2) 1615 NFCSTATUS phNxpNciHal_PrbsTestStart (phNxpNfc_PrbsType_t prbs_type, phNxpNfc_PrbsHwType_t hw_prbs_type, 1616 phNxpNfc_Tech_t tech, phNxpNfc_Bitrate_t bitrate) 1617 #else 1618 NFCSTATUS phNxpNciHal_PrbsTestStart (phNxpNfc_Tech_t tech, phNxpNfc_Bitrate_t bitrate) 1619 #endif 1620 { 1621 NFCSTATUS status = NFCSTATUS_FAILED; 1622 1623 nci_test_data_t prbs_cmd_data; 1624 1625 #if(NFC_NXP_CHIP_TYPE != PN547C2) 1626 uint8_t rsp_cmd_info[] = {0x4F, 0x30, 0x01, 0x00}; 1627 prbs_cmd_data.cmd.len = 0x09; 1628 #else 1629 uint8_t rsp_cmd_info[] = {0x4F, 0x30, 0x01, 0x00}; 1630 prbs_cmd_data.cmd.len = 0x07; 1631 #endif 1632 1633 memcpy(prbs_cmd_data.exp_rsp.p_data, &rsp_cmd_info[0], sizeof(rsp_cmd_info)); 1634 prbs_cmd_data.exp_rsp.len = sizeof(rsp_cmd_info); 1635 1636 //prbs_cmd_data.exp_rsp.len = 0x00; 1637 prbs_cmd_data.exp_ntf.len = 0x00; 1638 prbs_cmd_data.rsp_validator = st_validator_testEquals; 1639 prbs_cmd_data.ntf_validator = st_validator_null; 1640 1641 uint8_t len = 0; 1642 uint8_t cnt = 0; 1643 1644 // [NCI] -> [0x2F 0x30 0x04 0x00 0x00 0x01 0xFF] 1645 1646 #if(NFC_NXP_CHIP_TYPE != PN547C2) 1647 status = phNxpNciHal_getPrbsCmd(prbs_type, hw_prbs_type, tech, bitrate, 1648 prbs_cmd_data.cmd.p_data,prbs_cmd_data.cmd.len); 1649 #else 1650 status = phNxpNciHal_getPrbsCmd(tech, bitrate,prbs_cmd_data.cmd.p_data,prbs_cmd_data.cmd.len); 1651 #endif 1652 1653 if( status == NFCSTATUS_FAILED) 1654 { 1655 //Invalid Param. 1656 NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStart - INVALID_PARAM\n"); 1657 1658 goto clean_and_return; 1659 } 1660 1661 len = (sizeof(prbs_test_data)/sizeof(prbs_test_data[0])); 1662 1663 for(cnt = 0; cnt < len; cnt++) 1664 { 1665 status = phNxpNciHal_performTest(&(prbs_test_data[cnt])); 1666 if(status == NFCSTATUS_RESPONSE_TIMEOUT || 1667 status == NFCSTATUS_FAILED 1668 ) 1669 { 1670 break; 1671 } 1672 } 1673 1674 /* Ignoring status, as there will be no response - Applicable till FW version 8.1.1*/ 1675 status = phNxpNciHal_performTest(&prbs_cmd_data); 1676 clean_and_return: 1677 1678 if( status == NFCSTATUS_SUCCESS) 1679 { 1680 NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStart - SUCCESSS\n"); 1681 } 1682 else 1683 { 1684 NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStart - FAILED\n"); 1685 } 1686 1687 NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStart - end\n"); 1688 1689 return status; 1690 } 1691 1692 /******************************************************************************* 1693 ** 1694 ** Function phNxpNciHal_PrbsTestStop 1695 ** 1696 ** Description Test function stop RF generation for RF technology started 1697 ** by phNxpNciHal_PrbsTestStart. 1698 ** 1699 ** Returns NFCSTATUS_SUCCESS if operation successful, 1700 ** otherwise NFCSTATUS_FAILED. 1701 ** 1702 *******************************************************************************/ 1703 1704 NFCSTATUS phNxpNciHal_PrbsTestStop () 1705 { 1706 NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStop - Start\n"); 1707 1708 NFCSTATUS status = NFCSTATUS_SUCCESS; 1709 1710 status = phTmlNfc_IoCtl(phTmlNfc_e_ResetDevice); 1711 1712 if(NFCSTATUS_SUCCESS == status) 1713 { 1714 NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStop - SUCCESS\n"); 1715 } 1716 else 1717 { 1718 NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStop - FAILED\n"); 1719 1720 } 1721 NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStop - end\n"); 1722 1723 return status; 1724 } 1725 1726 /******************************************************************************* 1727 ** 1728 ** Function phNxpNciHal_getPrbsCmd 1729 ** 1730 ** Description Test function frames the PRBS command. 1731 ** 1732 ** Returns NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED. 1733 ** 1734 *******************************************************************************/ 1735 #if(NFC_NXP_CHIP_TYPE != PN547C2) 1736 NFCSTATUS phNxpNciHal_getPrbsCmd (phNxpNfc_PrbsType_t prbs_type, phNxpNfc_PrbsHwType_t hw_prbs_type, 1737 uint8_t tech, uint8_t bitrate, uint8_t *prbs_cmd, uint8_t prbs_cmd_len) 1738 #else 1739 NFCSTATUS phNxpNciHal_getPrbsCmd (uint8_t tech, uint8_t bitrate, uint8_t *prbs_cmd, uint8_t prbs_cmd_len) 1740 #endif 1741 { 1742 NFCSTATUS status = NFCSTATUS_SUCCESS; 1743 int position_tech_param = 0; 1744 int position_bit_param = 0; 1745 1746 NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - tech 0x%x bitrate = 0x%x", tech, bitrate); 1747 if(NULL == prbs_cmd || 1748 #if(NFC_NXP_CHIP_TYPE != PN547C2) 1749 prbs_cmd_len != 0x09) 1750 #else 1751 prbs_cmd_len != 0x07) 1752 #endif 1753 { 1754 return status; 1755 } 1756 1757 prbs_cmd[0] = 0x2F; 1758 prbs_cmd[1] = 0x30; 1759 #if(NFC_NXP_CHIP_TYPE != PN547C2) 1760 prbs_cmd[2] = 0x06; 1761 prbs_cmd[3] = (uint8_t)prbs_type; 1762 //0xFF Error value used for validation. 1763 prbs_cmd[4] = (uint8_t)hw_prbs_type; 1764 prbs_cmd[5] = 0xFF;//TECH 1765 prbs_cmd[6] = 0xFF;//BITRATE 1766 prbs_cmd[7] = 0x01; 1767 prbs_cmd[8] = 0xFF; 1768 position_tech_param = 5; 1769 position_bit_param = 6; 1770 #else 1771 prbs_cmd[2] = 0x04; 1772 //0xFF Error value used for validation. 1773 prbs_cmd[3] = 0xFF;//TECH 1774 //0xFF Error value used for validation. 1775 prbs_cmd[4] = 0xFF;//BITRATE 1776 prbs_cmd[5] = 0x01; 1777 prbs_cmd[6] = 0xFF; 1778 position_tech_param = 3; 1779 position_bit_param = 4; 1780 #endif 1781 1782 switch (tech) { 1783 case NFC_RF_TECHNOLOGY_A: 1784 NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - NFC_RF_TECHNOLOGY_A"); 1785 prbs_cmd[position_tech_param] = 0x00; 1786 break; 1787 case NFC_RF_TECHNOLOGY_B: 1788 NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - NFC_RF_TECHNOLOGY_B"); 1789 prbs_cmd[position_tech_param] = 0x01; 1790 break; 1791 case NFC_RF_TECHNOLOGY_F: 1792 NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - NFC_RF_TECHNOLOGY_F"); 1793 prbs_cmd[position_tech_param] = 0x02; 1794 break; 1795 default: 1796 break; 1797 } 1798 1799 switch (bitrate) 1800 { 1801 case NFC_BIT_RATE_106: 1802 NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - NFC_BIT_RATE_106"); 1803 if(prbs_cmd[position_tech_param] != 0x02) 1804 { 1805 prbs_cmd[position_bit_param] = 0x00; 1806 } 1807 break; 1808 case NFC_BIT_RATE_212: 1809 NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - NFC_BIT_RATE_212"); 1810 prbs_cmd[position_bit_param] = 0x01; 1811 break; 1812 case NFC_BIT_RATE_424: 1813 NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - NFC_BIT_RATE_424"); 1814 prbs_cmd[position_bit_param] = 0x02; 1815 break; 1816 case NFC_BIT_RATE_848: 1817 NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - NFC_BIT_RATE_848"); 1818 if(prbs_cmd[position_tech_param] != 0x02) 1819 { 1820 prbs_cmd[position_bit_param] = 0x03; 1821 } 1822 break; 1823 default: 1824 break; 1825 } 1826 1827 if(prbs_cmd[position_tech_param] == 0xFF || prbs_cmd[position_bit_param] == 0xFF) 1828 { 1829 //Invalid Param. 1830 status = NFCSTATUS_FAILED; 1831 } 1832 1833 return status; 1834 } 1835 1836 /******************************************************************************* 1837 ** 1838 ** Function phNxpNciHal_RfFieldTest 1839 ** 1840 ** Description Test function performs RF filed test. 1841 ** 1842 ** Returns NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED. 1843 ** 1844 *******************************************************************************/ 1845 NFCSTATUS phNxpNciHal_RfFieldTest (uint8_t on) 1846 { 1847 NFCSTATUS status = NFCSTATUS_SUCCESS; 1848 int len = 0; 1849 int cnt = 0; 1850 1851 NXPLOG_NCIHAL_D("phNxpNciHal_RfFieldTest - start %x\n",on); 1852 1853 if(on == 0x01) 1854 { 1855 len = (sizeof(rf_field_on_test_data)/sizeof(rf_field_on_test_data[0])); 1856 1857 for(cnt = 0; cnt < len; cnt++) 1858 { 1859 status = phNxpNciHal_performTest(&(rf_field_on_test_data[cnt])); 1860 if(status == NFCSTATUS_RESPONSE_TIMEOUT || status == NFCSTATUS_FAILED) 1861 { 1862 break; 1863 } 1864 } 1865 } 1866 else if(on == 0x00) 1867 { 1868 len = (sizeof(rf_field_off_test_data)/sizeof(rf_field_off_test_data[0])); 1869 1870 for(cnt = 0; cnt < len; cnt++) 1871 { 1872 status = phNxpNciHal_performTest(&(rf_field_off_test_data[cnt])); 1873 if(status == NFCSTATUS_RESPONSE_TIMEOUT || status == NFCSTATUS_FAILED) 1874 { 1875 break; 1876 } 1877 } 1878 } 1879 else 1880 { 1881 status = NFCSTATUS_FAILED; 1882 } 1883 1884 if( status == NFCSTATUS_SUCCESS) 1885 { 1886 NXPLOG_NCIHAL_D("phNxpNciHal_RfFieldTest - SUCCESSS\n"); 1887 } 1888 else 1889 { 1890 NXPLOG_NCIHAL_D("phNxpNciHal_RfFieldTest - FAILED\n"); 1891 } 1892 1893 NXPLOG_NCIHAL_D("phNxpNciHal_RfFieldTest - end\n"); 1894 1895 return status; 1896 } 1897 1898 /******************************************************************************* 1899 ** 1900 ** Function phNxpNciHal_AntennaTest 1901 ** 1902 ** Description 1903 ** 1904 ** Returns 1905 ** 1906 *******************************************************************************/ 1907 NFCSTATUS phNxpNciHal_AntennaTest () 1908 { 1909 NFCSTATUS status = NFCSTATUS_FAILED; 1910 1911 return status; 1912 } 1913 1914 /******************************************************************************* 1915 ** 1916 ** Function phNxpNciHal_DownloadPinTest 1917 ** 1918 ** Description Test function to validate the FW download pin connection. 1919 ** 1920 ** Returns NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED. 1921 ** 1922 *******************************************************************************/ 1923 NFCSTATUS phNxpNciHal_DownloadPinTest(void) 1924 { 1925 NFCSTATUS status = NFCSTATUS_FAILED; 1926 int len = 0; 1927 int cnt = 0; 1928 1929 NXPLOG_NCIHAL_D("phNxpNciHal_DownloadPinTest - start\n"); 1930 1931 len = (sizeof(download_pin_test_data1)/sizeof(download_pin_test_data1[0])); 1932 1933 for(cnt = 0; cnt < len; cnt++) 1934 { 1935 status = phNxpNciHal_performTest(&(download_pin_test_data1[cnt])); 1936 if(status == NFCSTATUS_RESPONSE_TIMEOUT || status == NFCSTATUS_FAILED) 1937 { 1938 break; 1939 } 1940 } 1941 1942 if (status != NFCSTATUS_SUCCESS) 1943 { 1944 NXPLOG_NCIHAL_D("phNxpNciHal_DownloadPinTest - FAILED\n"); 1945 return status; 1946 } 1947 1948 status = NFCSTATUS_FAILED; 1949 status = phTmlNfc_IoCtl(phTmlNfc_e_EnableDownloadMode); 1950 if (NFCSTATUS_SUCCESS != status) 1951 { 1952 NXPLOG_NCIHAL_D("phNxpNciHal_DownloadPinTest - FAILED\n"); 1953 return status; 1954 } 1955 1956 status = NFCSTATUS_FAILED; 1957 len = (sizeof(download_pin_test_data2)/sizeof(download_pin_test_data2[0])); 1958 1959 for(cnt = 0; cnt < len; cnt++) 1960 { 1961 status = phNxpNciHal_performTest(&(download_pin_test_data2[cnt])); 1962 if(status == NFCSTATUS_RESPONSE_TIMEOUT || status == NFCSTATUS_FAILED) 1963 { 1964 break; 1965 } 1966 } 1967 1968 if( status == NFCSTATUS_SUCCESS) 1969 { 1970 NXPLOG_NCIHAL_D("phNxpNciHal_DownloadPinTest - SUCCESSS\n"); 1971 } 1972 else 1973 { 1974 NXPLOG_NCIHAL_D("phNxpNciHal_DownloadPinTest - FAILED\n"); 1975 } 1976 1977 NXPLOG_NCIHAL_D("phNxpNciHal_DownloadPinTest - end\n"); 1978 1979 return status; 1980 } 1981 /******************************************************************************* 1982 ** 1983 ** Function phNxpNciHal_AntennaSelfTest 1984 ** 1985 ** Description Test function to validate the Antenna's discrete 1986 ** components connection. 1987 ** 1988 ** Returns NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED. 1989 ** 1990 *******************************************************************************/ 1991 NFCSTATUS phNxpNciHal_AntennaSelfTest(phAntenna_St_Resp_t * phAntenna_St_Resp ) 1992 { 1993 NFCSTATUS status = NFCSTATUS_FAILED; 1994 NFCSTATUS antenna_st_status = NFCSTATUS_FAILED; 1995 int len = 0; 1996 int cnt = 0; 1997 1998 NXPLOG_NCIHAL_D("phNxpNciHal_AntennaSelfTest - start\n"); 1999 memcpy(&phAntenna_resp, phAntenna_St_Resp, sizeof(phAntenna_St_Resp_t)); 2000 len = (sizeof(antenna_self_test_data)/sizeof(antenna_self_test_data[0])); 2001 2002 for(cnt = 0; cnt < len; cnt++) 2003 { 2004 status = phNxpNciHal_performTest(&(antenna_self_test_data[cnt])); 2005 if(status == NFCSTATUS_RESPONSE_TIMEOUT || status == NFCSTATUS_FAILED) 2006 { 2007 NXPLOG_NCIHAL_E("phNxpNciHal_AntennaSelfTest: commnad execution - FAILED\n"); 2008 break; 2009 } 2010 } 2011 2012 if(status == NFCSTATUS_SUCCESS) 2013 { 2014 if((gtxldo_status == NFCSTATUS_SUCCESS) && (gagc_value_status == NFCSTATUS_SUCCESS) && 2015 (gagc_nfcld_status == NFCSTATUS_SUCCESS) && (gagc_differential_status == NFCSTATUS_SUCCESS)) 2016 { 2017 antenna_st_status = NFCSTATUS_SUCCESS; 2018 NXPLOG_NCIHAL_D("phNxpNciHal_AntennaSelfTest - SUCESS\n"); 2019 } 2020 else 2021 { 2022 NXPLOG_NCIHAL_D("phNxpNciHal_AntennaSelfTest - FAILED\n"); 2023 } 2024 } 2025 else 2026 { 2027 NXPLOG_NCIHAL_D("phNxpNciHal_AntennaSelfTest - FAILED\n"); 2028 } 2029 2030 NXPLOG_NCIHAL_D("phNxpNciHal_AntennaSelfTest - end\n"); 2031 2032 return antenna_st_status; 2033 } 2034 2035 #endif /*#ifdef NXP_HW_SELF_TEST*/ 2036