summaryrefslogtreecommitdiffstats
path: root/halimpl/pn54x/hal/phNxpNciHal_ext.c
diff options
context:
space:
mode:
Diffstat (limited to 'halimpl/pn54x/hal/phNxpNciHal_ext.c')
-rw-r--r--halimpl/pn54x/hal/phNxpNciHal_ext.c156
1 files changed, 127 insertions, 29 deletions
diff --git a/halimpl/pn54x/hal/phNxpNciHal_ext.c b/halimpl/pn54x/hal/phNxpNciHal_ext.c
index 4dbf206..a857c72 100644
--- a/halimpl/pn54x/hal/phNxpNciHal_ext.c
+++ b/halimpl/pn54x/hal/phNxpNciHal_ext.c
@@ -76,6 +76,8 @@ static void hal_extns_write_rsp_timeout_cb(uint32_t TimerId, void* pContext);
#define PROPRIETARY_CMD_FELICA_READER_MODE 0xFE
static uint8_t gFelicaReaderMode;
+static NFCSTATUS phNxpNciHal_ext_process_nfc_init_rsp(uint8_t* p_ntf,
+ uint16_t* p_len);
/*******************************************************************************
**
** Function phNxpNciHal_ext_init
@@ -260,6 +262,7 @@ NFCSTATUS phNxpNciHal_process_ext_rsp(uint8_t* p_ntf, uint16_t* p_len) {
break;
}
}
+ phNxpNciHal_ext_process_nfc_init_rsp(p_ntf, p_len);
if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[2] == 0x15 &&
p_ntf[4] == 0x01 && p_ntf[5] == 0x06 && p_ntf[6] == 0x06) {
@@ -296,17 +299,6 @@ NFCSTATUS phNxpNciHal_process_ext_rsp(uint8_t* p_ntf, uint16_t* p_len) {
p_ntf[3] = 0x00;
p_ntf[4] = 0x00;
*p_len = 5;
- } else if ((p_ntf[0] == 0x40) && (p_ntf[1] == 0x01)) {
- int len = p_ntf[2] + 2; /*include 2 byte header*/
- wFwVerRsp = (((uint32_t)p_ntf[len - 2]) << 16U) |
- (((uint32_t)p_ntf[len - 1]) << 8U) | p_ntf[len];
- if (wFwVerRsp == 0) status = NFCSTATUS_FAILED;
- iCoreInitRspLen = *p_len;
- memcpy(bCoreInitRsp, p_ntf, *p_len);
- NXPLOG_NCIHAL_D("NxpNci> FW Version: %x.%x.%x", p_ntf[len - 2],
- p_ntf[len - 1], p_ntf[len]);
- fw_maj_ver = p_ntf[len - 1];
- rom_version = p_ntf[len - 2];
}
// 4200 02 00 01
else if (p_ntf[0] == 0x42 && p_ntf[1] == 0x00 && ee_disc_done == 0x01) {
@@ -335,21 +327,6 @@ NFCSTATUS phNxpNciHal_process_ext_rsp(uint8_t* p_ntf, uint16_t* p_len) {
} else if (p_ntf[0] == 0x41 && p_ntf[1] == 0x04 && cleanup_timer != 0) {
status = NFCSTATUS_FAILED;
return status;
- } else if (p_ntf[0] == 0x60 && p_ntf[1] == 0x00) {
- NXPLOG_NCIHAL_E("CORE_RESET_NTF received!");
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
- if (nfcdep_detected &&
- !(p_ntf[2] == 0x06 && p_ntf[3] == 0xA0 && p_ntf[4] == 0x00 &&
- ((p_ntf[5] == 0xC9 && p_ntf[6] == 0x95 && p_ntf[7] == 0x00 &&
- p_ntf[8] == 0x00) ||
- (p_ntf[5] == 0x07 && p_ntf[6] == 0x39 && p_ntf[7] == 0xF2 &&
- p_ntf[8] == 0x00)))) {
- nfcdep_detected = 0x00;
- }
-#endif
- phNxpNciHal_emergency_recovery();
- status = NFCSTATUS_FAILED;
- return status;
}
#if (NFC_NXP_CHIP_TYPE == PN547C2)
else if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x02 &&
@@ -422,6 +399,83 @@ NFCSTATUS phNxpNciHal_process_ext_rsp(uint8_t* p_ntf, uint16_t* p_len) {
}
/******************************************************************************
+ * Function phNxpNciHal_ext_process_nfc_init_rsp
+ *
+ * Description This function is used to process the HAL NFC core reset rsp
+ * and ntf and core init rsp of NCI 1.0 or NCI2.0 and update
+ * NCI version.
+ * It also handles error response such as core_reset_ntf with
+ * error status in both NCI2.0 and NCI1.0.
+ *
+ * Returns Returns NFCSTATUS_SUCCESS if parsing response is successful
+ * or returns failure.
+ *
+ *******************************************************************************/
+static NFCSTATUS phNxpNciHal_ext_process_nfc_init_rsp(uint8_t* p_ntf,
+ uint16_t* p_len) {
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ /* Parsing CORE_RESET_RSP and CORE_RESET_NTF to update NCI version.*/
+ if (p_ntf == NULL || *p_len == 0x00) {
+ return NFCSTATUS_FAILED;
+ }
+ if (p_ntf[0] == NCI_MT_RSP &&
+ ((p_ntf[1] & NCI_OID_MASK) == NCI_MSG_CORE_RESET)) {
+ if (p_ntf[2] == 0x01 && p_ntf[3] == 0x00) {
+ NXPLOG_NCIHAL_D("CORE_RESET_RSP NCI2.0");
+ if (nxpncihal_ctrl.hal_ext_enabled == TRUE) {
+ nxpncihal_ctrl.nci_info.wait_for_ntf = TRUE;
+ }
+ } else if (p_ntf[2] == 0x03 && p_ntf[3] == 0x00) {
+ NXPLOG_NCIHAL_D("CORE_RESET_RSP NCI1.0");
+ nxpncihal_ctrl.nci_info.nci_version = p_ntf[4];
+ }
+ } else if (p_ntf[0] == NCI_MT_NTF &&
+ ((p_ntf[1] & NCI_OID_MASK) == NCI_MSG_CORE_RESET)) {
+ if (p_ntf[3] == CORE_RESET_TRIGGER_TYPE_CORE_RESET_CMD_RECEIVED ||
+ p_ntf[3] == CORE_RESET_TRIGGER_TYPE_POWERED_ON) {
+ NXPLOG_NCIHAL_D("CORE_RESET_NTF NCI2.0 reason CORE_RESET_CMD received !");
+ nxpncihal_ctrl.nci_info.nci_version = p_ntf[5];
+ int len = p_ntf[2] + 2; /*include 2 byte header*/
+ wFwVerRsp = (((uint32_t)p_ntf[len - 2]) << 16U) |
+ (((uint32_t)p_ntf[len - 1]) << 8U) | p_ntf[len];
+ NXPLOG_NCIHAL_D("NxpNci> FW Version: %x.%x.%x", p_ntf[len - 2],
+ p_ntf[len - 1], p_ntf[len]);
+ } else {
+#if (NFC_NXP_CHIP_TYPE == PN548C2)
+ if (nfcdep_detected &&
+ !(p_ntf[2] == 0x06 && p_ntf[3] == 0xA0 && p_ntf[4] == 0x00 &&
+ ((p_ntf[5] == 0xC9 && p_ntf[6] == 0x95 && p_ntf[7] == 0x00 &&
+ p_ntf[8] == 0x00) ||
+ (p_ntf[5] == 0x07 && p_ntf[6] == 0x39 && p_ntf[7] == 0xF2 &&
+ p_ntf[8] == 0x00)))) {
+ nfcdep_detected = 0x00;
+ }
+#endif
+ phNxpNciHal_emergency_recovery();
+ status = NFCSTATUS_FAILED;
+ } /* Parsing CORE_INIT_RSP*/
+ } else if (p_ntf[0] == NCI_MT_RSP &&
+ ((p_ntf[1] & NCI_OID_MASK) == NCI_MSG_CORE_INIT)) {
+ if (nxpncihal_ctrl.nci_info.nci_version == NCI_VERSION_2_0) {
+ NXPLOG_NCIHAL_D("CORE_INIT_RSP NCI2.0 received !");
+ } else {
+ NXPLOG_NCIHAL_D("CORE_INIT_RSP NCI1.0 received !");
+ int len = p_ntf[2] + 2; /*include 2 byte header*/
+ wFwVerRsp = (((uint32_t)p_ntf[len - 2]) << 16U) |
+ (((uint32_t)p_ntf[len - 1]) << 8U) | p_ntf[len];
+ if (wFwVerRsp == 0) status = NFCSTATUS_FAILED;
+ iCoreInitRspLen = *p_len;
+ memcpy(bCoreInitRsp, p_ntf, *p_len);
+ NXPLOG_NCIHAL_D("NxpNci> FW Version: %x.%x.%x", p_ntf[len - 2],
+ p_ntf[len - 1], p_ntf[len]);
+ fw_maj_ver = p_ntf[len - 1];
+ rom_version = p_ntf[len - 2];
+ }
+ }
+ return status;
+}
+
+/******************************************************************************
* Function phNxpNciHal_process_ext_cmd_rsp
*
* Description This function process the extension command response. It
@@ -472,7 +526,6 @@ static NFCSTATUS phNxpNciHal_process_ext_cmd_rsp(uint16_t cmd_len,
/* Stop Timer */
status = phOsalNfc_Timer_Stop(timeoutTimerId);
-
if (NFCSTATUS_SUCCESS == status) {
NXPLOG_NCIHAL_D("Response timer stopped");
} else {
@@ -480,6 +533,32 @@ static NFCSTATUS phNxpNciHal_process_ext_cmd_rsp(uint16_t cmd_len,
status = NFCSTATUS_FAILED;
goto clean_and_return;
}
+ /* Start timer to wait for NTF*/
+ if (nxpncihal_ctrl.nci_info.wait_for_ntf == TRUE) {
+ status = phOsalNfc_Timer_Start(timeoutTimerId, HAL_EXTNS_WRITE_RSP_TIMEOUT,
+ &hal_extns_write_rsp_timeout_cb, NULL);
+ 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;
+ }
+ if (SEM_WAIT(nxpncihal_ctrl.ext_cb_data)) {
+ NXPLOG_NCIHAL_E("p_hal_ext->ext_cb_data.sem semaphore error");
+ /* Stop Timer */
+ status = phOsalNfc_Timer_Stop(timeoutTimerId);
+ goto clean_and_return;
+ }
+ status = phOsalNfc_Timer_Stop(timeoutTimerId);
+ if (NFCSTATUS_SUCCESS == status) {
+ NXPLOG_NCIHAL_D("Response timer stopped");
+ } else {
+ NXPLOG_NCIHAL_E("Response timer stop ERROR!!!");
+ status = NFCSTATUS_FAILED;
+ goto clean_and_return;
+ }
+ }
if (nxpncihal_ctrl.ext_cb_data.status != NFCSTATUS_SUCCESS) {
NXPLOG_NCIHAL_E(
@@ -494,7 +573,7 @@ static NFCSTATUS phNxpNciHal_process_ext_cmd_rsp(uint16_t cmd_len,
clean_and_return:
phNxpNciHal_cleanup_cb_data(&nxpncihal_ctrl.ext_cb_data);
-
+ nxpncihal_ctrl.nci_info.wait_for_ntf = FALSE;
return status;
}
@@ -523,7 +602,26 @@ NFCSTATUS phNxpNciHal_write_ext(uint16_t* cmd_len, uint8_t* p_cmd_data,
if (phNxpDta_IsEnable() == true) {
status = phNxpNHal_DtaUpdate(cmd_len, p_cmd_data, rsp_len, p_rsp_data);
}
-
+ if (nxpncihal_ctrl.nci_info.nci_version == NCI_VERSION_2_0 &&
+ p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x01) {
+ NXPLOG_NCIHAL_D("Setting up routing table - start");
+ p_cmd_data[2] = 0x0C;
+ p_cmd_data[3] = 0x00;
+ p_cmd_data[4] = 0x02;
+ p_cmd_data[5] = 0x01;
+ p_cmd_data[6] = 0x03;
+ p_cmd_data[7] = 0x00;
+ p_cmd_data[8] = 0x01;
+ p_cmd_data[9] = 0x05;
+ p_cmd_data[10] = 0x01;
+ p_cmd_data[11] = 0x03;
+ p_cmd_data[12] = 0x00;
+ p_cmd_data[13] = 0x01;
+ p_cmd_data[14] = 0x04;
+ *cmd_len = 15;
+ NXPLOG_NCIHAL_D("Setting up routing table - END");
+ status = NFCSTATUS_SUCCESS;
+ }
if (p_cmd_data[0] == PROPRIETARY_CMD_FELICA_READER_MODE &&
p_cmd_data[1] == PROPRIETARY_CMD_FELICA_READER_MODE &&
p_cmd_data[2] == PROPRIETARY_CMD_FELICA_READER_MODE) {