• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 device manager.
22  *
23  ******************************************************************************/
24 #ifndef NFA_DM_INT_H
25 #define NFA_DM_INT_H
26 
27 #include <string>
28 #include "nfa_api.h"
29 #include "nfa_sys.h"
30 #include "nfc_api.h"
31 
32 /*****************************************************************************
33 **  Constants and data types
34 *****************************************************************************/
35 
36 /* DM events */
37 enum {
38   /* device manager local device API events */
39   NFA_DM_API_ENABLE_EVT = NFA_SYS_EVT_START(NFA_ID_DM),
40   NFA_DM_API_DISABLE_EVT,
41   NFA_DM_API_SET_CONFIG_EVT,
42   NFA_DM_API_GET_CONFIG_EVT,
43   NFA_DM_API_REQUEST_EXCL_RF_CTRL_EVT,
44   NFA_DM_API_RELEASE_EXCL_RF_CTRL_EVT,
45   NFA_DM_API_ENABLE_POLLING_EVT,
46   NFA_DM_API_DISABLE_POLLING_EVT,
47   NFA_DM_API_ENABLE_LISTENING_EVT,
48   NFA_DM_API_DISABLE_LISTENING_EVT,
49   NFA_DM_API_RAW_FRAME_EVT,
50   NFA_DM_API_START_RF_DISCOVERY_EVT,
51   NFA_DM_API_STOP_RF_DISCOVERY_EVT,
52   NFA_DM_API_SET_RF_DISC_DURATION_EVT,
53   NFA_DM_API_SELECT_EVT,
54   NFA_DM_API_UPDATE_RF_PARAMS_EVT,
55   NFA_DM_API_START_REMOVAL_DETECT_EVT,
56   NFA_DM_API_DEACTIVATE_EVT,
57   NFA_DM_API_POWER_OFF_SLEEP_EVT,
58   NFA_DM_API_REG_NDEF_HDLR_EVT,
59   NFA_DM_API_DEREG_NDEF_HDLR_EVT,
60   NFA_DM_API_REG_VSC_EVT,
61   NFA_DM_API_SEND_VSC_EVT,
62   NFA_DM_TIMEOUT_DISABLE_EVT,
63   NFA_DM_API_SET_POWER_SUB_STATE_EVT,
64   NFA_DM_API_SEND_RAW_VS_EVT,
65   NFA_DM_API_CHANGE_DISCOVERY_TECH_EVT,
66   NFA_DM_MAX_EVT
67 };
68 
69 /* data type for NFA_DM_API_ENABLE_EVT */
70 typedef struct {
71   NFC_HDR hdr;
72   tNFA_DM_CBACK* p_dm_cback;
73   tNFA_CONN_CBACK* p_conn_cback;
74 } tNFA_DM_API_ENABLE;
75 
76 /* data type for NFA_DM_API_DISABLE_EVT */
77 typedef struct {
78   NFC_HDR hdr;
79   bool graceful;
80 } tNFA_DM_API_DISABLE;
81 
82 /* data type for NFA_DM_API_SET_CONFIG_EVT */
83 typedef struct {
84   NFC_HDR hdr;
85   tNFA_PMID param_id;
86   uint8_t length;
87   uint8_t* p_data;
88 } tNFA_DM_API_SET_CONFIG;
89 
90 /* data type for NFA_DM_API_GET_CONFIG_EVT */
91 typedef struct {
92   NFC_HDR hdr;
93   uint8_t num_ids;
94   tNFA_PMID* p_pmids;
95 } tNFA_DM_API_GET_CONFIG;
96 
97 /* data type for NFA_DM_API_REQ_EXCL_RF_CTRL_EVT */
98 typedef struct {
99   NFC_HDR hdr;
100   tNFA_TECHNOLOGY_MASK poll_mask;
101   tNFA_LISTEN_CFG listen_cfg;
102   tNFA_CONN_CBACK* p_conn_cback;
103   tNFA_NDEF_CBACK* p_ndef_cback;
104 } tNFA_DM_API_REQ_EXCL_RF_CTRL;
105 
106 /* data type for NFA_DM_API_ENABLE_POLLING_EVT */
107 typedef struct {
108   NFC_HDR hdr;
109   tNFA_TECHNOLOGY_MASK poll_mask;
110 } tNFA_DM_API_ENABLE_POLL;
111 
112 /* data type for NFA_DM_API_CHANGE_DISCOVERY_TECH_EVT*/
113 typedef struct {
114   NFC_HDR hdr;
115   bool is_revert_poll;
116   bool is_revert_listen;
117   bool change_default_tech;
118   tNFA_TECHNOLOGY_MASK change_listen_mask;
119   tNFA_TECHNOLOGY_MASK change_poll_mask;
120 } tNFA_DM_API_CHANGE_DISCOVERY_TECH;
121 
122 /* data type for NFA_DM_API_SELECT_EVT */
123 typedef struct {
124   NFC_HDR hdr;
125   uint8_t rf_disc_id;
126   tNFA_NFC_PROTOCOL protocol;
127   tNFA_INTF_TYPE rf_interface;
128 } tNFA_DM_API_SELECT;
129 
130 /* data type for NFA_DM_API_UPDATE_RF_PARAMS_EVT */
131 typedef struct {
132   NFC_HDR hdr;
133   tNFA_RF_COMM_PARAMS params;
134 } tNFA_DM_API_UPDATE_RF_PARAMS;
135 
136 /* data type for NFA_DM_API_START_REMOVAL_DETECT_EVT */
137 typedef struct {
138   NFC_HDR hdr;
139   uint8_t waiting_time_int;
140 } tNFA_DM_API_START_REMOVAL_DETECT;
141 
142 /* data type for NFA_DM_API_DEACTIVATE_EVT */
143 typedef struct {
144   NFC_HDR hdr;
145   bool sleep_mode;
146 } tNFA_DM_API_DEACTIVATE;
147 
148 /* data type for NFA_DM_API_SET_RF_DISC_DURATION_EVT */
149 typedef struct {
150   NFC_HDR hdr;
151   uint16_t rf_disc_dur_ms;
152 } tNFA_DM_API_SET_RF_DISC_DUR;
153 
154 /* data type for NFA_DM_API_REG_NDEF_HDLR_EVT */
155 #define NFA_NDEF_FLAGS_HANDLE_WHOLE_MESSAGE 0x01
156 #define NFA_NDEF_FLAGS_WKT_URI 0x02
157 #define NFA_NDEF_FLAGS_WHOLE_MESSAGE_NOTIFIED 0x04
158 
159 typedef struct {
160   NFC_HDR hdr;
161   tNFA_HANDLE ndef_type_handle;
162   uint8_t flags;
163   tNFA_NDEF_CBACK* p_ndef_cback;
164   tNFA_TNF tnf; /* Type-name field of record-type that was registered. */
165   tNFA_NDEF_URI_ID
166       uri_id; /* URI prefix abrieviation (for NFA_RegisterNDefUriHandler) */
167   uint8_t name_len; /* Length of type name or absolute URI */
168   uint8_t name[1];  /* Type name or absolute URI of record-type that got was
169                        registered.    */
170 } tNFA_DM_API_REG_NDEF_HDLR;
171 
172 /* data type for NFA_DM_API_DEREG_NDEF_HDLR_EVT */
173 typedef struct {
174   NFC_HDR hdr;
175   tNFA_HANDLE ndef_type_handle;
176 } tNFA_DM_API_DEREG_NDEF_HDLR;
177 
178 /* data type for NFA_DM_API_REG_VSC_EVT */
179 typedef struct {
180   NFC_HDR hdr;
181   tNFA_VSC_CBACK* p_cback;
182   bool is_register;
183 } tNFA_DM_API_REG_VSC;
184 
185 /* data type for NFA_DM_API_SEND_VSC_EVT */
186 typedef struct {
187   NFC_HDR hdr;
188   tNFA_VSC_CBACK* p_cback;
189   uint8_t oid;
190   uint8_t cmd_params_len;
191   uint16_t pad; /* add padding to ensure the size is big enough for
192                    offset=NCI_VSC_MSG_HDR_SIZE */
193   uint8_t* p_cmd_params;
194 } tNFA_DM_API_SEND_VSC;
195 
196 /* data type for NFA_DM_API_SET_POWER_SUB_STATE_EVT */
197 typedef struct {
198   NFC_HDR hdr;
199   uint8_t screen_state;
200 } tNFA_DM_API_SET_POWER_SUB_STATE;
201 
202 /* union of all data types */
203 typedef union {
204   /* GKI event buffer header */
205   NFC_HDR hdr;                      /* NFA_DM_API_RAW_FRAME_EVT             */
206                                     /* NFA_DM_API_MULTI_TECH_RSP_EVT        */
207                                     /* NFA_DM_API_RELEASE_EXCL_RF_CTRL      */
208                                     /* NFA_DM_API_DISABLE_POLLING_EVT       */
209                                     /* NFA_DM_API_START_RF_DISCOVERY_EVT    */
210                                     /* NFA_DM_API_STOP_RF_DISCOVERY_EVT     */
211   tNFA_DM_API_ENABLE enable;        /* NFA_DM_API_ENABLE_EVT                */
212   tNFA_DM_API_DISABLE disable;      /* NFA_DM_API_DISABLE_EVT               */
213   tNFA_DM_API_SET_CONFIG setconfig; /* NFA_DM_API_SET_CONFIG_EVT            */
214   tNFA_DM_API_GET_CONFIG getconfig; /* NFA_DM_API_GET_CONFIG_EVT            */
215   tNFA_DM_API_SET_RF_DISC_DUR
216       disc_duration; /* NFA_DM_API_SET_RF_DISC_DURATION_EVT  */
217   tNFA_DM_API_REG_NDEF_HDLR reg_ndef_hdlr; /* NFA_DM_API_REG_NDEF_HDLR_EVT */
218   tNFA_DM_API_DEREG_NDEF_HDLR
219       dereg_ndef_hdlr; /* NFA_DM_API_DEREG_NDEF_HDLR_EVT       */
220   tNFA_DM_API_REQ_EXCL_RF_CTRL
221       req_excl_rf_ctrl; /* NFA_DM_API_REQUEST_EXCL_RF_CTRL      */
222   tNFA_DM_API_ENABLE_POLL enable_poll; /* NFA_DM_API_ENABLE_POLLING_EVT */
223   tNFA_DM_API_SELECT select; /* NFA_DM_API_SELECT_EVT                */
224   tNFA_DM_API_UPDATE_RF_PARAMS
225       update_rf_params;              /* NFA_DM_API_UPDATE_RF_PARAMS_EVT      */
226   tNFA_DM_API_START_REMOVAL_DETECT
227       detect_removal_params;         /* NFA_DM_API_START_REMOVAL_DETECT_EVT  */
228   tNFA_DM_API_DEACTIVATE deactivate; /* NFA_DM_API_DEACTIVATE_EVT            */
229   tNFA_DM_API_SEND_VSC send_vsc;     /* NFA_DM_API_SEND_VSC_EVT              */
230   tNFA_DM_API_REG_VSC reg_vsc;       /* NFA_DM_API_REG_VSC_EVT               */
231   /* NFA_DM_API_SET_POWER_SUB_STATE_EVT */
232   tNFA_DM_API_SET_POWER_SUB_STATE set_power_state;
233   /* NFA_DM_API_CHANGE_DISCOVERY_TECH_EVT */
234   tNFA_DM_API_CHANGE_DISCOVERY_TECH change_discovery_tech;
235 } tNFA_DM_MSG;
236 
237 /* DM RF discovery state */
238 enum {
239   NFA_DM_RFST_IDLE,                   /* idle state                     */
240   NFA_DM_RFST_DISCOVERY,              /* discovery state                */
241   NFA_DM_RFST_W4_ALL_DISCOVERIES,     /* wait for all discoveries state */
242   NFA_DM_RFST_W4_HOST_SELECT,         /* wait for host selection state  */
243   NFA_DM_RFST_POLL_ACTIVE,            /* poll mode activated state      */
244   NFA_DM_RFST_POLL_REMOVAL_DETECTION, /* poll removal detection state */
245   NFA_DM_RFST_LISTEN_ACTIVE,          /* listen mode activated state    */
246   NFA_DM_RFST_LISTEN_SLEEP,           /* listen mode sleep state        */
247   NFA_DM_RFST_LP_LISTEN,              /* Listening in Low Power mode    */
248   NFA_DM_RFST_LP_ACTIVE               /* Activated in Low Power mode    */
249 };
250 typedef uint8_t tNFA_DM_RF_DISC_STATE;
251 
252 /* DM RF discovery state machine event */
253 enum {
254   NFA_DM_RF_DISCOVER_CMD,        /* start RF discovery                    */
255   NFA_DM_RF_DISCOVER_RSP,        /* discover response from NFCC           */
256   NFA_DM_RF_DISCOVER_NTF,        /* RF discovery NTF from NFCC            */
257   NFA_DM_RF_DISCOVER_SELECT_CMD, /* select discovered target              */
258   NFA_DM_RF_DISCOVER_SELECT_RSP, /* select response from NFCC             */
259   NFA_DM_RF_INTF_ACTIVATED_NTF,  /* RF interface activation NTF from NFCC */
260   NFA_DM_RF_DEACTIVATE_CMD,      /* deactivate RF interface               */
261   NFA_DM_RF_DEACTIVATE_RSP,      /* deactivate response from NFCC         */
262   NFA_DM_RF_DEACTIVATE_NTF,      /* deactivate RF interface NTF from NFCC */
263   NFA_DM_RF_INTF_EXT_START_CMD,  /* start RF interface extension          */
264   NFA_DM_RF_INTF_EXT_START_RSP,  /* start extension response from NFCC    */
265   NFA_DM_RF_INTF_EXT_STOP_CMD,   /* stop RF interface extension           */
266   NFA_DM_RF_INTF_EXT_STOP_RSP,   /* stop extension response from NFCC     */
267   NFA_DM_RF_REMOVAL_DETECT_START_CMD, /* start endpoint removal detection */
268   NFA_DM_RF_REMOVAL_DETECT_START_RSP, /* start removal detection RSP from NFCC
269                                        */
270   NFA_DM_RF_REMOVAL_DETECTION_NTF,    /* removal detection NTF from NFCC     */
271   NFA_DM_WPT_START_CMD,       /* start wireless power transfer phase   */
272   NFA_DM_WPT_START_RSP,       /* start WPT response from NFCC          */
273   NFA_DM_LP_LISTEN_CMD,       /* NFCC is listening in low power mode   */
274   NFA_DM_CORE_INTF_ERROR_NTF, /* RF interface error NTF from NFCC      */
275   NFA_DM_DISC_SM_MAX_EVENT
276 };
277 typedef uint8_t tNFA_DM_RF_DISC_SM_EVENT;
278 
279 /* DM RF discovery state machine data */
280 typedef struct {
281   uint8_t rf_disc_id;
282   tNFA_NFC_PROTOCOL protocol;
283   tNFA_INTF_TYPE rf_interface;
284 } tNFA_DM_DISC_SELECT_PARAMS;
285 
286 /* DM Removal Detection data */
287 typedef struct {
288   uint8_t rf_intf_ext_id;
289   uint8_t cmd_params_len;
290   uint8_t* p_cmd_params;
291 } tNFA_DM_DISC_RF_EXT_PARAMS;
292 
293 typedef struct {
294   uint8_t waiting_time;
295 } tNFA_DM_DETECT_EP_REMOVAL_PARAMS;
296 
297 /* DM WPT data */
298 typedef struct {
299   uint8_t power_adj_req;
300   uint8_t wpt_time_int;
301 } tNFA_DM_DISC_WPT_START_PARAMS;
302 
303 typedef union {
304   tNFC_DISCOVER nfc_discover;        /* discovery data from NFCC    */
305   tNFC_DEACT_TYPE deactivate_type;   /* deactivation type           */
306   tNFA_DM_DISC_SELECT_PARAMS select; /* selected target information */
307   tNFA_DM_DISC_RF_EXT_PARAMS handle_ext; /* RF extension information */
308   /* Removal detection information */
309   tNFA_DM_DETECT_EP_REMOVAL_PARAMS detect_removal;
310   tNFA_DM_DISC_WPT_START_PARAMS start_wpt; /*  start power transfer */
311 } tNFA_DM_RF_DISC_DATA;
312 
313 /* Callback event from NFA DM RF Discovery to other NFA sub-modules */
314 enum {
315   NFA_DM_RF_DISC_START_EVT, /* discovery started with protocol, technology and
316                                mode       */
317   NFA_DM_RF_DISC_ACTIVATED_EVT,  /* activated with configured protocol,
318                                     technology and mode    */
319   NFA_DM_RF_DISC_DEACTIVATED_EVT /* deactivated sleep or idle */
320 };
321 typedef uint8_t tNFA_DM_RF_DISC_EVT;
322 
323 /* Combined NFC Technology and protocol bit mask */
324 #define NFA_DM_DISC_MASK_PA_T1T 0x00000001
325 #define NFA_DM_DISC_MASK_PA_T2T 0x00000002
326 #define NFA_DM_DISC_MASK_PA_ISO_DEP 0x00000004
327 #define NFA_DM_DISC_MASK_PA_NFC_DEP 0x00000008
328 #define NFA_DM_DISC_MASK_PB_ISO_DEP 0x00000010
329 #define NFA_DM_DISC_MASK_PF_T3T 0x00000020
330 #define NFA_DM_DISC_MASK_PF_NFC_DEP 0x00000040
331 #define NFA_DM_DISC_MASK_P_T5T 0x00000100
332 #define NFA_DM_DISC_MASK_P_B_PRIME 0x00000200
333 #define NFA_DM_DISC_MASK_P_KOVIO 0x00000400
334 /* Legacy/proprietary/non-NFC Forum protocol (e.g Shanghai transit card) */
335 #define NFA_DM_DISC_MASK_P_LEGACY 0x00002000
336 #define NFA_DM_DISC_MASK_PA_MIFARE 0x00004000
337 #define NFA_DM_DISC_MASK_PB_CI 0x00008000
338 #define NFA_DM_DISC_MASK_POLL 0x0000FFFF
339 
340 #define NFA_DM_DISC_MASK_LA_T1T 0x00010000
341 #define NFA_DM_DISC_MASK_LA_T2T 0x00020000
342 #define NFA_DM_DISC_MASK_LA_ISO_DEP 0x00040000
343 #define NFA_DM_DISC_MASK_LB_ISO_DEP 0x00100000
344 #define NFA_DM_DISC_MASK_LF_T3T 0x00200000
345 #define NFA_DM_DISC_MASK_L_ISO15693 0x01000000
346 #define NFA_DM_DISC_MASK_L_B_PRIME 0x02000000
347 #define NFA_DM_DISC_MASK_L_LEGACY 0x10000000
348 #define NFA_DM_DISC_MASK_LISTEN 0xFFFF0000
349 
350 typedef uint32_t tNFA_DM_DISC_TECH_PROTO_MASK;
351 
352 /* DM RF discovery host ID */
353 #define NFA_DM_DISC_HOST_ID_DH NFC_DH_ID
354 typedef uint8_t tNFA_DM_DISC_HOST_ID;
355 
356 /* DM deactivation callback type */
357 typedef void(tNFA_DISCOVER_CBACK)(tNFA_DM_RF_DISC_EVT event,
358                                   tNFC_DISCOVER* p_data);
359 
360 /* DM RF discovery action flags */
361 /* RF discovery process has been started        */
362 #define NFA_DM_DISC_FLAGS_ENABLED 0x0001
363 /* Stop RF discovery is pending                 */
364 #define NFA_DM_DISC_FLAGS_STOPPING 0x0002
365 /* Disable NFA is pending                       */
366 #define NFA_DM_DISC_FLAGS_DISABLING 0x0004
367 /* Sleep wakeup in progress                     */
368 #define NFA_DM_DISC_FLAGS_CHECKING 0x0008
369 /* Notify sub-module that discovery is starting */
370 #define NFA_DM_DISC_FLAGS_NOTIFY 0x0010
371 /* command has been sent to NFCC in the state   */
372 #define NFA_DM_DISC_FLAGS_W4_RSP 0x0020
373 /* wait for NTF before changing discovery state */
374 #define NFA_DM_DISC_FLAGS_W4_NTF 0x0040
375 
376 typedef uint16_t tNFA_DM_DISC_FLAGS;
377 
378 /* DM Discovery control block */
379 typedef struct {
380   bool in_use;                       /* TRUE if used          */
381   tNFA_DISCOVER_CBACK* p_disc_cback; /* discovery callback    */
382 
383   tNFA_DM_DISC_FLAGS disc_flags; /* specific action flags */
384   tNFA_DM_DISC_HOST_ID host_id;  /* DH or UICC1/UICC2     */
385   tNFA_DM_DISC_TECH_PROTO_MASK
386       requested_disc_mask; /* technology and protocol requested              */
387   tNFA_DM_DISC_TECH_PROTO_MASK
388       selected_disc_mask; /* technology and protocol waiting for activation */
389 } tNFA_DM_DISC_ENTRY;
390 
391 /* polling, raw listen, P2P listen, NDEF CE, 2xVSE, 2xUICC */
392 #define NFA_DM_DISC_NUM_ENTRIES 8
393 
394 /* max discovery technology parameters */
395 #define NFA_DM_MAX_DISC_PARAMS 16
396 
397 /* index of listen mode routing table for technologies */
398 enum {
399   NFA_DM_DISC_LRT_NFC_A,
400   NFA_DM_DISC_LRT_NFC_B,
401   NFA_DM_DISC_LRT_NFC_F,
402   NFA_DM_DISC_LRT_NFC_BP
403 };
404 
405 /* NFA_EE_MAX_TECH_ROUTE. only A, B, F, Bprime are supported by UICC now */
406 #define NFA_DM_MAX_TECH_ROUTE 4
407 
408 typedef struct {
409   uint16_t disc_duration; /* Disc duration                                    */
410   tNFA_DM_DISC_FLAGS disc_flags;    /* specific action flags */
411   tNFA_DM_RF_DISC_STATE disc_state; /* RF discovery state */
412 
413   tNFC_RF_TECH_N_MODE activated_tech_mode; /* activated technology and mode */
414   uint8_t activated_rf_disc_id;            /* activated RF discovery ID */
415   tNFA_INTF_TYPE activated_rf_interface;   /* activated RF interface */
416   tNFA_NFC_PROTOCOL activated_protocol;    /* activated protocol */
417   tNFA_HANDLE activated_handle;            /* handle of activated sub-module */
418   uint8_t activated_sel_res; /* activated tag's SEL_RES response */
419 
420   tNFA_DM_DISC_ENTRY entry[NFA_DM_DISC_NUM_ENTRIES];
421 
422   tNFA_DM_DISC_ENTRY excl_disc_entry; /* exclusive RF discovery */
423   tNFA_LISTEN_CFG excl_listen_config; /* listen cfg for exclusive-rf mode */
424 
425   uint8_t listen_RT[NFA_DM_MAX_TECH_ROUTE]; /* Host ID for A, B, F, B'
426                                                technology routing*/
427   tNFA_DM_DISC_TECH_PROTO_MASK
428       dm_disc_mask; /* technology and protocol waiting for activation   */
429 
430   TIMER_LIST_ENT tle; /* timer for waiting deactivation NTF               */
431   TIMER_LIST_ENT kovio_tle; /* timer for Kovio bar code tag presence check */
432 
433   bool deact_pending; /* TRUE if deactivate while checking presence       */
434   bool deact_notify_pending; /* TRUE if notify DEACTIVATED EVT while Stop rf
435                                 discovery*/
436   tNFA_DEACTIVATE_TYPE pending_deact_type; /* pending deactivate type */
437 
438 } tNFA_DM_DISC_CB;
439 
440 /* NDEF Type Handler Definitions */
441 /* Default handler entry in ndef_handler table      */
442 #define NFA_NDEF_DEFAULT_HANDLER_IDX 0
443 
444 /* Maximum number of pending SetConfigs */
445 #define NFA_DM_SETCONFIG_PENDING_MAX 32
446 
447 /* NFA_DM flags */
448 /* DM is enabled                                                        */
449 #define NFA_DM_FLAGS_DM_IS_ACTIVE 0x00000001
450 /* Exclusive RF mode is active                                          */
451 #define NFA_DM_FLAGS_EXCL_RF_ACTIVE 0x00000002
452 /* Polling is enabled (while not in exclusive RF mode                   */
453 #define NFA_DM_FLAGS_POLLING_ENABLED 0x00000004
454 /* send poll stop event                                                 */
455 #define NFA_DM_FLAGS_SEND_POLL_STOP_EVT 0x00000008
456 /* auto reading of NDEF in progress                                     */
457 #define NFA_DM_FLAGS_AUTO_READING_NDEF 0x00000010
458 /* NFA_DM_ENABLE_EVT is not reported yet                                */
459 #define NFA_DM_FLAGS_ENABLE_EVT_PEND 0x00000020
460 /* Send NFA_DEACTIVATED_EVT when deactivated                            */
461 #define NFA_DM_FLAGS_SEND_DEACTIVATED_EVT 0x00000040
462 /* NFCC is restoring after back to full power mode                      */
463 #define NFA_DM_FLAGS_NFCC_IS_RESTORING 0x00000100
464 /* NFCC power mode is updating                                          */
465 #define NFA_DM_FLAGS_SETTING_PWR_MODE 0x00000200
466 /* NFA DM is disabling NFC                                              */
467 #define NFA_DM_FLAGS_DM_DISABLING_NFC 0x00000400
468 /* NFA_SendRawFrame() is called since RF activation                     */
469 #define NFA_DM_FLAGS_RAW_FRAME 0x00000800
470 /* NFA_DisableListening() is called and engaged                         */
471 #define NFA_DM_FLAGS_LISTEN_DISABLED 0x00001000
472 /* Power Off Sleep                                                      */
473 #define NFA_DM_FLAGS_POWER_OFF_SLEEP 0x00008000
474 /* stored parameters */
475 /* Notification for RF Removal Detection is not reported yet            */
476 #define NFA_DM_FLAGS_EP_REMOVAL_DETECT_PEND 0x00004000
477 /* Response to WLC RF Interface Extension start is not reported yet     */
478 #define NFA_DM_FLAGS_ENABLE_WLCP_PEND 0x00010000
479 /* WLCP RF Extension is started                                         */
480 #define NFA_DM_FLAGS_RF_EXT_ACTIVE 0x00020000
481 /* WLCP is ready to charge                                              */
482 #define NFA_DM_FLAGS_WLCP_ENABLED 0x00040000
483 
484 /* NFA_ChangeDiscoveryTech() is called and engaged                      */
485 #define NFA_DM_FLAGS_POLL_TECH_CHANGED 0x10000000
486 #define NFA_DM_FLAGS_LISTEN_TECH_CHANGED 0x20000000
487 #define NFA_DM_FLAGS_DEFAULT_TECH_CHANGED 0x40000000
488 /* stored parameters */
489 typedef struct {
490   uint8_t total_duration[NCI_PARAM_LEN_TOTAL_DURATION];
491 
492   uint8_t la_bit_frame_sdd[NCI_PARAM_LEN_LA_BIT_FRAME_SDD];
493   uint8_t la_bit_frame_sdd_len;
494   uint8_t la_platform_config[NCI_PARAM_LEN_LA_PLATFORM_CONFIG];
495   uint8_t la_platform_config_len;
496   uint8_t la_sel_info[NCI_PARAM_LEN_LA_SEL_INFO];
497   uint8_t la_sel_info_len;
498   uint8_t la_nfcid1[NCI_NFCID1_MAX_LEN];
499   uint8_t la_nfcid1_len;
500   uint8_t la_hist_by[NCI_MAX_HIS_BYTES_LEN];
501   uint8_t la_hist_by_len;
502 
503   uint8_t lb_sensb_info[NCI_PARAM_LEN_LB_SENSB_INFO];
504   uint8_t lb_sensb_info_len;
505   uint8_t lb_nfcid0[NCI_PARAM_LEN_LB_NFCID0];
506   uint8_t lb_nfcid0_len;
507   uint8_t lb_appdata[NCI_PARAM_LEN_LB_APPDATA];
508   uint8_t lb_appdata_len;
509   uint8_t lb_adc_fo[NCI_PARAM_LEN_LB_ADC_FO];
510   uint8_t lb_adc_fo_len;
511   uint8_t lb_h_info[NCI_MAX_ATTRIB_LEN];
512   uint8_t lb_h_info_len;
513 
514   uint8_t lf_protocol[NCI_PARAM_LEN_LF_PROTOCOL];
515   uint8_t lf_protocol_len;
516   uint8_t lf_t3t_flags2[NCI_PARAM_LEN_LF_T3T_FLAGS2];
517   uint8_t lf_t3t_flags2_len;
518   uint8_t lf_t3t_pmm[NCI_PARAM_LEN_LF_T3T_PMM];
519   uint8_t lf_t3t_id[NFA_CE_LISTEN_INFO_MAX]
520                    [NCI_PARAM_LEN_LF_T3T_ID(NCI_VERSION_2_0)];
521 
522   uint8_t fwi[NCI_PARAM_LEN_FWI];
523   uint8_t wt[NCI_PARAM_LEN_WT];
524   uint8_t atr_req_gen_bytes[NCI_MAX_GEN_BYTES_LEN];
525   uint8_t atr_req_gen_bytes_len;
526   uint8_t atr_res_gen_bytes[NCI_MAX_GEN_BYTES_LEN];
527   uint8_t atr_res_gen_bytes_len;
528 
529   uint8_t pf_rc[NCI_PARAM_LEN_PF_RC];
530   uint8_t rf_field_info[NCI_PARAM_LEN_RF_FIELD_INFO];
531   uint8_t rf_field_info_len;
532 } tNFA_DM_PARAMS;
533 
534 /*
535 **  NFA_NDEF CHO callback
536 **  It returns TRUE if NDEF is handled by connection handover module.
537 */
538 typedef bool(tNFA_NDEF_CHO_CBACK)(uint32_t ndef_len, uint8_t* p_ndef_data);
539 
540 /* DM control block */
541 typedef struct {
542   uint32_t flags; /* NFA_DM flags (see definitions for NFA_DM_FLAGS_*)    */
543   tNFA_DM_CBACK* p_dm_cback; /* NFA DM callback */
544   TIMER_LIST_ENT tle;
545 
546   /* NFC link connection management */
547   tNFA_CONN_CBACK* p_conn_cback;  /* callback for connection events       */
548   tNFA_TECHNOLOGY_MASK poll_mask; /* technologies being polled            */
549 
550   tNFA_CONN_CBACK* p_excl_conn_cback; /* exclusive RF mode callback           */
551   tNFA_NDEF_CBACK* p_excl_ndef_cback; /* ndef callback for exclusive RF mdoe  */
552 
553   tNFA_NDEF_CHO_CBACK*
554       p_ndef_cho_cback; /* NDEF callback for static connection handover */
555 
556   tNFA_HANDLE poll_disc_handle; /* discovery handle for polling         */
557 
558   uint8_t* p_activate_ntf; /* temp holding activation notfication  */
559   tHAL_API_GET_MAX_NFCEE* get_max_ee;
560 
561   tNFC_RF_TECH_N_MODE
562       activated_tech_mode; /* previous activated technology and mode */
563   uint8_t activated_nfcid[NFC_KOVIO_MAX_LEN]; /* NFCID 0/1/2 or UID of
564                                                  ISO15694/Kovio  */
565   uint8_t activated_nfcid_len; /* length of NFCID or UID               */
566 
567   /* NFC link discovery management */
568   tNFA_DM_DISC_CB disc_cb;
569 
570   /* NDEF Type handler */
571   tNFA_DM_API_REG_NDEF_HDLR*
572       p_ndef_handler[NFA_NDEF_MAX_HANDLERS]; /* ndef handler table */
573 
574   /* stored parameters */
575   tNFA_DM_PARAMS params;
576 
577   /* SetConfig management */
578   uint32_t setcfg_pending_mask; /* Mask of to indicate whether pending
579                                    SET_CONFIGs require NFA_DM_SET_CONFIG_EVT.
580                                    LSB=oldest pending */
581   uint8_t setcfg_pending_num;   /* Number of setconfigs pending */
582 
583   /* NFCC power mode */
584   uint8_t nfcc_pwr_mode; /* NFA_DM_PWR_MODE_FULL or NFA_DM_PWR_MODE_OFF_SLEEP */
585 
586   tNFC_DEACT_TYPE listen_deact_cmd_type;
587   uint8_t deactivate_cmd_retry_count; /*number of times the deactivation cmd
588                                          sent in case of error scenerio */
589   bool is_nfc_secure;
590   uint8_t power_state; /* current screen/power  state */
591   uint32_t eDtaMode;   /* To enable the DTA type modes. */
592   uint8_t pending_power_state; /* pending screen state change received in
593                                   LISTEN_ACTIVE state which needs to be applied
594                                   after current transaction is completed*/
595   /* ChangeDiscoveryTech management */
596   tNFA_TECHNOLOGY_MASK change_poll_mask;   /* changing poll tech mask */
597   tNFA_TECHNOLOGY_MASK change_listen_mask; /* changing listen tech mask */
598 } tNFA_DM_CB;
599 
600 /* Internal function prototypes */
601 void nfa_dm_ndef_handle_message(tNFA_STATUS status, uint8_t* p_msg_buf,
602                                 uint32_t len);
603 void nfa_dm_ndef_dereg_all(void);
604 void nfa_dm_act_conn_cback_notify(uint8_t event, tNFA_CONN_EVT_DATA* p_data);
605 void nfa_dm_notify_activation_status(tNFA_STATUS status,
606                                      tNFA_TAG_PARAMS* p_params);
607 
608 bool nfa_dm_act_send_raw_vs(tNFA_DM_MSG* p_data);
609 
610 void nfa_dm_disable_complete(void);
611 
612 /* Internal functions from nfa_rw */
613 void nfa_rw_init(void);
614 void nfa_rw_proc_disc_evt(tNFA_DM_RF_DISC_EVT event, tNFC_DISCOVER* p_data,
615                           bool excl_rf_not_active);
616 tNFA_STATUS nfa_rw_send_raw_frame(NFC_HDR* p_data);
617 
618 /* Internal functions from nfa_ce */
619 void nfa_ce_init(void);
620 
621 /* Pointer to compile-time configuration structure */
622 extern tNFA_DM_DISC_FREQ_CFG* p_nfa_dm_rf_disc_freq_cfg;
623 extern tNFA_HCI_CFG* p_nfa_hci_cfg;
624 extern tNFA_DM_CFG* p_nfa_dm_cfg;
625 extern uint8_t* p_nfa_dm_ce_cfg;
626 extern uint8_t* p_nfa_dm_gen_cfg;
627 extern uint8_t nfa_ee_max_ee_cfg;
628 extern tNCI_DISCOVER_MAPS* p_nfa_dm_interface_mapping;
629 extern uint8_t nfa_dm_num_dm_interface_mapping;
630 extern bool nfa_poll_bail_out_mode;
631 
632 void nfa_dm_poll_disc_cback_dta_wrapper(tNFA_DM_RF_DISC_EVT event,
633                                         tNFC_DISCOVER* p_data);
634 void nfa_dm_nfc_response_cback_wrapper(tNFC_RESPONSE_EVT event,
635                                        tNFC_RESPONSE* p_data);
636 extern unsigned char appl_dta_mode_flag;
637 
638 /* NFA device manager control block */
639 extern tNFA_DM_CB nfa_dm_cb;
640 
641 void nfa_dm_init(void);
642 
643 #if (NFC_NFCEE_INCLUDED == TRUE)
644 void nfa_ee_init(void);
645 void nfa_hci_init(void);
646 #else
647 #define nfa_ee_init()
648 #define nfa_hci_init()
649 #endif
650 
651 /* Action function prototypes */
652 bool nfa_dm_enable(tNFA_DM_MSG* p_data);
653 bool nfa_dm_disable(tNFA_DM_MSG* p_data);
654 bool nfa_dm_set_config(tNFA_DM_MSG* p_data);
655 bool nfa_dm_get_config(tNFA_DM_MSG* p_data);
656 bool nfa_dm_act_request_excl_rf_ctrl(tNFA_DM_MSG* p_data);
657 bool nfa_dm_act_release_excl_rf_ctrl(tNFA_DM_MSG* p_data);
658 bool nfa_dm_act_enable_polling(tNFA_DM_MSG* p_data);
659 bool nfa_dm_act_disable_polling(tNFA_DM_MSG* p_data);
660 bool nfa_dm_act_enable_listening(tNFA_DM_MSG* p_data);
661 bool nfa_dm_act_disable_listening(tNFA_DM_MSG* p_data);
662 bool nfa_dm_act_send_raw_frame(tNFA_DM_MSG* p_data);
663 bool nfa_dm_act_start_rf_discovery(tNFA_DM_MSG* p_data);
664 bool nfa_dm_act_stop_rf_discovery(tNFA_DM_MSG* p_data);
665 bool nfa_dm_act_set_rf_disc_duration(tNFA_DM_MSG* p_data);
666 bool nfa_dm_act_select(tNFA_DM_MSG* p_data);
667 bool nfa_dm_act_update_rf_params(tNFA_DM_MSG* p_data);
668 bool nfa_dm_act_start_removal_detection(tNFA_DM_MSG* p_data);
669 bool nfa_dm_act_deactivate(tNFA_DM_MSG* p_data);
670 bool nfa_dm_act_power_off_sleep(tNFA_DM_MSG* p_data);
671 bool nfa_dm_ndef_reg_hdlr(tNFA_DM_MSG* p_data);
672 bool nfa_dm_ndef_dereg_hdlr(tNFA_DM_MSG* p_data);
673 
674 bool nfa_dm_act_reg_vsc(tNFA_DM_MSG* p_data);
675 bool nfa_dm_act_send_vsc(tNFA_DM_MSG* p_data);
676 uint16_t nfa_dm_act_get_rf_disc_duration();
677 bool nfa_dm_act_disable_timeout(tNFA_DM_MSG* p_data);
678 
679 bool nfa_dm_set_power_sub_state(tNFA_DM_MSG* p_data);
680 
681 void nfa_dm_proc_nfcc_power_mode(uint8_t nfcc_power_mode);
682 
683 /* Main function prototypes */
684 bool nfa_dm_evt_hdlr(NFC_HDR* p_msg);
685 void nfa_dm_sys_enable(void);
686 void nfa_dm_sys_disable(void);
687 tNFA_STATUS nfa_dm_check_set_config(uint8_t tlv_list_len, uint8_t* p_tlv_list,
688                                     bool app_init);
689 
690 void nfa_dm_conn_cback_event_notify(uint8_t event, tNFA_CONN_EVT_DATA* p_data);
691 
692 /* Discovery function prototypes */
693 void nfa_dm_disc_sm_execute(tNFA_DM_RF_DISC_SM_EVENT event,
694                             tNFA_DM_RF_DISC_DATA* p_data);
695 tNFA_HANDLE nfa_dm_add_rf_discover(tNFA_DM_DISC_TECH_PROTO_MASK disc_mask,
696                                    tNFA_DM_DISC_HOST_ID host_id,
697                                    tNFA_DISCOVER_CBACK* p_disc_cback);
698 void nfa_dm_delete_rf_discover(tNFA_HANDLE handle);
699 void nfa_dm_start_excl_discovery(tNFA_TECHNOLOGY_MASK poll_tech_mask,
700                                  tNFA_LISTEN_CFG* p_listen_cfg,
701                                  tNFA_DISCOVER_CBACK* p_disc_cback);
702 void nfa_dm_rel_excl_rf_control_and_notify(void);
703 void nfa_dm_stop_excl_discovery(void);
704 void nfa_dm_disc_new_state(tNFA_DM_RF_DISC_STATE new_state);
705 
706 void nfa_dm_start_rf_discover(void);
707 void nfa_dm_rf_discover_select(uint8_t rf_disc_id, tNFA_NFC_PROTOCOL protocol,
708                                tNFA_INTF_TYPE rf_interface);
709 bool nfa_dm_rf_removal_detection(uint8_t waiting_time);
710 tNFA_STATUS nfa_dm_rf_deactivate(tNFA_DEACTIVATE_TYPE deactivate_type);
711 bool nfa_dm_is_protocol_supported(tNFA_NFC_PROTOCOL protocol, uint8_t sel_res);
712 bool nfa_dm_is_active(void);
713 tNFC_STATUS nfa_dm_disc_sleep_wakeup(void);
714 tNFC_STATUS nfa_dm_disc_start_kovio_presence_check(void);
715 bool nfa_dm_is_raw_frame_session(void);
716 
717 bool nfa_dm_get_nfc_secure();
718 void nfa_dm_get_tech_route_block(uint8_t* listen_techmask, bool* enable);
719 void nfa_dm_start_rf_intf_ext(tNFA_INTF_EXT_TYPE extension, uint8_t* p_data,
720                               uint8_t len);
721 void nfa_dm_start_wireless_power_transfer(uint8_t power_adj_req,
722                                           uint8_t wpt_time_int);
723 bool nfa_dm_act_change_discovery_tech(tNFA_DM_MSG* p_data);
724 
725 #if (NFC_NFCEE_INCLUDED == FALSE)
726 #define nfa_ee_get_tech_route(ps, ha) \
727   memset(ha, NFC_DH_ID, NFA_DM_MAX_TECH_ROUTE);
728 #endif
729 
730 std::string nfa_dm_nfc_revt_2_str(tNFC_RESPONSE_EVT event);
731 
732 #endif /* NFA_DM_INT_H */
733