xref: /aosp_15_r20/system/nfc/src/nfa/include/nfa_rw_int.h (revision 7eba2f3b06c51ae21384f6a4f14577b668a869b3)
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*/
57 extern uint8_t NFA_RW_TAG_SLP_REQ[];
58 
59 typedef uint8_t tNFA_RW_TLV_ST;
60 
61 /* RW events */
62 enum {
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 */
72 enum {
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   NFA_RW_OP_T2T_READ_DYN_LOCKS,
99 
100   /* Exclusive Type-3 tag operations */
101   NFA_RW_OP_T3T_READ,
102   NFA_RW_OP_T3T_WRITE,
103   NFA_RW_OP_T3T_GET_SYSTEM_CODES,
104 
105   /* Exclusive ISO 15693 tag operations */
106   NFA_RW_OP_I93_INVENTORY,
107   NFA_RW_OP_I93_STAY_QUIET,
108   NFA_RW_OP_I93_READ_SINGLE_BLOCK,
109   NFA_RW_OP_I93_WRITE_SINGLE_BLOCK,
110   NFA_RW_OP_I93_LOCK_BLOCK,
111   NFA_RW_OP_I93_READ_MULTI_BLOCK,
112   NFA_RW_OP_I93_WRITE_MULTI_BLOCK,
113   NFA_RW_OP_I93_SELECT,
114   NFA_RW_OP_I93_RESET_TO_READY,
115   NFA_RW_OP_I93_WRITE_AFI,
116   NFA_RW_OP_I93_LOCK_AFI,
117   NFA_RW_OP_I93_WRITE_DSFID,
118   NFA_RW_OP_I93_LOCK_DSFID,
119   NFA_RW_OP_I93_GET_SYS_INFO,
120   NFA_RW_OP_I93_GET_MULTI_BLOCK_STATUS,
121   NFA_RW_OP_I93_SET_ADDR_MODE,
122   NFA_RW_OP_CI_ATTRIB,
123   NFA_RW_OP_CI_UID,
124   NFA_RW_OP_MAX
125 };
126 typedef uint8_t tNFA_RW_OP;
127 
128 /* Enumeration of parameter structios for nfa_rw operations */
129 
130 /* NFA_RW_OP_WRITE_NDEF params */
131 typedef struct {
132   uint32_t len;
133   uint8_t* p_data;
134 } tNFA_RW_OP_PARAMS_WRITE_NDEF;
135 
136 /* NFA_RW_OP_SEND_RAW_FRAME params */
137 typedef struct { NFC_HDR* p_data; } tNFA_RW_OP_PARAMS_SEND_RAW_FRAME;
138 
139 /* NFA_RW_OP_SET_TAG_RO params */
140 typedef struct { bool b_hard_lock; } tNFA_RW_OP_PARAMS_CONFIG_READ_ONLY;
141 
142 /* NFA_RW_OP_T1T_READ params */
143 typedef struct {
144   uint8_t segment_number;
145   uint8_t block_number;
146   uint8_t 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   bool b_erase;
153   uint8_t block_number;
154   uint8_t index;
155   uint8_t p_block_data[8];
156 } tNFA_RW_OP_PARAMS_T1T_WRITE;
157 
158 /* NFA_RW_OP_T2T_READ params */
159 typedef struct { uint8_t block_number; } tNFA_RW_OP_PARAMS_T2T_READ;
160 
161 /* NFA_RW_OP_T2T_WRITE params */
162 typedef struct {
163   uint8_t block_number;
164   uint8_t p_block_data[4];
165 } tNFA_RW_OP_PARAMS_T2T_WRITE;
166 
167 /* NFA_RW_OP_T2T_SECTOR_SELECT params */
168 typedef struct { uint8_t sector_number; } tNFA_RW_OP_PARAMS_T2T_SECTOR_SELECT;
169 
170 /* NFA_RW_OP_T2T_READ_DYN_LOCKS params */
171 typedef struct {
172   bool read_dyn_locks;
173 } tNFA_RW_OP_PARAMS_T2T_READ_DYN_LOCKS;
174 
175 /* NFA_RW_OP_T3T_READ params */
176 typedef struct {
177   uint8_t num_blocks;
178   tNFA_T3T_BLOCK_DESC* p_block_desc;
179 } tNFA_RW_OP_PARAMS_T3T_READ;
180 
181 /* NFA_RW_OP_T3T_WRITE params */
182 typedef struct {
183   uint8_t num_blocks;
184   tNFA_T3T_BLOCK_DESC* p_block_desc;
185   uint8_t* p_block_data;
186 } tNFA_RW_OP_PARAMS_T3T_WRITE;
187 
188 /* NFA_RW_OP_I93_XXX params */
189 typedef struct {
190   bool uid_present;
191   uint8_t uid[I93_UID_BYTE_LEN];
192   bool afi_present;
193   uint8_t afi;
194   uint8_t dsfid;
195   bool addr_mode;
196   uint16_t first_block_number;
197   uint16_t number_blocks;
198   uint8_t* p_data;
199 } tNFA_RW_OP_PARAMS_I93_CMD;
200 
201 typedef struct {
202   uint8_t nfcid0[NFC_NFCID0_MAX_LEN];
203 } tNFA_RW_OP_PARAMS_CI;
204 
205 /* Union of params for all reader/writer operations */
206 typedef union {
207   /* params for NFA_RW_OP_WRITE_NDEF */
208   tNFA_RW_OP_PARAMS_WRITE_NDEF write_ndef;
209 
210   /* params for NFA_RW_OP_SEND_RAW_FRAME */
211   tNFA_RW_OP_PARAMS_SEND_RAW_FRAME send_raw_frame;
212 
213   /* params for NFA_RW_OP_SET_TAG_RO */
214   tNFA_RW_OP_PARAMS_CONFIG_READ_ONLY set_readonly;
215 
216   /* params for NFA_RW_OP_T2T_READ and NFA_RW_OP_T1T_WRITE */
217   tNFA_RW_OP_PARAMS_T1T_READ t1t_read;
218   tNFA_RW_OP_PARAMS_T1T_WRITE t1t_write;
219 
220   /* params for NFA_RW_OP_T2T_READ,NFA_RW_OP_T2T_WRITE and
221    * NFA_RW_OP_T2T_SECTOR_SELECT */
222   tNFA_RW_OP_PARAMS_T2T_READ t2t_read;
223   tNFA_RW_OP_PARAMS_T2T_WRITE t2t_write;
224   tNFA_RW_OP_PARAMS_T2T_SECTOR_SELECT t2t_sector_select;
225   tNFA_RW_OP_PARAMS_T2T_READ_DYN_LOCKS t2t_read_dyn_locks;
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   tNFA_RW_OP_PARAMS_CI ci_param;
237 
238 } tNFA_RW_OP_PARAMS;
239 
240 /* data type for NFA_RW_op_req_EVT */
241 typedef struct {
242   NFC_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   NFC_HDR hdr;
250   tNFC_ACTIVATE_DEVT* p_activate_params; /* Data from NFC_ACTIVATE_DEVT      */
251   bool excl_rf_not_active;               /* TRUE if not in exclusive RF mode */
252 } tNFA_RW_ACTIVATE_NTF;
253 
254 /* union of all data types */
255 typedef union {
256   /* GKI event buffer header */
257   NFC_HDR hdr;
258   tNFA_RW_OPERATION op_req;
259   tNFA_RW_ACTIVATE_NTF activate_ntf;
260 } tNFA_RW_MSG;
261 
262 /* NDEF detection status */
263 enum {
264   NFA_RW_NDEF_ST_UNKNOWN = 0, /* NDEF detection not performed yet */
265   NFA_RW_NDEF_ST_TRUE,        /* Tag is NDEF */
266   NFA_RW_NDEF_ST_FALSE        /* Tag is not NDEF */
267 };
268 typedef uint8_t tNFA_RW_NDEF_ST;
269 
270 /* flags for RW control block */
271 /* Activation while not in exclusive RF mode                                */
272 #define NFA_RW_FL_NOT_EXCL_RF_MODE 0x01
273 /* Waiting for response from tag for auto-presence check                    */
274 #define NFA_RW_FL_AUTO_PRESENCE_CHECK_BUSY 0x02
275 /* Read only tag                                                            */
276 #define NFA_RW_FL_TAG_IS_READONLY 0x04
277 /* Busy retrieving additional tag information                               */
278 #define NFA_RW_FL_ACTIVATION_NTF_PENDING 0x08
279 /* Tag operation is in progress                                             */
280 #define NFA_RW_FL_API_BUSY 0x10
281 /* Tag is been activated                                                    */
282 #define NFA_RW_FL_ACTIVATED 0x20
283 /* NDEF DETECTed OK                                                         */
284 #define NFA_RW_FL_NDEF_OK 0x40
285 
286 /* NFA RW control block */
287 typedef struct {
288   tNFA_RW_OP cur_op; /* Current operation */
289 
290   TIMER_LIST_ENT tle; /* list entry for nfa_rw timer */
291   tNFA_RW_MSG*
292       p_pending_msg; /* Pending API (if busy performing presence check) */
293 
294   /* Tag info */
295   tNFC_PROTOCOL protocol;
296   tNFC_INTF_TYPE intf_type;
297   uint8_t pa_sel_res;
298   tNFC_RF_TECH_N_MODE activated_tech_mode; /* activated technology and mode */
299 
300   bool b_hard_lock;
301 
302   tNFA_RW_MSG*
303       p_buffer_rw_msg; /* Buffer to hold incoming cmd while reading tag id */
304 
305   /* TLV info */
306   tNFA_RW_TLV_ST tlv_st; /* TLV detection status */
307 
308   /* NDEF info */
309   tNFA_RW_NDEF_ST ndef_st; /* NDEF detection status */
310   uint32_t ndef_max_size;  /* max number of bytes available for NDEF data */
311   uint32_t ndef_cur_size;  /* current size of stored NDEF data (in bytes) */
312   uint8_t* p_ndef_buf;
313   uint32_t ndef_rd_offset; /* current read-offset of incoming NDEF data */
314 
315   /* Current NDEF Write info */
316   uint8_t* p_ndef_wr_buf; /* Pointer to NDEF data being written */
317   uint32_t ndef_wr_len;   /* Length of NDEF data being written */
318 
319   /* Reactivating type 2 tag after NACK rsp */
320   tRW_EVENT halt_event; /* Event ID from stack after NACK response */
321   tRW_DATA rw_data;     /* Event Data from stack after NACK response */
322   bool skip_dyn_locks;  /* To skip reading dynamic locks during NDEF Detect */
323 
324   /* Flags (see defintions for NFA_RW_FL_* ) */
325   uint8_t flags;
326 
327   /* ISO 15693 tag memory information */
328   uint16_t i93_afi_location;
329   uint8_t i93_dsfid;
330   uint8_t i93_block_size;
331   uint16_t i93_num_block;
332   uint8_t i93_uid[I93_UID_BYTE_LEN];
333   uint8_t i93_addr_mode;
334 } tNFA_RW_CB;
335 extern tNFA_RW_CB nfa_rw_cb;
336 
337 /* type definition for action functions */
338 typedef bool (*tNFA_RW_ACTION)(tNFA_RW_MSG* p_data);
339 
340 /* Internal nfa_rw function prototypes */
341 extern void nfa_rw_stop_presence_check_timer(void);
342 
343 /* Action function prototypes */
344 extern bool nfa_rw_handle_op_req(tNFA_RW_MSG* p_data);
345 extern bool nfa_rw_activate_ntf(tNFA_RW_MSG* p_data);
346 extern bool nfa_rw_deactivate_ntf(tNFA_RW_MSG* p_data);
347 extern bool nfa_rw_presence_check_tick(tNFA_RW_MSG* p_data);
348 extern bool nfa_rw_presence_check_timeout(tNFA_RW_MSG* p_data);
349 extern void nfa_rw_handle_sleep_wakeup_rsp(tNFC_STATUS status);
350 extern void nfa_rw_handle_presence_check_rsp(tNFC_STATUS status);
351 extern void nfa_rw_command_complete(void);
352 extern bool nfa_rw_handle_event(NFC_HDR* p_msg);
353 
354 extern void nfa_rw_free_ndef_rx_buf(void);
355 extern void nfa_rw_sys_disable(void);
356 
357 #endif /* NFA_DM_INT_H */
358