Home | History | Annotate | Download | only in int
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2003-2014 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  This is the private interface file for the NFA DTA
     22  *
     23  ******************************************************************************/
     24 #ifndef NFA_DTA_INT_H
     25 #define NFA_DTA_INT_H
     26 
     27 #include "ce_api.h"
     28 #include "nfa_dta_api.h"
     29 #include "nfa_sys.h"
     30 #include "nfa_sys_int.h"
     31 #include "nfc_api.h"
     32 #include "rw_api.h"
     33 
     34 #if (NFA_DTA_INCLUDED == TRUE)
     35 
     36 /*****************************************************************************
     37 **  DTA definitions
     38 *****************************************************************************/
     39 #define NFA_DTA_PATTERN_NUMBER_INVALID 0xFFFF
     40 
     41 #define NFA_DTA_PATTERN_NUMBER_LLCP_CONNECT_BY_SAP 0x1200
     42 #define NFA_DTA_PATTERN_NUMBER_LLCP_CONNECT_BY_SN 0x1240
     43 #define NFA_DTA_PATTERN_NUMBER_LLCP_CONNECT_BY_SNL 0x1280
     44 
     45 #define NFA_DTA_PATTERN_NUMBER_SNEP_SERVER_ONLY 0x1300
     46 #define NFA_DTA_PATTERN_NUMBER_SNEP_DEFAULT_PUT_SHORT_NDEF 0x1301
     47 #define NFA_DTA_PATTERN_NUMBER_SNEP_DEFAULT_PUT_LONG_NDEF 0x1302
     48 #define NFA_DTA_PATTERN_NUMBER_SNEP_EXTENDED_GET 0x1303
     49 
     50 #define NFA_DTA_DISCOVER_PARAMS_MAX 6
     51 
     52 /* Header length for long NDEF text message */
     53 #define NDEF_WKT_TEXT_HDR_LEN 7
     54 /* Size of NDEF message for T3T write-tests ([DTA] $5.5.6) */
     55 #define NFA_DTA_T3T_WRITE_NDEF_SIZE 192
     56 /* System code to use for T3T Listen mode tests */
     57 #define NFA_DTA_T3T_LISTEN_SYSTEMCODE 0xBABE
     58 
     59 /* Maximum protocol preference rank */
     60 #define NFA_PROTOCOL_RANK_INVALID 0xFF
     61 
     62 #define NFA_DTA_SCRATCH_BUF_SIZE T3T_MSG_BLOCKSIZE
     63 
     64 #ifndef NFA_DTA_DEFAULT_CO_OUT_DSAP
     65 /* Default SAP[LT,CO-OUT-DEST] if SDP was not performed to get SAP from the LT
     66  */
     67 #define NFA_DTA_DEFAULT_CO_OUT_DSAP 0x12
     68 #endif
     69 
     70 /*****************************************************************************
     71 * DTA state machine definitions
     72 *****************************************************************************/
     73 
     74 typedef struct {
     75   bool tp_continue;                       /* NFA_DTA_CFG_TP_CONTINUE    */
     76   tNFA_DTA_FL_POLL_LISTEN poll_listen;    /* NFA_DTA_CFG_POLL_LISTEN    */
     77   bool t4at_nfcdep_priority;              /* NFA_DTA_CFG_T4AT_NFCDEP_PRIORITY */
     78   bool reactivation;                      /* NFA_DTA_CFG_REACTIVATION   */
     79   uint16_t total_duration;                /* NFA_DTA_CFG_TOTAL_DURATION */
     80   tNFA_DTA_EMVCO_PCD_MODE emvco_pcd_mode; /* NFA_DTA_CFG_EMVCO_PCD */
     81 } tNFA_DTA_CONFIG;
     82 
     83 /*****************************************************************************
     84 * DTA state machine definitions
     85 *****************************************************************************/
     86 /* DTA events */
     87 enum {
     88   /* device manager local device API events */
     89   NFA_DTA_API_ENABLE_EVT = NFA_SYS_EVT_START(NFA_ID_DTA),
     90   NFA_DTA_API_DISABLE_EVT,
     91   NFA_DTA_API_CONFIG_EVT,
     92   NFA_DTA_API_START_EVT,
     93   NFA_DTA_API_STOP_EVT,
     94   NFA_DTA_ACTIVATE_EVT,
     95   NFA_DTA_DEACTIVATE_EVT,
     96   NFA_DTA_DATA_CBACK_EVT,
     97 
     98   NFA_DTA_MAX_EVT
     99 };
    100 
    101 /* data type for NFA_DTA_API_ENABLE_EVT */
    102 typedef struct {
    103   NFC_HDR hdr;
    104   bool auto_start;
    105   tNFA_DTA_CBACK* p_cback;
    106 } tNFA_DTA_API_ENABLE;
    107 
    108 /* data type for NFA_DTA_API_START_EVT  */
    109 typedef struct {
    110   NFC_HDR hdr;
    111   uint16_t pattern_number;
    112   uint8_t tlv_len;
    113   uint8_t* p_tlv_params;
    114 } tNFA_DTA_API_START;
    115 
    116 /* data type for NFA_DTA_API_CONFIG  */
    117 typedef struct {
    118   NFC_HDR hdr;
    119   tNFA_DTA_CFG_ITEM item;
    120   tNFA_DTA_CFG cfg_data;
    121 } tNFA_DTA_API_CONFIG;
    122 
    123 /* data type for NFA_DTA_DATA_CBACK_EVT */
    124 typedef struct {
    125   uint8_t event;
    126   tRW_DATA data;
    127 } tNFA_DTA_RW_DATA;
    128 
    129 typedef struct {
    130   uint8_t event;
    131   tCE_DATA data;
    132 } tNFA_DTA_CE_DATA;
    133 
    134 typedef struct {
    135   tNFC_CONN_EVT event;
    136   tNFC_CONN data;
    137 } tNFA_DTA_NFCDEP_DATA;
    138 
    139 enum { NFA_DTA_LLCP_CONNECT_CO_ECHO_OUT, NFA_DTA_LLCP_DISCONNECT_CO_ECHO_OUT };
    140 typedef uint8_t tNFA_DTA_LLCP_EVT;
    141 
    142 enum {
    143   NFA_DTA_RW_DATA,
    144   NFA_DTA_CE_DATA,
    145   NFA_DTA_NFCDEP_DATA,
    146   NFA_DTA_LLCP_DATA
    147 };
    148 
    149 typedef uint8_t tNFA_DTA_DATA_TYPE;
    150 
    151 typedef struct {
    152   NFC_HDR hdr;
    153   tNFA_DTA_DATA_TYPE type;
    154   union {
    155     tNFA_DTA_RW_DATA rw;
    156     tNFA_DTA_CE_DATA ce;
    157     tNFA_DTA_NFCDEP_DATA nfcdep;
    158     tNFA_DTA_LLCP_EVT llcp_evt;
    159   } data;
    160 } tNFA_DTA_DATA_CBACK;
    161 
    162 /* All API message type */
    163 typedef union {
    164   NFC_HDR hdr;
    165   tNFA_DTA_API_ENABLE enable;
    166   tNFA_DTA_API_CONFIG cfg;
    167   tNFA_DTA_API_START start;
    168   tNFA_DTA_DATA_CBACK data_cback;
    169 } tNFA_DTA_MSG;
    170 
    171 /* DTA states */
    172 enum {
    173   NFA_DTA_ST_IDLE,
    174   NFA_DTA_ST_DISCOVER, /* Polling/Listening */
    175   NFA_DTA_ST_ACTIVATED /* Activated, listen mode */
    176 };
    177 typedef uint8_t tNFA_DTA_STATE;
    178 
    179 /* DTA Substates (while in ACTIVATED state) - substate enumerations are found in
    180  * protocol-specific files (nfa_dta_XXX.c) */
    181 #define NFA_DTA_SST_IDLE 0
    182 typedef uint8_t tNFA_DTA_SUBSTATE;
    183 
    184 /* DTA discovery states */
    185 enum {
    186   NFA_DTA_DISC_STATE_IDLE,
    187   NFA_DTA_DISC_STATE_DISCOVERY,
    188   NFA_DTA_DISC_STATE_POLL_ACTIVE,
    189   NFA_DTA_DISC_STATE_W4_ALL_DISCOVERIES,
    190   NFA_DTA_DISC_STATE_W4_HOST_SELECT,
    191   NFA_DTA_DISC_STATE_LISTEN_ACTIVE,
    192   NFA_DTA_DISC_STATE_LISTEN_SLEEP,
    193   NFA_DTA_DISC_STATE_MAX
    194 };
    195 
    196 /*****************************************************************************
    197 * DTA control block definitions
    198 *****************************************************************************/
    199 
    200 /* NDEF buffer definitions */
    201 enum {
    202   NFA_DTA_BUF_READ,  /* Buffer for RW Read requests */
    203   NFA_DTA_BUF_WRITE, /* Buffer for RW Write requests */
    204   NFA_DTA_BUF_MAX
    205 };
    206 
    207 typedef struct {
    208   uint8_t* p_data;
    209   uint32_t max_size;
    210   uint32_t cur_size;
    211   uint32_t offset; /* current read/write offset */
    212 } tNFA_DTA_BUF_CB;
    213 
    214 /* T4T listen mode test application */
    215 enum {
    216   NFA_DTA_T4T_CE_APP_NONE,     /* Not selected */
    217   NFA_DTA_T4T_CE_APP_LOOPBACK, /* loopback test applicaiton */
    218   NFA_DTA_T4T_CE_APP_PROP      /* propretary test application */
    219 };
    220 
    221 /* DTA test step command */
    222 typedef tNFC_STATUS (*tNFA_DTA_CMD_FCN)(void*);
    223 
    224 /* dta control block flags */
    225 #define NFA_DTA_FL_ENABLED 0x00000001 /* DTA is enabled */
    226 /* Automatically start discovery when NFC is enabled */
    227 #define NFA_DTA_FL_AUTOSTART 0x00000002
    228 /* DTA is stopping (NFA_DtaStop called) */
    229 #define NFA_DTA_FL_STOPPING 0x00000004
    230 /* DTA is being disabled (NFA_DtaDisable called) */
    231 #define NFA_DTA_FL_DISABLING 0x00000008
    232 /* T4T/NFCDEP is deactivating to IDLE (need to DESELECT first) */
    233 #define NFA_DTA_FL_T4T_DESELECT_DEACT 0x00000010
    234 
    235 /* DTA control block */
    236 typedef struct {
    237   uint32_t dta_flags; /* dta_flags must be first item in structure (statically
    238                          intialized to 0 on startup) */
    239 
    240   /* Configuration */
    241   tNFA_DTA_CONFIG cfg;
    242 
    243   /* DTA State Machine */
    244   tNFA_DTA_STATE state;
    245   tNFA_DTA_SUBSTATE substate; /* Current protocol-specific sub-state */
    246   tNFA_DTA_CBACK* p_cback;    /* Applicatation for DTA event notification */
    247 
    248   /* DTA test parameters */
    249   uint16_t pattern_number;
    250   uint16_t pattern_number_old;
    251 
    252   /* Discovery Parameters */
    253   uint8_t disc_state;
    254   uint8_t disc_params_num;
    255   tNFC_DISCOVER_PARAMS disc_params[NFA_DTA_DISCOVER_PARAMS_MAX];
    256 
    257   /* Activation parameters */
    258   tNFC_ACTIVATE_DEVT activate_params;
    259   uint8_t cur_protocol_rank; /* perference ranking of currently discovered
    260                                 protocol */
    261 
    262   tRW_CBACK* p_rw_cback;
    263   tCE_CBACK* p_ce_cback;
    264 
    265   TIMER_LIST_ENT
    266   protocol_timer; /* timer for the activated protocol if needed */
    267 
    268   uint8_t t4t_ce_app; /* T4T listen mode test application */
    269   tCE_T4T_AID_HANDLE
    270       t4t_dta_aid_hdl; /* T4T registration handle for proprietary dta aid */
    271   tCE_T4T_AID_HANDLE
    272       t4t_prop_aid_hdl; /* T4T registration handle for proprietary aid */
    273   uint8_t nfc_dep_wt;
    274 
    275   bool llcp_cl_more_to_read; /* TRUE if there is more to read in llcp cl link*/
    276   bool llcp_co_more_to_read; /* TRUE if there is more to read in llcp recieve
    277                                 window*/
    278   bool llcp_is_initiator;    /* TURE if IUT is LLCP initiator */
    279   uint16_t llcp_local_link_miu;  /* link MIU of IUT               */
    280   uint16_t llcp_remote_link_miu; /* link MIU of LT                */
    281 
    282   uint8_t llcp_pattern_num_sap; /* SAP of pattern number exchange */
    283 
    284   uint8_t llcp_cl_in_local_sap;   /* SAP of IUT-CL-IN-DEST */
    285   uint8_t llcp_cl_out_local_sap;  /* SAP of IUT-CL-OUT-SRC */
    286   uint8_t llcp_cl_out_remote_sap; /* SAP of LT-CL-OUT-DEST */
    287 
    288   uint8_t llcp_co_in_local_sap;   /* SAP of IUT-CO-IN-DEST */
    289   uint8_t llcp_co_in_remote_sap;  /* SAP of LT-CO-IN-SRC   */
    290   uint8_t llcp_co_out_local_sap;  /* SAP of IUT-CO-OUT-SRC */
    291   uint8_t llcp_co_out_remote_sap; /* SAP of LT-CO-OUT-DEST */
    292 
    293   uint16_t llcp_co_out_remote_miu; /* MIU of LT-CO-OUT-DEST */
    294   uint8_t llcp_co_out_remote_rw;   /* RW of LT-CO-OUT-DEST  */
    295 
    296 /* establishing outbound on connection-oriented */
    297 #define NFA_DTA_LLCP_FLAGS_CO_OUT_CONNECTING 0x01
    298 /* established outbound on connection-oriented  */
    299 #define NFA_DTA_LLCP_FLAGS_CO_OUT_CONNECTED 0x02
    300 
    301   uint8_t llcp_flags;      /* internal flags for LLCP echo test */
    302   uint8_t llcp_sdp_tid_cl; /* SDP transaction ID for outbound connectionless */
    303   uint8_t
    304       llcp_sdp_tid_co; /* SDP transaction ID for outbound connection-oriented */
    305 
    306   TIMER_LIST_ENT llcp_cl_echo_timer; /* timer for the connectionless echo test
    307                                         application      */
    308   TIMER_LIST_ENT llcp_co_echo_timer; /* timer for the connection-oriented echo
    309                                         test application */
    310   BUFFER_Q
    311   llcp_cl_buffer; /* buffer for the connectionless echo test application */
    312   BUFFER_Q llcp_co_buffer; /* buffer for the connection-oriented echo test
    313                               application*/
    314 
    315   tNFA_HANDLE snep_server_handle;
    316   tNFA_HANDLE snep_server_conn_handle;
    317   tNFA_HANDLE snep_client_handle;
    318 
    319   uint8_t* p_snep_short_ndef;
    320   uint32_t snep_short_ndef_size;
    321   uint8_t* p_snep_long_ndef;
    322   uint32_t snep_long_ndef_size;
    323 
    324   /* DTA buffer for NDEF read/write */
    325   tNFA_DTA_BUF_CB buf_cb[NFA_DTA_BUF_MAX];
    326   uint32_t ndef_size; /* Size of NDEF message from NDEF detection */
    327 
    328   /* Scratch buffer for miscelaneous use */
    329   uint8_t scratch_buf[NFA_DTA_SCRATCH_BUF_SIZE];
    330 
    331   /* DTA Test command table */
    332   tNFA_DTA_CMD_FCN*
    333       p_cur_cmd_tbl; /* Current table of commands for current test */
    334   uint8_t cur_cmd_idx;
    335 } tNFA_DTA_CB;
    336 extern tNFA_DTA_CB nfa_dta_cb;
    337 
    338 /* NFA_SYS info for DTA */
    339 extern const tNFA_SYS_REG nfa_dta_sys_reg;
    340 
    341 /* DTA startup setconfig parameters */
    342 extern uint8_t* p_nfa_dta_start_up_cfg;
    343 extern uint8_t nfa_dta_start_up_cfg_len;
    344 
    345 /*****************************************************************************
    346 * DTA internal funciton protoytpes
    347 *****************************************************************************/
    348 /* Internal function prototypes */
    349 void nfa_dta_deactivate(uint8_t deactivate_type);
    350 void nfa_dta_shutdown(void);
    351 void nfa_dta_discover_start(void);
    352 
    353 /* nfa_sys handler for DTA */
    354 bool nfa_dta_evt_hdlr(NFC_HDR* p_msg);
    355 void nfa_dta_sys_disable(void);
    356 
    357 /* State machine action functions */
    358 bool nfa_dta_enable(tNFA_DTA_MSG* p_data);
    359 bool nfa_dta_disable(tNFA_DTA_MSG* p_data);
    360 bool nfa_dta_config(tNFA_DTA_MSG* p_data);
    361 bool nfa_dta_start(tNFA_DTA_MSG* p_data);
    362 bool nfa_dta_handle_deact(tNFA_DTA_MSG* p_data);
    363 bool nfa_dta_stop(tNFA_DTA_MSG* p_data);
    364 bool nfa_dta_run_test(tNFA_DTA_MSG* p_data);
    365 bool nfa_dta_proc_data(tNFA_DTA_MSG* p_msg_data);
    366 
    367 /* Utility functions */
    368 void nfa_dta_test_set_state(tNFA_DTA_STATE state);
    369 void nfa_dta_test_set_substate(tNFA_DTA_SUBSTATE substate);
    370 void nfa_dta_free_ndef_buf(uint8_t ndef_idx);
    371 uint8_t* nfa_dta_realloc_buf(uint8_t ndef_idx, uint32_t size);
    372 void nfa_dta_t3t_nfcid_rand(uint8_t nfcid2[NCI_RF_F_UID_LEN]);
    373 
    374 /* Test function entry points (in nfa_dta_XXX.c) */
    375 void nfa_dta_nfcdep_poll_test_start(void);
    376 void nfa_dta_nfcdep_proc_data(tNFC_CONN_EVT event, tNFC_CONN* p_data);
    377 void nfa_dta_t1t_poll_test_start(void);
    378 void nfa_dta_t2t_poll_test_start(void);
    379 void nfa_dta_t3t_poll_test_start(void);
    380 void nfa_dta_t4t_poll_test_start(void);
    381 
    382 void nfa_dta_nfcdep_listen_test_start(void);
    383 void nfa_dta_t3t_listen_test_start(void);
    384 void nfa_dta_t4t_listen_test_start(void);
    385 
    386 void nfa_dta_t1t_rw_cback(uint8_t event, tRW_DATA* p_data);
    387 void nfa_dta_t2t_rw_cback(uint8_t event, tRW_DATA* p_data);
    388 void nfa_dta_t3t_rw_cback(uint8_t event, tRW_DATA* p_data);
    389 void nfa_dta_t4t_rw_cback(uint8_t event, tRW_DATA* p_data);
    390 
    391 void nfa_dta_t3t_ce_cback(uint8_t event, tCE_DATA* p_data);
    392 void nfa_dta_t4t_ce_cback(uint8_t event, tCE_DATA* p_data);
    393 
    394 void nfa_dta_ce_cback(uint8_t event, tCE_DATA* p_ce_data);
    395 
    396 void nfa_dta_t4t_register_apps(void);
    397 void nfa_dta_t4t_deregister_apps(void);
    398 
    399 void nfa_dta_llcp_init(void);
    400 void nfa_dta_llcp_set_gen_bytes(void);
    401 void nfa_dta_llcp_clear_gen_bytes(void);
    402 void nfa_dta_llcp_register_pattern_number_service(void);
    403 void nfa_dta_llcp_deregister_pattern_number_service(void);
    404 void nfa_dta_llcp_register_echo(void);
    405 void nfa_dta_llcp_deregister_echo(void);
    406 void nfa_dta_llcp_activate_link(void);
    407 void nfa_dta_llcp_connect_co_echo_out(void);
    408 void nfa_dta_llcp_disconnect_co_echo_out(void);
    409 
    410 void nfa_dta_snep_init(void);
    411 void nfa_dta_snep_register(void);
    412 void nfa_dta_snep_deregister(void);
    413 
    414 void nfa_dta_emvco_pcd_config_nfcc(bool enable);
    415 void nfa_dta_emvco_pcd_start(void);
    416 void nfa_dta_emvco_pcd_cback(uint8_t event, tRW_DATA* p_data);
    417 
    418 extern uint8_t* p_nfa_dta_brcm_start_up_cfg;
    419 extern uint8_t nfa_dta_brcm_start_up_cfg_len;
    420 extern uint8_t* p_nfa_dta_start_up_vsc_cfg;
    421 
    422 #endif /* (NFA_DTA_INCLUDED == TRUE) */
    423 #endif /* NFA_DTA_INT_H */
    424