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