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 NFA_RW
22 *
23 ******************************************************************************/
24#ifndef NFA_RW_INT_H
25#define NFA_RW_INT_H
26
27#include "nfa_api.h"
28#include "nfa_rw_api.h"
29#include "nfa_sys.h"
30#include "nfc_api.h"
31#include "rw_api.h"
32
33/*****************************************************************************
34**  Constants and data types
35*****************************************************************************/
36
37/* Interval for performing presence check (in ms) */
38#ifndef NFA_RW_PRESENCE_CHECK_INTERVAL
39#define NFA_RW_PRESENCE_CHECK_INTERVAL 750
40#endif
41
42/* TLV detection status */
43#define NFA_RW_TLV_DETECT_ST_OP_NOT_STARTED 0x00 /* No Tlv detected */
44/* Lock control tlv detected */
45#define NFA_RW_TLV_DETECT_ST_LOCK_TLV_OP_COMPLETE 0x01
46/* Memory control tlv detected */
47#define NFA_RW_TLV_DETECT_ST_MEM_TLV_OP_COMPLETE 0x02
48/* Both Lock and Memory control Tlvs are detected */
49#define NFA_RW_TLV_DETECT_ST_COMPLETE 0x03
50
51/* Tag deselect cmd*/
52#define NFA_RW_TAG_DESELECT_CMD 0xC2
53
54#define NFA_RW_TAG_SLP_REQ_LEN 0x02
55
56/* Tag sleep req cmd*/
57extern uint8_t NFA_RW_TAG_SLP_REQ[];
58
59typedef uint8_t tNFA_RW_TLV_ST;
60
61/* RW events */
62enum {
63  NFA_RW_OP_REQUEST_EVT = NFA_SYS_EVT_START(NFA_ID_RW),
64  NFA_RW_ACTIVATE_NTF_EVT,
65  NFA_RW_DEACTIVATE_NTF_EVT,
66  NFA_RW_PRESENCE_CHECK_TICK_EVT,
67  NFA_RW_PRESENCE_CHECK_TIMEOUT_EVT,
68  NFA_RW_MAX_EVT
69};
70
71/* BTA_RW operations */
72enum {
73  NFA_RW_OP_DETECT_NDEF,
74  NFA_RW_OP_READ_NDEF,
75  NFA_RW_OP_WRITE_NDEF,
76  NFA_RW_OP_PRESENCE_CHECK,
77  NFA_RW_OP_FORMAT_TAG,
78  NFA_RW_OP_SEND_RAW_FRAME,
79
80  /* Exclusive Type-1,Type-2 tag operations */
81  NFA_RW_OP_DETECT_LOCK_TLV,
82  NFA_RW_OP_DETECT_MEM_TLV,
83  NFA_RW_OP_SET_TAG_RO,
84
85  /* Exclusive Type-1 tag operations */
86  NFA_RW_OP_T1T_RID,
87  NFA_RW_OP_T1T_RALL,
88  NFA_RW_OP_T1T_READ,
89  NFA_RW_OP_T1T_WRITE,
90  NFA_RW_OP_T1T_RSEG,
91  NFA_RW_OP_T1T_READ8,
92  NFA_RW_OP_T1T_WRITE8,
93
94  /* Exclusive Type-2 tag operations */
95  NFA_RW_OP_T2T_READ,
96  NFA_RW_OP_T2T_WRITE,
97  NFA_RW_OP_T2T_SECTOR_SELECT,
98
99  /* Exclusive Type-3 tag operations */
100  NFA_RW_OP_T3T_READ,
101  NFA_RW_OP_T3T_WRITE,
102  NFA_RW_OP_T3T_GET_SYSTEM_CODES,
103
104  /* Exclusive ISO 15693 tag operations */
105  NFA_RW_OP_I93_INVENTORY,
106  NFA_RW_OP_I93_STAY_QUIET,
107  NFA_RW_OP_I93_READ_SINGLE_BLOCK,
108  NFA_RW_OP_I93_WRITE_SINGLE_BLOCK,
109  NFA_RW_OP_I93_LOCK_BLOCK,
110  NFA_RW_OP_I93_READ_MULTI_BLOCK,
111  NFA_RW_OP_I93_WRITE_MULTI_BLOCK,
112  NFA_RW_OP_I93_SELECT,
113  NFA_RW_OP_I93_RESET_TO_READY,
114  NFA_RW_OP_I93_WRITE_AFI,
115  NFA_RW_OP_I93_LOCK_AFI,
116  NFA_RW_OP_I93_WRITE_DSFID,
117  NFA_RW_OP_I93_LOCK_DSFID,
118  NFA_RW_OP_I93_GET_SYS_INFO,
119  NFA_RW_OP_I93_GET_MULTI_BLOCK_STATUS,
120
121  NFA_RW_OP_MAX
122};
123typedef uint8_t tNFA_RW_OP;
124
125/* Enumeration of parameter structios for nfa_rw operations */
126
127/* NFA_RW_OP_WRITE_NDEF params */
128typedef struct {
129  uint32_t len;
130  uint8_t* p_data;
131} tNFA_RW_OP_PARAMS_WRITE_NDEF;
132
133/* NFA_RW_OP_SEND_RAW_FRAME params */
134typedef struct { NFC_HDR* p_data; } tNFA_RW_OP_PARAMS_SEND_RAW_FRAME;
135
136/* NFA_RW_OP_SET_TAG_RO params */
137typedef struct { bool b_hard_lock; } tNFA_RW_OP_PARAMS_CONFIG_READ_ONLY;
138
139/* NFA_RW_OP_T1T_READ params */
140typedef struct {
141  uint8_t segment_number;
142  uint8_t block_number;
143  uint8_t index;
144} tNFA_RW_OP_PARAMS_T1T_READ;
145
146/* NFA_RW_OP_T1T_WRITE_E8,NFA_RW_OP_T1T_WRITE_NE8
147   NFA_RW_OP_T1T_WRITE_E, NFA_RW_OP_T1T_WRITE_NE params  */
148typedef struct {
149  bool b_erase;
150  uint8_t block_number;
151  uint8_t index;
152  uint8_t p_block_data[8];
153} tNFA_RW_OP_PARAMS_T1T_WRITE;
154
155/* NFA_RW_OP_T2T_READ params */
156typedef struct { uint8_t block_number; } tNFA_RW_OP_PARAMS_T2T_READ;
157
158/* NFA_RW_OP_T2T_WRITE params */
159typedef struct {
160  uint8_t block_number;
161  uint8_t p_block_data[4];
162} tNFA_RW_OP_PARAMS_T2T_WRITE;
163
164/* NFA_RW_OP_T2T_SECTOR_SELECT params */
165typedef struct { uint8_t sector_number; } tNFA_RW_OP_PARAMS_T2T_SECTOR_SELECT;
166
167/* NFA_RW_OP_T3T_READ params */
168typedef struct {
169  uint8_t num_blocks;
170  tNFA_T3T_BLOCK_DESC* p_block_desc;
171} tNFA_RW_OP_PARAMS_T3T_READ;
172
173/* NFA_RW_OP_T3T_WRITE params */
174typedef struct {
175  uint8_t num_blocks;
176  tNFA_T3T_BLOCK_DESC* p_block_desc;
177  uint8_t* p_block_data;
178} tNFA_RW_OP_PARAMS_T3T_WRITE;
179
180/* NFA_RW_OP_I93_XXX params */
181typedef struct {
182  bool uid_present;
183  uint8_t uid[I93_UID_BYTE_LEN];
184  bool afi_present;
185  uint8_t afi;
186  uint8_t dsfid;
187  uint16_t first_block_number;
188  uint16_t number_blocks;
189  uint8_t* p_data;
190} tNFA_RW_OP_PARAMS_I93_CMD;
191
192/* Union of params for all reader/writer operations */
193typedef union {
194  /* params for NFA_RW_OP_WRITE_NDEF */
195  tNFA_RW_OP_PARAMS_WRITE_NDEF write_ndef;
196
197  /* params for NFA_RW_OP_SEND_RAW_FRAME */
198  tNFA_RW_OP_PARAMS_SEND_RAW_FRAME send_raw_frame;
199
200  /* params for NFA_RW_OP_SET_TAG_RO */
201  tNFA_RW_OP_PARAMS_CONFIG_READ_ONLY set_readonly;
202
203  /* params for NFA_RW_OP_T2T_READ and NFA_RW_OP_T1T_WRITE */
204  tNFA_RW_OP_PARAMS_T1T_READ t1t_read;
205  tNFA_RW_OP_PARAMS_T1T_WRITE t1t_write;
206
207  /* params for NFA_RW_OP_T2T_READ,NFA_RW_OP_T2T_WRITE and
208   * NFA_RW_OP_T2T_SECTOR_SELECT */
209  tNFA_RW_OP_PARAMS_T2T_READ t2t_read;
210  tNFA_RW_OP_PARAMS_T2T_WRITE t2t_write;
211  tNFA_RW_OP_PARAMS_T2T_SECTOR_SELECT t2t_sector_select;
212
213  /* params for NFA_RW_OP_T3T_READ and NFA_RW_OP_T3T_WRITE */
214  tNFA_RW_OP_PARAMS_T3T_READ t3t_read;
215  tNFA_RW_OP_PARAMS_T3T_WRITE t3t_write;
216
217  /* params for NFA_RW_OP_PRESENCE_CHECK */
218  tNFA_RW_PRES_CHK_OPTION option;
219
220  /* params for ISO 15693 */
221  tNFA_RW_OP_PARAMS_I93_CMD i93_cmd;
222
223} tNFA_RW_OP_PARAMS;
224
225/* data type for NFA_RW_op_req_EVT */
226typedef struct {
227  NFC_HDR hdr;
228  tNFA_RW_OP op; /* NFA RW operation */
229  tNFA_RW_OP_PARAMS params;
230} tNFA_RW_OPERATION;
231
232/* data type for NFA_RW_ACTIVATE_NTF */
233typedef struct {
234  NFC_HDR hdr;
235  tNFC_ACTIVATE_DEVT* p_activate_params; /* Data from NFC_ACTIVATE_DEVT      */
236  bool excl_rf_not_active;               /* TRUE if not in exclusive RF mode */
237} tNFA_RW_ACTIVATE_NTF;
238
239/* union of all data types */
240typedef union {
241  /* GKI event buffer header */
242  NFC_HDR hdr;
243  tNFA_RW_OPERATION op_req;
244  tNFA_RW_ACTIVATE_NTF activate_ntf;
245} tNFA_RW_MSG;
246
247/* NDEF detection status */
248enum {
249  NFA_RW_NDEF_ST_UNKNOWN = 0, /* NDEF detection not performed yet */
250  NFA_RW_NDEF_ST_TRUE,        /* Tag is NDEF */
251  NFA_RW_NDEF_ST_FALSE        /* Tag is not NDEF */
252};
253typedef uint8_t tNFA_RW_NDEF_ST;
254
255/* flags for RW control block */
256/* Activation while not in exclusive RF mode                                */
257#define NFA_RW_FL_NOT_EXCL_RF_MODE 0x01
258/* Waiting for response from tag for auto-presence check                    */
259#define NFA_RW_FL_AUTO_PRESENCE_CHECK_BUSY 0x02
260/* Read only tag                                                            */
261#define NFA_RW_FL_TAG_IS_READONLY 0x04
262/* Busy retrieving additional tag information                               */
263#define NFA_RW_FL_ACTIVATION_NTF_PENDING 0x08
264/* Tag operation is in progress                                             */
265#define NFA_RW_FL_API_BUSY 0x10
266/* Tag is been activated                                                    */
267#define NFA_RW_FL_ACTIVATED 0x20
268/* NDEF DETECTed OK                                                         */
269#define NFA_RW_FL_NDEF_OK 0x40
270
271/* NFA RW control block */
272typedef struct {
273  tNFA_RW_OP cur_op; /* Current operation */
274
275  TIMER_LIST_ENT tle; /* list entry for nfa_rw timer */
276  tNFA_RW_MSG*
277      p_pending_msg; /* Pending API (if busy performing presence check) */
278
279  /* Tag info */
280  tNFC_PROTOCOL protocol;
281  tNFC_INTF_TYPE intf_type;
282  uint8_t pa_sel_res;
283  tNFC_RF_TECH_N_MODE activated_tech_mode; /* activated technology and mode */
284
285  bool b_hard_lock;
286
287  tNFA_RW_MSG*
288      p_buffer_rw_msg; /* Buffer to hold incoming cmd while reading tag id */
289
290  /* TLV info */
291  tNFA_RW_TLV_ST tlv_st; /* TLV detection status */
292
293  /* NDEF info */
294  tNFA_RW_NDEF_ST ndef_st; /* NDEF detection status */
295  uint32_t ndef_max_size;  /* max number of bytes available for NDEF data */
296  uint32_t ndef_cur_size;  /* current size of stored NDEF data (in bytes) */
297  uint8_t* p_ndef_buf;
298  uint32_t ndef_rd_offset; /* current read-offset of incoming NDEF data */
299
300  /* Current NDEF Write info */
301  uint8_t* p_ndef_wr_buf; /* Pointer to NDEF data being written */
302  uint32_t ndef_wr_len;   /* Length of NDEF data being written */
303
304  /* Reactivating type 2 tag after NACK rsp */
305  tRW_EVENT halt_event; /* Event ID from stack after NACK response */
306  tRW_DATA rw_data;     /* Event Data from stack after NACK response */
307  bool skip_dyn_locks;  /* To skip reading dynamic locks during NDEF Detect */
308
309  /* Flags (see defintions for NFA_RW_FL_* ) */
310  uint8_t flags;
311
312  /* ISO 15693 tag memory information */
313  uint16_t i93_afi_location;
314  uint8_t i93_dsfid;
315  uint8_t i93_block_size;
316  uint16_t i93_num_block;
317  uint8_t i93_uid[I93_UID_BYTE_LEN];
318} tNFA_RW_CB;
319extern tNFA_RW_CB nfa_rw_cb;
320
321/* type definition for action functions */
322typedef bool (*tNFA_RW_ACTION)(tNFA_RW_MSG* p_data);
323
324/* Internal nfa_rw function prototypes */
325extern void nfa_rw_stop_presence_check_timer(void);
326
327/* Action function prototypes */
328extern bool nfa_rw_handle_op_req(tNFA_RW_MSG* p_data);
329extern bool nfa_rw_activate_ntf(tNFA_RW_MSG* p_data);
330extern bool nfa_rw_deactivate_ntf(tNFA_RW_MSG* p_data);
331extern bool nfa_rw_presence_check_tick(tNFA_RW_MSG* p_data);
332extern bool nfa_rw_presence_check_timeout(tNFA_RW_MSG* p_data);
333extern void nfa_rw_handle_sleep_wakeup_rsp(tNFC_STATUS status);
334extern void nfa_rw_handle_presence_check_rsp(tNFC_STATUS status);
335extern void nfa_rw_command_complete(void);
336extern bool nfa_rw_handle_event(NFC_HDR* p_msg);
337
338extern void nfa_rw_free_ndef_rx_buf(void);
339extern void nfa_rw_sys_disable(void);
340
341#endif /* NFA_DM_INT_H */
342