/******************************************************************************
*
* Copyright (C) 2003-2014 Broadcom Corporation
*
* 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.
*
******************************************************************************/
/******************************************************************************
*
* This is the private interface file for NFA_RW
*
******************************************************************************/
#ifndef NFA_RW_INT_H
#define NFA_RW_INT_H
#include "nfa_sys.h"
#include "nfa_api.h"
#include "nfa_rw_api.h"
#include "nfc_api.h"
#include "rw_api.h"
/*****************************************************************************
** Constants and data types
*****************************************************************************/
/* Interval for performing presence check (in ms) */
#ifndef NFA_RW_PRESENCE_CHECK_INTERVAL
#define NFA_RW_PRESENCE_CHECK_INTERVAL 750
#endif
/* TLV detection status */
#define NFA_RW_TLV_DETECT_ST_OP_NOT_STARTED 0x00 /* No Tlv detected */
#define NFA_RW_TLV_DETECT_ST_LOCK_TLV_OP_COMPLETE 0x01 /* Lock control tlv detected */
#define NFA_RW_TLV_DETECT_ST_MEM_TLV_OP_COMPLETE 0x02 /* Memory control tlv detected */
#define NFA_RW_TLV_DETECT_ST_COMPLETE 0x03 /* Both Lock and Memory control Tlvs are detected */
typedef UINT8 tNFA_RW_TLV_ST;
/* RW events */
enum
{
NFA_RW_OP_REQUEST_EVT = NFA_SYS_EVT_START (NFA_ID_RW),
NFA_RW_ACTIVATE_NTF_EVT,
NFA_RW_DEACTIVATE_NTF_EVT,
NFA_RW_PRESENCE_CHECK_TICK_EVT,
NFA_RW_PRESENCE_CHECK_TIMEOUT_EVT,
NFA_RW_MAX_EVT
};
/* BTA_RW operations */
enum
{
NFA_RW_OP_DETECT_NDEF,
NFA_RW_OP_READ_NDEF,
NFA_RW_OP_WRITE_NDEF,
NFA_RW_OP_PRESENCE_CHECK,
NFA_RW_OP_FORMAT_TAG,
NFA_RW_OP_SEND_RAW_FRAME,
/* Exclusive Type-1,Type-2 tag operations */
NFA_RW_OP_DETECT_LOCK_TLV,
NFA_RW_OP_DETECT_MEM_TLV,
NFA_RW_OP_SET_TAG_RO,
/* Exclusive Type-1 tag operations */
NFA_RW_OP_T1T_RID,
NFA_RW_OP_T1T_RALL,
NFA_RW_OP_T1T_READ,
NFA_RW_OP_T1T_WRITE,
NFA_RW_OP_T1T_RSEG,
NFA_RW_OP_T1T_READ8,
NFA_RW_OP_T1T_WRITE8,
/* Exclusive Type-2 tag operations */
NFA_RW_OP_T2T_READ,
NFA_RW_OP_T2T_WRITE,
NFA_RW_OP_T2T_SECTOR_SELECT,
/* Exclusive Type-3 tag operations */
NFA_RW_OP_T3T_READ,
NFA_RW_OP_T3T_WRITE,
NFA_RW_OP_T3T_GET_SYSTEM_CODES,
/* Exclusive ISO 15693 tag operations */
NFA_RW_OP_I93_INVENTORY,
NFA_RW_OP_I93_STAY_QUIET,
NFA_RW_OP_I93_READ_SINGLE_BLOCK,
NFA_RW_OP_I93_WRITE_SINGLE_BLOCK,
NFA_RW_OP_I93_LOCK_BLOCK,
NFA_RW_OP_I93_READ_MULTI_BLOCK,
NFA_RW_OP_I93_WRITE_MULTI_BLOCK,
NFA_RW_OP_I93_SELECT,
NFA_RW_OP_I93_RESET_TO_READY,
NFA_RW_OP_I93_WRITE_AFI,
NFA_RW_OP_I93_LOCK_AFI,
NFA_RW_OP_I93_WRITE_DSFID,
NFA_RW_OP_I93_LOCK_DSFID,
NFA_RW_OP_I93_GET_SYS_INFO,
NFA_RW_OP_I93_GET_MULTI_BLOCK_STATUS,
NFA_RW_OP_MAX
};
typedef UINT8 tNFA_RW_OP;
/* Enumeration of parameter structios for nfa_rw operations */
/* NFA_RW_OP_WRITE_NDEF params */
typedef struct
{
UINT32 len;
UINT8 *p_data;
} tNFA_RW_OP_PARAMS_WRITE_NDEF;
/* NFA_RW_OP_SEND_RAW_FRAME params */
typedef struct
{
BT_HDR *p_data;
} tNFA_RW_OP_PARAMS_SEND_RAW_FRAME;
/* NFA_RW_OP_SET_TAG_RO params */
typedef struct
{
BOOLEAN b_hard_lock;
} tNFA_RW_OP_PARAMS_CONFIG_READ_ONLY;
/* NFA_RW_OP_T1T_READ params */
typedef struct
{
UINT8 segment_number;
UINT8 block_number;
UINT8 index;
} tNFA_RW_OP_PARAMS_T1T_READ;
/* NFA_RW_OP_T1T_WRITE_E8,NFA_RW_OP_T1T_WRITE_NE8
NFA_RW_OP_T1T_WRITE_E, NFA_RW_OP_T1T_WRITE_NE params */
typedef struct
{
BOOLEAN b_erase;
UINT8 block_number;
UINT8 index;
UINT8 p_block_data[8];
} tNFA_RW_OP_PARAMS_T1T_WRITE;
/* NFA_RW_OP_T2T_READ params */
typedef struct
{
UINT8 block_number;
} tNFA_RW_OP_PARAMS_T2T_READ;
/* NFA_RW_OP_T2T_WRITE params */
typedef struct
{
UINT8 block_number;
UINT8 p_block_data[4];
} tNFA_RW_OP_PARAMS_T2T_WRITE;
/* NFA_RW_OP_T2T_SECTOR_SELECT params */
typedef struct
{
UINT8 sector_number;
} tNFA_RW_OP_PARAMS_T2T_SECTOR_SELECT;
/* NFA_RW_OP_T3T_READ params */
typedef struct
{
UINT8 num_blocks;
tNFA_T3T_BLOCK_DESC *p_block_desc;
} tNFA_RW_OP_PARAMS_T3T_READ;
/* NFA_RW_OP_T3T_WRITE params */
typedef struct
{
UINT8 num_blocks;
tNFA_T3T_BLOCK_DESC *p_block_desc;
UINT8 *p_block_data;
} tNFA_RW_OP_PARAMS_T3T_WRITE;
/* NFA_RW_OP_I93_XXX params */
typedef struct
{
BOOLEAN uid_present;
UINT8 uid[I93_UID_BYTE_LEN];
BOOLEAN afi_present;
UINT8 afi;
UINT8 dsfid;
UINT16 first_block_number;
UINT16 number_blocks;
UINT8 *p_data;
} tNFA_RW_OP_PARAMS_I93_CMD;
/* Union of params for all reader/writer operations */
typedef union
{
/* params for NFA_RW_OP_WRITE_NDEF */
tNFA_RW_OP_PARAMS_WRITE_NDEF write_ndef;
/* params for NFA_RW_OP_SEND_RAW_FRAME */
tNFA_RW_OP_PARAMS_SEND_RAW_FRAME send_raw_frame;
/* params for NFA_RW_OP_SET_TAG_RO */
tNFA_RW_OP_PARAMS_CONFIG_READ_ONLY set_readonly;
/* params for NFA_RW_OP_T2T_READ and NFA_RW_OP_T1T_WRITE */
tNFA_RW_OP_PARAMS_T1T_READ t1t_read;
tNFA_RW_OP_PARAMS_T1T_WRITE t1t_write;
/* params for NFA_RW_OP_T2T_READ,NFA_RW_OP_T2T_WRITE and NFA_RW_OP_T2T_SECTOR_SELECT */
tNFA_RW_OP_PARAMS_T2T_READ t2t_read;
tNFA_RW_OP_PARAMS_T2T_WRITE t2t_write;
tNFA_RW_OP_PARAMS_T2T_SECTOR_SELECT t2t_sector_select;
/* params for NFA_RW_OP_T3T_READ and NFA_RW_OP_T3T_WRITE */
tNFA_RW_OP_PARAMS_T3T_READ t3t_read;
tNFA_RW_OP_PARAMS_T3T_WRITE t3t_write;
/* params for NFA_RW_OP_PRESENCE_CHECK */
tNFA_RW_PRES_CHK_OPTION option;
/* params for ISO 15693 */
tNFA_RW_OP_PARAMS_I93_CMD i93_cmd;
} tNFA_RW_OP_PARAMS;
/* data type for NFA_RW_op_req_EVT */
typedef struct
{
BT_HDR hdr;
tNFA_RW_OP op; /* NFA RW operation */
tNFA_RW_OP_PARAMS params;
} tNFA_RW_OPERATION;
/* data type for NFA_RW_ACTIVATE_NTF */
typedef struct
{
BT_HDR hdr;
tNFC_ACTIVATE_DEVT *p_activate_params; /* Data from NFC_ACTIVATE_DEVT */
BOOLEAN excl_rf_not_active; /* TRUE if not in exclusive RF mode */
} tNFA_RW_ACTIVATE_NTF;
/* union of all data types */
typedef union
{
/* GKI event buffer header */
BT_HDR hdr;
tNFA_RW_OPERATION op_req;
tNFA_RW_ACTIVATE_NTF activate_ntf;
} tNFA_RW_MSG;
/* NDEF detection status */
enum
{
NFA_RW_NDEF_ST_UNKNOWN =0, /* NDEF detection not performed yet */
NFA_RW_NDEF_ST_TRUE, /* Tag is NDEF */
NFA_RW_NDEF_ST_FALSE /* Tag is not NDEF */
};
typedef UINT8 tNFA_RW_NDEF_ST;
/* flags for RW control block */
#define NFA_RW_FL_NOT_EXCL_RF_MODE 0x01 /* Activation while not in exclusive RF mode */
#define NFA_RW_FL_AUTO_PRESENCE_CHECK_BUSY 0x02 /* Waiting for response from tag for auto-presence check */
#define NFA_RW_FL_TAG_IS_READONLY 0x04 /* Read only tag */
#define NFA_RW_FL_ACTIVATION_NTF_PENDING 0x08 /* Busy retrieving additional tag information */
#define NFA_RW_FL_API_BUSY 0x10 /* Tag operation is in progress */
#define NFA_RW_FL_ACTIVATED 0x20 /* Tag is been activated */
#define NFA_RW_FL_NDEF_OK 0x40 /* NDEF DETECTed OK */
/* NFA RW control block */
typedef struct
{
tNFA_RW_OP cur_op; /* Current operation */
TIMER_LIST_ENT tle; /* list entry for nfa_rw timer */
tNFA_RW_MSG *p_pending_msg; /* Pending API (if busy performing presence check) */
/* Tag info */
tNFC_PROTOCOL protocol;
tNFC_INTF_TYPE intf_type;
UINT8 pa_sel_res;
tNFC_RF_TECH_N_MODE activated_tech_mode; /* activated technology and mode */
BOOLEAN b_hard_lock;
tNFA_RW_MSG *p_buffer_rw_msg; /* Buffer to hold incoming cmd while reading tag id */
/* TLV info */
tNFA_RW_TLV_ST tlv_st; /* TLV detection status */
/* NDEF info */
tNFA_RW_NDEF_ST ndef_st; /* NDEF detection status */
UINT32 ndef_max_size; /* max number of bytes available for NDEF data */
UINT32 ndef_cur_size; /* current size of stored NDEF data (in bytes) */
UINT8 *p_ndef_buf;
UINT32 ndef_rd_offset; /* current read-offset of incoming NDEF data */
/* Current NDEF Write info */
UINT8 *p_ndef_wr_buf; /* Pointer to NDEF data being written */
UINT32 ndef_wr_len; /* Length of NDEF data being written */
/* Reactivating type 2 tag after NACK rsp */
tRW_EVENT halt_event; /* Event ID from stack after NACK response */
tRW_DATA rw_data; /* Event Data from stack after NACK response */
BOOLEAN skip_dyn_locks; /* To skip reading dynamic locks during NDEF Detect */
/* Flags (see defintions for NFA_RW_FL_* ) */
UINT8 flags;
/* ISO 15693 tag memory information */
UINT16 i93_afi_location;
UINT8 i93_dsfid;
UINT8 i93_block_size;
UINT16 i93_num_block;
UINT8 i93_uid[I93_UID_BYTE_LEN];
} tNFA_RW_CB;
extern tNFA_RW_CB nfa_rw_cb;
/* type definition for action functions */
typedef BOOLEAN (*tNFA_RW_ACTION) (tNFA_RW_MSG *p_data);
/* Internal nfa_rw function prototypes */
extern void nfa_rw_stop_presence_check_timer (void);
/* Action function prototypes */
extern BOOLEAN nfa_rw_handle_op_req (tNFA_RW_MSG *p_data);
extern BOOLEAN nfa_rw_activate_ntf (tNFA_RW_MSG *p_data);
extern BOOLEAN nfa_rw_deactivate_ntf (tNFA_RW_MSG *p_data);
extern BOOLEAN nfa_rw_presence_check_tick (tNFA_RW_MSG *p_data);
extern BOOLEAN nfa_rw_presence_check_timeout (tNFA_RW_MSG *p_data);
extern void nfa_rw_handle_sleep_wakeup_rsp (tNFC_STATUS status);
extern void nfa_rw_handle_presence_check_rsp (tNFC_STATUS status);
extern void nfa_rw_command_complete (void);
extern BOOLEAN nfa_rw_handle_event (BT_HDR *p_msg);
extern void nfa_rw_free_ndef_rx_buf (void);
extern void nfa_rw_sys_disable (void);
#endif /* NFA_DM_INT_H */