aboutsummaryrefslogtreecommitdiff
path: root/pn54x/self-test/phNxpNciHal_SelfTest.c
diff options
context:
space:
mode:
Diffstat (limited to 'pn54x/self-test/phNxpNciHal_SelfTest.c')
-rw-r--r--pn54x/self-test/phNxpNciHal_SelfTest.c1847
1 files changed, 1847 insertions, 0 deletions
diff --git a/pn54x/self-test/phNxpNciHal_SelfTest.c b/pn54x/self-test/phNxpNciHal_SelfTest.c
new file mode 100644
index 0000000..37d6a3e
--- /dev/null
+++ b/pn54x/self-test/phNxpNciHal_SelfTest.c
@@ -0,0 +1,1847 @@
+/*
+ * Copyright (C) 2012-2014 NXP Semiconductors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifdef NXP_HW_SELF_TEST
+
+#include <phNxpConfig.h>
+#include <phNxpLog.h>
+#include <phNxpNciHal_SelfTest.h>
+#include <phOsalNfc_Timer.h>
+#include <pthread.h>
+
+/* Timeout value to wait for response from PN54X */
+#define HAL_WRITE_RSP_TIMEOUT (2000)
+#define HAL_WRITE_MAX_RETRY (10)
+
+/******************* Structures and definitions *******************************/
+
+typedef uint8_t (*st_validator_t)(nci_data_t* exp,
+ phTmlNfc_TransactInfo_t* act);
+
+phAntenna_St_Resp_t phAntenna_resp;
+
+typedef struct nci_test_data {
+ nci_data_t cmd;
+ nci_data_t exp_rsp;
+ nci_data_t exp_ntf;
+ st_validator_t rsp_validator;
+ st_validator_t ntf_validator;
+
+} nci_test_data_t;
+
+/******************* Global variables *****************************************/
+
+static int thread_running = 0;
+static uint32_t timeoutTimerId = 0;
+static int hal_write_timer_fired = 0;
+
+/* TML Context */
+extern phTmlNfc_Context_t* gpphTmlNfc_Context;
+
+/* Global HAL Ref */
+extern phNxpNciHal_Control_t nxpncihal_ctrl;
+
+/* Driver parameters */
+phLibNfc_sConfig_t gDrvCfg;
+
+NFCSTATUS gtxldo_status = NFCSTATUS_FAILED;
+NFCSTATUS gagc_value_status = NFCSTATUS_FAILED;
+NFCSTATUS gagc_nfcld_status = NFCSTATUS_FAILED;
+NFCSTATUS gagc_differential_status = NFCSTATUS_FAILED;
+
+static uint8_t st_validator_testEquals(nci_data_t* exp,
+ phTmlNfc_TransactInfo_t* act);
+static uint8_t st_validator_null(nci_data_t* exp, phTmlNfc_TransactInfo_t* act);
+static uint8_t st_validator_testSWP1_vltg(nci_data_t* exp,
+ phTmlNfc_TransactInfo_t* act);
+static uint8_t st_validator_testAntenna_Txldo(nci_data_t* exp,
+ phTmlNfc_TransactInfo_t* act);
+static uint8_t st_validator_testAntenna_AgcVal(nci_data_t* exp,
+ phTmlNfc_TransactInfo_t* act);
+static uint8_t st_validator_testAntenna_AgcVal_FixedNfcLd(
+ nci_data_t* exp, phTmlNfc_TransactInfo_t* act);
+static uint8_t st_validator_testAntenna_AgcVal_Differential(
+ nci_data_t* exp, phTmlNfc_TransactInfo_t* act);
+
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+NFCSTATUS phNxpNciHal_getPrbsCmd(phNxpNfc_PrbsType_t prbs_type,
+ phNxpNfc_PrbsHwType_t hw_prbs_type,
+ uint8_t tech, uint8_t bitrate,
+ uint8_t* prbs_cmd, uint8_t prbs_cmd_len);
+#else
+NFCSTATUS phNxpNciHal_getPrbsCmd(uint8_t tech, uint8_t bitrate,
+ uint8_t* prbs_cmd, uint8_t prbs_cmd_len);
+#endif
+/* Test data to validate SWP line 2*/
+static nci_test_data_t swp2_test_data[] = {
+ {{
+ 0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
+ },
+ {
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ 0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */
+#else
+ 0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00} /* exp_rsp */
+#endif
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null},
+ {{
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ 0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
+#else
+ 0x03, {0x20, 0x01, 0x00}
+#endif
+ },
+ {
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ 0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
+#else
+ 0x4, {0x40, 0x01, 0x17, 0x00}
+#endif
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null},
+ {{
+ 0x03, {0x2F, 0x02, 0x00} /* cmd */
+ },
+ {
+ 0x04, {0x4F, 0x02, 0x05, 0x00} /* exp_rsp */
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null},
+ {{
+ 0x04, {0x2F, 0x3E, 0x01, 0x01} /* cmd */
+ },
+ {
+ 0x04, {0x4F, 0x3E, 0x01, 0x00} /* exp_rsp */
+ },
+ {
+ 0x04, {0x6F, 0x3E, 0x02, 0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_testEquals},
+
+};
+
+/* Test data to validate SWP line 1*/
+static nci_test_data_t swp1_test_data[] = {
+
+ {{
+ 0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
+ },
+ {
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ 0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */
+#else
+ 0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00} /* exp_rsp */
+#endif
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null},
+ {{
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ 0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
+#else
+ 0x03, {0x20, 0x01, 0x00}
+#endif
+ },
+ {
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ 0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
+#else
+ 0x4, {0x40, 0x01, 0x17, 0x00}
+#endif
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null},
+ {{
+ 0x03, {0x2F, 0x02, 0x00} /* cmd */
+ },
+ {
+ 0x04, {0x4F, 0x02, 0x05, 0x00} /* exp_rsp */
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null},
+ {{
+ 0x04, {0x2F, 0x3E, 0x01, 0x00} /* cmd */
+ },
+ {
+ 0x04, {0x4F, 0x3E, 0x01, 0x00} /* exp_rsp */
+ },
+ {
+ 0x04, {0x6F, 0x3E, 0x02, 0x00} /* ext_ntf */
+ },
+
+ st_validator_testEquals, /* validator */
+ st_validator_testSWP1_vltg},
+};
+
+static nci_test_data_t prbs_test_data[] = {
+ {{
+ 0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
+ },
+ {
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ 0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */
+#else
+ 0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00} /* exp_rsp */
+#endif
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null},
+ {{
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ 0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
+#else
+ 0x03, {0x20, 0x01, 0x00} /* cmd */
+#endif
+ },
+ {
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ 0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
+#else
+ 0x4, {0x40, 0x01, 0x17, 0x00} /* exp_rsp */
+#endif
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ },
+ {{
+ 0x04, {0x2F, 0x00, 0x01, 0x00} /* cmd */
+ },
+ {
+ 0x04, {0x4F, 0x00, 0x01, 0x00} /* exp_rsp */
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null
+#endif
+ }};
+
+/* for rf field test, first requires to disable the standby mode */
+static nci_test_data_t rf_field_on_test_data[] = {
+ {{
+ 0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
+ },
+ {
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ 0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */
+#else
+ 0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00} /* exp_rsp */
+#endif
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null},
+ {{
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ 0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
+#else
+ 0x03, {0x20, 0x01, 0x00} /* cmd */
+#endif
+ },
+ {
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ 0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
+#else
+ 0x4, {0x40, 0x01, 0x17, 0x00} /* exp_rsp */
+#endif
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null},
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ {{
+ 0x03, {0x2F, 0x02, 0x00} /* cmd */
+ },
+ {
+ 0x04, {0x4F, 0x02, 0x05, 0x00} /* exp_rsp */
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null},
+ {{
+ 0x04, {0x2F, 0x00, 0x01, 0x00} /* cmd */
+ },
+ {
+ 0x04, {0x4F, 0x00, 0x01, 0x00} /* exp_rsp */
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null},
+#endif
+ {{
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ 0x05, {0x2F, 0x3D, 0x02, 0x20, 0x01} /* cmd */
+#else
+ 0x08, {0x2F, 0x3D, 0x05, 0x20, 0x01, 0x00, 0x00, 0x00} /* cmd */
+#endif
+ },
+ {
+ 0x04, {0x4F, 0x3D, 0x05, 0x00} /* exp_rsp */
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ },
+ {{
+ 0x04, {0x2F, 0x00, 0x01, 0x01} /* cmd */
+ },
+ {
+ 0x04, {0x4F, 0x00, 0x01, 0x00} /* exp_rsp */
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null
+#endif
+ }};
+
+static nci_test_data_t rf_field_off_test_data[] = {
+ {{
+ 0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
+ },
+ {
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ 0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */
+#else
+ 0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00} /* exp_rsp */
+#endif
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null},
+ {{
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ 0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
+#else
+ 0x03, {0x20, 0x01, 0x00} /* cmd */
+#endif
+ },
+ {
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ 0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
+#else
+ 0x4, {0x40, 0x01, 0x17, 0x00} /* exp_rsp */
+#endif
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null},
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ {{
+ 0x03, {0x2F, 0x02, 0x00} /* cmd */
+ },
+ {
+ 0x04, {0x4F, 0x02, 0x05, 0x00} /* exp_rsp */
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null},
+ {{
+ 0x04, {0x2F, 0x00, 0x01, 0x00} /* cmd */
+ },
+ {
+ 0x04, {0x4F, 0x00, 0x01, 0x00} /* exp_rsp */
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null},
+#endif
+ {{
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ 0x05, {0x2F, 0x3D, 0x02, 0x20, 0x00} /* cmd */
+#else
+ 0x08, {0x2F, 0x3D, 0x05, 0x20, 0x00, 0x00, 0x00, 0x00} /* cmd */
+#endif
+ },
+ {
+ 0x04, {0x4F, 0x3D, 0x05, 0x00} /* exp_rsp */
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ },
+ {{
+ 0x04, {0x2F, 0x00, 0x01, 0x01} /* cmd */
+ },
+ {
+ 0x04, {0x4F, 0x00, 0x01, 0x00} /* exp_rsp */
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null
+#endif
+ }};
+
+/* Download pin test data 1 */
+static nci_test_data_t download_pin_test_data1[] = {
+ {{
+ 0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
+ },
+ {
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ 0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */
+#else
+ 0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00} /* exp_rsp */
+#endif
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null},
+};
+
+/* Download pin test data 2 */
+static nci_test_data_t download_pin_test_data2[] = {
+ {{
+ 0x08, {0x00, 0x04, 0xD0, 0x11, 0x00, 0x00, 0x5B, 0x46} /* cmd */
+ },
+ {
+ 0x08, {0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x87, 0x16} /* exp_rsp */
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null},
+};
+/* Antenna self test data*/
+static nci_test_data_t antenna_self_test_data[] = {
+ {{
+ 0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
+ },
+ {
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ 0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */
+#else
+ 0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00} /* exp_rsp */
+#endif
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null},
+ {{
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ 0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
+#else
+ 0x03, {0x20, 0x01, 0x00} /* cmd */
+#endif
+ },
+ {
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ 0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
+#else
+ 0x4, {0x40, 0x01, 0x17, 0x00} /* exp_rsp */
+#endif
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null},
+ {{
+ 0x03, {0x2F, 0x02, 0x00} /* cmd */
+ },
+ {
+ 0x04, {0x4F, 0x02, 0x05, 0x00} /* exp_rsp */
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null},
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ {{
+ 0x04, {0x2F, 0x00, 0x01, 0x00} /* cmd */
+ },
+ {
+ 0x04, {0x4F, 0x00, 0x01, 0x00} /* exp_rsp */
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null},
+#endif
+ {{
+ 0x05,
+ {0x2F, 0x3D, 0x02, 0x01, 0x80} /* TxLDO cureent measurement cmd */
+ },
+ {
+ 0x03, {0x4F, 0x3D, 05} /* exp_rsp */
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testAntenna_Txldo,
+ st_validator_null},
+ {{
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ 0x07,
+ {0x2F, 0x3D, 0x04, 0x02, 0xC8, 0x60, 0x03} /* AGC measurement cmd */
+#else
+ 0x07,
+ {0x2F, 0x3D, 0x04, 0x02, 0xCD, 0x60, 0x03} /* AGC measurement cmd */
+#endif
+ },
+ {
+ 0x03, {0x4F, 0x3D, 05} /* exp_rsp */
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testAntenna_AgcVal,
+ st_validator_null},
+ {{
+ 0x07,
+ {0x2F, 0x3D, 0x04, 0x04, 0x20, 0x08,
+ 0x20} /* AGC with NFCLD measurement cmd */
+ },
+ {
+ 0x03, {0x4F, 0x3D, 05} /* exp_rsp */
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testAntenna_AgcVal_FixedNfcLd,
+ st_validator_null},
+ {{
+ 0x07,
+ {0x2F, 0x3D, 0x04, 0x08, 0x8C, 0x60,
+ 0x03} /* AGC with NFCLD measurement cmd */
+ },
+ {
+ 0x03, {0x4F, 0x3D, 05} /* exp_rsp */
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testAntenna_AgcVal_Differential,
+ st_validator_null
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ },
+ {{
+ 0x04, {0x2F, 0x00, 0x01, 0x01} /* cmd */
+ },
+ {
+ 0x04, {0x4F, 0x00, 0x01, 0x00} /* exp_rsp */
+ },
+ {
+ 0x00, {0x00} /* ext_ntf */
+ },
+ st_validator_testEquals, /* validator */
+ st_validator_null
+#endif
+ }};
+
+/************** Self test functions ***************************************/
+
+static uint8_t st_validator_testEquals(nci_data_t* exp,
+ phTmlNfc_TransactInfo_t* act);
+static void hal_write_cb(void* pContext, phTmlNfc_TransactInfo_t* pInfo);
+static void hal_write_rsp_timeout_cb(uint32_t TimerId, void* pContext);
+static void hal_read_cb(void* pContext, phTmlNfc_TransactInfo_t* pInfo);
+
+/*******************************************************************************
+**
+** Function st_validator_null
+**
+** Description Null Validator
+**
+** Returns One
+**
+*******************************************************************************/
+static uint8_t st_validator_null(nci_data_t* exp,
+ phTmlNfc_TransactInfo_t* act) {
+ UNUSED(exp);
+ UNUSED(act);
+ return 1;
+}
+
+/*******************************************************************************
+**
+** Function st_validator_testSWP1_vltg
+**
+** Description Validator function to validate swp1 connection.
+**
+** Returns One if successful otherwise Zero.
+**
+*******************************************************************************/
+static uint8_t st_validator_testSWP1_vltg(nci_data_t* exp,
+ phTmlNfc_TransactInfo_t* act) {
+ uint8_t result = 0;
+
+ if (NULL == exp || NULL == act) {
+ return result;
+ }
+
+ if ((act->wLength == 0x05) &&
+ (memcmp(exp->p_data, act->pBuff, exp->len) == 0)) {
+ if (act->pBuff[4] == 0x01 || act->pBuff[4] == 0x02) {
+ result = 1;
+ }
+ }
+
+ return result;
+}
+
+/*******************************************************************************
+**
+** Function st_validator_testAntenna_Txldo
+**
+** Description Validator function to validate Antenna TxLDO current
+** measurement.
+**
+** Returns One if successful otherwise Zero.
+**
+*******************************************************************************/
+static uint8_t st_validator_testAntenna_Txldo(nci_data_t* exp,
+ phTmlNfc_TransactInfo_t* act) {
+ uint8_t result = 0;
+ uint8_t mesuredrange = 0;
+ long measured_val = 0;
+ int tolerance = 0;
+
+ if (NULL == exp || NULL == act) {
+ return result;
+ }
+
+ NXPLOG_NCIHAL_D("st_validator_testAntenna_Txldo = 0x%x", act->pBuff[3]);
+ if (0x05 == act->pBuff[2]) {
+ if (NFCSTATUS_SUCCESS == act->pBuff[3]) {
+ result = 1;
+ NXPLOG_NCIHAL_D("Antenna: TxLDO current measured raw value in mA : 0x%x",
+ act->pBuff[4]);
+ if (0x00 == act->pBuff[5]) {
+ NXPLOG_NCIHAL_D("Measured range : 0x00 = 50 - 100 mA");
+ measured_val = ((0.40 * act->pBuff[4]) + 50);
+ NXPLOG_NCIHAL_D("TxLDO current absolute value in mA = %ld",
+ measured_val);
+ } else {
+ NXPLOG_NCIHAL_D("Measured range : 0x01 = 20 - 70 mA");
+ measured_val = ((0.40 * act->pBuff[4]) + 20);
+ NXPLOG_NCIHAL_D("TxLDO current absolute value in mA = %ld",
+ measured_val);
+ }
+
+ tolerance = (phAntenna_resp.wTxdoMeasuredRangeMax *
+ phAntenna_resp.wTxdoMeasuredTolerance) /
+ 100;
+ if ((measured_val <= phAntenna_resp.wTxdoMeasuredRangeMax + tolerance)) {
+ tolerance = (phAntenna_resp.wTxdoMeasuredRangeMin *
+ phAntenna_resp.wTxdoMeasuredTolerance) /
+ 100;
+ if ((measured_val >=
+ phAntenna_resp.wTxdoMeasuredRangeMin - tolerance)) {
+ gtxldo_status = NFCSTATUS_SUCCESS;
+ NXPLOG_NCIHAL_E("Test Antenna Response for TxLDO measurement PASS");
+ } else {
+ gtxldo_status = NFCSTATUS_FAILED;
+ NXPLOG_NCIHAL_E("Test Antenna Response for TxLDO measurement FAIL");
+ }
+ } else {
+ gtxldo_status = NFCSTATUS_FAILED;
+ NXPLOG_NCIHAL_E("Test Antenna Response for TxLDO measurement FAIL");
+ }
+ } else {
+ gtxldo_status = NFCSTATUS_FAILED;
+ NXPLOG_NCIHAL_E(
+ "Test Antenna Response for TxLDO measurement failed: Invalid status");
+ }
+
+ } else {
+ gtxldo_status = NFCSTATUS_FAILED;
+ NXPLOG_NCIHAL_E(
+ "Test Antenna Response for TxLDO measurement failed: Invalid payload "
+ "length");
+ }
+
+ return result;
+}
+
+/*******************************************************************************
+**
+** Function st_validator_testAntenna_AgcVal
+**
+** Description Validator function reads AGC value of antenna and print the
+** info
+**
+** Returns One if successful otherwise Zero.
+**
+*******************************************************************************/
+static uint8_t st_validator_testAntenna_AgcVal(nci_data_t* exp,
+ phTmlNfc_TransactInfo_t* act) {
+ uint8_t result = 0;
+ int agc_tolerance = 0;
+ long agc_val = 0;
+
+ if (NULL == exp || NULL == act) {
+ return result;
+ }
+
+ if (0x05 == act->pBuff[2]) {
+ if (NFCSTATUS_SUCCESS == act->pBuff[3]) {
+ result = 1;
+ agc_tolerance =
+ (phAntenna_resp.wAgcValue * phAntenna_resp.wAgcValueTolerance) / 100;
+ agc_val = ((act->pBuff[5] << 8) | (act->pBuff[4]));
+ NXPLOG_NCIHAL_D("AGC value : %ld", agc_val);
+ if (((phAntenna_resp.wAgcValue - agc_tolerance) <= agc_val) &&
+ (agc_val <= (phAntenna_resp.wAgcValue + agc_tolerance))) {
+ gagc_value_status = NFCSTATUS_SUCCESS;
+ NXPLOG_NCIHAL_E("Test Antenna Response for AGC Values PASS");
+ } else {
+ gagc_value_status = NFCSTATUS_FAILED;
+ NXPLOG_NCIHAL_E("Test Antenna Response for AGC Values FAIL");
+ }
+ } else {
+ gagc_value_status = NFCSTATUS_FAILED;
+ NXPLOG_NCIHAL_E("Test Antenna Response for AGC Values FAIL");
+ }
+ } else {
+ gagc_value_status = NFCSTATUS_FAILED;
+ NXPLOG_NCIHAL_E(
+ "Test Antenna Response for AGC value failed: Invalid payload length");
+ }
+
+ return result;
+}
+/*******************************************************************************
+**
+** Function st_validator_testAntenna_AgcVal_FixedNfcLd
+**
+** Description Validator function reads and print AGC value of
+** antenna with fixed NFCLD
+**
+** Returns One if successful otherwise Zero.
+**
+*******************************************************************************/
+static uint8_t st_validator_testAntenna_AgcVal_FixedNfcLd(
+ nci_data_t* exp, phTmlNfc_TransactInfo_t* act) {
+ uint8_t result = 0;
+ int agc_nfcld_tolerance = 0;
+ long agc_nfcld = 0;
+
+ if (NULL == exp || NULL == act) {
+ return result;
+ }
+
+ if (0x05 == act->pBuff[2]) {
+ if (NFCSTATUS_SUCCESS == act->pBuff[3]) {
+ result = 1;
+ agc_nfcld_tolerance = (phAntenna_resp.wAgcValuewithfixedNFCLD *
+ phAntenna_resp.wAgcValuewithfixedNFCLDTolerance) /
+ 100;
+ agc_nfcld = ((act->pBuff[5] << 8) | (act->pBuff[4]));
+ NXPLOG_NCIHAL_D("AGC value with Fixed Nfcld : %ld", agc_nfcld);
+
+ if (((phAntenna_resp.wAgcValuewithfixedNFCLD - agc_nfcld_tolerance) <=
+ agc_nfcld) &&
+ (agc_nfcld <=
+ (phAntenna_resp.wAgcValuewithfixedNFCLD + agc_nfcld_tolerance))) {
+ gagc_nfcld_status = NFCSTATUS_SUCCESS;
+ NXPLOG_NCIHAL_E(
+ "Test Antenna Response for AGC value with fixed NFCLD PASS");
+ } else {
+ gagc_nfcld_status = NFCSTATUS_FAILED;
+ NXPLOG_NCIHAL_E(
+ "Test Antenna Response for AGC value with fixed NFCLD FAIL");
+ }
+ } else {
+ gagc_nfcld_status = NFCSTATUS_FAILED;
+ NXPLOG_NCIHAL_E(
+ "Test Antenna Response for AGC value with fixed NFCLD failed: "
+ "Invalid status");
+ }
+ } else {
+ gagc_nfcld_status = NFCSTATUS_FAILED;
+ NXPLOG_NCIHAL_E(
+ "Test Antenna Response for AGC value with fixed NFCLD failed: Invalid "
+ "payload length");
+ }
+
+ return result;
+}
+
+/*******************************************************************************
+**
+** Function st_validator_testAntenna_AgcVal_Differential
+**
+** Description Reads the AGC value with open/short RM from buffer and print
+**
+** Returns One if successful otherwise Zero.
+**
+*******************************************************************************/
+static uint8_t st_validator_testAntenna_AgcVal_Differential(
+ nci_data_t* exp, phTmlNfc_TransactInfo_t* act) {
+ uint8_t result = 0;
+ int agc_toleranceopne1 = 0;
+ int agc_toleranceopne2 = 0;
+ long agc_differentialOpne1 = 0;
+ long agc_differentialOpne2 = 0;
+
+ if (NULL == exp || NULL == act) {
+ return result;
+ }
+
+ if (0x05 == act->pBuff[2]) {
+ if (NFCSTATUS_SUCCESS == act->pBuff[3]) {
+ result = 1;
+ agc_toleranceopne1 = (phAntenna_resp.wAgcDifferentialWithOpen1 *
+ phAntenna_resp.wAgcDifferentialWithOpenTolerance1) /
+ 100;
+ agc_toleranceopne2 = (phAntenna_resp.wAgcDifferentialWithOpen2 *
+ phAntenna_resp.wAgcDifferentialWithOpenTolerance2) /
+ 100;
+ agc_differentialOpne1 = ((act->pBuff[5] << 8) | (act->pBuff[4]));
+ agc_differentialOpne2 = ((act->pBuff[7] << 8) | (act->pBuff[6]));
+ NXPLOG_NCIHAL_D("AGC value differential Opne 1 : %ld",
+ agc_differentialOpne1);
+ NXPLOG_NCIHAL_D("AGC value differentialOpne 2 : %ld",
+ agc_differentialOpne2);
+
+ if (((agc_differentialOpne1 >=
+ phAntenna_resp.wAgcDifferentialWithOpen1 - agc_toleranceopne1) &&
+ (agc_differentialOpne1 <=
+ phAntenna_resp.wAgcDifferentialWithOpen1 + agc_toleranceopne1)) &&
+ ((agc_differentialOpne2 >=
+ phAntenna_resp.wAgcDifferentialWithOpen2 - agc_toleranceopne2) &&
+ (agc_differentialOpne2 <=
+ phAntenna_resp.wAgcDifferentialWithOpen2 + agc_toleranceopne2))) {
+ gagc_differential_status = NFCSTATUS_SUCCESS;
+ NXPLOG_NCIHAL_E("Test Antenna Response for AGC Differential Open PASS");
+ } else {
+ gagc_differential_status = NFCSTATUS_FAILED;
+ NXPLOG_NCIHAL_E(
+ "Test Antenna Response for AGC Differential Open FAIL");
+ }
+ } else {
+ NXPLOG_NCIHAL_E(
+ "Test Antenna Response for AGC Differential failed: Invalid status");
+ gagc_differential_status = NFCSTATUS_FAILED;
+ }
+
+ } else {
+ NXPLOG_NCIHAL_E(
+ "Test Antenna Response for AGC Differential failed: Invalid payload "
+ "length");
+ gagc_differential_status = NFCSTATUS_FAILED;
+ }
+
+ return result;
+}
+/*******************************************************************************
+**
+** Function st_validator_testEquals
+**
+** Description Validator function to validate for equality between actual
+** and expected values.
+**
+** Returns One if successful otherwise Zero.
+**
+*******************************************************************************/
+static uint8_t st_validator_testEquals(nci_data_t* exp,
+ phTmlNfc_TransactInfo_t* act) {
+ uint8_t result = 0;
+
+ if (NULL == exp || NULL == act) {
+ return result;
+ }
+ if (exp->len <= act->wLength &&
+ (memcmp(exp->p_data, act->pBuff, exp->len) == 0)) {
+ result = 1;
+ }
+
+ return result;
+}
+
+/*******************************************************************************
+**
+** Function hal_write_rsp_timeout_cb
+**
+** Description Callback function for hal write response timer.
+**
+** Returns None
+**
+*******************************************************************************/
+static void hal_write_rsp_timeout_cb(uint32_t timerId, void* pContext) {
+ UNUSED(timerId);
+ NXPLOG_NCIHAL_E("hal_write_rsp_timeout_cb - write timeout!!!");
+ hal_write_timer_fired = 1;
+ hal_read_cb(pContext, NULL);
+}
+
+/*******************************************************************************
+**
+** Function hal_write_cb
+**
+** Description Callback function for hal write.
+**
+** Returns None
+**
+*******************************************************************************/
+static void hal_write_cb(void* pContext, phTmlNfc_TransactInfo_t* pInfo) {
+ phNxpNciHal_Sem_t* p_cb_data = (phNxpNciHal_Sem_t*)pContext;
+
+ if (pInfo->wStatus == NFCSTATUS_SUCCESS) {
+ NXPLOG_NCIHAL_D("write successful status = 0x%x", pInfo->wStatus);
+ } else {
+ NXPLOG_NCIHAL_E("write error status = 0x%x", pInfo->wStatus);
+ }
+
+ p_cb_data->status = pInfo->wStatus;
+ SEM_POST(p_cb_data);
+
+ return;
+}
+
+/*******************************************************************************
+**
+** Function hal_read_cb
+**
+** Description Callback function for hal read.
+**
+** Returns None
+**
+*******************************************************************************/
+static void hal_read_cb(void* pContext, phTmlNfc_TransactInfo_t* pInfo) {
+ phNxpNciHal_Sem_t* p_cb_data = (phNxpNciHal_Sem_t*)pContext;
+ NFCSTATUS status;
+ if (hal_write_timer_fired == 1) {
+ NXPLOG_NCIHAL_D("hal_read_cb - response timeout occurred");
+
+ hal_write_timer_fired = 0;
+ p_cb_data->status = NFCSTATUS_RESPONSE_TIMEOUT;
+ status = phTmlNfc_ReadAbort();
+ } else {
+ NFCSTATUS status = phOsalNfc_Timer_Stop(timeoutTimerId);
+
+ if (NFCSTATUS_SUCCESS == status) {
+ NXPLOG_NCIHAL_D("Response timer stopped");
+ } else {
+ NXPLOG_NCIHAL_E("Response timer stop ERROR!!!");
+ p_cb_data->status = NFCSTATUS_FAILED;
+ }
+ if (pInfo == NULL) {
+ NXPLOG_NCIHAL_E("Empty TransactInfo");
+ p_cb_data->status = NFCSTATUS_FAILED;
+ } else {
+ if (pInfo->wStatus == NFCSTATUS_SUCCESS) {
+ NXPLOG_NCIHAL_D("hal_read_cb successful status = 0x%x", pInfo->wStatus);
+ p_cb_data->status = NFCSTATUS_SUCCESS;
+ } else {
+ NXPLOG_NCIHAL_E("hal_read_cb error status = 0x%x", pInfo->wStatus);
+ p_cb_data->status = NFCSTATUS_FAILED;
+ }
+
+ p_cb_data->status = pInfo->wStatus;
+ nci_test_data_t* test_data = (nci_test_data_t*)p_cb_data->pContext;
+
+ if (test_data->exp_rsp.len == 0) {
+ /* Compare the actual notification with expected notification.*/
+ if (test_data->ntf_validator(&(test_data->exp_ntf), pInfo) == 1) {
+ p_cb_data->status = NFCSTATUS_SUCCESS;
+ } else {
+ p_cb_data->status = NFCSTATUS_FAILED;
+ }
+ }
+
+ /* Compare the actual response with expected response.*/
+ else if (test_data->rsp_validator(&(test_data->exp_rsp), pInfo) == 1) {
+ p_cb_data->status = NFCSTATUS_SUCCESS;
+ } else {
+ p_cb_data->status = NFCSTATUS_FAILED;
+ }
+
+ test_data->exp_rsp.len = 0;
+ }
+ }
+
+ SEM_POST(p_cb_data);
+
+ return;
+}
+
+/*******************************************************************************
+**
+** Function phNxpNciHal_test_rx_thread
+**
+** Description Thread to fetch and process messages from message queue.
+**
+** Returns NULL
+**
+*******************************************************************************/
+static void* phNxpNciHal_test_rx_thread(void* arg) {
+ phLibNfc_Message_t msg;
+ UNUSED(arg);
+ NXPLOG_NCIHAL_D("Self test thread started");
+
+ thread_running = 1;
+
+ while (thread_running == 1) {
+ /* Fetch next message from the NFC stack message queue */
+ if (phDal4Nfc_msgrcv(gDrvCfg.nClientId, &msg, 0, 0) == -1) {
+ NXPLOG_NCIHAL_E("Received bad message");
+ continue;
+ }
+
+ if (thread_running == 0) {
+ break;
+ }
+
+ switch (msg.eMsgType) {
+ case PH_LIBNFC_DEFERREDCALL_MSG: {
+ phLibNfc_DeferredCall_t* deferCall =
+ (phLibNfc_DeferredCall_t*)(msg.pMsgData);
+
+ REENTRANCE_LOCK();
+ deferCall->pCallback(deferCall->pParameter);
+ REENTRANCE_UNLOCK();
+
+ break;
+ }
+ }
+ }
+
+ NXPLOG_NCIHAL_D("Self test thread stopped");
+
+ return NULL;
+}
+
+/*******************************************************************************
+**
+** Function phNxpNciHal_readLocked
+**
+** Description Reads response and notification from NFCC and waits for
+** read completion, for a definitive timeout value.
+**
+** Returns NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED,
+** NFCSTATUS_RESPONSE_TIMEOUT in case of timeout.
+**
+*******************************************************************************/
+static NFCSTATUS phNxpNciHal_readLocked(nci_test_data_t* pData) {
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ phNxpNciHal_Sem_t cb_data;
+ uint16_t read_len = 16;
+ /* RX Buffer */
+ uint32_t rx_data[NCI_MAX_DATA_LEN];
+
+ /* Create the local semaphore */
+ if (phNxpNciHal_init_cb_data(&cb_data, pData) != NFCSTATUS_SUCCESS) {
+ NXPLOG_NCIHAL_D("phTmlNfc_Read Create cb data failed");
+ status = NFCSTATUS_FAILED;
+ goto clean_and_return;
+ }
+
+ /* call read pending */
+ status =
+ phTmlNfc_Read((uint8_t*)rx_data, (uint16_t)read_len,
+ (pphTmlNfc_TransactCompletionCb_t)&hal_read_cb, &cb_data);
+
+ if (status != NFCSTATUS_PENDING) {
+ NXPLOG_NCIHAL_E("TML Read status error status = %x", status);
+ status = NFCSTATUS_FAILED;
+ goto clean_and_return;
+ }
+
+ status = phOsalNfc_Timer_Start(timeoutTimerId, HAL_WRITE_RSP_TIMEOUT,
+ &hal_write_rsp_timeout_cb, &cb_data);
+
+ if (NFCSTATUS_SUCCESS == status) {
+ NXPLOG_NCIHAL_D("Response timer started");
+ } else {
+ NXPLOG_NCIHAL_E("Response timer not started");
+ status = NFCSTATUS_FAILED;
+ goto clean_and_return;
+ }
+
+ /* Wait for callback response */
+ if (SEM_WAIT(cb_data)) {
+ NXPLOG_NCIHAL_E("phTmlNfc_Read semaphore error");
+ status = NFCSTATUS_FAILED;
+ goto clean_and_return;
+ }
+
+ if (cb_data.status == NFCSTATUS_RESPONSE_TIMEOUT) {
+ NXPLOG_NCIHAL_E("Response timeout!!!");
+ status = NFCSTATUS_RESPONSE_TIMEOUT;
+ goto clean_and_return;
+ }
+
+ if (cb_data.status != NFCSTATUS_SUCCESS) {
+ NXPLOG_NCIHAL_E("phTmlNfc_Read failed ");
+ status = NFCSTATUS_FAILED;
+ goto clean_and_return;
+ }
+
+clean_and_return:
+ phNxpNciHal_cleanup_cb_data(&cb_data);
+
+ return status;
+}
+
+/*******************************************************************************
+**
+** Function phNxpNciHal_writeLocked
+**
+** Description Send command to NFCC and waits for cmd write completion, for
+** a definitive timeout value.
+**
+** Returns NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED,
+** NFCSTATUS_RESPONSE_TIMEOUT in case of timeout.
+**
+*******************************************************************************/
+static NFCSTATUS phNxpNciHal_writeLocked(nci_test_data_t* pData) {
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+
+ phNxpNciHal_Sem_t cb_data;
+ int retryCnt = 0;
+
+ /* Create the local semaphore */
+ if (phNxpNciHal_init_cb_data(&cb_data, NULL) != NFCSTATUS_SUCCESS) {
+ NXPLOG_NCIHAL_D("phTmlNfc_Write Create cb data failed");
+ goto clean_and_return;
+ }
+
+retry:
+ status =
+ phTmlNfc_Write(pData->cmd.p_data, pData->cmd.len,
+ (pphTmlNfc_TransactCompletionCb_t)&hal_write_cb, &cb_data);
+
+ if (status != NFCSTATUS_PENDING) {
+ NXPLOG_NCIHAL_E("phTmlNfc_Write status error");
+ goto clean_and_return;
+ }
+
+ /* Wait for callback response */
+ if (SEM_WAIT(cb_data)) {
+ NXPLOG_NCIHAL_E("write_unlocked semaphore error");
+ status = NFCSTATUS_FAILED;
+ goto clean_and_return;
+ }
+
+ if (cb_data.status != NFCSTATUS_SUCCESS && retryCnt < HAL_WRITE_MAX_RETRY) {
+ retryCnt++;
+ NXPLOG_NCIHAL_E(
+ "write_unlocked failed - PN54X Maybe in Standby Mode - Retry %d",
+ retryCnt);
+ goto retry;
+ }
+
+ status = cb_data.status;
+
+clean_and_return:
+ phNxpNciHal_cleanup_cb_data(&cb_data);
+
+ return status;
+}
+
+/*******************************************************************************
+**
+** Function phNxpNciHal_performTest
+**
+** Description Performs a single cycle of command,response and
+** notification.
+**
+** Returns NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED,
+**
+*******************************************************************************/
+NFCSTATUS phNxpNciHal_performTest(nci_test_data_t* pData) {
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+
+ if (NULL == pData) {
+ return NFCSTATUS_FAILED;
+ }
+
+ CONCURRENCY_LOCK();
+
+ status = phNxpNciHal_writeLocked(pData);
+
+ if (status == NFCSTATUS_RESPONSE_TIMEOUT) {
+ goto clean_and_return;
+ }
+ if (status != NFCSTATUS_SUCCESS) {
+ goto clean_and_return;
+ }
+
+ status = phNxpNciHal_readLocked(pData);
+
+ if (status != NFCSTATUS_SUCCESS) {
+ goto clean_and_return;
+ }
+
+ if (0 != pData->exp_ntf.len) {
+ status = phNxpNciHal_readLocked(pData);
+
+ if (status != NFCSTATUS_SUCCESS) {
+ goto clean_and_return;
+ }
+ }
+
+clean_and_return:
+ CONCURRENCY_UNLOCK();
+ return status;
+}
+
+/*******************************************************************************
+ **
+ ** Function phNxpNciHal_TestMode_open
+ **
+ ** Description It opens the physical connection with NFCC (PN54X) and
+ ** creates required client thread for operation.
+ **
+ ** Returns NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
+ **
+ ******************************************************************************/
+NFCSTATUS phNxpNciHal_TestMode_open(void) {
+ /* Thread */
+ pthread_t test_rx_thread;
+
+ phOsalNfc_Config_t tOsalConfig;
+ phTmlNfc_Config_t tTmlConfig;
+ char* nfc_dev_node = NULL;
+ const uint16_t max_len = 260;
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ uint16_t read_len = 255;
+ int8_t ret_val = 0x00;
+ /* initialize trace level */
+ phNxpLog_InitializeLogLevel();
+
+ if (phNxpNciHal_init_monitor() == NULL) {
+ NXPLOG_NCIHAL_E("Init monitor failed");
+ return NFCSTATUS_FAILED;
+ }
+
+ CONCURRENCY_LOCK();
+
+ memset(&tOsalConfig, 0x00, sizeof(tOsalConfig));
+ memset(&tTmlConfig, 0x00, sizeof(tTmlConfig));
+
+ /* Read the nfc device node name */
+ nfc_dev_node = (char*)malloc(max_len * sizeof(char));
+ if (nfc_dev_node == NULL) {
+ NXPLOG_NCIHAL_E("malloc of nfc_dev_node failed ");
+ goto clean_and_return;
+ } else if (!GetNxpStrValue(NAME_NXP_NFC_DEV_NODE, nfc_dev_node,
+ sizeof(nfc_dev_node))) {
+ NXPLOG_NCIHAL_E(
+ "Invalid nfc device node name keeping the default device node "
+ "/dev/pn54x");
+ strcpy(nfc_dev_node, "/dev/pn54x");
+ }
+
+ gDrvCfg.nClientId = phDal4Nfc_msgget(0, 0600);
+ gDrvCfg.nLinkType = ENUM_LINK_TYPE_I2C; /* For PN54X */
+ tTmlConfig.pDevName = (int8_t*)nfc_dev_node;
+ tOsalConfig.dwCallbackThreadId = (uintptr_t)gDrvCfg.nClientId;
+ tOsalConfig.pLogFile = NULL;
+ tTmlConfig.dwGetMsgThreadId = (uintptr_t)gDrvCfg.nClientId;
+ nxpncihal_ctrl.gDrvCfg.nClientId = (uintptr_t)gDrvCfg.nClientId;
+
+ /* Initialize TML layer */
+ status = phTmlNfc_Init(&tTmlConfig);
+ if (status != NFCSTATUS_SUCCESS) {
+ NXPLOG_NCIHAL_E("phTmlNfc_Init Failed");
+ goto clean_and_return;
+ } else {
+ if (nfc_dev_node != NULL) {
+ free(nfc_dev_node);
+ nfc_dev_node = NULL;
+ }
+ }
+
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+ ret_val =
+ pthread_create(&test_rx_thread, &attr, phNxpNciHal_test_rx_thread, NULL);
+ pthread_attr_destroy(&attr);
+ if (ret_val != 0) {
+ NXPLOG_NCIHAL_E("pthread_create failed");
+ phTmlNfc_Shutdown();
+ goto clean_and_return;
+ }
+
+ timeoutTimerId = phOsalNfc_Timer_Create();
+
+ if (timeoutTimerId == 0xFFFF) {
+ NXPLOG_NCIHAL_E("phOsalNfc_Timer_Create failed");
+ } else {
+ NXPLOG_NCIHAL_D("phOsalNfc_Timer_Create SUCCESS");
+ }
+ CONCURRENCY_UNLOCK();
+
+ return NFCSTATUS_SUCCESS;
+
+clean_and_return:
+ CONCURRENCY_UNLOCK();
+ if (nfc_dev_node != NULL) {
+ free(nfc_dev_node);
+ nfc_dev_node = NULL;
+ }
+ phNxpNciHal_cleanup_monitor();
+ return NFCSTATUS_FAILED;
+}
+
+/*******************************************************************************
+ **
+ ** Function phNxpNciHal_TestMode_close
+ **
+ ** Description This function close the NFCC interface and free all
+ ** resources.
+ **
+ ** Returns None.
+ **
+ ******************************************************************************/
+
+void phNxpNciHal_TestMode_close() {
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+
+ CONCURRENCY_LOCK();
+
+ if (NULL != gpphTmlNfc_Context->pDevHandle) {
+ /* Abort any pending read and write */
+ status = phTmlNfc_ReadAbort();
+ status = phTmlNfc_WriteAbort();
+
+ phOsalNfc_Timer_Cleanup();
+
+ status = phTmlNfc_Shutdown();
+
+ NXPLOG_NCIHAL_D("phNxpNciHal_close return status = %d", status);
+
+ thread_running = 0;
+
+ phDal4Nfc_msgrelease(gDrvCfg.nClientId);
+
+ status = phOsalNfc_Timer_Delete(timeoutTimerId);
+ }
+
+ CONCURRENCY_UNLOCK();
+
+ phNxpNciHal_cleanup_monitor();
+
+ /* Return success always */
+ return;
+}
+
+/*******************************************************************************
+ **
+ ** Function phNxpNciHal_SwpTest
+ **
+ ** Description Test function to validate the SWP line. SWP line number is
+ ** is sent as parameter to the API.
+ **
+ ** Returns NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
+ **
+ ******************************************************************************/
+
+NFCSTATUS phNxpNciHal_SwpTest(uint8_t swp_line) {
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ int len = 0;
+ int cnt = 0;
+
+ NXPLOG_NCIHAL_D("phNxpNciHal_SwpTest - start\n");
+
+ if (swp_line == 0x01) {
+ len = (sizeof(swp1_test_data) / sizeof(swp1_test_data[0]));
+
+ for (cnt = 0; cnt < len; cnt++) {
+ status = phNxpNciHal_performTest(&(swp1_test_data[cnt]));
+ if (status == NFCSTATUS_RESPONSE_TIMEOUT || status == NFCSTATUS_FAILED) {
+ break;
+ }
+ }
+ } else if (swp_line == 0x02) {
+ len = (sizeof(swp2_test_data) / sizeof(swp2_test_data[0]));
+
+ for (cnt = 0; cnt < len; cnt++) {
+ status = phNxpNciHal_performTest(&(swp2_test_data[cnt]));
+ if (status == NFCSTATUS_RESPONSE_TIMEOUT || status == NFCSTATUS_FAILED) {
+ break;
+ }
+ }
+ } else {
+ status = NFCSTATUS_FAILED;
+ }
+
+ if (status == NFCSTATUS_SUCCESS) {
+ NXPLOG_NCIHAL_D("phNxpNciHal_SwpTest - SUCCESSS\n");
+ } else {
+ NXPLOG_NCIHAL_D("phNxpNciHal_SwpTest - FAILED\n");
+ }
+
+ NXPLOG_NCIHAL_D("phNxpNciHal_SwpTest - end\n");
+
+ return status;
+}
+
+/*******************************************************************************
+ **
+ ** Function phNxpNciHal_PrbsTestStart
+ **
+ ** Description Test function start RF generation for RF technology and bit
+ ** rate. RF technology and bit rate are sent as parameter to
+ ** the API.
+ **
+ ** Returns NFCSTATUS_SUCCESS if RF generation successful,
+ ** otherwise NFCSTATUS_FAILED.
+ **
+ ******************************************************************************/
+
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+NFCSTATUS phNxpNciHal_PrbsTestStart(phNxpNfc_PrbsType_t prbs_type,
+ phNxpNfc_PrbsHwType_t hw_prbs_type,
+ phNxpNfc_Tech_t tech,
+ phNxpNfc_Bitrate_t bitrate)
+#else
+NFCSTATUS phNxpNciHal_PrbsTestStart(phNxpNfc_Tech_t tech,
+ phNxpNfc_Bitrate_t bitrate)
+#endif
+{
+ NFCSTATUS status = NFCSTATUS_FAILED;
+
+ nci_test_data_t prbs_cmd_data;
+
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ uint8_t rsp_cmd_info[] = {0x4F, 0x30, 0x01, 0x00};
+ prbs_cmd_data.cmd.len = 0x09;
+#else
+ uint8_t rsp_cmd_info[] = {0x4F, 0x30, 0x01, 0x00};
+ prbs_cmd_data.cmd.len = 0x07;
+#endif
+
+ memcpy(prbs_cmd_data.exp_rsp.p_data, &rsp_cmd_info[0], sizeof(rsp_cmd_info));
+ prbs_cmd_data.exp_rsp.len = sizeof(rsp_cmd_info);
+
+ // prbs_cmd_data.exp_rsp.len = 0x00;
+ prbs_cmd_data.exp_ntf.len = 0x00;
+ prbs_cmd_data.rsp_validator = st_validator_testEquals;
+ prbs_cmd_data.ntf_validator = st_validator_null;
+
+ uint8_t len = 0;
+ uint8_t cnt = 0;
+
+// [NCI] -> [0x2F 0x30 0x04 0x00 0x00 0x01 0xFF]
+
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ status =
+ phNxpNciHal_getPrbsCmd(prbs_type, hw_prbs_type, tech, bitrate,
+ prbs_cmd_data.cmd.p_data, prbs_cmd_data.cmd.len);
+#else
+ status = phNxpNciHal_getPrbsCmd(tech, bitrate, prbs_cmd_data.cmd.p_data,
+ prbs_cmd_data.cmd.len);
+#endif
+
+ if (status == NFCSTATUS_FAILED) {
+ // Invalid Param.
+ NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStart - INVALID_PARAM\n");
+
+ goto clean_and_return;
+ }
+
+ len = (sizeof(prbs_test_data) / sizeof(prbs_test_data[0]));
+
+ for (cnt = 0; cnt < len; cnt++) {
+ status = phNxpNciHal_performTest(&(prbs_test_data[cnt]));
+ if (status == NFCSTATUS_RESPONSE_TIMEOUT || status == NFCSTATUS_FAILED) {
+ break;
+ }
+ }
+
+ /* Ignoring status, as there will be no response - Applicable till FW version
+ * 8.1.1*/
+ status = phNxpNciHal_performTest(&prbs_cmd_data);
+clean_and_return:
+
+ if (status == NFCSTATUS_SUCCESS) {
+ NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStart - SUCCESSS\n");
+ } else {
+ NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStart - FAILED\n");
+ }
+
+ NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStart - end\n");
+
+ return status;
+}
+
+/*******************************************************************************
+ **
+ ** Function phNxpNciHal_PrbsTestStop
+ **
+ ** Description Test function stop RF generation for RF technology started
+ ** by phNxpNciHal_PrbsTestStart.
+ **
+ ** Returns NFCSTATUS_SUCCESS if operation successful,
+ ** otherwise NFCSTATUS_FAILED.
+ **
+ ******************************************************************************/
+
+NFCSTATUS phNxpNciHal_PrbsTestStop() {
+ NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStop - Start\n");
+
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+
+ status = phTmlNfc_IoCtl(phTmlNfc_e_ResetDevice);
+
+ if (NFCSTATUS_SUCCESS == status) {
+ NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStop - SUCCESS\n");
+ } else {
+ NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStop - FAILED\n");
+ }
+ NXPLOG_NCIHAL_D("phNxpNciHal_PrbsTestStop - end\n");
+
+ return status;
+}
+
+/*******************************************************************************
+**
+** Function phNxpNciHal_getPrbsCmd
+**
+** Description Test function frames the PRBS command.
+**
+** Returns NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
+**
+*******************************************************************************/
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+NFCSTATUS phNxpNciHal_getPrbsCmd(phNxpNfc_PrbsType_t prbs_type,
+ phNxpNfc_PrbsHwType_t hw_prbs_type,
+ uint8_t tech, uint8_t bitrate,
+ uint8_t* prbs_cmd, uint8_t prbs_cmd_len)
+#else
+NFCSTATUS phNxpNciHal_getPrbsCmd(uint8_t tech, uint8_t bitrate,
+ uint8_t* prbs_cmd, uint8_t prbs_cmd_len)
+#endif
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ int position_tech_param = 0;
+ int position_bit_param = 0;
+
+ NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - tech 0x%x bitrate = 0x%x", tech,
+ bitrate);
+ if (NULL == prbs_cmd ||
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ prbs_cmd_len != 0x09)
+#else
+ prbs_cmd_len != 0x07)
+#endif
+ {
+ return status;
+ }
+
+ prbs_cmd[0] = 0x2F;
+ prbs_cmd[1] = 0x30;
+#if (NFC_NXP_CHIP_TYPE != PN547C2)
+ prbs_cmd[2] = 0x06;
+ prbs_cmd[3] = (uint8_t)prbs_type;
+ // 0xFF Error value used for validation.
+ prbs_cmd[4] = (uint8_t)hw_prbs_type;
+ prbs_cmd[5] = 0xFF; // TECH
+ prbs_cmd[6] = 0xFF; // BITRATE
+ prbs_cmd[7] = 0x01;
+ prbs_cmd[8] = 0xFF;
+ position_tech_param = 5;
+ position_bit_param = 6;
+#else
+ prbs_cmd[2] = 0x04;
+ // 0xFF Error value used for validation.
+ prbs_cmd[3] = 0xFF; // TECH
+ // 0xFF Error value used for validation.
+ prbs_cmd[4] = 0xFF; // BITRATE
+ prbs_cmd[5] = 0x01;
+ prbs_cmd[6] = 0xFF;
+ position_tech_param = 3;
+ position_bit_param = 4;
+#endif
+
+ switch (tech) {
+ case NFC_RF_TECHNOLOGY_A:
+ NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - NFC_RF_TECHNOLOGY_A");
+ prbs_cmd[position_tech_param] = 0x00;
+ break;
+ case NFC_RF_TECHNOLOGY_B:
+ NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - NFC_RF_TECHNOLOGY_B");
+ prbs_cmd[position_tech_param] = 0x01;
+ break;
+ case NFC_RF_TECHNOLOGY_F:
+ NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - NFC_RF_TECHNOLOGY_F");
+ prbs_cmd[position_tech_param] = 0x02;
+ break;
+ default:
+ break;
+ }
+
+ switch (bitrate) {
+ case NFC_BIT_RATE_106:
+ NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - NFC_BIT_RATE_106");
+ if (prbs_cmd[position_tech_param] != 0x02) {
+ prbs_cmd[position_bit_param] = 0x00;
+ }
+ break;
+ case NFC_BIT_RATE_212:
+ NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - NFC_BIT_RATE_212");
+ prbs_cmd[position_bit_param] = 0x01;
+ break;
+ case NFC_BIT_RATE_424:
+ NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - NFC_BIT_RATE_424");
+ prbs_cmd[position_bit_param] = 0x02;
+ break;
+ case NFC_BIT_RATE_848:
+ NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - NFC_BIT_RATE_848");
+ if (prbs_cmd[position_tech_param] != 0x02) {
+ prbs_cmd[position_bit_param] = 0x03;
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (prbs_cmd[position_tech_param] == 0xFF ||
+ prbs_cmd[position_bit_param] == 0xFF) {
+ // Invalid Param.
+ status = NFCSTATUS_FAILED;
+ }
+
+ return status;
+}
+
+/*******************************************************************************
+**
+** Function phNxpNciHal_RfFieldTest
+**
+** Description Test function performs RF filed test.
+**
+** Returns NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
+**
+*******************************************************************************/
+NFCSTATUS phNxpNciHal_RfFieldTest(uint8_t on) {
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ int len = 0;
+ int cnt = 0;
+
+ NXPLOG_NCIHAL_D("phNxpNciHal_RfFieldTest - start %x\n", on);
+
+ if (on == 0x01) {
+ len = (sizeof(rf_field_on_test_data) / sizeof(rf_field_on_test_data[0]));
+
+ for (cnt = 0; cnt < len; cnt++) {
+ status = phNxpNciHal_performTest(&(rf_field_on_test_data[cnt]));
+ if (status == NFCSTATUS_RESPONSE_TIMEOUT || status == NFCSTATUS_FAILED) {
+ break;
+ }
+ }
+ } else if (on == 0x00) {
+ len = (sizeof(rf_field_off_test_data) / sizeof(rf_field_off_test_data[0]));
+
+ for (cnt = 0; cnt < len; cnt++) {
+ status = phNxpNciHal_performTest(&(rf_field_off_test_data[cnt]));
+ if (status == NFCSTATUS_RESPONSE_TIMEOUT || status == NFCSTATUS_FAILED) {
+ break;
+ }
+ }
+ } else {
+ status = NFCSTATUS_FAILED;
+ }
+
+ if (status == NFCSTATUS_SUCCESS) {
+ NXPLOG_NCIHAL_D("phNxpNciHal_RfFieldTest - SUCCESSS\n");
+ } else {
+ NXPLOG_NCIHAL_D("phNxpNciHal_RfFieldTest - FAILED\n");
+ }
+
+ NXPLOG_NCIHAL_D("phNxpNciHal_RfFieldTest - end\n");
+
+ return status;
+}
+
+/*******************************************************************************
+ **
+ ** Function phNxpNciHal_AntennaTest
+ **
+ ** Description
+ **
+ ** Returns
+ **
+ ******************************************************************************/
+NFCSTATUS phNxpNciHal_AntennaTest() {
+ NFCSTATUS status = NFCSTATUS_FAILED;
+
+ return status;
+}
+
+/*******************************************************************************
+**
+** Function phNxpNciHal_DownloadPinTest
+**
+** Description Test function to validate the FW download pin connection.
+**
+** Returns NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
+**
+*******************************************************************************/
+NFCSTATUS phNxpNciHal_DownloadPinTest(void) {
+ NFCSTATUS status = NFCSTATUS_FAILED;
+ int len = 0;
+ int cnt = 0;
+
+ NXPLOG_NCIHAL_D("phNxpNciHal_DownloadPinTest - start\n");
+
+ len = (sizeof(download_pin_test_data1) / sizeof(download_pin_test_data1[0]));
+
+ for (cnt = 0; cnt < len; cnt++) {
+ status = phNxpNciHal_performTest(&(download_pin_test_data1[cnt]));
+ if (status == NFCSTATUS_RESPONSE_TIMEOUT || status == NFCSTATUS_FAILED) {
+ break;
+ }
+ }
+
+ if (status != NFCSTATUS_SUCCESS) {
+ NXPLOG_NCIHAL_D("phNxpNciHal_DownloadPinTest - FAILED\n");
+ return status;
+ }
+
+ status = NFCSTATUS_FAILED;
+ status = phTmlNfc_IoCtl(phTmlNfc_e_EnableDownloadMode);
+ if (NFCSTATUS_SUCCESS != status) {
+ NXPLOG_NCIHAL_D("phNxpNciHal_DownloadPinTest - FAILED\n");
+ return status;
+ }
+
+ status = NFCSTATUS_FAILED;
+ len = (sizeof(download_pin_test_data2) / sizeof(download_pin_test_data2[0]));
+
+ for (cnt = 0; cnt < len; cnt++) {
+ status = phNxpNciHal_performTest(&(download_pin_test_data2[cnt]));
+ if (status == NFCSTATUS_RESPONSE_TIMEOUT || status == NFCSTATUS_FAILED) {
+ break;
+ }
+ }
+
+ if (status == NFCSTATUS_SUCCESS) {
+ NXPLOG_NCIHAL_D("phNxpNciHal_DownloadPinTest - SUCCESSS\n");
+ } else {
+ NXPLOG_NCIHAL_D("phNxpNciHal_DownloadPinTest - FAILED\n");
+ }
+
+ NXPLOG_NCIHAL_D("phNxpNciHal_DownloadPinTest - end\n");
+
+ return status;
+}
+/*******************************************************************************
+**
+** Function phNxpNciHal_AntennaSelfTest
+**
+** Description Test function to validate the Antenna's discrete
+** components connection.
+**
+** Returns NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
+**
+*******************************************************************************/
+NFCSTATUS phNxpNciHal_AntennaSelfTest(phAntenna_St_Resp_t* phAntenna_St_Resp) {
+ NFCSTATUS status = NFCSTATUS_FAILED;
+ NFCSTATUS antenna_st_status = NFCSTATUS_FAILED;
+ int len = 0;
+ int cnt = 0;
+
+ NXPLOG_NCIHAL_D("phNxpNciHal_AntennaSelfTest - start\n");
+ memcpy(&phAntenna_resp, phAntenna_St_Resp, sizeof(phAntenna_St_Resp_t));
+ len = (sizeof(antenna_self_test_data) / sizeof(antenna_self_test_data[0]));
+
+ for (cnt = 0; cnt < len; cnt++) {
+ status = phNxpNciHal_performTest(&(antenna_self_test_data[cnt]));
+ if (status == NFCSTATUS_RESPONSE_TIMEOUT || status == NFCSTATUS_FAILED) {
+ NXPLOG_NCIHAL_E(
+ "phNxpNciHal_AntennaSelfTest: commnad execution - FAILED\n");
+ break;
+ }
+ }
+
+ if (status == NFCSTATUS_SUCCESS) {
+ if ((gtxldo_status == NFCSTATUS_SUCCESS) &&
+ (gagc_value_status == NFCSTATUS_SUCCESS) &&
+ (gagc_nfcld_status == NFCSTATUS_SUCCESS) &&
+ (gagc_differential_status == NFCSTATUS_SUCCESS)) {
+ antenna_st_status = NFCSTATUS_SUCCESS;
+ NXPLOG_NCIHAL_D("phNxpNciHal_AntennaSelfTest - SUCESS\n");
+ } else {
+ NXPLOG_NCIHAL_D("phNxpNciHal_AntennaSelfTest - FAILED\n");
+ }
+ } else {
+ NXPLOG_NCIHAL_D("phNxpNciHal_AntennaSelfTest - FAILED\n");
+ }
+
+ NXPLOG_NCIHAL_D("phNxpNciHal_AntennaSelfTest - end\n");
+
+ return antenna_st_status;
+}
+
+#endif /*#ifdef NXP_HW_SELF_TEST*/