summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRashed Abdel-Tawab <rashed@linux.com>2018-03-21 16:51:48 -0400
committerdianlujitao <dianlujitao@lineageos.org>2019-09-11 21:19:43 +0800
commit706c52c19473b9765176b9e093be0f7ae7f6095a (patch)
treea3a4a4d92eb6ccf1b2974f9dcf5292a0719d1786
parent8a94bb8c26287d8d17a4969684c42f27bd71e1de (diff)
downloadandroid_hardware_nxp_nfc-706c52c19473b9765176b9e093be0f7ae7f6095a.tar.gz
android_hardware_nxp_nfc-706c52c19473b9765176b9e093be0f7ae7f6095a.tar.bz2
android_hardware_nxp_nfc-706c52c19473b9765176b9e093be0f7ae7f6095a.zip
nfc: Restore pn548 support to 1.1 HAL
pn548 can be dynamically selected just fine and firmware is the same version as pn551 due to both being of the same pn6xT family Change-Id: Ifbef5a5ec0928b0a90b2fc71d84872525d0cf1a6
-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();
}