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