Snap for 4680594 from e09f8fe52be454b80a1ef33744ca665ce95101d9 to pi-release

Change-Id: Ice8040ce404875b1cf05e8dfb7f4ab6d14667b5b
diff --git a/Android.bp b/Android.bp
index 0666007..0a5cd9a 100755
--- a/Android.bp
+++ b/Android.bp
@@ -18,8 +18,6 @@
     proprietary: true,
 
     cflags: [
-        "-DNFC_NXP_CHIP_TYPE=PN557",
-        "-DPN557=1",
         "-Wall",
         "-Werror",
         "-Wextra",
@@ -42,6 +40,7 @@
         "halimpl/tml/phTmlNfc.cc",
         "halimpl/tml/phTmlNfc_i2c.cc",
         "halimpl/tml/spi_spm.cc",
+        "halimpl/utils/NxpNfcCapability.cpp",
         "halimpl/utils/phNxpConfig.cpp",
         "halimpl/utils/phNxpNciHal_utils.cc",
         "halimpl/utils/sparse_crc32.cc",
diff --git a/extns/impl/Nxp_Features.h b/extns/impl/Nxp_Features.h
index 10f2400..6c03877 100755
--- a/extns/impl/Nxp_Features.h
+++ b/extns/impl/Nxp_Features.h
@@ -16,26 +16,16 @@
  *
  ******************************************************************************/
 
-#include <unistd.h>
-#include <string.h>
 #ifndef NXP_FEATURES_H
 #define NXP_FEATURES_H
-
-#define STRMAX_1 40
-#define STRMAX_2 100
-#define FW_DLL_EXTENSION ".so"
+#include <unistd.h>
+#include <string>
 
 #define FW_MOBILE_MAJOR_NUMBER_PN553 0x01
+#define FW_MOBILE_MAJOR_NUMBER_PN81A 0x02
 #define FW_MOBILE_MAJOR_NUMBER_PN551 0x05
-#define FW_MOBILE_MAJOR_NUMBER_PN48AD 0x01
-
-#define NFA_EE_MAX_EE_SUPPORTED 4
-
-#define JCOP_VER_3_1 1
-#define JCOP_VER_3_2 2
-#define JCOP_VER_3_3 3
-#define JCOP_VER_4_0 4
-
+#define FW_MOBILE_MAJOR_NUMBER_PN557 0x01
+ using namespace std;
 typedef enum {
   pn547C2 = 0x01,
   pn65T,
@@ -50,86 +40,12 @@
 } tNFC_chipType;
 
 typedef struct {
-  /*Flags common to all chip types*/
-  uint8_t _NXP_NFCC_EMPTY_DATA_PACKET : 1;
-  uint8_t _GEMALTO_SE_SUPPORT : 1;
-  uint8_t _NFCC_I2C_READ_WRITE_IMPROVEMENT : 1;
-  uint8_t _NFCC_MIFARE_TIANJIN : 1;
-  uint8_t _NFCC_MW_RCVRY_BLK_FW_DNLD : 1;
-  uint8_t _NFCC_DYNAMIC_DUAL_UICC : 1;
-  uint8_t _NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH : 1;
-  uint8_t _NFC_NXP_STAT_DUAL_UICC_WO_EXT_SWITCH : 1;
-  uint8_t _NFCC_FW_WA : 1;
-  uint8_t _NFCC_FORCE_NCI1_0_INIT : 1;
-  uint8_t _NFCC_ROUTING_BLOCK_BIT : 1;
-  uint8_t _NFCC_SPI_FW_DOWNLOAD_SYNC : 1;
-  uint8_t _HW_ANTENNA_LOOP4_SELF_TEST : 1;
-  uint8_t _NFCEE_REMOVED_NTF_RECOVERY : 1;
-  uint8_t _NFCC_FORCE_FW_DOWNLOAD : 1;
-  uint8_t _UICC_CREATE_CONNECTIVITY_PIPE : 1;
-  uint8_t _NFCC_AID_MATCHING_PLATFORM_CONFIG : 1;
-  uint8_t _NFCC_ROUTING_BLOCK_BIT_PROP : 1;
-  uint8_t _NXP_NFC_UICC_ETSI12 : 1;
-  uint8_t _NFA_EE_MAX_EE_SUPPORTED : 3;
-} tNfc_nfccFeatureList;
-
-typedef struct {
-  uint8_t _ESE_EXCLUSIVE_WIRED_MODE : 2;
-  uint8_t _ESE_WIRED_MODE_RESUME : 2;
-  uint8_t _ESE_WIRED_MODE_TIMEOUT : 2;
-  uint8_t _ESE_PN67T_RESET : 2;
-  uint8_t _ESE_APDU_GATE_RESET : 2;
-  uint8_t _ESE_WIRED_MODE_DISABLE_DISCOVERY : 1;
-  uint8_t _LEGACY_APDU_GATE : 1;
-  uint8_t _TRIPLE_MODE_PROTECTION : 1;
-  uint8_t _ESE_FELICA_CLT : 1;
-  uint8_t _WIRED_MODE_STANDBY_PROP : 1;
-  uint8_t _WIRED_MODE_STANDBY : 1;
-  uint8_t _ESE_DUAL_MODE_PRIO_SCHEME : 2;
-  uint8_t _ESE_FORCE_ENABLE : 1;
-  uint8_t _ESE_RESET_METHOD : 1;
-  uint8_t _EXCLUDE_NV_MEM_DEPENDENCY : 1;
-  uint8_t _ESE_ETSI_READER_ENABLE : 1;
-  uint8_t _ESE_SVDD_SYNC : 1;
-  uint8_t _NFCC_ESE_UICC_CONCURRENT_ACCESS_PROTECTION : 1;
-  uint8_t _ESE_JCOP_DWNLD_PROTECTION : 1;
-  uint8_t _UICC_HANDLE_CLEAR_ALL_PIPES : 1;
-  uint8_t _GP_CONTINOUS_PROCESSING : 1;
-  uint8_t _ESE_DWP_SPI_SYNC_ENABLE : 1;
-  uint8_t _ESE_ETSI12_PROP_INIT : 1;
-  uint8_t _ESE_WIRED_MODE_PRIO : 1;
-  uint8_t _ESE_UICC_EXCLUSIVE_WIRED_MODE : 1;
-  uint8_t _ESE_POWER_MODE : 1;
-  uint8_t _ESE_P73_ISO_RST : 1;
-  uint8_t _BLOCK_PROPRIETARY_APDU_GATE : 1;
-  uint8_t _JCOP_WA_ENABLE : 1;
-  uint8_t _NXP_LDR_SVC_VER_2 : 1;
-  uint8_t _NXP_ESE_VER : 3;
-} tNfc_eseFeatureList;
-typedef struct { uint8_t _NFCC_RESET_RSP_LEN; } tNfc_platformFeatureList;
-
-typedef struct {
-  uint8_t _NCI_INTERFACE_UICC_DIRECT;
-  uint8_t _NCI_INTERFACE_ESE_DIRECT;
-  uint8_t _NCI_PWR_LINK_PARAM_CMD_SIZE;
-  uint8_t _NCI_EE_PWR_LINK_ALWAYS_ON;
-  uint8_t _NFA_EE_MAX_AID_ENTRIES;
-  uint8_t _NFC_NXP_AID_MAX_SIZE_DYN : 1;
-  uint8_t _FW_LIB_PATH[STRMAX_2];
-  uint8_t _PLATFORM_LIB_PATH[STRMAX_2];
-  uint8_t _PKU_LIB_PATH[STRMAX_2];
+  tNFC_chipType chipType;
+  std::string _FW_LIB_PATH;
+  std::string _FW_BIN_PATH;
   uint16_t _PHDNLDNFC_USERDATA_EEPROM_OFFSET;
   uint16_t _PHDNLDNFC_USERDATA_EEPROM_LEN;
   uint8_t _FW_MOBILE_MAJOR_NUMBER;
-} tNfc_nfcMwFeatureList;
-
-typedef struct {
-  uint8_t nfcNxpEse : 1;
-  tNFC_chipType chipType;
-  tNfc_nfccFeatureList nfccFL;
-  tNfc_eseFeatureList eseFL;
-  tNfc_platformFeatureList platformFL;
-  tNfc_nfcMwFeatureList nfcMwFL;
 } tNfc_featureList;
 
 extern tNfc_featureList nfcFL;
@@ -137,308 +53,55 @@
 #define CONFIGURE_FEATURELIST(chipType)                                      \
   {                                                                          \
     nfcFL.chipType = chipType;                                               \
-    nfcFL.nfcMwFL._NFC_NXP_AID_MAX_SIZE_DYN = true;                          \
     if (chipType == pn81T) {                                                 \
       nfcFL.chipType = pn557;                                                \
     } else if (chipType == pn80T) {                                          \
       nfcFL.chipType = pn553;                                                \
     } else if (chipType == pn67T) {                                          \
       nfcFL.chipType = pn551;                                                \
-    } else if (chipType == pn66T) {                                          \
-      nfcFL.chipType = pn548C2;                                              \
-    } else if (chipType == pn65T) {                                          \
-      nfcFL.chipType = pn547C2;                                              \
     }                                                                        \
-    if ((chipType == pn65T) || (chipType == pn66T) || (chipType == pn67T) || \
-        (chipType == pn80T) || (chipType == pn81T)) {                        \
-      nfcFL.nfcNxpEse = true;                                                \
-      CONFIGURE_FEATURELIST_NFCC_WITH_ESE(chipType)                          \
-    } else {                                                                 \
-      nfcFL.nfcNxpEse = false;                                               \
       CONFIGURE_FEATURELIST_NFCC(chipType)                                   \
-    }                                                                        \
-  }
-
-#define CONFIGURE_FEATURELIST_NFCC_WITH_ESE(chipType)                 \
-  {                                                                   \
-    nfcFL.nfccFL._NXP_NFCC_EMPTY_DATA_PACKET = true;                  \
-    nfcFL.nfccFL._GEMALTO_SE_SUPPORT = true;                          \
-                                                                      \
-    nfcFL.eseFL._ESE_EXCLUSIVE_WIRED_MODE = 1;                        \
-    nfcFL.eseFL._ESE_WIRED_MODE_RESUME = 2;                           \
-    nfcFL.eseFL._ESE_PN67T_RESET = 1;                                 \
-    nfcFL.eseFL._ESE_APDU_GATE_RESET = 2;                             \
-    nfcFL.eseFL._NXP_ESE_VER = JCOP_VER_4_0;                          \
-    nfcFL.eseFL._NXP_LDR_SVC_VER_2 = true;                            \
-                                                                      \
-    if (chipType == pn81T) {                                          \
-      CONFIGURE_FEATURELIST_NFCC(pn557)                               \
-      nfcFL.nfccFL._NFCC_SPI_FW_DOWNLOAD_SYNC = true;                 \
-      nfcFL.nfccFL._NFA_EE_MAX_EE_SUPPORTED = 4;                      \
-                                                                      \
-      nfcFL.eseFL._ESE_FELICA_CLT = true;                             \
-      nfcFL.eseFL._ESE_DUAL_MODE_PRIO_SCHEME =                        \
-          nfcFL.eseFL._ESE_WIRED_MODE_RESUME;                         \
-      nfcFL.eseFL._ESE_RESET_METHOD = true;                           \
-      nfcFL.eseFL._ESE_POWER_MODE = true;                             \
-      nfcFL.eseFL._ESE_P73_ISO_RST = true;                            \
-      nfcFL.eseFL._WIRED_MODE_STANDBY = true;                         \
-      nfcFL.eseFL._ESE_ETSI_READER_ENABLE = true;                     \
-      nfcFL.eseFL._ESE_SVDD_SYNC = true;                              \
-      nfcFL.eseFL._ESE_JCOP_DWNLD_PROTECTION = true;                  \
-      nfcFL.eseFL._UICC_HANDLE_CLEAR_ALL_PIPES = true;                \
-      nfcFL.eseFL._GP_CONTINOUS_PROCESSING = false;                   \
-      nfcFL.eseFL._ESE_DWP_SPI_SYNC_ENABLE = true;                    \
-      nfcFL.eseFL._ESE_ETSI12_PROP_INIT = true;                       \
-    }                                                                 \
-    if (chipType == pn80T) {                                          \
-      CONFIGURE_FEATURELIST_NFCC(pn553)                               \
-      nfcFL.nfccFL._NFA_EE_MAX_EE_SUPPORTED = 4;                      \
-                                                                      \
-      nfcFL.eseFL._ESE_FELICA_CLT = true;                             \
-      nfcFL.eseFL._WIRED_MODE_STANDBY = true;                         \
-      nfcFL.eseFL._ESE_DUAL_MODE_PRIO_SCHEME =                        \
-          nfcFL.eseFL._ESE_WIRED_MODE_RESUME;                         \
-      nfcFL.eseFL._ESE_RESET_METHOD = true;                           \
-      nfcFL.eseFL._ESE_ETSI_READER_ENABLE = true;                     \
-      nfcFL.eseFL._ESE_SVDD_SYNC = true;                              \
-      nfcFL.eseFL._ESE_JCOP_DWNLD_PROTECTION = true;                  \
-      nfcFL.eseFL._UICC_HANDLE_CLEAR_ALL_PIPES = true;                \
-      nfcFL.eseFL._ESE_DWP_SPI_SYNC_ENABLE = true;                    \
-      nfcFL.eseFL._ESE_POWER_MODE = true;                             \
-      nfcFL.eseFL._ESE_P73_ISO_RST = true;                            \
-                                                                      \
-      nfcFL.nfcMwFL._NCI_PWR_LINK_PARAM_CMD_SIZE = 0x02;              \
-      nfcFL.nfcMwFL._NCI_EE_PWR_LINK_ALWAYS_ON = 0x01;                \
-    } else if (chipType == pn67T) {                                   \
-      CONFIGURE_FEATURELIST_NFCC(pn551)                               \
-      nfcFL.nfccFL._NFA_EE_MAX_EE_SUPPORTED = 3;                      \
-                                                                      \
-      nfcFL.eseFL._TRIPLE_MODE_PROTECTION = true;                     \
-      nfcFL.eseFL._WIRED_MODE_STANDBY_PROP = true;                    \
-      nfcFL.eseFL._ESE_FORCE_ENABLE = true;                           \
-      nfcFL.eseFL._ESE_ETSI_READER_ENABLE = true;                     \
-      nfcFL.eseFL._ESE_SVDD_SYNC = true;                              \
-      nfcFL.eseFL._LEGACY_APDU_GATE = true;                           \
-      nfcFL.eseFL._NFCC_ESE_UICC_CONCURRENT_ACCESS_PROTECTION = true; \
-      nfcFL.eseFL._ESE_DWP_SPI_SYNC_ENABLE = true;                    \
-      nfcFL.eseFL._NXP_ESE_VER = JCOP_VER_3_3;                        \
-    } else if (chipType == pn66T) {                                   \
-      CONFIGURE_FEATURELIST_NFCC(pn548C2)                             \
-      nfcFL.nfccFL._NFA_EE_MAX_EE_SUPPORTED = 3;                      \
-                                                                      \
-      nfcFL.eseFL._TRIPLE_MODE_PROTECTION = true;                     \
-      nfcFL.eseFL._WIRED_MODE_STANDBY_PROP = true;                    \
-      nfcFL.eseFL._ESE_FORCE_ENABLE = true;                           \
-      nfcFL.eseFL._ESE_ETSI_READER_ENABLE = true;                     \
-      nfcFL.eseFL._ESE_SVDD_SYNC = true;                              \
-      nfcFL.eseFL._LEGACY_APDU_GATE = true;                           \
-      nfcFL.eseFL._NFCC_ESE_UICC_CONCURRENT_ACCESS_PROTECTION = true; \
-      nfcFL.eseFL._ESE_DWP_SPI_SYNC_ENABLE = true;                    \
-      nfcFL.eseFL._NXP_ESE_VER = JCOP_VER_3_3;                        \
-    } else if (chipType == pn65T) {                                   \
-      CONFIGURE_FEATURELIST_NFCC(pn547C2)                             \
-      nfcFL.nfccFL._NFA_EE_MAX_EE_SUPPORTED = 3;                      \
-      nfcFL.eseFL._ESE_WIRED_MODE_DISABLE_DISCOVERY = true;           \
-      nfcFL.eseFL._LEGACY_APDU_GATE = true;                           \
-    }                                                                 \
   }
 
 #define CONFIGURE_FEATURELIST_NFCC(chipType)                                \
   {                                                                         \
-    nfcFL.eseFL._ESE_WIRED_MODE_TIMEOUT = 3;                                \
-    nfcFL.eseFL._ESE_WIRED_MODE_DISABLE_DISCOVERY = false;                  \
-    nfcFL.eseFL._LEGACY_APDU_GATE = false;                                  \
-    nfcFL.eseFL._TRIPLE_MODE_PROTECTION = false;                            \
-    nfcFL.eseFL._ESE_FELICA_CLT = false;                                    \
-    nfcFL.eseFL._WIRED_MODE_STANDBY_PROP = false;                           \
-    nfcFL.eseFL._WIRED_MODE_STANDBY = false;                                \
-    nfcFL.eseFL._ESE_DUAL_MODE_PRIO_SCHEME =                                \
-        nfcFL.eseFL._ESE_WIRED_MODE_TIMEOUT;                                \
-    nfcFL.eseFL._ESE_FORCE_ENABLE = false;                                  \
-    nfcFL.eseFL._ESE_RESET_METHOD = false;                                  \
-    nfcFL.eseFL._ESE_ETSI_READER_ENABLE = false;                            \
-    nfcFL.eseFL._ESE_SVDD_SYNC = false;                                     \
-    nfcFL.eseFL._NFCC_ESE_UICC_CONCURRENT_ACCESS_PROTECTION = false;        \
-    nfcFL.eseFL._ESE_JCOP_DWNLD_PROTECTION = false;                         \
-    nfcFL.eseFL._UICC_HANDLE_CLEAR_ALL_PIPES = false;                       \
-    nfcFL.eseFL._GP_CONTINOUS_PROCESSING = false;                           \
-    nfcFL.eseFL._ESE_DWP_SPI_SYNC_ENABLE = false;                           \
-    nfcFL.eseFL._ESE_ETSI12_PROP_INIT = false;                              \
-    nfcFL.eseFL._ESE_WIRED_MODE_PRIO = false;                               \
-    nfcFL.eseFL._ESE_UICC_EXCLUSIVE_WIRED_MODE = false;                     \
-    nfcFL.eseFL._ESE_POWER_MODE = false;                                    \
-    nfcFL.eseFL._ESE_P73_ISO_RST = false;                                   \
-    nfcFL.eseFL._BLOCK_PROPRIETARY_APDU_GATE = false;                       \
-    nfcFL.eseFL._JCOP_WA_ENABLE = true;                                     \
-    nfcFL.eseFL._EXCLUDE_NV_MEM_DEPENDENCY = false;                         \
-    nfcFL.nfccFL._NXP_NFC_UICC_ETSI12 = false;                              \
-    nfcFL.nfccFL._NFCC_SPI_FW_DOWNLOAD_SYNC = false;                        \
+    nfcFL._PHDNLDNFC_USERDATA_EEPROM_OFFSET = 0x023CU;                      \
+    nfcFL._PHDNLDNFC_USERDATA_EEPROM_LEN = 0x0C80U;                         \
                                                                             \
-    nfcFL.platformFL._NFCC_RESET_RSP_LEN = 0;                               \
+    if (chipType == pn557 || chipType == pn81T) {                           \
                                                                             \
-    nfcFL.nfcMwFL._NCI_INTERFACE_UICC_DIRECT = 0x00;                        \
-    nfcFL.nfcMwFL._NCI_INTERFACE_ESE_DIRECT = 0x00;                         \
-    nfcFL.nfcMwFL._NCI_PWR_LINK_PARAM_CMD_SIZE = 0x02;                      \
-    nfcFL.nfcMwFL._NCI_EE_PWR_LINK_ALWAYS_ON = 0x01;                        \
-    nfcFL.nfcMwFL._PHDNLDNFC_USERDATA_EEPROM_OFFSET = 0x023CU;              \
-    nfcFL.nfcMwFL._PHDNLDNFC_USERDATA_EEPROM_LEN = 0x0C80U;                 \
-    nfcFL.nfcMwFL._FW_MOBILE_MAJOR_NUMBER = FW_MOBILE_MAJOR_NUMBER_PN48AD;  \
+      STRCPY_FW_LIB("libpn557_fw")                                          \
+      STRCPY_FW_BIN("pn557")                                                \
                                                                             \
-    if (chipType == pn557) {                                                \
-      nfcFL.nfccFL._NFCC_I2C_READ_WRITE_IMPROVEMENT = true;                 \
-      nfcFL.nfccFL._NFCC_MIFARE_TIANJIN = false;                            \
-      nfcFL.nfccFL._NFCC_MW_RCVRY_BLK_FW_DNLD = true;                       \
-      nfcFL.nfccFL._NFCC_DYNAMIC_DUAL_UICC = true;                          \
-      nfcFL.nfccFL._NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH = false;              \
-      nfcFL.nfccFL._NFC_NXP_STAT_DUAL_UICC_WO_EXT_SWITCH = true;            \
-      nfcFL.nfccFL._NFCC_FW_WA = true;                                      \
-      nfcFL.nfccFL._NFCC_FORCE_NCI1_0_INIT = false;                         \
-      nfcFL.nfccFL._NFCC_SPI_FW_DOWNLOAD_SYNC = true;                       \
-      nfcFL.nfccFL._HW_ANTENNA_LOOP4_SELF_TEST = false;                     \
-      nfcFL.nfccFL._NFCEE_REMOVED_NTF_RECOVERY = true;                      \
-      nfcFL.nfccFL._NFCC_FORCE_FW_DOWNLOAD = true;                          \
-      nfcFL.nfccFL._UICC_CREATE_CONNECTIVITY_PIPE = true;                   \
-      nfcFL.nfccFL._NXP_NFC_UICC_ETSI12 = false;                            \
-      nfcFL.nfccFL._NFA_EE_MAX_EE_SUPPORTED = 3;                            \
+      nfcFL._FW_MOBILE_MAJOR_NUMBER = FW_MOBILE_MAJOR_NUMBER_PN557;         \
+    } else if (chipType == pn553 || chipType == pn80T) {                    \
                                                                             \
-      nfcFL.eseFL._ESE_ETSI12_PROP_INIT = true;                             \
-      nfcFL.eseFL._EXCLUDE_NV_MEM_DEPENDENCY = true;                        \
+      STRCPY_FW_LIB("libpn553_fw")                                          \
+      STRCPY_FW_BIN("pn553")                                                \
                                                                             \
-      nfcFL.platformFL._NFCC_RESET_RSP_LEN = 0x10U;                         \
+      nfcFL._FW_MOBILE_MAJOR_NUMBER = FW_MOBILE_MAJOR_NUMBER_PN553;         \
                                                                             \
-      nfcFL.nfcMwFL._NCI_INTERFACE_UICC_DIRECT = 0x82;                      \
-      nfcFL.nfcMwFL._NCI_INTERFACE_ESE_DIRECT = 0x83;                       \
+    } else if (chipType == pn551 || chipType == pn67T) {                    \
                                                                             \
-    } else if (chipType == pn553) {                                         \
-      nfcFL.nfccFL._NFCC_I2C_READ_WRITE_IMPROVEMENT = true;                 \
-      nfcFL.nfccFL._NFCC_MIFARE_TIANJIN = false;                            \
-      nfcFL.nfccFL._NFCC_MW_RCVRY_BLK_FW_DNLD = true;                       \
-      nfcFL.nfccFL._NFCC_DYNAMIC_DUAL_UICC = true;                          \
-      nfcFL.nfccFL._NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH = false;              \
-      nfcFL.nfccFL._NFC_NXP_STAT_DUAL_UICC_WO_EXT_SWITCH = true;            \
-      nfcFL.nfccFL._NFCC_FW_WA = true;                                      \
-      nfcFL.nfccFL._NFCC_FORCE_NCI1_0_INIT = true;                          \
-      nfcFL.nfccFL._NFCC_ROUTING_BLOCK_BIT = true;                          \
-      nfcFL.nfccFL._NFCC_SPI_FW_DOWNLOAD_SYNC = true;                       \
-      nfcFL.nfccFL._HW_ANTENNA_LOOP4_SELF_TEST = false;                     \
-      nfcFL.nfccFL._NFCEE_REMOVED_NTF_RECOVERY = true;                      \
-      nfcFL.nfccFL._NFCC_FORCE_FW_DOWNLOAD = true;                          \
-      nfcFL.nfccFL._UICC_CREATE_CONNECTIVITY_PIPE = true;                   \
-      nfcFL.nfccFL._NFCC_AID_MATCHING_PLATFORM_CONFIG = false;              \
-      nfcFL.nfccFL._NFCC_ROUTING_BLOCK_BIT_PROP = false;                    \
-      nfcFL.nfccFL._NFA_EE_MAX_EE_SUPPORTED = 3;                            \
+      STRCPY_FW_LIB("libpn551_fw")                                          \
+      STRCPY_FW_BIN("pn551")                                                \
                                                                             \
-      nfcFL.eseFL._ESE_ETSI12_PROP_INIT = true;                             \
-      nfcFL.eseFL._JCOP_WA_ENABLE = false;                                  \
-      nfcFL.eseFL._EXCLUDE_NV_MEM_DEPENDENCY = true;                        \
+      nfcFL._PHDNLDNFC_USERDATA_EEPROM_OFFSET = 0x02BCU;                    \
+      nfcFL._PHDNLDNFC_USERDATA_EEPROM_LEN = 0x0C00U;                       \
+      nfcFL._FW_MOBILE_MAJOR_NUMBER = FW_MOBILE_MAJOR_NUMBER_PN551;         \
                                                                             \
-      nfcFL.platformFL._NFCC_RESET_RSP_LEN = 0x10U;                         \
-                                                                            \
-      nfcFL.nfcMwFL._NCI_INTERFACE_UICC_DIRECT = 0x82;                      \
-      nfcFL.nfcMwFL._NCI_INTERFACE_ESE_DIRECT = 0x83;                       \
-                                                                            \
-      SRTCPY_FW("libpn553tc_fw", "libpn553tc_fw_platform",                  \
-                "libpn553tc_fw_pku")                                        \
-                                                                            \
-      nfcFL.nfcMwFL._FW_MOBILE_MAJOR_NUMBER = FW_MOBILE_MAJOR_NUMBER_PN553; \
-                                                                            \
-    } else if (chipType == pn551) {                                         \
-      nfcFL.nfccFL._NFCC_I2C_READ_WRITE_IMPROVEMENT = true;                 \
-      nfcFL.nfccFL._NFCC_MIFARE_TIANJIN = true;                             \
-      nfcFL.nfccFL._NFCC_MW_RCVRY_BLK_FW_DNLD = false;                      \
-      nfcFL.nfccFL._NFCC_DYNAMIC_DUAL_UICC = false;                         \
-      nfcFL.nfccFL._NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH = true;               \
-      nfcFL.nfccFL._NFC_NXP_STAT_DUAL_UICC_WO_EXT_SWITCH = false;           \
-      nfcFL.nfccFL._NFCC_FW_WA = false;                                     \
-      nfcFL.nfccFL._NFCC_FORCE_NCI1_0_INIT = false;                         \
-      nfcFL.nfccFL._NFCC_ROUTING_BLOCK_BIT = false;                         \
-      nfcFL.nfccFL._NFCC_SPI_FW_DOWNLOAD_SYNC = false;                      \
-      nfcFL.nfccFL._HW_ANTENNA_LOOP4_SELF_TEST = true;                      \
-      nfcFL.nfccFL._NFCEE_REMOVED_NTF_RECOVERY = true;                      \
-      nfcFL.nfccFL._NFCC_FORCE_FW_DOWNLOAD = false;                         \
-      nfcFL.nfccFL._UICC_CREATE_CONNECTIVITY_PIPE = false;                  \
-      nfcFL.nfccFL._NFCC_AID_MATCHING_PLATFORM_CONFIG = true;               \
-      nfcFL.nfccFL._NFCC_ROUTING_BLOCK_BIT_PROP = true;                     \
-      nfcFL.nfccFL._NFA_EE_MAX_EE_SUPPORTED = 2;                            \
-                                                                            \
-      nfcFL.eseFL._ESE_FORCE_ENABLE = true;                                 \
-                                                                            \
-      nfcFL.platformFL._NFCC_RESET_RSP_LEN = 0x11U;                         \
-                                                                            \
-      nfcFL.nfcMwFL._NCI_INTERFACE_UICC_DIRECT = 0x82;                      \
-      nfcFL.nfcMwFL._NCI_INTERFACE_ESE_DIRECT = 0x83;                       \
-                                                                            \
-      SRTCPY_FW("libpn551_fw", "libpn551_fw_platform", "libpn551_fw_pku")   \
-                                                                            \
-      nfcFL.nfcMwFL._PHDNLDNFC_USERDATA_EEPROM_OFFSET = 0x02BCU;            \
-      nfcFL.nfcMwFL._PHDNLDNFC_USERDATA_EEPROM_LEN = 0x0C00U;               \
-      nfcFL.nfcMwFL._FW_MOBILE_MAJOR_NUMBER = FW_MOBILE_MAJOR_NUMBER_PN551; \
-                                                                            \
-    } else if (chipType == pn548C2) {                                       \
-      nfcFL.nfccFL._NFCC_I2C_READ_WRITE_IMPROVEMENT = true;                 \
-      nfcFL.nfccFL._NFCC_MIFARE_TIANJIN = true;                             \
-      nfcFL.nfccFL._NFCC_MW_RCVRY_BLK_FW_DNLD = false;                      \
-      nfcFL.nfccFL._NFCC_DYNAMIC_DUAL_UICC = false;                         \
-      nfcFL.nfccFL._NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH = true;               \
-      nfcFL.nfccFL._NFC_NXP_STAT_DUAL_UICC_WO_EXT_SWITCH = false;           \
-      nfcFL.nfccFL._NFCC_FW_WA = false;                                     \
-      nfcFL.nfccFL._NFCC_FORCE_NCI1_0_INIT = false;                         \
-      nfcFL.nfccFL._NFCC_ROUTING_BLOCK_BIT = false;                         \
-      nfcFL.nfccFL._NFCC_SPI_FW_DOWNLOAD_SYNC = false;                      \
-      nfcFL.nfccFL._HW_ANTENNA_LOOP4_SELF_TEST = true;                      \
-      nfcFL.nfccFL._NFCEE_REMOVED_NTF_RECOVERY = true;                      \
-      nfcFL.nfccFL._NFCC_FORCE_FW_DOWNLOAD = false;                         \
-      nfcFL.nfccFL._UICC_CREATE_CONNECTIVITY_PIPE = false;                  \
-      nfcFL.nfccFL._NFCC_AID_MATCHING_PLATFORM_CONFIG = true;               \
-      nfcFL.nfccFL._NFCC_ROUTING_BLOCK_BIT_PROP = true;                     \
-      nfcFL.nfccFL._NFA_EE_MAX_EE_SUPPORTED = 2;                            \
-                                                                            \
-      nfcFL.eseFL._ESE_FORCE_ENABLE = true;                                 \
-                                                                            \
-      nfcFL.nfcMwFL._NCI_INTERFACE_UICC_DIRECT = 0x82;                      \
-      nfcFL.nfcMwFL._NCI_INTERFACE_ESE_DIRECT = 0x83;                       \
-                                                                            \
-      SRTCPY_FW("libpn548ad_fw", "libpn548ad_fw_platform",                  \
-                "libpn548ad_fw_pku")                                        \
-                                                                            \
-      nfcFL.nfcMwFL._PHDNLDNFC_USERDATA_EEPROM_OFFSET = 0x02BCU;            \
-      nfcFL.nfcMwFL._PHDNLDNFC_USERDATA_EEPROM_LEN = 0x0C00U;               \
-                                                                            \
-    } else if (chipType == pn547C2) {                                       \
-      nfcFL.nfccFL._NFCC_I2C_READ_WRITE_IMPROVEMENT = false;                \
-      nfcFL.nfccFL._NFCC_MIFARE_TIANJIN = true;                             \
-      nfcFL.nfccFL._NFCC_MW_RCVRY_BLK_FW_DNLD = false;                      \
-      nfcFL.nfccFL._NFCC_DYNAMIC_DUAL_UICC = false;                         \
-      nfcFL.nfccFL._NFC_NXP_STAT_DUAL_UICC_EXT_SWITCH = false;              \
-      nfcFL.nfccFL._NFC_NXP_STAT_DUAL_UICC_WO_EXT_SWITCH = false;           \
-      nfcFL.nfccFL._NFCC_FW_WA = false;                                     \
-      nfcFL.nfccFL._NFCC_FORCE_NCI1_0_INIT = false;                         \
-      nfcFL.nfccFL._NFCC_ROUTING_BLOCK_BIT = false;                         \
-      nfcFL.nfccFL._NFCC_SPI_FW_DOWNLOAD_SYNC = false;                      \
-      nfcFL.nfccFL._HW_ANTENNA_LOOP4_SELF_TEST = true;                      \
-      nfcFL.nfccFL._NFCEE_REMOVED_NTF_RECOVERY = true;                      \
-      nfcFL.nfccFL._NFCC_FORCE_FW_DOWNLOAD = false;                         \
-      nfcFL.nfccFL._UICC_CREATE_CONNECTIVITY_PIPE = false;                  \
-      nfcFL.nfccFL._NFCC_AID_MATCHING_PLATFORM_CONFIG = true;               \
-      nfcFL.nfccFL._NFCC_ROUTING_BLOCK_BIT_PROP = false;                    \
-      nfcFL.nfccFL._NFA_EE_MAX_EE_SUPPORTED = 2;                            \
-                                                                            \
-      nfcFL.nfcMwFL._NCI_INTERFACE_UICC_DIRECT = 0x81;                      \
-      nfcFL.nfcMwFL._NCI_INTERFACE_ESE_DIRECT = 0x82;                       \
-                                                                            \
-      SRTCPY_FW("libpn547_fw", "libpn547_fw_platform", "libpn547_fw_pku")   \
     }                                                                       \
   }
-#ifdef __cplusplus
-#define SRTCPY_FW(str1, str2, str3)
-#else
-#define SRTCPY_FW(str1, str2, str3)                                          \
-  snprintf(nfcFL.nfcMwFL._FW_LIB_PATH, STRMAX_2, "%s%s%s", FW_DLL_ROOT_DIR,  \
-           str1, FW_DLL_EXTENSION);                                          \
-  snprintf(nfcFL.nfcMwFL._PLATFORM_LIB_PATH, STRMAX_2, "%s%s%s",             \
-           FW_DLL_ROOT_DIR, str2, FW_DLL_EXTENSION);                         \
-  snprintf(nfcFL.nfcMwFL._PKU_LIB_PATH, STRMAX_2, "%s%s%s", FW_DLL_ROOT_DIR, \
-           str3, FW_DLL_EXTENSION);
-#endif
+#define STRCPY_FW_LIB(str) {                                                \
+  nfcFL._FW_LIB_PATH.clear();                                               \
+  nfcFL._FW_LIB_PATH.append(FW_LIB_ROOT_DIR);                               \
+  nfcFL._FW_LIB_PATH.append(str);                                           \
+  nfcFL._FW_LIB_PATH.append(FW_LIB_EXTENSION);                              \
+}
+#define STRCPY_FW_BIN(str) {                                                \
+  nfcFL._FW_BIN_PATH.clear();                                               \
+  nfcFL._FW_BIN_PATH.append(FW_BIN_ROOT_DIR);                               \
+  nfcFL._FW_BIN_PATH.append(str);                                           \
+  nfcFL._FW_BIN_PATH.append(FW_BIN_EXTENSION);                              \
+}
 #endif
diff --git a/halimpl/common/phNfcCommon.h b/halimpl/common/phNfcCommon.h
index 323804c..919b191 100755
--- a/halimpl/common/phNfcCommon.h
+++ b/halimpl/common/phNfcCommon.h
@@ -33,55 +33,10 @@
 #include <pthread.h>
 #include <semaphore.h>
 
-#define FW_DLL_ROOT_DIR "/system/vendor/lib/"
-#define FW_DLL_EXTENSION ".so"
-
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-
-/* Actual FW library name*/
-#define FW_LIB_PATH FW_DLL_ROOT_DIR "libpn548ad_fw" FW_DLL_EXTENSION
-/* Restore Corrupted PLL Setttings/etc */
-#define PLATFORM_LIB_PATH \
-  FW_DLL_ROOT_DIR "libpn548ad_fw_platform" FW_DLL_EXTENSION
-/* Upgrade the public Key */
-#define PKU_LIB_PATH FW_DLL_ROOT_DIR "libpn548ad_fw_pku" FW_DLL_EXTENSION
-#elif(NFC_NXP_CHIP_TYPE == PN551)
-/* Actual FW library name*/
-#define FW_LIB_PATH FLASH_CONF_ROOT_DIR "libpn551_fw" FW_DLL_EXTENSION
-/* Restore Corrupted PLL Settings/etc */
-#define PLATFORM_LIB_PATH \
-  FW_DLL_ROOT_DIR "libpn551_fw_platform" FW_DLL_EXTENSION
-/* Upgrade the public Key */
-#define PKU_LIB_PATH FW_DLL_ROOT_DIR "libpn551_fw_pku" FW_DLL_EXTENSION
-#elif(NFC_NXP_CHIP_TYPE == PN553)
-/* Actual FW library name*/
-#define FW_LIB_PATH FLASH_CONF_ROOT_DIR "libpn553_fw" FW_DLL_EXTENSION
-/* Restore Corrupted PLL Settings/etc */
-#define PLATFORM_LIB_PATH \
-  FW_DLL_ROOT_DIR "libpn553_fw_platform" FW_DLL_EXTENSION
-/* Upgrade the public Key */
-#define PKU_LIB_PATH FW_DLL_ROOT_DIR "libpn553_fw_pku" FW_DLL_EXTENSION
-#else
-/* Actual FW library name*/
-#define FW_LIB_PATH FW_DLL_ROOT_DIR "libpn547_fw" FW_DLL_EXTENSION
-/* Restore Corrupted PLL Settings/etc */
-#define PLATFORM_LIB_PATH \
-  FW_DLL_ROOT_DIR "libpn547_fw_platform" FW_DLL_EXTENSION
-/* Upgrade the public Key */
-#define PKU_LIB_PATH FW_DLL_ROOT_DIR "libpn547_fw_pku" FW_DLL_EXTENSION
-#endif
-
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-#define COMPILATION_MW "PN548C2"
-#elif(NFC_NXP_CHIP_TYPE == PN551)
-#define COMPILATION_MW "PN551"
-#elif(NFC_NXP_CHIP_TYPE == PN553)
-#define COMPILATION_MW "PN553"
-#elif(NFC_NXP_CHIP_TYPE == PN557)
-#define COMPILATION_MW "PN557"
-#else
-#define COMPILATION_MW "PN547C2"
-#endif
+#define FW_LIB_ROOT_DIR "/vendor/lib/"
+#define FW_BIN_ROOT_DIR "/vendor/firmware/"
+#define FW_LIB_EXTENSION ".so"
+#define FW_BIN_EXTENSION ".bin"
 
 /* HAL Version number (Updated as per release) */
 #define NXP_MW_VERSION_MAJ (3U)
diff --git a/halimpl/common/phNfcTypes.h b/halimpl/common/phNfcTypes.h
index 9f9b222..5333e3c 100755
--- a/halimpl/common/phNfcTypes.h
+++ b/halimpl/common/phNfcTypes.h
@@ -23,6 +23,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include "Nxp_Features.h"
 
 #ifndef TRUE
 #define TRUE (0x01) /* Logical True Value */
diff --git a/halimpl/dnld/phDnldNfc.cc b/halimpl/dnld/phDnldNfc.cc
old mode 100755
new mode 100644
index 93e35d3..1adf3ad
--- a/halimpl/dnld/phDnldNfc.cc
+++ b/halimpl/dnld/phDnldNfc.cc
@@ -24,13 +24,11 @@
 #include <phNxpConfig.h>
 #include <phNxpLog.h>
 #include <phTmlNfc.h>
-
+#include <string>
 static void* pFwHandle; /* Global firmware handle */
-uint16_t wMwVer = 0; /* Middleware version no */
-uint16_t wFwVer = 0; /* Firmware version no */
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-uint8_t gRecFWDwnld;  // flag set to true to indicate dummy FW download
-#endif
+uint16_t wMwVer = 0;    /* Middleware version no */
+uint16_t wFwVer = 0;    /* Firmware version no */
+uint8_t gRecFWDwnld;    // flag set to true to indicate dummy FW download
 phTmlNfc_i2cfragmentation_t fragmentation_enabled = I2C_FRAGMENATATION_DISABLED;
 static pphDnldNfc_DlContext_t gpphDnldContext = NULL; /* Download contex */
 #undef EEPROM_Read_Mem_IMP
@@ -244,17 +242,13 @@
       wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY);
     } else {
       if ((PHDNLDNFC_HWVER_MRA2_1 == bChipVer) ||
-          (PHDNLDNFC_HWVER_MRA2_2 == bChipVer)
-#if (NFC_NXP_CHIP_TYPE == PN551)
-          || (PHDNLDNFC_HWVER_PN551_MRA1_0 == bChipVer)
-#elif (NFC_NXP_CHIP_TYPE == PN548C2)
-          || (PHDNLDNFC_HWVER_PN548AD_MRA1_0 == bChipVer)
-#elif (NFC_NXP_CHIP_TYPE == PN553 || NFC_NXP_CHIP_TYPE == PN557)
-          || (PHDNLDNFC_HWVER_PN553_MRA1_0 == bChipVer) ||
-          (PHDNLDNFC_HWVER_PN553_MRA1_0_UPDATED & bChipVer) ||
-          (PHDNLDNFC_HWVER_PN557_MRA1_0 ==  bChipVer)
-#endif
-              ) {
+          (PHDNLDNFC_HWVER_MRA2_2 == bChipVer) ||
+          ((nfcFL.chipType == pn551) &&
+           (PHDNLDNFC_HWVER_PN551_MRA1_0 == bChipVer)) ||
+          (((nfcFL.chipType == pn553) || (nfcFL.chipType == pn557)) &&
+           ((PHDNLDNFC_HWVER_PN553_MRA1_0 == bChipVer) ||
+            (PHDNLDNFC_HWVER_PN553_MRA1_0_UPDATED & bChipVer) ||
+            (PHDNLDNFC_HWVER_PN557_MRA1_0 == bChipVer)))) {
         (gpphDnldContext->FrameInp.Type) = phDnldNfc_ChkIntg;
       } else {
         (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTNone;
@@ -734,16 +728,10 @@
 **
 *******************************************************************************/
 NFCSTATUS phDnldNfc_InitImgInfo(void) {
-  NFCSTATUS wStatus     = NFCSTATUS_SUCCESS;
-  uint8_t* pImageInfo   = NULL;
+  NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
+  uint8_t* pImageInfo = NULL;
   uint16_t ImageInfoLen = 0;
-  uint8_t fwPathLen     = 0;
-  char* fwFullPath      = NULL;
-  char fwName[50];
-  char fwPath[100];
-
-  memset(fwName, 0, sizeof(fwName));
-  memset(fwPath, 0, sizeof(fwPath));
+  unsigned long fwType = FW_FORMAT_SO;
 
   /* if memory is not allocated then allocate memory for download context
    * structure */
@@ -752,29 +740,22 @@
   gpphDnldContext->FwFormat = FW_FORMAT_UNKNOWN;
 
   /*Read Firmware file name from config file*/
-  if (GetNxpStrValue(NAME_NXP_FW_NAME, (char*)fwName, sizeof(fwName)) == true) {
-    strcpy(fwPath, FW_DLL_ROOT_DIR);
-    strncat(fwPath, fwName, strlen(fwName));
-    fwPathLen = strlen(fwPath);
-    fwFullPath = fwPath;
+  if (GetNxpNumValue(NAME_NXP_FW_TYPE, &fwType, sizeof(fwType)) == true) {
+    NXPLOG_FWDNLD_D("firmware type from conf file: %lu",fwType);
+  } else {
+    NXPLOG_FWDNLD_W("firmware type not found. Taking default value: %lu",fwType);
   }
 
-  if (!memcmp(&fwPath[fwPathLen - 3], ".so", 3) ) {
-    gpphDnldContext->FwFormat = FW_FORMAT_SO;
-  } else  if (!memcmp(&fwPath[fwPathLen - 4], ".bin", 4) ) {
+  if(fwType == FW_FORMAT_BIN) {
     gpphDnldContext->FwFormat = FW_FORMAT_BIN;
-  }
-
-  if(gpphDnldContext->FwFormat == FW_FORMAT_SO) {
-  /* load the library and get the image info pointer */
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-  if (gRecFWDwnld == true)
-    wStatus = phDnldNfc_LoadRecoveryFW(fwFullPath, &pImageInfo, &ImageInfoLen);
-  else
-#endif
-    wStatus = phDnldNfc_LoadFW(fwFullPath, &pImageInfo, &ImageInfoLen);
-  } else if(gpphDnldContext->FwFormat == FW_FORMAT_BIN) {
-      wStatus = phDnldNfc_LoadBinFW(fwFullPath, &pImageInfo, &ImageInfoLen);
+    wStatus = phDnldNfc_LoadBinFW(&pImageInfo, &ImageInfoLen);
+  } else if(fwType == FW_FORMAT_SO) {
+    gpphDnldContext->FwFormat = FW_FORMAT_SO;
+    if (gRecFWDwnld == true) {
+      wStatus = phDnldNfc_LoadRecoveryFW(&pImageInfo, &ImageInfoLen);
+    } else {
+      wStatus = phDnldNfc_LoadFW(&pImageInfo, &ImageInfoLen);
+    }
   } else {
     NXPLOG_FWDNLD_E("firmware file format mismatch!!!\n");
     return NFCSTATUS_FAILED;
@@ -846,13 +827,11 @@
   /* if memory is not allocated then allocate memory for donwload context
    * structure */
   phDnldNfc_SetHwDevHandle();
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
   if (gRecFWDwnld == true)
-    wStatus =
-        phDnldNfc_LoadRecoveryFW(PLATFORM_LIB_PATH, &pImageInfo, &ImageInfoLen);
+    wStatus = phDnldNfc_LoadRecoveryFW(&pImageInfo, &ImageInfoLen);
   else
-#endif
-    wStatus = phDnldNfc_LoadFW(PLATFORM_LIB_PATH, &pImageInfo, &ImageInfoLen);
+    wStatus = phDnldNfc_LoadFW(&pImageInfo, &ImageInfoLen);
+
   if ((pImageInfo == NULL) || (ImageInfoLen == 0)) {
     NXPLOG_FWDNLD_E(
         "Image extraction Failed - invalid imginfo or imginfolen!!");
@@ -903,15 +882,11 @@
   /* if memory is not allocated then allocate memory for donwload context
    * structure */
   phDnldNfc_SetHwDevHandle();
-
-/* load the PKU image library */
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
+  /* load the PKU image library */
   if (gRecFWDwnld == true)
-    wStatus =
-        phDnldNfc_LoadRecoveryFW(PKU_LIB_PATH, &pImageInfo, &ImageInfoLen);
+    wStatus = phDnldNfc_LoadRecoveryFW(&pImageInfo, &ImageInfoLen);
   else
-#endif
-    wStatus = phDnldNfc_LoadFW(PKU_LIB_PATH, &pImageInfo, &ImageInfoLen);
+    wStatus = phDnldNfc_LoadFW(&pImageInfo, &ImageInfoLen);
   if ((pImageInfo == NULL) || (ImageInfoLen == 0)) {
     NXPLOG_FWDNLD_E(
         "Image extraction Failed - invalid imginfo or imginfolen!!");
@@ -955,18 +930,18 @@
 *******************************************************************************/
 void phDnldNfc_CloseFwLibHandle(void) {
   NFCSTATUS wStatus = NFCSTATUS_FAILED;
-  if(gpphDnldContext->FwFormat == FW_FORMAT_SO) {
-      wStatus = phDnldNfc_UnloadFW();
-      if (wStatus != NFCSTATUS_SUCCESS) {
-          NXPLOG_FWDNLD_E("free library FAILED !!\n");
-      } else {
-          NXPLOG_FWDNLD_E("free library SUCCESS !!\n");
-      }
-  } else if(gpphDnldContext->FwFormat == FW_FORMAT_BIN) {
-      if(pFwHandle!=NULL) {
-          free(pFwHandle);
-          pFwHandle = NULL;
-      }
+  if (gpphDnldContext->FwFormat == FW_FORMAT_SO) {
+    wStatus = phDnldNfc_UnloadFW();
+    if (wStatus != NFCSTATUS_SUCCESS) {
+      NXPLOG_FWDNLD_E("free library FAILED !!\n");
+    } else {
+      NXPLOG_FWDNLD_E("free library SUCCESS !!\n");
+    }
+  } else if (gpphDnldContext->FwFormat == FW_FORMAT_BIN) {
+    if (pFwHandle != NULL) {
+      free(pFwHandle);
+      pFwHandle = NULL;
+    }
   }
   return;
 }
@@ -977,40 +952,25 @@
 **
 ** Description      Load the firmware version form firmware lib
 **
-** Parameters       pathName    - Firmware image path
-**                  pImgInfo    - Firmware image handle
+** Parameters       pImgInfo    - Firmware image handle
 **                  pImgInfoLen - Firmware image length
 **
 ** Returns          NFC status
 **
 *******************************************************************************/
-NFCSTATUS phDnldNfc_LoadFW(const char* pathName, uint8_t** pImgInfo,
-                           uint16_t* pImgInfoLen) {
+NFCSTATUS phDnldNfc_LoadFW(uint8_t** pImgInfo, uint16_t* pImgInfoLen) {
   void* pImageInfo = NULL;
   void* pImageInfoLen = NULL;
-  if (pathName == NULL) {
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-    pathName = "/system/vendor/lib/libpn548ad_fw.so";
-#elif (NFC_NXP_CHIP_TYPE == PN551)
-    pathName = "/system/vendor/lib/libpn551_fw.so";
-#elif (NFC_NXP_CHIP_TYPE == PN553)
-    pathName = "/system/vendor/lib/libpn553_fw.so";
-#elif (NFC_NXP_CHIP_TYPE == PN557)
-    pathName = "/system/vendor/lib/libpn557_fw.so";
-#else
-    pathName = "/system/vendor/lib/libpn547_fw.so";
-#endif
-  }
 
   /* check if the handle is not NULL then free the library */
   if (pFwHandle != NULL) {
-    phDnldNfc_UnloadFW();
+    phDnldNfc_CloseFwLibHandle();
     pFwHandle = NULL;
   }
 
   /* load the DLL file */
-  pFwHandle = dlopen(pathName, RTLD_LAZY);
-  NXPLOG_FWDNLD_D("@@@%s", pathName);
+  pFwHandle = dlopen(nfcFL._FW_LIB_PATH.c_str(), RTLD_LAZY);
+  NXPLOG_FWDNLD_D("@@@%s", nfcFL._FW_LIB_PATH.c_str());
 
   /* if library load failed then handle will be NULL */
   if (pFwHandle == NULL) {
@@ -1047,34 +1007,32 @@
 **
 ** Description      Load the firmware version form firmware lib
 **
-** Parameters       pathName    - Firmware image path
-**                  pImgInfo    - Firmware image handle
+** Parameters       pImgInfo    - Firmware image handle
 **                  pImgInfoLen - Firmware image length
 **
 ** Returns          NFC status
 **
 *******************************************************************************/
-NFCSTATUS phDnldNfc_LoadBinFW(const char* pathName, uint8_t **pImgInfo,
-                              uint16_t* pImgInfoLen) {
-  FILE * pFile = NULL;
+NFCSTATUS phDnldNfc_LoadBinFW(uint8_t** pImgInfo, uint16_t* pImgInfoLen) {
+  FILE* pFile = NULL;
   uint32_t fileSize = 0;
   uint32_t bytesRead = 0;
   long ftellFileSize = 0;
 
   /* check for path name */
-  if (pathName == NULL) {
+  if (nfcFL._FW_BIN_PATH.c_str() == NULL) {
     NXPLOG_FWDNLD_E("Invalid FW file path!!!\n");
     return NFCSTATUS_FAILED;
   }
 
   /* check if the handle is not NULL then free the memory*/
   if (pFwHandle != NULL) {
-    free(pFwHandle);
+    phDnldNfc_CloseFwLibHandle();
     pFwHandle = NULL;
   }
 
   /* Open the FW binary image file to be read */
-  pFile = fopen(pathName, "r");
+  pFile = fopen(nfcFL._FW_BIN_PATH.c_str(), "r");
   if (NULL == pFile) {
     NXPLOG_FWDNLD_E("Failed to load FW binary image file!!!\n");
     return NFCSTATUS_FAILED;
@@ -1086,7 +1044,7 @@
   /* get the actual length of the file */
   ftellFileSize = ftell(pFile);
 
-  if(ftellFileSize > 0) {
+  if (ftellFileSize > 0) {
     fileSize = ftellFileSize;
   } else {
     fileSize = 0;
@@ -1096,17 +1054,18 @@
   fseek(pFile, 0, SEEK_SET);
 
   /* allocate the memory to read the FW binary image */
-  pFwHandle = (void*)malloc(sizeof(uint8_t)*fileSize);
+  pFwHandle = (void*)malloc(sizeof(uint8_t) * fileSize);
 
   /* check for valid memory allocation */
-  if(NULL == pFwHandle) {
+  if (NULL == pFwHandle) {
     NXPLOG_FWDNLD_E("Failed to allocate memory to load FW image !!!\n");
     fclose(pFile);
     return NFCSTATUS_FAILED;
   }
 
   /* Read the actual contents of the FW binary image */
-  bytesRead = (uint32_t)fread(pFwHandle, sizeof(uint8_t), (size_t)fileSize, pFile);
+  bytesRead =
+      (uint32_t)fread(pFwHandle, sizeof(uint8_t), (size_t)fileSize, pFile);
   if (bytesRead != fileSize) {
     NXPLOG_FWDNLD_E("Unable to read the specified size from file !!!\n");
     fclose(pFile);
@@ -1124,7 +1083,6 @@
   return NFCSTATUS_SUCCESS;
 }
 
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
 /*******************************************************************************
 **
 ** Function         phDnldNfc_LoadRecoveryFW
@@ -1133,41 +1091,24 @@
 **                  recovery. This will change the FW version of the NFCC
 **                  firmware and enable flashing of firmware of same version.
 **
-** Parameters       pathName    - Firmware image path
-**                  pImgInfo    - Firmware image handle
+** Parameters       pImgInfo    - Firmware image handle
 **                  pImgInfoLen - Firmware image length
 **
 ** Returns          NFCSTATUS
 **
 *******************************************************************************/
-NFCSTATUS phDnldNfc_LoadRecoveryFW(const char* pathName, uint8_t** pImgInfo,
-                                   uint16_t* pImgInfoLen) {
+NFCSTATUS phDnldNfc_LoadRecoveryFW(uint8_t** pImgInfo, uint16_t* pImgInfoLen) {
   void* pImageInfo = NULL;
   void* pImageInfoLen = NULL;
 
-  /* check for path name */
-  if (pathName == NULL) {
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-    pathName = "/system/vendor/lib/libpn548ad_fw.so";
-#elif (NFC_NXP_CHIP_TYPE == PN551)
-    pathName = "/system/vendor/lib/libpn551_fw.so";
-#elif (NFC_NXP_CHIP_TYPE == PN553)
-    pathName = "/system/vendor/lib/libpn553_fw.so";
-#elif(NFC_NXP_CHIP_TYPE == PN557)
-    pathName = "/system/vendor/lib/libpn557_fw.so";
-#else
-    pathName = "/system/vendor/lib/libpn547_fw.so";
-#endif
-  }
-
   /* check if the handle is not NULL then free the library */
   if (pFwHandle != NULL) {
-    phDnldNfc_UnloadFW();
+    phDnldNfc_CloseFwLibHandle();
     pFwHandle = NULL;
   }
   /* load the DLL file */
-  pFwHandle = dlopen(pathName, RTLD_LAZY);
-  NXPLOG_FWDNLD_D("phDnldNfc_LoadRecoveryFW %s ", pathName);
+  pFwHandle = dlopen(nfcFL._FW_LIB_PATH.c_str(), RTLD_LAZY);
+  NXPLOG_FWDNLD_D("phDnldNfc_LoadRecoveryFW %s ", nfcFL._FW_LIB_PATH.c_str());
 
   /* if library load failed then handle will be NULL */
   if (pFwHandle == NULL) {
@@ -1197,7 +1138,6 @@
 
   return NFCSTATUS_SUCCESS;
 }
-#endif
 
 /*******************************************************************************
 **
diff --git a/halimpl/dnld/phDnldNfc.h b/halimpl/dnld/phDnldNfc.h
index 248f115..ae672ef 100755
--- a/halimpl/dnld/phDnldNfc.h
+++ b/halimpl/dnld/phDnldNfc.h
@@ -43,9 +43,6 @@
 #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 */
@@ -131,14 +128,9 @@
 extern NFCSTATUS phDnldNfc_LoadRecInfo(void);
 extern NFCSTATUS phDnldNfc_LoadPKInfo(void);
 extern void phDnldNfc_CloseFwLibHandle(void);
-extern NFCSTATUS phDnldNfc_LoadFW(const char* pathName, uint8_t** pImgInfo,
-                                  uint16_t* pImgInfoLen);
-extern NFCSTATUS phDnldNfc_LoadBinFW(const char* pathName, uint8_t** pImgInfo,
-                                     uint16_t* pImgInfoLen);
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
-extern NFCSTATUS phDnldNfc_LoadRecoveryFW(const char* pathName,
-                                          uint8_t** pImgInfo,
+extern NFCSTATUS phDnldNfc_LoadFW(uint8_t** pImgInfo, uint16_t* pImgInfoLen);
+extern NFCSTATUS phDnldNfc_LoadBinFW(uint8_t** pImgInfo, uint16_t* pImgInfoLen);
+extern NFCSTATUS phDnldNfc_LoadRecoveryFW(uint8_t** pImgInfo,
                                           uint16_t* pImgInfoLen);
-#endif
 extern NFCSTATUS phDnldNfc_UnloadFW(void);
 #endif /* PHDNLDNFC_H */
diff --git a/halimpl/dnld/phDnldNfc_Internal.cc b/halimpl/dnld/phDnldNfc_Internal.cc
index dc87fd5..f5cbb3a 100755
--- a/halimpl/dnld/phDnldNfc_Internal.cc
+++ b/halimpl/dnld/phDnldNfc_Internal.cc
@@ -68,41 +68,6 @@
 /* size of EEPROM offset */
 #define PHDNLDNFC_USERDATA_EEPROM_OFFSIZE (0x02U)
 
-#ifdef NXP_PN547C1_DOWNLOAD
-/* EEPROM offset and length value for PN547C1 */
-/* 16 bits offset indicating user data area start location */
-#define PHDNLDNFC_USERDATA_EEPROM_OFFSET (0x003CU)
-/* 16 bits length of user data area */
-#define PHDNLDNFC_USERDATA_EEPROM_LEN (0x0DC0U)
-#else
-
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-/* EEPROM offset and length value for PN548AD */
-/* 16 bits offset indicating user data area start location */
-#define PHDNLDNFC_USERDATA_EEPROM_OFFSET (0x02BCU)
-/* 16 bits length of user data area */
-#define PHDNLDNFC_USERDATA_EEPROM_LEN (0x0C00U)
-#elif (NFC_NXP_CHIP_TYPE == PN551)
-/* EEPROM offset and length value for PN551 */
-/* 16 bits offset indicating user data area start location */
-#define PHDNLDNFC_USERDATA_EEPROM_OFFSET (0x02BCU)
-/* 16 bits length of user data area */
-#define PHDNLDNFC_USERDATA_EEPROM_LEN (0x0C00U)
-#elif(NFC_NXP_CHIP_TYPE == PN553 || NFC_NXP_CHIP_TYPE == PN557)
-/* EEPROM offset and length value for PN553/PN557 */
-/* 16 bits offset indicating user data area start location */
-#define PHDNLDNFC_USERDATA_EEPROM_OFFSET (0x02BCU)
-/* 16 bits length of user data area */
-#define PHDNLDNFC_USERDATA_EEPROM_LEN (0x0BC0U)
-#else
-/* EEPROM offset and length value for PN547C2 */
-/* 16 bits offset indicating user data area start location */
-#define PHDNLDNFC_USERDATA_EEPROM_OFFSET (0x023CU)
-/* 16 bits length of user data area */
-#define PHDNLDNFC_USERDATA_EEPROM_LEN (0x0C80U)
-#endif
-
-#endif
 #define PH_LIBNFC_VEN_RESET_ON_DOWNLOAD_TIMEOUT (1)
 
 /* Function prototype declarations */
@@ -718,12 +683,13 @@
     } else if (phDnldNfc_ChkIntg == (pDlContext->FrameInp.Type)) {
       (pDlContext->tCmdRspFrameInfo.dwSendlength) += PHDNLDNFC_MIN_PLD_LEN;
 
-      wChkIntgVal = PHDNLDNFC_USERDATA_EEPROM_OFFSET;
+      wChkIntgVal = nfcFL._PHDNLDNFC_USERDATA_EEPROM_OFFSET;
+
       memcpy(&(pDlContext->tCmdRspFrameInfo
                    .aFrameBuff[PHDNLDNFC_FRAME_RDDATA_OFFSET]),
              &wChkIntgVal, sizeof(wChkIntgVal));
 
-      wChkIntgVal = PHDNLDNFC_USERDATA_EEPROM_LEN;
+      wChkIntgVal = nfcFL._PHDNLDNFC_USERDATA_EEPROM_LEN;
       memcpy(&(pDlContext->tCmdRspFrameInfo
                    .aFrameBuff[PHDNLDNFC_FRAME_RDDATA_OFFSET +
                                PHDNLDNFC_USERDATA_EEPROM_OFFSIZE]),
diff --git a/halimpl/dnld/phDnldNfc_Internal.h b/halimpl/dnld/phDnldNfc_Internal.h
index ed8f32e..d37a16f 100755
--- a/halimpl/dnld/phDnldNfc_Internal.h
+++ b/halimpl/dnld/phDnldNfc_Internal.h
@@ -120,8 +120,8 @@
  */
 typedef enum phDnldNfc_FwFormat {
   FW_FORMAT_UNKNOWN = 0x00,
-  FW_FORMAT_BIN = 0x01,
-  FW_FORMAT_SO = 0x02,
+  FW_FORMAT_SO = 0x01,
+  FW_FORMAT_BIN = 0x02,
 } phDnldNfc_FwFormat_t;
 
 /*
diff --git a/halimpl/dnld/phNxpNciHal_Dnld.cc b/halimpl/dnld/phNxpNciHal_Dnld.cc
old mode 100755
new mode 100644
index a435b07..ceca050
--- a/halimpl/dnld/phNxpNciHal_Dnld.cc
+++ b/halimpl/dnld/phNxpNciHal_Dnld.cc
@@ -35,9 +35,7 @@
 /* External global variable to get FW version */
 extern uint16_t wFwVer;
 extern uint16_t wMwVer;
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
 extern uint8_t gRecFWDwnld;
-#endif
 /* RF Configuration structure */
 typedef struct phLibNfc_IoctlSetRfConfig {
   uint8_t bNumOfParams;   /* Number of Rf configurable parameters to be set */
@@ -178,33 +176,19 @@
 static NFCSTATUS (*phNxpNciHal_dwnld_seqhandler[])(void* pContext,
                                                    NFCSTATUS status,
                                                    void* pInfo) = {
-#if (NFC_NXP_CHIP_TYPE == PN547C2)
-    phNxpNciHal_fw_dnld_normal,
-    phNxpNciHal_fw_dnld_normal,
-#endif
-    phNxpNciHal_fw_dnld_get_sessn_state,
-    phNxpNciHal_fw_dnld_get_version,
-    phNxpNciHal_fw_dnld_log_read,
-    phNxpNciHal_fw_dnld_write,
-    phNxpNciHal_fw_dnld_get_sessn_state,
-    phNxpNciHal_fw_dnld_get_version,
-    phNxpNciHal_fw_dnld_log,
-    phNxpNciHal_fw_dnld_chk_integrity,
-    NULL};
+    phNxpNciHal_fw_dnld_get_sessn_state, phNxpNciHal_fw_dnld_get_version,
+    phNxpNciHal_fw_dnld_log_read, phNxpNciHal_fw_dnld_write,
+    phNxpNciHal_fw_dnld_get_sessn_state, phNxpNciHal_fw_dnld_get_version,
+    phNxpNciHal_fw_dnld_log, phNxpNciHal_fw_dnld_chk_integrity, NULL};
 
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
 /* Array of pointers to start dummy fw download seq */
 static NFCSTATUS (*phNxpNciHal_dummy_rec_dwnld_seqhandler[])(void* pContext,
                                                              NFCSTATUS status,
                                                              void* pInfo) = {
-    phNxpNciHal_fw_dnld_normal,
-    phNxpNciHal_fw_dnld_normal,
-    phNxpNciHal_fw_dnld_get_sessn_state,
-    phNxpNciHal_fw_dnld_get_version,
-    phNxpNciHal_fw_dnld_log_read,
-    phNxpNciHal_fw_dnld_write,
+    phNxpNciHal_fw_dnld_normal,          phNxpNciHal_fw_dnld_normal,
+    phNxpNciHal_fw_dnld_get_sessn_state, phNxpNciHal_fw_dnld_get_version,
+    phNxpNciHal_fw_dnld_log_read,        phNxpNciHal_fw_dnld_write,
     NULL};
-#endif
 
 /* Download Recovery Sequence */
 static NFCSTATUS (*phNxpNciHal_dwnld_rec_seqhandler[])(void* pContext,
@@ -538,23 +522,18 @@
       bHwVer &= 0x0F; /* 0x0F is the mask to extract chip version */
 
       if ((PHDNLDNFC_HWVER_MRA2_1 == bHwVer) ||
-          (PHDNLDNFC_HWVER_MRA2_2 == bHwVer)
-#if (NFC_NXP_CHIP_TYPE == PN551)
-          || (PHDNLDNFC_HWVER_PN551_MRA1_0 == bHwVer)
-#elif (NFC_NXP_CHIP_TYPE == PN548C2)
-          || (PHDNLDNFC_HWVER_PN548AD_MRA1_0 == bHwVer)
-#elif(NFC_NXP_CHIP_TYPE == PN553 || NFC_NXP_CHIP_TYPE == PN557)
-          || (PHDNLDNFC_HWVER_PN553_MRA1_0 == bHwVer ||
-              PHDNLDNFC_HWVER_PN553_MRA1_0_UPDATED & pRespBuff->pBuff[0])
-#endif
-              ) {
+          (PHDNLDNFC_HWVER_MRA2_2 == bHwVer) ||
+          ((nfcFL.chipType == pn551) &&
+           (PHDNLDNFC_HWVER_PN551_MRA1_0 == bHwVer)) ||
+          (((nfcFL.chipType == pn553) || (nfcFL.chipType == pn557)) &&
+           (PHDNLDNFC_HWVER_PN553_MRA1_0 == bHwVer ||
+            PHDNLDNFC_HWVER_PN553_MRA1_0_UPDATED & pRespBuff->pBuff[0]))) {
         bExpectedLen = PHLIBNFC_IOCTL_DNLD_GETVERLEN_MRA2_1;
         (gphNxpNciHal_fw_IoctlCtx.bChipVer) = bHwVer;
-#if (NFC_NXP_CHIP_TYPE == PN553)
-        if (PHDNLDNFC_HWVER_PN553_MRA1_0_UPDATED & pRespBuff->pBuff[0]) {
+        if ((nfcFL.chipType == pn553) &&
+            (PHDNLDNFC_HWVER_PN553_MRA1_0_UPDATED & pRespBuff->pBuff[0])) {
           (gphNxpNciHal_fw_IoctlCtx.bChipVer) = pRespBuff->pBuff[0];
         }
-#endif
       } else if ((bHwVer >= PHDNLDNFC_HWVER_MRA1_0) &&
                  (bHwVer <= PHDNLDNFC_HWVER_MRA2_0)) {
         bExpectedLen = PHLIBNFC_IOCTL_DNLD_GETVERLEN;
@@ -1511,7 +1490,7 @@
 
   while (seq_handler[seq_counter] != NULL) {
     status = NFCSTATUS_FAILED;
-    status = (seq_handler[seq_counter])((void *)pContext, status, &pInfo);
+    status = (seq_handler[seq_counter])((void*)pContext, status, &pInfo);
     if (NFCSTATUS_SUCCESS != status) {
       NXPLOG_FWDNLD_E(" phNxpNciHal_fw_seq_handler : FAILED");
       break;
@@ -1719,13 +1698,10 @@
   /* Get firmware version */
   if (NFCSTATUS_SUCCESS == phDnldNfc_InitImgInfo()) {
     NXPLOG_FWDNLD_D("phDnldNfc_InitImgInfo:SUCCESS");
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
     if (gRecFWDwnld == true) {
       status =
           phNxpNciHal_fw_seq_handler(phNxpNciHal_dummy_rec_dwnld_seqhandler);
-    } else
-#endif
-    {
+    } else {
       status = phNxpNciHal_fw_seq_handler(phNxpNciHal_dwnld_seqhandler);
     }
   } else {
@@ -1733,7 +1709,7 @@
   }
 
   /* Chage to normal mode */
-  status = phNxpNciHal_fw_dnld_complete((void *)pContext, status, &pInfo);
+  status = phNxpNciHal_fw_dnld_complete((void*)pContext, status, &pInfo);
   /*if (NFCSTATUS_SUCCESS == status)
   {
       NXPLOG_FWDNLD_D(" phNxpNciHal_fw_dnld_complete : SUCCESS");
@@ -1747,14 +1723,8 @@
 }
 
 static NFCSTATUS phLibNfc_VerifyCrcStatus(uint8_t bCrcStatus) {
-#if ((NFC_NXP_CHIP_TYPE == PN551) || (NFC_NXP_CHIP_TYPE == PN553)\
-    || (NFC_NXP_CHIP_TYPE == PN557))
   uint8_t bBitPos = 1;
   uint8_t bShiftVal = 2;
-#else
-  uint8_t bBitPos = 0;
-  uint8_t bShiftVal = 1;
-#endif
   NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
   while (bBitPos < 7) {
     if (!(bCrcStatus & bShiftVal)) {
diff --git a/halimpl/hal/phNxpNciHal.cc b/halimpl/hal/phNxpNciHal.cc
index 24c994f..65bc7d9 100755
--- a/halimpl/hal/phNxpNciHal.cc
+++ b/halimpl/hal/phNxpNciHal.cc
@@ -37,22 +37,7 @@
 #define PN547C2_CLOCK_SETTING
 #undef PN547C2_FACTORY_RESET_DEBUG
 #define CORE_RES_STATUS_BYTE 3
-/* FW Mobile major number */
-#define FW_MOBILE_MAJOR_NUMBER_PN553 0x01
-#define FW_MOBILE_MAJOR_NUMBER_PN81A 0x02
-#define FW_MOBILE_MAJOR_NUMBER_PN551 0x05
-#define FW_MOBILE_MAJOR_NUMBER_PN48AD 0x01
-#define FW_MOBILE_MAJOR_NUMBER_PN557 0x01
 
-#if (NFC_NXP_CHIP_TYPE == PN551)
-#define FW_MOBILE_MAJOR_NUMBER FW_MOBILE_MAJOR_NUMBER_PN551
-#elif (NFC_NXP_CHIP_TYPE == PN553)
-#define FW_MOBILE_MAJOR_NUMBER FW_MOBILE_MAJOR_NUMBER_PN553
-#elif(NFC_NXP_CHIP_TYPE == PN557)
-#define FW_MOBILE_MAJOR_NUMBER FW_MOBILE_MAJOR_NUMBER_PN557
-#else
-#define FW_MOBILE_MAJOR_NUMBER FW_MOBILE_MAJOR_NUMBER_PN48AD
-#endif
 /* Processing of ISO 15693 EOF */
 extern uint8_t icode_send_eof;
 extern uint8_t icode_detected;
@@ -80,16 +65,10 @@
 extern uint16_t wFwVer;
 extern uint16_t fw_maj_ver;
 extern uint16_t rom_version;
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
 extern uint8_t gRecFWDwnld;
 static uint8_t gRecFwRetryCount;  // variable to hold dummy FW recovery count
-#endif
 static uint8_t Rx_data[NCI_MAX_DATA_LEN];
 extern int phPalEse_spi_ioctl(phPalEse_ControlCode_t eControlCode,void *pDevHandle, long level);
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-uint8_t discovery_cmd[50] = {0};
-uint8_t discovery_cmd_len = 0;
-#endif
 uint32_t timeoutTimerId = 0;
 bool nfc_debug_enabled = true;
 
@@ -128,10 +107,8 @@
 NFCSTATUS phNxpNciHal_china_tianjin_rf_setting(void);
 static void phNxpNciHal_gpio_restore(phNxpNciHal_GpioInfoState state);
 static void phNxpNciHal_initialize_debug_enabled_flag();
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
 static NFCSTATUS phNxpNciHalRFConfigCmdRecSequence();
 static NFCSTATUS phNxpNciHal_CheckRFCmdRespStatus();
-#endif
 int check_config_parameter();
 /******************************************************************************
  * Function         phNxpNciHal_initialize_debug_enabled_flag
@@ -356,20 +333,9 @@
   /* extract the firmware's major no */
   ufw_current_major_no = ((0x00FF) & (wFwVer >> 8U));
 
-  NXPLOG_NCIHAL_D("%s current_major_no = 0x%x", __FUNCTION__,
-                  ufw_current_major_no);
-  if ((ufw_current_major_no == FW_MOBILE_MAJOR_NUMBER) ||
-      ((ufw_current_major_no == FW_MOBILE_MAJOR_NUMBER_PN81A &&
+  if ((ufw_current_major_no == nfcFL._FW_MOBILE_MAJOR_NUMBER) ||
+      ((ufw_current_major_no == FW_MOBILE_MAJOR_NUMBER_PN81A) &&
         (nxpncihal_ctrl.nci_info.nci_version == NCI_VERSION_2_0)))
-#if (NFC_NXP_CHIP_TYPE == PN553)
-      || ((rom_version == 0x00) &&
-          (ufw_current_major_no == FW_MOBILE_MAJOR_NUMBER_PN81A))
-#elif (NFC_NXP_CHIP_TYPE == PN557)
-      || ((rom_version == FW_MOBILE_MAJOR_NUMBER) &&
-          (ufw_current_major_no == FW_MOBILE_MAJOR_NUMBER_PN557))
-#endif
-          )
-
   {
     status = NFCSTATUS_SUCCESS;
   } else if (ufw_current_major_no == sfw_infra_major_no) {
@@ -405,11 +371,9 @@
       }
     }
   }
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
   else if (gRecFWDwnld == TRUE) {
     status = NFCSTATUS_SUCCESS;
   }
-#endif
   else if (wFwVerRsp == 0) {
     NXPLOG_NCIHAL_E(
         "FW Version not received by NCI command >>> Force Firmware download");
@@ -562,10 +526,6 @@
   tOsalConfig.pLogFile = NULL;
   tTmlConfig.dwGetMsgThreadId = (uintptr_t)nxpncihal_ctrl.gDrvCfg.nClientId;
 
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-  memset(discovery_cmd, 0, sizeof(discovery_cmd));
-  discovery_cmd_len = 0;
-#endif
 
   /* Initialize TML layer */
   wConfigStatus = phTmlNfc_Init(&tTmlConfig);
@@ -628,17 +588,17 @@
     goto clean_and_return;
   }
 
-  status = phNxpNciHal_send_ext_cmd(sizeof(cmd_init_nci2_0), cmd_init_nci2_0);
-  if (status == NFCSTATUS_SUCCESS) {
-    if (nxpncihal_ctrl.nci_info.nci_version != NCI_VERSION_2_0) {
-      NXPLOG_NCIHAL_E("Chip is in NCI1.0 mode reset the chip again");
+  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 && (nfcFL.chipType == pn557)) {
+      NXPLOG_NCIHAL_E("Chip is in NCI1.0 mode reset the chip to 2.0 mode");
       status = phNxpNciHal_send_ext_cmd(sizeof(cmd_reset_nci), cmd_reset_nci);
-      if (status == NFCSTATUS_SUCCESS) {
-        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) {
+        status = phNxpNciHal_send_ext_cmd(sizeof(cmd_init_nci2_0), cmd_init_nci2_0);
+        if(status == NFCSTATUS_SUCCESS) {
+          goto init_retry;
         }
       }
     }
@@ -792,26 +752,18 @@
  ******************************************************************************/
 int phNxpNciHal_fw_mw_ver_check() {
   NFCSTATUS status = NFCSTATUS_FAILED;
-  if (!(strcmp(COMPILATION_MW, "PN557")) &&
+  if ((nfcFL.chipType == pn557) &&
       (rom_version == FW_MOBILE_ROM_VERSION_PN557) &&
       (fw_maj_ver == 0x01)) {
     status = NFCSTATUS_SUCCESS;
-  } else if (!(strcmp(COMPILATION_MW, "PN553")) &&
+  } else if ((nfcFL.chipType == pn553) &&
       (rom_version == FW_MOBILE_ROM_VERSION_PN553) &&
       (fw_maj_ver == 0x01 || fw_maj_ver == 0x02)) {
     status = NFCSTATUS_SUCCESS;
-  } else if (!strcmp(COMPILATION_MW, "PN551") &&
+  } else if ((nfcFL.chipType == pn551) &&
              (rom_version == FW_MOBILE_ROM_VERSION_PN551) &&
              (fw_maj_ver == 0x05)) {
     status = NFCSTATUS_SUCCESS;
-  } else if (!strcmp(COMPILATION_MW, "PN548C2") &&
-             (rom_version == FW_MOBILE_ROM_VERSION_PN548AD) &&
-             (fw_maj_ver == 0x01)) {
-    status = NFCSTATUS_SUCCESS;
-  } else if (!strcmp(COMPILATION_MW, "PN547C2") &&
-             (rom_version == FW_MOBILE_ROM_VERSION_PN547C2) &&
-             (fw_maj_ver == 0x01)) {
-    status = NFCSTATUS_SUCCESS;
   }
   return status;
 }
@@ -1174,10 +1126,8 @@
   static uint8_t cmd_ven_enable[] = {0x20, 0x02, 0x05, 0x01,
                                          0xA0, 0x07, 0x01, 0x01};
 
-#ifndef NXP_NFC_CHIP_PN81T
   static uint8_t android_l_aid_matching_mode_on_cmd[] = {
       0x20, 0x02, 0x05, 0x01, 0xA0, 0x91, 0x01, 0x01};
-#endif
   static uint8_t swp_switch_timeout_cmd[] = {0x20, 0x02, 0x06, 0x01, 0xA0,
                                              0xF3, 0x02, 0x00, 0x00};
   config_success = true;
@@ -1190,11 +1140,9 @@
   int temp_fix = 1;
 #endif
   unsigned long num = 0;
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
   // initialize dummy FW recovery variables
   gRecFwRetryCount = 0;
   gRecFWDwnld = 0;
-#endif
   // recovery --start
   /*NCI_INIT_CMD*/
   static uint8_t cmd_init_nci[] = {0x20, 0x01, 0x00};
@@ -1367,7 +1315,6 @@
     retlen = 0;
     fw_download_success = 0;
 
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
     NXPLOG_NCIHAL_D("Performing TVDD Settings");
     isfound = GetNxpNumValue(NAME_NXP_EXT_TVDD_CFG, &num, sizeof(num));
     if (isfound > 0) {
@@ -1408,17 +1355,13 @@
         NXPLOG_NCIHAL_E("Wrong Configuration Value %ld", num);
       }
     }
-#endif
     retlen = 0;
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
     config_access = false;
-#endif
     NXPLOG_NCIHAL_D("Performing RF Settings BLK 1");
     isfound = GetNxpByteArrayValue(NAME_NXP_RF_CONF_BLK_1, (char*)buffer,
                                    bufflen, &retlen);
     if (retlen > 0) {
       status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
       if (status == NFCSTATUS_SUCCESS) {
         status = phNxpNciHal_CheckRFCmdRespStatus();
         /*STATUS INVALID PARAM 0x09*/
@@ -1428,7 +1371,6 @@
           goto retry_core_init;
         }
       } else
-#endif
           if (status != NFCSTATUS_SUCCESS) {
         NXPLOG_NCIHAL_E("RF Settings BLK 1 failed");
         retry_core_init_cnt++;
@@ -1442,7 +1384,6 @@
                                    bufflen, &retlen);
     if (retlen > 0) {
       status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
       if (status == NFCSTATUS_SUCCESS) {
         status = phNxpNciHal_CheckRFCmdRespStatus();
         /*STATUS INVALID PARAM 0x09*/
@@ -1452,7 +1393,6 @@
           goto retry_core_init;
         }
       } else
-#endif
           if (status != NFCSTATUS_SUCCESS) {
         NXPLOG_NCIHAL_E("RF Settings BLK 2 failed");
         retry_core_init_cnt++;
@@ -1466,7 +1406,6 @@
                                    bufflen, &retlen);
     if (retlen > 0) {
       status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
       if (status == NFCSTATUS_SUCCESS) {
         status = phNxpNciHal_CheckRFCmdRespStatus();
         /*STATUS INVALID PARAM 0x09*/
@@ -1476,7 +1415,6 @@
           goto retry_core_init;
         }
       } else
-#endif
           if (status != NFCSTATUS_SUCCESS) {
         NXPLOG_NCIHAL_E("RF Settings BLK 3 failed");
         retry_core_init_cnt++;
@@ -1490,7 +1428,6 @@
                                    bufflen, &retlen);
     if (retlen > 0) {
       status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
       if (status == NFCSTATUS_SUCCESS) {
         status = phNxpNciHal_CheckRFCmdRespStatus();
         /*STATUS INVALID PARAM 0x09*/
@@ -1500,7 +1437,6 @@
           goto retry_core_init;
         }
       } else
-#endif
           if (status != NFCSTATUS_SUCCESS) {
         NXPLOG_NCIHAL_E("RF Settings BLK 4 failed");
         retry_core_init_cnt++;
@@ -1514,7 +1450,6 @@
                                    bufflen, &retlen);
     if (retlen > 0) {
       status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
       if (status == NFCSTATUS_SUCCESS) {
         status = phNxpNciHal_CheckRFCmdRespStatus();
         /*STATUS INVALID PARAM 0x09*/
@@ -1524,7 +1459,6 @@
           goto retry_core_init;
         }
       } else
-#endif
           if (status != NFCSTATUS_SUCCESS) {
         NXPLOG_NCIHAL_E("RF Settings BLK 5 failed");
         retry_core_init_cnt++;
@@ -1538,7 +1472,6 @@
                                    bufflen, &retlen);
     if (retlen > 0) {
       status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
       if (status == NFCSTATUS_SUCCESS) {
         status = phNxpNciHal_CheckRFCmdRespStatus();
         /*STATUS INVALID PARAM 0x09*/
@@ -1548,7 +1481,6 @@
           goto retry_core_init;
         }
       } else
-#endif
           if (status != NFCSTATUS_SUCCESS) {
         NXPLOG_NCIHAL_E("RF Settings BLK 6 failed");
         retry_core_init_cnt++;
@@ -1556,9 +1488,7 @@
       }
     }
     retlen = 0;
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
     config_access = true;
-#endif
     NXPLOG_NCIHAL_D("Performing NAME_NXP_CORE_CONF_EXTN Settings");
     isfound = GetNxpByteArrayValue(NAME_NXP_CORE_CONF_EXTN, (char*)buffer,
                                    bufflen, &retlen);
@@ -1587,15 +1517,12 @@
     }
 
     retlen = 0;
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
     config_access = false;
-#endif
     isfound = GetNxpByteArrayValue(NAME_NXP_CORE_RF_FIELD, (char*)buffer,
                                    bufflen, &retlen);
     if (retlen > 0) {
       /* NXP ACT Proprietary Ext */
       status = phNxpNciHal_send_ext_cmd(retlen, buffer);
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
       if (status == NFCSTATUS_SUCCESS) {
         status = phNxpNciHal_CheckRFCmdRespStatus();
         /*STATUS INVALID PARAM 0x09*/
@@ -1605,19 +1532,15 @@
           goto retry_core_init;
         }
       } else
-#endif
           if (status != NFCSTATUS_SUCCESS) {
         NXPLOG_NCIHAL_E("Setting NXP_CORE_RF_FIELD status failed");
         retry_core_init_cnt++;
         goto retry_core_init;
       }
     }
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
     config_access = true;
-#endif
 
     retlen = 0;
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
     /* NXP SWP switch timeout Setting*/
     if (GetNxpNumValue(NAME_NXP_SWP_SWITCH_TIMEOUT, (void*)&retlen,
                        sizeof(retlen))) {
@@ -1652,7 +1575,6 @@
       NXPLOG_NCIHAL_E("phNxpNciHal_china_tianjin_rf_setting failed");
       return NFCSTATUS_FAILED;
     }
-#endif
     // Update eeprom value
     status = phNxpNciHal_set_mw_eeprom();
     if (status != NFCSTATUS_SUCCESS) {
@@ -1727,9 +1649,8 @@
     }
   }
 
-#ifndef NXP_NFC_CHIP_PN81T
   /* Android L AID Matching Platform Setting*/
-  if (GetNxpNumValue(NAME_AID_MATCHING_PLATFORM, (void*)&retlen,
+  if ((nfcFL.chipType != pn557) && GetNxpNumValue(NAME_AID_MATCHING_PLATFORM, (void*)&retlen,
                      sizeof(retlen))) {
     if (1 == retlen) {
       status =
@@ -1752,7 +1673,6 @@
       }
     }
   }
-#endif
 
   if ((*p_core_init_rsp_params > 0) && (*p_core_init_rsp_params < 4)) {
     static phLibNfc_Message_t msg;
@@ -1883,11 +1803,9 @@
     free(buffer);
     buffer = NULL;
   }
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
   // initialize dummy FW recovery variables
   gRecFWDwnld = 0;
   gRecFwRetryCount = 0;
-#endif
   if (!((*p_core_init_rsp_params > 0) && (*p_core_init_rsp_params < 4)))
     phNxpNciHal_core_initialized_complete(status);
   else {
@@ -1909,7 +1827,6 @@
 #endif
   return NFCSTATUS_SUCCESS;
 }
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
 /******************************************************************************
  * Function         phNxpNciHal_CheckRFCmdRespStatus
  *
@@ -1986,7 +1903,6 @@
   gRecFWDwnld = false;
   return status;
 }
-#endif
 /******************************************************************************
  * Function         phNxpNciHal_core_initialized_complete
  *
@@ -2582,12 +2498,11 @@
   if (nxpprofile_ctrl.bClkSrcVal == CLK_SRC_PLL) {
     static uint8_t set_clock_cmd[] = {0x20, 0x02, 0x09, 0x02, 0xA0, 0x03,
                                       0x01, 0x11, 0xA0, 0x04, 0x01, 0x01};
-#if (NFC_NXP_CHIP_TYPE == PN553 || NFC_NXP_CHIP_TYPE == PN557)
     uint8_t param_clock_src = 0x00;
-#else
-    uint8_t param_clock_src = CLK_SRC_PLL;
-    param_clock_src = param_clock_src << 3;
-#endif
+    if((nfcFL.chipType != pn553)&&(nfcFL.chipType != pn557)) {
+      uint8_t param_clock_src = CLK_SRC_PLL;
+      param_clock_src = param_clock_src << 3;
+    }
 
     if (nxpprofile_ctrl.bClkFreqVal == CLK_FREQ_13MHZ) {
       param_clock_src |= 0x00;
@@ -2603,11 +2518,11 @@
       param_clock_src |= 0x05;
     } else {
       NXPLOG_NCIHAL_E("Wrong clock freq, send default PLL@19.2MHz");
-#if (NFC_NXP_CHIP_TYPE == PN553 || NFC_NXP_CHIP_TYPE == PN557)
-      param_clock_src = 0x01;
-#else
-      param_clock_src = 0x11;
-#endif
+      if((nfcFL.chipType == pn553) || (nfcFL.chipType == pn557)) {
+        param_clock_src = 0x01;
+      } else {
+        param_clock_src = 0x11;
+      }
     }
 
     set_clock_cmd[7] = param_clock_src;
@@ -2803,9 +2718,9 @@
 int check_config_parameter() {
   uint8_t param_clock_src = CLK_SRC_PLL;
   if (nxpprofile_ctrl.bClkSrcVal == CLK_SRC_PLL) {
-#if (NFC_NXP_CHIP_TYPE != PN553 && NFC_NXP_CHIP_TYPE != PN557)
-    param_clock_src = param_clock_src << 3;
-#endif
+    if((nfcFL.chipType != pn553)&&(nfcFL.chipType != pn557)) {
+      param_clock_src = param_clock_src << 3;
+    }
     if (nxpprofile_ctrl.bClkFreqVal == CLK_FREQ_13MHZ) {
       param_clock_src |= 0x00;
     } else if (nxpprofile_ctrl.bClkFreqVal == CLK_FREQ_19_2MHZ) {
@@ -2970,6 +2885,26 @@
 #endif
 }
 
+/*******************************************************************************
+**
+** Function         phNxpNciHal_configFeatureList
+**
+** Description      Configures the featureList based on chip type
+**                  HW Version information number will provide chipType.
+**                  HW Version can be obtained from CORE_INIT_RESPONSE(NCI 1.0)
+**                  or CORE_RST_NTF(NCI 2.0)
+**
+** Parameters       CORE_INIT_RESPONSE/CORE_RST_NTF, len
+**
+** Returns          none
+*******************************************************************************/
+void phNxpNciHal_configFeatureList(uint8_t* init_rsp, uint16_t rsp_len) {
+    nxpncihal_ctrl.chipType = pConfigFL->processChipType(init_rsp,rsp_len);
+    tNFC_chipType chipType = nxpncihal_ctrl.chipType;
+    CONFIGURE_FEATURELIST(chipType);
+    NXPLOG_NCIHAL_D("NFC_GetFeatureList ()chipType = %d", chipType);
+}
+
 /******************************************************************************
  * Function         phNxpNciHal_print_res_status
  *
@@ -3037,73 +2972,3 @@
     }
   }
 }
-
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-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;
-  }
-}
-#endif
diff --git a/halimpl/hal/phNxpNciHal.h b/halimpl/hal/phNxpNciHal.h
index ce71856..e9cfe06 100755
--- a/halimpl/hal/phNxpNciHal.h
+++ b/halimpl/hal/phNxpNciHal.h
@@ -18,6 +18,7 @@
 
 #include <hardware/nfc.h>
 #include <phNxpNciHal_utils.h>
+#include "NxpNfcCapability.h"
 
 /********************* Definitions and structures *****************************/
 #define MAX_RETRY_COUNT 5
@@ -35,8 +36,6 @@
 #define FW_MOBILE_ROM_VERSION_PN551 0x10
 #define FW_MOBILE_ROM_VERSION_PN553 0x11
 #define FW_MOBILE_ROM_VERSION_PN557 0x12
-#define FW_MOBILE_ROM_VERSION_PN548AD 0x10
-#define FW_MOBILE_ROM_VERSION_PN547C2 0x08
 /* NCI Data */
 
 #define NCI_MT_CMD 0x20
@@ -49,7 +48,6 @@
 #define NCI_MSG_CORE_INIT 0x01
 #define NCI_MT_MASK 0xE0
 #define NCI_OID_MASK 0x3F
-#define NXP_NFC_CHIP_PN81T
 
 #define NXP_MAX_CONFIG_STRING_LEN 260
 
@@ -129,6 +127,7 @@
 
   /* to store and restore gpio values */
   phNxpNciGpioInfo_t phNxpNciGpioInfo;
+  tNFC_chipType chipType;
 } phNxpNciHal_Control_t;
 
 typedef struct phNxpNciClock {
@@ -177,8 +176,13 @@
 void phNxpNciHal_request_control(void);
 void phNxpNciHal_release_control(void);
 int phNxpNciHal_write_unlocked(uint16_t data_len, const uint8_t* p_data);
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-NFCSTATUS phNxpNciHal_core_reset_recovery();
-void phNxpNciHal_discovery_cmd_ext(uint8_t* p_cmd_data, uint16_t cmd_len);
-#endif
+/*******************************************************************************
+**
+** Function         phNxpNciHal_configFeatureList
+**
+** Description      Configures the featureList based on chip type
+
+** Returns          none
+*******************************************************************************/
+void phNxpNciHal_configFeatureList(uint8_t* init_rsp, uint16_t rsp_len);
 #endif /* _PHNXPNCIHAL_H_ */
diff --git a/halimpl/hal/phNxpNciHal_ext.cc b/halimpl/hal/phNxpNciHal_ext.cc
index 4240c58..646a07b 100755
--- a/halimpl/hal/phNxpNciHal_ext.cc
+++ b/halimpl/hal/phNxpNciHal_ext.cc
@@ -36,9 +36,6 @@
 extern bool nfc_debug_enabled;
 uint8_t icode_detected = 0x00;
 uint8_t icode_send_eof = 0x00;
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-uint8_t nfcdep_detected = 0x00;
-#endif
 static uint8_t ee_disc_done = 0x00;
 uint8_t EnableP2P_PrioLogic = false;
 static uint32_t RfDiscID = 1;
@@ -100,9 +97,6 @@
 *******************************************************************************/
 NFCSTATUS phNxpNciHal_process_ext_rsp(uint8_t* p_ntf, uint16_t* p_len) {
   NFCSTATUS status = NFCSTATUS_SUCCESS;
-#if (NFC_NXP_CHIP_TYPE == PN547C2)
-  uint16_t rf_technology_length_param = 0;
-#endif
 
   if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x03 &&
       p_ntf[5] == 0x05 && nxpprofile_ctrl.profile_type == EMV_CO_PROFILE) {
@@ -142,11 +136,6 @@
   status = NFCSTATUS_SUCCESS;
 
   if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05) {
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-    if (nfcdep_detected) {
-      nfcdep_detected = 0x00;
-    }
-#endif
 
     switch (p_ntf[4]) {
       case 0x00:
@@ -160,9 +149,6 @@
         break;
       case 0x03:
         NXPLOG_NCIHAL_D("NxpNci: RF Interface = NFC-DEP");
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-        nfcdep_detected = 0x01;
-#endif
         break;
       case 0x80:
         NXPLOG_NCIHAL_D("NxpNci: RF Interface = MIFARE");
@@ -195,11 +181,7 @@
       case 0x80:
         NXPLOG_NCIHAL_D("NxpNci: Protocol = MIFARE");
         break;
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
       case 0x81:
-#else
-      case 0x8A:
-#endif
         NXPLOG_NCIHAL_D("NxpNci: Protocol = Kovio");
         break;
       default:
@@ -226,11 +208,7 @@
       case 0x06:
         NXPLOG_NCIHAL_D("NxpNci: Mode = 15693 Passive Poll");
         break;
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
       case 0x70:
-#else
-      case 0x77:
-#endif
         NXPLOG_NCIHAL_D("NxpNci: Mode = Kovio");
         break;
       case 0x80:
@@ -324,18 +302,6 @@
     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 &&
-           p_ntf[5] == 0x80 && p_ntf[6] == 0x00) {
-    NXPLOG_NCIHAL_D(
-        "Going through workaround - iso-dep  interface  mifare protocol with "
-        "sak value not equal to 0x20");
-    rf_technology_length_param = p_ntf[9];
-    if ((p_ntf[9 + rf_technology_length_param] & 0x20) != 0x20) {
-      p_ntf[4] = 0x80;
-    }
-  }
-#endif
   else if (*p_len == 4 && p_ntf[0] == 0x4F && p_ntf[1] == 0x11 &&
            p_ntf[2] == 0x01) {
     if (p_ntf[3] == 0x00) {
@@ -429,6 +395,7 @@
 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;
@@ -450,6 +417,10 @@
         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];
+      NXPLOG_NCIHAL_D("nci_version : 0x%02x",nxpncihal_ctrl.nci_info.nci_version);
+      if(!nxpncihal_ctrl.hal_open_status) {
+        phNxpNciHal_configFeatureList(p_ntf,*p_len);
+      }
       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];
@@ -467,17 +438,6 @@
       }
       NXPLOG_NCIHAL_E("CORE_RESET_NTF received !");
       NXPLOG_NCIR_E("len = %3d > %s", *p_len, print_buffer);
-
-#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*/
@@ -487,6 +447,9 @@
       NXPLOG_NCIHAL_D("CORE_INIT_RSP NCI2.0 received !");
     } else {
       NXPLOG_NCIHAL_D("CORE_INIT_RSP NCI1.0 received !");
+      if(!nxpncihal_ctrl.hal_open_status) {
+        phNxpNciHal_configFeatureList(p_ntf,*p_len);
+      }
       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];
@@ -705,18 +668,11 @@
     if (nxpncihal_ctrl.nci_info.nci_version != NCI_VERSION_2_0) {
       NXPLOG_NCIHAL_D("> Going through workaround - set host list");
 
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
       *cmd_len = 8;
 
       p_cmd_data[2] = 0x05;
       p_cmd_data[6] = 0x02;
       p_cmd_data[7] = 0xC0;
-#else
-      *cmd_len = 7;
-
-      p_cmd_data[2] = 0x04;
-      p_cmd_data[6] = 0xC0;
-#endif
 
       NXPLOG_NCIHAL_D("> Going through workaround - set host list - END");
       status = NFCSTATUS_SUCCESS;
@@ -740,10 +696,6 @@
     NXPLOG_NCIHAL_D("> Polling Loop Started");
     icode_detected = 0;
     icode_send_eof = 0;
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-    // Cache discovery cmd for recovery
-    phNxpNciHal_discovery_cmd_ext(p_cmd_data, *cmd_len);
-#endif
   }
   // 22000100
   else if (p_cmd_data[0] == 0x22 && p_cmd_data[1] == 0x00 &&
@@ -902,30 +854,6 @@
     }
   }
 
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-  if (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;
-      }
-    }
-  }
-#endif
 
   return status;
 }
diff --git a/halimpl/inc/phNxpNciHal_SelfTest.h b/halimpl/inc/phNxpNciHal_SelfTest.h
index ee7c8d6..3c0aed4 100755
--- a/halimpl/inc/phNxpNciHal_SelfTest.h
+++ b/halimpl/inc/phNxpNciHal_SelfTest.h
@@ -118,15 +118,10 @@
  **                  otherwise NFCSTATUS_FAILED.
  **
  ******************************************************************************/
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
 NFCSTATUS phNxpNciHal_PrbsTestStart(phNxpNfc_PrbsType_t prbs_type,
                                     phNxpNfc_PrbsHwType_t hw_prbs_type,
                                     phNxpNfc_Tech_t tech,
                                     phNxpNfc_Bitrate_t bitrate);
-#else
-NFCSTATUS phNxpNciHal_PrbsTestStart(phNxpNfc_Tech_t tech,
-                                    phNxpNfc_Bitrate_t bitrate);
-#endif
 /*******************************************************************************
  **
  ** Function         phNxpNciHal_PrbsTestStop
diff --git a/halimpl/libnfc-nxp-PN553_example.conf b/halimpl/libnfc-nxp-PN553_example.conf
index 818e473..e11e495 100755
--- a/halimpl/libnfc-nxp-PN553_example.conf
+++ b/halimpl/libnfc-nxp-PN553_example.conf
@@ -28,8 +28,10 @@
 VZW_FEATURE_ENABLE=0x01
 
 ###############################################################################
-# File name for Firmware
-NXP_FW_NAME="libpn553_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-PN553_example_NCI2_0.conf b/halimpl/libnfc-nxp-PN553_example_NCI2_0.conf
index 935b73e..f683666 100755
--- a/halimpl/libnfc-nxp-PN553_example_NCI2_0.conf
+++ b/halimpl/libnfc-nxp-PN553_example_NCI2_0.conf
@@ -28,8 +28,10 @@
 VZW_FEATURE_ENABLE=0x01
 
 ###############################################################################
-# File name for Firmware
-NXP_FW_NAME="libpn553_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-PN80T_example.conf b/halimpl/libnfc-nxp-PN80T_example.conf
index 45d276c..634435c 100755
--- a/halimpl/libnfc-nxp-PN80T_example.conf
+++ b/halimpl/libnfc-nxp-PN80T_example.conf
@@ -28,8 +28,10 @@
 VZW_FEATURE_ENABLE=0x01
 
 ###############################################################################
-# File name for Firmware
-NXP_FW_NAME="libpn553_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-PN80T_example_NCI2_0.conf b/halimpl/libnfc-nxp-PN80T_example_NCI2_0.conf
index 185b07d..aa4883d 100755
--- a/halimpl/libnfc-nxp-PN80T_example_NCI2_0.conf
+++ b/halimpl/libnfc-nxp-PN80T_example_NCI2_0.conf
@@ -28,8 +28,10 @@
 VZW_FEATURE_ENABLE=0x01
 
 ###############################################################################
-# File name for Firmware
-NXP_FW_NAME="libpn553_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-PN81T_example_NCI2_0.conf b/halimpl/libnfc-nxp-PN81T_example_NCI2_0.conf
index 979d04d..a2b9465 100755
--- a/halimpl/libnfc-nxp-PN81T_example_NCI2_0.conf
+++ b/halimpl/libnfc-nxp-PN81T_example_NCI2_0.conf
@@ -29,10 +29,10 @@
 VZW_FEATURE_ENABLE=0x01
 
 ###############################################################################
-# File name for Firmware
-# for library format ex: libpn5xx_fw.so
-# for binary format ex: pn5xx.bin
-NXP_FW_NAME="pn557.bin"
+# Firmware file type
+#.so file   0x01
+#.bin file  0x02
+NXP_FW_TYPE=0x01
 
 ###############################################################################
 # System clock source selection configuration
diff --git a/halimpl/self-test/phNxpNciHal_SelfTest.cc b/halimpl/self-test/phNxpNciHal_SelfTest.cc
index b1ebaf5..ed77862 100755
--- a/halimpl/self-test/phNxpNciHal_SelfTest.cc
+++ b/halimpl/self-test/phNxpNciHal_SelfTest.cc
@@ -76,26 +76,17 @@
 static uint8_t st_validator_testAntenna_AgcVal_Differential(
     nci_data_t* exp, phTmlNfc_TransactInfo_t* act);
 
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
 NFCSTATUS phNxpNciHal_getPrbsCmd(phNxpNfc_PrbsType_t prbs_type,
                                  phNxpNfc_PrbsHwType_t hw_prbs_type,
                                  uint8_t tech, uint8_t bitrate,
                                  uint8_t* prbs_cmd, uint8_t prbs_cmd_len);
-#else
-NFCSTATUS phNxpNciHal_getPrbsCmd(uint8_t tech, uint8_t bitrate,
-                                 uint8_t* prbs_cmd, uint8_t prbs_cmd_len);
-#endif
 /* Test data to validate SWP line 2*/
 static nci_test_data_t swp2_test_data[] = {
     {{
          0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
      },
      {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
          0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */
-#else
-         0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00} /* exp_rsp */
-#endif
      },
      {
          0x00, {0x00} /* ext_ntf */
@@ -103,18 +94,10 @@
      st_validator_testEquals, /* validator */
      st_validator_null},
     {{
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
          0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
-#else
-         0x03, {0x20, 0x01, 0x00}
-#endif
      },
      {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
          0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
-#else
-         0x4, {0x40, 0x01, 0x17, 0x00}
-#endif
      },
      {
          0x00, {0x00} /* ext_ntf */
@@ -153,11 +136,7 @@
          0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
      },
      {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
          0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */
-#else
-         0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00} /* exp_rsp */
-#endif
      },
      {
          0x00, {0x00} /* ext_ntf */
@@ -165,18 +144,10 @@
      st_validator_testEquals, /* validator */
      st_validator_null},
     {{
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
          0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
-#else
-         0x03, {0x20, 0x01, 0x00}
-#endif
      },
      {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
          0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
-#else
-         0x4, {0x40, 0x01, 0x17, 0x00}
-#endif
      },
      {
          0x00, {0x00} /* ext_ntf */
@@ -213,11 +184,7 @@
          0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
      },
      {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
          0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */
-#else
-         0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00}             /* exp_rsp */
-#endif
      },
      {
          0x00, {0x00} /* ext_ntf */
@@ -225,25 +192,16 @@
      st_validator_testEquals, /* validator */
      st_validator_null},
     {{
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
          0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
-#else
-         0x03, {0x20, 0x01, 0x00}                               /* cmd */
-#endif
      },
      {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
          0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
-#else
-         0x4, {0x40, 0x01, 0x17, 0x00}                          /* exp_rsp */
-#endif
      },
      {
          0x00, {0x00} /* ext_ntf */
      },
      st_validator_testEquals, /* validator */
      st_validator_null
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
     },
     {{
          0x04, {0x2F, 0x00, 0x01, 0x00} /* cmd */
@@ -256,7 +214,6 @@
      },
      st_validator_testEquals, /* validator */
      st_validator_null
-#endif
     }};
 
 /* for rf field test, first requires to disable the standby mode */
@@ -265,11 +222,7 @@
          0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
      },
      {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
          0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */
-#else
-         0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00}             /* exp_rsp */
-#endif
      },
      {
          0x00, {0x00} /* ext_ntf */
@@ -277,25 +230,16 @@
      st_validator_testEquals, /* validator */
      st_validator_null},
     {{
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
          0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
-#else
-         0x03, {0x20, 0x01, 0x00}                               /* cmd */
-#endif
      },
      {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
          0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
-#else
-         0x4, {0x40, 0x01, 0x17, 0x00}                          /* exp_rsp */
-#endif
      },
      {
          0x00, {0x00} /* ext_ntf */
      },
      st_validator_testEquals, /* validator */
      st_validator_null},
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
     {{
          0x03, {0x2F, 0x02, 0x00} /* cmd */
      },
@@ -318,13 +262,8 @@
      },
      st_validator_testEquals, /* validator */
      st_validator_null},
-#endif
     {{
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
          0x05, {0x2F, 0x3D, 0x02, 0x20, 0x01} /* cmd */
-#else
-         0x08, {0x2F, 0x3D, 0x05, 0x20, 0x01, 0x00, 0x00, 0x00} /* cmd */
-#endif
      },
      {
          0x04, {0x4F, 0x3D, 0x05, 0x00} /* exp_rsp */
@@ -334,7 +273,6 @@
      },
      st_validator_testEquals, /* validator */
      st_validator_null
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
     },
     {{
          0x04, {0x2F, 0x00, 0x01, 0x01} /* cmd */
@@ -347,7 +285,6 @@
      },
      st_validator_testEquals, /* validator */
      st_validator_null
-#endif
     }};
 
 static nci_test_data_t rf_field_off_test_data[] = {
@@ -355,11 +292,7 @@
          0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
      },
      {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
          0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */
-#else
-         0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00}             /* exp_rsp */
-#endif
      },
      {
          0x00, {0x00} /* ext_ntf */
@@ -367,25 +300,16 @@
      st_validator_testEquals, /* validator */
      st_validator_null},
     {{
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
          0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
-#else
-         0x03, {0x20, 0x01, 0x00}                               /* cmd */
-#endif
      },
      {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
          0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
-#else
-         0x4, {0x40, 0x01, 0x17, 0x00}                          /* exp_rsp */
-#endif
      },
      {
          0x00, {0x00} /* ext_ntf */
      },
      st_validator_testEquals, /* validator */
      st_validator_null},
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
     {{
          0x03, {0x2F, 0x02, 0x00} /* cmd */
      },
@@ -408,13 +332,8 @@
      },
      st_validator_testEquals, /* validator */
      st_validator_null},
-#endif
     {{
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
          0x05, {0x2F, 0x3D, 0x02, 0x20, 0x00} /* cmd */
-#else
-         0x08, {0x2F, 0x3D, 0x05, 0x20, 0x00, 0x00, 0x00, 0x00} /* cmd */
-#endif
      },
      {
          0x04, {0x4F, 0x3D, 0x05, 0x00} /* exp_rsp */
@@ -424,7 +343,6 @@
      },
      st_validator_testEquals, /* validator */
      st_validator_null
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
     },
     {{
          0x04, {0x2F, 0x00, 0x01, 0x01} /* cmd */
@@ -437,7 +355,6 @@
      },
      st_validator_testEquals, /* validator */
      st_validator_null
-#endif
     }};
 
 /* Download pin test data 1 */
@@ -446,11 +363,7 @@
          0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
      },
      {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
          0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */
-#else
-         0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00}             /* exp_rsp */
-#endif
      },
      {
          0x00, {0x00} /* ext_ntf */
@@ -479,11 +392,7 @@
          0x04, {0x20, 0x00, 0x01, 0x00} /* cmd */
      },
      {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
          0x06, {0x40, 0x00, 0x03, 0x00, 0x11, 0x00} /* exp_rsp */
-#else
-         0x06, {0x40, 0x00, 0x03, 0x00, 0x10, 0x00}             /* exp_rsp */
-#endif
      },
      {
          0x00, {0x00} /* ext_ntf */
@@ -491,18 +400,10 @@
      st_validator_testEquals, /* validator */
      st_validator_null},
     {{
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
          0x05, {0x20, 0x01, 0x02, 0x00, 0x00} /* cmd */
-#else
-         0x03, {0x20, 0x01, 0x00}                               /* cmd */
-#endif
      },
      {
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
          0x4, {0x40, 0x01, 0x19, 0x00} /* exp_rsp */
-#else
-         0x4, {0x40, 0x01, 0x17, 0x00}                          /* exp_rsp */
-#endif
      },
      {
          0x00, {0x00} /* ext_ntf */
@@ -520,7 +421,6 @@
      },
      st_validator_testEquals, /* validator */
      st_validator_null},
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
     {{
          0x04, {0x2F, 0x00, 0x01, 0x00} /* cmd */
      },
@@ -532,7 +432,6 @@
      },
      st_validator_testEquals, /* validator */
      st_validator_null},
-#endif
     {{
          0x05,
          {0x2F, 0x3D, 0x02, 0x01, 0x80} /* TxLDO cureent measurement cmd */
@@ -546,13 +445,8 @@
      st_validator_testAntenna_Txldo,
      st_validator_null},
     {{
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
          0x07,
          {0x2F, 0x3D, 0x04, 0x02, 0xC8, 0x60, 0x03} /* AGC measurement cmd */
-#else
-         0x07,
-         {0x2F, 0x3D, 0x04, 0x02, 0xCD, 0x60, 0x03} /* AGC measurement cmd */
-#endif
      },
      {
          0x03, {0x4F, 0x3D, 05} /* exp_rsp */
@@ -588,7 +482,6 @@
      },
      st_validator_testAntenna_AgcVal_Differential,
      st_validator_null
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
     },
     {{
          0x04, {0x2F, 0x00, 0x01, 0x01} /* cmd */
@@ -601,7 +494,6 @@
      },
      st_validator_testEquals, /* validator */
      st_validator_null
-#endif
     }};
 
 /************** Self test functions ***************************************/
@@ -1457,27 +1349,17 @@
  **
  ******************************************************************************/
 
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
 NFCSTATUS phNxpNciHal_PrbsTestStart(phNxpNfc_PrbsType_t prbs_type,
                                     phNxpNfc_PrbsHwType_t hw_prbs_type,
                                     phNxpNfc_Tech_t tech,
                                     phNxpNfc_Bitrate_t bitrate)
-#else
-NFCSTATUS phNxpNciHal_PrbsTestStart(phNxpNfc_Tech_t tech,
-                                    phNxpNfc_Bitrate_t bitrate)
-#endif
 {
   NFCSTATUS status = NFCSTATUS_FAILED;
 
   nci_test_data_t prbs_cmd_data;
 
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
   uint8_t rsp_cmd_info[] = {0x4F, 0x30, 0x01, 0x00};
   prbs_cmd_data.cmd.len = 0x09;
-#else
-  uint8_t rsp_cmd_info[] = {0x4F, 0x30, 0x01, 0x00};
-  prbs_cmd_data.cmd.len = 0x07;
-#endif
 
   memcpy(prbs_cmd_data.exp_rsp.p_data, &rsp_cmd_info[0], sizeof(rsp_cmd_info));
   prbs_cmd_data.exp_rsp.len = sizeof(rsp_cmd_info);
@@ -1492,14 +1374,9 @@
 
 //    [NCI] -> [0x2F 0x30 0x04 0x00 0x00 0x01 0xFF]
 
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
   status =
       phNxpNciHal_getPrbsCmd(prbs_type, hw_prbs_type, tech, bitrate,
                              prbs_cmd_data.cmd.p_data, prbs_cmd_data.cmd.len);
-#else
-  status = phNxpNciHal_getPrbsCmd(tech, bitrate, prbs_cmd_data.cmd.p_data,
-                                  prbs_cmd_data.cmd.len);
-#endif
 
   if (status == NFCSTATUS_FAILED) {
     // Invalid Param.
@@ -1571,15 +1448,10 @@
 ** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
 **
 *******************************************************************************/
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
 NFCSTATUS phNxpNciHal_getPrbsCmd(phNxpNfc_PrbsType_t prbs_type,
                                  phNxpNfc_PrbsHwType_t hw_prbs_type,
                                  uint8_t tech, uint8_t bitrate,
                                  uint8_t* prbs_cmd, uint8_t prbs_cmd_len)
-#else
-NFCSTATUS phNxpNciHal_getPrbsCmd(uint8_t tech, uint8_t bitrate,
-                                 uint8_t* prbs_cmd, uint8_t prbs_cmd_len)
-#endif
 {
   NFCSTATUS status = NFCSTATUS_SUCCESS;
   int position_tech_param = 0;
@@ -1588,18 +1460,13 @@
   NXPLOG_NCIHAL_D("phNxpNciHal_getPrbsCmd - tech 0x%x bitrate = 0x%x", tech,
                   bitrate);
   if (NULL == prbs_cmd ||
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
       prbs_cmd_len != 0x09)
-#else
-      prbs_cmd_len != 0x07)
-#endif
   {
     return status;
   }
 
   prbs_cmd[0] = 0x2F;
   prbs_cmd[1] = 0x30;
-#if (NFC_NXP_CHIP_TYPE != PN547C2)
   prbs_cmd[2] = 0x06;
   prbs_cmd[3] = (uint8_t)prbs_type;
   // 0xFF Error value used for validation.
@@ -1610,17 +1477,6 @@
   prbs_cmd[8] = 0xFF;
   position_tech_param = 5;
   position_bit_param = 6;
-#else
-  prbs_cmd[2] = 0x04;
-  // 0xFF Error value used for validation.
-  prbs_cmd[3] = 0xFF;  // TECH
-  // 0xFF Error value used for validation.
-  prbs_cmd[4] = 0xFF;  // BITRATE
-  prbs_cmd[5] = 0x01;
-  prbs_cmd[6] = 0xFF;
-  position_tech_param = 3;
-  position_bit_param = 4;
-#endif
 
   switch (tech) {
     case NFC_RF_TECHNOLOGY_A:
diff --git a/halimpl/utils/NxpNfcCapability.cpp b/halimpl/utils/NxpNfcCapability.cpp
new file mode 100644
index 0000000..fc0a6c3
--- /dev/null
+++ b/halimpl/utils/NxpNfcCapability.cpp
@@ -0,0 +1,94 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2015 NXP Semiconductors
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+#define LOG_TAG "NxpHal"
+#include "NxpNfcCapability.h"
+#include <phNxpLog.h>
+
+capability* capability::instance = NULL;
+tNFC_chipType capability::chipType = pn81T;
+tNfc_featureList nfcFL;
+
+capability::capability() {}
+
+capability* capability::getInstance() {
+  if (NULL == instance) {
+    instance = new capability();
+  }
+  return instance;
+}
+
+tNFC_chipType capability::processChipType(uint8_t* msg, uint16_t msg_len) {
+  if ((msg != NULL) && (msg_len != 0)) {
+    if (msg[0] == 0x60 && msg[1] == 00) {
+      if ((msg[offsetRstFwVersion] == 0x12) &&
+          (msg[offsetRstFwVersion + 1] == 0x01)) {
+        chipType = pn81T;
+      } else if ((msg[offsetRstFwVersion] == 0x11) &&
+                 (msg[offsetRstFwVersion + 1] == 0x02)) {
+        chipType = pn553;
+      }
+    } else if ((offsetInitFwVersion < msg_len) &&
+               (msg[offsetInitFwVersion] == 0x12)) {
+      chipType = pn81T;
+    }
+
+    else if (offsetHwVersion < msg_len) {
+      ALOGD("%s HwVersion : 0x%02x", __func__, msg[offsetHwVersion]);
+      switch (msg[offsetHwVersion]) {
+        case 0x40:  // PN553 A0
+        case 0x41:  // PN553 B0
+          // NQ310
+          chipType = pn553;
+          break;
+
+        case 0x50:  // PN553 A0 + P73
+        case 0x51:  // PN553 B0 + P73 , NQ440
+          // NQ330
+          chipType = pn80T;
+          break;
+
+        case 0x98:
+          chipType = pn551;
+          break;
+
+        case 0xA8:
+        case 0x08:
+          chipType = pn67T;
+          break;
+
+        case 0x28:
+        case 0x48:  // NQ210
+          chipType = pn548C2;
+          break;
+
+        case 0x18:
+        case 0x58:  // NQ220
+          chipType = pn66T;
+          break;
+
+        default:
+          chipType = pn80T;
+      }
+    } else {
+      ALOGD("%s Wrong msg_len. Setting Default ChiptType pn80T", __func__);
+      chipType = pn81T;
+    }
+  }
+  ALOGD("%s Product : %s", __func__, product[chipType]);
+  return chipType;
+}
diff --git a/halimpl/utils/NxpNfcCapability.h b/halimpl/utils/NxpNfcCapability.h
new file mode 100644
index 0000000..41e7b64
--- /dev/null
+++ b/halimpl/utils/NxpNfcCapability.h
@@ -0,0 +1,41 @@
+/******************************************************************************
+ *
+ *  Copyright (C) 2015 NXP Semiconductors
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+#ifndef __CAP_H__
+#define __CAP_H__
+#include "Nxp_Features.h"
+#define pConfigFL (capability::getInstance())
+
+class capability {
+ private:
+  static capability* instance;
+  const uint16_t offsetHwVersion = 24;
+  const uint16_t offsetInitFwVersion = 25;
+  const uint16_t offsetRstFwVersion = 9;
+  /*product[] will be used to print product version and
+  should be kept in accordance with tNFC_chipType*/
+  const char* product[11] = {"UNKNOWN", "PN547C2", "PN65T", "PN548C2",
+                             "PN66T",   "PN551",   "PN67T", "PN553",
+                             "PN80T",   "PN557",   "PN81T"};
+  capability();
+
+ public:
+  static tNFC_chipType chipType;
+  static capability* getInstance();
+  tNFC_chipType processChipType(uint8_t* msg, uint16_t msg_len);
+};
+#endif
diff --git a/halimpl/utils/phNxpConfig.h b/halimpl/utils/phNxpConfig.h
index 496cc24..e775d7c 100755
--- a/halimpl/utils/phNxpConfig.h
+++ b/halimpl/utils/phNxpConfig.h
@@ -65,7 +65,7 @@
 #define NAME_MIFARE_READER_ENABLE "MIFARE_READER_ENABLE"
 #define NAME_FW_STORAGE "FW_STORAGE"
 #define NAME_NXP_NFC_DEV_NODE "NXP_NFC_DEV_NODE"
-#define NAME_NXP_FW_NAME "NXP_FW_NAME"
+#define NAME_NXP_FW_TYPE "NXP_FW_TYPE"
 #define NAME_NXP_FW_PROTECION_OVERRIDE "NXP_FW_PROTECION_OVERRIDE"
 #define NAME_NXP_SYS_CLK_SRC_SEL "NXP_SYS_CLK_SRC_SEL"
 #define NAME_NXP_SYS_CLK_FREQ_SEL "NXP_SYS_CLK_FREQ_SEL"
diff --git a/halimpl/utils/phNxpNciHal_utils.cc b/halimpl/utils/phNxpNciHal_utils.cc
old mode 100755
new mode 100644
index fb51285..4f50a10
--- a/halimpl/utils/phNxpNciHal_utils.cc
+++ b/halimpl/utils/phNxpNciHal_utils.cc
@@ -23,12 +23,6 @@
 #include <phNxpNciHal.h>
 #include <phNxpNciHal_utils.h>
 
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-extern uint8_t discovery_cmd[50];
-extern uint8_t discovery_cmd_len;
-extern uint8_t nfcdep_detected;
-#endif
-
 /*********************** Link list functions **********************************/
 
 /*******************************************************************************
@@ -343,10 +337,9 @@
 **
 *******************************************************************************/
 phNxpNciHal_Monitor_t* phNxpNciHal_get_monitor(void) {
- if(nxpncihal_monitor == NULL)
- {
+  if (nxpncihal_monitor == NULL) {
     NXPLOG_NCIHAL_E("nxpncihal_monitor is null");
- }
+  }
   return nxpncihal_monitor;
 }
 
@@ -464,18 +457,6 @@
 *******************************************************************************/
 
 void phNxpNciHal_emergency_recovery(void) {
-#if (NFC_NXP_CHIP_TYPE == PN548C2)
-  if (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*)phNxpNciHal_core_reset_recovery,
-                       NULL) == 0) {
-      return;
-    }
-  }
-#endif
   NXPLOG_NCIHAL_E("%s: abort()", __func__);
   abort();
 }