/******************************************************************************
*
* 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 the NFA DTA
*
******************************************************************************/
#ifndef NFA_DTA_INT_H
#define NFA_DTA_INT_H
#include "ce_api.h"
#include "nfa_dta_api.h"
#include "nfa_sys.h"
#include "nfa_sys_int.h"
#include "nfc_api.h"
#include "rw_api.h"
#if (NFA_DTA_INCLUDED == TRUE)
/*****************************************************************************
** DTA definitions
*****************************************************************************/
#define NFA_DTA_PATTERN_NUMBER_INVALID 0xFFFF
#define NFA_DTA_PATTERN_NUMBER_LLCP_CONNECT_BY_SAP 0x1200
#define NFA_DTA_PATTERN_NUMBER_LLCP_CONNECT_BY_SN 0x1240
#define NFA_DTA_PATTERN_NUMBER_LLCP_CONNECT_BY_SNL 0x1280
#define NFA_DTA_PATTERN_NUMBER_SNEP_SERVER_ONLY 0x1300
#define NFA_DTA_PATTERN_NUMBER_SNEP_DEFAULT_PUT_SHORT_NDEF 0x1301
#define NFA_DTA_PATTERN_NUMBER_SNEP_DEFAULT_PUT_LONG_NDEF 0x1302
#define NFA_DTA_PATTERN_NUMBER_SNEP_EXTENDED_GET 0x1303
#define NFA_DTA_DISCOVER_PARAMS_MAX 6
/* Header length for long NDEF text message */
#define NDEF_WKT_TEXT_HDR_LEN 7
/* Size of NDEF message for T3T write-tests ([DTA] $5.5.6) */
#define NFA_DTA_T3T_WRITE_NDEF_SIZE 192
/* System code to use for T3T Listen mode tests */
#define NFA_DTA_T3T_LISTEN_SYSTEMCODE 0xBABE
/* Maximum protocol preference rank */
#define NFA_PROTOCOL_RANK_INVALID 0xFF
#define NFA_DTA_SCRATCH_BUF_SIZE T3T_MSG_BLOCKSIZE
#ifndef NFA_DTA_DEFAULT_CO_OUT_DSAP
/* Default SAP[LT,CO-OUT-DEST] if SDP was not performed to get SAP from the LT
*/
#define NFA_DTA_DEFAULT_CO_OUT_DSAP 0x12
#endif
/*****************************************************************************
* DTA state machine definitions
*****************************************************************************/
typedef struct {
bool tp_continue; /* NFA_DTA_CFG_TP_CONTINUE */
tNFA_DTA_FL_POLL_LISTEN poll_listen; /* NFA_DTA_CFG_POLL_LISTEN */
bool t4at_nfcdep_priority; /* NFA_DTA_CFG_T4AT_NFCDEP_PRIORITY */
bool reactivation; /* NFA_DTA_CFG_REACTIVATION */
uint16_t total_duration; /* NFA_DTA_CFG_TOTAL_DURATION */
tNFA_DTA_EMVCO_PCD_MODE emvco_pcd_mode; /* NFA_DTA_CFG_EMVCO_PCD */
} tNFA_DTA_CONFIG;
/*****************************************************************************
* DTA state machine definitions
*****************************************************************************/
/* DTA events */
enum {
/* device manager local device API events */
NFA_DTA_API_ENABLE_EVT = NFA_SYS_EVT_START(NFA_ID_DTA),
NFA_DTA_API_DISABLE_EVT,
NFA_DTA_API_CONFIG_EVT,
NFA_DTA_API_START_EVT,
NFA_DTA_API_STOP_EVT,
NFA_DTA_ACTIVATE_EVT,
NFA_DTA_DEACTIVATE_EVT,
NFA_DTA_DATA_CBACK_EVT,
NFA_DTA_MAX_EVT
};
/* data type for NFA_DTA_API_ENABLE_EVT */
typedef struct {
NFC_HDR hdr;
bool auto_start;
tNFA_DTA_CBACK* p_cback;
} tNFA_DTA_API_ENABLE;
/* data type for NFA_DTA_API_START_EVT */
typedef struct {
NFC_HDR hdr;
uint16_t pattern_number;
uint8_t tlv_len;
uint8_t* p_tlv_params;
} tNFA_DTA_API_START;
/* data type for NFA_DTA_API_CONFIG */
typedef struct {
NFC_HDR hdr;
tNFA_DTA_CFG_ITEM item;
tNFA_DTA_CFG cfg_data;
} tNFA_DTA_API_CONFIG;
/* data type for NFA_DTA_DATA_CBACK_EVT */
typedef struct {
uint8_t event;
tRW_DATA data;
} tNFA_DTA_RW_DATA;
typedef struct {
uint8_t event;
tCE_DATA data;
} tNFA_DTA_CE_DATA;
typedef struct {
tNFC_CONN_EVT event;
tNFC_CONN data;
} tNFA_DTA_NFCDEP_DATA;
enum { NFA_DTA_LLCP_CONNECT_CO_ECHO_OUT, NFA_DTA_LLCP_DISCONNECT_CO_ECHO_OUT };
typedef uint8_t tNFA_DTA_LLCP_EVT;
enum {
NFA_DTA_RW_DATA,
NFA_DTA_CE_DATA,
NFA_DTA_NFCDEP_DATA,
NFA_DTA_LLCP_DATA
};
typedef uint8_t tNFA_DTA_DATA_TYPE;
typedef struct {
NFC_HDR hdr;
tNFA_DTA_DATA_TYPE type;
union {
tNFA_DTA_RW_DATA rw;
tNFA_DTA_CE_DATA ce;
tNFA_DTA_NFCDEP_DATA nfcdep;
tNFA_DTA_LLCP_EVT llcp_evt;
} data;
} tNFA_DTA_DATA_CBACK;
/* All API message type */
typedef union {
NFC_HDR hdr;
tNFA_DTA_API_ENABLE enable;
tNFA_DTA_API_CONFIG cfg;
tNFA_DTA_API_START start;
tNFA_DTA_DATA_CBACK data_cback;
} tNFA_DTA_MSG;
/* DTA states */
enum {
NFA_DTA_ST_IDLE,
NFA_DTA_ST_DISCOVER, /* Polling/Listening */
NFA_DTA_ST_ACTIVATED /* Activated, listen mode */
};
typedef uint8_t tNFA_DTA_STATE;
/* DTA Substates (while in ACTIVATED state) - substate enumerations are found in
* protocol-specific files (nfa_dta_XXX.c) */
#define NFA_DTA_SST_IDLE 0
typedef uint8_t tNFA_DTA_SUBSTATE;
/* DTA discovery states */
enum {
NFA_DTA_DISC_STATE_IDLE,
NFA_DTA_DISC_STATE_DISCOVERY,
NFA_DTA_DISC_STATE_POLL_ACTIVE,
NFA_DTA_DISC_STATE_W4_ALL_DISCOVERIES,
NFA_DTA_DISC_STATE_W4_HOST_SELECT,
NFA_DTA_DISC_STATE_LISTEN_ACTIVE,
NFA_DTA_DISC_STATE_LISTEN_SLEEP,
NFA_DTA_DISC_STATE_MAX
};
/*****************************************************************************
* DTA control block definitions
*****************************************************************************/
/* NDEF buffer definitions */
enum {
NFA_DTA_BUF_READ, /* Buffer for RW Read requests */
NFA_DTA_BUF_WRITE, /* Buffer for RW Write requests */
NFA_DTA_BUF_MAX
};
typedef struct {
uint8_t* p_data;
uint32_t max_size;
uint32_t cur_size;
uint32_t offset; /* current read/write offset */
} tNFA_DTA_BUF_CB;
/* T4T listen mode test application */
enum {
NFA_DTA_T4T_CE_APP_NONE, /* Not selected */
NFA_DTA_T4T_CE_APP_LOOPBACK, /* loopback test applicaiton */
NFA_DTA_T4T_CE_APP_PROP /* propretary test application */
};
/* DTA test step command */
typedef tNFC_STATUS (*tNFA_DTA_CMD_FCN)(void*);
/* dta control block flags */
#define NFA_DTA_FL_ENABLED 0x00000001 /* DTA is enabled */
/* Automatically start discovery when NFC is enabled */
#define NFA_DTA_FL_AUTOSTART 0x00000002
/* DTA is stopping (NFA_DtaStop called) */
#define NFA_DTA_FL_STOPPING 0x00000004
/* DTA is being disabled (NFA_DtaDisable called) */
#define NFA_DTA_FL_DISABLING 0x00000008
/* T4T/NFCDEP is deactivating to IDLE (need to DESELECT first) */
#define NFA_DTA_FL_T4T_DESELECT_DEACT 0x00000010
/* DTA control block */
typedef struct {
uint32_t dta_flags; /* dta_flags must be first item in structure (statically
intialized to 0 on startup) */
/* Configuration */
tNFA_DTA_CONFIG cfg;
/* DTA State Machine */
tNFA_DTA_STATE state;
tNFA_DTA_SUBSTATE substate; /* Current protocol-specific sub-state */
tNFA_DTA_CBACK* p_cback; /* Applicatation for DTA event notification */
/* DTA test parameters */
uint16_t pattern_number;
uint16_t pattern_number_old;
/* Discovery Parameters */
uint8_t disc_state;
uint8_t disc_params_num;
tNFC_DISCOVER_PARAMS disc_params[NFA_DTA_DISCOVER_PARAMS_MAX];
/* Activation parameters */
tNFC_ACTIVATE_DEVT activate_params;
uint8_t cur_protocol_rank; /* perference ranking of currently discovered
protocol */
tRW_CBACK* p_rw_cback;
tCE_CBACK* p_ce_cback;
TIMER_LIST_ENT
protocol_timer; /* timer for the activated protocol if needed */
uint8_t t4t_ce_app; /* T4T listen mode test application */
tCE_T4T_AID_HANDLE
t4t_dta_aid_hdl; /* T4T registration handle for proprietary dta aid */
tCE_T4T_AID_HANDLE
t4t_prop_aid_hdl; /* T4T registration handle for proprietary aid */
uint8_t nfc_dep_wt;
bool llcp_cl_more_to_read; /* TRUE if there is more to read in llcp cl link*/
bool llcp_co_more_to_read; /* TRUE if there is more to read in llcp recieve
window*/
bool llcp_is_initiator; /* TURE if IUT is LLCP initiator */
uint16_t llcp_local_link_miu; /* link MIU of IUT */
uint16_t llcp_remote_link_miu; /* link MIU of LT */
uint8_t llcp_pattern_num_sap; /* SAP of pattern number exchange */
uint8_t llcp_cl_in_local_sap; /* SAP of IUT-CL-IN-DEST */
uint8_t llcp_cl_out_local_sap; /* SAP of IUT-CL-OUT-SRC */
uint8_t llcp_cl_out_remote_sap; /* SAP of LT-CL-OUT-DEST */
uint8_t llcp_co_in_local_sap; /* SAP of IUT-CO-IN-DEST */
uint8_t llcp_co_in_remote_sap; /* SAP of LT-CO-IN-SRC */
uint8_t llcp_co_out_local_sap; /* SAP of IUT-CO-OUT-SRC */
uint8_t llcp_co_out_remote_sap; /* SAP of LT-CO-OUT-DEST */
uint16_t llcp_co_out_remote_miu; /* MIU of LT-CO-OUT-DEST */
uint8_t llcp_co_out_remote_rw; /* RW of LT-CO-OUT-DEST */
/* establishing outbound on connection-oriented */
#define NFA_DTA_LLCP_FLAGS_CO_OUT_CONNECTING 0x01
/* established outbound on connection-oriented */
#define NFA_DTA_LLCP_FLAGS_CO_OUT_CONNECTED 0x02
uint8_t llcp_flags; /* internal flags for LLCP echo test */
uint8_t llcp_sdp_tid_cl; /* SDP transaction ID for outbound connectionless */
uint8_t
llcp_sdp_tid_co; /* SDP transaction ID for outbound connection-oriented */
TIMER_LIST_ENT llcp_cl_echo_timer; /* timer for the connectionless echo test
application */
TIMER_LIST_ENT llcp_co_echo_timer; /* timer for the connection-oriented echo
test application */
BUFFER_Q
llcp_cl_buffer; /* buffer for the connectionless echo test application */
BUFFER_Q llcp_co_buffer; /* buffer for the connection-oriented echo test
application*/
tNFA_HANDLE snep_server_handle;
tNFA_HANDLE snep_server_conn_handle;
tNFA_HANDLE snep_client_handle;
uint8_t* p_snep_short_ndef;
uint32_t snep_short_ndef_size;
uint8_t* p_snep_long_ndef;
uint32_t snep_long_ndef_size;
/* DTA buffer for NDEF read/write */
tNFA_DTA_BUF_CB buf_cb[NFA_DTA_BUF_MAX];
uint32_t ndef_size; /* Size of NDEF message from NDEF detection */
/* Scratch buffer for miscelaneous use */
uint8_t scratch_buf[NFA_DTA_SCRATCH_BUF_SIZE];
/* DTA Test command table */
tNFA_DTA_CMD_FCN*
p_cur_cmd_tbl; /* Current table of commands for current test */
uint8_t cur_cmd_idx;
} tNFA_DTA_CB;
extern tNFA_DTA_CB nfa_dta_cb;
/* NFA_SYS info for DTA */
extern const tNFA_SYS_REG nfa_dta_sys_reg;
/* DTA startup setconfig parameters */
extern uint8_t* p_nfa_dta_start_up_cfg;
extern uint8_t nfa_dta_start_up_cfg_len;
/*****************************************************************************
* DTA internal funciton protoytpes
*****************************************************************************/
/* Internal function prototypes */
void nfa_dta_deactivate(uint8_t deactivate_type);
void nfa_dta_shutdown(void);
void nfa_dta_discover_start(void);
/* nfa_sys handler for DTA */
bool nfa_dta_evt_hdlr(NFC_HDR* p_msg);
void nfa_dta_sys_disable(void);
/* State machine action functions */
bool nfa_dta_enable(tNFA_DTA_MSG* p_data);
bool nfa_dta_disable(tNFA_DTA_MSG* p_data);
bool nfa_dta_config(tNFA_DTA_MSG* p_data);
bool nfa_dta_start(tNFA_DTA_MSG* p_data);
bool nfa_dta_handle_deact(tNFA_DTA_MSG* p_data);
bool nfa_dta_stop(tNFA_DTA_MSG* p_data);
bool nfa_dta_run_test(tNFA_DTA_MSG* p_data);
bool nfa_dta_proc_data(tNFA_DTA_MSG* p_msg_data);
/* Utility functions */
void nfa_dta_test_set_state(tNFA_DTA_STATE state);
void nfa_dta_test_set_substate(tNFA_DTA_SUBSTATE substate);
void nfa_dta_free_ndef_buf(uint8_t ndef_idx);
uint8_t* nfa_dta_realloc_buf(uint8_t ndef_idx, uint32_t size);
void nfa_dta_t3t_nfcid_rand(uint8_t nfcid2[NCI_RF_F_UID_LEN]);
/* Test function entry points (in nfa_dta_XXX.c) */
void nfa_dta_nfcdep_poll_test_start(void);
void nfa_dta_nfcdep_proc_data(tNFC_CONN_EVT event, tNFC_CONN* p_data);
void nfa_dta_t1t_poll_test_start(void);
void nfa_dta_t2t_poll_test_start(void);
void nfa_dta_t3t_poll_test_start(void);
void nfa_dta_t4t_poll_test_start(void);
void nfa_dta_nfcdep_listen_test_start(void);
void nfa_dta_t3t_listen_test_start(void);
void nfa_dta_t4t_listen_test_start(void);
void nfa_dta_t1t_rw_cback(uint8_t event, tRW_DATA* p_data);
void nfa_dta_t2t_rw_cback(uint8_t event, tRW_DATA* p_data);
void nfa_dta_t3t_rw_cback(uint8_t event, tRW_DATA* p_data);
void nfa_dta_t4t_rw_cback(uint8_t event, tRW_DATA* p_data);
void nfa_dta_t3t_ce_cback(uint8_t event, tCE_DATA* p_data);
void nfa_dta_t4t_ce_cback(uint8_t event, tCE_DATA* p_data);
void nfa_dta_ce_cback(uint8_t event, tCE_DATA* p_ce_data);
void nfa_dta_t4t_register_apps(void);
void nfa_dta_t4t_deregister_apps(void);
void nfa_dta_llcp_init(void);
void nfa_dta_llcp_set_gen_bytes(void);
void nfa_dta_llcp_clear_gen_bytes(void);
void nfa_dta_llcp_register_pattern_number_service(void);
void nfa_dta_llcp_deregister_pattern_number_service(void);
void nfa_dta_llcp_register_echo(void);
void nfa_dta_llcp_deregister_echo(void);
void nfa_dta_llcp_activate_link(void);
void nfa_dta_llcp_connect_co_echo_out(void);
void nfa_dta_llcp_disconnect_co_echo_out(void);
void nfa_dta_snep_init(void);
void nfa_dta_snep_register(void);
void nfa_dta_snep_deregister(void);
void nfa_dta_emvco_pcd_config_nfcc(bool enable);
void nfa_dta_emvco_pcd_start(void);
void nfa_dta_emvco_pcd_cback(uint8_t event, tRW_DATA* p_data);
extern uint8_t* p_nfa_dta_brcm_start_up_cfg;
extern uint8_t nfa_dta_brcm_start_up_cfg_len;
extern uint8_t* p_nfa_dta_start_up_vsc_cfg;
#endif /* (NFA_DTA_INCLUDED == TRUE) */
#endif /* NFA_DTA_INT_H */