1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu * Copyright (C) 2011-2014 Broadcom Corporation 4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * you may not use this file except in compliance with the License. 7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * You may obtain a copy of the License at: 8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * See the License for the specific language governing permissions and 15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * limitations under the License. 16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * This file contains the action functions the NFA_CE state machine. 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h> 26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_ce_int.h" 27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_dm_int.h" 28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_sys_int.h" 29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_mem_co.h" 30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "ndef_utils.h" 31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "ce_api.h" 32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE) 33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_ee_int.h" 34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project* Protocol-specific event handlers 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_handle_t3t_evt 43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handler for Type-3 tag card emulation events 45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_ce_handle_t3t_evt (tCE_EVENT event, tCE_DATA *p_ce_data) 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CE_CB *p_cb = &nfa_ce_cb; 52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CONN_EVT_DATA conn_evt; 53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_DEBUG1 ("nfa_ce_handle_t3t_evt: event 0x%x", event); 55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (event) 57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case CE_T3T_NDEF_UPDATE_START_EVT: 59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Notify app using callback associated with the active ndef */ 60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->idx_cur_active == NFA_CE_LISTEN_INFO_IDX_NDEF) 61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.status = NFA_STATUS_OK; 63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cb->p_active_conn_cback) (NFA_CE_NDEF_WRITE_START_EVT, &conn_evt); 64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_ERROR0 ("nfa_ce_handle_t3t_evt: got CE_T3T_UPDATE_START_EVT, but no active NDEF"); 68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case CE_T3T_NDEF_UPDATE_CPLT_EVT: 72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Notify app using callback associated with the active ndef */ 73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->idx_cur_active == NFA_CE_LISTEN_INFO_IDX_NDEF) 74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ndef_write_cplt.status = NFA_STATUS_OK; 76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ndef_write_cplt.len = p_ce_data->update_info.length; 77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ndef_write_cplt.p_data = p_ce_data->update_info.p_data; 78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cb->p_active_conn_cback) (NFA_CE_NDEF_WRITE_CPLT_EVT, &conn_evt); 79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_ERROR0 ("nfa_ce_handle_t3t_evt: got CE_T3T_UPDATE_CPLT_EVT, but no active NDEF"); 83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case CE_T3T_RAW_FRAME_EVT: 87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->idx_cur_active == NFA_CE_LISTEN_INFO_IDX_NDEF) 88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 89a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu conn_evt.data.status = p_ce_data->raw_frame.status; 90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.data.p_data = (UINT8 *) (p_ce_data->raw_frame.p_data + 1) + p_ce_data->raw_frame.p_data->offset; 91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.data.len = p_ce_data->raw_frame.p_data->len; 92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cb->p_active_conn_cback) (NFA_DATA_EVT, &conn_evt); 93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 96a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu conn_evt.ce_data.status = p_ce_data->raw_frame.status; 97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ce_data.handle = (NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)p_cb->idx_cur_active)); 98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ce_data.p_data = (UINT8 *) (p_ce_data->raw_frame.p_data + 1) + p_ce_data->raw_frame.p_data->offset; 99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ce_data.len = p_ce_data->raw_frame.p_data->len; 100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cb->p_active_conn_cback) (NFA_CE_DATA_EVT, &conn_evt); 101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_ce_data->raw_frame.p_data); 103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_DEBUG1 ("nfa_ce_handle_t3t_evt unhandled event=0x%02x", event); 107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_handle_t4t_evt 114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handler for Type-4 tag card emulation events (for NDEF case) 116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_ce_handle_t4t_evt (tCE_EVENT event, tCE_DATA *p_ce_data) 121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CE_CB *p_cb = &nfa_ce_cb; 123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CONN_EVT_DATA conn_evt; 124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_DEBUG1 ("nfa_ce_handle_t4t_evt: event 0x%x", event); 126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* AID for NDEF selected. we had notified the app of activation. */ 128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->idx_cur_active = NFA_CE_LISTEN_INFO_IDX_NDEF; 129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[p_cb->idx_cur_active].flags & NFA_CE_LISTEN_INFO_T4T_ACTIVATE_PND) 130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->p_active_conn_cback = p_cb->listen_info[p_cb->idx_cur_active].p_conn_cback; 132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (event) 135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case CE_T4T_NDEF_UPDATE_START_EVT: 137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.status = NFA_STATUS_OK; 138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cb->p_active_conn_cback) (NFA_CE_NDEF_WRITE_START_EVT, &conn_evt); 139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case CE_T4T_NDEF_UPDATE_CPLT_EVT: 142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ndef_write_cplt.len = p_ce_data->update_info.length; 143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ndef_write_cplt.p_data = p_ce_data->update_info.p_data; 144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (NDEF_MsgValidate (p_ce_data->update_info.p_data, p_ce_data->update_info.length, TRUE) != NDEF_OK) 146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ndef_write_cplt.status = NFA_STATUS_FAILED; 147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ndef_write_cplt.status = NFA_STATUS_OK; 149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cb->p_active_conn_cback) (NFA_CE_NDEF_WRITE_CPLT_EVT, &conn_evt); 151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case CE_T4T_NDEF_UPDATE_ABORT_EVT: 154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ndef_write_cplt.len = 0; 155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ndef_write_cplt.status = NFA_STATUS_FAILED; 156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ndef_write_cplt.p_data = NULL; 157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cb->p_active_conn_cback) (NFA_CE_NDEF_WRITE_CPLT_EVT, &conn_evt); 158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* CE_T4T_RAW_FRAME_EVT is not used in NFA CE */ 162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_DEBUG1 ("nfa_ce_handle_t4t_evt unhandled event=0x%02x", event); 163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_handle_t4t_aid_evt 171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handler for Type-4 tag AID events (for AIDs registered using 173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_CeRegisterT4tAidOnDH) 174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_ce_handle_t4t_aid_evt (tCE_EVENT event, tCE_DATA *p_ce_data) 179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CE_CB *p_cb = &nfa_ce_cb; 181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 listen_info_idx; 182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CONN_EVT_DATA conn_evt; 183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_DEBUG1 ("nfa_ce_handle_t4t_aid_evt: event 0x%x", event); 185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Get listen_info for this aid callback */ 187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (listen_info_idx=0; listen_info_idx<NFA_CE_LISTEN_INFO_IDX_INVALID; listen_info_idx++) 188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_cb->listen_info[listen_info_idx].flags & NFA_CE_LISTEN_INFO_IN_USE) && 190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (p_cb->listen_info[listen_info_idx].flags & NFA_CE_LISTEN_INFO_T4T_AID) && 191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (p_cb->listen_info[listen_info_idx].t4t_aid_handle == p_ce_data->raw_frame.aid_handle)) 192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->idx_cur_active = listen_info_idx; 194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->p_active_conn_cback = p_cb->listen_info[p_cb->idx_cur_active].p_conn_cback; 195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (event == CE_T4T_RAW_FRAME_EVT) 200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (listen_info_idx != NFA_CE_LISTEN_INFO_IDX_INVALID) 202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Found listen_info entry */ 204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ce_activated.handle = NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE) p_cb->idx_cur_active); 205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If we have not notified the app of activation, do so now */ 207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[p_cb->idx_cur_active].flags & NFA_CE_LISTEN_INFO_T4T_ACTIVATE_PND) 208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[p_cb->idx_cur_active].flags &= ~NFA_CE_LISTEN_INFO_T4T_ACTIVATE_PND; 210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (&(conn_evt.ce_activated.activate_ntf), &p_cb->activation_params, sizeof (tNFC_ACTIVATE_DEVT)); 212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ce_activated.status = NFA_STATUS_OK; 213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cb->p_active_conn_cback) (NFA_CE_ACTIVATED_EVT, &conn_evt); 214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Notify app of AID data */ 217a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu conn_evt.ce_data.status = p_ce_data->raw_frame.status; 218a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu conn_evt.ce_data.handle = NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)p_cb->idx_cur_active); 219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ce_data.p_data = (UINT8 *) (p_ce_data->raw_frame.p_data + 1) + p_ce_data->raw_frame.p_data->offset; 220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ce_data.len = p_ce_data->raw_frame.p_data->len; 221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cb->p_active_conn_cback) (NFA_CE_DATA_EVT, &conn_evt); 222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_ERROR1 ("nfa_ce_handle_t4t_aid_evt: unable to find listen_info for aid hdl %i", p_ce_data->raw_frame.aid_handle) 226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_ce_data->raw_frame.p_data); 229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project* Discovery configuration and discovery event handlers 234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_discovery_cback 239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Processing event from discovery callback 241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns None 243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_ce_discovery_cback (tNFA_DM_RF_DISC_EVT event, tNFC_DISCOVER *p_data) 246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CE_MSG ce_msg; 248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_DEBUG1 ("nfa_ce_discovery_cback(): event:0x%02X", event); 249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (event) 251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFA_DM_RF_DISC_START_EVT: 253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_DEBUG1 ("nfa_ce_handle_disc_start (status=0x%x)", p_data->start); 254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFA_DM_RF_DISC_ACTIVATED_EVT: 257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_msg.activate_ntf.hdr.event = NFA_CE_ACTIVATE_NTF_EVT; 258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_msg.activate_ntf.p_activation_params = &p_data->activate; 259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_ce_hdl_event ((BT_HDR *) &ce_msg); 260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFA_DM_RF_DISC_DEACTIVATED_EVT: 2635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* DM broadcasts deactivaiton event in listen sleep state, so check before processing */ 2645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (nfa_ce_cb.flags & NFA_CE_FLAGS_LISTEN_ACTIVE_SLEEP) 2655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 2665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ce_msg.hdr.event = NFA_CE_DEACTIVATE_NTF_EVT; 2675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ce_msg.hdr.layer_specific = p_data->deactivate.type; 2685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfa_ce_hdl_event ((BT_HDR *) &ce_msg); 2695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_ERROR0 ("Unexpected event"); 274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_ce_t3t_set_listen_params 281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Set t3t listening parameters 283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_ce_t3t_set_listen_params (void) 288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 i; 290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CE_CB *p_cb = &nfa_ce_cb; 291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 tlv[32], *p_params; 292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 tlv_size; 293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 t3t_flags2_mask = 0xFFFF; /* Mask of which T3T_IDs are disabled */ 294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 t3t_idx = 0; 295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Point to start of tlv buffer */ 297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_params = tlv; 298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Set system code and NFCID2 */ 300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (i=0; i<NFA_CE_LISTEN_INFO_MAX; i++) 301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_IN_USE) && 303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (p_cb->listen_info[i].protocol_mask & NFA_PROTOCOL_MASK_T3T)) 304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Set tag's system code and NFCID2 */ 306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p_params, NFC_PMID_LF_T3T_ID1+t3t_idx); /* type */ 307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p_params, NCI_PARAM_LEN_LF_T3T_ID); /* length */ 308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p_params, p_cb->listen_info[i].t3t_system_code); /* System Code */ 309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY_TO_BE_STREAM (p_params, p_cb->listen_info[i].t3t_nfcid2, NCI_RF_F_UID_LEN); 310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Set mask for this ID */ 312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project t3t_flags2_mask &= ~((UINT16) (1<<t3t_idx)); 313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project t3t_idx++; 314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* For NCI draft 22+, the polarity of NFC_PMID_LF_T3T_FLAGS2 is flipped */ 318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project t3t_flags2_mask = ~t3t_flags2_mask; 319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p_params, NFC_PMID_LF_T3T_FLAGS2); /* type */ 321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p_params, NCI_PARAM_LEN_LF_T3T_FLAGS2); /* length */ 322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_STREAM (p_params, t3t_flags2_mask); /* Mask of IDs to disable listening */ 323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_size = (UINT8) (p_params-tlv); 325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_dm_check_set_config (tlv_size, (UINT8 *)tlv, FALSE); 326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_t3t_generate_rand_nfcid 331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Generate a random NFCID2 for Type-3 tag 333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_ce_t3t_generate_rand_nfcid (UINT8 nfcid2[NCI_RF_F_UID_LEN]) 338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 rand_seed = GKI_get_tick_count (); 340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* For Type-3 tag, nfcid2 starts witn 02:fe */ 342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfcid2[0] = 0x02; 343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfcid2[1] = 0xFE; 344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* The remaining 6 bytes are random */ 346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfcid2[2] = (UINT8) (rand_seed & 0xFF); 347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfcid2[3] = (UINT8) (rand_seed>>8 & 0xFF); 348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rand_seed>>=(rand_seed&3); 349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfcid2[4] = (UINT8) (rand_seed & 0xFF); 350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfcid2[5] = (UINT8) (rand_seed>>8 & 0xFF); 351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rand_seed>>=(rand_seed&3); 352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfcid2[6] = (UINT8) (rand_seed & 0xFF); 353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfcid2[7] = (UINT8) (rand_seed>>8 & 0xFF); 354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_start_listening 359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Start listening 361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFA_STATUS_OK if successful 363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFA_STATUS nfa_ce_start_listening (void) 366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_DM_DISC_TECH_PROTO_MASK listen_mask; 368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CE_CB *p_cb = &nfa_ce_cb; 369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_HANDLE disc_handle; 370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 listen_info_idx; 371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /*************************************************************************/ 373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Construct protocol preference list to listen for */ 374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* First, get protocol preference for active NDEF (if any) */ 376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags & NFA_CE_LISTEN_INFO_IN_USE) 377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle == NFA_HANDLE_INVALID)) 378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project listen_mask = 0; 380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].protocol_mask & NFA_PROTOCOL_MASK_T3T) 382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* set T3T config params */ 384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_ce_t3t_set_listen_params (); 385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project listen_mask |= NFA_DM_DISC_MASK_LF_T3T; 387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].protocol_mask & NFA_PROTOCOL_MASK_ISO_DEP) 390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project listen_mask |= nfa_ce_cb.isodep_disc_mask; 392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project disc_handle = nfa_dm_add_rf_discover (listen_mask, NFA_DM_DISC_HOST_ID_DH, nfa_ce_discovery_cback); 395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (disc_handle == NFA_HANDLE_INVALID) 397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFA_STATUS_FAILED); 398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle = disc_handle; 400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Next, add protocols from non-NDEF, if any */ 403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (listen_info_idx=0; listen_info_idx<NFA_CE_LISTEN_INFO_IDX_INVALID; listen_info_idx++) 404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* add RF discovery to DM only if it is not added yet */ 406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_cb->listen_info[listen_info_idx].flags & NFA_CE_LISTEN_INFO_IN_USE) 407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_cb->listen_info[listen_info_idx].rf_disc_handle == NFA_HANDLE_INVALID)) 408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[listen_info_idx].flags & NFA_CE_LISTEN_INFO_FELICA) 410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* set T3T config params */ 412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_ce_t3t_set_listen_params (); 413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project disc_handle = nfa_dm_add_rf_discover (NFA_DM_DISC_MASK_LF_T3T, 415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_DM_DISC_HOST_ID_DH, 416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_ce_discovery_cback); 417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (disc_handle == NFA_HANDLE_INVALID) 419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFA_STATUS_FAILED); 420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].rf_disc_handle = disc_handle; 422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cb->listen_info[listen_info_idx].flags & NFA_CE_LISTEN_INFO_T4T_AID) 424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project disc_handle = nfa_dm_add_rf_discover (nfa_ce_cb.isodep_disc_mask, 426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_DM_DISC_HOST_ID_DH, 427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_ce_discovery_cback); 428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (disc_handle == NFA_HANDLE_INVALID) 430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFA_STATUS_FAILED); 431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].rf_disc_handle = disc_handle; 433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE) 435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cb->listen_info[listen_info_idx].flags & NFA_CE_LISTEN_INFO_UICC) 436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project listen_mask = 0; 438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfa_ee_is_active (p_cb->listen_info[listen_info_idx].ee_handle)) 439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[listen_info_idx].tech_mask & NFA_TECHNOLOGY_MASK_A) 441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project listen_mask |= NFA_DM_DISC_MASK_LA_ISO_DEP; 443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[listen_info_idx].tech_mask & NFA_TECHNOLOGY_MASK_B) 445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project listen_mask |= NFA_DM_DISC_MASK_LB_ISO_DEP; 447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[listen_info_idx].tech_mask & NFA_TECHNOLOGY_MASK_F) 449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project listen_mask |= NFA_DM_DISC_MASK_LF_T3T; 451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[listen_info_idx].tech_mask & NFA_TECHNOLOGY_MASK_B_PRIME) 453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project listen_mask |= NFA_DM_DISC_MASK_L_B_PRIME; 455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (listen_mask) 459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Start listening for requested technologies */ 461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* register discovery callback to NFA DM */ 462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project disc_handle = nfa_dm_add_rf_discover (listen_mask, 463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (tNFA_DM_DISC_HOST_ID) (p_cb->listen_info[listen_info_idx].ee_handle &0x00FF), 464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_ce_discovery_cback); 465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (disc_handle == NFA_HANDLE_INVALID) 467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFA_STATUS_FAILED); 468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].rf_disc_handle = disc_handle; 471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].tech_proto_mask = listen_mask; 472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_ERROR1 ("UICC[0x%x] is not activated", 477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].ee_handle); 478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFA_STATUS_OK; 485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_restart_listen_check 490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Called on deactivation. Check if any active listen_info entries to listen for 492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if listening is restarted. 494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** FALSE if listening not restarted 495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN nfa_ce_restart_listen_check (void) 498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CE_CB *p_cb = &nfa_ce_cb; 500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 listen_info_idx; 501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if any active entries in listen_info table */ 503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (listen_info_idx=0; listen_info_idx<NFA_CE_LISTEN_INFO_MAX; listen_info_idx++) 504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[listen_info_idx].flags & NFA_CE_LISTEN_INFO_IN_USE) 506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Restart listening if there are any active listen_info entries */ 510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (listen_info_idx != NFA_CE_LISTEN_INFO_IDX_INVALID) 511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* restart listening */ 513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_ce_start_listening (); 514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* No active listen_info entries */ 518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_remove_listen_info_entry 527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Remove entry from listen_info table. (when API deregister is called or listen_start failed) 529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_ce_remove_listen_info_entry (UINT8 listen_info_idx, BOOLEAN notify_app) 535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CE_CB *p_cb = &nfa_ce_cb; 537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CONN_EVT_DATA conn_evt; 538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_DEBUG1 ("NFA_CE: removing listen_info entry %i", listen_info_idx); 540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Notify app that listening has stopped if requested (for API deregister) */ 542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* For LISTEN_START failures, app has already notified of NFA_LISTEN_START_EVT failure */ 543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (notify_app) 544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (listen_info_idx == NFA_CE_LISTEN_INFO_IDX_NDEF) 546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.status = NFA_STATUS_OK; 548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cb->listen_info[listen_info_idx].p_conn_cback) (NFA_CE_LOCAL_TAG_CONFIGURED_EVT, &conn_evt); 549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE) 551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cb->listen_info[listen_info_idx].flags & NFA_CE_LISTEN_INFO_UICC) 552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.status = NFA_STATUS_OK; 554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cb->listen_info[listen_info_idx].p_conn_cback) (NFA_CE_UICC_LISTEN_CONFIGURED_EVT, &conn_evt); 555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ce_deregistered.handle = NFA_HANDLE_GROUP_CE | listen_info_idx; 560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cb->listen_info[listen_info_idx].p_conn_cback) (NFA_CE_DEREGISTERED_EVT, &conn_evt); 561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Handle NDEF stopping */ 566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (listen_info_idx == NFA_CE_LISTEN_INFO_IDX_NDEF) 567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* clear NDEF contents */ 569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_T3tSetLocalNDEFMsg (TRUE, 0, 0, NULL, NULL); 570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_T4tSetLocalNDEFMsg (TRUE, 0, 0, NULL, NULL); 571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[listen_info_idx].protocol_mask & NFA_PROTOCOL_MASK_T3T) 573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].protocol_mask = 0; 575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* clear T3T Flags for NDEF */ 577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_ce_t3t_set_listen_params (); 578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Free scratch buffer for this NDEF, if one was allocated */ 581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_ce_free_scratch_buf (); 582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If stopping listening Felica system code, then clear T3T Flags for this */ 584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cb->listen_info[listen_info_idx].flags & NFA_CE_LISTEN_INFO_FELICA) 585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].protocol_mask = 0; 587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* clear T3T Flags for registered Felica system code */ 589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_ce_t3t_set_listen_params (); 590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If stopping listening T4T AID, then deregister this AID from CE_T4T */ 592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cb->listen_info[listen_info_idx].flags & NFA_CE_LISTEN_INFO_T4T_AID) 593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Free t4t_aid_cback used by this AID */ 595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_T4tDeregisterAID (p_cb->listen_info[listen_info_idx].t4t_aid_handle); 596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[listen_info_idx].rf_disc_handle != NFA_HANDLE_INVALID ) 599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_dm_delete_rf_discover (p_cb->listen_info[listen_info_idx].rf_disc_handle); 601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].rf_disc_handle = NFA_HANDLE_INVALID; 602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Remove entry from listen_info table */ 605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].flags = 0; 606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_free_scratch_buf 611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description free scratch buffer (if one is allocated) 613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns nothing 615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_ce_free_scratch_buf (void) 618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CE_CB *p_cb = &nfa_ce_cb; 620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->p_scratch_buf) 621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_mem_co_free (p_cb->p_scratch_buf); 623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->p_scratch_buf = NULL; 624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_realloc_scratch_buffer 630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Set scratch buffer if necessary (for writable NDEF messages) 632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFA_STATUS_OK if successful 634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFA_STATUS nfa_ce_realloc_scratch_buffer (void) 637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_STATUS result = NFA_STATUS_OK; 639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If current NDEF message is read-only, then we do not need a scratch buffer */ 641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfa_ce_cb.listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags & NFC_CE_LISTEN_INFO_READONLY_NDEF) 642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Free existing scratch buffer, if one was allocated */ 644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_ce_free_scratch_buf (); 645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If no scratch buffer allocated yet, or if current scratch buffer size is different from current ndef size, */ 649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* then allocate a new scratch buffer. */ 650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((nfa_ce_cb.p_scratch_buf == NULL) || 651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (nfa_ce_cb.scratch_buf_size != nfa_ce_cb.ndef_max_size)) 652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Free existing scratch buffer, if one was allocated */ 654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_ce_free_scratch_buf (); 655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((nfa_ce_cb.p_scratch_buf = (UINT8 *) nfa_mem_co_alloc (nfa_ce_cb.ndef_max_size)) != NULL) 657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_ce_cb.scratch_buf_size = nfa_ce_cb.ndef_max_size; 659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_ERROR1 ("Unable to allocate scratch buffer for writable NDEF message (%i bytes)", nfa_ce_cb.ndef_max_size); 663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project result=NFA_STATUS_FAILED; 664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (result); 669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_set_content 674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Set NDEF contents 676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS nfa_ce_set_content (void) 681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status; 683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CE_CB *p_cb = &nfa_ce_cb; 684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_PROTOCOL_MASK ndef_protocol_mask; 685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BOOLEAN readonly; 686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if listening for NDEF */ 688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!(p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags & NFA_CE_LISTEN_INFO_IN_USE)) 689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Not listening for NDEF */ 691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFA_STATUS_OK); 692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_DEBUG0 ("Setting NDEF contents"); 695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project readonly = (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags & NFC_CE_LISTEN_INFO_READONLY_NDEF) ? TRUE : FALSE; 697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_protocol_mask = p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].protocol_mask; 698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Allocate a scratch buffer if needed (for handling write-requests) */ 700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((status = nfa_ce_realloc_scratch_buffer ()) == NFA_STATUS_OK) 701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((ndef_protocol_mask & NFA_PROTOCOL_MASK_T3T) && (status == NFA_STATUS_OK)) 703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Type3Tag - NFC-F */ 705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = CE_T3tSetLocalNDEFMsg (readonly, 706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_max_size, 707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_cur_size, 708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->p_ndef_data, 709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->p_scratch_buf); 710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((ndef_protocol_mask & NFA_PROTOCOL_MASK_ISO_DEP) && (status == NFA_STATUS_OK)) 713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* ISODEP/4A,4B- NFC-A or NFC-B */ 715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = CE_T4tSetLocalNDEFMsg (readonly, 716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_max_size, 717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_cur_size, 718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->p_ndef_data, 719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->p_scratch_buf); 720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status != NFA_STATUS_OK) 724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* clear NDEF contents */ 726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_T3tSetLocalNDEFMsg (TRUE, 0, 0, NULL, NULL); 727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_T4tSetLocalNDEFMsg (TRUE, 0, 0, NULL, NULL); 728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_ERROR1 ("Unable to set contents (error %02x)", status); 730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (status); 733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_activate_ntf 739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Action when activation has occured (NFA_CE_ACTIVATE_NTF_EVT) 741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - Find the listen_info entry assocated with this activation 743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - get the app callback that registered for this listen 744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - call CE_SetActivatedTagType with activation parameters 745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE (message buffer to be freed by caller) 747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN nfa_ce_activate_ntf (tNFA_CE_MSG *p_ce_msg) 750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_ACTIVATE_DEVT *p_activation_params = p_ce_msg->activate_ntf.p_activation_params; 752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CE_CB *p_cb = &nfa_ce_cb; 753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CONN_EVT_DATA conn_evt; 754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tCE_CBACK *p_ce_cback = NULL; 755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 t3t_system_code = 0xFFFF; 756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 listen_info_idx = NFA_CE_LISTEN_INFO_IDX_INVALID; 757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_nfcid2 = NULL; 758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 i; 759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BOOLEAN t4t_activate_pending = FALSE; 760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_DEBUG1 ("nfa_ce_activate_ntf () protocol=%d", p_ce_msg->activate_ntf.p_activation_params->protocol); 762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Tag is in listen active state */ 764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags |= NFA_CE_FLAGS_LISTEN_ACTIVE_SLEEP; 765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Store activation parameters */ 767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (&p_cb->activation_params, p_activation_params, sizeof (tNFC_ACTIVATE_DEVT)); 768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Find the listen_info entry corresponding to this activation */ 770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->activation_params.protocol == NFA_PROTOCOL_T3T) 771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Look for T3T entries in listen_info table that match activated system code and NFCID2 */ 773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (listen_info_idx=0; listen_info_idx<NFA_CE_LISTEN_INFO_IDX_INVALID; listen_info_idx++) 774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Look for entries with NFA_PROTOCOL_MASK_T3T */ 776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[listen_info_idx].flags & NFA_CE_LISTEN_INFO_IN_USE) 777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[listen_info_idx].protocol_mask & NFA_PROTOCOL_MASK_T3T) 779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if system_code and nfcid2 that matches activation params */ 781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_nfcid2 = p_cb->listen_info[listen_info_idx].t3t_nfcid2; 782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project t3t_system_code = p_cb->listen_info[listen_info_idx].t3t_system_code; 783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Compare NFCID2 (note: NFCC currently does not return system code in activation parameters) */ 785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((memcmp (p_nfcid2, p_cb->activation_params.rf_tech_param.param.lf.nfcid2, NCI_RF_F_UID_LEN)==0) 786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* && (t3t_system_code == p_ce_msg->activation.p_activate_info->rf_tech_param.param.lf.system_code) */) 787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Found listen_info corresponding to this activation */ 789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if entry is for T3T UICC */ 794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_cb->listen_info[listen_info_idx].flags & NFA_CE_LISTEN_INFO_UICC) && 795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (p_cb->listen_info[listen_info_idx].tech_mask & NFA_TECHNOLOGY_MASK_F)) 796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_ce_cback = nfa_ce_handle_t3t_evt; 803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cb->activation_params.protocol == NFA_PROTOCOL_ISO_DEP) 805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_ce_cback = nfa_ce_handle_t4t_evt; 807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* For T4T, we do not know which AID will be selected yet */ 809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* For all T4T entries in listen_info, set T4T_ACTIVATE_NOTIFY_PENDING flag */ 812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (i=0; i<NFA_CE_LISTEN_INFO_IDX_INVALID; i++) 813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_IN_USE) 815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[i].protocol_mask & NFA_PROTOCOL_MASK_ISO_DEP) 817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Found listen_info table entry for T4T raw listen */ 819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[i].flags |= NFA_CE_LISTEN_INFO_T4T_ACTIVATE_PND; 820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If entry if for NDEF, select it, so application gets nofitifed of ACTIVATE_EVT now */ 822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (i == NFA_CE_LISTEN_INFO_IDX_NDEF) 823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project listen_info_idx = NFA_CE_LISTEN_INFO_IDX_NDEF; 825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project t4t_activate_pending = TRUE; 828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE) 831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if entry is for ISO_DEP UICC */ 832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_UICC) 833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( ( (p_cb->activation_params.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_A) 835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_cb->listen_info[i].tech_proto_mask & NFA_DM_DISC_MASK_LA_ISO_DEP) ) 836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project || 837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ( (p_cb->activation_params.rf_tech_param.mode == NFC_DISCOVERY_TYPE_LISTEN_B) 838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_cb->listen_info[i].tech_proto_mask & NFA_DM_DISC_MASK_LB_ISO_DEP) ) ) 839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project listen_info_idx = i; 841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If listening for ISO_DEP, but not NDEF nor UICC, then notify CE module now and wait for reader/writer to SELECT an AID */ 848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (t4t_activate_pending && (listen_info_idx == NFA_CE_LISTEN_INFO_IDX_INVALID)) 849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_SetActivatedTagType (&p_cb->activation_params, 0, p_ce_cback); 851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cb->activation_params.intf_param.type == NFC_INTERFACE_EE_DIRECT_RF) 855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* search any entry listening UICC */ 857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (i=0; i<NFA_CE_LISTEN_INFO_IDX_INVALID; i++) 858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_IN_USE) 860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_UICC)) 861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project listen_info_idx = i; 863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if valid listen_info entry was found */ 869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (listen_info_idx == NFA_CE_LISTEN_INFO_IDX_INVALID) 870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||((listen_info_idx == NFA_CE_LISTEN_INFO_IDX_NDEF) && !(p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags & NFA_CE_LISTEN_INFO_IN_USE))) 871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_DEBUG1 ("No listen_info found for this activation. listen_info_idx=%d", listen_info_idx); 873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (TRUE); 874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].flags &= ~NFA_CE_LISTEN_INFO_T4T_ACTIVATE_PND; 877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Get CONN_CBACK for this activation */ 879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->p_active_conn_cback = p_cb->listen_info[listen_info_idx].p_conn_cback; 880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->idx_cur_active = listen_info_idx; 881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_cb->idx_cur_active == NFA_CE_LISTEN_INFO_IDX_NDEF) 883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_cb->listen_info[p_cb->idx_cur_active].flags & NFA_CE_LISTEN_INFO_UICC)) 884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (&(conn_evt.activated.activate_ntf), &p_cb->activation_params, sizeof (tNFC_ACTIVATE_DEVT)); 886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cb->p_active_conn_cback) (NFA_ACTIVATED_EVT, &conn_evt); 888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ce_activated.handle = NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)p_cb->idx_cur_active); 892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (&(conn_evt.ce_activated.activate_ntf), &p_cb->activation_params, sizeof (tNFC_ACTIVATE_DEVT)); 893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ce_activated.status = NFA_STATUS_OK; 894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cb->p_active_conn_cback) (NFA_CE_ACTIVATED_EVT, &conn_evt); 896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* we don't need any CE subsystem in case of NFCEE direct RF interface */ 899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_ce_cback) 900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Notify CE subsystem */ 902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_SetActivatedTagType (&p_cb->activation_params, t3t_system_code, p_ce_cback); 903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_deactivate_ntf 910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Action when deactivate occurs. (NFA_CE_DEACTIVATE_NTF_EVT) 912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - If deactivate due to API deregister, then remove its entry from 914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** listen_info table 915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - If NDEF was modified while activated, then restore 917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** original NDEF contents 918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - Restart listening (if any active entries in listen table) 920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE (message buffer to be freed by caller) 922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN nfa_ce_deactivate_ntf (tNFA_CE_MSG *p_ce_msg) 925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_DEACT_TYPE deact_type = (tNFC_DEACT_TYPE) p_ce_msg->hdr.layer_specific; 927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CE_CB *p_cb = &nfa_ce_cb; 928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CONN_EVT_DATA conn_evt; 929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 i; 930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_DEBUG1 ("nfa_ce_deactivate_ntf () deact_type=%d", deact_type); 932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if deactivating to SLEEP mode */ 934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (deact_type == NFC_DEACTIVATE_TYPE_SLEEP) 935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(deact_type == NFC_DEACTIVATE_TYPE_SLEEP_AF) ) 936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 93758268861a9aee36b541b6534c341657fb221c2f2Sherry Smith if ( nfa_ce_cb.idx_wild_card == NFA_CE_LISTEN_INFO_IDX_INVALID) 93858268861a9aee36b541b6534c341657fb221c2f2Sherry Smith { 93958268861a9aee36b541b6534c341657fb221c2f2Sherry Smith /* notify deactivated as sleep and wait for reactivation or deactivation to idle */ 94058268861a9aee36b541b6534c341657fb221c2f2Sherry Smith conn_evt.deactivated.type = deact_type; 941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 94258268861a9aee36b541b6534c341657fb221c2f2Sherry Smith /* if T4T AID application has not been selected then p_active_conn_cback could be NULL */ 94358268861a9aee36b541b6534c341657fb221c2f2Sherry Smith if (p_cb->p_active_conn_cback) 94458268861a9aee36b541b6534c341657fb221c2f2Sherry Smith (*p_cb->p_active_conn_cback) (NFA_DEACTIVATED_EVT, &conn_evt); 94558268861a9aee36b541b6534c341657fb221c2f2Sherry Smith } 94658268861a9aee36b541b6534c341657fb221c2f2Sherry Smith else 94758268861a9aee36b541b6534c341657fb221c2f2Sherry Smith { 94858268861a9aee36b541b6534c341657fb221c2f2Sherry Smith conn_evt.ce_deactivated.handle = NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)nfa_ce_cb.idx_wild_card); 94958268861a9aee36b541b6534c341657fb221c2f2Sherry Smith conn_evt.ce_deactivated.type = deact_type; 950c19fe79a280fb5451b9f7506222c8676dd91d12bMartijn Coenen if (p_cb->p_active_conn_cback) 951c19fe79a280fb5451b9f7506222c8676dd91d12bMartijn Coenen (*p_cb->p_active_conn_cback) (NFA_CE_DEACTIVATED_EVT, &conn_evt); 95258268861a9aee36b541b6534c341657fb221c2f2Sherry Smith } 953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project deact_type = NFC_DEACTIVATE_TYPE_IDLE; 959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Tag is in idle state */ 962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags &= ~NFA_CE_FLAGS_LISTEN_ACTIVE_SLEEP; 963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* First, notify app of deactivation */ 965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (i=0; i<NFA_CE_LISTEN_INFO_IDX_INVALID; i++) 966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_IN_USE) 968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_UICC) 970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(i == p_cb->idx_cur_active) ) 971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.deactivated.type = deact_type; 973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cb->p_active_conn_cback) (NFA_DEACTIVATED_EVT, &conn_evt); 974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ( (p_cb->activation_params.protocol == NFA_PROTOCOL_ISO_DEP) 976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_cb->listen_info[i].protocol_mask & NFA_PROTOCOL_MASK_ISO_DEP)) 977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Don't send NFA_DEACTIVATED_EVT if NFA_ACTIVATED_EVT wasn't sent */ 979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!(p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_T4T_ACTIVATE_PND)) 980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (i == NFA_CE_LISTEN_INFO_IDX_NDEF) 982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.deactivated.type = deact_type; 984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cb->p_active_conn_cback) (NFA_DEACTIVATED_EVT, &conn_evt); 985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ce_deactivated.handle = NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)i); 989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ce_deactivated.type = deact_type; 990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cb->p_active_conn_cback) (NFA_CE_DEACTIVATED_EVT, &conn_evt); 991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ( (p_cb->activation_params.protocol == NFA_PROTOCOL_T3T) 995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_cb->listen_info[i].protocol_mask & NFA_PROTOCOL_MASK_T3T)) 996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (i == NFA_CE_LISTEN_INFO_IDX_NDEF) 998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.deactivated.type = deact_type; 1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cb->p_active_conn_cback) (NFA_DEACTIVATED_EVT, &conn_evt); 1001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ce_deactivated.handle = NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)i); 1005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ce_deactivated.type = deact_type; 1006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cb->p_active_conn_cback) (NFA_CE_DEACTIVATED_EVT, &conn_evt); 1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if app initiated the deactivation (due to API deregister). If so, remove entry from listen_info table. */ 1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->flags & NFA_CE_FLAGS_APP_INIT_DEACTIVATION) 1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags &= ~NFA_CE_FLAGS_APP_INIT_DEACTIVATION; 1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_ce_remove_listen_info_entry (p_cb->idx_cur_active, TRUE); 1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->p_active_conn_cback = NULL; 1020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->idx_cur_active = NFA_CE_LISTEN_INFO_IDX_INVALID; 1021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Restart listening (if any listen_info entries are still active) */ 1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_ce_restart_listen_check (); 1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_disable_local_tag 1031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Disable local NDEF tag 1033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - clean up control block 1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - remove NDEF discovery configuration 1035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfa_ce_disable_local_tag (void) 1040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CE_CB *p_cb = &nfa_ce_cb; 1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CONN_EVT_DATA evt_data; 1043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_DEBUG0 ("Disabling local NDEF tag"); 1045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If local NDEF tag is in use, then disable it */ 1047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags & NFA_CE_LISTEN_INFO_IN_USE) 1048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* NDEF Tag is in not idle state */ 1050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_cb->flags & NFA_CE_FLAGS_LISTEN_ACTIVE_SLEEP) 1051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_cb->idx_cur_active == NFA_CE_LISTEN_INFO_IDX_NDEF) ) 1052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* wait for deactivation */ 1054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags |= NFA_CE_FLAGS_APP_INIT_DEACTIVATION; 1055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_dm_rf_deactivate (NFA_DEACTIVATE_TYPE_IDLE); 1056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Notify DM to stop listening for ndef */ 1060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle != NFA_HANDLE_INVALID) 1061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_dm_delete_rf_discover (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle); 1063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle = NFA_HANDLE_INVALID; 1064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_ce_remove_listen_info_entry (NFA_CE_LISTEN_INFO_IDX_NDEF, TRUE); 1066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Notify application */ 1071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFA_STATUS_OK; 1072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_dm_conn_cback_event_notify (NFA_CE_LOCAL_TAG_CONFIGURED_EVT, &evt_data); 1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_api_cfg_local_tag 1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Configure local NDEF tag 1081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - store ndef attributes in to control block 1082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - update discovery configuration 1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE (message buffer to be freed by caller) 1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN nfa_ce_api_cfg_local_tag (tNFA_CE_MSG *p_ce_msg) 1088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CE_CB *p_cb = &nfa_ce_cb; 1090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CONN_EVT_DATA conn_evt; 1091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if disabling local tag */ 1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_ce_msg->local_tag.protocol_mask == 0) 1094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_ce_disable_local_tag (); 1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_DEBUG5 ("Configuring local NDEF tag: protocol_mask=%01x cur_size=%i, max_size=%i, readonly=%i", 1100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_ce_msg->local_tag.protocol_mask, 1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_ce_msg->local_tag.ndef_cur_size, 1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_ce_msg->local_tag.ndef_max_size, 1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_ce_msg->local_tag.read_only, 1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_ce_msg->local_tag.uid_len); 1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If local tag was already set, then check if NFA_CeConfigureLocalTag called to change protocol mask */ 1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags & NFA_CE_LISTEN_INFO_IN_USE) 1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle != NFA_HANDLE_INVALID) 1109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&((p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].protocol_mask & (NFA_PROTOCOL_MASK_T3T | NFA_PROTOCOL_MASK_ISO_DEP)) 1110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project != (p_ce_msg->local_tag.protocol_mask & (NFA_PROTOCOL_MASK_T3T | NFA_PROTOCOL_MASK_ISO_DEP))) ) 1111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Listening for different tag protocols. Stop discovery */ 1113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_dm_delete_rf_discover (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle); 1114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle = NFA_HANDLE_INVALID; 1115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* clear NDEF contents */ 1117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_T3tSetLocalNDEFMsg (TRUE, 0, 0, NULL, NULL); 1118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_T4tSetLocalNDEFMsg (TRUE, 0, 0, NULL, NULL); 1119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Store NDEF info to control block */ 1122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->p_ndef_data = p_ce_msg->local_tag.p_ndef_data; 1123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_cur_size = p_ce_msg->local_tag.ndef_cur_size; 1124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_max_size = p_ce_msg->local_tag.ndef_max_size; 1125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Fill in LISTEN_INFO entry for NDEF */ 1127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags = NFA_CE_LISTEN_INFO_IN_USE; 1128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].protocol_mask = p_ce_msg->local_tag.protocol_mask; 1129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].p_conn_cback = nfa_dm_conn_cback_event_notify; 1130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_ce_msg->local_tag.read_only) 1131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags |= NFC_CE_LISTEN_INFO_READONLY_NDEF; 1132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].t3t_system_code = T3T_SYSTEM_CODE_NDEF; 1133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Set NDEF contents */ 1135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.status = NFA_STATUS_FAILED; 1136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].protocol_mask & (NFA_PROTOCOL_MASK_T3T | NFA_PROTOCOL_MASK_ISO_DEP)) 1138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Ok to set contents now */ 1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfa_ce_set_content () != NFA_STATUS_OK) 1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_ERROR0 ("nfa_ce_api_cfg_local_tag: could not set contents"); 1143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_dm_conn_cback_event_notify (NFA_CE_LOCAL_TAG_CONFIGURED_EVT, &conn_evt); 1144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 1145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Start listening and notify app of status */ 1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.status = nfa_ce_start_listening (); 1149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_dm_conn_cback_event_notify (NFA_CE_LOCAL_TAG_CONFIGURED_EVT, &conn_evt); 1150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 1153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_api_reg_listen 1158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Register listen params for Felica system code, T4T AID, 1160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** or UICC 1161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE (message buffer to be freed by caller) 1163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN nfa_ce_api_reg_listen (tNFA_CE_MSG *p_ce_msg) 1166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CE_CB *p_cb = &nfa_ce_cb; 1168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CONN_EVT_DATA conn_evt; 1169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 i; 1170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 listen_info_idx = NFA_CE_LISTEN_INFO_IDX_INVALID; 1171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_DEBUG1 ("Registering UICC/Felica/Type-4 tag listener. Type=%i", p_ce_msg->reg_listen.listen_type); 1173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Look for available entry in listen_info table */ 1175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* - If registering UICC listen, make sure there isn't another entry for the ee_handle */ 1176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* - Skip over entry 0 (reserved for local NDEF tag) */ 1177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (i=1; i<NFA_CE_LISTEN_INFO_MAX; i++) 1178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_ce_msg->reg_listen.listen_type == NFA_CE_REG_TYPE_UICC) 1180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_IN_USE) 1181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_UICC) 1182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_cb->listen_info[i].ee_handle == p_ce_msg->reg_listen.ee_handle) ) 1183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_ERROR1 ("UICC (0x%x) listening already specified", p_ce_msg->reg_listen.ee_handle); 1186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.status = NFA_STATUS_FAILED; 1187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_dm_conn_cback_event_notify (NFA_CE_UICC_LISTEN_CONFIGURED_EVT, &conn_evt); 1188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 1189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If this is a free entry, and we haven't found one yet, remember it */ 1191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ( (!(p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_IN_USE)) 1192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(listen_info_idx == NFA_CE_LISTEN_INFO_IDX_INVALID) ) 1193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project listen_info_idx = i; 1195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add new entry to listen_info table */ 1199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (listen_info_idx == NFA_CE_LISTEN_INFO_IDX_INVALID) 1200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_ERROR1 ("Maximum listen callbacks exceeded (%i)", NFA_CE_LISTEN_INFO_MAX); 1202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_ce_msg->reg_listen.listen_type == NFA_CE_REG_TYPE_UICC) 1204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.status = NFA_STATUS_FAILED; 1206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_dm_conn_cback_event_notify (NFA_CE_UICC_LISTEN_CONFIGURED_EVT, &conn_evt); 1207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Notify application */ 1211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ce_registered.handle = NFA_HANDLE_INVALID; 1212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ce_registered.status = NFA_STATUS_FAILED; 1213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_ce_msg->reg_listen.p_conn_cback) (NFA_CE_REGISTERED_EVT, &conn_evt); 1214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 1216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_DEBUG1 ("NFA_CE: adding listen_info entry %i", listen_info_idx); 1220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Store common parameters */ 1222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Mark entry as 'in-use', and NFA_CE_LISTEN_INFO_START_NTF_PND */ 1223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* (LISTEN_START_EVT will be notified when discovery successfully starts */ 1224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].flags = NFA_CE_LISTEN_INFO_IN_USE | NFA_CE_LISTEN_INFO_START_NTF_PND; 1225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].rf_disc_handle = NFA_HANDLE_INVALID; 1226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].protocol_mask = 0; 1227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Store type-specific parameters */ 1229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_ce_msg->reg_listen.listen_type) 1230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFA_CE_REG_TYPE_ISO_DEP: 1232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].protocol_mask = NFA_PROTOCOL_MASK_ISO_DEP; 1233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].flags |= NFA_CE_LISTEN_INFO_T4T_AID; 1234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].p_conn_cback =p_ce_msg->reg_listen.p_conn_cback; 1235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Register this AID with CE_T4T */ 1237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_cb->listen_info[listen_info_idx].t4t_aid_handle = CE_T4tRegisterAID (p_ce_msg->reg_listen.aid_len, 1238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_ce_msg->reg_listen.aid, 123958268861a9aee36b541b6534c341657fb221c2f2Sherry Smith nfa_ce_handle_t4t_aid_evt)) == CE_T4T_AID_HANDLE_INVALID) 1240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_ERROR0 ("Unable to register AID"); 1242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].flags = 0; 1243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Notify application */ 1245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ce_registered.handle = NFA_HANDLE_INVALID; 1246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ce_registered.status = NFA_STATUS_FAILED; 1247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_ce_msg->reg_listen.p_conn_cback) (NFA_CE_REGISTERED_EVT, &conn_evt); 1248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 1250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 125158268861a9aee36b541b6534c341657fb221c2f2Sherry Smith if (p_cb->listen_info[listen_info_idx].t4t_aid_handle == CE_T4T_WILDCARD_AID_HANDLE) 125258268861a9aee36b541b6534c341657fb221c2f2Sherry Smith nfa_ce_cb.idx_wild_card = listen_info_idx; 1253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFA_CE_REG_TYPE_FELICA: 1256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].protocol_mask = NFA_PROTOCOL_MASK_T3T; 1257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].flags |= NFA_CE_LISTEN_INFO_FELICA; 1258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].p_conn_cback = p_ce_msg->reg_listen.p_conn_cback; 1259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Store system code and nfcid2 */ 1261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].t3t_system_code = p_ce_msg->reg_listen.system_code; 1262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_cb->listen_info[listen_info_idx].t3t_nfcid2, p_ce_msg->reg_listen.nfcid2, NCI_RF_F_UID_LEN); 1263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE) 1266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFA_CE_REG_TYPE_UICC: 1267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].flags |= NFA_CE_LISTEN_INFO_UICC; 1268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].p_conn_cback = &nfa_dm_conn_cback_event_notify; 1269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Store EE handle and Tech */ 1271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].ee_handle = p_ce_msg->reg_listen.ee_handle; 1272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].tech_mask = p_ce_msg->reg_listen.tech_mask; 1273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 1275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Start listening */ 1279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((conn_evt.status = nfa_ce_start_listening ()) != NFA_STATUS_OK) 1280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_ERROR0 ("nfa_ce_api_reg_listen: unable to register new listen params with DM"); 1282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].flags = 0; 1283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Nofitify app of status */ 1286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_ce_msg->reg_listen.listen_type == NFA_CE_REG_TYPE_UICC) 1287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cb->listen_info[listen_info_idx].p_conn_cback) (NFA_CE_UICC_LISTEN_CONFIGURED_EVT, &conn_evt); 1289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.ce_registered.handle = NFA_HANDLE_GROUP_CE | listen_info_idx; 1293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_DEBUG1 ("nfa_ce_api_reg_listen: registered handle 0x%04X", conn_evt.ce_registered.handle); 1294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cb->listen_info[listen_info_idx].p_conn_cback) (NFA_CE_REGISTERED_EVT, &conn_evt); 1295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 1298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_api_dereg_listen 1303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Deregister listen params 1305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE (message buffer to be freed by caller) 1307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN nfa_ce_api_dereg_listen (tNFA_CE_MSG *p_ce_msg) 1310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CE_CB *p_cb = &nfa_ce_cb; 1312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 listen_info_idx; 1313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFA_CONN_EVT_DATA conn_evt; 1314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE) 1316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if deregistering UICC , or virtual secure element listen */ 1317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_ce_msg->dereg_listen.listen_info == NFA_CE_LISTEN_INFO_UICC) 1318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Deregistering UICC listen. Look for listen_info for this UICC ee handle */ 1320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (listen_info_idx = 0; listen_info_idx < NFA_CE_LISTEN_INFO_MAX; listen_info_idx++) 1321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_cb->listen_info[listen_info_idx].flags & NFA_CE_LISTEN_INFO_IN_USE) 1323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_cb->listen_info[listen_info_idx].flags & NFA_CE_LISTEN_INFO_UICC) 1324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_cb->listen_info[listen_info_idx].ee_handle == p_ce_msg->dereg_listen.handle) ) 1325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* UICC is in not idle state */ 1327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_cb->flags & NFA_CE_FLAGS_LISTEN_ACTIVE_SLEEP) 1328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_cb->idx_cur_active == listen_info_idx) ) 1329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* wait for deactivation */ 1331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags |= NFA_CE_FLAGS_APP_INIT_DEACTIVATION; 1332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_dm_rf_deactivate (NFA_DEACTIVATE_TYPE_IDLE); 1333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Stop listening */ 1337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[listen_info_idx].rf_disc_handle != NFA_HANDLE_INVALID) 1338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_dm_delete_rf_discover (p_cb->listen_info[listen_info_idx].rf_disc_handle); 1340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].rf_disc_handle = NFA_HANDLE_INVALID; 1341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Remove entry and notify application */ 1344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_ce_remove_listen_info_entry (listen_info_idx, TRUE); 1345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (listen_info_idx == NFA_CE_LISTEN_INFO_MAX) 1351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_ERROR0 ("nfa_ce_api_dereg_listen (): cannot find listen_info for UICC"); 1353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.status = NFA_STATUS_INVALID_PARAM; 1354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_dm_conn_cback_event_notify (NFA_CE_UICC_LISTEN_CONFIGURED_EVT, &conn_evt); 1355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 1359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Deregistering virtual secure element listen */ 1361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project listen_info_idx = p_ce_msg->dereg_listen.handle & NFA_HANDLE_MASK; 136258268861a9aee36b541b6534c341657fb221c2f2Sherry Smith if (nfa_ce_cb.idx_wild_card == listen_info_idx) 136358268861a9aee36b541b6534c341657fb221c2f2Sherry Smith { 136458268861a9aee36b541b6534c341657fb221c2f2Sherry Smith nfa_ce_cb.idx_wild_card = NFA_CE_LISTEN_INFO_IDX_INVALID; 136558268861a9aee36b541b6534c341657fb221c2f2Sherry Smith } 1366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (listen_info_idx < NFA_CE_LISTEN_INFO_MAX) 1368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_cb->listen_info[listen_info_idx].flags & NFA_CE_LISTEN_INFO_IN_USE)) 1369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* virtual secure element is in not idle state */ 1371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_cb->flags & NFA_CE_FLAGS_LISTEN_ACTIVE_SLEEP) 1372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_cb->idx_cur_active == listen_info_idx) ) 1373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* wait for deactivation */ 1375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags |= NFA_CE_FLAGS_APP_INIT_DEACTIVATION; 1376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_dm_rf_deactivate (NFA_DEACTIVATE_TYPE_IDLE); 1377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Stop listening */ 1381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->listen_info[listen_info_idx].rf_disc_handle != NFA_HANDLE_INVALID) 1382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_dm_delete_rf_discover (p_cb->listen_info[listen_info_idx].rf_disc_handle); 1384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->listen_info[listen_info_idx].rf_disc_handle = NFA_HANDLE_INVALID; 1385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Remove entry and notify application */ 1388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_ce_remove_listen_info_entry (listen_info_idx, TRUE); 1389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFA_TRACE_ERROR0 ("nfa_ce_api_dereg_listen (): cannot find listen_info for Felica/T4tAID"); 1394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project conn_evt.status = NFA_STATUS_INVALID_PARAM; 1395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_dm_conn_cback_event_notify (NFA_CE_DEREGISTERED_EVT, &conn_evt); 1396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 1400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_api_cfg_isodep_tech 1405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Configure the technologies (NFC-A and/or NFC-B) to listen for 1407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** ISO-DEP 1408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE (message buffer to be freed by caller) 1410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN nfa_ce_api_cfg_isodep_tech (tNFA_CE_MSG *p_ce_msg) 1413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_ce_cb.isodep_disc_mask = 0; 1415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_ce_msg->hdr.layer_specific & NFA_TECHNOLOGY_MASK_A) 1416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_ce_cb.isodep_disc_mask = NFA_DM_DISC_MASK_LA_ISO_DEP; 1417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_ce_msg->hdr.layer_specific & NFA_TECHNOLOGY_MASK_B) 1419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfa_ce_cb.isodep_disc_mask |= NFA_DM_DISC_MASK_LB_ISO_DEP; 1420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 1421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1422