blob: 80cca0a18aa83951b297802655ce8c460f9d8cd1 [file] [log] [blame]
/******************************************************************************
*
* Copyright 2022,2023 NXP
*
* 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.
*
******************************************************************************/
#include <stdint.h>
#include <string>
#ifndef NXP_FEATURES_H
#define NXP_FEATURES_H
#define STRMAX_2 100
/*FW ROM CODE VERSION*/
#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_SN100U 0x01
#define FW_MOBILE_ROM_VERSION_SN220U 0x01
#define FW_MOBILE_ROM_VERSION_SN300U 0x02
/*FW Major VERSION Code*/
#define FW_MOBILE_MAJOR_NUMBER_PN553 0x01
#define FW_MOBILE_MAJOR_NUMBER_PN551 0x05
#define FW_MOBILE_MAJOR_NUMBER_PN48AD 0x01
#define FW_MOBILE_MAJOR_NUMBER_PN81A 0x02
#define FW_MOBILE_MAJOR_NUMBER_PN557 0x01
#define FW_MOBILE_MAJOR_NUMBER_PN557_V2 0x21
#define FW_MOBILE_MAJOR_NUMBER_SN100U 0x010
#define FW_MOBILE_MAJOR_NUMBER_SN220U 0x01
#define FW_MOBILE_MAJOR_NUMBER_SN300U 0x20
#define NCI_CMD_RSP_SUCCESS_SW1 0x60
#define NCI_CMD_RSP_SUCCESS_SW2 0x00
#define FW_DL_RSP_FIRST_BYTE 0x00
/* Supported EE */
#define EE_T4T_SUPPORTED 1
#define EE_UICC1_SUPPORTED 1
#define EE_UICC2_SUPPORTED 1
#define EE_UICC3_SUPPORTED 1
#define EE_ESE_SUPPORTED 1
#define EE_EUICC1_SUPPORTED 1
#define EE_EUICC2_SUPPORTED 1
#define JCOP_VER_3_3 3
#define JCOP_VER_4_0 4
#ifndef FW_LIB_ROOT_DIR
#if (defined(__arm64__) || defined(__aarch64__) || defined(_M_ARM64))
#define FW_LIB_ROOT_DIR "/vendor/lib64/"
#else
#define FW_LIB_ROOT_DIR "/vendor/lib/"
#endif
#endif
#ifndef FW_BIN_ROOT_DIR
#define FW_BIN_ROOT_DIR "/vendor/firmware/"
#endif
#ifndef FW_LIB_EXTENSION
#define FW_LIB_EXTENSION ".so"
#endif
#ifndef FW_BIN_EXTENSION
#define FW_BIN_EXTENSION ".bin"
#endif
using namespace std;
typedef enum {
NFCC_DWNLD_WITH_VEN_RESET,
NFCC_DWNLD_WITH_NCI_CMD
} tNFCC_DnldType;
typedef enum {
HW_PN553_A0 = 0x40,
HW_PN553_B0 = 0x41,
HW_PN80T_A0 = 0x50,
HW_PN80T_B0 = 0x51, // PN553 B0 + P73
HW_PN551 = 0x98,
HW_PN67T_A0 = 0xA8,
HW_PN67T_B0 = 0x08,
HW_PN548C2_A0 = 0x28,
HW_PN548C2_B0 = 0x48,
HW_PN66T_A0 = 0x18,
HW_PN66T_B0 = 0x58,
HW_SN100U_A0 = 0xA0,
HW_SN100U_A2 = 0xA2,
HW_PN560_V1 = 0xCA,
HW_PN560_V2 = 0xCB,
HW_SN300U = 0xD3
} tNFC_HWVersion;
typedef enum {
DEFAULT_CHIP_TYPE = 0x00,
pn547C2 = 0x01,
pn65T,
pn548C2,
pn66T,
pn551,
pn67T,
pn553,
pn80T,
pn557,
pn81T,
sn100u,
sn220u,
pn560,
sn300u
} tNFC_chipType;
typedef struct {
/*Flags common to all chip types*/
uint8_t _NFCC_I2C_READ_WRITE_IMPROVEMENT : 1;
uint8_t _NFCC_MIFARE_TIANJIN : 1;
uint8_t _NFCC_SPI_FW_DOWNLOAD_SYNC : 1;
uint8_t _NFCEE_REMOVED_NTF_RECOVERY : 1;
uint8_t _NFCC_FORCE_FW_DOWNLOAD : 1;
uint8_t _NFA_EE_MAX_EE_SUPPORTED : 3;
uint8_t _NFCC_DWNLD_MODE : 1;
} tNfc_nfccFeatureList;
typedef struct {
uint8_t nfcNxpEse : 1;
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_nfccFeatureList nfccFL;
} tNfc_featureList;
extern tNfc_featureList nfcFL;
#define GET_FW_ROM_VERSION_NCI_RESP(msg, msg_len) (msg[msg_len - 3])
#define GET_FW_MAJOR_VERSION_NCI_RESP(msg, msg_len) (msg[msg_len - 2])
#define GET_HW_VERSION_NCI_RESP(msg, msg_len) (msg[msg_len - 4])
#define IS_CHIP_TYPE_GE(cType) (nfcFL.chipType >= cType)
#define IS_CHIP_TYPE_EQ(cType) (nfcFL.chipType == cType)
#define IS_CHIP_TYPE_LE(cType) (nfcFL.chipType <= cType)
#define IS_CHIP_TYPE_L(cType) (nfcFL.chipType < cType)
#define IS_CHIP_TYPE_NE(cType) (nfcFL.chipType != cType)
#define CONFIGURE_FEATURELIST(chipType) \
{ \
nfcFL.chipType = chipType; \
switch (chipType) { \
case pn81T: \
nfcFL.chipType = pn557; \
nfcFL.nfcNxpEse = true; \
CONFIGURE_FEATURELIST_NFCC_WITH_ESE(chipType) \
break; \
case pn80T: \
nfcFL.chipType = pn553; \
nfcFL.nfcNxpEse = true; \
CONFIGURE_FEATURELIST_NFCC_WITH_ESE(chipType) \
break; \
case pn67T: \
nfcFL.chipType = pn551; \
nfcFL.nfcNxpEse = true; \
CONFIGURE_FEATURELIST_NFCC_WITH_ESE(chipType) \
break; \
case pn66T: \
nfcFL.chipType = pn548C2; \
nfcFL.nfcNxpEse = true; \
CONFIGURE_FEATURELIST_NFCC_WITH_ESE(chipType) \
break; \
case pn65T: \
nfcFL.chipType = pn547C2; \
nfcFL.nfcNxpEse = true; \
CONFIGURE_FEATURELIST_NFCC_WITH_ESE(chipType) \
break; \
case sn100u: \
nfcFL.chipType = sn100u; \
nfcFL.nfcNxpEse = true; \
CONFIGURE_FEATURELIST_NFCC_WITH_ESE(chipType) \
break; \
case sn220u: \
nfcFL.chipType = sn220u; \
nfcFL.nfcNxpEse = true; \
CONFIGURE_FEATURELIST_NFCC_WITH_ESE(chipType) \
break; \
case sn300u: \
nfcFL.chipType = sn300u; \
nfcFL.nfcNxpEse = true; \
CONFIGURE_FEATURELIST_NFCC_WITH_ESE(chipType) \
break; \
default: \
nfcFL.nfcNxpEse = false; \
CONFIGURE_FEATURELIST_NFCC(chipType) \
} \
}
#define CONFIGURE_FEATURELIST_NFCC_WITH_ESE(chipType) \
{ \
switch (chipType) { \
case pn81T: \
CONFIGURE_FEATURELIST_NFCC(pn557) \
nfcFL.nfccFL._NFCC_SPI_FW_DOWNLOAD_SYNC = true; \
nfcFL.nfccFL._NFA_EE_MAX_EE_SUPPORTED = \
EE_T4T_SUPPORTED + EE_UICC1_SUPPORTED + EE_UICC2_SUPPORTED + \
EE_ESE_SUPPORTED; \
break; \
case sn100u: \
CONFIGURE_FEATURELIST_NFCC(sn100u) \
nfcFL.nfccFL._NFCC_SPI_FW_DOWNLOAD_SYNC = true; \
nfcFL.nfccFL._NFA_EE_MAX_EE_SUPPORTED = \
EE_T4T_SUPPORTED + EE_UICC1_SUPPORTED + EE_UICC2_SUPPORTED + \
EE_UICC3_SUPPORTED + EE_ESE_SUPPORTED; \
break; \
case sn220u: \
CONFIGURE_FEATURELIST_NFCC(sn220u) \
nfcFL.nfccFL._NFCC_SPI_FW_DOWNLOAD_SYNC = true; \
nfcFL.nfccFL._NFA_EE_MAX_EE_SUPPORTED = \
EE_T4T_SUPPORTED + EE_UICC1_SUPPORTED + EE_UICC2_SUPPORTED + \
EE_ESE_SUPPORTED; \
break; \
case sn300u: \
CONFIGURE_FEATURELIST_NFCC(sn300u) \
nfcFL.nfccFL._NFCC_SPI_FW_DOWNLOAD_SYNC = true; \
nfcFL.nfccFL._NFA_EE_MAX_EE_SUPPORTED = \
EE_T4T_SUPPORTED + EE_UICC1_SUPPORTED + EE_UICC2_SUPPORTED + \
EE_ESE_SUPPORTED + EE_EUICC1_SUPPORTED + EE_EUICC2_SUPPORTED; \
break; \
default: \
break; \
} \
}
#define CONFIGURE_FEATURELIST_NFCC(chipType) \
{ \
nfcFL._PHDNLDNFC_USERDATA_EEPROM_OFFSET = 0x023CU; \
nfcFL._PHDNLDNFC_USERDATA_EEPROM_LEN = 0x0C80U; \
nfcFL._FW_MOBILE_MAJOR_NUMBER = FW_MOBILE_MAJOR_NUMBER_PN48AD; \
nfcFL.nfccFL._NFCC_DWNLD_MODE = NFCC_DWNLD_WITH_VEN_RESET; \
switch (chipType) { \
case pn557: \
nfcFL.nfccFL._NFCC_I2C_READ_WRITE_IMPROVEMENT = true; \
STRCPY_FW("libpn557_fw") \
STRCPY_FW_BIN("pn557") \
break; \
case sn100u: \
nfcFL.nfccFL._NFCC_DWNLD_MODE = NFCC_DWNLD_WITH_NCI_CMD; \
nfcFL.nfccFL._NFCC_I2C_READ_WRITE_IMPROVEMENT = true; \
nfcFL.nfccFL._NFCC_MIFARE_TIANJIN = false; \
nfcFL.nfccFL._NFCC_FORCE_FW_DOWNLOAD = true; \
nfcFL._FW_MOBILE_MAJOR_NUMBER = FW_MOBILE_MAJOR_NUMBER_SN100U; \
STRCPY_FW("libsn100u_fw") \
STRCPY_FW_BIN("sn100u") \
break; \
case sn220u: \
nfcFL.nfccFL._NFCC_DWNLD_MODE = NFCC_DWNLD_WITH_NCI_CMD; \
nfcFL.nfccFL._NFCC_I2C_READ_WRITE_IMPROVEMENT = true; \
nfcFL.nfccFL._NFCC_MIFARE_TIANJIN = false; \
nfcFL.nfccFL._NFCC_FORCE_FW_DOWNLOAD = true; \
nfcFL._FW_MOBILE_MAJOR_NUMBER = FW_MOBILE_MAJOR_NUMBER_SN220U; \
STRCPY_FW("libsn220u_fw") \
STRCPY_FW_BIN("sn220u") \
break; \
case pn560: \
nfcFL.nfccFL._NFCC_DWNLD_MODE = NFCC_DWNLD_WITH_NCI_CMD; \
nfcFL.nfccFL._NFCC_I2C_READ_WRITE_IMPROVEMENT = true; \
nfcFL.nfccFL._NFCC_MIFARE_TIANJIN = false; \
nfcFL.nfccFL._NFCC_FORCE_FW_DOWNLOAD = true; \
nfcFL._FW_MOBILE_MAJOR_NUMBER = FW_MOBILE_MAJOR_NUMBER_SN220U; \
STRCPY_FW("libpn560_fw") \
STRCPY_FW_BIN("pn560") \
break; \
case sn300u: \
nfcFL.nfccFL._NFCC_DWNLD_MODE = NFCC_DWNLD_WITH_NCI_CMD; \
nfcFL.nfccFL._NFCC_I2C_READ_WRITE_IMPROVEMENT = true; \
nfcFL.nfccFL._NFCC_MIFARE_TIANJIN = false; \
nfcFL.nfccFL._NFCC_FORCE_FW_DOWNLOAD = true; \
nfcFL._FW_MOBILE_MAJOR_NUMBER = FW_MOBILE_MAJOR_NUMBER_SN300U; \
STRCPY_FW("libsn300u_fw") \
STRCPY_FW_BIN("sn300u") \
break; \
default: \
nfcFL.nfccFL._NFCC_FORCE_FW_DOWNLOAD = true; \
break; \
} \
}
#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); \
}
#define STRCPY_FW(str1) \
{ \
nfcFL._FW_LIB_PATH.clear(); \
nfcFL._FW_LIB_PATH.append(FW_LIB_ROOT_DIR); \
nfcFL._FW_LIB_PATH.append(str1); \
nfcFL._FW_LIB_PATH.append(FW_LIB_EXTENSION); \
}
#endif