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 * This file contains functions that interface with the NFC NCI transport.
22 * On the receive side, it routes events to the appropriate handler
23 * (callback). On the transmit side, it manages the command transmission.
24 *
25 ******************************************************************************/
26 #include <android-base/logging.h>
27 #include <android-base/stringprintf.h>
28 #include <android/hardware/nfc/1.1/types.h>
29 #include <string.h>
30
31 #include "bt_types.h"
32 #include "ce_int.h"
33 #include "gki.h"
34 #include "nci_hmsgs.h"
35 #include "nfa_sys.h"
36 #include "nfc_api.h"
37 #include "nfc_int.h"
38 #include "nfc_target.h"
39 #include "rw_int.h"
40
41 #if (NFC_RW_ONLY == FALSE)
42
43 /* NFC mandates support for at least one logical connection;
44 * Update max_conn to the NFCC capability on InitRsp */
45 #define NFC_SET_MAX_CONN_DEFAULT() \
46 { nfc_cb.max_conn = 1; }
47
48 #else /* NFC_RW_ONLY */
49 #define ce_init()
50
51 #define NFC_SET_MAX_CONN_DEFAULT()
52
53 #endif /* NFC_RW_ONLY */
54
55 using android::base::StringPrintf;
56 using android::hardware::nfc::V1_1::NfcEvent;
57
58 extern void delete_stack_non_volatile_store(bool forceDelete);
59
60 /****************************************************************************
61 ** Declarations
62 ****************************************************************************/
63 tNFC_CB nfc_cb;
64
65 #if (NFC_RW_ONLY == FALSE)
66 #define NFC_NUM_INTERFACE_MAP 2
67 #else
68 #define NFC_NUM_INTERFACE_MAP 1
69 #endif
70
71 static const tNCI_DISCOVER_MAPS nfc_interface_mapping[NFC_NUM_INTERFACE_MAP] = {
72 /* Protocols that use Frame Interface do not need to be included in the
73 interface mapping */
74 {NCI_PROTOCOL_ISO_DEP, NCI_INTERFACE_MODE_POLL_N_LISTEN,
75 NCI_INTERFACE_ISO_DEP}
76 #if (NFC_RW_ONLY == FALSE)
77 ,
78 /* this can not be set here due to 2079xB0 NFCC issues */
79 {NCI_PROTOCOL_NFC_DEP, NCI_INTERFACE_MODE_POLL_N_LISTEN,
80 NCI_INTERFACE_NFC_DEP}
81 #endif
82 };
83
84 /*******************************************************************************
85 **
86 ** Function nfc_state_name
87 **
88 ** Description This function returns the state name.
89 **
90 ** NOTE conditionally compiled to save memory.
91 **
92 ** Returns pointer to the name
93 **
94 *******************************************************************************/
nfc_state_name(uint8_t state)95 static std::string nfc_state_name(uint8_t state) {
96 switch (state) {
97 case NFC_STATE_NONE:
98 return "NONE";
99 case NFC_STATE_W4_HAL_OPEN:
100 return "W4_HAL_OPEN";
101 case NFC_STATE_CORE_INIT:
102 return "CORE_INIT";
103 case NFC_STATE_W4_POST_INIT_CPLT:
104 return "W4_POST_INIT_CPLT";
105 case NFC_STATE_IDLE:
106 return "IDLE";
107 case NFC_STATE_OPEN:
108 return "OPEN";
109 case NFC_STATE_CLOSING:
110 return "CLOSING";
111 case NFC_STATE_W4_HAL_CLOSE:
112 return "W4_HAL_CLOSE";
113 case NFC_STATE_NFCC_POWER_OFF_SLEEP:
114 return "NFCC_POWER_OFF_SLEEP";
115 default:
116 return "???? UNKNOWN STATE";
117 }
118 }
119
120 /*******************************************************************************
121 **
122 ** Function nfc_hal_event_name
123 **
124 ** Description This function returns the HAL event name.
125 **
126 ** NOTE conditionally compiled to save memory.
127 **
128 ** Returns pointer to the name
129 **
130 *******************************************************************************/
nfc_hal_event_name(uint8_t event)131 static std::string nfc_hal_event_name(uint8_t event) {
132 switch (event) {
133 case HAL_NFC_OPEN_CPLT_EVT:
134 return "HAL_NFC_OPEN_CPLT_EVT";
135 case HAL_NFC_CLOSE_CPLT_EVT:
136 return "HAL_NFC_CLOSE_CPLT_EVT";
137 case HAL_NFC_POST_INIT_CPLT_EVT:
138 return "HAL_NFC_POST_INIT_CPLT_EVT";
139 case HAL_NFC_PRE_DISCOVER_CPLT_EVT:
140 return "HAL_NFC_PRE_DISCOVER_CPLT_EVT";
141 case HAL_NFC_REQUEST_CONTROL_EVT:
142 return "HAL_NFC_REQUEST_CONTROL_EVT";
143 case HAL_NFC_RELEASE_CONTROL_EVT:
144 return "HAL_NFC_RELEASE_CONTROL_EVT";
145 case HAL_NFC_ERROR_EVT:
146 return "HAL_NFC_ERROR_EVT";
147 case HAL_HCI_NETWORK_RESET:
148 return "HCI_NETWORK_RESET";
149 default:
150 return "???? UNKNOWN EVENT";
151 }
152 }
153
154 /*******************************************************************************
155 **
156 ** Function nfc_main_notify_enable_status
157 **
158 ** Description Notify status of Enable/PowerOffSleep/PowerCycle
159 **
160 *******************************************************************************/
nfc_main_notify_enable_status(tNFC_STATUS nfc_status)161 static void nfc_main_notify_enable_status(tNFC_STATUS nfc_status) {
162 tNFC_RESPONSE evt_data;
163
164 evt_data.status = nfc_status;
165
166 if (nfc_cb.p_resp_cback) {
167 /* if getting out of PowerOffSleep mode or restarting NFCC */
168 if (nfc_cb.flags & (NFC_FL_RESTARTING | NFC_FL_POWER_CYCLE_NFCC)) {
169 nfc_cb.flags &= ~(NFC_FL_RESTARTING | NFC_FL_POWER_CYCLE_NFCC);
170 if (nfc_status != NFC_STATUS_OK) {
171 nfc_cb.flags |= NFC_FL_POWER_OFF_SLEEP;
172 }
173 (*nfc_cb.p_resp_cback)(NFC_NFCC_RESTART_REVT, &evt_data);
174 } else {
175 (*nfc_cb.p_resp_cback)(NFC_ENABLE_REVT, &evt_data);
176 }
177 }
178 }
179
180 /*******************************************************************************
181 **
182 ** Function nfc_enabled
183 **
184 ** Description NFCC enabled, proceed with stack start up.
185 **
186 ** Returns void
187 **
188 *******************************************************************************/
nfc_enabled(tNFC_STATUS nfc_status,NFC_HDR * p_init_rsp_msg)189 void nfc_enabled(tNFC_STATUS nfc_status, NFC_HDR* p_init_rsp_msg) {
190 tNFC_RESPONSE evt_data;
191 tNFC_CONN_CB* p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID];
192 int16_t lremain = 0;
193 uint8_t* p;
194 uint8_t num_interfaces = 0, xx;
195 uint8_t num_interface_extensions = 0, zz;
196 uint8_t interface_type;
197 int yy = 0;
198 memset(&evt_data, 0, sizeof(tNFC_RESPONSE));
199
200 if (nfc_status == NCI_STATUS_OK) {
201 nfc_set_state(NFC_STATE_IDLE);
202
203 p = (uint8_t*)(p_init_rsp_msg + 1) + p_init_rsp_msg->offset +
204 NCI_MSG_HDR_SIZE + 1;
205
206 lremain = p_init_rsp_msg->len - NCI_MSG_HDR_SIZE - 1 - sizeof(uint32_t) - 5;
207 if (lremain < 0) {
208 nfc_status = NCI_STATUS_FAILED;
209 goto plen_err;
210 }
211 /* we currently only support NCI of the same version.
212 * We may need to change this, when we support multiple version of NFCC */
213
214 evt_data.enable.nci_version = nfc_cb.nci_version;
215 STREAM_TO_UINT32(evt_data.enable.nci_features, p);
216 if (nfc_cb.nci_version == NCI_VERSION_1_0) {
217 /* this byte is consumed in the top expression */
218 STREAM_TO_UINT8(num_interfaces, p);
219 lremain -= num_interfaces;
220 if (lremain < 0) {
221 nfc_status = NCI_STATUS_FAILED;
222 goto plen_err;
223 }
224 evt_data.enable.nci_interfaces = 0;
225 for (xx = 0; xx < num_interfaces; xx++) {
226 if ((*p) <= NCI_INTERFACE_MAX)
227 evt_data.enable.nci_interfaces |= (1 << (*p));
228 else if (((*p) >= NCI_INTERFACE_FIRST_VS) &&
229 (yy < NFC_NFCC_MAX_NUM_VS_INTERFACE)) {
230 /* save the VS RF interface in control block, if there's still room */
231 nfc_cb.vs_interface[yy++] = *p;
232 }
233 p++;
234 }
235 nfc_cb.nci_interfaces = evt_data.enable.nci_interfaces;
236 memcpy(evt_data.enable.vs_interface, nfc_cb.vs_interface,
237 NFC_NFCC_MAX_NUM_VS_INTERFACE);
238 }
239 /* four bytes below are consumed in the top expression */
240 // Max nb conn = nb static conn + max nb dynamic conn
241 evt_data.enable.max_conn = NCI_MAX_STATIC_CONN_CBS + *p++;
242 STREAM_TO_UINT16(evt_data.enable.max_ce_table, p);
243 #if (NFC_RW_ONLY == FALSE)
244 nfc_cb.max_ce_table = evt_data.enable.max_ce_table;
245 nfc_cb.nci_features = evt_data.enable.nci_features;
246 nfc_cb.max_conn = evt_data.enable.max_conn;
247 #endif
248 nfc_cb.nci_ctrl_size = *p++; /* Max Control Packet Payload Length */
249 p_cb->init_credits = p_cb->num_buff = 0;
250 nfc_set_conn_id(p_cb, NFC_RF_CONN_ID);
251 if (nfc_cb.nci_version >= NCI_VERSION_2_0) {
252 /* one byte is consumed in the top expression and
253 * 3 bytes from uit16+uint8 below */
254 lremain -= 4;
255 if (lremain < 0) {
256 nfc_status = NCI_STATUS_FAILED;
257 goto plen_err;
258 }
259 if (evt_data.enable.nci_features & NCI_FEAT_HCI_NETWORK) {
260 p_cb = &nfc_cb.conn_cb[NFC_HCI_CONN_ID];
261 nfc_set_conn_id(p_cb, NFC_HCI_CONN_ID);
262 p_cb->id = NFC_HCI_CONN_ID;
263 STREAM_TO_UINT8(p_cb->buff_size, p);
264 STREAM_TO_UINT8(p_cb->num_buff, p);
265 p_cb->init_credits = p_cb->num_buff;
266 evt_data.enable.hci_packet_size = p_cb->buff_size;
267 evt_data.enable.hci_conn_credits = p_cb->init_credits;
268 LOG(VERBOSE) << StringPrintf("%s: hci num_buf=%d buf_size=%d", __func__,
269 p_cb->num_buff, p_cb->buff_size);
270 } else {
271 /*HCI n/w not enabled skip data buff size and data credit HCI conn */
272 p += 2;
273 }
274 STREAM_TO_UINT16(evt_data.enable.max_nfc_v_size, p);
275 STREAM_TO_UINT8(num_interfaces, p);
276 #if (NFC_RW_ONLY == FALSE)
277 nfc_cb.hci_packet_size = evt_data.enable.hci_packet_size;
278 nfc_cb.hci_conn_credits = evt_data.enable.hci_conn_credits;
279 nfc_cb.nci_max_v_size = evt_data.enable.max_nfc_v_size;
280 #endif
281 evt_data.enable.nci_interfaces = 0;
282
283 for (xx = 0; xx < num_interfaces; xx++) {
284 lremain -= 2;
285 if (lremain < 0) {
286 nfc_status = NCI_STATUS_FAILED;
287 goto plen_err;
288 }
289 if ((*p) <= NCI_INTERFACE_MAX)
290 evt_data.enable.nci_interfaces |= (1 << (*p));
291 else if (((*p) >= NCI_INTERFACE_FIRST_VS) &&
292 (yy < NFC_NFCC_MAX_NUM_VS_INTERFACE)) {
293 /* save the VS RF interface in control block, if there's still room */
294 nfc_cb.vs_interface[yy++] = *p;
295 }
296 interface_type = *p++;
297 num_interface_extensions = *p++;
298 lremain -= num_interface_extensions;
299 if (lremain < 0) {
300 nfc_status = NCI_STATUS_FAILED;
301 goto plen_err;
302 }
303 for (zz = 0; zz < num_interface_extensions; zz++) {
304 if (((*p) < NCI_INTERFACE_EXTENSION_MAX) &&
305 (interface_type <= NCI_INTERFACE_MAX)) {
306 nfc_cb.nci_intf_extensions |= (1 << (*p));
307 nfc_cb.nci_intf_extension_map[*p] = (1 << interface_type);
308 }
309 p++;
310 }
311 }
312
313 nfc_cb.nci_interfaces = evt_data.enable.nci_interfaces;
314 memcpy(evt_data.enable.vs_interface, nfc_cb.vs_interface,
315 NFC_NFCC_MAX_NUM_VS_INTERFACE);
316 } else {
317 /* For VERSION_UNKNOWN one byte is consumed in the top expression */
318 lremain -= sizeof(uint16_t) + NFC_NFCC_INFO_LEN +
319 (nfc_cb.nci_version == NCI_VERSION_1_0 ? 1 : 0);
320 if (lremain < 0) {
321 nfc_status = NCI_STATUS_FAILED;
322 goto plen_err;
323 }
324 STREAM_TO_UINT16(evt_data.enable.max_param_size, p);
325 evt_data.enable.manufacture_id = *p++;
326 STREAM_TO_ARRAY(evt_data.enable.nfcc_info, p, NFC_NFCC_INFO_LEN);
327 }
328 NFC_DiscoveryMap(nfc_cb.num_disc_maps,
329 (tNCI_DISCOVER_MAPS*)nfc_cb.p_disc_maps, nullptr);
330 }
331 /* else not successful. the buffers will be freed in nfc_free_conn_cb () */
332 else {
333 plen_err:
334 if (nfc_cb.flags & NFC_FL_RESTARTING) {
335 nfc_set_state(NFC_STATE_NFCC_POWER_OFF_SLEEP);
336 } else {
337 nfc_free_conn_cb(p_cb);
338
339 /* if NFCC didn't respond to CORE_RESET or CORE_INIT */
340 if (nfc_cb.nfc_state == NFC_STATE_CORE_INIT) {
341 /* report status after closing HAL */
342 nfc_cb.p_hal->close();
343 return;
344 } else
345 nfc_set_state(NFC_STATE_NONE);
346 }
347 }
348
349 nfc_main_notify_enable_status(nfc_status);
350 }
351
352 /*******************************************************************************
353 **
354 ** Function nfc_set_state
355 **
356 ** Description Set the state of NFC stack
357 **
358 ** Returns void
359 **
360 *******************************************************************************/
nfc_set_state(tNFC_STATE nfc_state)361 void nfc_set_state(tNFC_STATE nfc_state) {
362 LOG(VERBOSE) << StringPrintf("%s: nfc_state=%d (%s)->%d (%s)", __func__,
363 nfc_cb.nfc_state,
364 nfc_state_name(nfc_cb.nfc_state).c_str(),
365 nfc_state, nfc_state_name(nfc_state).c_str());
366 nfc_cb.nfc_state = nfc_state;
367 }
368
369 /*******************************************************************************
370 **
371 ** Function nfc_gen_cleanup
372 **
373 ** Description Clean up for both going into low power mode and disabling
374 ** NFC
375 **
376 *******************************************************************************/
nfc_gen_cleanup(void)377 void nfc_gen_cleanup(void) {
378 nfc_cb.flags &= ~NFC_FL_DEACTIVATING;
379 if (!gki_utils) {
380 gki_utils = new GkiUtils();
381 }
382
383 /* the HAL pre-discover is still active - clear the pending flag/free the
384 * buffer */
385 if (nfc_cb.flags & NFC_FL_DISCOVER_PENDING) {
386 nfc_cb.flags &= ~NFC_FL_DISCOVER_PENDING;
387 gki_utils->freebuf(nfc_cb.p_disc_pending);
388 nfc_cb.p_disc_pending = nullptr;
389 }
390
391 nfc_cb.flags &= ~(NFC_FL_CONTROL_REQUESTED | NFC_FL_CONTROL_GRANTED |
392 NFC_FL_HAL_REQUESTED);
393
394 nfc_stop_timer(&nfc_cb.deactivate_timer);
395
396 /* Reset the connection control blocks */
397 nfc_reset_all_conn_cbs();
398
399 if (nfc_cb.p_nci_init_rsp) {
400 gki_utils->freebuf(nfc_cb.p_nci_init_rsp);
401 nfc_cb.p_nci_init_rsp = nullptr;
402 }
403
404 /* clear any pending CMD/RSP */
405 nfc_main_flush_cmd_queue();
406 }
407
408 /*******************************************************************************
409 **
410 ** Function nfc_main_handle_hal_evt
411 **
412 ** Description Handle BT_EVT_TO_NFC_MSGS
413 **
414 *******************************************************************************/
nfc_main_handle_hal_evt(tNFC_HAL_EVT_MSG * p_msg)415 void nfc_main_handle_hal_evt(tNFC_HAL_EVT_MSG* p_msg) {
416 uint8_t* ps;
417
418 LOG(VERBOSE) << StringPrintf("%s: event=0x%x", __func__, p_msg->hal_evt);
419
420 switch (p_msg->hal_evt) {
421 case HAL_NFC_OPEN_CPLT_EVT: /* only for failure case */
422 nfc_enabled(NFC_STATUS_FAILED, nullptr);
423 break;
424
425 case HAL_NFC_CLOSE_CPLT_EVT:
426 if (nfc_cb.p_resp_cback) {
427 if (nfc_cb.nfc_state == NFC_STATE_W4_HAL_CLOSE) {
428 if (nfc_cb.flags & NFC_FL_POWER_OFF_SLEEP) {
429 nfc_cb.flags &= ~NFC_FL_POWER_OFF_SLEEP;
430 nfc_set_state(NFC_STATE_NFCC_POWER_OFF_SLEEP);
431 (*nfc_cb.p_resp_cback)(NFC_NFCC_POWER_OFF_REVT, nullptr);
432 } else {
433 nfc_set_state(NFC_STATE_NONE);
434 (*nfc_cb.p_resp_cback)(NFC_DISABLE_REVT, nullptr);
435 nfc_cb.p_resp_cback = nullptr;
436 }
437 } else {
438 /* found error during initialization */
439 nfc_set_state(NFC_STATE_NONE);
440 nfc_main_notify_enable_status(NFC_STATUS_FAILED);
441 }
442 }
443 break;
444
445 case HAL_NFC_POST_INIT_CPLT_EVT:
446 if (nfc_cb.nfcc_mode == ENABLE_MODE_TRANSPARENT) {
447 nfc_set_state(NFC_STATE_IDLE);
448 nfa_sys_cback_notify_partial_enable_complete(NFA_ID_SYS);
449 } else if (nfc_cb.p_nci_init_rsp) {
450 /*
451 ** if NFC_Disable() is called before receiving
452 ** HAL_NFC_POST_INIT_CPLT_EVT, then wait for HAL_NFC_CLOSE_CPLT_EVT.
453 */
454 if (nfc_cb.nfc_state == NFC_STATE_W4_POST_INIT_CPLT) {
455 if (p_msg->status == HAL_NFC_STATUS_OK) {
456 nfc_enabled(NCI_STATUS_OK, nfc_cb.p_nci_init_rsp);
457 } else /* if post initailization failed */
458 {
459 nfc_enabled(NCI_STATUS_FAILED, nullptr);
460 }
461 }
462
463 GKI_freebuf(nfc_cb.p_nci_init_rsp);
464 nfc_cb.p_nci_init_rsp = nullptr;
465 }
466 break;
467
468 case HAL_NFC_PRE_DISCOVER_CPLT_EVT:
469 /* restore the command window, no matter if the discover command is still
470 * pending */
471 nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW;
472 nfc_cb.flags &= ~NFC_FL_CONTROL_GRANTED;
473 if (nfc_cb.flags & NFC_FL_DISCOVER_PENDING) {
474 /* issue the discovery command now, if it is still pending */
475 nfc_cb.flags &= ~NFC_FL_DISCOVER_PENDING;
476 ps = (uint8_t*)nfc_cb.p_disc_pending;
477 nci_snd_discover_cmd(*ps, (tNFC_DISCOVER_PARAMS*)(ps + 1));
478 GKI_freebuf(nfc_cb.p_disc_pending);
479 nfc_cb.p_disc_pending = nullptr;
480 } else {
481 /* check if there's other pending commands */
482 nfc_ncif_check_cmd_queue(nullptr);
483 }
484
485 if (p_msg->status == HAL_NFC_STATUS_ERR_CMD_TIMEOUT)
486 nfc_ncif_event_status(NFC_NFCC_TIMEOUT_REVT, NFC_STATUS_HW_TIMEOUT);
487 break;
488
489 case HAL_NFC_REQUEST_CONTROL_EVT:
490 nfc_cb.flags |= NFC_FL_CONTROL_REQUESTED;
491 nfc_cb.flags |= NFC_FL_HAL_REQUESTED;
492 nfc_ncif_check_cmd_queue(nullptr);
493 break;
494
495 case HAL_NFC_RELEASE_CONTROL_EVT:
496 if (nfc_cb.flags & NFC_FL_CONTROL_GRANTED) {
497 nfc_cb.flags &= ~NFC_FL_CONTROL_GRANTED;
498 nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW;
499 nfc_ncif_check_cmd_queue(nullptr);
500
501 if (p_msg->status == HAL_NFC_STATUS_ERR_CMD_TIMEOUT)
502 nfc_ncif_event_status(NFC_NFCC_TIMEOUT_REVT, NFC_STATUS_HW_TIMEOUT);
503 }
504 break;
505
506 case HAL_NFC_ERROR_EVT:
507 switch (p_msg->status) {
508 case HAL_NFC_STATUS_ERR_TRANSPORT:
509 /* Notify app of transport error */
510 if (nfc_cb.p_resp_cback) {
511 (*nfc_cb.p_resp_cback)(NFC_NFCC_TRANSPORT_ERR_REVT, nullptr);
512
513 /* if enabling NFC, notify upper layer of failure after closing HAL
514 */
515 if (nfc_cb.nfc_state < NFC_STATE_IDLE) {
516 nfc_enabled(NFC_STATUS_FAILED, nullptr);
517 }
518 }
519 break;
520
521 case HAL_NFC_STATUS_ERR_CMD_TIMEOUT:
522 nfc_ncif_event_status(NFC_NFCC_TIMEOUT_REVT, NFC_STATUS_HW_TIMEOUT);
523
524 /* if enabling NFC, notify upper layer of failure after closing HAL */
525 if (nfc_cb.nfc_state < NFC_STATE_IDLE) {
526 nfc_enabled(NFC_STATUS_FAILED, nullptr);
527 return;
528 }
529 break;
530
531 default:
532 break;
533 }
534 break;
535
536 case HAL_HCI_NETWORK_RESET:
537 delete_stack_non_volatile_store(true);
538 break;
539
540 default:
541 LOG(ERROR) << StringPrintf("%s: unhandled event (0x%x)", __func__,
542 p_msg->hal_evt);
543 break;
544 }
545 }
546
547 /*******************************************************************************
548 **
549 ** Function nfc_main_flush_cmd_queue
550 **
551 ** Description This function is called when setting power off sleep state.
552 **
553 ** Returns void
554 **
555 *******************************************************************************/
nfc_main_flush_cmd_queue(void)556 void nfc_main_flush_cmd_queue(void) {
557 NFC_HDR* p_msg;
558
559 if (!gki_utils) {
560 gki_utils = new GkiUtils();
561 }
562
563 LOG(VERBOSE) << __func__;
564
565 /* initialize command window */
566 nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW;
567
568 /* Stop command-pending timer */
569 nfc_stop_timer(&nfc_cb.nci_wait_rsp_timer);
570
571 /* dequeue and free buffer */
572 while ((p_msg = (NFC_HDR*)gki_utils->dequeue(&nfc_cb.nci_cmd_xmit_q)) !=
573 nullptr) {
574 gki_utils->freebuf(p_msg);
575 }
576 }
577
578 /*******************************************************************************
579 **
580 ** Function nfc_main_post_hal_evt
581 **
582 ** Description This function posts HAL event to NFC_TASK
583 **
584 ** Returns void
585 **
586 *******************************************************************************/
nfc_main_post_hal_evt(uint8_t hal_evt,tHAL_NFC_STATUS status)587 void nfc_main_post_hal_evt(uint8_t hal_evt, tHAL_NFC_STATUS status) {
588 tNFC_HAL_EVT_MSG* p_msg;
589
590 p_msg = (tNFC_HAL_EVT_MSG*)GKI_getbuf(sizeof(tNFC_HAL_EVT_MSG));
591 if (p_msg != nullptr) {
592 /* Initialize NFC_HDR */
593 p_msg->hdr.len = 0;
594 p_msg->hdr.event = BT_EVT_TO_NFC_MSGS;
595 p_msg->hdr.offset = 0;
596 p_msg->hdr.layer_specific = 0;
597 p_msg->hal_evt = hal_evt;
598 p_msg->status = status;
599 GKI_send_msg(NFC_TASK, NFC_MBOX_ID, p_msg);
600 } else {
601 LOG(ERROR) << StringPrintf("%s: No buffer", __func__);
602 }
603 }
604
605 /*******************************************************************************
606 **
607 ** Function nfc_main_hal_cback
608 **
609 ** Description HAL event handler
610 **
611 ** Returns void
612 **
613 *******************************************************************************/
nfc_main_hal_cback(uint8_t event,tHAL_NFC_STATUS status)614 static void nfc_main_hal_cback(uint8_t event, tHAL_NFC_STATUS status) {
615 LOG(VERBOSE) << StringPrintf("%s: event=%s(0x%x), status=%d", __func__,
616 nfc_hal_event_name(event).c_str(), event,
617 status);
618
619 switch (event) {
620 case HAL_NFC_OPEN_CPLT_EVT:
621 /*
622 ** if NFC_Disable() is called before receiving HAL_NFC_OPEN_CPLT_EVT,
623 ** then wait for HAL_NFC_CLOSE_CPLT_EVT.
624 */
625 if (nfc_cb.nfc_state == NFC_STATE_W4_HAL_OPEN) {
626 if (status == HAL_NFC_STATUS_OK) {
627 /* Notify NFC_TASK that NCI tranport is initialized */
628 GKI_send_event(NFC_TASK, NFC_TASK_EVT_TRANSPORT_READY);
629 } else {
630 nfc_main_post_hal_evt(event, status);
631 }
632 }
633 break;
634
635 case HAL_NFC_CLOSE_CPLT_EVT:
636 case HAL_NFC_POST_INIT_CPLT_EVT:
637 case HAL_NFC_PRE_DISCOVER_CPLT_EVT:
638 case HAL_NFC_REQUEST_CONTROL_EVT:
639 case HAL_NFC_RELEASE_CONTROL_EVT:
640 case HAL_NFC_ERROR_EVT:
641 case HAL_HCI_NETWORK_RESET:
642 nfc_main_post_hal_evt(event, status);
643 break;
644
645 default:
646 LOG(VERBOSE) << StringPrintf("%s: unhandled event %x", __func__, event);
647 break;
648 }
649 }
650
651 /*******************************************************************************
652 **
653 ** Function nfc_main_hal_data_cback
654 **
655 ** Description HAL data event handler
656 **
657 ** Returns void
658 **
659 *******************************************************************************/
nfc_main_hal_data_cback(uint16_t data_len,uint8_t * p_data)660 static void nfc_main_hal_data_cback(uint16_t data_len, uint8_t* p_data) {
661 NFC_HDR* p_msg;
662
663 /* ignore all data while shutting down NFCC */
664 if (nfc_cb.nfc_state == NFC_STATE_W4_HAL_CLOSE) {
665 return;
666 }
667
668 if (p_data) {
669 #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
670 // GKI_getpoolbuf returns a fixed size of memory buffer, which is usually
671 // bigger than NFC packets. This may hide OOB issues.
672 p_msg = (NFC_HDR*)GKI_getbuf(sizeof(NFC_HDR) + NFC_RECEIVE_MSGS_OFFSET +
673 data_len);
674 #else
675 p_msg = (NFC_HDR*)GKI_getpoolbuf(NFC_NCI_POOL_ID);
676 #endif
677 if (p_msg != nullptr) {
678 /* Initialize NFC_HDR */
679 p_msg->len = data_len;
680 p_msg->event = BT_EVT_TO_NFC_NCI;
681 p_msg->offset = NFC_RECEIVE_MSGS_OFFSET;
682
683 /* no need to check length, it always less than pool size */
684 memcpy((uint8_t*)(p_msg + 1) + p_msg->offset, p_data, p_msg->len);
685
686 GKI_send_msg(NFC_TASK, NFC_MBOX_ID, p_msg);
687 } else {
688 LOG(ERROR) << StringPrintf("%s: No buffer", __func__);
689 }
690 }
691 }
692
693 /*******************************************************************************
694 **
695 ** Function NFC_Enable
696 **
697 ** Description This function enables NFC. Prior to calling NFC_Enable:
698 ** - the NFCC must be powered up, and ready to receive
699 ** commands.
700 ** - GKI must be enabled
701 ** - NFC_TASK must be started
702 ** - NCIT_TASK must be started (if using dedicated NCI
703 ** transport)
704 **
705 ** This function opens the NCI transport (if applicable),
706 ** resets the NFC controller, and initializes the NFC
707 ** subsystems.
708 **
709 ** When the NFC startup procedure is completed, an
710 ** NFC_ENABLE_REVT is returned to the application using the
711 ** tNFC_RESPONSE_CBACK.
712 **
713 ** Returns tNFC_STATUS
714 **
715 *******************************************************************************/
NFC_Enable(tNFC_RESPONSE_CBACK * p_cback)716 tNFC_STATUS NFC_Enable(tNFC_RESPONSE_CBACK* p_cback) {
717 LOG(VERBOSE) << __func__;
718
719 /* Validate callback */
720 if (!p_cback) {
721 return (NFC_STATUS_INVALID_PARAM);
722 }
723 nfc_cb.p_resp_cback = p_cback;
724
725 /* Open HAL transport. */
726 nfc_set_state(NFC_STATE_W4_HAL_OPEN);
727 nfc_cb.p_hal->open(nfc_main_hal_cback, nfc_main_hal_data_cback);
728
729 return (NFC_STATUS_OK);
730 }
731
732 /*******************************************************************************
733 **
734 ** Function NFC_Disable
735 **
736 ** Description This function performs clean up routines for shutting down
737 ** NFC and closes the NCI transport (if using dedicated NCI
738 ** transport).
739 **
740 ** When the NFC shutdown procedure is completed, an
741 ** NFC_DISABLED_REVT is returned to the application using the
742 ** tNFC_RESPONSE_CBACK.
743 **
744 ** Returns nothing
745 **
746 *******************************************************************************/
NFC_Disable(void)747 void NFC_Disable(void) {
748 LOG(VERBOSE) << StringPrintf("%s: nfc_state = %d", __func__,
749 nfc_cb.nfc_state);
750
751 if ((nfc_cb.nfc_state == NFC_STATE_NONE) ||
752 (nfc_cb.nfc_state == NFC_STATE_NFCC_POWER_OFF_SLEEP)) {
753 nfc_set_state(NFC_STATE_NONE);
754 if (nfc_cb.p_resp_cback) {
755 (*nfc_cb.p_resp_cback)(NFC_DISABLE_REVT, nullptr);
756 nfc_cb.p_resp_cback = nullptr;
757 }
758 return;
759 }
760
761 /* Close transport and clean up */
762 nfc_task_shutdown_nfcc();
763 }
764
765 /*******************************************************************************
766 **
767 ** Function NFC_Init
768 **
769 ** Description This function initializes control block for NFC
770 **
771 ** Returns nothing
772 **
773 *******************************************************************************/
NFC_Init(tHAL_NFC_ENTRY * p_hal_entry_tbl)774 void NFC_Init(tHAL_NFC_ENTRY* p_hal_entry_tbl) {
775 int xx;
776
777 /* Clear nfc control block */
778 memset(&nfc_cb, 0, sizeof(tNFC_CB));
779
780 /* Reset the nfc control block */
781 for (xx = 0; xx < NCI_MAX_CONN_CBS; xx++) {
782 nfc_cb.conn_cb[xx].conn_id = NFC_ILLEGAL_CONN_ID;
783 }
784
785 /* NCI init */
786 nfc_cb.p_hal = p_hal_entry_tbl;
787 nfc_cb.nfc_state = NFC_STATE_NONE;
788 nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW;
789 nfc_cb.nci_wait_rsp_tout = NFC_CMD_CMPL_TIMEOUT;
790 nfc_cb.p_disc_maps = nfc_interface_mapping;
791 nfc_cb.num_disc_maps = NFC_NUM_INTERFACE_MAP;
792 nfc_cb.nci_ctrl_size = NCI_CTRL_INIT_SIZE;
793 nfc_cb.reassembly = true;
794 nfc_cb.nci_version = NCI_VERSION_UNKNOWN;
795 GKI_init_timer_list(&nfc_cb.timer_queue);
796 GKI_init_timer_list(&nfc_cb.quick_timer_queue);
797 rw_init();
798 ce_init();
799 NFC_SET_MAX_CONN_DEFAULT();
800 }
801
802 /*******************************************************************************
803 **
804 ** Function NFC_GetLmrtSize
805 **
806 ** Description Called by application wto query the Listen Mode Routing
807 ** Table size supported by NFCC
808 **
809 ** Returns Listen Mode Routing Table size
810 **
811 *******************************************************************************/
NFC_GetLmrtSize(void)812 uint16_t NFC_GetLmrtSize(void) {
813 uint16_t size = 0;
814 #if (NFC_RW_ONLY == FALSE)
815 size = nfc_cb.max_ce_table;
816 #endif
817 return size;
818 }
819
820 /*******************************************************************************
821 **
822 ** Function NFC_SetConfig
823 **
824 ** Description This function is called to send the configuration parameter
825 ** TLV to NFCC. The response from NFCC is reported by
826 ** tNFC_RESPONSE_CBACK as NFC_SET_CONFIG_REVT.
827 **
828 ** Parameters tlv_size - the length of p_param_tlvs.
829 ** p_param_tlvs - the parameter ID/Len/Value list
830 **
831 ** Returns tNFC_STATUS
832 **
833 *******************************************************************************/
NFC_SetConfig(uint8_t tlv_size,uint8_t * p_param_tlvs)834 tNFC_STATUS NFC_SetConfig(uint8_t tlv_size, uint8_t* p_param_tlvs) {
835 return nci_snd_core_set_config(p_param_tlvs, tlv_size);
836 }
837
838 /*******************************************************************************
839 **
840 ** Function NFC_GetConfig
841 **
842 ** Description This function is called to retrieve the parameter TLV from
843 ** NFCC. The response from NFCC is reported by
844 ** tNFC_RESPONSE_CBACK as NFC_GET_CONFIG_REVT.
845 **
846 ** Parameters num_ids - the number of parameter IDs
847 ** p_param_ids - the parameter ID list.
848 **
849 ** Returns tNFC_STATUS
850 **
851 *******************************************************************************/
NFC_GetConfig(uint8_t num_ids,uint8_t * p_param_ids)852 tNFC_STATUS NFC_GetConfig(uint8_t num_ids, uint8_t* p_param_ids) {
853 return nci_snd_core_get_config(p_param_ids, num_ids);
854 }
855
856 /*******************************************************************************
857 **
858 ** Function NFC_DiscoveryMap
859 **
860 ** Description This function is called to set the discovery interface
861 ** mapping. The response from NFCC is reported by
862 ** tNFC_DISCOVER_CBACK as NFC_MAP_DEVT.
863 **
864 ** Parameters num - the number of items in p_params.
865 ** p_maps - the discovery interface mappings
866 ** p_cback - the discovery callback function
867 **
868 ** Returns tNFC_STATUS
869 **
870 *******************************************************************************/
NFC_DiscoveryMap(uint8_t num,tNFC_DISCOVER_MAPS * p_maps,tNFC_DISCOVER_CBACK * p_cback)871 tNFC_STATUS NFC_DiscoveryMap(uint8_t num, tNFC_DISCOVER_MAPS* p_maps,
872 tNFC_DISCOVER_CBACK* p_cback) {
873 uint8_t num_disc_maps = num;
874 uint8_t xx, yy, num_intf, intf_mask;
875 tNFC_DISCOVER_MAPS
876 max_maps[NFC_NFCC_MAX_NUM_VS_INTERFACE + NCI_INTERFACE_MAX];
877 bool is_supported;
878
879 nfc_cb.p_discv_cback = p_cback;
880 num_intf = 0;
881 LOG(VERBOSE) << StringPrintf("%s: nci_interfaces supported by NFCC=0x%x",
882 __func__, nfc_cb.nci_interfaces);
883
884 for (xx = 0; xx < NFC_NFCC_MAX_NUM_VS_INTERFACE + NCI_INTERFACE_MAX; xx++) {
885 memset(&max_maps[xx], 0x00, sizeof(tNFC_DISCOVER_MAPS));
886 }
887
888 for (xx = 0; xx < num_disc_maps; xx++) {
889 is_supported = false;
890 if (p_maps[xx].intf_type > NCI_INTERFACE_MAX) {
891 for (yy = 0; yy < NFC_NFCC_MAX_NUM_VS_INTERFACE; yy++) {
892 if (nfc_cb.vs_interface[yy] == p_maps[xx].intf_type)
893 is_supported = true;
894 }
895 LOG(VERBOSE) << StringPrintf(
896 "%s: [%d]: vs intf_type=0x%x is_supported=%d", __func__, xx,
897 p_maps[xx].intf_type, is_supported);
898 } else {
899 intf_mask = (1 << (p_maps[xx].intf_type));
900 if (intf_mask & nfc_cb.nci_interfaces) {
901 is_supported = true;
902 }
903 LOG(VERBOSE) << StringPrintf(
904 "%s: [%d]: intf_type=%d intf_mask=0x%x is_supported=%d", __func__, xx,
905 p_maps[xx].intf_type, intf_mask, is_supported);
906 }
907 if (is_supported)
908 memcpy(&max_maps[num_intf++], &p_maps[xx], sizeof(tNFC_DISCOVER_MAPS));
909 else {
910 LOG(WARNING) << StringPrintf(
911 "%s: interface=0x%x is not supported by NFCC", __func__,
912 p_maps[xx].intf_type);
913 }
914 }
915
916 return nci_snd_discover_map_cmd(num_intf, (tNCI_DISCOVER_MAPS*)max_maps);
917 }
918
919 /*******************************************************************************
920 **
921 ** Function NFC_DiscoveryStart
922 **
923 ** Description This function is called to start Polling and/or Listening.
924 ** The response from NFCC is reported by tNFC_DISCOVER_CBACK as
925 ** NFC_START_DEVT. The notification from NFCC is reported by
926 ** tNFC_DISCOVER_CBACK as NFC_RESULT_DEVT.
927 **
928 ** Parameters num_params - the number of items in p_params.
929 ** p_params - the discovery parameters
930 ** p_cback - the discovery callback function
931 **
932 ** Returns tNFC_STATUS
933 **
934 *******************************************************************************/
NFC_DiscoveryStart(uint8_t num_params,tNFC_DISCOVER_PARAMS * p_params,tNFC_DISCOVER_CBACK * p_cback)935 tNFC_STATUS NFC_DiscoveryStart(uint8_t num_params,
936 tNFC_DISCOVER_PARAMS* p_params,
937 tNFC_DISCOVER_CBACK* p_cback) {
938 uint8_t* p;
939 int params_size;
940 tNFC_STATUS status = NFC_STATUS_NO_BUFFERS;
941
942 LOG(VERBOSE) << __func__;
943 if (nfc_cb.p_disc_pending) {
944 LOG(ERROR) << StringPrintf("%s: There's pending NFC_DiscoveryStart",
945 __func__);
946 status = NFC_STATUS_BUSY;
947 } else {
948 nfc_cb.p_discv_cback = p_cback;
949 nfc_cb.flags |= NFC_FL_DISCOVER_PENDING;
950 nfc_cb.flags |= NFC_FL_CONTROL_REQUESTED;
951 params_size = sizeof(tNFC_DISCOVER_PARAMS) * num_params;
952 nfc_cb.p_disc_pending =
953 GKI_getbuf((uint16_t)(NFC_HDR_SIZE + 1 + params_size));
954 if (nfc_cb.p_disc_pending) {
955 p = (uint8_t*)nfc_cb.p_disc_pending;
956 *p++ = num_params;
957 memcpy(p, p_params, params_size);
958 status = NFC_STATUS_CMD_STARTED;
959 nfc_ncif_check_cmd_queue(nullptr);
960 }
961 }
962
963 LOG(VERBOSE) << StringPrintf("%s: status=0x%x", __func__, status);
964 return status;
965 }
966
967 /*******************************************************************************
968 **
969 ** Function NFC_DiscoverySelect
970 **
971 ** Description If tNFC_DISCOVER_CBACK reports status=NFC_MULTIPLE_PROT,
972 ** the application needs to use this function to select the
973 ** the logical endpoint to continue. The response from NFCC is
974 ** reported by tNFC_DISCOVER_CBACK as NFC_SELECT_DEVT.
975 **
976 ** Parameters rf_disc_id - The ID identifies the remote device.
977 ** protocol - the logical endpoint on the remote device
978 ** rf_interface - the RF interface to communicate with NFCC
979 **
980 ** Returns tNFC_STATUS
981 **
982 *******************************************************************************/
NFC_DiscoverySelect(uint8_t rf_disc_id,uint8_t protocol,uint8_t rf_interface)983 tNFC_STATUS NFC_DiscoverySelect(uint8_t rf_disc_id, uint8_t protocol,
984 uint8_t rf_interface) {
985 return nci_snd_discover_select_cmd(rf_disc_id, protocol, rf_interface);
986 }
987
988 /*******************************************************************************
989 **
990 ** Function NFC_StartRfIntfExtension
991 **
992 ** Description If tNFC_DISCOVER_CBACK reports status=NFC_MULTIPLE_PROT,
993 ** the application needs to use this function to select the
994 ** the logical endpoint to continue. The response from NFCC is
995 ** reported by tNFC_DISCOVER_CBACK as NFC_SELECT_DEVT.
996 **
997 ** Parameters rf_disc_id - The ID identifies the remote device.
998 ** protocol - the logical endpoint on the remote device
999 ** rf_interface - the RF interface to communicate with NFCC
1000 **
1001 ** Returns tNFC_STATUS
1002 **
1003 *******************************************************************************/
NFC_StartRfIntfExtension(uint8_t rf_ext_id,uint8_t * p_data,uint8_t len)1004 tNFC_STATUS NFC_StartRfIntfExtension(uint8_t rf_ext_id, uint8_t* p_data,
1005 uint8_t len) {
1006 return nci_snd_rf_extension_control_cmd(NFC_RF_INTF_EXT_START, rf_ext_id,
1007 p_data, len);
1008 }
1009
1010 /*******************************************************************************
1011 **
1012 ** Function NFC_StopRfIntfExtension
1013 **
1014 ** Description If tNFC_DISCOVER_CBACK reports status=NFC_MULTIPLE_PROT,
1015 ** the application needs to use this function to select the
1016 ** the logical endpoint to continue. The response from NFCC is
1017 ** reported by tNFC_DISCOVER_CBACK as NFC_SELECT_DEVT.
1018 **
1019 ** Parameters rf_disc_id - The ID identifies the remote device.
1020 ** protocol - the logical endpoint on the remote device
1021 ** rf_interface - the RF interface to communicate with NFCC
1022 **
1023 ** Returns tNFC_STATUS
1024 **
1025 *******************************************************************************/
NFC_StopRfIntfExtension(uint8_t rf_ext_id,uint8_t * p_data,uint8_t len)1026 tNFC_STATUS NFC_StopRfIntfExtension(uint8_t rf_ext_id, uint8_t* p_data,
1027 uint8_t len) {
1028 return nci_snd_rf_extension_control_cmd(NFC_RF_INTF_EXT_STOP, rf_ext_id,
1029 p_data, len);
1030 }
1031
1032 /*******************************************************************************
1033 **
1034 ** Function NFC_StartEPRemovalDetection
1035 **
1036 ** Description If tNFC_DISCOVER_CBACK reports status=NFC_MULTIPLE_PROT,
1037 ** the application needs to use this function to select the
1038 ** the logical endpoint to continue. The response from NFCC is
1039 ** reported by tNFC_DISCOVER_CBACK as NFC_SELECT_DEVT.
1040 **
1041 ** Parameters rf_disc_id - The ID identifies the remote device.
1042 ** protocol - the logical endpoint on the remote device
1043 ** rf_interface - the RF interface to communicate with NFCC
1044 **
1045 ** Returns tNFC_STATUS
1046 **
1047 *******************************************************************************/
NFC_StartEPRemovalDetection(uint8_t waiting_time)1048 tNFC_STATUS NFC_StartEPRemovalDetection(uint8_t waiting_time) {
1049 return nci_snd_ep_removal_detection_cmd(waiting_time);
1050 }
1051
1052 /*******************************************************************************
1053 **
1054 ** Function NFC_StartPowerTransfert
1055 **
1056 ** Description If tNFC_DISCOVER_CBACK reports status=NFC_MULTIPLE_PROT,
1057 ** the application needs to use this function to select the
1058 ** the logical endpoint to continue. The response from NFCC is
1059 ** reported by tNFC_DISCOVER_CBACK as NFC_SELECT_DEVT.
1060 **
1061 ** Parameters rf_disc_id - The ID identifies the remote device.
1062 ** protocol - the logical endpoint on the remote device
1063 ** rf_interface - the RF interface to communicate with NFCC
1064 **
1065 ** Returns tNFC_STATUS
1066 **
1067 *******************************************************************************/
NFC_StartPowerTransfert(uint8_t * p_param,uint8_t param_len)1068 tNFC_STATUS NFC_StartPowerTransfert(uint8_t* p_param, uint8_t param_len) {
1069 return nci_snd_rf_wpt_control_cmd(p_param, param_len);
1070 }
1071
1072 /*******************************************************************************
1073 **
1074 ** Function NFC_ConnCreate
1075 **
1076 ** Description This function is called to create a logical connection with
1077 ** NFCC for data exchange.
1078 **
1079 ** Parameters dest_type - the destination type
1080 ** id - the NFCEE ID or RF Discovery ID .
1081 ** protocol - the protocol.
1082 ** p_cback - the connection callback function
1083 **
1084 ** Returns tNFC_STATUS
1085 **
1086 *******************************************************************************/
NFC_ConnCreate(uint8_t dest_type,uint8_t id,uint8_t protocol,tNFC_CONN_CBACK * p_cback)1087 tNFC_STATUS NFC_ConnCreate(uint8_t dest_type, uint8_t id, uint8_t protocol,
1088 tNFC_CONN_CBACK* p_cback) {
1089 tNFC_STATUS status = NFC_STATUS_FAILED;
1090 tNFC_CONN_CB* p_cb;
1091 uint8_t num_tlv = 0, tlv_size = 0;
1092 uint8_t param_tlvs[4], *pp;
1093
1094 LOG(VERBOSE) << StringPrintf("%s", __func__);
1095
1096 p_cb = nfc_alloc_conn_cb(p_cback);
1097 if (p_cb) {
1098 p_cb->id = id;
1099 pp = param_tlvs;
1100 if (dest_type == NCI_DEST_TYPE_NFCEE) {
1101 num_tlv = 1;
1102 UINT8_TO_STREAM(pp, NCI_CON_CREATE_TAG_NFCEE_VAL);
1103 UINT8_TO_STREAM(pp, 2);
1104 UINT8_TO_STREAM(pp, id);
1105 UINT8_TO_STREAM(pp, protocol);
1106 tlv_size = 4;
1107 } else if (dest_type == NCI_DEST_TYPE_REMOTE) {
1108 num_tlv = 1;
1109 UINT8_TO_STREAM(pp, NCI_CON_CREATE_TAG_RF_DISC_ID);
1110 UINT8_TO_STREAM(pp, 1);
1111 UINT8_TO_STREAM(pp, id);
1112 tlv_size = 3;
1113 } else if (dest_type == NCI_DEST_TYPE_NFCC) {
1114 p_cb->id = NFC_TEST_ID;
1115 }
1116 /* Add handling of NCI_DEST_TYPE_REMOTE when more RF interface definitions
1117 * are added */
1118 p_cb->act_protocol = protocol;
1119 p_cb->p_cback = p_cback;
1120 status = nci_snd_core_conn_create(dest_type, num_tlv, tlv_size, param_tlvs);
1121 if (status == NFC_STATUS_FAILED) nfc_free_conn_cb(p_cb);
1122 }
1123 return status;
1124 }
1125
1126 /*******************************************************************************
1127 **
1128 ** Function NFC_ConnClose
1129 **
1130 ** Description This function is called to close a logical connection with
1131 ** NFCC.
1132 **
1133 ** Parameters conn_id - the connection id.
1134 **
1135 ** Returns tNFC_STATUS
1136 **
1137 *******************************************************************************/
NFC_ConnClose(uint8_t conn_id)1138 tNFC_STATUS NFC_ConnClose(uint8_t conn_id) {
1139 tNFC_CONN_CB* p_cb = nfc_find_conn_cb_by_conn_id(conn_id);
1140 tNFC_STATUS status = NFC_STATUS_FAILED;
1141
1142 if (p_cb) {
1143 status = nci_snd_core_conn_close(conn_id);
1144 }
1145 return status;
1146 }
1147
1148 /*******************************************************************************
1149 **
1150 ** Function NFC_SetStaticRfCback
1151 **
1152 ** Description This function is called to update the data callback function
1153 ** to receive the data for the given connection id.
1154 **
1155 ** Parameters p_cback - the connection callback function
1156 **
1157 ** Returns Nothing
1158 **
1159 *******************************************************************************/
NFC_SetStaticRfCback(tNFC_CONN_CBACK * p_cback)1160 void NFC_SetStaticRfCback(tNFC_CONN_CBACK* p_cback) {
1161 tNFC_CONN_CB* p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID];
1162
1163 p_cb->p_cback = p_cback;
1164 /* just in case DH has received NCI data before the data callback is set
1165 * check if there's any data event to report on this connection id */
1166 nfc_data_event(p_cb);
1167 }
1168
1169 /*******************************************************************************
1170 **
1171 ** Function NFC_SetStaticT4tNfceeCback
1172 **
1173 ** Description This function is called to update the data callback function
1174 ** to receive the data for the given connection id.
1175 **
1176 ** Parameters p_cback - the connection callback function
1177 ** connId - connection ID for T4T NFCEE
1178 **
1179 ** Returns Nothing
1180 **
1181 *******************************************************************************/
NFC_SetStaticT4tNfceeCback(tNFC_CONN_CBACK * p_cback,uint8_t connId)1182 void NFC_SetStaticT4tNfceeCback(tNFC_CONN_CBACK* p_cback, uint8_t connId) {
1183 // tNFC_CONN_CB * p_cb = &nfc_cb.conn_cb[];
1184 tNFC_CONN_CB* p_cb = nfc_find_conn_cb_by_conn_id(connId);
1185 if (p_cb != NULL) {
1186 p_cb->p_cback = p_cback;
1187 /* just in case DH has received NCI data before the data callback is set
1188 * check if there's any data event to report on this connection id */
1189 nfc_data_event(p_cb);
1190 LOG(DEBUG) << StringPrintf("%s: %p, p_cb->p_cback = %p", __func__, p_cb,
1191 p_cb->p_cback);
1192 }
1193 }
1194
1195 /*******************************************************************************
1196 **
1197 ** Function NFC_SetReassemblyFlag
1198 **
1199 ** Description This function is called to set if nfc will reassemble
1200 ** nci packet as much as its buffer can hold or it should not
1201 ** reassemble but forward the fragmented nci packet to layer
1202 ** above. If nci data pkt is fragmented, nfc may send multiple
1203 ** NFC_DATA_CEVT with status NFC_STATUS_CONTINUE before sending
1204 ** NFC_DATA_CEVT with status NFC_STATUS_OK based on reassembly
1205 ** configuration and reassembly buffer size
1206 **
1207 ** Parameters reassembly - flag to indicate if nfc may reassemble or not
1208 **
1209 ** Returns Nothing
1210 **
1211 *******************************************************************************/
NFC_SetReassemblyFlag(bool reassembly)1212 void NFC_SetReassemblyFlag(bool reassembly) { nfc_cb.reassembly = reassembly; }
1213
1214 /*******************************************************************************
1215 **
1216 ** Function NFC_SendData
1217 **
1218 ** Description This function is called to send the given data packet
1219 ** to the connection identified by the given connection id.
1220 **
1221 ** Parameters conn_id - the connection id.
1222 ** p_data - the data packet.
1223 ** p_data->offset must be >= NCI_MSG_OFFSET_SIZE +
1224 ** NCI_DATA_HDR_SIZE
1225 ** The data payload starts at
1226 ** ((uint8_t *) (p_data + 1) + p_data->offset)
1227 **
1228 ** Returns tNFC_STATUS
1229 **
1230 *******************************************************************************/
NFC_SendData(uint8_t conn_id,NFC_HDR * p_data)1231 tNFC_STATUS NFC_SendData(uint8_t conn_id, NFC_HDR* p_data) {
1232 if (!gki_utils) {
1233 gki_utils = new GkiUtils();
1234 }
1235 tNFC_STATUS status = NFC_STATUS_FAILED;
1236 tNFC_CONN_CB* p_cb = nfc_find_conn_cb_by_conn_id(conn_id);
1237
1238 if (p_cb && p_data &&
1239 p_data->offset >= NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE) {
1240 status = nfc_ncif_send_data(p_cb, p_data);
1241 }
1242
1243 if (status != NFC_STATUS_OK) gki_utils->freebuf(p_data);
1244
1245 return status;
1246 }
1247
1248 /*******************************************************************************
1249 **
1250 ** Function NFC_FlushData
1251 **
1252 ** Description This function is called to discard the tx data queue of
1253 ** the given connection id.
1254 **
1255 ** Parameters conn_id - the connection id.
1256 **
1257 ** Returns tNFC_STATUS
1258 **
1259 *******************************************************************************/
NFC_FlushData(uint8_t conn_id)1260 tNFC_STATUS NFC_FlushData(uint8_t conn_id) {
1261 tNFC_STATUS status = NFC_STATUS_FAILED;
1262 tNFC_CONN_CB* p_cb = nfc_find_conn_cb_by_conn_id(conn_id);
1263 void* p_buf;
1264
1265 if (p_cb) {
1266 status = NFC_STATUS_OK;
1267 if (!gki_utils) {
1268 gki_utils = new GkiUtils();
1269 }
1270 while ((p_buf = gki_utils->dequeue(&p_cb->tx_q)) != nullptr)
1271 gki_utils->freebuf(p_buf);
1272 }
1273
1274 return status;
1275 }
1276
1277 /*******************************************************************************
1278 **
1279 ** Function NFC_Deactivate
1280 **
1281 ** Description This function is called to stop the discovery process or
1282 ** put the listen device in sleep mode or terminate the NFC
1283 ** link.
1284 **
1285 ** The response from NFCC is reported by tNFC_DISCOVER_CBACK
1286 ** as NFC_DEACTIVATE_DEVT.
1287 **
1288 ** Parameters deactivate_type - NFC_DEACTIVATE_TYPE_IDLE, to IDLE mode.
1289 ** NFC_DEACTIVATE_TYPE_SLEEP to SLEEP mode.
1290 ** NFC_DEACTIVATE_TYPE_SLEEP_AF to SLEEP_AF
1291 ** mode.
1292 **
1293 ** Returns tNFC_STATUS
1294 **
1295 *******************************************************************************/
NFC_Deactivate(tNFC_DEACT_TYPE deactivate_type)1296 tNFC_STATUS NFC_Deactivate(tNFC_DEACT_TYPE deactivate_type) {
1297 tNFC_CONN_CB* p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID];
1298 tNFC_STATUS status = NFC_STATUS_OK;
1299
1300 LOG(VERBOSE) << StringPrintf(
1301 "%s: nfc_state=%d (%s) deactivate_type=%d", __func__, nfc_cb.nfc_state,
1302 nfc_state_name(nfc_cb.nfc_state).c_str(), deactivate_type);
1303
1304 if (nfc_cb.flags & NFC_FL_DISCOVER_PENDING) {
1305 /* the HAL pre-discover is still active - clear the pending flag */
1306 nfc_cb.flags &= ~NFC_FL_DISCOVER_PENDING;
1307 if (!(nfc_cb.flags & NFC_FL_HAL_REQUESTED)) {
1308 /* if HAL did not request for control, clear this bit now */
1309 nfc_cb.flags &= ~NFC_FL_CONTROL_REQUESTED;
1310 }
1311 GKI_freebuf(nfc_cb.p_disc_pending);
1312 nfc_cb.p_disc_pending = nullptr;
1313 return NFC_STATUS_OK;
1314 }
1315
1316 if (nfc_cb.nfc_state == NFC_STATE_OPEN) {
1317 nfc_set_state(NFC_STATE_CLOSING);
1318 LOG(VERBOSE) << StringPrintf("%s: act_protocol=%x credits=%d/%d", __func__,
1319 p_cb->act_protocol, p_cb->init_credits,
1320 p_cb->num_buff);
1321 if ((p_cb->act_protocol == NCI_PROTOCOL_NFC_DEP) &&
1322 (p_cb->init_credits != p_cb->num_buff)) {
1323 nfc_cb.flags |= NFC_FL_DEACTIVATING;
1324 nfc_cb.deactivate_timer.param = (uintptr_t)deactivate_type;
1325 nfc_start_timer(&nfc_cb.deactivate_timer,
1326 (uint16_t)(NFC_TTYPE_WAIT_2_DEACTIVATE),
1327 NFC_DEACTIVATE_TIMEOUT);
1328 return status;
1329 }
1330 }
1331
1332 status = nci_snd_deactivate_cmd(deactivate_type);
1333 return status;
1334 }
1335 /*******************************************************************************
1336 **
1337 ** Function NFC_SetPowerSubState
1338 **
1339 ** Description This function is called to send the power sub state (screen
1340 ** state) to NFCC. The response from NFCC is reported by
1341 ** tNFC_RESPONSE_CBACK as NFC_SET_POWER_STATE_REVT.
1342 **
1343 ** Parameters scree_state
1344 **
1345 ** Returns tNFC_STATUS
1346 **
1347 *******************************************************************************/
NFC_SetPowerSubState(uint8_t screen_state)1348 tNFC_STATUS NFC_SetPowerSubState(uint8_t screen_state) {
1349 return nci_snd_core_set_power_sub_state(screen_state);
1350 }
1351 /*******************************************************************************
1352 **
1353 ** Function NFC_UpdateRFCommParams
1354 **
1355 ** Description This function is called to update RF Communication
1356 ** parameters once the Frame RF Interface has been activated.
1357 **
1358 ** The response from NFCC is reported by tNFC_RESPONSE_CBACK
1359 ** as NFC_RF_COMM_PARAMS_UPDATE_REVT.
1360 **
1361 ** Returns tNFC_STATUS
1362 **
1363 *******************************************************************************/
NFC_UpdateRFCommParams(tNFC_RF_COMM_PARAMS * p_params)1364 tNFC_STATUS NFC_UpdateRFCommParams(tNFC_RF_COMM_PARAMS* p_params) {
1365 uint8_t tlvs[12];
1366 uint8_t* p = tlvs;
1367 uint8_t data_exch_config;
1368
1369 /* RF Technology and Mode */
1370 if (p_params->include_rf_tech_mode) {
1371 UINT8_TO_STREAM(p, NCI_RF_PARAM_ID_TECH_N_MODE);
1372 UINT8_TO_STREAM(p, 1);
1373 UINT8_TO_STREAM(p, p_params->rf_tech_n_mode);
1374 }
1375
1376 /* Transmit Bit Rate */
1377 if (p_params->include_tx_bit_rate) {
1378 UINT8_TO_STREAM(p, NCI_RF_PARAM_ID_TX_BIT_RATE);
1379 UINT8_TO_STREAM(p, 1);
1380 UINT8_TO_STREAM(p, p_params->tx_bit_rate);
1381 }
1382
1383 /* Receive Bit Rate */
1384 if (p_params->include_tx_bit_rate) {
1385 UINT8_TO_STREAM(p, NCI_RF_PARAM_ID_RX_BIT_RATE);
1386 UINT8_TO_STREAM(p, 1);
1387 UINT8_TO_STREAM(p, p_params->rx_bit_rate);
1388 }
1389
1390 /* NFC-B Data Exchange Configuration */
1391 if (p_params->include_nfc_b_config) {
1392 UINT8_TO_STREAM(p, NCI_RF_PARAM_ID_B_DATA_EX_PARAM);
1393 UINT8_TO_STREAM(p, 1);
1394
1395 data_exch_config = (p_params->min_tr0 & 0x03) << 6; /* b7b6 : Mininum TR0 */
1396 data_exch_config |= (p_params->min_tr1 & 0x03)
1397 << 4; /* b5b4 : Mininum TR1 */
1398 data_exch_config |= (p_params->suppression_eos & 0x01)
1399 << 3; /* b3 : Suppression of EoS */
1400 data_exch_config |= (p_params->suppression_sos & 0x01)
1401 << 2; /* b2 : Suppression of SoS */
1402 data_exch_config |= (p_params->min_tr2 & 0x03); /* b1b0 : Mininum TR2 */
1403
1404 UINT8_TO_STREAM(p, data_exch_config);
1405 }
1406
1407 return nci_snd_parameter_update_cmd(tlvs, (uint8_t)(p - tlvs));
1408 }
1409
1410 /*******************************************************************************
1411 **
1412 ** Function NFC_SetPowerOffSleep
1413 **
1414 ** Description This function closes/opens transport and turns off/on NFCC.
1415 **
1416 ** Returns tNFC_STATUS
1417 **
1418 *******************************************************************************/
NFC_SetPowerOffSleep(bool enable)1419 tNFC_STATUS NFC_SetPowerOffSleep(bool enable) {
1420 LOG(VERBOSE) << StringPrintf("%s: enable = %d", __func__, enable);
1421
1422 if ((enable == false) &&
1423 (nfc_cb.nfc_state == NFC_STATE_NFCC_POWER_OFF_SLEEP)) {
1424 nfc_cb.flags |= NFC_FL_RESTARTING;
1425
1426 /* open transport */
1427 nfc_set_state(NFC_STATE_W4_HAL_OPEN);
1428 nfc_cb.p_hal->open(nfc_main_hal_cback, nfc_main_hal_data_cback);
1429
1430 return NFC_STATUS_OK;
1431 } else if ((enable == true) && (nfc_cb.nfc_state == NFC_STATE_IDLE)) {
1432 /* close transport to turn off NFCC and clean up */
1433 nfc_cb.flags |= NFC_FL_POWER_OFF_SLEEP;
1434 nfc_task_shutdown_nfcc();
1435
1436 return NFC_STATUS_OK;
1437 }
1438
1439 LOG(ERROR) << StringPrintf("%s: invalid state = %d", __func__,
1440 nfc_cb.nfc_state);
1441 return NFC_STATUS_FAILED;
1442 }
1443
1444 /*******************************************************************************
1445 **
1446 ** Function NFC_PowerCycleNFCC
1447 **
1448 ** Description This function turns off and then on NFCC.
1449 **
1450 ** Returns tNFC_STATUS
1451 **
1452 *******************************************************************************/
NFC_PowerCycleNFCC(void)1453 tNFC_STATUS NFC_PowerCycleNFCC(void) {
1454 LOG(VERBOSE) << __func__;
1455
1456 if (nfc_cb.nfc_state == NFC_STATE_IDLE) {
1457 /* power cycle NFCC */
1458 nfc_cb.flags |= NFC_FL_POWER_CYCLE_NFCC;
1459 nfc_task_shutdown_nfcc();
1460
1461 return NFC_STATUS_OK;
1462 }
1463
1464 LOG(ERROR) << StringPrintf("%s: invalid state = %d", __func__,
1465 nfc_cb.nfc_state);
1466 return NFC_STATUS_FAILED;
1467 }
1468
1469 /*******************************************************************************
1470 **
1471 ** Function NFC_GetNCIVersion
1472 **
1473 ** Description Called by higher layer to get the current nci
1474 ** version of nfc.
1475 **
1476 ** Returns NCI version NCI2.0 / NCI1.0
1477 **
1478 *******************************************************************************/
NFC_GetNCIVersion()1479 uint8_t NFC_GetNCIVersion() { return nfc_cb.nci_version; }
1480
1481 /*******************************************************************************
1482 **
1483 ** Function NFC_ISODEPNakPresCheck
1484 **
1485 ** Description This function is called to send the ISO DEP nak presenc
1486 ** check cmd to check that the remote end point in RF field.
1487 **
1488 ** The response from NFCC is reported by call back.The ntf
1489 ** indicates success if card is present in field or failed
1490 ** if card is lost.
1491 **
1492 ** Returns tNFC_STATUS
1493 **
1494 *******************************************************************************/
NFC_ISODEPNakPresCheck()1495 tNFC_STATUS NFC_ISODEPNakPresCheck() {
1496 return nci_snd_iso_dep_nak_presence_check_cmd();
1497 }
1498
1499 /*******************************************************************************
1500 **
1501 ** Function NFC_SetStaticHciCback
1502 **
1503 ** Description This function is called to update the data callback function
1504 ** to receive the data for the static Hci connection id.
1505 **
1506 ** Parameters p_cback - the connection callback function
1507 **
1508 ** Returns Nothing
1509 **
1510 *******************************************************************************/
NFC_SetStaticHciCback(tNFC_CONN_CBACK * p_cback)1511 void NFC_SetStaticHciCback(tNFC_CONN_CBACK* p_cback) {
1512 LOG(VERBOSE) << StringPrintf("%s dest=%d", __func__, NCI_DEST_TYPE_NFCEE);
1513 tNFC_CONN_CB* p_cb = &nfc_cb.conn_cb[NFC_HCI_CONN_ID];
1514 tNFC_CONN evt_data;
1515
1516 p_cb->p_cback = p_cback;
1517 if (p_cback && p_cb->buff_size && p_cb->num_buff) {
1518 LOG(VERBOSE) << StringPrintf("%s: dest=%d", __func__, NCI_DEST_TYPE_NFCEE);
1519 evt_data.conn_create.status = NFC_STATUS_OK;
1520 evt_data.conn_create.dest_type = NCI_DEST_TYPE_NFCEE;
1521 evt_data.conn_create.id = p_cb->id;
1522 evt_data.conn_create.buff_size = p_cb->buff_size;
1523 evt_data.conn_create.num_buffs = p_cb->num_buff;
1524 (*p_cback)(NFC_HCI_CONN_ID, NFC_CONN_CREATE_CEVT, &evt_data);
1525 }
1526 }
1527
1528 /*******************************************************************************
1529 **
1530 ** Function NFC_IsRfRemovalDetectionSupported
1531 **
1532 ** Description Indicates if RF Removal Detection mode is supported by NFCC
1533 **
1534 ** Returns true if supported else false.
1535 **
1536 *******************************************************************************/
NFC_IsRfRemovalDetectionSupported()1537 bool NFC_IsRfRemovalDetectionSupported() {
1538 return (nfc_cb.nci_features & NCI_POLL_REMOVAL_DETECTION);
1539 }
1540
1541 /*******************************************************************************
1542 **
1543 ** Function NFC_GetStatusName
1544 **
1545 ** Description This function returns the status name.
1546 **
1547 ** NOTE conditionally compiled to save memory.
1548 **
1549 ** Returns pointer to the name
1550 **
1551 *******************************************************************************/
NFC_GetStatusName(tNFC_STATUS status)1552 std::string NFC_GetStatusName(tNFC_STATUS status) {
1553 switch (status) {
1554 case NFC_STATUS_OK:
1555 return "OK";
1556 case NFC_STATUS_REJECTED:
1557 return "REJECTED";
1558 case NFC_STATUS_MSG_CORRUPTED:
1559 return "CORRUPTED";
1560 case NFC_STATUS_BUFFER_FULL:
1561 return "BUFFER_FULL";
1562 case NFC_STATUS_FAILED:
1563 return "FAILED";
1564 case NFC_STATUS_NOT_INITIALIZED:
1565 return "NOT_INITIALIZED";
1566 case NFC_STATUS_SYNTAX_ERROR:
1567 return "SYNTAX_ERROR";
1568 case NFC_STATUS_SEMANTIC_ERROR:
1569 return "SEMANTIC_ERROR";
1570 case NFC_STATUS_UNKNOWN_GID:
1571 return "UNKNOWN_GID";
1572 case NFC_STATUS_UNKNOWN_OID:
1573 return "UNKNOWN_OID";
1574 case NFC_STATUS_INVALID_PARAM:
1575 return "INVALID_PARAM";
1576 case NFC_STATUS_MSG_SIZE_TOO_BIG:
1577 return "MSG_SIZE_TOO_BIG";
1578 case NFC_STATUS_ALREADY_STARTED:
1579 return "ALREADY_STARTED";
1580 case NFC_STATUS_ACTIVATION_FAILED:
1581 return "ACTIVATION_FAILED";
1582 case NFC_STATUS_TEAR_DOWN:
1583 return "TEAR_DOWN";
1584 case NFC_STATUS_RF_TRANSMISSION_ERR:
1585 return "RF_TRANSMISSION_ERR";
1586 case NFC_STATUS_RF_PROTOCOL_ERR:
1587 return "RF_PROTOCOL_ERR";
1588 case NFC_STATUS_TIMEOUT:
1589 return "TIMEOUT";
1590 case NFC_STATUS_EE_INTF_ACTIVE_FAIL:
1591 return "EE_INTF_ACTIVE_FAIL";
1592 case NFC_STATUS_EE_TRANSMISSION_ERR:
1593 return "EE_TRANSMISSION_ERR";
1594 case NFC_STATUS_EE_PROTOCOL_ERR:
1595 return "EE_PROTOCOL_ERR";
1596 case NFC_STATUS_EE_TIMEOUT:
1597 return "EE_TIMEOUT";
1598 case NFC_STATUS_CMD_STARTED:
1599 return "CMD_STARTED";
1600 case NFC_STATUS_HW_TIMEOUT:
1601 return "HW_TIMEOUT";
1602 case NFC_STATUS_CONTINUE:
1603 return "CONTINUE";
1604 case NFC_STATUS_REFUSED:
1605 return "REFUSED";
1606 case NFC_STATUS_BAD_RESP:
1607 return "BAD_RESP";
1608 case NFC_STATUS_CMD_NOT_CMPLTD:
1609 return "CMD_NOT_CMPLTD";
1610 case NFC_STATUS_NO_BUFFERS:
1611 return "NO_BUFFERS";
1612 case NFC_STATUS_WRONG_PROTOCOL:
1613 return "WRONG_PROTOCOL";
1614 case NFC_STATUS_BUSY:
1615 return "BUSY";
1616 case NFC_STATUS_LINK_LOSS:
1617 return "LINK_LOSS";
1618 case NFC_STATUS_BAD_LENGTH:
1619 return "BAD_LENGTH";
1620 case NFC_STATUS_BAD_HANDLE:
1621 return "BAD_HANDLE";
1622 case NFC_STATUS_CONGESTED:
1623 return "CONGESTED";
1624 default:
1625 return "UNKNOWN";
1626 }
1627 }
1628