diff options
| -rwxr-xr-x | extns/impl/Nxp_Features.h | 12 | ||||
| -rw-r--r-- | halimpl/dnld/phDnldNfc.cc | 2 | ||||
| -rwxr-xr-x | halimpl/dnld/phDnldNfc.h | 2 | ||||
| -rw-r--r-- | halimpl/dnld/phNxpNciHal_Dnld.cc | 2 | ||||
| -rwxr-xr-x | halimpl/hal/phNxpNciHal.cc | 79 | ||||
| -rwxr-xr-x | halimpl/hal/phNxpNciHal.h | 3 | ||||
| -rwxr-xr-x | halimpl/hal/phNxpNciHal_ext.cc | 41 | ||||
| -rwxr-xr-x | halimpl/libnfc-nxp-PN548AD_example.conf | 6 | ||||
| -rwxr-xr-x | halimpl/libnfc-nxp-PN66T_example.conf | 6 | ||||
| -rw-r--r-- | halimpl/utils/phNxpNciHal_utils.cc | 14 |
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(); } |
