nfc_main.c revision 85b7e84f6cc61506c94e98844cac9ce50bbbe9dc
15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu/******************************************************************************
25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu *
35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu *  Copyright (C) 2010-2013 Broadcom Corporation
45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu *
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) *  Licensed under the Apache License, Version 2.0 (the "License");
65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu *  you may not use this file except in compliance with the License.
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *  You may obtain a copy of the License at:
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *  http://www.apache.org/licenses/LICENSE-2.0
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *  Unless required by applicable law or agreed to in writing, software
125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu *  distributed under the License is distributed on an "AS IS" BASIS,
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *  See the License for the specific language governing permissions and
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *  limitations under the License.
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ******************************************************************************/
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch/******************************************************************************
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *  This file contains functions that interface with the NFC NCI transport.
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *  On the receive side, it routes events to the appropriate handler
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) *  (callback). On the transmit side, it manages the command transmission.
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ******************************************************************************/
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <string.h>
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "gki.h"
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "nfc_target.h"
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "bt_types.h"
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "hcidefs.h"
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if (NFC_INCLUDED == TRUE)
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "nfc_hal_api.h"
34#include "nfc_api.h"
35#include "nfc_int.h"
36#include "nci_hmsgs.h"
37#include "rw_int.h"
38#include "ce_int.h"
39
40#if (NFC_RW_ONLY == FALSE)
41#include "ce_api.h"
42#include "ce_int.h"
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()    {nfc_cb.max_conn = 1;}
48
49#else /* NFC_RW_ONLY */
50#define ce_init()
51#define llcp_init()
52
53#define NFC_SET_MAX_CONN_DEFAULT()
54
55#endif /* NFC_RW_ONLY */
56/****************************************************************************
57** Declarations
58****************************************************************************/
59#if NFC_DYNAMIC_MEMORY == FALSE
60tNFC_CB nfc_cb;
61#endif
62
63#if (NFC_RW_ONLY == FALSE)
64#define NFC_NUM_INTERFACE_MAP   2
65#else
66#define NFC_NUM_INTERFACE_MAP   1
67#endif
68
69static const tNCI_DISCOVER_MAPS nfc_interface_mapping[NFC_NUM_INTERFACE_MAP] =
70{
71    /* Protocols that use Frame Interface do not need to be included in the interface mapping */
72    {
73        NCI_PROTOCOL_ISO_DEP,
74        NCI_INTERFACE_MODE_POLL_N_LISTEN,
75        NCI_INTERFACE_ISO_DEP
76    }
77#if (NFC_RW_ONLY == FALSE)
78    ,
79    /* this can not be set here due to 2079xB0 NFCC issues */
80    {
81        NCI_PROTOCOL_NFC_DEP,
82        NCI_INTERFACE_MODE_POLL_N_LISTEN,
83        NCI_INTERFACE_NFC_DEP
84    }
85#endif
86};
87
88
89#if (BT_TRACE_VERBOSE == TRUE)
90/*******************************************************************************
91**
92** Function         nfc_state_name
93**
94** Description      This function returns the state name.
95**
96** NOTE             conditionally compiled to save memory.
97**
98** Returns          pointer to the name
99**
100*******************************************************************************/
101static char *nfc_state_name (UINT8 state)
102{
103    switch (state)
104    {
105    case NFC_STATE_NONE:
106        return ("NONE");
107    case NFC_STATE_W4_HAL_OPEN:
108        return ("W4_HAL_OPEN");
109    case NFC_STATE_CORE_INIT:
110        return ("CORE_INIT");
111    case NFC_STATE_W4_POST_INIT_CPLT:
112        return ("W4_POST_INIT_CPLT");
113    case NFC_STATE_IDLE:
114        return ("IDLE");
115    case NFC_STATE_OPEN:
116        return ("OPEN");
117    case NFC_STATE_CLOSING:
118        return ("CLOSING");
119    case NFC_STATE_W4_HAL_CLOSE:
120        return ("W4_HAL_CLOSE");
121    case NFC_STATE_NFCC_POWER_OFF_SLEEP:
122        return ("NFCC_POWER_OFF_SLEEP");
123    default:
124        return ("???? UNKNOWN STATE");
125    }
126}
127
128/*******************************************************************************
129**
130** Function         nfc_hal_event_name
131**
132** Description      This function returns the HAL event name.
133**
134** NOTE             conditionally compiled to save memory.
135**
136** Returns          pointer to the name
137**
138*******************************************************************************/
139static char *nfc_hal_event_name (UINT8 event)
140{
141    switch (event)
142    {
143    case HAL_NFC_OPEN_CPLT_EVT:
144        return ("HAL_NFC_OPEN_CPLT_EVT");
145
146    case HAL_NFC_CLOSE_CPLT_EVT:
147        return ("HAL_NFC_CLOSE_CPLT_EVT");
148
149    case HAL_NFC_POST_INIT_CPLT_EVT:
150        return ("HAL_NFC_POST_INIT_CPLT_EVT");
151
152    case HAL_NFC_PRE_DISCOVER_CPLT_EVT:
153        return ("HAL_NFC_PRE_DISCOVER_CPLT_EVT");
154
155    case HAL_NFC_REQUEST_CONTROL_EVT:
156        return ("HAL_NFC_REQUEST_CONTROL_EVT");
157
158    case HAL_NFC_RELEASE_CONTROL_EVT:
159        return ("HAL_NFC_RELEASE_CONTROL_EVT");
160
161    case HAL_NFC_ERROR_EVT:
162        return ("HAL_NFC_ERROR_EVT");
163
164    default:
165        return ("???? UNKNOWN EVENT");
166    }
167}
168#endif /* BT_TRACE_VERBOSE == TRUE */
169
170/*******************************************************************************
171**
172** Function         nfc_main_notify_enable_status
173**
174** Description      Notify status of Enable/PowerOffSleep/PowerCycle
175**
176*******************************************************************************/
177static void nfc_main_notify_enable_status (tNFC_STATUS nfc_status)
178{
179    tNFC_RESPONSE   evt_data;
180
181    evt_data.status = nfc_status;
182
183    if (nfc_cb.p_resp_cback)
184    {
185        /* if getting out of PowerOffSleep mode or restarting NFCC */
186        if (nfc_cb.flags & (NFC_FL_RESTARTING|NFC_FL_POWER_CYCLE_NFCC))
187        {
188            nfc_cb.flags &= ~(NFC_FL_RESTARTING|NFC_FL_POWER_CYCLE_NFCC);
189            if (nfc_status != NFC_STATUS_OK)
190            {
191                nfc_cb.flags |= NFC_FL_POWER_OFF_SLEEP;
192            }
193            (*nfc_cb.p_resp_cback) (NFC_NFCC_RESTART_REVT, &evt_data);
194        }
195        else
196        {
197            (*nfc_cb.p_resp_cback) (NFC_ENABLE_REVT, &evt_data);
198        }
199    }
200}
201
202/*******************************************************************************
203**
204** Function         nfc_enabled
205**
206** Description      NFCC enabled, proceed with stack start up.
207**
208** Returns          void
209**
210*******************************************************************************/
211void nfc_enabled (tNFC_STATUS nfc_status, BT_HDR *p_init_rsp_msg)
212{
213    tNFC_RESPONSE evt_data;
214    tNFC_CONN_CB  *p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID];
215    UINT8   *p;
216    UINT8   num_interfaces = 0, xx;
217    int     yy = 0;
218
219    memset (&evt_data, 0, sizeof (tNFC_RESPONSE));
220
221    if (nfc_status == NCI_STATUS_OK)
222    {
223        nfc_set_state (NFC_STATE_IDLE);
224
225        p = (UINT8 *) (p_init_rsp_msg + 1) + p_init_rsp_msg->offset + NCI_MSG_HDR_SIZE + 1;
226        /* we currently only support NCI of the same version.
227        * We may need to change this, when we support multiple version of NFCC */
228        evt_data.enable.nci_version = NCI_VERSION;
229        STREAM_TO_UINT32 (evt_data.enable.nci_features, p);
230        STREAM_TO_UINT8 (num_interfaces, p);
231
232        evt_data.enable.nci_interfaces = 0;
233        for (xx = 0; xx < num_interfaces; xx++)
234        {
235            if ((*p) <= NCI_INTERFACE_MAX)
236                evt_data.enable.nci_interfaces |= (1 << (*p));
237            else if (((*p) > NCI_INTERFACE_FIRST_VS) && (yy < NFC_NFCC_MAX_NUM_VS_INTERFACE))
238            {
239                /* save the VS RF interface in control block, if there's still room */
240                nfc_cb.vs_interface[yy++] = *p;
241            }
242            p++;
243        }
244        nfc_cb.nci_interfaces    = evt_data.enable.nci_interfaces;
245        memcpy (evt_data.enable.vs_interface, nfc_cb.vs_interface, NFC_NFCC_MAX_NUM_VS_INTERFACE);
246        evt_data.enable.max_conn = *p++;
247        STREAM_TO_UINT16 (evt_data.enable.max_ce_table, p);
248#if (NFC_RW_ONLY == FALSE)
249        nfc_cb.max_ce_table          = evt_data.enable.max_ce_table;
250        nfc_cb.nci_features          = evt_data.enable.nci_features;
251        nfc_cb.max_conn              = evt_data.enable.max_conn;
252#endif
253        nfc_cb.nci_ctrl_size         = *p++; /* Max Control Packet Payload Length */
254        p_cb->init_credits           = p_cb->num_buff = 0;
255        STREAM_TO_UINT16 (evt_data.enable.max_param_size, p);
256        nfc_set_conn_id (p_cb, NFC_RF_CONN_ID);
257        evt_data.enable.manufacture_id   = *p++;
258        STREAM_TO_ARRAY (evt_data.enable.nfcc_info, p, NFC_NFCC_INFO_LEN);
259        NFC_DiscoveryMap (nfc_cb.num_disc_maps, (tNCI_DISCOVER_MAPS *) nfc_cb.p_disc_maps, NULL);
260    }
261    /* else not successful. the buffers will be freed in nfc_free_conn_cb () */
262    else
263    {
264        if (nfc_cb.flags & NFC_FL_RESTARTING)
265        {
266            nfc_set_state (NFC_STATE_NFCC_POWER_OFF_SLEEP);
267        }
268        else
269        {
270            nfc_free_conn_cb (p_cb);
271
272            /* if NFCC didn't respond to CORE_RESET or CORE_INIT */
273            if (nfc_cb.nfc_state == NFC_STATE_CORE_INIT)
274            {
275                /* report status after closing HAL */
276                nfc_cb.p_hal->close ();
277                return;
278            }
279            else
280                nfc_set_state (NFC_STATE_NONE);
281        }
282    }
283
284    nfc_main_notify_enable_status (nfc_status);
285}
286
287/*******************************************************************************
288**
289** Function         nfc_set_state
290**
291** Description      Set the state of NFC stack
292**
293** Returns          void
294**
295*******************************************************************************/
296void nfc_set_state (tNFC_STATE nfc_state)
297{
298#if (BT_TRACE_VERBOSE == TRUE)
299    NFC_TRACE_DEBUG4 ("nfc_set_state %d (%s)->%d (%s)", nfc_cb.nfc_state, nfc_state_name (nfc_cb.nfc_state), nfc_state, nfc_state_name (nfc_state));
300#else
301    NFC_TRACE_DEBUG2 ("nfc_set_state %d->%d", nfc_cb.nfc_state, nfc_state);
302#endif
303    nfc_cb.nfc_state = nfc_state;
304}
305
306/*******************************************************************************
307**
308** Function         nfc_gen_cleanup
309**
310** Description      Clean up for both going into low power mode and disabling NFC
311**
312*******************************************************************************/
313void nfc_gen_cleanup (void)
314{
315    nfc_cb.flags  &= ~NFC_FL_DEACTIVATING;
316
317    /* the HAL pre-discover is still active - clear the pending flag/free the buffer */
318    if (nfc_cb.flags & NFC_FL_DISCOVER_PENDING)
319    {
320        nfc_cb.flags &= ~NFC_FL_DISCOVER_PENDING;
321        GKI_freebuf (nfc_cb.p_disc_pending);
322        nfc_cb.p_disc_pending = NULL;
323    }
324
325    nfc_cb.flags &= ~(NFC_FL_CONTROL_REQUESTED|NFC_FL_CONTROL_GRANTED);
326
327    nfc_stop_timer (&nfc_cb.deactivate_timer);
328
329    /* Reset the connection control blocks */
330    nfc_reset_all_conn_cbs ();
331
332    if (nfc_cb.p_nci_init_rsp)
333    {
334        GKI_freebuf (nfc_cb.p_nci_init_rsp);
335        nfc_cb.p_nci_init_rsp = NULL;
336    }
337
338    /* clear any pending CMD/RSP */
339    nfc_main_flush_cmd_queue ();
340}
341
342/*******************************************************************************
343**
344** Function         nfc_main_handle_hal_evt
345**
346** Description      Handle BT_EVT_TO_NFC_MSGS
347**
348*******************************************************************************/
349void nfc_main_handle_hal_evt (tNFC_HAL_EVT_MSG *p_msg)
350{
351    UINT8  *ps;
352
353    NFC_TRACE_DEBUG1 ("nfc_main_handle_hal_evt(): HAL event=0x%x", p_msg->hal_evt);
354
355    switch (p_msg->hal_evt)
356    {
357    case HAL_NFC_OPEN_CPLT_EVT: /* only for failure case */
358        nfc_enabled (NFC_STATUS_FAILED, NULL);
359        break;
360
361    case HAL_NFC_CLOSE_CPLT_EVT:
362        if (nfc_cb.p_resp_cback)
363        {
364            if (nfc_cb.nfc_state == NFC_STATE_W4_HAL_CLOSE)
365            {
366                if (nfc_cb.flags & NFC_FL_POWER_OFF_SLEEP)
367                {
368                    nfc_cb.flags &= ~NFC_FL_POWER_OFF_SLEEP;
369                    nfc_set_state (NFC_STATE_NFCC_POWER_OFF_SLEEP);
370                    (*nfc_cb.p_resp_cback) (NFC_NFCC_POWER_OFF_REVT, NULL);
371                }
372                else
373                {
374                    nfc_set_state (NFC_STATE_NONE);
375                    (*nfc_cb.p_resp_cback) (NFC_DISABLE_REVT, NULL);
376                    nfc_cb.p_resp_cback = NULL;
377                }
378            }
379            else
380            {
381                /* found error during initialization */
382                nfc_set_state (NFC_STATE_NONE);
383                nfc_main_notify_enable_status (NFC_STATUS_FAILED);
384            }
385        }
386        break;
387
388    case HAL_NFC_POST_INIT_CPLT_EVT:
389        if (nfc_cb.p_nci_init_rsp)
390        {
391            /*
392            ** if NFC_Disable() is called before receiving HAL_NFC_POST_INIT_CPLT_EVT,
393            ** then wait for HAL_NFC_CLOSE_CPLT_EVT.
394            */
395            if (nfc_cb.nfc_state == NFC_STATE_W4_POST_INIT_CPLT)
396            {
397                if (p_msg->status == HAL_NFC_STATUS_OK)
398                {
399                    nfc_enabled (NCI_STATUS_OK, nfc_cb.p_nci_init_rsp);
400                }
401                else /* if post initailization failed */
402                {
403                    nfc_enabled (NCI_STATUS_FAILED, NULL);
404                }
405            }
406
407            GKI_freebuf (nfc_cb.p_nci_init_rsp);
408            nfc_cb.p_nci_init_rsp = NULL;
409        }
410        break;
411
412    case HAL_NFC_PRE_DISCOVER_CPLT_EVT:
413        /* restore the command window, no matter if the discover command is still pending */
414        nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW;
415        nfc_cb.flags         &= ~NFC_FL_CONTROL_GRANTED;
416        if (nfc_cb.flags & NFC_FL_DISCOVER_PENDING)
417        {
418            /* issue the discovery command now, if it is still pending */
419            nfc_cb.flags &= ~NFC_FL_DISCOVER_PENDING;
420            ps            = (UINT8 *)nfc_cb.p_disc_pending;
421            nci_snd_discover_cmd (*ps, (tNFC_DISCOVER_PARAMS *)(ps + 1));
422            GKI_freebuf (nfc_cb.p_disc_pending);
423            nfc_cb.p_disc_pending = NULL;
424        }
425        else
426        {
427            /* check if there's other pending commands */
428            nfc_ncif_check_cmd_queue (NULL);
429        }
430
431        if (p_msg->status == HAL_NFC_STATUS_ERR_CMD_TIMEOUT)
432            nfc_ncif_event_status (NFC_NFCC_TIMEOUT_REVT, NFC_STATUS_HW_TIMEOUT);
433        break;
434
435    case HAL_NFC_REQUEST_CONTROL_EVT:
436        nfc_cb.flags    |= NFC_FL_CONTROL_REQUESTED;
437        nfc_ncif_check_cmd_queue (NULL);
438        break;
439
440    case HAL_NFC_RELEASE_CONTROL_EVT:
441        if (nfc_cb.flags & NFC_FL_CONTROL_GRANTED)
442        {
443            nfc_cb.flags &= ~NFC_FL_CONTROL_GRANTED;
444            nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW;
445            nfc_ncif_check_cmd_queue (NULL);
446
447            if (p_msg->status == HAL_NFC_STATUS_ERR_CMD_TIMEOUT)
448                nfc_ncif_event_status (NFC_NFCC_TIMEOUT_REVT, NFC_STATUS_HW_TIMEOUT);
449        }
450        break;
451
452    case HAL_NFC_ERROR_EVT:
453        switch (p_msg->status)
454        {
455        case HAL_NFC_STATUS_ERR_TRANSPORT:
456            /* Notify app of transport error */
457            if (nfc_cb.p_resp_cback)
458            {
459                (*nfc_cb.p_resp_cback) (NFC_NFCC_TRANSPORT_ERR_REVT, NULL);
460
461                /* if enabling NFC, notify upper layer of failure after closing HAL */
462                if (nfc_cb.nfc_state < NFC_STATE_IDLE)
463                {
464                    nfc_enabled (NFC_STATUS_FAILED, NULL);
465                }
466            }
467            break;
468
469        case HAL_NFC_STATUS_ERR_CMD_TIMEOUT:
470            nfc_ncif_event_status (NFC_NFCC_TIMEOUT_REVT, NFC_STATUS_HW_TIMEOUT);
471
472            /* if enabling NFC, notify upper layer of failure after closing HAL */
473            if (nfc_cb.nfc_state < NFC_STATE_IDLE)
474            {
475                nfc_enabled (NFC_STATUS_FAILED, NULL);
476                return;
477            }
478            break;
479
480        default:
481            break;
482        }
483        break;
484
485    default:
486        NFC_TRACE_ERROR1 ("nfc_main_handle_hal_evt (): unhandled event (0x%x).", p_msg->hal_evt);
487        break;
488    }
489}
490
491
492/*******************************************************************************
493**
494** Function         nfc_main_flush_cmd_queue
495**
496** Description      This function is called when setting power off sleep state.
497**
498** Returns          void
499**
500*******************************************************************************/
501void nfc_main_flush_cmd_queue (void)
502{
503    BT_HDR *p_msg;
504
505    NFC_TRACE_DEBUG0 ("nfc_main_flush_cmd_queue ()");
506
507    /* initialize command window */
508    nfc_cb.nci_cmd_window = NCI_MAX_CMD_WINDOW;
509
510    /* Stop command-pending timer */
511    nfc_stop_timer(&nfc_cb.nci_wait_rsp_timer);
512
513    /* dequeue and free buffer */
514    while ((p_msg = (BT_HDR *)GKI_dequeue (&nfc_cb.nci_cmd_xmit_q)) != NULL)
515    {
516        GKI_freebuf (p_msg);
517    }
518}
519
520/*******************************************************************************
521**
522** Function         nfc_main_post_hal_evt
523**
524** Description      This function posts HAL event to NFC_TASK
525**
526** Returns          void
527**
528*******************************************************************************/
529void nfc_main_post_hal_evt (UINT8 hal_evt, tHAL_NFC_STATUS status)
530{
531    tNFC_HAL_EVT_MSG *p_msg;
532
533    if ((p_msg = (tNFC_HAL_EVT_MSG *) GKI_getbuf (sizeof(tNFC_HAL_EVT_MSG))) != NULL)
534    {
535        /* Initialize BT_HDR */
536        p_msg->hdr.len    = 0;
537        p_msg->hdr.event  = BT_EVT_TO_NFC_MSGS;
538        p_msg->hdr.offset = 0;
539        p_msg->hdr.layer_specific = 0;
540        p_msg->hal_evt = hal_evt;
541        p_msg->status  = status;
542        GKI_send_msg (NFC_TASK, NFC_MBOX_ID, p_msg);
543    }
544    else
545    {
546        NFC_TRACE_ERROR0 ("nfc_main_post_hal_evt (): No buffer");
547    }
548}
549
550
551/*******************************************************************************
552**
553** Function         nfc_main_hal_cback
554**
555** Description      HAL event handler
556**
557** Returns          void
558**
559*******************************************************************************/
560static void nfc_main_hal_cback(UINT8 event, tHAL_NFC_STATUS status)
561{
562#if (BT_TRACE_VERBOSE == TRUE)
563    NFC_TRACE_DEBUG3 ("nfc_main_hal_cback event: %s(0x%x), status=%d",
564                       nfc_hal_event_name (event), event, status);
565#else
566    NFC_TRACE_DEBUG2 ("nfc_main_hal_cback event: 0x%x, status=%d", event, status);
567#endif
568
569    switch (event)
570    {
571    case HAL_NFC_OPEN_CPLT_EVT:
572        /*
573        ** if NFC_Disable() is called before receiving HAL_NFC_OPEN_CPLT_EVT,
574        ** then wait for HAL_NFC_CLOSE_CPLT_EVT.
575        */
576        if (nfc_cb.nfc_state == NFC_STATE_W4_HAL_OPEN)
577        {
578            if (status == HAL_NFC_STATUS_OK)
579            {
580                /* Notify NFC_TASK that NCI tranport is initialized */
581                GKI_send_event (NFC_TASK, NFC_TASK_EVT_TRANSPORT_READY);
582            }
583            else
584            {
585                nfc_main_post_hal_evt (event, status);
586            }
587        }
588        break;
589
590    case HAL_NFC_CLOSE_CPLT_EVT:
591    case HAL_NFC_POST_INIT_CPLT_EVT:
592    case HAL_NFC_PRE_DISCOVER_CPLT_EVT:
593    case HAL_NFC_REQUEST_CONTROL_EVT:
594    case HAL_NFC_RELEASE_CONTROL_EVT:
595    case HAL_NFC_ERROR_EVT:
596        nfc_main_post_hal_evt (event, status);
597        break;
598
599    default:
600        NFC_TRACE_DEBUG1 ("nfc_main_hal_cback unhandled event %x", event);
601        break;
602    }
603}
604
605/*******************************************************************************
606**
607** Function         nfc_main_hal_data_cback
608**
609** Description      HAL data event handler
610**
611** Returns          void
612**
613*******************************************************************************/
614static void nfc_main_hal_data_cback(UINT16 data_len, UINT8   *p_data)
615{
616    BT_HDR *p_msg;
617
618    /* ignore all data while shutting down NFCC */
619    if (nfc_cb.nfc_state == NFC_STATE_W4_HAL_CLOSE)
620    {
621        return;
622    }
623
624    if (p_data)
625    {
626        if ((p_msg = (BT_HDR *) GKI_getpoolbuf (NFC_NCI_POOL_ID)) != NULL)
627        {
628            /* Initialize BT_HDR */
629            p_msg->len    = data_len;
630            p_msg->event  = BT_EVT_TO_NFC_NCI;
631            p_msg->offset = NFC_RECEIVE_MSGS_OFFSET;
632
633            /* no need to check length, it always less than pool size */
634            memcpy ((UINT8 *)(p_msg + 1) + p_msg->offset, p_data, p_msg->len);
635
636            GKI_send_msg (NFC_TASK, NFC_MBOX_ID, p_msg);
637        }
638        else
639        {
640            NFC_TRACE_ERROR0 ("nfc_main_hal_data_cback (): No buffer");
641        }
642    }
643}
644
645/*******************************************************************************
646**
647** Function         NFC_Enable
648**
649** Description      This function enables NFC. Prior to calling NFC_Enable:
650**                  - the NFCC must be powered up, and ready to receive commands.
651**                  - GKI must be enabled
652**                  - NFC_TASK must be started
653**                  - NCIT_TASK must be started (if using dedicated NCI transport)
654**
655**                  This function opens the NCI transport (if applicable),
656**                  resets the NFC controller, and initializes the NFC subsystems.
657**
658**                  When the NFC startup procedure is completed, an
659**                  NFC_ENABLE_REVT is returned to the application using the
660**                  tNFC_RESPONSE_CBACK.
661**
662** Returns          tNFC_STATUS
663**
664*******************************************************************************/
665tNFC_STATUS NFC_Enable (tNFC_RESPONSE_CBACK *p_cback)
666{
667    NFC_TRACE_API0 ("NFC_Enable ()");
668
669    /* Validate callback */
670    if (!p_cback)
671    {
672        return (NFC_STATUS_INVALID_PARAM);
673    }
674    nfc_cb.p_resp_cback = p_cback;
675
676    /* Open HAL transport. */
677    nfc_set_state (NFC_STATE_W4_HAL_OPEN);
678    nfc_cb.p_hal->open (nfc_main_hal_cback, nfc_main_hal_data_cback);
679
680    return (NFC_STATUS_OK);
681}
682
683/*******************************************************************************
684**
685** Function         NFC_Disable
686**
687** Description      This function performs clean up routines for shutting down
688**                  NFC and closes the NCI transport (if using dedicated NCI
689**                  transport).
690**
691**                  When the NFC shutdown procedure is completed, an
692**                  NFC_DISABLED_REVT is returned to the application using the
693**                  tNFC_RESPONSE_CBACK.
694**
695** Returns          nothing
696**
697*******************************************************************************/
698void NFC_Disable (void)
699{
700    NFC_TRACE_API1 ("NFC_Disable (): nfc_state = %d", nfc_cb.nfc_state);
701
702    if ((nfc_cb.nfc_state == NFC_STATE_NONE) || (nfc_cb.nfc_state == NFC_STATE_NFCC_POWER_OFF_SLEEP))
703    {
704        nfc_set_state (NFC_STATE_NONE);
705        if (nfc_cb.p_resp_cback)
706        {
707            (*nfc_cb.p_resp_cback) (NFC_DISABLE_REVT, NULL);
708            nfc_cb.p_resp_cback = NULL;
709        }
710        return;
711    }
712
713    /* Close transport and clean up */
714    nfc_task_shutdown_nfcc ();
715}
716
717/*******************************************************************************
718**
719** Function         NFC_Init
720**
721** Description      This function initializes control block for NFC
722**
723** Returns          nothing
724**
725*******************************************************************************/
726void NFC_Init (tHAL_NFC_ENTRY *p_hal_entry_tbl)
727{
728    int xx;
729
730    /* Clear nfc control block */
731    memset (&nfc_cb, 0, sizeof (tNFC_CB));
732
733    /* Reset the nfc control block */
734    for (xx = 0; xx < NCI_MAX_CONN_CBS; xx++)
735    {
736        nfc_cb.conn_cb[xx].conn_id = NFC_ILLEGAL_CONN_ID;
737    }
738
739    /* NCI init */
740    nfc_cb.p_hal            = p_hal_entry_tbl;
741    nfc_cb.nfc_state        = NFC_STATE_NONE;
742    nfc_cb.nci_cmd_window   = NCI_MAX_CMD_WINDOW;
743    nfc_cb.nci_wait_rsp_tout= NFC_CMD_CMPL_TIMEOUT;
744    nfc_cb.p_disc_maps      = nfc_interface_mapping;
745    nfc_cb.num_disc_maps    = NFC_NUM_INTERFACE_MAP;
746    nfc_cb.trace_level      = NFC_INITIAL_TRACE_LEVEL;
747    nfc_cb.nci_ctrl_size    = NCI_CTRL_INIT_SIZE;
748
749    rw_init ();
750    ce_init ();
751    llcp_init ();
752    NFC_SET_MAX_CONN_DEFAULT ();
753}
754
755/*******************************************************************************
756**
757** Function         NFC_GetLmrtSize
758**
759** Description      Called by application wto query the Listen Mode Routing
760**                  Table size supported by NFCC
761**
762** Returns          Listen Mode Routing Table size
763**
764*******************************************************************************/
765UINT16 NFC_GetLmrtSize (void)
766{
767    UINT16 size = 0;
768#if (NFC_RW_ONLY == FALSE)
769    size = nfc_cb.max_ce_table;
770#endif
771    return size;
772}
773
774
775/*******************************************************************************
776**
777** Function         NFC_SetConfig
778**
779** Description      This function is called to send the configuration parameter
780**                  TLV to NFCC. The response from NFCC is reported by
781**                  tNFC_RESPONSE_CBACK as NFC_SET_CONFIG_REVT.
782**
783** Parameters       tlv_size - the length of p_param_tlvs.
784**                  p_param_tlvs - the parameter ID/Len/Value list
785**
786** Returns          tNFC_STATUS
787**
788*******************************************************************************/
789tNFC_STATUS NFC_SetConfig (UINT8     tlv_size,
790                           UINT8    *p_param_tlvs)
791{
792    return nci_snd_core_set_config (p_param_tlvs, tlv_size);
793}
794
795/*******************************************************************************
796**
797** Function         NFC_GetConfig
798**
799** Description      This function is called to retrieve the parameter TLV from NFCC.
800**                  The response from NFCC is reported by tNFC_RESPONSE_CBACK
801**                  as NFC_GET_CONFIG_REVT.
802**
803** Parameters       num_ids - the number of parameter IDs
804**                  p_param_ids - the parameter ID list.
805**
806** Returns          tNFC_STATUS
807**
808*******************************************************************************/
809tNFC_STATUS NFC_GetConfig (UINT8     num_ids,
810                           UINT8    *p_param_ids)
811{
812    return nci_snd_core_get_config (p_param_ids, num_ids);
813}
814
815/*******************************************************************************
816**
817** Function         NFC_DiscoveryMap
818**
819** Description      This function is called to set the discovery interface mapping.
820**                  The response from NFCC is reported by tNFC_DISCOVER_CBACK as.
821**                  NFC_MAP_DEVT.
822**
823** Parameters       num - the number of items in p_params.
824**                  p_maps - the discovery interface mappings
825**                  p_cback - the discovery callback function
826**
827** Returns          tNFC_STATUS
828**
829*******************************************************************************/
830tNFC_STATUS NFC_DiscoveryMap (UINT8 num, tNFC_DISCOVER_MAPS *p_maps,
831                                        tNFC_DISCOVER_CBACK *p_cback)
832{
833    UINT8   num_disc_maps = num;
834    UINT8   xx, yy, num_intf, intf_mask;
835    tNFC_DISCOVER_MAPS  max_maps[NFC_NFCC_MAX_NUM_VS_INTERFACE + NCI_INTERFACE_MAX];
836    BOOLEAN is_supported;
837
838    nfc_cb.p_discv_cback = p_cback;
839    num_intf             = 0;
840    NFC_TRACE_DEBUG1 ("nci_interfaces supported by NFCC: 0x%x", nfc_cb.nci_interfaces);
841    for (xx = 0; xx < num_disc_maps; xx++)
842    {
843        is_supported = FALSE;
844        if (p_maps[xx].intf_type > NCI_INTERFACE_MAX)
845        {
846            for (yy = 0; yy < NFC_NFCC_MAX_NUM_VS_INTERFACE; yy++)
847            {
848                if (nfc_cb.vs_interface[yy] == p_maps[xx].intf_type)
849                    is_supported    = TRUE;
850            }
851            NFC_TRACE_DEBUG3 ("[%d]: vs intf_type:0x%x is_supported:%d", xx, p_maps[xx].intf_type, is_supported);
852        }
853        else
854        {
855            intf_mask = (1 << (p_maps[xx].intf_type));
856            if (intf_mask & nfc_cb.nci_interfaces)
857            {
858                is_supported    = TRUE;
859            }
860            NFC_TRACE_DEBUG4 ("[%d]: intf_type:%d intf_mask: 0x%x is_supported:%d", xx, p_maps[xx].intf_type, intf_mask, is_supported);
861        }
862        if (is_supported)
863            memcpy (&max_maps[num_intf++], &p_maps[xx], sizeof (tNFC_DISCOVER_MAPS));
864        else
865        {
866            NFC_TRACE_WARNING1 ("NFC_DiscoveryMap interface=0x%x is not supported by NFCC", p_maps[xx].intf_type);
867        }
868    }
869
870    return nci_snd_discover_map_cmd (num_intf, (tNCI_DISCOVER_MAPS *) max_maps);
871}
872
873/*******************************************************************************
874**
875** Function         NFC_DiscoveryStart
876**
877** Description      This function is called to start Polling and/or Listening.
878**                  The response from NFCC is reported by tNFC_DISCOVER_CBACK as.
879**                  NFC_START_DEVT. The notification from NFCC is reported by
880**                  tNFC_DISCOVER_CBACK as NFC_RESULT_DEVT.
881**
882** Parameters       num_params - the number of items in p_params.
883**                  p_params - the discovery parameters
884**                  p_cback - the discovery callback function
885**
886** Returns          tNFC_STATUS
887**
888*******************************************************************************/
889tNFC_STATUS NFC_DiscoveryStart (UINT8                 num_params,
890                                tNFC_DISCOVER_PARAMS *p_params,
891                                tNFC_DISCOVER_CBACK  *p_cback)
892{
893    UINT8   *p;
894    int     params_size;
895    tNFC_STATUS status = NFC_STATUS_NO_BUFFERS;
896
897    NFC_TRACE_API0 ("NFC_DiscoveryStart");
898    if (nfc_cb.p_disc_pending)
899    {
900        NFC_TRACE_ERROR0 ("There's pending NFC_DiscoveryStart");
901        status = NFC_STATUS_BUSY;
902    }
903    else
904    {
905        nfc_cb.p_discv_cback = p_cback;
906        nfc_cb.flags        |= NFC_FL_DISCOVER_PENDING;
907        nfc_cb.flags        |= NFC_FL_CONTROL_REQUESTED;
908        params_size          = sizeof (tNFC_DISCOVER_PARAMS) * num_params;
909        nfc_cb.p_disc_pending = GKI_getbuf ((UINT16)(BT_HDR_SIZE + 1 + params_size));
910        if (nfc_cb.p_disc_pending)
911        {
912            p       = (UINT8 *)nfc_cb.p_disc_pending;
913            *p++    = num_params;
914            memcpy (p, p_params, params_size);
915            status = NFC_STATUS_CMD_STARTED;
916            nfc_ncif_check_cmd_queue (NULL);
917        }
918    }
919
920    NFC_TRACE_API1 ("NFC_DiscoveryStart status: 0x%x", status);
921    return status;
922}
923
924/*******************************************************************************
925**
926** Function         NFC_DiscoverySelect
927**
928** Description      If tNFC_DISCOVER_CBACK reports status=NFC_MULTIPLE_PROT,
929**                  the application needs to use this function to select the
930**                  the logical endpoint to continue. The response from NFCC is
931**                  reported by tNFC_DISCOVER_CBACK as NFC_SELECT_DEVT.
932**
933** Parameters       rf_disc_id - The ID identifies the remote device.
934**                  protocol - the logical endpoint on the remote devide
935**                  rf_interface - the RF interface to communicate with NFCC
936**
937** Returns          tNFC_STATUS
938**
939*******************************************************************************/
940tNFC_STATUS NFC_DiscoverySelect (UINT8    rf_disc_id,
941                                 UINT8    protocol,
942                                 UINT8    rf_interface)
943{
944    return nci_snd_discover_select_cmd (rf_disc_id, protocol, rf_interface);
945}
946
947/*******************************************************************************
948**
949** Function         NFC_ConnCreate
950**
951** Description      This function is called to create a logical connection with
952**                  NFCC for data exchange.
953**
954** Parameters       dest_type - the destination type
955**                  id   - the NFCEE ID or RF Discovery ID .
956**                  protocol   - the protocol.
957**                  p_cback - the connection callback function
958**
959** Returns          tNFC_STATUS
960**
961*******************************************************************************/
962tNFC_STATUS NFC_ConnCreate (UINT8            dest_type,
963                            UINT8            id,
964                            UINT8            protocol,
965                            tNFC_CONN_CBACK *p_cback)
966{
967    tNFC_STATUS     status = NFC_STATUS_FAILED;
968    tNFC_CONN_CB    *p_cb;
969    UINT8           num_tlv=0, tlv_size=0;
970    UINT8           param_tlvs[4], *pp;
971
972    p_cb = nfc_alloc_conn_cb (p_cback);
973    if (p_cb)
974    {
975        p_cb->id = id;
976        pp = param_tlvs;
977        if (dest_type == NCI_DEST_TYPE_NFCEE)
978        {
979            num_tlv = 1;
980            UINT8_TO_STREAM (pp, NCI_CON_CREATE_TAG_NFCEE_VAL);
981            UINT8_TO_STREAM (pp, 2);
982            UINT8_TO_STREAM (pp, id);
983            UINT8_TO_STREAM (pp, protocol);
984            tlv_size = 4;
985        }
986        else if (dest_type == NCI_DEST_TYPE_REMOTE)
987        {
988            num_tlv = 1;
989            UINT8_TO_STREAM (pp, NCI_CON_CREATE_TAG_RF_DISC_ID);
990            UINT8_TO_STREAM (pp, 1);
991            UINT8_TO_STREAM (pp, id);
992            tlv_size = 3;
993        }
994        else if (dest_type == NCI_DEST_TYPE_NFCC)
995        {
996            p_cb->id = NFC_TEST_ID;
997        }
998        /* Add handling of NCI_DEST_TYPE_REMOTE when more RF interface definitions are added */
999        p_cb->act_protocol = protocol;
1000        p_cb->p_cback = p_cback;
1001        status = nci_snd_core_conn_create (dest_type, num_tlv, tlv_size, param_tlvs);
1002        if (status == NFC_STATUS_FAILED)
1003            nfc_free_conn_cb (p_cb);
1004    }
1005    return status;
1006}
1007
1008/*******************************************************************************
1009**
1010** Function         NFC_ConnClose
1011**
1012** Description      This function is called to close a logical connection with
1013**                  NFCC.
1014**
1015** Parameters       conn_id - the connection id.
1016**
1017** Returns          tNFC_STATUS
1018**
1019*******************************************************************************/
1020tNFC_STATUS NFC_ConnClose (UINT8 conn_id)
1021{
1022    tNFC_CONN_CB *p_cb = nfc_find_conn_cb_by_conn_id (conn_id);
1023    tNFC_STATUS     status = NFC_STATUS_FAILED;
1024
1025    if (p_cb)
1026    {
1027        status = nci_snd_core_conn_close (conn_id);
1028    }
1029    return status;
1030}
1031
1032/*******************************************************************************
1033**
1034** Function         NFC_SetStaticRfCback
1035**
1036** Description      This function is called to update the data callback function
1037**                  to receive the data for the given connection id.
1038**
1039** Parameters       p_cback - the connection callback function
1040**
1041** Returns          Nothing
1042**
1043*******************************************************************************/
1044void NFC_SetStaticRfCback (tNFC_CONN_CBACK    *p_cback)
1045{
1046    tNFC_CONN_CB * p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID];
1047
1048    p_cb->p_cback = p_cback;
1049    /* just in case DH has received NCI data before the data callback is set
1050     * check if there's any data event to report on this connection id */
1051    nfc_data_event (p_cb);
1052}
1053
1054/*******************************************************************************
1055**
1056** Function         NFC_SendData
1057**
1058** Description      This function is called to send the given data packet
1059**                  to the connection identified by the given connection id.
1060**
1061** Parameters       conn_id - the connection id.
1062**                  p_data - the data packet.
1063**                  p_data->offset must be >= NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE
1064**                  The data payload starts at ((UINT8 *) (p_data + 1) + p_data->offset)
1065**
1066** Returns          tNFC_STATUS
1067**
1068*******************************************************************************/
1069tNFC_STATUS NFC_SendData (UINT8       conn_id,
1070                          BT_HDR     *p_data)
1071{
1072    tNFC_STATUS     status = NFC_STATUS_FAILED;
1073    tNFC_CONN_CB *p_cb = nfc_find_conn_cb_by_conn_id (conn_id);
1074
1075    if (p_cb && p_data && p_data->offset >= NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE)
1076    {
1077        status = nfc_ncif_send_data (p_cb, p_data);
1078    }
1079
1080    if (status != NFC_STATUS_OK)
1081        GKI_freebuf (p_data);
1082
1083    return status;
1084}
1085
1086/*******************************************************************************
1087**
1088** Function         NFC_FlushData
1089**
1090** Description      This function is called to discard the tx data queue of
1091**                  the given connection id.
1092**
1093** Parameters       conn_id - the connection id.
1094**
1095** Returns          tNFC_STATUS
1096**
1097*******************************************************************************/
1098tNFC_STATUS NFC_FlushData (UINT8       conn_id)
1099{
1100    tNFC_STATUS     status = NFC_STATUS_FAILED;
1101    tNFC_CONN_CB    *p_cb = nfc_find_conn_cb_by_conn_id (conn_id);
1102    void            *p_buf;
1103
1104    if (p_cb)
1105    {
1106        status  = NFC_STATUS_OK;
1107        while ((p_buf = GKI_dequeue (&p_cb->tx_q)) != NULL)
1108            GKI_freebuf (p_buf);
1109    }
1110
1111    return status;
1112}
1113
1114/*******************************************************************************
1115**
1116** Function         NFC_Deactivate
1117**
1118** Description      This function is called to stop the discovery process or
1119**                  put the listen device in sleep mode or terminate the NFC link.
1120**
1121**                  The response from NFCC is reported by tNFC_DISCOVER_CBACK
1122**                  as NFC_DEACTIVATE_DEVT.
1123**
1124** Parameters       deactivate_type - NFC_DEACTIVATE_TYPE_IDLE, to IDLE mode.
1125**                                    NFC_DEACTIVATE_TYPE_SLEEP to SLEEP mode.
1126**                                    NFC_DEACTIVATE_TYPE_SLEEP_AF to SLEEP_AF mode.
1127**
1128** Returns          tNFC_STATUS
1129**
1130*******************************************************************************/
1131tNFC_STATUS NFC_Deactivate (tNFC_DEACT_TYPE deactivate_type)
1132{
1133    tNFC_CONN_CB * p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID];
1134    tNFC_STATUS  status = NFC_STATUS_OK;
1135
1136#if (BT_TRACE_VERBOSE == TRUE)
1137    NFC_TRACE_API3 ("NFC_Deactivate %d (%s) deactivate_type:%d", nfc_cb.nfc_state, nfc_state_name (nfc_cb.nfc_state), deactivate_type);
1138#else
1139    NFC_TRACE_API2 ("NFC_Deactivate %d deactivate_type:%d", nfc_cb.nfc_state, deactivate_type);
1140#endif
1141
1142    if (nfc_cb.flags & NFC_FL_DISCOVER_PENDING)
1143    {
1144        /* the HAL pre-discover is still active - clear the pending flag */
1145        nfc_cb.flags &= ~NFC_FL_DISCOVER_PENDING;
1146        GKI_freebuf (nfc_cb.p_disc_pending);
1147        nfc_cb.p_disc_pending = NULL;
1148        return NFC_STATUS_OK;
1149    }
1150
1151    if (nfc_cb.nfc_state == NFC_STATE_OPEN)
1152    {
1153        nfc_set_state (NFC_STATE_CLOSING);
1154        NFC_TRACE_DEBUG3 ( "act_protocol %d credits:%d/%d", p_cb->act_protocol, p_cb->init_credits, p_cb->num_buff);
1155        if ((p_cb->act_protocol == NCI_PROTOCOL_NFC_DEP) &&
1156            (p_cb->init_credits != p_cb->num_buff))
1157        {
1158            nfc_cb.flags           |= NFC_FL_DEACTIVATING;
1159            nfc_cb.deactivate_timer.param = (TIMER_PARAM_TYPE) deactivate_type;
1160            nfc_start_timer (&nfc_cb.deactivate_timer , (UINT16) (NFC_TTYPE_WAIT_2_DEACTIVATE), NFC_DEACTIVATE_TIMEOUT);
1161            return status;
1162        }
1163    }
1164
1165    status = nci_snd_deactivate_cmd (deactivate_type);
1166    return status;
1167}
1168
1169/*******************************************************************************
1170**
1171** Function         NFC_UpdateRFCommParams
1172**
1173** Description      This function is called to update RF Communication parameters
1174**                  once the Frame RF Interface has been activated.
1175**
1176**                  The response from NFCC is reported by tNFC_RESPONSE_CBACK
1177**                  as NFC_RF_COMM_PARAMS_UPDATE_REVT.
1178**
1179** Returns          tNFC_STATUS
1180**
1181*******************************************************************************/
1182tNFC_STATUS NFC_UpdateRFCommParams (tNFC_RF_COMM_PARAMS *p_params)
1183{
1184    UINT8 tlvs[12];
1185    UINT8 *p = tlvs;
1186    UINT8 data_exch_config;
1187
1188    /* RF Technology and Mode */
1189    if (p_params->include_rf_tech_mode)
1190    {
1191        UINT8_TO_STREAM (p, NCI_RF_PARAM_ID_TECH_N_MODE);
1192        UINT8_TO_STREAM (p, 1);
1193        UINT8_TO_STREAM (p, p_params->rf_tech_n_mode);
1194    }
1195
1196    /* Transmit Bit Rate */
1197    if (p_params->include_tx_bit_rate)
1198    {
1199        UINT8_TO_STREAM (p, NCI_RF_PARAM_ID_TX_BIT_RATE);
1200        UINT8_TO_STREAM (p, 1);
1201        UINT8_TO_STREAM (p, p_params->tx_bit_rate);
1202    }
1203
1204    /* Receive Bit Rate */
1205    if (p_params->include_tx_bit_rate)
1206    {
1207        UINT8_TO_STREAM (p, NCI_RF_PARAM_ID_RX_BIT_RATE);
1208        UINT8_TO_STREAM (p, 1);
1209        UINT8_TO_STREAM (p, p_params->rx_bit_rate);
1210    }
1211
1212    /* NFC-B Data Exchange Configuration */
1213    if (p_params->include_nfc_b_config)
1214    {
1215        UINT8_TO_STREAM (p, NCI_RF_PARAM_ID_B_DATA_EX_PARAM);
1216        UINT8_TO_STREAM (p, 1);
1217
1218        data_exch_config =  (p_params->min_tr0 & 0x03) << 6;          /* b7b6 : Mininum TR0 */
1219        data_exch_config |= (p_params->min_tr1 & 0x03) << 4;          /* b5b4 : Mininum TR1 */
1220        data_exch_config |= (p_params->suppression_eos & 0x01) << 3;  /* b3 :   Suppression of EoS */
1221        data_exch_config |= (p_params->suppression_sos & 0x01) << 2;  /* b2 :   Suppression of SoS */
1222        data_exch_config |= (p_params->min_tr2 & 0x03);               /* b1b0 : Mininum TR2 */
1223
1224        UINT8_TO_STREAM (p, data_exch_config);
1225    }
1226
1227    return nci_snd_parameter_update_cmd (tlvs, (UINT8) (p - tlvs));
1228}
1229
1230/*******************************************************************************
1231**
1232** Function         NFC_SetPowerOffSleep
1233**
1234** Description      This function closes/opens transport and turns off/on NFCC.
1235**
1236** Returns          tNFC_STATUS
1237**
1238*******************************************************************************/
1239tNFC_STATUS NFC_SetPowerOffSleep (BOOLEAN enable)
1240{
1241    NFC_TRACE_API1 ("NFC_SetPowerOffSleep () enable = %d", enable);
1242
1243    if (  (enable == FALSE)
1244        &&(nfc_cb.nfc_state == NFC_STATE_NFCC_POWER_OFF_SLEEP)  )
1245    {
1246        nfc_cb.flags |= NFC_FL_RESTARTING;
1247
1248        /* open transport */
1249        nfc_set_state (NFC_STATE_W4_HAL_OPEN);
1250        nfc_cb.p_hal->open (nfc_main_hal_cback, nfc_main_hal_data_cback);
1251
1252        return NFC_STATUS_OK;
1253    }
1254    else if (  (enable == TRUE)
1255             &&(nfc_cb.nfc_state == NFC_STATE_IDLE)  )
1256    {
1257        /* close transport to turn off NFCC and clean up */
1258        nfc_cb.flags |= NFC_FL_POWER_OFF_SLEEP;
1259        nfc_task_shutdown_nfcc ();
1260
1261        return NFC_STATUS_OK;
1262    }
1263
1264    NFC_TRACE_ERROR1 ("NFC_SetPowerOffSleep () invalid state = %d", nfc_cb.nfc_state);
1265    return NFC_STATUS_FAILED;
1266}
1267
1268/*******************************************************************************
1269**
1270** Function         NFC_PowerCycleNFCC
1271**
1272** Description      This function turns off and then on NFCC.
1273**
1274** Returns          tNFC_STATUS
1275**
1276*******************************************************************************/
1277tNFC_STATUS NFC_PowerCycleNFCC (void)
1278{
1279    NFC_TRACE_API0 ("NFC_PowerCycleNFCC ()");
1280
1281    if (nfc_cb.nfc_state == NFC_STATE_IDLE)
1282    {
1283        /* power cycle NFCC */
1284        nfc_cb.flags |= NFC_FL_POWER_CYCLE_NFCC;
1285        nfc_task_shutdown_nfcc ();
1286
1287        return NFC_STATUS_OK;
1288    }
1289
1290    NFC_TRACE_ERROR1 ("NFC_PowerCycleNFCC () invalid state = %d", nfc_cb.nfc_state);
1291    return NFC_STATUS_FAILED;
1292}
1293
1294
1295/*******************************************************************************
1296**
1297** Function         NFC_SetTraceLevel
1298**
1299** Description      This function sets the trace level for NFC.  If called with
1300**                  a value of 0xFF, it simply returns the current trace level.
1301**
1302** Returns          The new or current trace level
1303**
1304*******************************************************************************/
1305UINT8 NFC_SetTraceLevel (UINT8 new_level)
1306{
1307    NFC_TRACE_API1 ("NFC_SetTraceLevel () new_level = %d", new_level);
1308
1309    if (new_level != 0xFF)
1310        nfc_cb.trace_level = new_level;
1311
1312    return (nfc_cb.trace_level);
1313}
1314
1315
1316#endif /* NFC_INCLUDED == TRUE */
1317