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 26 #include <android-base/stringprintf.h> 27 #include <base/logging.h> 28 29 #include "nfa_dm_int.h" 30 #include "nfa_rw_api.h" 31 #include "nfa_rw_int.h" 32 33 using android::base::StringPrintf; 34 35 extern bool nfc_debug_enabled; 36 37 /* NFA_RW control block */ 38 tNFA_RW_CB nfa_rw_cb; 39 40 /***************************************************************************** 41 ** Constants and types 42 *****************************************************************************/ 43 static const tNFA_SYS_REG nfa_rw_sys_reg = {NULL, nfa_rw_handle_event, 44 nfa_rw_sys_disable, NULL}; 45 46 /* NFA_RW actions */ 47 const tNFA_RW_ACTION nfa_rw_action_tbl[] = { 48 nfa_rw_handle_op_req, /* NFA_RW_OP_REQUEST_EVT */ 49 nfa_rw_activate_ntf, /* NFA_RW_ACTIVATE_NTF_EVT */ 50 nfa_rw_deactivate_ntf, /* NFA_RW_DEACTIVATE_NTF_EVT */ 51 nfa_rw_presence_check_tick, /* NFA_RW_PRESENCE_CHECK_TICK_EVT */ 52 nfa_rw_presence_check_timeout /* NFA_RW_PRESENCE_CHECK_TIMEOUT_EVT*/ 53 }; 54 55 /***************************************************************************** 56 ** Local function prototypes 57 *****************************************************************************/ 58 static std::string nfa_rw_evt_2_str(uint16_t event); 59 60 /******************************************************************************* 61 ** 62 ** Function nfa_rw_init 63 ** 64 ** Description Initialize NFA RW 65 ** 66 ** Returns None 67 ** 68 *******************************************************************************/ 69 void nfa_rw_init(void) { 70 DLOG_IF(INFO, nfc_debug_enabled) << __func__; 71 72 /* initialize control block */ 73 memset(&nfa_rw_cb, 0, sizeof(tNFA_RW_CB)); 74 75 /* register message handler on NFA SYS */ 76 nfa_sys_register(NFA_ID_RW, &nfa_rw_sys_reg); 77 } 78 79 /******************************************************************************* 80 ** 81 ** Function nfa_rw_sys_disable 82 ** 83 ** Description Clean up rw sub-system 84 ** 85 ** 86 ** Returns void 87 ** 88 *******************************************************************************/ 89 void nfa_rw_sys_disable(void) { 90 /* Return to idle */ 91 NFC_SetStaticRfCback(NULL); 92 93 /* Stop presence check timer (if started) */ 94 nfa_rw_stop_presence_check_timer(); 95 96 /* Free scratch buffer if any */ 97 nfa_rw_free_ndef_rx_buf(); 98 99 /* Free pending command if any */ 100 if (nfa_rw_cb.p_pending_msg) { 101 GKI_freebuf(nfa_rw_cb.p_pending_msg); 102 nfa_rw_cb.p_pending_msg = NULL; 103 } 104 105 nfa_sys_deregister(NFA_ID_RW); 106 } 107 108 /******************************************************************************* 109 ** 110 ** Function nfa_rw_proc_disc_evt 111 ** 112 ** Description Called by nfa_dm to handle ACTIVATED/DEACTIVATED events 113 ** 114 ** Returns void 115 ** 116 *******************************************************************************/ 117 void nfa_rw_proc_disc_evt(tNFA_DM_RF_DISC_EVT event, tNFC_DISCOVER* p_data, 118 bool excl_rf_not_active) { 119 tNFA_RW_MSG msg; 120 121 switch (event) { 122 case NFA_DM_RF_DISC_ACTIVATED_EVT: 123 msg.hdr.event = NFA_RW_ACTIVATE_NTF_EVT; 124 msg.activate_ntf.p_activate_params = &p_data->activate; 125 msg.activate_ntf.excl_rf_not_active = excl_rf_not_active; 126 127 nfa_rw_handle_event((NFC_HDR*)&msg); 128 break; 129 130 case NFA_DM_RF_DISC_DEACTIVATED_EVT: 131 msg.hdr.event = NFA_RW_DEACTIVATE_NTF_EVT; 132 133 nfa_rw_handle_event((NFC_HDR*)&msg); 134 break; 135 136 default: 137 break; 138 } 139 } 140 141 /******************************************************************************* 142 ** 143 ** Function nfa_rw_send_raw_frame 144 ** 145 ** Description Called by nfa_dm to send raw frame 146 ** 147 ** Returns tNFA_STATUS 148 ** 149 *******************************************************************************/ 150 tNFA_STATUS nfa_rw_send_raw_frame(NFC_HDR* p_data) { 151 tNFA_RW_MSG* p_msg; 152 153 p_msg = (tNFA_RW_MSG*)GKI_getbuf((uint16_t)sizeof(tNFA_RW_MSG)); 154 if (p_msg != NULL) { 155 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 156 p_msg->op_req.op = NFA_RW_OP_SEND_RAW_FRAME; 157 158 p_msg->op_req.params.send_raw_frame.p_data = p_data; 159 160 if (nfa_rw_handle_event((NFC_HDR*)p_msg)) GKI_freebuf(p_msg); 161 162 return (NFA_STATUS_OK); 163 } 164 return NFA_STATUS_FAILED; 165 } 166 167 /******************************************************************************* 168 ** 169 ** Function nfa_rw_handle_event 170 ** 171 ** Description nfa rw main event handling function. 172 ** 173 ** Returns TRUE if caller should free p_msg buffer 174 ** 175 *******************************************************************************/ 176 bool nfa_rw_handle_event(NFC_HDR* p_msg) { 177 uint16_t act_idx; 178 179 DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf( 180 "nfa_rw_handle_event event: %s (0x%02x), flags: %08x", 181 nfa_rw_evt_2_str(p_msg->event).c_str(), p_msg->event, nfa_rw_cb.flags); 182 183 /* Get NFA_RW sub-event */ 184 act_idx = (p_msg->event & 0x00FF); 185 if (act_idx < (NFA_RW_MAX_EVT & 0xFF)) { 186 return (*nfa_rw_action_tbl[act_idx])((tNFA_RW_MSG*)p_msg); 187 } else { 188 LOG(ERROR) << StringPrintf("nfa_rw_handle_event: unhandled event 0x%02X", 189 p_msg->event); 190 return true; 191 } 192 } 193 194 /******************************************************************************* 195 ** 196 ** Function nfa_rw_evt_2_str 197 ** 198 ** Description convert nfa_rw evt to string 199 ** 200 *******************************************************************************/ 201 static std::string nfa_rw_evt_2_str(uint16_t event) { 202 switch (event) { 203 case NFA_RW_OP_REQUEST_EVT: 204 return "NFA_RW_OP_REQUEST_EVT"; 205 case NFA_RW_ACTIVATE_NTF_EVT: 206 return "NFA_RW_ACTIVATE_NTF_EVT"; 207 case NFA_RW_DEACTIVATE_NTF_EVT: 208 return "NFA_RW_DEACTIVATE_NTF_EVT"; 209 case NFA_RW_PRESENCE_CHECK_TICK_EVT: 210 return "NFA_RW_PRESENCE_CHECK_TICK_EVT"; 211 case NFA_RW_PRESENCE_CHECK_TIMEOUT_EVT: 212 return "NFA_RW_PRESENCE_CHECK_TIMEOUT_EVT"; 213 default: 214 return "Unknown"; 215 } 216 } 217