diff options
| author | Rashed Abdel-Tawab <rashed@linux.com> | 2018-03-21 16:51:48 -0400 |
|---|---|---|
| committer | dianlujitao <dianlujitao@lineageos.org> | 2019-09-11 21:19:43 +0800 |
| commit | 706c52c19473b9765176b9e093be0f7ae7f6095a (patch) | |
| tree | a3a4a4d92eb6ccf1b2974f9dcf5292a0719d1786 | |
| parent | 8a94bb8c26287d8d17a4969684c42f27bd71e1de (diff) | |
| download | android_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-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(); } |
