Home | History | Annotate | Download | only in nfc
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2010-2012 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 #include "gki.h"
     28 #include "nfc_target.h"
     29 #include "bt_types.h"
     30 #include "hcidefs.h"
     31 
     32 #if (NFC_INCLUDED == TRUE)
     33 #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
     60 tNFC_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 
     69 static 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 *******************************************************************************/
    101 static 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 *******************************************************************************/
    139 static 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 *******************************************************************************/
    177 static 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 *******************************************************************************/
    211 void 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 *******************************************************************************/
    296 void 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 *******************************************************************************/
    313 void 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 *******************************************************************************/
    349 void 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 *******************************************************************************/
    501 void 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 *******************************************************************************/
    529 void 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 *******************************************************************************/
    560 static 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 *******************************************************************************/
    614 static 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 *******************************************************************************/
    665 tNFC_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 *******************************************************************************/
    698 void 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 *******************************************************************************/
    726 void 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 *******************************************************************************/
    765 UINT16 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 *******************************************************************************/
    789 tNFC_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 *******************************************************************************/
    809 tNFC_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 *******************************************************************************/
    830 tNFC_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 *******************************************************************************/
    889 tNFC_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 *******************************************************************************/
    940 tNFC_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 *******************************************************************************/
    962 tNFC_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 *******************************************************************************/
   1020 tNFC_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 *******************************************************************************/
   1044 void 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 *******************************************************************************/
   1069 tNFC_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 *******************************************************************************/
   1098 tNFC_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 *******************************************************************************/
   1131 tNFC_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 *******************************************************************************/
   1182 tNFC_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 *******************************************************************************/
   1239 tNFC_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 *******************************************************************************/
   1277 tNFC_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 *******************************************************************************/
   1305 UINT8 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