diff options
Diffstat (limited to 'halimpl/pn54x/hal/phNxpNciHal_ext.c')
-rw-r--r-- | halimpl/pn54x/hal/phNxpNciHal_ext.c | 156 |
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) { |