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