1 /******************************************************************************
2  *
3  *  Copyright (C) 2010-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  *  NFA interface to NFCEE
23  *
24  ******************************************************************************/
25 #ifndef NFA_EE_API_H
26 #define NFA_EE_API_H
27 
28 #include "nfc_target.h"
29 #include "nfa_api.h"
30 #include "nfc_api.h"
31 
32 /*****************************************************************************
33 **  Constants and data types
34 *****************************************************************************/
35 #define NFA_MAX_AID_LEN             NFC_MAX_AID_LEN /* 16 per ISO 7816 specification    */
36 #define NFA_EE_HANDLE_DH            (NFA_HANDLE_GROUP_EE|NFC_DH_ID)
37 
38 /* NFA EE callback events */
39 enum
40 {
41     NFA_EE_DISCOVER_EVT,        /* The status for NFA_EeDiscover ()                      */
42     NFA_EE_REGISTER_EVT,        /* The status for NFA_EeRegister ()                      */
43     NFA_EE_DEREGISTER_EVT,      /* The status for NFA_EeDeregister ()                    */
44     NFA_EE_MODE_SET_EVT,        /* The status for activating or deactivating an NFCEE    */
45     NFA_EE_ADD_AID_EVT,         /* The status for adding an AID to a routing table entry */
46     NFA_EE_REMOVE_AID_EVT,      /* The status for removing an AID from a routing table   */
47     NFA_EE_REMAINING_SIZE_EVT,  /* The remaining size of the Listen Mode Routing Table   */
48     NFA_EE_SET_TECH_CFG_EVT,    /* The status for setting the routing based on RF tech.  */
49     NFA_EE_SET_PROTO_CFG_EVT,   /* The status for setting the routing based on protocols */
50     NFA_EE_UPDATED_EVT,         /* The status for NFA_EeUpdateNow                        */
51     NFA_EE_CONNECT_EVT,         /* Result of NFA_EeConnect                               */
52     NFA_EE_DATA_EVT,            /* Received data from NFCEE.                             */
53     NFA_EE_DISCONNECT_EVT,      /* NFCEE connection closed.                              */
54     NFA_EE_NEW_EE_EVT,          /* A new NFCEE is discovered                             */
55     NFA_EE_ACTION_EVT,          /* An action happened in NFCEE                           */
56     NFA_EE_DISCOVER_REQ_EVT,    /* NFCEE Discover Request Notification                   */
57     NFA_EE_ROUT_ERR_EVT,        /* Error - exceed NFCC CE Routing size                   */
58     NFA_EE_NO_MEM_ERR_EVT,      /* Error - out of GKI buffers                            */
59     NFA_EE_NO_CB_ERR_EVT        /* Error - Can not find control block or wrong state     */
60 };
61 typedef UINT8 tNFA_EE_EVT;
62 
63 /* tNFA_NFCEE_INTERFACE values */
64 #define NFA_EE_INTERFACE_APDU         NFC_NFCEE_INTERFACE_APDU          /* APDU Interface       */
65 #define NFA_EE_INTERFACE_HCI_ACCESS   NFC_NFCEE_INTERFACE_HCI_ACCESS    /* HCI Access Interface*/
66 #define NFA_EE_INTERFACE_T3T          NFC_NFCEE_INTERFACE_T3T           /* T3T Command Interface*/
67 #define NFA_EE_INTERFACE_TRANSPARENT  NFC_NFCEE_INTERFACE_TRANSPARENT   /* Transparent Interface*/
68 #define NFA_EE_INTERFACE_PROPRIETARY  NFC_NFCEE_INTERFACE_PROPRIETARY   /* Proprietary          */
69 typedef UINT8 tNFA_EE_INTERFACE;
70 
71 #define NFA_EE_TAG_HW_ID             NFC_NFCEE_TAG_HW_ID                /* HW/Registration ID   */
72 #define NFA_EE_TAG_ATR_BYTES         NFC_NFCEE_TAG_ATR_BYTES            /* ATR Bytes            */
73 #define NFA_EE_TAG_T3T_INFO          NFC_NFCEE_TAG_T3T_INFO             /* T3T Supplement. Info */
74 #define NFA_EE_TAG_HCI_HOST_ID       NFC_NFCEE_TAG_HCI_HOST_ID          /* Broadcom Proprietary */
75 typedef UINT8 tNFA_EE_TAG;
76 
77 /* for NFA_EeModeSet () */
78 #define NFA_EE_MD_ACTIVATE          NFC_MODE_ACTIVATE
79 #define NFA_EE_MD_DEACTIVATE        NFC_MODE_DEACTIVATE
80 typedef UINT8 tNFA_EE_MD;
81 
82 #define NFA_EE_PWR_STATE_ON         0x01    /* The device is on                 */
83 #define NFA_EE_PWR_STATE_SWITCH_OFF 0x02    /* The device is switched off       */
84 #define NFA_EE_PWR_STATE_BATT_OFF   0x04    /* The device's battery is removed  */
85 #define NFA_EE_PWR_STATE_NONE       0       /* used to remove a particular technology or protocol based routing cfg of a handle from the routing table. */
86 typedef UINT8 tNFA_EE_PWR_STATE;
87 
88 
89 #define NFA_EE_STATUS_INACTIVE          NFC_NFCEE_STATUS_INACTIVE /* NFCEE connected and inactive */
90 #define NFA_EE_STATUS_ACTIVE            NFC_NFCEE_STATUS_ACTIVE   /* NFCEE connected and active   */
91 #define NFA_EE_STATUS_REMOVED           NFC_NFCEE_STATUS_REMOVED  /* NFCEE removed                */
92 #define NFA_EE_STATUS_PENDING           0x10                      /* waiting for response from NFCC */
93 #define NFA_EE_STATUS_ACTIVATING        (NFA_EE_STATUS_PENDING+NFC_NFCEE_STATUS_ACTIVE)
94 #define NFA_EE_STATUS_DEACTIVATING      (NFA_EE_STATUS_PENDING+NFC_NFCEE_STATUS_INACTIVE)
95 typedef UINT8 tNFA_EE_STATUS;
96 
97 
98 
99 /* additional NFCEE Info */
100 typedef struct
101 {
102     tNFA_EE_TAG             tag;
103     UINT8                   len;
104     UINT8                   info[NFC_MAX_EE_INFO];
105 } tNFA_EE_TLV;
106 
107 typedef struct
108 {
109     tNFA_HANDLE         ee_handle;              /* handle for NFCEE oe DH   */
110     tNFA_EE_STATUS      ee_status;              /* The NFCEE status         */
111     UINT8               num_interface;          /* number of NFCEE interface*/
112     tNFA_EE_INTERFACE   ee_interface[NFC_MAX_EE_INTERFACE];/* NFCEE supported interface */
113     UINT8               num_tlvs;               /* number of TLVs           */
114     tNFA_EE_TLV         ee_tlv[NFC_MAX_EE_TLVS];/* the TLV                  */
115 } tNFA_EE_INFO;
116 
117 
118 
119 typedef struct
120 {
121     tNFA_STATUS         status;                         /* NFA_STATUS_OK is successful      */
122     UINT8               num_ee;                         /* number of NFCEEs found           */
123     tNFA_EE_INFO        ee_info[NFA_EE_MAX_EE_SUPPORTED];/*NFCEE information                */
124 } tNFA_EE_DISCOVER;
125 
126 typedef struct
127 {
128     tNFA_HANDLE         ee_handle;      /* Handle of NFCEE                                  */
129     tNFA_STATUS         status;         /* NFA_STATUS_OK is successful                      */
130     tNFA_EE_INTERFACE   ee_interface;   /* NFCEE interface associated with this connection  */
131 } tNFA_EE_CONNECT;
132 
133 #define NFA_EE_TRGR_SELECT              NFC_EE_TRIG_SELECT       /* ISO 7816-4 SELECT command */
134 #define NFA_EE_TRGR_RF_PROTOCOL         NFC_EE_TRIG_RF_PROTOCOL  /* RF Protocol changed       */
135 #define NFA_EE_TRGR_RF_TECHNOLOGY       NFC_EE_TRIG_RF_TECHNOLOGY/* RF Technology changed     */
136 #define NFA_EE_TRGR_APP_INIT            NFC_EE_TRIG_APP_INIT     /* Application initiation    */
137 typedef tNFC_EE_TRIGGER tNFA_EE_TRIGGER;
138 
139 /* Union of NFCEE action parameter depending on the associated trigger */
140 typedef union
141 {
142     tNFA_NFC_PROTOCOL   protocol;   /* NFA_EE_TRGR_RF_PROTOCOL: the protocol that triggers this event */
143     tNFC_RF_TECH        technology; /* NFA_EE_TRGR_RF_TECHNOLOGY:the technology that triggers this event */
144     tNFC_AID            aid;        /* NFA_EE_TRGR_SELECT      : the AID in the received SELECT AID command */
145     tNFC_APP_INIT       app_init;   /* NFA_EE_TRGR_APP_INIT:     The information for the application initiated trigger */
146 } tNFA_EE_ACTION_PARAM;
147 
148 typedef struct
149 {
150     tNFA_HANDLE             ee_handle;      /* Handle of NFCEE                  */
151     tNFA_EE_TRIGGER         trigger;        /* the trigger of this event        */
152     tNFA_EE_ACTION_PARAM    param;
153 } tNFA_EE_ACTION;
154 
155 typedef struct
156 {
157     tNFA_HANDLE         ee_handle;  /* Handle of NFCEE              */
158     tNFA_STATUS         status;     /* NFA_STATUS_OK is successful  */
159     tNFA_EE_STATUS      ee_status;  /* The NFCEE status             */
160 } tNFA_EE_MODE_SET;
161 
162 typedef struct
163 {
164     tNFA_HANDLE         ee_handle;          /* Handle of MFCEE      */
165     tNFA_NFC_PROTOCOL   la_protocol;        /* Listen A protocol    */
166     tNFA_NFC_PROTOCOL   lb_protocol;        /* Listen B protocol    */
167     tNFA_NFC_PROTOCOL   lf_protocol;        /* Listen F protocol    */
168     tNFA_NFC_PROTOCOL   lbp_protocol;       /* Listen B' protocol   */
169 } tNFA_EE_DISCOVER_INFO;
170 
171 /* Data for NFA_EE_DISCOVER_REQ_EVT */
172 typedef struct
173 {
174     UINT8                   status;                         /* NFA_STATUS_OK if successful   */
175     UINT8                   num_ee;                         /* number of MFCEE information   */
176     tNFA_EE_DISCOVER_INFO   ee_disc_info[NFA_EE_MAX_EE_SUPPORTED - 1]; /* NFCEE DISCOVER Request info   */
177 } tNFA_EE_DISCOVER_REQ;
178 
179 /* Data for NFA_EE_DATA_EVT */
180 typedef struct
181 {
182     tNFA_HANDLE handle;     /* Connection handle */
183     UINT16      len;        /* Length of data    */
184     UINT8       *p_buf;     /* Data buffer       */
185 } tNFA_EE_DATA;
186 
187 /* Union of all EE callback structures */
188 typedef union
189 {
190     tNFA_STATUS             status;             /* NFA_STATUS_OK is successful; otherwise NFA_STATUS_FAILED */
191     tNFA_EE_DATA            data;
192     tNFA_HANDLE             handle;
193     tNFA_EE_DISCOVER        ee_discover;
194     tNFA_STATUS             ee_register;
195     tNFA_STATUS             deregister;
196     tNFA_STATUS             add_aid;
197     tNFA_STATUS             remove_aid;
198     tNFA_STATUS             set_tech;
199     tNFA_STATUS             set_proto;
200     UINT16                  size;
201     tNFA_EE_CONNECT         connect;
202     tNFA_EE_ACTION          action;
203     tNFA_EE_MODE_SET        mode_set;
204     tNFA_EE_INFO            new_ee;
205     tNFA_EE_DISCOVER_REQ    discover_req;
206 } tNFA_EE_CBACK_DATA;
207 
208 
209 /* EE callback */
210 typedef void (tNFA_EE_CBACK) (tNFA_EE_EVT event, tNFA_EE_CBACK_DATA *p_data);
211 
212 /*****************************************************************************
213 **  External Function Declarations
214 *****************************************************************************/
215 #ifdef __cplusplus
216 extern "C"
217 {
218 #endif
219 
220 /*******************************************************************************
221 **
222 ** Function         NFA_EeDiscover
223 **
224 ** Description      This function retrieves the NFCEE information from NFCC.
225 **                  The NFCEE information is reported in NFA_EE_DISCOVER_EVT.
226 **
227 **                  This function may be called when a system supports removable
228 **                  NFCEEs,
229 **
230 ** Returns          NFA_STATUS_OK if information is retrieved successfully
231 **                  NFA_STATUS_FAILED If wrong state (retry later)
232 **                  NFA_STATUS_INVALID_PARAM If bad parameter
233 **
234 *******************************************************************************/
235 NFC_API extern tNFA_STATUS NFA_EeDiscover (tNFA_EE_CBACK *p_cback);
236 
237 /*******************************************************************************
238 **
239 ** Function         NFA_EeGetInfo
240 **
241 ** Description      This function retrieves the NFCEE information from NFA.
242 **                  The actual number of NFCEE is returned in p_num_nfcee
243 **                  and NFCEE information is returned in p_info
244 **
245 ** Returns          NFA_STATUS_OK if information is retrieved successfully
246 **                  NFA_STATUS_FAILED If wrong state (retry later)
247 **                  NFA_STATUS_INVALID_PARAM If bad parameter
248 **
249 *******************************************************************************/
250 NFC_API extern tNFA_STATUS NFA_EeGetInfo (UINT8        *p_num_nfcee,
251                                           tNFA_EE_INFO *p_info);
252 
253 /*******************************************************************************
254 **
255 ** Function         NFA_EeRegister
256 **
257 ** Description      This function registers a callback function to receive the
258 **                  events from NFA-EE module.
259 **
260 ** Returns          NFA_STATUS_OK if successfully initiated
261 **                  NFA_STATUS_FAILED otherwise
262 **                  NFA_STATUS_INVALID_PARAM If bad parameter
263 **
264 *******************************************************************************/
265 NFC_API extern tNFA_STATUS NFA_EeRegister (tNFA_EE_CBACK *p_cback);
266 
267 /*******************************************************************************
268 **
269 ** Function         NFA_EeDeregister
270 **
271 ** Description      This function de-registers the callback function
272 **
273 ** Returns          NFA_STATUS_OK if successfully initiated
274 **                  NFA_STATUS_FAILED otherwise
275 **                  NFA_STATUS_INVALID_PARAM If bad parameter
276 **
277 *******************************************************************************/
278 NFC_API extern tNFA_STATUS NFA_EeDeregister (tNFA_EE_CBACK *p_cback);
279 
280 /*******************************************************************************
281 **
282 ** Function         NFA_EeModeSet
283 **
284 ** Description      This function is called to activate (mode = NFA_EE_MD_ACTIVATE)
285 **                  or deactivate (mode = NFA_EE_MD_DEACTIVATE) the NFCEE
286 **                  identified by the given ee_handle. The result of this
287 **                  operation is reported with the NFA_EE_MODE_SET_EVT.
288 **
289 ** Returns          NFA_STATUS_OK if successfully initiated
290 **                  NFA_STATUS_FAILED otherwise
291 **                  NFA_STATUS_INVALID_PARAM If bad parameter
292 **
293 *******************************************************************************/
294 NFC_API extern tNFA_STATUS NFA_EeModeSet (tNFA_HANDLE    ee_handle,
295                                           tNFA_EE_MD     mode);
296 
297 
298 /*******************************************************************************
299 **
300 ** Function         NFA_EeSetDefaultTechRouting
301 **
302 ** Description      This function is called to add, change or remove the
303 **                  default routing based on RF technology in the listen mode
304 **                  routing table for the given ee_handle. The status of this
305 **                  operation is reported as the NFA_EE_SET_TECH_CFG_EVT.
306 **
307 ** Note:            If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
308 **                  should happen before calling this function
309 **
310 ** Note:            NFA_EeUpdateNow() should be called after last NFA-EE function
311 **                  to change the listen mode routing is called.
312 **
313 ** Returns          NFA_STATUS_OK if successfully initiated
314 **                  NFA_STATUS_FAILED otherwise
315 **                  NFA_STATUS_INVALID_PARAM If bad parameter
316 **
317 *******************************************************************************/
318 NFC_API extern tNFA_STATUS NFA_EeSetDefaultTechRouting (tNFA_HANDLE          ee_handle,
319                                                         tNFA_TECHNOLOGY_MASK technologies_switch_on,
320                                                         tNFA_TECHNOLOGY_MASK technologies_switch_off,
321                                                         tNFA_TECHNOLOGY_MASK technologies_battery_off);
322 
323 /*******************************************************************************
324 **
325 ** Function         NFA_EeSetDefaultProtoRouting
326 **
327 ** Description      This function is called to add, change or remove the
328 **                  default routing based on Protocol in the listen mode routing
329 **                  table for the given ee_handle. The status of this
330 **                  operation is reported as the NFA_EE_SET_PROTO_CFG_EVT.
331 **
332 ** Note:            If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
333 **                  should happen before calling this function
334 **
335 ** Note:            NFA_EeUpdateNow() should be called after last NFA-EE function
336 **                  to change the listen mode routing is called.
337 **
338 ** Returns          NFA_STATUS_OK if successfully initiated
339 **                  NFA_STATUS_FAILED otherwise
340 **                  NFA_STATUS_INVALID_PARAM If bad parameter
341 **
342 *******************************************************************************/
343 NFC_API extern tNFA_STATUS NFA_EeSetDefaultProtoRouting (tNFA_HANDLE         ee_handle,
344                                                          tNFA_PROTOCOL_MASK  protocols_switch_on,
345                                                          tNFA_PROTOCOL_MASK  protocols_switch_off,
346                                                          tNFA_PROTOCOL_MASK  protocols_battery_off);
347 
348 /*******************************************************************************
349 **
350 ** Function         NFA_EeAddAidRouting
351 **
352 ** Description      This function is called to add an AID entry in the
353 **                  listen mode routing table in NFCC. The status of this
354 **                  operation is reported as the NFA_EE_ADD_AID_EVT.
355 **
356 ** Note:            If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
357 **                  should happen before calling this function
358 **
359 ** Note:            NFA_EeUpdateNow() should be called after last NFA-EE function
360 **                  to change the listen mode routing is called.
361 **
362 ** Returns          NFA_STATUS_OK if successfully initiated
363 **                  NFA_STATUS_FAILED otherwise
364 **                  NFA_STATUS_INVALID_PARAM If bad parameter
365 **
366 *******************************************************************************/
367 NFC_API extern tNFA_STATUS NFA_EeAddAidRouting (tNFA_HANDLE          ee_handle,
368                                                 UINT8                aid_len,
369                                                 UINT8               *p_aid,
370                                                 tNFA_EE_PWR_STATE    power_state);
371 
372 /*******************************************************************************
373 **
374 ** Function         NFA_EeRemoveAidRouting
375 **
376 ** Description      This function is called to remove the given AID entry from the
377 **                  listen mode routing table. If the entry configures VS,
378 **                  it is also removed. The status of this operation is reported
379 **                  as the NFA_EE_REMOVE_AID_EVT.
380 **
381 ** Note:            If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
382 **                  should happen before calling this function
383 **
384 ** Note:            NFA_EeUpdateNow() should be called after last NFA-EE function
385 **                  to change the listen mode routing is called.
386 **
387 ** Returns          NFA_STATUS_OK if successfully initiated
388 **                  NFA_STATUS_FAILED otherwise
389 **                  NFA_STATUS_INVALID_PARAM If bad parameter
390 **
391 *******************************************************************************/
392 NFC_API extern tNFA_STATUS NFA_EeRemoveAidRouting (UINT8     aid_len,
393                                                    UINT8    *p_aid);
394 
395 /*******************************************************************************
396 **
397 ** Function         NFA_EeGetLmrtRemainingSize
398 **
399 ** Description      This function is called to get remaining size of the
400 **                  Listen Mode Routing Table.
401 **                  The remaining size is reported in NFA_EE_REMAINING_SIZE_EVT
402 **
403 ** Returns          NFA_STATUS_OK if successfully initiated
404 **                  NFA_STATUS_FAILED otherwise
405 **
406 *******************************************************************************/
407 NFC_API extern tNFA_STATUS NFA_EeGetLmrtRemainingSize (void);
408 
409 /*******************************************************************************
410 **
411 ** Function         NFA_EeUpdateNow
412 **
413 ** Description      This function is called to send the current listen mode
414 **                  routing table and VS configuration to the NFCC (without waiting
415 **                  for NFA_EE_ROUT_TIMEOUT_VAL).
416 **
417 **                  The status of this operation is
418 **                  reported with the NFA_EE_UPDATED_EVT.
419 **
420 ** Returns          NFA_STATUS_OK if successfully initiated
421 **                  NFA_STATUS_SEMANTIC_ERROR is update is currently in progress
422 **                  NFA_STATUS_FAILED otherwise
423 **
424 *******************************************************************************/
425 NFC_API extern tNFA_STATUS NFA_EeUpdateNow (void);
426 
427 /*******************************************************************************
428 **
429 ** Function         NFA_EeConnect
430 **
431 ** Description      Open connection to an NFCEE attached to the NFCC
432 **
433 **                  The status of this operation is
434 **                  reported with the NFA_EE_CONNECT_EVT.
435 **
436 ** Returns          NFA_STATUS_OK if successfully initiated
437 **                  NFA_STATUS_FAILED otherwise
438 **                  NFA_STATUS_INVALID_PARAM If bad parameter
439 **
440 *******************************************************************************/
441 NFC_API extern tNFA_STATUS NFA_EeConnect (tNFA_HANDLE    ee_handle,
442                                           UINT8          ee_interface,
443                                           tNFA_EE_CBACK *p_cback);
444 
445 /*******************************************************************************
446 **
447 ** Function         NFA_EeSendData
448 **
449 ** Description      Send data to the given NFCEE.
450 **                  This function shall be called after NFA_EE_CONNECT_EVT is reported
451 **                  and before NFA_EeDisconnect is called on the given ee_handle.
452 **
453 ** Returns          NFA_STATUS_OK if successfully initiated
454 **                  NFA_STATUS_FAILED otherwise
455 **                  NFA_STATUS_INVALID_PARAM If bad parameter
456 **
457 *******************************************************************************/
458 NFC_API extern tNFA_STATUS NFA_EeSendData (tNFA_HANDLE  ee_handle,
459                                            UINT16       data_len,
460                                            UINT8       *p_data);
461 
462 /*******************************************************************************
463 **
464 ** Function         NFA_EeDisconnect
465 **
466 ** Description      Disconnect (if a connection is currently open) from an
467 **                  NFCEE interface. The result of this operation is reported
468 **                  with the NFA_EE_DISCONNECT_EVT.
469 **
470 ** Returns          NFA_STATUS_OK if successfully initiated
471 **                  NFA_STATUS_FAILED otherwise
472 **                  NFA_STATUS_INVALID_PARAM If bad parameter
473 **
474 *******************************************************************************/
475 NFC_API extern tNFA_STATUS NFA_EeDisconnect (tNFA_HANDLE ee_handle);
476 
477 
478 #ifdef __cplusplus
479 }
480 #endif
481 
482 #endif /* NFA_EE_API_H */
483 
484