You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
418 lines
13 KiB
418 lines
13 KiB
/*
|
|
* Copyright (C) 2010-2021 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.
|
|
*/
|
|
#ifndef _PHNXPNCIHAL_H_
|
|
#define _PHNXPNCIHAL_H_
|
|
|
|
#include <hardware/nfc.h>
|
|
#include <phNxpNciHal_utils.h>
|
|
#include "NxpMfcReader.h"
|
|
#include "NxpNfcCapability.h"
|
|
#ifdef NXP_BOOTTIME_UPDATE
|
|
#include "eSEClientIntf.h"
|
|
#endif
|
|
#include "eSEClientExtns.h"
|
|
#include "phNxpNciHal_IoctlOperations.h"
|
|
|
|
#include <vendor/nxp/nxpnfc/2.0/types.h>
|
|
|
|
/********************* Definitions and structures *****************************/
|
|
#define MAX_RETRY_COUNT 5
|
|
#define NCI_MAX_DATA_LEN 300
|
|
#define NCI_POLL_DURATION 500
|
|
#define HAL_NFC_ENABLE_I2C_FRAGMENTATION_EVT 0x07
|
|
#undef P2P_PRIO_LOGIC_HAL_IMP
|
|
#define NCI_VERSION_2_0 0x20
|
|
#define NCI_VERSION_1_1 0x11
|
|
#define NCI_VERSION_1_0 0x10
|
|
#define NCI_VERSION_UNKNOWN 0x00
|
|
#define NXP_AUTH_TIMEOUT_BUF_LEN 0x04
|
|
#define SN1XX_ROM_VERSION 0x01
|
|
#define SN1XX_FW_MAJOR_VERSION 0x10
|
|
#define SN2XX_ROM_VERSION 0x01
|
|
#define SN2XX_FW_MAJOR_VERSION 0x01
|
|
|
|
/*Mem alloc with 8 byte alignment*/
|
|
#define size_align(sz) ((((sz)-1) | 7) + 1)
|
|
#define nxp_malloc(size) malloc(size_align((size)))
|
|
|
|
typedef void(phNxpNciHal_control_granted_callback_t)();
|
|
|
|
/*ROM CODE VERSION FW*/
|
|
#define FW_MOBILE_ROM_VERSION_PN551 0x10
|
|
#define FW_MOBILE_ROM_VERSION_PN553 0x11
|
|
#define FW_MOBILE_ROM_VERSION_PN557 0x12
|
|
|
|
#define FW_DBG_REASON_AVAILABLE (0xA3)
|
|
|
|
#define HOST_ID 0x00
|
|
#define ESE_ID 0x01
|
|
#define UICC1_ID 0x02
|
|
#define UICC2_ID 0x04
|
|
#define UICC3_ID 0x08
|
|
/* NCI Data */
|
|
|
|
//#define NCI_MT_CMD 0x20
|
|
//#define NCI_MT_RSP 0x40
|
|
//#define NCI_MT_NTF 0x60
|
|
|
|
#define CORE_RESET_TRIGGER_TYPE_CORE_RESET_CMD_RECEIVED 0x02
|
|
#define CORE_RESET_TRIGGER_TYPE_POWERED_ON 0x01
|
|
#define NCI2_0_CORE_RESET_TRIGGER_TYPE_OVER_TEMPERATURE ((uint8_t)0xA1)
|
|
#define CORE_RESET_TRIGGER_TYPE_UNRECOVERABLE_ERROR 0x00
|
|
#define CORE_RESET_TRIGGER_TYPE_FW_ASSERT ((uint8_t)0xA0)
|
|
#define CORE_RESET_TRIGGER_TYPE_WATCHDOG_RESET ((uint8_t)0xA3)
|
|
#define CORE_RESET_TRIGGER_TYPE_INPUT_CLOCK_LOST ((uint8_t)0xA4)
|
|
//#define NCI_MSG_CORE_RESET 0x00
|
|
//#define NCI_MSG_CORE_INIT 0x01
|
|
#define NCI_MT_MASK 0xE0
|
|
#define NCI_OID_MASK 0x3F
|
|
#if (NXP_EXTNS == TRUE)
|
|
/* GID: Group Identifier (byte 0) */
|
|
#define NCI_GID_MASK 0x0F
|
|
#define ORIG_NXPHAL 0x01
|
|
#define ORIG_LIBNFC 0x02
|
|
#endif
|
|
#define NXP_PROPCMD_GID 0x2F
|
|
#define NXP_FLUSH_SRAM_AO_TO_FLASH 0x21
|
|
#define NXP_CORE_GET_CONFIG_CMD 0x03
|
|
#define NXP_CORE_SET_CONFIG_CMD 0x02
|
|
#define NXP_MAX_CONFIG_STRING_LEN 260
|
|
#define NCI_HEADER_SIZE 3
|
|
|
|
typedef struct nci_data {
|
|
uint16_t len;
|
|
uint8_t p_data[NCI_MAX_DATA_LEN];
|
|
} nci_data_t;
|
|
|
|
typedef enum {
|
|
HAL_STATUS_CLOSE = 0,
|
|
HAL_STATUS_OPEN,
|
|
HAL_STATUS_MIN_OPEN
|
|
} phNxpNci_HalStatus;
|
|
|
|
typedef enum {
|
|
HAL_NFC_FW_UPDATE_INVALID = 0x00,
|
|
HAL_NFC_FW_UPDATE_START,
|
|
HAL_NFC_FW_UPDATE_SCUCCESS,
|
|
HAL_NFC_FW_UPDATE_FAILED,
|
|
} HalNfcFwUpdateStatus;
|
|
|
|
typedef enum {
|
|
GPIO_UNKNOWN = 0x00,
|
|
GPIO_STORE = 0x01,
|
|
GPIO_STORE_DONE = 0x02,
|
|
GPIO_RESTORE = 0x10,
|
|
GPIO_RESTORE_DONE = 0x20,
|
|
GPIO_CLEAR = 0xFF
|
|
} phNxpNciHal_GpioInfoState;
|
|
#ifdef NXP_BOOTTIME_UPDATE
|
|
extern ese_update_state_t ese_update;
|
|
#endif
|
|
typedef struct phNxpNciGpioInfo {
|
|
phNxpNciHal_GpioInfoState state;
|
|
uint8_t values[2];
|
|
} phNxpNciGpioInfo_t;
|
|
|
|
/* Macros to enable and disable extensions */
|
|
#define HAL_ENABLE_EXT() (nxpncihal_ctrl.hal_ext_enabled = 1)
|
|
#define HAL_DISABLE_EXT() (nxpncihal_ctrl.hal_ext_enabled = 0)
|
|
typedef struct phNxpNciInfo {
|
|
uint8_t nci_version;
|
|
bool_t wait_for_ntf;
|
|
uint8_t lastResetNtfReason;
|
|
} phNxpNciInfo_t;
|
|
/* NCI Control structure */
|
|
typedef struct phNxpNciHal_Control {
|
|
phNxpNci_HalStatus halStatus; /* Indicate if hal is open or closed */
|
|
pthread_t client_thread; /* Integration thread handle */
|
|
uint8_t thread_running; /* Thread running if set to 1, else set to 0 */
|
|
phLibNfc_sConfig_t gDrvCfg; /* Driver config data */
|
|
|
|
/* Rx data */
|
|
uint8_t* p_rx_data;
|
|
uint16_t rx_data_len;
|
|
|
|
/* Rx data */
|
|
uint8_t* p_rx_ese_data;
|
|
uint16_t rx_ese_data_len;
|
|
|
|
/* libnfc-nci callbacks */
|
|
nfc_stack_callback_t* p_nfc_stack_cback;
|
|
nfc_stack_data_callback_t* p_nfc_stack_data_cback;
|
|
|
|
/* control granted callback */
|
|
phNxpNciHal_control_granted_callback_t* p_control_granted_cback;
|
|
|
|
/* HAL open status */
|
|
bool_t hal_open_status;
|
|
|
|
/* HAL extensions */
|
|
uint8_t hal_ext_enabled;
|
|
|
|
/* Waiting semaphore */
|
|
phNxpNciHal_Sem_t ext_cb_data;
|
|
sem_t syncSpiNfc;
|
|
|
|
uint16_t cmd_len;
|
|
uint8_t p_cmd_data[NCI_MAX_DATA_LEN];
|
|
uint16_t rsp_len;
|
|
uint8_t p_rsp_data[NCI_MAX_DATA_LEN];
|
|
|
|
/* retry count used to force download */
|
|
uint16_t retry_cnt;
|
|
uint8_t read_retry_cnt;
|
|
phNxpNciInfo_t nci_info;
|
|
uint8_t hal_boot_mode;
|
|
bool_t fwdnld_mode_reqd;
|
|
/* to store and restore gpio values */
|
|
phNxpNciGpioInfo_t phNxpNciGpioInfo;
|
|
tNFC_chipType chipType;
|
|
} phNxpNciHal_Control_t;
|
|
|
|
typedef struct {
|
|
uint8_t fw_update_reqd;
|
|
uint8_t rf_update_reqd;
|
|
} phNxpNciHal_FwRfupdateInfo_t;
|
|
|
|
typedef struct phNxpNciClock {
|
|
bool_t isClockSet;
|
|
uint8_t p_rx_data[20];
|
|
bool_t issetConfig;
|
|
} phNxpNciClock_t;
|
|
|
|
typedef struct phNxpNciRfSetting {
|
|
bool_t isGetRfSetting;
|
|
uint8_t p_rx_data[20];
|
|
} phNxpNciRfSetting_t;
|
|
|
|
typedef struct phNxpNciMwEepromArea {
|
|
bool_t isGetEepromArea;
|
|
uint8_t p_rx_data[32];
|
|
} phNxpNciMwEepromArea_t;
|
|
|
|
enum { SE_TYPE_ESE, SE_TYPE_UICC, SE_TYPE_UICC2, NUM_SE_TYPES };
|
|
|
|
typedef void (*fpVerInfoStoreInEeprom_t)();
|
|
typedef int (*fpVerifyCscEfsTest_t)(char* nfcc_csc, char* rffilepath,
|
|
char* fwfilepath);
|
|
typedef int (*fpRegRfFwDndl_t)(uint8_t* fw_update_req, uint8_t* rf_update_req,
|
|
uint8_t skipEEPROMRead);
|
|
typedef int (*fpPropConfCover_t)(bool attached, int type);
|
|
void phNxpNciHal_initializeRegRfFwDnld();
|
|
void phNxpNciHal_deinitializeRegRfFwDnld();
|
|
/*set config management*/
|
|
|
|
#define TOTAL_DURATION 0x00
|
|
#define ATR_REQ_GEN_BYTES_POLL 0x29
|
|
#define ATR_REQ_GEN_BYTES_LIS 0x61
|
|
#define LEN_WT 0x60
|
|
|
|
/*Whenever a new get cfg need to be sent,
|
|
* array must be updated with defined config type*/
|
|
static const uint8_t get_cfg_arr[] = {TOTAL_DURATION, ATR_REQ_GEN_BYTES_POLL,
|
|
ATR_REQ_GEN_BYTES_LIS, LEN_WT};
|
|
|
|
//#define NXP_NFC_SET_CONFIG_PARAM_EXT 0xA0
|
|
//#define NXP_NFC_PARAM_ID_SWP2 0xD4
|
|
//#define NXP_NFC_PARAM_ID_SWPUICC3 0xDC
|
|
typedef enum {
|
|
EEPROM_RF_CFG,
|
|
EEPROM_FW_DWNLD,
|
|
EEPROM_WIREDMODE_RESUME_TIMEOUT,
|
|
EEPROM_ESE_SVDD_POWER,
|
|
EEPROM_ESE_POWER_EXT_PMU,
|
|
EEPROM_PROP_ROUTING,
|
|
EEPROM_ESE_SESSION_ID,
|
|
EEPROM_SWP1_INTF,
|
|
EEPROM_SWP1A_INTF,
|
|
EEPROM_SWP2_INTF,
|
|
EEPROM_FLASH_UPDATE,
|
|
EEPROM_AUTH_CMD_TIMEOUT,
|
|
EEPROM_GUARD_TIMER,
|
|
EEPROM_T4T_NFCEE_ENABLE,
|
|
EEPROM_AUTONOMOUS_MODE,
|
|
EEPROM_CE_PHONE_OFF_CFG,
|
|
EEPROM_ENABLE_VEN_CFG,
|
|
EEPROM_ISODEP_MERGE_SAK,
|
|
EEPROM_SRD_TIMEOUT,
|
|
EEPROM_UICC1_SESSION_ID,
|
|
EEPROM_UICC2_SESSION_ID,
|
|
} phNxpNci_EEPROM_request_type_t;
|
|
|
|
typedef struct phNxpNci_EEPROM_info {
|
|
uint8_t request_mode;
|
|
phNxpNci_EEPROM_request_type_t request_type;
|
|
uint8_t update_mode;
|
|
uint8_t* buffer;
|
|
uint8_t bufflen;
|
|
} phNxpNci_EEPROM_info_t;
|
|
|
|
typedef struct phNxpNci_getCfg_info {
|
|
bool_t isGetcfg;
|
|
uint8_t total_duration[4];
|
|
uint8_t total_duration_len;
|
|
uint8_t atr_req_gen_bytes[48];
|
|
uint8_t atr_req_gen_bytes_len;
|
|
uint8_t atr_res_gen_bytes[48];
|
|
uint8_t atr_res_gen_bytes_len;
|
|
uint8_t pmid_wt[3];
|
|
uint8_t pmid_wt_len;
|
|
uint8_t auth_cmd_timeout[NXP_AUTH_TIMEOUT_BUF_LEN];
|
|
uint8_t auth_cmd_timeoutlen;
|
|
} phNxpNci_getCfg_info_t;
|
|
typedef enum {
|
|
NFC_FORUM_PROFILE,
|
|
EMV_CO_PROFILE,
|
|
SRD_PROFILE,
|
|
INVALID_PROFILe
|
|
} phNxpNciProfile_t;
|
|
/* NXP Poll Profile control structure */
|
|
typedef struct phNxpNciProfile_Control {
|
|
phNxpNciProfile_t profile_type;
|
|
uint8_t bClkSrcVal; /* Holds the System clock source read from config file */
|
|
uint8_t
|
|
bClkFreqVal; /* Holds the System clock frequency read from config file */
|
|
uint8_t bTimeout; /* Holds the Timeout Value */
|
|
uint8_t clkReqDelay; /* Holds default delay time before start clock request*/
|
|
} phNxpNciProfile_Control_t;
|
|
|
|
/* Internal messages to handle callbacks */
|
|
#define NCI_HAL_OPEN_CPLT_MSG 0x411
|
|
#define NCI_HAL_CLOSE_CPLT_MSG 0x412
|
|
#define NCI_HAL_POST_INIT_CPLT_MSG 0x413
|
|
#define NCI_HAL_PRE_DISCOVER_CPLT_MSG 0x414
|
|
#define NCI_HAL_ERROR_MSG 0x415
|
|
#define NCI_HAL_HCI_NETWORK_RESET_MSG 0x416
|
|
#define NCI_HAL_RX_MSG 0xF01
|
|
#define HAL_NFC_FW_UPDATE_STATUS_EVT 0x0A
|
|
|
|
#define NCIHAL_CMD_CODE_LEN_BYTE_OFFSET (2U)
|
|
#define NCIHAL_CMD_CODE_BYTE_LEN (3U)
|
|
|
|
/******************** NCI HAL exposed functions *******************************/
|
|
int phNxpNciHal_check_ncicmd_write_window(uint16_t cmd_len, uint8_t* p_cmd);
|
|
void phNxpNciHal_request_control(void);
|
|
void phNxpNciHal_release_control(void);
|
|
NFCSTATUS phNxpNciHal_send_get_cfgs();
|
|
int phNxpNciHal_write_unlocked(uint16_t data_len, const uint8_t* p_data,
|
|
int origin);
|
|
NFCSTATUS request_EEPROM(phNxpNci_EEPROM_info_t* mEEPROM_info);
|
|
int phNxpNciHal_check_config_parameter();
|
|
NFCSTATUS phNxpNciHal_fw_download(uint8_t seq_handler_offset = 0,
|
|
bool bIsNfccDlState = false);
|
|
NFCSTATUS phNxpNciHal_nfcc_core_reset_init(bool keep_config = false);
|
|
int phNxpNciHal_fw_mw_ver_check();
|
|
NFCSTATUS phNxpNciHal_check_clock_config(void);
|
|
NFCSTATUS phNxpNciHal_china_tianjin_rf_setting(void);
|
|
NFCSTATUS phNxpNciHal_CheckValidFwVersion(void);
|
|
|
|
NFCSTATUS phNxpNciHal_send_nfcee_pwr_cntl_cmd(uint8_t type);
|
|
/*******************************************************************************
|
|
**
|
|
** 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);
|
|
|
|
/******************************************************************************
|
|
* Function phNxpNciHal_read_and_update_se_state
|
|
*
|
|
* Description This will read NFCEE status from system properties
|
|
* and update to NFCC to enable/disable.
|
|
*
|
|
* Returns none
|
|
*
|
|
******************************************************************************/
|
|
void phNxpNciHal_read_and_update_se_state();
|
|
|
|
/******************************************************************************
|
|
* Function phNxpNciHal_Abort
|
|
*
|
|
* Description This will post the message to the upper layer
|
|
* using the callback p_nfc_stack_cback_backup.
|
|
*
|
|
* Returns none
|
|
*
|
|
******************************************************************************/
|
|
extern bool phNxpNciHal_Abort();
|
|
/******************************************************************************
|
|
* Function phNxpNciHal_read_fw_dw_status
|
|
*
|
|
* Description This will read the value of fw download status flag
|
|
* from eeprom
|
|
*
|
|
* Parameters value - this parameter will be updated with the flag
|
|
* value from eeprom.
|
|
*
|
|
* Returns status of the read
|
|
*
|
|
******************************************************************************/
|
|
NFCSTATUS phNxpNciHal_read_fw_dw_status(uint8_t& value);
|
|
|
|
/******************************************************************************
|
|
* Function phNxpNciHal_write_fw_dw_status
|
|
*
|
|
* Description This will update value of fw download status flag
|
|
* to eeprom
|
|
*
|
|
* Parameters value - this value will be updated to eeprom flag.
|
|
*
|
|
* Returns status of the write
|
|
*
|
|
******************************************************************************/
|
|
NFCSTATUS phNxpNciHal_write_fw_dw_status(uint8_t value);
|
|
|
|
/******************************************************************************
|
|
* Function phNxpNciHal_set_uicc_hci_params
|
|
*
|
|
* Description This will update value of uicc session status to store flag
|
|
* to eeprom
|
|
*
|
|
* Parameters value - this value will be updated to eeprom flag.
|
|
*
|
|
* Returns status of the write
|
|
*
|
|
******************************************************************************/
|
|
NFCSTATUS
|
|
phNxpNciHal_set_uicc_hci_params(std::vector<uint8_t>& ptr, uint8_t bufflen,
|
|
phNxpNci_EEPROM_request_type_t uiccType);
|
|
|
|
/******************************************************************************
|
|
* Function phNxpNciHal_get_uicc_hci_params
|
|
*
|
|
* Description This will read the value of fw download status flag
|
|
* from eeprom
|
|
*
|
|
* Parameters value - this parameter will be updated with the flag
|
|
* value from eeprom.
|
|
*
|
|
* Returns status of the read
|
|
*
|
|
******************************************************************************/
|
|
NFCSTATUS
|
|
phNxpNciHal_get_uicc_hci_params(std::vector<uint8_t>& ptr, uint8_t bufflen,
|
|
phNxpNci_EEPROM_request_type_t uiccType);
|
|
|
|
#endif /* _PHNXPNCIHAL_H_ */
|