Home | History | Annotate | Download | only in rw
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2003-2014 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  This is the main implementation file for the NFA_RW
     22  *
     23  ******************************************************************************/
     24 #include <string.h>
     25 #include "nfa_dm_int.h"
     26 #include "nfa_rw_api.h"
     27 #include "nfa_rw_int.h"
     28 #include "nfa_sys.h"
     29 #include "nfa_sys_int.h"
     30 
     31 /* NFA_RW control block */
     32 tNFA_RW_CB nfa_rw_cb;
     33 
     34 /*****************************************************************************
     35 ** Constants and types
     36 *****************************************************************************/
     37 static const tNFA_SYS_REG nfa_rw_sys_reg = {NULL, nfa_rw_handle_event,
     38                                             nfa_rw_sys_disable, NULL};
     39 
     40 /* NFA_RW actions */
     41 const tNFA_RW_ACTION nfa_rw_action_tbl[] = {
     42     nfa_rw_handle_op_req,         /* NFA_RW_OP_REQUEST_EVT            */
     43     nfa_rw_activate_ntf,          /* NFA_RW_ACTIVATE_NTF_EVT          */
     44     nfa_rw_deactivate_ntf,        /* NFA_RW_DEACTIVATE_NTF_EVT        */
     45     nfa_rw_presence_check_tick,   /* NFA_RW_PRESENCE_CHECK_TICK_EVT   */
     46     nfa_rw_presence_check_timeout /* NFA_RW_PRESENCE_CHECK_TIMEOUT_EVT*/
     47 };
     48 
     49 /*****************************************************************************
     50 ** Local function prototypes
     51 *****************************************************************************/
     52 #if (BT_TRACE_VERBOSE == TRUE)
     53 static char* nfa_rw_evt_2_str(uint16_t event);
     54 #endif
     55 
     56 /*******************************************************************************
     57 **
     58 ** Function         nfa_rw_init
     59 **
     60 ** Description      Initialize NFA RW
     61 **
     62 ** Returns          None
     63 **
     64 *******************************************************************************/
     65 void nfa_rw_init(void) {
     66   NFA_TRACE_DEBUG0("nfa_rw_init ()");
     67 
     68   /* initialize control block */
     69   memset(&nfa_rw_cb, 0, sizeof(tNFA_RW_CB));
     70 
     71   /* register message handler on NFA SYS */
     72   nfa_sys_register(NFA_ID_RW, &nfa_rw_sys_reg);
     73 }
     74 
     75 /*******************************************************************************
     76 **
     77 ** Function         nfa_rw_sys_disable
     78 **
     79 ** Description      Clean up rw sub-system
     80 **
     81 **
     82 ** Returns          void
     83 **
     84 *******************************************************************************/
     85 void nfa_rw_sys_disable(void) {
     86   /* Return to idle */
     87   NFC_SetStaticRfCback(NULL);
     88 
     89   /* Stop presence check timer (if started) */
     90   nfa_rw_stop_presence_check_timer();
     91 
     92   /* Free scratch buffer if any */
     93   nfa_rw_free_ndef_rx_buf();
     94 
     95   /* Free pending command if any */
     96   if (nfa_rw_cb.p_pending_msg) {
     97     GKI_freebuf(nfa_rw_cb.p_pending_msg);
     98     nfa_rw_cb.p_pending_msg = NULL;
     99   }
    100 
    101   nfa_sys_deregister(NFA_ID_RW);
    102 }
    103 
    104 /*******************************************************************************
    105 **
    106 ** Function         nfa_rw_proc_disc_evt
    107 **
    108 ** Description      Called by nfa_dm to handle ACTIVATED/DEACTIVATED  events
    109 **
    110 ** Returns          void
    111 **
    112 *******************************************************************************/
    113 void nfa_rw_proc_disc_evt(tNFA_DM_RF_DISC_EVT event, tNFC_DISCOVER* p_data,
    114                           bool excl_rf_not_active) {
    115   tNFA_RW_MSG msg;
    116 
    117   switch (event) {
    118     case NFA_DM_RF_DISC_ACTIVATED_EVT:
    119       msg.hdr.event = NFA_RW_ACTIVATE_NTF_EVT;
    120       msg.activate_ntf.p_activate_params = &p_data->activate;
    121       msg.activate_ntf.excl_rf_not_active = excl_rf_not_active;
    122 
    123       nfa_rw_handle_event((NFC_HDR*)&msg);
    124       break;
    125 
    126     case NFA_DM_RF_DISC_DEACTIVATED_EVT:
    127       msg.hdr.event = NFA_RW_DEACTIVATE_NTF_EVT;
    128 
    129       nfa_rw_handle_event((NFC_HDR*)&msg);
    130       break;
    131 
    132     default:
    133       break;
    134   }
    135 }
    136 
    137 /*******************************************************************************
    138 **
    139 ** Function         nfa_rw_send_raw_frame
    140 **
    141 ** Description      Called by nfa_dm to send raw frame
    142 **
    143 ** Returns          tNFA_STATUS
    144 **
    145 *******************************************************************************/
    146 tNFA_STATUS nfa_rw_send_raw_frame(NFC_HDR* p_data) {
    147   tNFA_RW_MSG* p_msg;
    148 
    149   p_msg = (tNFA_RW_MSG*)GKI_getbuf((uint16_t)sizeof(tNFA_RW_MSG));
    150   if (p_msg != NULL) {
    151     p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    152     p_msg->op_req.op = NFA_RW_OP_SEND_RAW_FRAME;
    153 
    154     p_msg->op_req.params.send_raw_frame.p_data = p_data;
    155 
    156     if (nfa_rw_handle_event((NFC_HDR*)p_msg)) GKI_freebuf(p_msg);
    157 
    158     return (NFA_STATUS_OK);
    159   }
    160   return NFA_STATUS_FAILED;
    161 }
    162 
    163 /*******************************************************************************
    164 **
    165 ** Function         nfa_rw_handle_event
    166 **
    167 ** Description      nfa rw main event handling function.
    168 **
    169 ** Returns          TRUE if caller should free p_msg buffer
    170 **
    171 *******************************************************************************/
    172 bool nfa_rw_handle_event(NFC_HDR* p_msg) {
    173   uint16_t act_idx;
    174 
    175 #if (BT_TRACE_VERBOSE == TRUE)
    176   NFA_TRACE_EVENT3("nfa_rw_handle_event event: %s (0x%02x), flags: %08x",
    177                    nfa_rw_evt_2_str(p_msg->event), p_msg->event,
    178                    nfa_rw_cb.flags);
    179 #else
    180   NFA_TRACE_EVENT2("nfa_rw_handle_event event: 0x%x, flags: %08x", p_msg->event,
    181                    nfa_rw_cb.flags);
    182 #endif
    183 
    184   /* Get NFA_RW sub-event */
    185   act_idx = (p_msg->event & 0x00FF);
    186   if (act_idx < (NFA_RW_MAX_EVT & 0xFF)) {
    187     return (*nfa_rw_action_tbl[act_idx])((tNFA_RW_MSG*)p_msg);
    188   } else {
    189     NFA_TRACE_ERROR1("nfa_rw_handle_event: unhandled event 0x%02X",
    190                      p_msg->event);
    191     return true;
    192   }
    193 }
    194 
    195 #if (BT_TRACE_VERBOSE == TRUE)
    196 /*******************************************************************************
    197 **
    198 ** Function         nfa_rw_evt_2_str
    199 **
    200 ** Description      convert nfa_rw evt to string
    201 **
    202 *******************************************************************************/
    203 static char* nfa_rw_evt_2_str(uint16_t event) {
    204   switch (event) {
    205     case NFA_RW_OP_REQUEST_EVT:
    206       return "NFA_RW_OP_REQUEST_EVT";
    207 
    208     case NFA_RW_ACTIVATE_NTF_EVT:
    209       return "NFA_RW_ACTIVATE_NTF_EVT";
    210 
    211     case NFA_RW_DEACTIVATE_NTF_EVT:
    212       return "NFA_RW_DEACTIVATE_NTF_EVT";
    213 
    214     case NFA_RW_PRESENCE_CHECK_TICK_EVT:
    215       return "NFA_RW_PRESENCE_CHECK_TICK_EVT";
    216 
    217     case NFA_RW_PRESENCE_CHECK_TIMEOUT_EVT:
    218       return "NFA_RW_PRESENCE_CHECK_TIMEOUT_EVT";
    219 
    220     default:
    221       return "Unknown";
    222   }
    223 }
    224 #endif /* BT_TRACE_VERBOSE */
    225