summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xextns/impl/Nxp_Features.h12
-rw-r--r--halimpl/dnld/phDnldNfc.cc2
-rwxr-xr-xhalimpl/dnld/phDnldNfc.h2
-rw-r--r--halimpl/dnld/phNxpNciHal_Dnld.cc2
-rwxr-xr-xhalimpl/hal/phNxpNciHal.cc79
-rwxr-xr-xhalimpl/hal/phNxpNciHal.h3
-rwxr-xr-xhalimpl/hal/phNxpNciHal_ext.cc41
-rwxr-xr-xhalimpl/libnfc-nxp-PN548AD_example.conf6
-rwxr-xr-xhalimpl/libnfc-nxp-PN66T_example.conf6
-rw-r--r--halimpl/utils/phNxpNciHal_utils.cc14
10 files changed, 163 insertions, 4 deletions
diff --git a/extns/impl/Nxp_Features.h b/extns/impl/Nxp_Features.h
index d841791..1a2bf41 100755
--- a/extns/impl/Nxp_Features.h
+++ b/extns/impl/Nxp_Features.h
@@ -25,6 +25,7 @@
#define FW_MOBILE_MAJOR_NUMBER_PN81A 0x02
#define FW_MOBILE_MAJOR_NUMBER_PN551 0x05
#define FW_MOBILE_MAJOR_NUMBER_PN557 0x01
+#define FW_MOBILE_MAJOR_NUMBER_PN548AD 0x01
using namespace std;
typedef enum {
unknown,
@@ -60,6 +61,8 @@ extern tNfc_featureList nfcFL;
nfcFL.chipType = pn553; \
} else if (chipType == pn67T) { \
nfcFL.chipType = pn551; \
+ } else if (chipType == pn66T) { \
+ nfcFL.chipType = pn548C2; \
} \
CONFIGURE_FEATURELIST_NFCC(chipType) \
}
@@ -91,6 +94,15 @@ extern tNfc_featureList nfcFL;
nfcFL._PHDNLDNFC_USERDATA_EEPROM_LEN = 0x0C00U; \
nfcFL._FW_MOBILE_MAJOR_NUMBER = FW_MOBILE_MAJOR_NUMBER_PN551; \
\
+ } else if (chipType == pn548C2 || chipType == pn66T) { \
+ \
+ STRCPY_FW_LIB("libpn548ad_fw") \
+ STRCPY_FW_BIN("pn548") \
+ \
+ nfcFL._PHDNLDNFC_USERDATA_EEPROM_OFFSET = 0x02BCU; \
+ nfcFL._PHDNLDNFC_USERDATA_EEPROM_LEN = 0x0C00U; \
+ nfcFL._FW_MOBILE_MAJOR_NUMBER = FW_MOBILE_MAJOR_NUMBER_PN548AD; \
+ \
} \
}
#define STRCPY_FW_LIB(str) { \
diff --git a/halimpl/dnld/phDnldNfc.cc b/halimpl/dnld/phDnldNfc.cc
index 5ee2aac..36ea2f4 100644
--- a/halimpl/dnld/phDnldNfc.cc
+++ b/halimpl/dnld/phDnldNfc.cc
@@ -243,6 +243,8 @@ NFCSTATUS phDnldNfc_CheckIntegrity(uint8_t bChipVer, pphDnldNfc_Buff_t pCRCData,
} else {
if ((PHDNLDNFC_HWVER_MRA2_1 == bChipVer) ||
(PHDNLDNFC_HWVER_MRA2_2 == bChipVer) ||
+ ((nfcFL.chipType == pn548C2) &&
+ (PHDNLDNFC_HWVER_PN548AD_MRA1_0 == bChipVer)) ||
((nfcFL.chipType == pn551) &&
(PHDNLDNFC_HWVER_PN551_MRA1_0 == bChipVer)) ||
(((nfcFL.chipType == pn553) || (nfcFL.chipType == pn557)) &&
diff --git a/halimpl/dnld/phDnldNfc.h b/halimpl/dnld/phDnldNfc.h
index ae672ef..a065e4d 100755
--- a/halimpl/dnld/phDnldNfc.h
+++ b/halimpl/dnld/phDnldNfc.h
@@ -43,6 +43,8 @@ typedef void (*pphDnldNfc_RspCb_t)(void* pContext, NFCSTATUS wStatus,
#define PHDNLDNFC_HWVER_MRA2_1 (0x04U) /* ChipVersion MRA2.1 */
#define PHDNLDNFC_HWVER_MRA2_2 (0x05U) /* ChipVersion MRA2.2 */
+/* PN548AD ChipVersion MRA1.0 */
+#define PHDNLDNFC_HWVER_PN548AD_MRA1_0 (0x08U)
/* PN551 ChipVersion MRA1.0 */
#define PHDNLDNFC_HWVER_PN551_MRA1_0 (0x08U)
/* PN553-NCI1.0 ChipVersion MRA1.0 */
diff --git a/halimpl/dnld/phNxpNciHal_Dnld.cc b/halimpl/dnld/phNxpNciHal_Dnld.cc
index ceca050..4392128 100644
--- a/halimpl/dnld/phNxpNciHal_Dnld.cc
+++ b/halimpl/dnld/phNxpNciHal_Dnld.cc
@@ -523,6 +523,8 @@ static void phNxpNciHal_fw_dnld_get_version_cb(void* pContext, NFCSTATUS status,
if ((PHDNLDNFC_HWVER_MRA2_1 == bHwVer) ||
(PHDNLDNFC_HWVER_MRA2_2 == bHwVer) ||
+ ((nfcFL.chipType == pn548C2) &&
+ (PHDNLDNFC_HWVER_PN548AD_MRA1_0 == bHwVer)) ||
((nfcFL.chipType == pn551) &&
(PHDNLDNFC_HWVER_PN551_MRA1_0 == bHwVer)) ||
(((nfcFL.chipType == pn553) || (nfcFL.chipType == pn557)) &&
diff --git a/halimpl/hal/phNxpNciHal.cc b/halimpl/hal/phNxpNciHal.cc
index 7d3264d..664dc96 100755
--- a/halimpl/hal/phNxpNciHal.cc
+++ b/halimpl/hal/phNxpNciHal.cc
@@ -75,6 +75,8 @@ extern uint8_t gRecFWDwnld;
static uint8_t gRecFwRetryCount; // variable to hold dummy FW recovery count
static uint8_t Rx_data[NCI_MAX_DATA_LEN];
extern int phPalEse_spi_ioctl(phPalEse_ControlCode_t eControlCode,void *pDevHandle, long level);
+uint8_t discovery_cmd[50] = {0};
+uint8_t discovery_cmd_len = 0;
uint32_t timeoutTimerId = 0;
bool nfc_debug_enabled = true;
@@ -618,6 +620,11 @@ int phNxpNciHal_MinOpen (){
tOsalConfig.pLogFile = NULL;
tTmlConfig.dwGetMsgThreadId = (uintptr_t)nxpncihal_ctrl.gDrvCfg.nClientId;
+ if (nfcFL.chipType == pn548C2) {
+ memset(discovery_cmd, 0, sizeof(discovery_cmd));
+ discovery_cmd_len = 0;
+ }
+
/* Initialize TML layer */
wConfigStatus = phTmlNfc_Init(&tTmlConfig);
if (wConfigStatus != NFCSTATUS_SUCCESS) {
@@ -823,6 +830,10 @@ int phNxpNciHal_fw_mw_ver_check() {
(rom_version == FW_MOBILE_ROM_VERSION_PN551) &&
(fw_maj_ver == 0x05)) {
status = NFCSTATUS_SUCCESS;
+ } else if ((nfcFL.chipType == pn548C2) &&
+ (rom_version == FW_MOBILE_ROM_VERSION_PN548AD) &&
+ (fw_maj_ver == 0x01)) {
+ status = NFCSTATUS_SUCCESS;
}
return status;
}
@@ -3249,3 +3260,71 @@ static void phNxpNciHal_print_res_status(uint8_t* p_rx_data, uint16_t* p_len) {
}
}
}
+
+NFCSTATUS phNxpNciHal_core_reset_recovery() {
+ NFCSTATUS status = NFCSTATUS_FAILED;
+
+ /*NCI_INIT_CMD*/
+ static uint8_t cmd_init_nci[] = {0x20, 0x01, 0x00};
+ /*NCI_RESET_CMD*/
+ static uint8_t cmd_reset_nci[] = {0x20, 0x00, 0x01,
+ 0x00}; // keep configuration
+ static uint8_t cmd_init_nci2_0[] = {0x20, 0x01, 0x02, 0x00, 0x00};
+ /* reset config cache */
+ uint8_t retry_core_init_cnt = 0;
+
+ if (discovery_cmd_len == 0) {
+ goto FAILURE;
+ }
+ NXPLOG_NCIHAL_D("%s: recovery", __func__);
+
+retry_core_init:
+ if (retry_core_init_cnt > 3) {
+ goto FAILURE;
+ }
+
+ status = phTmlNfc_IoCtl(phTmlNfc_e_ResetDevice);
+ if (status != NFCSTATUS_SUCCESS) {
+ NXPLOG_NCIHAL_D("PN54X Reset - FAILED\n");
+ goto FAILURE;
+ }
+ status = phNxpNciHal_send_ext_cmd(sizeof(cmd_reset_nci), cmd_reset_nci);
+ if ((status != NFCSTATUS_SUCCESS) &&
+ (nxpncihal_ctrl.retry_cnt >= MAX_RETRY_COUNT)) {
+ retry_core_init_cnt++;
+ goto retry_core_init;
+ } else if (status != NFCSTATUS_SUCCESS) {
+ NXPLOG_NCIHAL_D("NCI_CORE_RESET: Failed");
+ retry_core_init_cnt++;
+ goto retry_core_init;
+ }
+ if (nxpncihal_ctrl.nci_info.nci_version == NCI_VERSION_2_0) {
+ status = phNxpNciHal_send_ext_cmd(sizeof(cmd_init_nci2_0), cmd_init_nci2_0);
+ } else {
+ status = phNxpNciHal_send_ext_cmd(sizeof(cmd_init_nci), cmd_init_nci);
+ }
+ if (status != NFCSTATUS_SUCCESS) {
+ NXPLOG_NCIHAL_D("NCI_CORE_INIT : Failed");
+ retry_core_init_cnt++;
+ goto retry_core_init;
+ }
+
+ status = phNxpNciHal_send_ext_cmd(discovery_cmd_len, discovery_cmd);
+ if (status != NFCSTATUS_SUCCESS) {
+ NXPLOG_NCIHAL_D("RF_DISCOVERY : Failed");
+ retry_core_init_cnt++;
+ goto retry_core_init;
+ }
+
+ return NFCSTATUS_SUCCESS;
+FAILURE:
+ abort();
+}
+
+void phNxpNciHal_discovery_cmd_ext(uint8_t* p_cmd_data, uint16_t cmd_len) {
+ NXPLOG_NCIHAL_D("phNxpNciHal_discovery_cmd_ext");
+ if (cmd_len > 0 && cmd_len <= sizeof(discovery_cmd)) {
+ memcpy(discovery_cmd, p_cmd_data, cmd_len);
+ discovery_cmd_len = cmd_len;
+ }
+}
diff --git a/halimpl/hal/phNxpNciHal.h b/halimpl/hal/phNxpNciHal.h
index 5e59dce..79791f9 100755
--- a/halimpl/hal/phNxpNciHal.h
+++ b/halimpl/hal/phNxpNciHal.h
@@ -33,6 +33,7 @@
typedef void(phNxpNciHal_control_granted_callback_t)();
/*ROM CODE VERSION FW*/
+#define FW_MOBILE_ROM_VERSION_PN548AD 0x10
#define FW_MOBILE_ROM_VERSION_PN551 0x10
#define FW_MOBILE_ROM_VERSION_PN553 0x11
#define FW_MOBILE_ROM_VERSION_PN557 0x12
@@ -177,6 +178,8 @@ int phNxpNciHal_check_ncicmd_write_window(uint16_t cmd_len, uint8_t* p_cmd);
void phNxpNciHal_request_control(void);
void phNxpNciHal_release_control(void);
int phNxpNciHal_write_unlocked(uint16_t data_len, const uint8_t* p_data);
+NFCSTATUS phNxpNciHal_core_reset_recovery();
+void phNxpNciHal_discovery_cmd_ext(uint8_t* p_cmd_data, uint16_t cmd_len);
/*******************************************************************************
**
** Function phNxpNciHal_configFeatureList
diff --git a/halimpl/hal/phNxpNciHal_ext.cc b/halimpl/hal/phNxpNciHal_ext.cc
index 7908141..d75b6b4 100755
--- a/halimpl/hal/phNxpNciHal_ext.cc
+++ b/halimpl/hal/phNxpNciHal_ext.cc
@@ -36,6 +36,7 @@ extern uint32_t cleanup_timer;
extern bool nfc_debug_enabled;
uint8_t icode_detected = 0x00;
uint8_t icode_send_eof = 0x00;
+uint8_t nfcdep_detected = 0x00;
static uint8_t ee_disc_done = 0x00;
uint8_t EnableP2P_PrioLogic = false;
static uint32_t RfDiscID = 1;
@@ -140,6 +141,9 @@ NFCSTATUS phNxpNciHal_process_ext_rsp(uint8_t* p_ntf, uint16_t* p_len) {
status = NFCSTATUS_SUCCESS;
if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05) {
+ if ((nfcFL.chipType == pn548C2) && (nfcdep_detected)) {
+ nfcdep_detected = 0x00;
+ }
switch (p_ntf[4]) {
case 0x00:
@@ -153,6 +157,9 @@ NFCSTATUS phNxpNciHal_process_ext_rsp(uint8_t* p_ntf, uint16_t* p_len) {
break;
case 0x03:
NXPLOG_NCIHAL_D("NxpNci: RF Interface = NFC-DEP");
+ if (nfcFL.chipType == pn548C2) {
+ nfcdep_detected = 0x01;
+ }
break;
case 0x80:
NXPLOG_NCIHAL_D("NxpNci: RF Interface = MIFARE");
@@ -447,6 +454,14 @@ static NFCSTATUS phNxpNciHal_ext_process_nfc_init_rsp(uint8_t* p_ntf,
}
NXPLOG_NCIHAL_D("CORE_RESET_NTF received !");
NXPLOG_NCIR_E("len = %3d > %s", *p_len, print_buffer);
+ if ((nfcFL.chipType == pn548C2) && 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;
+ }
phNxpNciHal_emergency_recovery();
status = NFCSTATUS_FAILED;
} /* Parsing CORE_INIT_RSP*/
@@ -708,6 +723,10 @@ NFCSTATUS phNxpNciHal_write_ext(uint16_t* cmd_len, uint8_t* p_cmd_data,
NXPLOG_NCIHAL_D("> Polling Loop Started");
icode_detected = 0;
icode_send_eof = 0;
+ if (nfcFL.chipType == pn548C2) {
+ // Cache discovery cmd for recovery
+ phNxpNciHal_discovery_cmd_ext(p_cmd_data, *cmd_len);
+ }
}
// 22000100
else if (p_cmd_data[0] == 0x22 && p_cmd_data[1] == 0x00 &&
@@ -861,6 +880,28 @@ NFCSTATUS phNxpNciHal_write_ext(uint16_t* cmd_len, uint8_t* p_cmd_data,
}
}
+ if (nfcFL.chipType == pn548C2 && p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) {
+ uint8_t temp;
+ uint8_t* p = p_cmd_data + 4;
+ uint8_t* end = p_cmd_data + *cmd_len;
+ while (p < end) {
+ if (*p == 0x53) // LF_T3T_FLAGS
+ {
+ NXPLOG_NCIHAL_D("> Going through workaround - LF_T3T_FLAGS swap");
+ temp = *(p + 3);
+ *(p + 3) = *(p + 2);
+ *(p + 2) = temp;
+ NXPLOG_NCIHAL_D("> Going through workaround - LF_T3T_FLAGS - End");
+ status = NFCSTATUS_SUCCESS;
+ break;
+ }
+ if (*p == 0xA0) {
+ p += *(p + 2) + 3;
+ } else {
+ p += *(p + 1) + 2;
+ }
+ }
+ }
return status;
}
diff --git a/halimpl/libnfc-nxp-PN548AD_example.conf b/halimpl/libnfc-nxp-PN548AD_example.conf
index 53121b2..4435244 100755
--- a/halimpl/libnfc-nxp-PN548AD_example.conf
+++ b/halimpl/libnfc-nxp-PN548AD_example.conf
@@ -30,8 +30,10 @@ MIFARE_READER_ENABLE=0x01
VZW_FEATURE_ENABLE=0x01
###############################################################################
-# File name for Firmware
-NXP_FW_NAME="libpn548ad_fw.so"
+# Firmware file type
+#.so file 0x01
+#.bin file 0x02
+NXP_FW_TYPE=0x01
###############################################################################
# System clock source selection configuration
diff --git a/halimpl/libnfc-nxp-PN66T_example.conf b/halimpl/libnfc-nxp-PN66T_example.conf
index d63881f..b7d0154 100755
--- a/halimpl/libnfc-nxp-PN66T_example.conf
+++ b/halimpl/libnfc-nxp-PN66T_example.conf
@@ -29,8 +29,10 @@ MIFARE_READER_ENABLE=0x01
VZW_FEATURE_ENABLE=0x01
###############################################################################
-# File name for Firmware
-NXP_FW_NAME="libpn548ad_fw.so"
+# Firmware file type
+#.so file 0x01
+#.bin file 0x02
+NXP_FW_TYPE=0x01
###############################################################################
# System clock source selection configuration
diff --git a/halimpl/utils/phNxpNciHal_utils.cc b/halimpl/utils/phNxpNciHal_utils.cc
index c1a14f4..03df5d4 100644
--- a/halimpl/utils/phNxpNciHal_utils.cc
+++ b/halimpl/utils/phNxpNciHal_utils.cc
@@ -23,6 +23,10 @@
#include <phNxpNciHal.h>
#include <phNxpNciHal_utils.h>
+extern uint8_t discovery_cmd[50];
+extern uint8_t discovery_cmd_len;
+extern uint8_t nfcdep_detected;
+
/*********************** Link list functions **********************************/
/*******************************************************************************
@@ -457,6 +461,16 @@ void phNxpNciHal_print_packet(const char* pString, const uint8_t* p_data,
*******************************************************************************/
void phNxpNciHal_emergency_recovery(void) {
+ if (nfcFL.chipType == pn548C2 && nfcdep_detected && discovery_cmd_len != 0) {
+ pthread_t pthread;
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+ if (pthread_create(&pthread, &attr, (void *(*)(void *))phNxpNciHal_core_reset_recovery,
+ NULL) == 0) {
+ return;
+ }
+ }
NXPLOG_NCIHAL_E("%s: abort()", __func__);
abort();
}