nfa_dm_discover.c revision 1ba9dcccf5b342bd74a2f8213b7ed3be78b9db44
1dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/****************************************************************************** 2dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor * 3dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor * Copyright (C) 2010-2013 Broadcom Corporation 4dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor * 5dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor * Licensed under the Apache License, Version 2.0 (the "License"); 6dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor * you may not use this file except in compliance with the License. 7dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor * You may obtain a copy of the License at: 8dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor * 9dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor * http://www.apache.org/licenses/LICENSE-2.0 10dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor * 11dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor * Unless required by applicable law or agreed to in writing, software 12dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor * distributed under the License is distributed on an "AS IS" BASIS, 1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor * See the License for the specific language governing permissions and 15dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor * limitations under the License. 16dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor * 17dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ******************************************************************************/ 18dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 19dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 20dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/****************************************************************************** 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * 22dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor * This file contains the action functions for device manager discovery 23e3ba15c794839abe076e3e2bdf6c626396a19d4dWill Dietz * function. 24dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor * 25dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ******************************************************************************/ 26dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#include <string.h> 27dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#include "nfa_sys.h" 28dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#include "nfa_api.h" 29dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#include "nfa_dm_int.h" 30dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#include "nfa_p2p_int.h" 31dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#include "nfa_sys_int.h" 32dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#if (NFC_NFCEE_INCLUDED == TRUE) 33dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#include "nfa_ee_api.h" 34dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#include "nfa_ee_int.h" 35dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#endif 36dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#include "nfa_rw_int.h" 37dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 38dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/* 39dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** static functions 40dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*/ 41dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 42dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic UINT8 nfa_dm_get_rf_discover_config (tNFA_DM_DISC_TECH_PROTO_MASK dm_disc_mask, 43dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFC_DISCOVER_PARAMS disc_params[], 44dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8 max_params); 45dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic tNFA_STATUS nfa_dm_set_rf_listen_mode_config (tNFA_DM_DISC_TECH_PROTO_MASK tech_proto_mask); 46dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_set_rf_listen_mode_raw_config (tNFA_DM_DISC_TECH_PROTO_MASK *p_disc_mask); 47dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic tNFA_DM_DISC_TECH_PROTO_MASK nfa_dm_disc_get_disc_mask (tNFC_RF_TECH_N_MODE tech_n_mode, 48dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFC_PROTOCOL protocol); 49dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_notify_discovery (tNFA_DM_RF_DISC_DATA *p_data); 50dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic tNFA_STATUS nfa_dm_disc_notify_activation (tNFC_DISCOVER *p_data); 51dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_disc_notify_deactivation (tNFA_DM_RF_DISC_SM_EVENT sm_event, tNFC_DISCOVER *p_data); 52dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_disc_data_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data); 53dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_disc_kovio_timeout_cback (TIMER_LIST_ENT *p_tle); 54dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_disc_report_kovio_presence_check (tNFC_STATUS status); 55dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 56dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#if (BT_TRACE_VERBOSE == TRUE) 57dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic char *nfa_dm_disc_state_2_str (UINT8 state); 58dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic char *nfa_dm_disc_event_2_str (UINT8 event); 59dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor#endif 60dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 61dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 62dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/******************************************************************************* 63dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 64dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function nfa_dm_get_rf_discover_config 65dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 66dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description Build RF discovery configurations from tNFA_DM_DISC_TECH_PROTO_MASK 67dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 68dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns number of RF discovery configurations 69dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 70dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/ 71dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic UINT8 nfa_dm_get_rf_discover_config (tNFA_DM_DISC_TECH_PROTO_MASK dm_disc_mask, 72dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFC_DISCOVER_PARAMS disc_params[], 73dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8 max_params) 74dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{ 75dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8 num_params = 0; 76dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 77dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.flags & NFA_DM_FLAGS_LISTEN_DISABLED) 78dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 79dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor NFA_TRACE_DEBUG1 ("nfa_dm_get_rf_discover_config () listen disabled, rm listen from 0x%x", dm_disc_mask); 80dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor dm_disc_mask &= NFA_DM_DISC_MASK_POLL; 81dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 82dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 83dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Check polling A */ 84dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (dm_disc_mask & ( NFA_DM_DISC_MASK_PA_T1T 85dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_PA_T2T 86dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_PA_ISO_DEP 87dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_PA_NFC_DEP 88dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_P_LEGACY) ) 89dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 90dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_A; 91dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pa; 92dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor num_params++; 93dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 94dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (num_params >= max_params) 95dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return num_params; 96dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 97dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 98dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Check polling B */ 99dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (dm_disc_mask & NFA_DM_DISC_MASK_PB_ISO_DEP) 100dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 101dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_B; 102dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pb; 103dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor num_params++; 104dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 105dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (num_params >= max_params) 106dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return num_params; 107dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 108dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 109dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Check polling F */ 110dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (dm_disc_mask & ( NFA_DM_DISC_MASK_PF_T3T 111dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_PF_NFC_DEP) ) 112dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 113dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_F; 114dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pf; 115dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor num_params++; 116dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 117dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (num_params >= max_params) 118dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return num_params; 119dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 120dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 121dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Check polling A Active mode */ 122dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (dm_disc_mask & NFA_DM_DISC_MASK_PAA_NFC_DEP) 123dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 124dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_A_ACTIVE; 125dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->paa; 126dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor num_params++; 127dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 128dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (num_params >= max_params) 129dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return num_params; 130dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 131dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 132dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Check polling F Active mode */ 133dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (dm_disc_mask & NFA_DM_DISC_MASK_PFA_NFC_DEP) 134dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 135dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_F_ACTIVE; 136dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pfa; 137dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor num_params++; 138dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 139dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (num_params >= max_params) 140dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return num_params; 141dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 142dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 143dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Check listening A */ 144dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (dm_disc_mask & ( NFA_DM_DISC_MASK_LA_T1T 145dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_LA_T2T 146dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_LA_ISO_DEP 147dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_LA_NFC_DEP) ) 148dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 149dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_A; 150dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].frequency = 1; 151dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor num_params++; 152dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 153dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (num_params >= max_params) 154dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return num_params; 155dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 156dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 157dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Check listening B */ 158dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (dm_disc_mask & NFA_DM_DISC_MASK_LB_ISO_DEP) 159dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 160dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_B; 161dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].frequency = 1; 162dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor num_params++; 163dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 164dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (num_params >= max_params) 165dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return num_params; 166dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 167dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 168dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Check listening F */ 169dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (dm_disc_mask & ( NFA_DM_DISC_MASK_LF_T3T 170dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_LF_NFC_DEP) ) 171dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 172dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_F; 173dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].frequency = 1; 174dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor num_params++; 175dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 176dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (num_params >= max_params) 177dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return num_params; 178dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 179dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 180dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Check listening A Active mode */ 181dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (dm_disc_mask & NFA_DM_DISC_MASK_LAA_NFC_DEP) 182dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 183dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE; 184dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].frequency = 1; 185dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor num_params++; 186dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 187dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (num_params >= max_params) 188dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return num_params; 189dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 190dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 191dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Check listening F Active mode */ 192dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (dm_disc_mask & NFA_DM_DISC_MASK_LFA_NFC_DEP) 193dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 194dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE; 195dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].frequency = 1; 196dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor num_params++; 197dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 198dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (num_params >= max_params) 199dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return num_params; 200dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 201dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 202dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Check polling ISO 15693 */ 203dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (dm_disc_mask & NFA_DM_DISC_MASK_P_ISO15693) 204dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 205dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_ISO15693; 206dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pi93; 207dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor num_params++; 208dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 209dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (num_params >= max_params) 210dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return num_params; 211dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 212dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 213dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Check polling B' */ 214dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (dm_disc_mask & NFA_DM_DISC_MASK_P_B_PRIME) 215dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 216dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_B_PRIME; 217dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pbp; 218dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor num_params++; 219dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 220dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (num_params >= max_params) 221dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return num_params; 222dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 223dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 224dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Check polling KOVIO */ 225dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (dm_disc_mask & NFA_DM_DISC_MASK_P_KOVIO) 226dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 227dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].type = NFC_DISCOVERY_TYPE_POLL_KOVIO; 228dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].frequency = p_nfa_dm_rf_disc_freq_cfg->pk; 229dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor num_params++; 230dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 231dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (num_params >= max_params) 232dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return num_params; 233dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 234dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 235dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Check listening ISO 15693 */ 236dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (dm_disc_mask & NFA_DM_DISC_MASK_L_ISO15693) 237dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 238dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_ISO15693; 239dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].frequency = 1; 240dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor num_params++; 241dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 242dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (num_params >= max_params) 243dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return num_params; 244dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 245dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 246dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Check listening B' */ 247dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (dm_disc_mask & NFA_DM_DISC_MASK_L_B_PRIME) 248dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 249dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].type = NFC_DISCOVERY_TYPE_LISTEN_B_PRIME; 250dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_params[num_params].frequency = 1; 251dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor num_params++; 252dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 253dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (num_params >= max_params) 254dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return num_params; 255dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 256dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 257dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return num_params; 258dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor} 259dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 260dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/******************************************************************************* 261dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 262dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function nfa_dm_set_rf_listen_mode_config 263dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 264dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description Update listening protocol to NFCC 265dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 266dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns NFA_STATUS_OK if success 267dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 268dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/ 269dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic tNFA_STATUS nfa_dm_set_rf_listen_mode_config (tNFA_DM_DISC_TECH_PROTO_MASK tech_proto_mask) 270dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{ 271dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8 params[40], *p; 272dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8 platform = 0; 273dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8 sens_info = 0; 274dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 275dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor NFA_TRACE_DEBUG1 ("nfa_dm_set_rf_listen_mode_config () tech_proto_mask = 0x%08X", 276dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tech_proto_mask); 277dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 278dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* 279dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** T1T listen LA_PROT 0x80, LA_SENS_RES byte1:0x00 byte2:0x0C 280dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** T2T listen LA_PROT 0x00 281dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** T3T listen No bit for T3T in LF_PROT (CE T3T set listen parameters, system code, NFCID2, etc.) 282dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** ISO-DEP listen LA_PROT 0x01, LB_PROT 0x01 283dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** NFC-DEP listen LA_PROT 0x02, LF_PROT 0x02 284dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor */ 285dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 286dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (tech_proto_mask & NFA_DM_DISC_MASK_LA_T1T) 287dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 288dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor platform = NCI_PARAM_PLATFORM_T1T; 289dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 290dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else if (tech_proto_mask & NFA_DM_DISC_MASK_LA_T2T) 291dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 292dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* platform = 0 and sens_info = 0 */ 293dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 294dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else 295dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 296dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (tech_proto_mask & NFA_DM_DISC_MASK_LA_ISO_DEP) 297dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 298dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor sens_info |= NCI_PARAM_SEL_INFO_ISODEP; 299dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 300dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 301dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (tech_proto_mask & NFA_DM_DISC_MASK_LA_NFC_DEP) 302dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 303dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor sens_info |= NCI_PARAM_SEL_INFO_NFCDEP; 304dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 305dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 306dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 307dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor p = params; 308dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 309dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* 310dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** for Listen A 311dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** 312dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** Set ATQA 0x0C00 for T1T listen 313dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** If the ATQA values are 0x0000, then the FW will use 0x0400 314dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** which works for ISODEP, T2T and NFCDEP. 315dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor */ 316dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A] == NFA_DM_DISC_HOST_ID_DH) 317dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 318dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LA_BIT_FRAME_SDD); 319dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_BIT_FRAME_SDD); 320dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, 0x04); 321dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LA_PLATFORM_CONFIG); 322dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_PLATFORM_CONFIG); 323dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, platform); 324dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LA_SEL_INFO); 325dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_SEL_INFO); 326dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, sens_info); 327dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 328dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else /* Let NFCC use UICC configuration by configuring with length = 0 */ 329dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 330dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LA_BIT_FRAME_SDD); 331dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, 0); 332dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LA_PLATFORM_CONFIG); 333dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, 0); 334dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LA_SEL_INFO); 335dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, 0); 336dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LA_NFCID1); 337dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, 0); 338dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LA_HIST_BY); 339dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, 0); 340dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 341dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 342dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* for Listen B */ 343dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_B] == NFA_DM_DISC_HOST_ID_DH) 344dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 345dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LB_SENSB_INFO); 346dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NCI_PARAM_LEN_LB_SENSB_INFO); 347dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (tech_proto_mask & NFA_DM_DISC_MASK_LB_ISO_DEP) 348dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 349dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NCI_LISTEN_PROTOCOL_ISO_DEP); 350dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 351dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else 352dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 353dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, 0x00); 354dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 355dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 356dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else /* Let NFCC use UICC configuration by configuring with length = 0 */ 357dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 358dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LB_SENSB_INFO); 359dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, 0); 360dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LB_NFCID0); 361dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, 0); 362dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LB_APPDATA); 363dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, 0); 364dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LB_ADC_FO); 365dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, 0); 366dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LB_H_INFO); 367dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, 0); 368dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 369dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 370dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* for Listen F */ 371dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* NFCC can support NFC-DEP and T3T listening based on NFCID routing regardless of NFC-F tech routing */ 372dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LF_PROTOCOL); 373dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NCI_PARAM_LEN_LF_PROTOCOL); 374dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (tech_proto_mask & NFA_DM_DISC_MASK_LF_NFC_DEP) 375dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 376dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NCI_LISTEN_PROTOCOL_NFC_DEP); 377dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 378dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else 379dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 380dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, 0x00); 381dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 382dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 383dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (p > params) 384dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 385dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE); 386dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 387dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 388dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return NFA_STATUS_OK; 389dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor} 390dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 391dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/******************************************************************************* 392dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 393dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function nfa_dm_set_total_duration 394dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 395dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description Update total duration to NFCC 396dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 397dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns void 398dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 399dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/ 400dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_set_total_duration (void) 401dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{ 402dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8 params[10], *p; 403dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 404dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor NFA_TRACE_DEBUG0 ("nfa_dm_set_total_duration ()"); 405dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 406dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor p = params; 407dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 408dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* for total duration */ 409dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_TOTAL_DURATION); 410dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NCI_PARAM_LEN_TOTAL_DURATION); 411dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT16_TO_STREAM (p, nfa_dm_cb.disc_cb.disc_duration); 412dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 413dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (p > params) 414dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 415dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE); 416dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 417dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor} 418dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 419dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/******************************************************************************* 420dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 421dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function nfa_dm_set_rf_listen_mode_raw_config 422dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 423dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description Set raw listen parameters 424dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 425dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns void 426dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 427dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/ 428dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_set_rf_listen_mode_raw_config (tNFA_DM_DISC_TECH_PROTO_MASK *p_disc_mask) 429dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{ 430dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFA_DM_DISC_TECH_PROTO_MASK disc_mask = 0; 431dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFA_LISTEN_CFG *p_cfg = &nfa_dm_cb.disc_cb.excl_listen_config; 432dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8 params[250], *p, xx; 433dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 434dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor NFA_TRACE_DEBUG0 ("nfa_dm_set_rf_listen_mode_raw_config ()"); 435dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 436dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* 437dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** Discovery Configuration Parameters for Listen A 438dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor */ 439dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if ( (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A] == NFA_DM_DISC_HOST_ID_DH) 440dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor &&(p_cfg->la_enable) ) 441dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 442dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor p = params; 443dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 444dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LA_BIT_FRAME_SDD); 445dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_BIT_FRAME_SDD); 446dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, p_cfg->la_bit_frame_sdd); 447dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 448dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LA_PLATFORM_CONFIG); 449dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_PLATFORM_CONFIG); 450dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, p_cfg->la_platform_config); 451dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 452dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LA_SEL_INFO); 453dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NCI_PARAM_LEN_LA_SEL_INFO); 454dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, p_cfg->la_sel_info); 455dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 456dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (p_cfg->la_platform_config == NCI_PARAM_PLATFORM_T1T) 457dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 458dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask |= NFA_DM_DISC_MASK_LA_T1T; 459dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 460dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else 461dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 462dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* If T4T or NFCDEP */ 463dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (p_cfg->la_sel_info & NCI_PARAM_SEL_INFO_ISODEP) 464dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 465dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask |= NFA_DM_DISC_MASK_LA_ISO_DEP; 466dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 467dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 468dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (p_cfg->la_sel_info & NCI_PARAM_SEL_INFO_NFCDEP) 469dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 470dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask |= NFA_DM_DISC_MASK_LA_NFC_DEP; 471dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 472dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 473dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* If neither, T4T nor NFCDEP, then its T2T */ 474dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (disc_mask == 0) 475dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 476dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask |= NFA_DM_DISC_MASK_LA_T2T; 477dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 478dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 479dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 480dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LA_NFCID1); 481dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, p_cfg->la_nfcid1_len); 482dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ARRAY_TO_STREAM (p, p_cfg->la_nfcid1, p_cfg->la_nfcid1_len); 483dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 484dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE); 485dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 486dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 487dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* 488dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** Discovery Configuration Parameters for Listen B 489dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor */ 490dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if ( (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_B] == NFA_DM_DISC_HOST_ID_DH) 491dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor &&(p_cfg->lb_enable) ) 492dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 493dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor p = params; 494dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 495dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LB_SENSB_INFO); 496dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NCI_PARAM_LEN_LB_SENSB_INFO); 497dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, p_cfg->lb_sensb_info); 498dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 499dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LB_NFCID0); 500dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, p_cfg->lb_nfcid0_len); 501dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ARRAY_TO_STREAM (p, p_cfg->lb_nfcid0, p_cfg->lb_nfcid0_len); 502dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 503dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LB_APPDATA); 504dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NCI_PARAM_LEN_LB_APPDATA); 505dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ARRAY_TO_STREAM (p, p_cfg->lb_app_data, NCI_PARAM_LEN_LB_APPDATA); 506dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 507dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LB_SFGI); 508dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, 1); 509dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, p_cfg->lb_adc_fo); 510dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 511dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LB_ADC_FO); 512dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NCI_PARAM_LEN_LB_ADC_FO); 513dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, p_cfg->lb_adc_fo); 514dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 515dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE); 516dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 517dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (p_cfg->lb_sensb_info & NCI_LISTEN_PROTOCOL_ISO_DEP) 518dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 519dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask |= NFA_DM_DISC_MASK_LB_ISO_DEP; 520dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 521dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 522dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 523dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* 524dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** Discovery Configuration Parameters for Listen F 525dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor */ 526dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if ( (nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_F] == NFA_DM_DISC_HOST_ID_DH) 527dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor &&(p_cfg->lf_enable) ) 528dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 529dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor p = params; 530dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 531dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LF_CON_BITR_F); 532dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, 1); 533dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, p_cfg->lf_con_bitr_f); 534dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 535dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LF_PROTOCOL); 536dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NCI_PARAM_LEN_LF_PROTOCOL); 537dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, p_cfg->lf_protocol_type); 538dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 539dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LF_T3T_FLAGS2); 540dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NCI_PARAM_LEN_LF_T3T_FLAGS2); 541dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT16_TO_STREAM(p, p_cfg->lf_t3t_flags); 542dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 543dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* if the bit at position X is set to 0, SC/NFCID2 with index X shall be ignored */ 544dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor for (xx = 0; xx < NFA_LF_MAX_SC_NFCID2; xx++) 545dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 546dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if ((p_cfg->lf_t3t_flags & (0x0001 << xx)) != 0x0000) 547dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 548dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LF_T3T_ID1 + xx); 549dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NCI_SYSTEMCODE_LEN + NCI_NFCID2_LEN); 550dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ARRAY_TO_STREAM (p, p_cfg->lf_t3t_identifier[xx], NCI_SYSTEMCODE_LEN + NCI_NFCID2_LEN); 551dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 552dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 553dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 554dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LF_T3T_PMM); 555dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NCI_PARAM_LEN_LF_T3T_PMM); 556dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ARRAY_TO_STREAM (p, p_cfg->lf_t3t_pmm, NCI_PARAM_LEN_LF_T3T_PMM); 557dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 558dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE); 559dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 560dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (p_cfg->lf_t3t_flags != NCI_LF_T3T_FLAGS2_ALL_DISABLED) 561dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 562dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask |= NFA_DM_DISC_MASK_LF_T3T; 563dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 564dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (p_cfg->lf_protocol_type & NCI_LISTEN_PROTOCOL_NFC_DEP) 565dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 566dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask |= NFA_DM_DISC_MASK_LF_NFC_DEP; 567dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 568dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 569dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 570dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* 571dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** Discovery Configuration Parameters for Listen ISO-DEP 572dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor */ 573dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if ((disc_mask & (NFA_DM_DISC_MASK_LA_ISO_DEP|NFA_DM_DISC_MASK_LB_ISO_DEP)) 574dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor &&(p_cfg->li_enable)) 575dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 576dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor p = params; 577dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 578dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_FWI); 579dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NCI_PARAM_LEN_FWI); 580dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, p_cfg->li_fwi); 581dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 582dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (disc_mask & NFA_DM_DISC_MASK_LA_ISO_DEP) 583dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 584dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LA_HIST_BY); 585dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, p_cfg->la_hist_bytes_len); 586dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ARRAY_TO_STREAM (p, p_cfg->la_hist_bytes, p_cfg->la_hist_bytes_len); 587dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 588dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 589dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (disc_mask & NFA_DM_DISC_MASK_LB_ISO_DEP) 590dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 591dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_LB_H_INFO); 592dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, p_cfg->lb_h_info_resp_len); 593dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ARRAY_TO_STREAM (p, p_cfg->lb_h_info_resp, p_cfg->lb_h_info_resp_len); 594dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 595dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 596dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE); 597dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 598dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 599dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* 600dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** Discovery Configuration Parameters for Listen NFC-DEP 601dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor */ 602dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if ( (disc_mask & (NFA_DM_DISC_MASK_LA_NFC_DEP|NFA_DM_DISC_MASK_LF_NFC_DEP)) 603dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor &&(p_cfg->ln_enable)) 604dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 605dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor p = params; 606dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 607dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_WT); 608dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NCI_PARAM_LEN_WT); 609dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, p_cfg->ln_wt); 610dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 611dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_ATR_RES_GEN_BYTES); 612dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, p_cfg->ln_atr_res_gen_bytes_len); 613dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ARRAY_TO_STREAM (p, p_cfg->ln_atr_res_gen_bytes, p_cfg->ln_atr_res_gen_bytes_len); 614dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 615dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, NFC_PMID_ATR_RSP_CONFIG); 616dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, 1); 617dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8_TO_STREAM (p, p_cfg->ln_atr_res_config); 618dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 619dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_check_set_config ((UINT8) (p - params), params, FALSE); 620dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 621dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 622dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor *p_disc_mask = disc_mask; 623dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 624dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor NFA_TRACE_DEBUG1 ("nfa_dm_set_rf_listen_mode_raw_config () disc_mask = 0x%x", disc_mask); 625dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor} 626dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 627dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/******************************************************************************* 628dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 629dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function nfa_dm_disc_get_disc_mask 630dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 631dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description Convert RF technology, mode and protocol to bit mask 632dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 633dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns tNFA_DM_DISC_TECH_PROTO_MASK 634dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 635dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/ 636dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic tNFA_DM_DISC_TECH_PROTO_MASK nfa_dm_disc_get_disc_mask (tNFC_RF_TECH_N_MODE tech_n_mode, 637dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFC_PROTOCOL protocol) 638dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{ 639dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Set initial disc_mask to legacy poll or listen */ 640dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFA_DM_DISC_TECH_PROTO_MASK disc_mask = ((tech_n_mode & 0x80) ? NFA_DM_DISC_MASK_L_LEGACY : NFA_DM_DISC_MASK_P_LEGACY); 641dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 642dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor switch (tech_n_mode) 643dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 644dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_DISCOVERY_TYPE_POLL_A: 645dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor switch (protocol) 646dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 647dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_PROTOCOL_T1T: 648dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask = NFA_DM_DISC_MASK_PA_T1T; 649dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 650dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_PROTOCOL_T2T: 651dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask = NFA_DM_DISC_MASK_PA_T2T; 652dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 653dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_PROTOCOL_ISO_DEP: 654dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask = NFA_DM_DISC_MASK_PA_ISO_DEP; 655dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 656dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_PROTOCOL_NFC_DEP: 657dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask = NFA_DM_DISC_MASK_PA_NFC_DEP; 658dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 659dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 660dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 661dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_DISCOVERY_TYPE_POLL_B: 662dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (protocol == NFC_PROTOCOL_ISO_DEP) 663dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask = NFA_DM_DISC_MASK_PB_ISO_DEP; 664dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 665dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_DISCOVERY_TYPE_POLL_F: 666dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (protocol == NFC_PROTOCOL_T3T) 667dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask = NFA_DM_DISC_MASK_PF_T3T; 668dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else if (protocol == NFC_PROTOCOL_NFC_DEP) 669dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask = NFA_DM_DISC_MASK_PF_NFC_DEP; 670dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 671dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_DISCOVERY_TYPE_POLL_ISO15693: 672dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask = NFA_DM_DISC_MASK_P_ISO15693; 673dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 674dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_DISCOVERY_TYPE_POLL_B_PRIME: 675dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask = NFA_DM_DISC_MASK_P_B_PRIME; 676dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 677dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_DISCOVERY_TYPE_POLL_KOVIO: 678dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask = NFA_DM_DISC_MASK_P_KOVIO; 679dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 680dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_DISCOVERY_TYPE_POLL_A_ACTIVE: 681dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask = NFA_DM_DISC_MASK_PAA_NFC_DEP; 682dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 683dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_DISCOVERY_TYPE_POLL_F_ACTIVE: 684dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask = NFA_DM_DISC_MASK_PFA_NFC_DEP; 685dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 686dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 687dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_DISCOVERY_TYPE_LISTEN_A: 688dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor switch (protocol) 689dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 690dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_PROTOCOL_T1T: 691dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask = NFA_DM_DISC_MASK_LA_T1T; 692dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 693dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_PROTOCOL_T2T: 694dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask = NFA_DM_DISC_MASK_LA_T2T; 695dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 696dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_PROTOCOL_ISO_DEP: 697dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask = NFA_DM_DISC_MASK_LA_ISO_DEP; 698dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 699dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_PROTOCOL_NFC_DEP: 700dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask = NFA_DM_DISC_MASK_LA_NFC_DEP; 701dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 702dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 703dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 704dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_DISCOVERY_TYPE_LISTEN_B: 705dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (protocol == NFC_PROTOCOL_ISO_DEP) 706dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask = NFA_DM_DISC_MASK_LB_ISO_DEP; 707dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 708dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_DISCOVERY_TYPE_LISTEN_F: 709dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (protocol == NFC_PROTOCOL_T3T) 710dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask = NFA_DM_DISC_MASK_LF_T3T; 711dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else if (protocol == NFC_PROTOCOL_NFC_DEP) 712dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask = NFA_DM_DISC_MASK_LF_NFC_DEP; 713dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 714dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_DISCOVERY_TYPE_LISTEN_ISO15693: 715dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask = NFA_DM_DISC_MASK_L_ISO15693; 716dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 717dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_DISCOVERY_TYPE_LISTEN_B_PRIME: 71836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines disc_mask = NFA_DM_DISC_MASK_L_B_PRIME; 719dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 720dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE: 721dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask = NFA_DM_DISC_MASK_LAA_NFC_DEP; 722dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 723dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE: 724dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_mask = NFA_DM_DISC_MASK_LFA_NFC_DEP; 725dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 726dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 727dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 728dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor NFA_TRACE_DEBUG3 ("nfa_dm_disc_get_disc_mask (): tech_n_mode:0x%X, protocol:0x%X, disc_mask:0x%X", 729dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tech_n_mode, protocol, disc_mask); 730dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return (disc_mask); 731dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor} 732dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 733dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/******************************************************************************* 734dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 735dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function nfa_dm_disc_discovery_cback 736dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 737dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description Discovery callback event from NFC 738dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 739dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns void 740dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 741dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/ 742dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_disc_discovery_cback (tNFC_DISCOVER_EVT event, tNFC_DISCOVER *p_data) 743dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{ 744dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFA_DM_RF_DISC_SM_EVENT dm_disc_event = NFA_DM_DISC_SM_MAX_EVENT; 745dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 746dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor NFA_TRACE_DEBUG1 ("nfa_dm_disc_discovery_cback (): event:0x%X", event); 747dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 748dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor switch (event) 749dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 750dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_START_DEVT: 751dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor dm_disc_event = NFA_DM_RF_DISCOVER_RSP; 752dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 753dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_RESULT_DEVT: 754dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor dm_disc_event = NFA_DM_RF_DISCOVER_NTF; 755dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 756dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_SELECT_DEVT: 757dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor dm_disc_event = NFA_DM_RF_DISCOVER_SELECT_RSP; 758dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 759dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_ACTIVATE_DEVT: 760dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor dm_disc_event = NFA_DM_RF_INTF_ACTIVATED_NTF; 761dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 762dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor case NFC_DEACTIVATE_DEVT: 763dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (p_data->deactivate.is_ntf) 764dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor dm_disc_event = NFA_DM_RF_DEACTIVATE_NTF; 765dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else 766dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor dm_disc_event = NFA_DM_RF_DEACTIVATE_RSP; 767dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 768dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor default: 769dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor NFA_TRACE_ERROR0 ("Unexpected event"); 770dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return; 771dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 772dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 773dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_disc_sm_execute (dm_disc_event, (tNFA_DM_RF_DISC_DATA *) p_data); 774dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor} 775dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 776dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/******************************************************************************* 777dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 778dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function nfa_dm_disc_notify_started 779dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 780dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description Report NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT or 781dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** NFA_RF_DISCOVERY_STARTED_EVT, if needed 782dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 783dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns void 784dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 785dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/ 786dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_disc_notify_started (tNFA_STATUS status) 787dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{ 788dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFA_CONN_EVT_DATA evt_data; 789dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 790dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_NOTIFY) 791dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 792dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_NOTIFY; 793dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 794dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor evt_data.status = status; 795dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 796dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) 797dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_conn_cback_event_notify (NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT, &evt_data); 798dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else 799dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_conn_cback_event_notify (NFA_RF_DISCOVERY_STARTED_EVT, &evt_data); 800dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 801dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor} 802dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 803dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/******************************************************************************* 804dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 805dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function nfa_dm_disc_conn_event_notify 806dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 807dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description Notify application of CONN_CBACK event, using appropriate 808dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** callback 809dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 810dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns nothing 811dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 812dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/ 813dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorvoid nfa_dm_disc_conn_event_notify (UINT8 event, tNFA_STATUS status) 814dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{ 815dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFA_CONN_EVT_DATA evt_data; 816dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 817dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_NOTIFY) 818dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 819dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_NOTIFY; 820dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor evt_data.status = status; 821dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 822dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE) 823dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 824dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Use exclusive RF mode callback */ 825dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.p_excl_conn_cback) 826dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor (*nfa_dm_cb.p_excl_conn_cback) (event, &evt_data); 827dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 828dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else 829dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 830dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor (*nfa_dm_cb.p_conn_cback) (event, &evt_data); 831dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 832dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 833dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor} 834dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 835dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/******************************************************************************* 836dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 837dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function nfa_dm_disc_force_to_idle 838dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 839dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description Force NFCC to idle state while waiting for deactivation NTF 840dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 841dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns tNFC_STATUS 842dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 843dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/ 844dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic tNFC_STATUS nfa_dm_disc_force_to_idle (void) 845dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{ 846dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFC_STATUS status = NFC_STATUS_SEMANTIC_ERROR; 847dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 848dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor NFA_TRACE_DEBUG1 ("nfa_dm_disc_force_to_idle() disc_flags = 0x%x", nfa_dm_cb.disc_cb.disc_flags); 849dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 850dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF) /* do not execute more than one */ 851dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 852dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.disc_flags &= ~(NFA_DM_DISC_FLAGS_W4_NTF); 853dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.disc_flags |= (NFA_DM_DISC_FLAGS_W4_RSP); 854dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 855dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor status = NFC_Deactivate (NFC_DEACTIVATE_TYPE_IDLE); 856dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 857dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 858dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return (status); 859dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor} 860dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 861dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/******************************************************************************* 862dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 863dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function nfa_dm_disc_deact_ntf_timeout_cback 864dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 865dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description Timeout while waiting for deactivation NTF 866dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 867dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns void 868dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 869dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/ 870dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_disc_deact_ntf_timeout_cback (TIMER_LIST_ENT *p_tle) 871dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{ 872dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor NFA_TRACE_ERROR0 ("nfa_dm_disc_deact_ntf_timeout_cback()"); 873dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 874dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_disc_force_to_idle(); 875dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor} 876dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 877dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/******************************************************************************* 878dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 879dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function nfa_dm_send_deactivate_cmd 880dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 881dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description Send deactivate command to NFCC, if needed. 882dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 883dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns NFC_STATUS_OK - deactivate cmd is sent 884dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** NCI_STATUS_FAILED - no buffers 885dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** NFC_STATUS_SEMANTIC_ERROR - this function does not attempt 886dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** to send deactivate cmd 887dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 888dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/ 889dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic tNFC_STATUS nfa_dm_send_deactivate_cmd (tNFC_DEACT_TYPE deactivate_type) 890dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{ 891dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFC_STATUS status = NFC_STATUS_SEMANTIC_ERROR; 892dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFA_DM_DISC_FLAGS w4_flags = nfa_dm_cb.disc_cb.disc_flags & (NFA_DM_DISC_FLAGS_W4_RSP|NFA_DM_DISC_FLAGS_W4_NTF); 893dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 894dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (!w4_flags) 895dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 896dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* if deactivate CMD was not sent to NFCC */ 897dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.disc_flags |= (NFA_DM_DISC_FLAGS_W4_RSP|NFA_DM_DISC_FLAGS_W4_NTF); 898dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 899dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor status = NFC_Deactivate (deactivate_type); 900dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 901dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (!nfa_dm_cb.disc_cb.tle.in_use) 902dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 903dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.tle.p_cback = (TIMER_CBACK *)nfa_dm_disc_deact_ntf_timeout_cback; 904dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_sys_start_timer (&nfa_dm_cb.disc_cb.tle, 0, NFA_DM_DISC_TIMEOUT_W4_DEACT_NTF); 905dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 906dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 907dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else 908dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 909dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (deactivate_type == NFC_DEACTIVATE_TYPE_SLEEP) 910dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 911dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor status = NFC_STATUS_SEMANTIC_ERROR; 912dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 913dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else if (nfa_dm_cb.disc_cb.tle.in_use) 914dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 915dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor status = NFC_STATUS_OK; 916dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 917dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else 918dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 919dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor status = nfa_dm_disc_force_to_idle (); 920dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 921dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 922dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 923dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return status; 924dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor} 925dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 926dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/******************************************************************************* 927dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 928dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function nfa_dm_start_rf_discover 929dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 930dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description Start RF discovery 931dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 932dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns void 933dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 934dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/ 935dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorvoid nfa_dm_start_rf_discover (void) 936dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{ 937dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFC_DISCOVER_PARAMS disc_params[NFA_DM_MAX_DISC_PARAMS]; 938dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFA_DM_DISC_TECH_PROTO_MASK dm_disc_mask = 0, poll_mask, listen_mask; 939dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8 num_params, xx; 940dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 941dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor NFA_TRACE_DEBUG0 ("nfa_dm_start_rf_discover ()"); 942dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Make sure that RF discovery was enabled, or some app has exclusive control */ 943dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if ( (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_ENABLED)) 944dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor &&(nfa_dm_cb.disc_cb.excl_disc_entry.in_use == FALSE) ) 945dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 946dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return; 947dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 948dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 949dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* get listen mode routing table for technology */ 950dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_ee_get_tech_route (NFA_EE_PWR_STATE_ON, nfa_dm_cb.disc_cb.listen_RT); 951dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 952dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) 953dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 954dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_set_rf_listen_mode_raw_config (&dm_disc_mask); 955dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor dm_disc_mask |= (nfa_dm_cb.disc_cb.excl_disc_entry.requested_disc_mask & NFA_DM_DISC_MASK_POLL); 956dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.excl_disc_entry.selected_disc_mask = dm_disc_mask; 957dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 958dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else 959dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 960dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Collect RF discovery request from sub-modules */ 961dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) 962dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 963dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.entry[xx].in_use) 964dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 965dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor poll_mask = (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask & NFA_DM_DISC_MASK_POLL); 966dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 967dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* clear poll mode technolgies and protocols which are already used by others */ 968dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor poll_mask &= ~(dm_disc_mask & NFA_DM_DISC_MASK_POLL); 969dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 970dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor listen_mask = 0; 971dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 972dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* 973dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** add listen mode technolgies and protocols if host ID is matched to listen mode routing table 974dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor */ 975dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 976dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* NFC-A */ 977dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.entry[xx].host_id == nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A]) 978dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 979dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask 980dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor & ( NFA_DM_DISC_MASK_LA_T1T 981dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_LA_T2T 982dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_LA_ISO_DEP 983dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_LA_NFC_DEP 984dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_LAA_NFC_DEP ); 985dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 986dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else 987dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 988dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* host can listen ISO-DEP based on AID routing */ 989dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor listen_mask |= (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask & NFA_DM_DISC_MASK_LA_ISO_DEP); 990dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 991dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* host can listen NFC-DEP based on protocol routing */ 992dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor listen_mask |= (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask & NFA_DM_DISC_MASK_LA_NFC_DEP); 993dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor listen_mask |= (nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask & NFA_DM_DISC_MASK_LAA_NFC_DEP); 994dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 995dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 996dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* NFC-B */ 997dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* multiple hosts can listen ISO-DEP based on AID routing */ 998dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask 999dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor & NFA_DM_DISC_MASK_LB_ISO_DEP; 1000dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1001dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* NFC-F */ 1002dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* NFCC can support NFC-DEP and T3T listening based on NFCID routing regardless of NFC-F tech routing */ 1003dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask 1004dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor & ( NFA_DM_DISC_MASK_LF_T3T 1005dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_LF_NFC_DEP 1006dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_LFA_NFC_DEP ); 1007dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1008dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* NFC-B Prime */ 1009dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.entry[xx].host_id == nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_BP]) 1010dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1011dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor listen_mask |= nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask 1012dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor & NFA_DM_DISC_MASK_L_B_PRIME; 1013dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1014dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1015dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* 1016dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** clear listen mode technolgies and protocols which are already used by others 1017dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor */ 1018dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1019dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Check if other modules are listening T1T or T2T */ 1020dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (dm_disc_mask & (NFA_DM_DISC_MASK_LA_T1T|NFA_DM_DISC_MASK_LA_T2T)) 1021dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1022dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor listen_mask &= ~( NFA_DM_DISC_MASK_LA_T1T 1023dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_LA_T2T 1024dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_LA_ISO_DEP 1025dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_LA_NFC_DEP ); 1026dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1027dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1028dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* T1T/T2T has priority on NFC-A */ 1029dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if ( (dm_disc_mask & (NFA_DM_DISC_MASK_LA_ISO_DEP|NFA_DM_DISC_MASK_LA_NFC_DEP)) 1030dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor &&(listen_mask & (NFA_DM_DISC_MASK_LA_T1T|NFA_DM_DISC_MASK_LA_T2T))) 1031dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1032dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor dm_disc_mask &= ~( NFA_DM_DISC_MASK_LA_ISO_DEP 1033dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_LA_NFC_DEP ); 1034dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1035dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1036dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Don't remove ISO-DEP because multiple hosts can listen ISO-DEP based on AID routing */ 1037dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1038dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Check if other modules are listening NFC-DEP */ 1039dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (dm_disc_mask & (NFA_DM_DISC_MASK_LA_NFC_DEP | NFA_DM_DISC_MASK_LAA_NFC_DEP)) 1040dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1041dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor listen_mask &= ~( NFA_DM_DISC_MASK_LA_NFC_DEP 1042dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_LAA_NFC_DEP ); 1043dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1044dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1045dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask = poll_mask | listen_mask; 1046dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1047dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor NFA_TRACE_DEBUG2 ("nfa_dm_cb.disc_cb.entry[%d].selected_disc_mask = 0x%x", 1048dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor xx, nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask); 1049dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1050dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor dm_disc_mask |= nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask; 1051dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1052dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1053dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1054dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Let P2P set GEN bytes for LLCP to NFCC */ 1055dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (dm_disc_mask & ( NFA_DM_DISC_MASK_PA_NFC_DEP 1056dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_PF_NFC_DEP 1057dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_LA_NFC_DEP 1058dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_LF_NFC_DEP 1059dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_PAA_NFC_DEP 1060dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_PFA_NFC_DEP 1061dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_LAA_NFC_DEP 1062dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor |NFA_DM_DISC_MASK_LFA_NFC_DEP )) 1063dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1064dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_p2p_set_config (dm_disc_mask); 1065dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1066dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1067dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1068dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor NFA_TRACE_DEBUG1 ("dm_disc_mask = 0x%x", dm_disc_mask); 1069dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1070dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Get Discovery Technology parameters */ 1071dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor num_params = nfa_dm_get_rf_discover_config (dm_disc_mask, disc_params, NFA_DM_MAX_DISC_PARAMS); 1072dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1073dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (num_params) 1074dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1075dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* 1076dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** NFCC will abort programming personality slots if not available. 1077dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** NFCC programs the personality slots in the following order of RF technologies: 1078dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** NFC-A, NFC-B, NFC-BP, NFC-I93 1079dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor */ 1080dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1081dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* if this is not for exclusive control */ 1082dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (!nfa_dm_cb.disc_cb.excl_disc_entry.in_use) 1083dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1084dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* update listening protocols in each NFC technology */ 1085dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_set_rf_listen_mode_config (dm_disc_mask); 1086dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1087dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1088dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Set polling duty cycle */ 1089dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_set_total_duration (); 1090dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.dm_disc_mask = dm_disc_mask; 1091dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1092dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor NFC_DiscoveryStart (num_params, disc_params, nfa_dm_disc_discovery_cback); 1093dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* set flag about waiting for response in IDLE state */ 1094dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP; 1095dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1096dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* register callback to get interface error NTF */ 1097dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor NFC_SetStaticRfCback (nfa_dm_disc_data_cback); 1098dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1099dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else 1100dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1101dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* RF discovery is started but there is no valid technology or protocol to discover */ 1102dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_disc_notify_started (NFA_STATUS_OK); 1103dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1104dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1105dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* if Kovio presence check timer is running, timeout callback will reset the activation information */ 1106dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if ( (nfa_dm_cb.disc_cb.activated_protocol != NFC_PROTOCOL_KOVIO) 1107dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ||(!nfa_dm_cb.disc_cb.kovio_tle.in_use) ) 1108dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1109dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* reset protocol and hanlde of activated sub-module */ 1110dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_INVALID; 1111dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_handle = NFA_HANDLE_INVALID; 1112dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1113dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor} 1114dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1115dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/******************************************************************************* 1116dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1117dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function nfa_dm_notify_discovery 1118dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1119dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description Send RF discovery notification to upper layer 1120dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1121dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns void 1122dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1123dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/ 1124dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_notify_discovery (tNFA_DM_RF_DISC_DATA *p_data) 1125dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{ 1126dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFA_CONN_EVT_DATA conn_evt; 1127dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1128dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* let application select a device */ 1129dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor conn_evt.disc_result.status = NFA_STATUS_OK; 1130dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor memcpy (&(conn_evt.disc_result.discovery_ntf), 1131dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor &(p_data->nfc_discover.result), 1132dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor sizeof (tNFC_RESULT_DEVT)); 1133dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1134dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_conn_cback_event_notify (NFA_DISC_RESULT_EVT, &conn_evt); 1135dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor} 1136dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1137dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1138dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/******************************************************************************* 1139dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1140dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function nfa_dm_disc_handle_kovio_activation 1141dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1142dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description Handle Kovio activation; whether it's new or repeated activation 1143dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1144dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns TRUE if repeated activation. No need to notify activated event to upper layer 1145dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1146dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/ 1147dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew KaylorBOOLEAN nfa_dm_disc_handle_kovio_activation (tNFC_DISCOVER *p_data, tNFA_DISCOVER_CBACK *p_disc_cback) 1148dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{ 1149dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFC_DISCOVER disc_data; 1150dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1151dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.kovio_tle.in_use) 1152dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1153dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* if this is new Kovio bar code tag */ 1154dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if ( (nfa_dm_cb.activated_nfcid_len != p_data->activate.rf_tech_param.param.pk.uid_len) 1155dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ||(memcmp (p_data->activate.rf_tech_param.param.pk.uid, 1156dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.activated_nfcid, nfa_dm_cb.activated_nfcid_len))) 1157dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1158dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor NFA_TRACE_DEBUG0 ("new Kovio tag is detected"); 1159dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1160dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* notify presence check failure for previous tag, if presence check is pending */ 1161dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_disc_report_kovio_presence_check (NFA_STATUS_FAILED); 1162dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1163dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* notify deactivation of previous activation before notifying new activation */ 1164dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (p_disc_cback) 1165dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1166dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE; 1167dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor (*(p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, &disc_data); 1168dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1169dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1170dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* restart timer */ 1171dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK); 1172dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1173dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else 1174dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1175dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* notify presence check ok, if presence check is pending */ 1176dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_disc_report_kovio_presence_check (NFC_STATUS_OK); 1177dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1178dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* restart timer and do not notify upper layer */ 1179dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK); 1180dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return (TRUE); 1181dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1182dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1183dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else 1184dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1185dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* this is the first activation, so start timer and notify upper layer */ 1186dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.kovio_tle.p_cback = (TIMER_CBACK *)nfa_dm_disc_kovio_timeout_cback; 1187dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK); 1188dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1189dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1190dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return (FALSE); 1191dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor} 1192dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1193dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/******************************************************************************* 1194dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1195dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function nfa_dm_disc_notify_activation 1196dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1197dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description Send RF activation notification to sub-module 1198dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1199dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns NFA_STATUS_OK if success 1200dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1201dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/ 1202dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic tNFA_STATUS nfa_dm_disc_notify_activation (tNFC_DISCOVER *p_data) 1203dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{ 1204dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8 xx, host_id_in_LRT; 1205dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor UINT8 iso_dep_t3t__listen = NFA_DM_DISC_NUM_ENTRIES; 1206dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1207dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFC_RF_TECH_N_MODE tech_n_mode = p_data->activate.rf_tech_param.mode; 1208dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFC_PROTOCOL protocol = p_data->activate.protocol; 1209dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1210dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFA_DM_DISC_TECH_PROTO_MASK activated_disc_mask; 1211dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1212dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor NFA_TRACE_DEBUG2 ("nfa_dm_disc_notify_activation (): tech_n_mode:0x%X, proto:0x%X", 1213dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tech_n_mode, protocol); 1214dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1215dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) 1216dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1217dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_tech_mode = tech_n_mode; 1218dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_rf_disc_id = p_data->activate.rf_disc_id; 1219dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_rf_interface = p_data->activate.intf_param.type; 1220dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_protocol = protocol; 1221dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_handle = NFA_HANDLE_INVALID; 1222dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1223dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (protocol == NFC_PROTOCOL_KOVIO) 1224dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1225dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* check whether it's new or repeated activation */ 1226dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_disc_handle_kovio_activation (p_data, nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) 1227dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1228dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* do not notify activation of Kovio to upper layer */ 1229dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return (NFA_STATUS_OK); 1230dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1231dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1232dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1233dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback) 1234dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) (NFA_DM_RF_DISC_ACTIVATED_EVT, p_data); 1235dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1236dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return (NFA_STATUS_OK); 1237dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1238dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1239dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* if this is NFCEE direct RF interface, notify activation to whoever listening UICC */ 1240dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (p_data->activate.intf_param.type == NFC_INTERFACE_EE_DIRECT_RF) 1241dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1242dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) 1243dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1244dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if ( (nfa_dm_cb.disc_cb.entry[xx].in_use) 1245dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor &&(nfa_dm_cb.disc_cb.entry[xx].host_id != NFA_DM_DISC_HOST_ID_DH)) 1246dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1247dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_rf_disc_id = p_data->activate.rf_disc_id; 1248dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_rf_interface = p_data->activate.intf_param.type; 1249dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_protocol = NFC_PROTOCOL_UNKNOWN; 1250dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_handle = xx; 1251dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1252dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor NFA_TRACE_DEBUG2 ("activated_rf_interface:0x%x, activated_handle: 0x%x", 1253dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_rf_interface, 1254dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_handle); 1255dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1256dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback) 1257dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_ACTIVATED_EVT, p_data); 1258dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1259dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return (NFA_STATUS_OK); 1260dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1261dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1262dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return (NFA_STATUS_FAILED); 1263dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1264dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1265dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* get bit mask of technolgies/mode and protocol */ 1266dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor activated_disc_mask = nfa_dm_disc_get_disc_mask (tech_n_mode, protocol); 1267dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1268dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* get host ID of technology from listen mode routing table */ 1269dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_A) 1270dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1271dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_A]; 1272dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1273dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_B) 1274dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1275dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_B]; 1276dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1277dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_F) 1278dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1279dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_F]; 1280dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1281dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else if (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_B_PRIME) 1282dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1283dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor host_id_in_LRT = nfa_dm_cb.disc_cb.listen_RT[NFA_DM_DISC_LRT_NFC_BP]; 1284dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1285dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else /* DH only */ 1286dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1287dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor host_id_in_LRT = NFA_DM_DISC_HOST_ID_DH; 1288dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1289dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1290dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (protocol == NFC_PROTOCOL_NFC_DEP) 1291dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1292dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Force NFC-DEP to the host */ 1293dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor host_id_in_LRT = NFA_DM_DISC_HOST_ID_DH; 1294dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1295dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1296dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) 1297dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1298dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* if any matching NFC technology and protocol */ 1299dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.entry[xx].in_use) 1300dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1301dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.entry[xx].host_id == host_id_in_LRT) 1302dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1303dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask & activated_disc_mask) 1304dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor break; 1305dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1306dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else 1307dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1308dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* check ISO-DEP listening even if host in LRT is not matched */ 1309dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (protocol == NFC_PROTOCOL_ISO_DEP) 1310dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1311dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if ( (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_A) 1312dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor &&(nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask & NFA_DM_DISC_MASK_LA_ISO_DEP)) 1313dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1314dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor iso_dep_t3t__listen = xx; 1315dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1316dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else if ( (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_B) 1317dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor &&(nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask & NFA_DM_DISC_MASK_LB_ISO_DEP)) 1318dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1319dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor iso_dep_t3t__listen = xx; 1320dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1321dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1322dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* check T3T listening even if host in LRT is not matched */ 1323dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else if (protocol == NFC_PROTOCOL_T3T) 1324dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1325dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if ( (tech_n_mode == NFC_DISCOVERY_TYPE_LISTEN_F) 1326dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor &&(nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask & NFA_DM_DISC_MASK_LF_T3T)) 1327dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1328dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor iso_dep_t3t__listen = xx; 1329dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1330dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1331dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1332dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1333dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1334dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1335dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (xx >= NFA_DM_DISC_NUM_ENTRIES) 1336dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1337dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* if any ISO-DEP or T3T listening even if host in LRT is not matched */ 1338dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor xx = iso_dep_t3t__listen; 1339dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1340dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1341dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (xx < NFA_DM_DISC_NUM_ENTRIES) 1342dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1343dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_tech_mode = tech_n_mode; 1344dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_rf_disc_id = p_data->activate.rf_disc_id; 1345dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_rf_interface = p_data->activate.intf_param.type; 1346dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_protocol = protocol; 1347dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_handle = xx; 1348dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1349dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor NFA_TRACE_DEBUG2 ("activated_protocol:0x%x, activated_handle: 0x%x", 1350dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_protocol, 1351dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_handle); 1352dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1353dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (protocol == NFC_PROTOCOL_KOVIO) 1354dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1355dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* check whether it's new or repeated activation */ 1356dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_disc_handle_kovio_activation (p_data, nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) 1357dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1358dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* do not notify activation of Kovio to upper layer */ 1359dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return (NFA_STATUS_OK); 1360dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1361dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1362dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1363dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback) 1364dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_ACTIVATED_EVT, p_data); 1365dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1366dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return (NFA_STATUS_OK); 1367dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1368dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else 1369dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1370dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_INVALID; 1371dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_handle = NFA_HANDLE_INVALID; 1372dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return (NFA_STATUS_FAILED); 1373dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1374dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor} 1375dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1376dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/******************************************************************************* 1377dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1378dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function nfa_dm_disc_notify_deactivation 1379dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1380dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description Send deactivation notification to sub-module 1381dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1382dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns None 1383dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1384dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/ 1385dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylorstatic void nfa_dm_disc_notify_deactivation (tNFA_DM_RF_DISC_SM_EVENT sm_event, 1386dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFC_DISCOVER *p_data) 1387dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{ 1388dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFA_HANDLE xx; 1389dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFA_CONN_EVT_DATA evt_data; 1390dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFC_DISCOVER disc_data; 1391dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1392dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor NFA_TRACE_DEBUG1 ("nfa_dm_disc_notify_deactivation (): activated_handle=%d", 1393dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_handle); 1394dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1395dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING) 1396dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1397dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor NFA_TRACE_DEBUG0 ("nfa_dm_disc_notify_deactivation (): for sleep wakeup"); 1398dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return; 1399dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1400dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1401dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (sm_event == NFA_DM_RF_DEACTIVATE_RSP) 1402dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1403dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* 1404dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** Activation has been aborted by upper layer in NFA_DM_RFST_W4_ALL_DISCOVERIES or NFA_DM_RFST_W4_HOST_SELECT 1405dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** Deactivation by upper layer or RF link loss in NFA_DM_RFST_LISTEN_SLEEP 1406dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ** No sub-module is activated at this state. 1407dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor */ 1408dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1409dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_LISTEN_SLEEP) 1410dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1411dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) 1412dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1413dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback) 1414dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1415dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE; 1416dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, &disc_data); 1417dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1418dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1419dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else 1420dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1421dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* let each sub-module handle deactivation */ 1422dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) 1423dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1424dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if ( (nfa_dm_cb.disc_cb.entry[xx].in_use) 1425dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor &&(nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask & NFA_DM_DISC_MASK_LISTEN) ) 1426dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1427dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE; 1428dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, &disc_data); 1429dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1430dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1431dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1432dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1433dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else if ( (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING)) 1434dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor ||(nfa_dm_cb.disc_cb.deact_notify_pending) ) 1435dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1436dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor xx = nfa_dm_cb.disc_cb.activated_handle; 1437dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1438dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* notify event to activated module if failed while reactivation */ 1439dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) 1440dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1441dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback) 1442dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1443dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE; 1444dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data); 1445dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1446dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1447dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else if ( (xx < NFA_DM_DISC_NUM_ENTRIES) 1448dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor &&(nfa_dm_cb.disc_cb.entry[xx].in_use) 1449dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor &&(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback) ) 1450dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1451dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data); 1452dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1453dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else 1454dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1455dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* notify deactivation to application if there is no activated module */ 1456dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE; 1457dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_conn_cback_event_notify (NFA_DEACTIVATED_EVT, &evt_data); 1458dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1459dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1460dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1461dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else 1462dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1463dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_KOVIO) 1464dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1465dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.kovio_tle.in_use) 1466dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1467dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* restart timer and do not notify upper layer */ 1468dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK); 1469dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return; 1470dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1471dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Otherwise, upper layer initiated deactivation. */ 1472dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1473dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1474dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* notify event to activated module */ 1475dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) 1476dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1477dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback) 1478dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1479dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor disc_data.deactivate.type = NFA_DEACTIVATE_TYPE_IDLE; 1480dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data); 1481dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1482dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1483dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor else 1484dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1485dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor xx = nfa_dm_cb.disc_cb.activated_handle; 1486dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1487dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if ((xx < NFA_DM_DISC_NUM_ENTRIES) && (nfa_dm_cb.disc_cb.entry[xx].in_use)) 1488dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1489dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback) 1490dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_DEACTIVATED_EVT, p_data); 1491dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1492dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1493dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1494dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1495dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* clear activated information */ 1496dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_tech_mode = 0; 1497dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_rf_disc_id = 0; 1498dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_rf_interface = 0; 1499dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_protocol = NFA_PROTOCOL_INVALID; 1500dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.activated_handle = NFA_HANDLE_INVALID; 1501dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.deact_notify_pending = FALSE; 1502dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor} 1503dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1504dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/******************************************************************************* 1505dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1506dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function nfa_dm_disc_sleep_wakeup 1507dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1508dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description Put tag to sleep, then wake it up. Can be used Perform 1509dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** legacy presence check or to wake up tag that went to HALT 1510dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** state 1511dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1512dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns TRUE if operation started 1513dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1514dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/ 1515dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew KaylortNFC_STATUS nfa_dm_disc_sleep_wakeup (void) 1516dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{ 1517dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor tNFC_STATUS status = NFC_STATUS_FAILED; 1518dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1519dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE) 1520dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1521dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* Deactivate to sleep mode */ 1522dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor status = nfa_dm_send_deactivate_cmd(NFC_DEACTIVATE_TYPE_SLEEP); 1523dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor if (status == NFC_STATUS_OK) 1524dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor { 1525dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor /* deactivate to sleep is sent on behalf of sleep wakeup. 1526dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor * set the sleep wakeup information in control block */ 1527dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_CHECKING; 1528dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor nfa_dm_cb.disc_cb.deact_pending = FALSE; 1529dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1530dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor } 1531dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1532dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return (status); 1533dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor} 1534dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1535dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/******************************************************************************* 1536dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1537dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function nfa_dm_is_p2p_paused 1538dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1539dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Description If NFA_PauseP2p is called sand still effective, 1540dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** this function returns TRUE. 1541dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1542dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Returns TRUE if NFA_SendRawFrame is called 1543dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1544dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor*******************************************************************************/ 1545dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew KaylorBOOLEAN nfa_dm_is_p2p_paused (void) 1546dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor{ 1547dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor return ((nfa_dm_cb.flags & NFA_DM_FLAGS_P2P_PAUSED) ? TRUE : FALSE); 1548dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor} 1549dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor 1550dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor/******************************************************************************* 1551dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** 1552dbbbccc3492aa7f91f21d8902cfb0b766dabb849Andrew Kaylor** Function nfa_dm_disc_end_sleep_wakeup 1553** 1554** Description Sleep Wakeup is complete 1555** 1556** Returns None 1557** 1558*******************************************************************************/ 1559static void nfa_dm_disc_end_sleep_wakeup (tNFC_STATUS status) 1560{ 1561 if ( (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_KOVIO) 1562 &&(nfa_dm_cb.disc_cb.kovio_tle.in_use) ) 1563 { 1564 /* ignore it while doing Kovio presence check */ 1565 return; 1566 } 1567 1568 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING) 1569 { 1570 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_CHECKING; 1571 1572 /* notify RW module that sleep wakeup is finished */ 1573 nfa_rw_handle_sleep_wakeup_rsp (status); 1574 1575 if (nfa_dm_cb.disc_cb.deact_pending) 1576 { 1577 nfa_dm_cb.disc_cb.deact_pending = FALSE; 1578 /* Perform pending deactivate command and on response notfiy deactivation */ 1579 nfa_dm_cb.disc_cb.deact_notify_pending = TRUE; 1580 nfa_dm_disc_sm_execute (NFA_DM_RF_DEACTIVATE_CMD, 1581 (tNFA_DM_RF_DISC_DATA *) &nfa_dm_cb.disc_cb.pending_deact_type); 1582 } 1583 } 1584} 1585 1586/******************************************************************************* 1587** 1588** Function nfa_dm_disc_kovio_timeout_cback 1589** 1590** Description Timeout for Kovio bar code tag presence check 1591** 1592** Returns void 1593** 1594*******************************************************************************/ 1595static void nfa_dm_disc_kovio_timeout_cback (TIMER_LIST_ENT *p_tle) 1596{ 1597 tNFC_DEACTIVATE_DEVT deact; 1598 1599 NFA_TRACE_DEBUG0 ("nfa_dm_disc_kovio_timeout_cback()"); 1600 1601 /* notify presence check failure, if presence check is pending */ 1602 nfa_dm_disc_report_kovio_presence_check (NFC_STATUS_FAILED); 1603 1604 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE) 1605 { 1606 /* restart timer in case that upper layer's presence check interval is too long */ 1607 nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK); 1608 } 1609 else 1610 { 1611 /* notify upper layer deactivated event */ 1612 deact.status = NFC_STATUS_OK; 1613 deact.type = NFC_DEACTIVATE_TYPE_DISCOVERY; 1614 deact.is_ntf = TRUE; 1615 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, (tNFC_DISCOVER*)&deact); 1616 } 1617} 1618 1619/******************************************************************************* 1620** 1621** Function nfa_dm_disc_start_kovio_presence_check 1622** 1623** Description Deactivate to discovery mode and wait for activation 1624** 1625** Returns TRUE if operation started 1626** 1627*******************************************************************************/ 1628tNFC_STATUS nfa_dm_disc_start_kovio_presence_check (void) 1629{ 1630 tNFC_STATUS status = NFC_STATUS_FAILED; 1631 1632 NFA_TRACE_DEBUG0 ("nfa_dm_disc_start_kovio_presence_check ()"); 1633 1634 if ( (nfa_dm_cb.disc_cb.activated_protocol == NFC_PROTOCOL_KOVIO) 1635 &&(nfa_dm_cb.disc_cb.kovio_tle.in_use) ) 1636 { 1637 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_POLL_ACTIVE) 1638 { 1639 /* restart timer */ 1640 nfa_sys_start_timer (&nfa_dm_cb.disc_cb.kovio_tle, 0, NFA_DM_DISC_TIMEOUT_KOVIO_PRESENCE_CHECK); 1641 1642 /* Deactivate to discovery mode */ 1643 status = nfa_dm_send_deactivate_cmd (NFC_DEACTIVATE_TYPE_DISCOVERY); 1644 1645 if (status == NFC_STATUS_OK) 1646 { 1647 /* deactivate to sleep is sent on behalf of sleep wakeup. 1648 * set the sleep wakeup information in control block */ 1649 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_CHECKING; 1650 nfa_dm_cb.disc_cb.deact_pending = FALSE; 1651 } 1652 } 1653 else 1654 { 1655 /* wait for next activation */ 1656 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_CHECKING; 1657 nfa_dm_cb.disc_cb.deact_pending = FALSE; 1658 status = NFC_STATUS_OK; 1659 } 1660 } 1661 1662 return (status); 1663} 1664 1665/******************************************************************************* 1666** 1667** Function nfa_dm_disc_report_kovio_presence_check 1668** 1669** Description Report Kovio presence check status 1670** 1671** Returns None 1672** 1673*******************************************************************************/ 1674static void nfa_dm_disc_report_kovio_presence_check (tNFC_STATUS status) 1675{ 1676 NFA_TRACE_DEBUG0 ("nfa_dm_disc_report_kovio_presence_check ()"); 1677 1678 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING) 1679 { 1680 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_CHECKING; 1681 1682 /* notify RW module that sleep wakeup is finished */ 1683 nfa_rw_handle_presence_check_rsp (status); 1684 1685 if (nfa_dm_cb.disc_cb.deact_pending) 1686 { 1687 nfa_dm_cb.disc_cb.deact_pending = FALSE; 1688 nfa_dm_disc_sm_execute (NFA_DM_RF_DEACTIVATE_CMD, 1689 (tNFA_DM_RF_DISC_DATA *) &nfa_dm_cb.disc_cb.pending_deact_type); 1690 } 1691 } 1692} 1693 1694/******************************************************************************* 1695** 1696** Function nfa_dm_disc_data_cback 1697** 1698** Description Monitoring interface error through data callback 1699** 1700** Returns void 1701** 1702*******************************************************************************/ 1703static void nfa_dm_disc_data_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data) 1704{ 1705 NFA_TRACE_DEBUG0 ("nfa_dm_disc_data_cback ()"); 1706 1707 /* if selection failed */ 1708 if (event == NFC_ERROR_CEVT) 1709 { 1710 nfa_dm_disc_sm_execute (NFA_DM_CORE_INTF_ERROR_NTF, NULL); 1711 } 1712 else if (event == NFC_DATA_CEVT) 1713 { 1714 GKI_freebuf (p_data->data.p_data); 1715 } 1716} 1717 1718/******************************************************************************* 1719** 1720** Function nfa_dm_disc_new_state 1721** 1722** Description Processing discovery events in NFA_DM_RFST_IDLE state 1723** 1724** Returns void 1725** 1726*******************************************************************************/ 1727void nfa_dm_disc_new_state (tNFA_DM_RF_DISC_STATE new_state) 1728{ 1729 tNFA_CONN_EVT_DATA evt_data; 1730 tNFA_DM_RF_DISC_STATE old_state = nfa_dm_cb.disc_cb.disc_state; 1731 1732#if (BT_TRACE_VERBOSE == TRUE) 1733 NFA_TRACE_DEBUG5 ("nfa_dm_disc_new_state (): old_state: %s (%d), new_state: %s (%d) disc_flags: 0x%x", 1734 nfa_dm_disc_state_2_str (nfa_dm_cb.disc_cb.disc_state), nfa_dm_cb.disc_cb.disc_state, 1735 nfa_dm_disc_state_2_str (new_state), new_state, nfa_dm_cb.disc_cb.disc_flags); 1736#else 1737 NFA_TRACE_DEBUG3 ("nfa_dm_disc_new_state(): old_state: %d, new_state: %d disc_flags: 0x%x", 1738 nfa_dm_cb.disc_cb.disc_state, new_state, nfa_dm_cb.disc_cb.disc_flags); 1739#endif 1740 1741 nfa_dm_cb.disc_cb.disc_state = new_state; 1742 1743 if ( (new_state == NFA_DM_RFST_IDLE) 1744 &&(!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) ) /* not error recovering */ 1745 { 1746 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING) 1747 { 1748 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_STOPPING; 1749 1750 /* if exclusive RF control is stopping */ 1751 if (nfa_dm_cb.flags & NFA_DM_FLAGS_EXCL_RF_ACTIVE) 1752 { 1753 if (old_state > NFA_DM_RFST_DISCOVERY) 1754 { 1755 /* notify deactivation to application */ 1756 evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE; 1757 nfa_dm_conn_cback_event_notify (NFA_DEACTIVATED_EVT, &evt_data); 1758 } 1759 1760 nfa_dm_rel_excl_rf_control_and_notify (); 1761 } 1762 else 1763 { 1764 evt_data.status = NFA_STATUS_OK; 1765 nfa_dm_conn_cback_event_notify (NFA_RF_DISCOVERY_STOPPED_EVT, &evt_data); 1766 } 1767 } 1768 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_DISABLING) 1769 { 1770 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_DISABLING; 1771 nfa_sys_check_disabled (); 1772 } 1773 } 1774} 1775 1776/******************************************************************************* 1777** 1778** Function nfa_dm_disc_sm_idle 1779** 1780** Description Processing discovery events in NFA_DM_RFST_IDLE state 1781** 1782** Returns void 1783** 1784*******************************************************************************/ 1785static void nfa_dm_disc_sm_idle (tNFA_DM_RF_DISC_SM_EVENT event, 1786 tNFA_DM_RF_DISC_DATA *p_data) 1787{ 1788 UINT8 xx; 1789 1790 switch (event) 1791 { 1792 case NFA_DM_RF_DISCOVER_CMD: 1793 nfa_dm_start_rf_discover (); 1794 break; 1795 1796 case NFA_DM_RF_DISCOVER_RSP: 1797 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP; 1798 1799 if (p_data->nfc_discover.status == NFC_STATUS_OK) 1800 { 1801 nfa_dm_disc_new_state (NFA_DM_RFST_DISCOVERY); 1802 1803 /* if RF discovery was stopped while waiting for response */ 1804 if (nfa_dm_cb.disc_cb.disc_flags & (NFA_DM_DISC_FLAGS_STOPPING|NFA_DM_DISC_FLAGS_DISABLING)) 1805 { 1806 /* stop discovery */ 1807 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP; 1808 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 1809 break; 1810 } 1811 1812 if (nfa_dm_cb.disc_cb.excl_disc_entry.in_use) 1813 { 1814 if (nfa_dm_cb.disc_cb.excl_disc_entry.disc_flags & NFA_DM_DISC_FLAGS_NOTIFY) 1815 { 1816 nfa_dm_cb.disc_cb.excl_disc_entry.disc_flags &= ~NFA_DM_DISC_FLAGS_NOTIFY; 1817 1818 if (nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback) 1819 (*(nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback)) (NFA_DM_RF_DISC_START_EVT, (tNFC_DISCOVER*) p_data); 1820 } 1821 } 1822 else 1823 { 1824 /* notify event to each module which is waiting for start */ 1825 for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) 1826 { 1827 /* if registered module is waiting for starting discovery */ 1828 if ( (nfa_dm_cb.disc_cb.entry[xx].in_use) 1829 &&(nfa_dm_cb.disc_cb.dm_disc_mask & nfa_dm_cb.disc_cb.entry[xx].selected_disc_mask) 1830 &&(nfa_dm_cb.disc_cb.entry[xx].disc_flags & NFA_DM_DISC_FLAGS_NOTIFY) ) 1831 { 1832 nfa_dm_cb.disc_cb.entry[xx].disc_flags &= ~NFA_DM_DISC_FLAGS_NOTIFY; 1833 1834 if (nfa_dm_cb.disc_cb.entry[xx].p_disc_cback) 1835 (*(nfa_dm_cb.disc_cb.entry[xx].p_disc_cback)) (NFA_DM_RF_DISC_START_EVT, (tNFC_DISCOVER*) p_data); 1836 } 1837 } 1838 1839 } 1840 nfa_dm_disc_notify_started (p_data->nfc_discover.status); 1841 } 1842 else 1843 { 1844 /* in rare case that the discovery states of NFCC and DH mismatch and NFCC rejects Discover Cmd 1845 * deactivate idle and then start disvocery when got deactivate rsp */ 1846 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP; 1847 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 1848 } 1849 break; 1850 1851 case NFA_DM_RF_DEACTIVATE_RSP: 1852 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP; 1853 1854 /* if NFCC goes to idle successfully */ 1855 if (p_data->nfc_discover.status == NFC_STATUS_OK) 1856 { 1857 /* if DH forced to go idle while waiting for deactivation NTF */ 1858 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) 1859 { 1860 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, &(p_data->nfc_discover)); 1861 1862 /* check any pending flags like NFA_DM_DISC_FLAGS_STOPPING or NFA_DM_DISC_FLAGS_DISABLING */ 1863 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 1864 /* check if need to restart discovery after resync discovery state with NFCC */ 1865 nfa_dm_start_rf_discover (); 1866 } 1867 /* Otherwise, deactivating when getting unexpected activation */ 1868 } 1869 /* Otherwise, wait for deactivation NTF */ 1870 break; 1871 1872 case NFA_DM_RF_DEACTIVATE_NTF: 1873 /* if NFCC sent this after NFCC had rejected deactivate CMD to idle while deactivating */ 1874 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) 1875 { 1876 if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_DISCOVERY) 1877 { 1878 /* stop discovery */ 1879 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP; 1880 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 1881 } 1882 else 1883 { 1884 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, &(p_data->nfc_discover)); 1885 /* check any pending flags like NFA_DM_DISC_FLAGS_STOPPING or NFA_DM_DISC_FLAGS_DISABLING */ 1886 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 1887 /* check if need to restart discovery after resync discovery state with NFCC */ 1888 nfa_dm_start_rf_discover (); 1889 } 1890 } 1891 /* Otherwise, deactivated when received unexpected activation in idle state */ 1892 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF; 1893 break; 1894 1895 case NFA_DM_RF_INTF_ACTIVATED_NTF: 1896 /* unexpected activation, deactivate to idle */ 1897 nfa_dm_cb.disc_cb.disc_flags |= (NFA_DM_DISC_FLAGS_W4_RSP|NFA_DM_DISC_FLAGS_W4_NTF); 1898 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 1899 break; 1900 1901 case NFA_DM_LP_LISTEN_CMD: 1902 nfa_dm_disc_new_state (NFA_DM_RFST_LP_LISTEN); 1903 break; 1904 1905 default: 1906 NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_idle (): Unexpected discovery event"); 1907 break; 1908 } 1909} 1910 1911/******************************************************************************* 1912** 1913** Function nfa_dm_disc_sm_discovery 1914** 1915** Description Processing discovery events in NFA_DM_RFST_DISCOVERY state 1916** 1917** Returns void 1918** 1919*******************************************************************************/ 1920static void nfa_dm_disc_sm_discovery (tNFA_DM_RF_DISC_SM_EVENT event, 1921 tNFA_DM_RF_DISC_DATA *p_data) 1922{ 1923 switch (event) 1924 { 1925 case NFA_DM_RF_DEACTIVATE_CMD: 1926 /* if deactivate CMD was not sent to NFCC */ 1927 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) 1928 { 1929 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP; 1930 NFC_Deactivate (p_data->deactivate_type); 1931 } 1932 break; 1933 case NFA_DM_RF_DEACTIVATE_RSP: 1934 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP; 1935 1936 /* if it's not race condition between deactivate CMD and activate NTF */ 1937 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) 1938 { 1939 /* do not notify deactivated to idle in RF discovery state 1940 ** because it is internal or stopping RF discovery 1941 */ 1942 1943 /* there was no activation while waiting for deactivation RSP */ 1944 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 1945 nfa_dm_start_rf_discover (); 1946 } 1947 break; 1948 case NFA_DM_RF_DISCOVER_NTF: 1949 nfa_dm_disc_new_state (NFA_DM_RFST_W4_ALL_DISCOVERIES); 1950 nfa_dm_notify_discovery (p_data); 1951 break; 1952 case NFA_DM_RF_INTF_ACTIVATED_NTF: 1953 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP) 1954 { 1955 NFA_TRACE_DEBUG0 ("RF Activated while waiting for deactivation RSP"); 1956 /* it's race condition. DH has to wait for deactivation NTF */ 1957 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_NTF; 1958 } 1959 else 1960 { 1961 if (p_data->nfc_discover.activate.intf_param.type == NFC_INTERFACE_EE_DIRECT_RF) 1962 { 1963 nfa_dm_disc_new_state (NFA_DM_RFST_LISTEN_ACTIVE); 1964 } 1965 else if (p_data->nfc_discover.activate.rf_tech_param.mode & 0x80) 1966 { 1967 /* Listen mode */ 1968 nfa_dm_disc_new_state (NFA_DM_RFST_LISTEN_ACTIVE); 1969 } 1970 else 1971 { 1972 /* Poll mode */ 1973 nfa_dm_disc_new_state (NFA_DM_RFST_POLL_ACTIVE); 1974 } 1975 1976 if (nfa_dm_disc_notify_activation (&(p_data->nfc_discover)) == NFA_STATUS_FAILED) 1977 { 1978 NFA_TRACE_DEBUG0 ("Not matched, restart discovery after receiving deactivate ntf"); 1979 1980 /* after receiving deactivate event, restart discovery */ 1981 nfa_dm_cb.disc_cb.disc_flags |= (NFA_DM_DISC_FLAGS_W4_RSP|NFA_DM_DISC_FLAGS_W4_NTF); 1982 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 1983 } 1984 } 1985 break; 1986 1987 case NFA_DM_RF_DEACTIVATE_NTF: 1988 /* if there was race condition between deactivate CMD and activate NTF */ 1989 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF) 1990 { 1991 /* race condition is resolved */ 1992 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF; 1993 1994 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) 1995 { 1996 /* do not notify deactivated to idle in RF discovery state 1997 ** because it is internal or stopping RF discovery 1998 */ 1999 2000 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 2001 nfa_dm_start_rf_discover (); 2002 } 2003 } 2004 break; 2005 case NFA_DM_LP_LISTEN_CMD: 2006 break; 2007 case NFA_DM_CORE_INTF_ERROR_NTF: 2008 break; 2009 default: 2010 NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_discovery (): Unexpected discovery event"); 2011 break; 2012 } 2013} 2014 2015/******************************************************************************* 2016** 2017** Function nfa_dm_disc_sm_w4_all_discoveries 2018** 2019** Description Processing discovery events in NFA_DM_RFST_W4_ALL_DISCOVERIES state 2020** 2021** Returns void 2022** 2023*******************************************************************************/ 2024static void nfa_dm_disc_sm_w4_all_discoveries (tNFA_DM_RF_DISC_SM_EVENT event, 2025 tNFA_DM_RF_DISC_DATA *p_data) 2026{ 2027 switch (event) 2028 { 2029 case NFA_DM_RF_DEACTIVATE_CMD: 2030 /* if deactivate CMD was not sent to NFCC */ 2031 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) 2032 { 2033 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP; 2034 /* only IDLE mode is allowed */ 2035 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 2036 } 2037 break; 2038 case NFA_DM_RF_DEACTIVATE_RSP: 2039 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP; 2040 /* notify exiting from w4 all discoverie state */ 2041 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_RSP, &(p_data->nfc_discover)); 2042 2043 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 2044 nfa_dm_start_rf_discover (); 2045 break; 2046 case NFA_DM_RF_DISCOVER_NTF: 2047 /* if deactivate CMD is already sent then ignore discover NTF */ 2048 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) 2049 { 2050 /* Notification Type = NCI_DISCOVER_NTF_LAST or NCI_DISCOVER_NTF_LAST_ABORT */ 2051 if (p_data->nfc_discover.result.more != NCI_DISCOVER_NTF_MORE) 2052 { 2053 nfa_dm_disc_new_state (NFA_DM_RFST_W4_HOST_SELECT); 2054 } 2055 nfa_dm_notify_discovery (p_data); 2056 } 2057 break; 2058 case NFA_DM_RF_INTF_ACTIVATED_NTF: 2059 /* 2060 ** This is only for ISO15693. 2061 ** FW sends activation NTF when all responses are received from tags without host selecting. 2062 */ 2063 nfa_dm_disc_new_state (NFA_DM_RFST_POLL_ACTIVE); 2064 2065 if (nfa_dm_disc_notify_activation (&(p_data->nfc_discover)) == NFA_STATUS_FAILED) 2066 { 2067 NFA_TRACE_DEBUG0 ("Not matched, restart discovery after receiving deactivate ntf"); 2068 2069 /* after receiving deactivate event, restart discovery */ 2070 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 2071 } 2072 break; 2073 default: 2074 NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_w4_all_discoveries (): Unexpected discovery event"); 2075 break; 2076 } 2077} 2078 2079/******************************************************************************* 2080** 2081** Function nfa_dm_disc_sm_w4_host_select 2082** 2083** Description Processing discovery events in NFA_DM_RFST_W4_HOST_SELECT state 2084** 2085** Returns void 2086** 2087*******************************************************************************/ 2088static void nfa_dm_disc_sm_w4_host_select (tNFA_DM_RF_DISC_SM_EVENT event, 2089 tNFA_DM_RF_DISC_DATA *p_data) 2090{ 2091 tNFA_CONN_EVT_DATA conn_evt; 2092 tNFA_DM_DISC_FLAGS old_sleep_wakeup_flag = (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING); 2093 BOOLEAN sleep_wakeup_event = FALSE; 2094 BOOLEAN sleep_wakeup_event_processed = FALSE; 2095 2096 switch (event) 2097 { 2098 case NFA_DM_RF_DISCOVER_SELECT_CMD: 2099 /* if not waiting to deactivate */ 2100 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) 2101 { 2102 NFC_DiscoverySelect (p_data->select.rf_disc_id, 2103 p_data->select.protocol, 2104 p_data->select.rf_interface); 2105 } 2106 else 2107 { 2108 nfa_dm_disc_conn_event_notify (NFA_SELECT_RESULT_EVT, NFA_STATUS_FAILED); 2109 } 2110 break; 2111 2112 case NFA_DM_RF_DISCOVER_SELECT_RSP: 2113 sleep_wakeup_event = TRUE; 2114 /* notify application status of selection */ 2115 if (p_data->nfc_discover.status == NFC_STATUS_OK) 2116 { 2117 sleep_wakeup_event_processed = TRUE; 2118 conn_evt.status = NFA_STATUS_OK; 2119 /* register callback to get interface error NTF */ 2120 NFC_SetStaticRfCback (nfa_dm_disc_data_cback); 2121 } 2122 else 2123 conn_evt.status = NFA_STATUS_FAILED; 2124 2125 if (!old_sleep_wakeup_flag) 2126 { 2127 nfa_dm_disc_conn_event_notify (NFA_SELECT_RESULT_EVT, p_data->nfc_discover.status); 2128 } 2129 break; 2130 case NFA_DM_RF_INTF_ACTIVATED_NTF: 2131 nfa_dm_disc_new_state (NFA_DM_RFST_POLL_ACTIVE); 2132 if (old_sleep_wakeup_flag) 2133 { 2134 /* Handle sleep wakeup success: notify RW module of sleep wakeup of tag; if deactivation is pending then deactivate */ 2135 nfa_dm_disc_end_sleep_wakeup (NFC_STATUS_OK); 2136 } 2137 else if (nfa_dm_disc_notify_activation (&(p_data->nfc_discover)) == NFA_STATUS_FAILED) 2138 { 2139 NFA_TRACE_DEBUG0 ("Not matched, restart discovery after receiving deactivate ntf"); 2140 2141 /* after receiving deactivate event, restart discovery */ 2142 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 2143 } 2144 break; 2145 case NFA_DM_RF_DEACTIVATE_CMD: 2146 if (old_sleep_wakeup_flag) 2147 { 2148 nfa_dm_cb.disc_cb.deact_pending = TRUE; 2149 nfa_dm_cb.disc_cb.pending_deact_type = p_data->deactivate_type; 2150 } 2151 /* if deactivate CMD was not sent to NFCC */ 2152 else if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP)) 2153 { 2154 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_W4_RSP; 2155 /* only IDLE mode is allowed */ 2156 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 2157 } 2158 break; 2159 case NFA_DM_RF_DEACTIVATE_RSP: 2160 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP; 2161 /* notify exiting from host select state */ 2162 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_RSP, &(p_data->nfc_discover)); 2163 2164 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 2165 nfa_dm_start_rf_discover (); 2166 break; 2167 2168 case NFA_DM_CORE_INTF_ERROR_NTF: 2169 sleep_wakeup_event = TRUE; 2170 if (!old_sleep_wakeup_flag) 2171 { 2172 /* target activation failed, upper layer may deactivate or select again */ 2173 conn_evt.status = NFA_STATUS_FAILED; 2174 nfa_dm_conn_cback_event_notify (NFA_SELECT_RESULT_EVT, &conn_evt); 2175 } 2176 break; 2177 default: 2178 NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_w4_host_select (): Unexpected discovery event"); 2179 break; 2180 } 2181 2182 if (old_sleep_wakeup_flag && sleep_wakeup_event && !sleep_wakeup_event_processed) 2183 { 2184 /* performing sleep wakeup and exception conditions happened 2185 * clear sleep wakeup information and report failure */ 2186 nfa_dm_disc_end_sleep_wakeup (NFC_STATUS_FAILED); 2187 } 2188} 2189 2190/******************************************************************************* 2191** 2192** Function nfa_dm_disc_sm_poll_active 2193** 2194** Description Processing discovery events in NFA_DM_RFST_POLL_ACTIVE state 2195** 2196** Returns void 2197** 2198*******************************************************************************/ 2199static void nfa_dm_disc_sm_poll_active (tNFA_DM_RF_DISC_SM_EVENT event, 2200 tNFA_DM_RF_DISC_DATA *p_data) 2201{ 2202 tNFC_STATUS status; 2203 tNFA_DM_DISC_FLAGS old_sleep_wakeup_flag = (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_CHECKING); 2204 BOOLEAN sleep_wakeup_event = FALSE; 2205 BOOLEAN sleep_wakeup_event_processed = FALSE; 2206 tNFC_DEACTIVATE_DEVT deact; 2207 2208 switch (event) 2209 { 2210 case NFA_DM_RF_DEACTIVATE_CMD: 2211 if (old_sleep_wakeup_flag) 2212 { 2213 /* sleep wakeup is already enabled when deactivate cmd is requested, 2214 * keep the information in control block to issue it later */ 2215 nfa_dm_cb.disc_cb.deact_pending = TRUE; 2216 nfa_dm_cb.disc_cb.pending_deact_type = p_data->deactivate_type; 2217 } 2218 else 2219 { 2220 status = nfa_dm_send_deactivate_cmd(p_data->deactivate_type); 2221 } 2222 2223 break; 2224 case NFA_DM_RF_DEACTIVATE_RSP: 2225 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP; 2226 /* register callback to get interface error NTF */ 2227 NFC_SetStaticRfCback (nfa_dm_disc_data_cback); 2228 2229 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) 2230 { 2231 /* it's race condition. received deactivate NTF before receiving RSP */ 2232 2233 deact.status = NFC_STATUS_OK; 2234 deact.type = NFC_DEACTIVATE_TYPE_IDLE; 2235 deact.is_ntf = TRUE; 2236 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, (tNFC_DISCOVER*)&deact); 2237 2238 /* NFCC is in IDLE state */ 2239 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 2240 nfa_dm_start_rf_discover (); 2241 } 2242 break; 2243 case NFA_DM_RF_DEACTIVATE_NTF: 2244 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF; 2245 2246 nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.tle); 2247 2248 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP) 2249 { 2250 /* it's race condition. received deactivate NTF before receiving RSP */ 2251 /* notify deactivation after receiving deactivate RSP */ 2252 NFA_TRACE_DEBUG0 ("Rx deactivate NTF while waiting for deactivate RSP"); 2253 break; 2254 } 2255 2256 sleep_wakeup_event = TRUE; 2257 2258 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, &(p_data->nfc_discover)); 2259 2260 if ( (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP) 2261 ||(p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP_AF) ) 2262 { 2263 nfa_dm_disc_new_state (NFA_DM_RFST_W4_HOST_SELECT); 2264 if (old_sleep_wakeup_flag) 2265 { 2266 sleep_wakeup_event_processed = TRUE; 2267 /* process pending deactivate request */ 2268 if (nfa_dm_cb.disc_cb.deact_pending) 2269 { 2270 /* notify RW module that sleep wakeup is finished */ 2271 /* if deactivation is pending then deactivate */ 2272 nfa_dm_disc_end_sleep_wakeup (NFC_STATUS_OK); 2273 2274 /* Notify NFA RW sub-systems because NFA_DM_RF_DEACTIVATE_RSP will not call this function */ 2275 nfa_rw_proc_disc_evt (NFA_DM_RF_DISC_DEACTIVATED_EVT, NULL, TRUE); 2276 } 2277 else 2278 { 2279 /* Successfully went to sleep mode for sleep wakeup */ 2280 /* Now wake up the tag to complete the operation */ 2281 NFC_DiscoverySelect (nfa_dm_cb.disc_cb.activated_rf_disc_id, 2282 nfa_dm_cb.disc_cb.activated_protocol, 2283 nfa_dm_cb.disc_cb.activated_rf_interface); 2284 } 2285 2286 } 2287 } 2288 else if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_IDLE) 2289 { 2290 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 2291 nfa_dm_start_rf_discover (); 2292 } 2293 else if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_DISCOVERY) 2294 { 2295 nfa_dm_disc_new_state (NFA_DM_RFST_DISCOVERY); 2296 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING) 2297 { 2298 /* stop discovery */ 2299 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 2300 } 2301 } 2302 break; 2303 2304 case NFA_DM_CORE_INTF_ERROR_NTF: 2305 sleep_wakeup_event = TRUE; 2306 if ( (!old_sleep_wakeup_flag) 2307 ||(!nfa_dm_cb.disc_cb.deact_pending) ) 2308 { 2309 nfa_dm_send_deactivate_cmd (NFA_DEACTIVATE_TYPE_DISCOVERY); 2310 } 2311 break; 2312 2313 default: 2314 NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_poll_active (): Unexpected discovery event"); 2315 break; 2316 } 2317 2318 if (old_sleep_wakeup_flag && sleep_wakeup_event && !sleep_wakeup_event_processed) 2319 { 2320 /* performing sleep wakeup and exception conditions happened 2321 * clear sleep wakeup information and report failure */ 2322 nfa_dm_disc_end_sleep_wakeup (NFC_STATUS_FAILED); 2323 } 2324} 2325 2326/******************************************************************************* 2327** 2328** Function nfa_dm_disc_sm_listen_active 2329** 2330** Description Processing discovery events in NFA_DM_RFST_LISTEN_ACTIVE state 2331** 2332** Returns void 2333** 2334*******************************************************************************/ 2335static void nfa_dm_disc_sm_listen_active (tNFA_DM_RF_DISC_SM_EVENT event, 2336 tNFA_DM_RF_DISC_DATA *p_data) 2337{ 2338 tNFC_DEACTIVATE_DEVT deact; 2339 2340 switch (event) 2341 { 2342 case NFA_DM_RF_DEACTIVATE_CMD: 2343 nfa_dm_send_deactivate_cmd(p_data->deactivate_type); 2344 break; 2345 case NFA_DM_RF_DEACTIVATE_RSP: 2346 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP; 2347 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) 2348 { 2349 /* it's race condition. received deactivate NTF before receiving RSP */ 2350 2351 deact.status = NFC_STATUS_OK; 2352 deact.type = NFC_DEACTIVATE_TYPE_IDLE; 2353 deact.is_ntf = TRUE; 2354 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, (tNFC_DISCOVER*)&deact); 2355 2356 /* NFCC is in IDLE state */ 2357 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 2358 nfa_dm_start_rf_discover (); 2359 } 2360 break; 2361 case NFA_DM_RF_DEACTIVATE_NTF: 2362 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF; 2363 2364 nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.tle); 2365 2366 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_RSP) 2367 { 2368 /* it's race condition. received deactivate NTF before receiving RSP */ 2369 /* notify deactivation after receiving deactivate RSP */ 2370 NFA_TRACE_DEBUG0 ("Rx deactivate NTF while waiting for deactivate RSP"); 2371 } 2372 else 2373 { 2374 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, &(p_data->nfc_discover)); 2375 2376 if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_IDLE) 2377 { 2378 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 2379 nfa_dm_start_rf_discover (); 2380 } 2381 else if ( (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP) 2382 ||(p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP_AF) ) 2383 { 2384 nfa_dm_disc_new_state (NFA_DM_RFST_LISTEN_SLEEP); 2385 } 2386 else if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_DISCOVERY) 2387 { 2388 /* Discovery */ 2389 nfa_dm_disc_new_state (NFA_DM_RFST_DISCOVERY); 2390 if (nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_STOPPING) 2391 { 2392 /* stop discovery */ 2393 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 2394 } 2395 } 2396 } 2397 break; 2398 2399 case NFA_DM_CORE_INTF_ERROR_NTF: 2400 break; 2401 default: 2402 NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_listen_active (): Unexpected discovery event"); 2403 break; 2404 } 2405} 2406 2407/******************************************************************************* 2408** 2409** Function nfa_dm_disc_sm_listen_sleep 2410** 2411** Description Processing discovery events in NFA_DM_RFST_LISTEN_SLEEP state 2412** 2413** Returns void 2414** 2415*******************************************************************************/ 2416static void nfa_dm_disc_sm_listen_sleep (tNFA_DM_RF_DISC_SM_EVENT event, 2417 tNFA_DM_RF_DISC_DATA *p_data) 2418{ 2419 switch (event) 2420 { 2421 case NFA_DM_RF_DEACTIVATE_CMD: 2422 nfa_dm_send_deactivate_cmd (p_data->deactivate_type); 2423 2424 /* if deactivate type is not discovery then NFCC will not sent deactivation NTF */ 2425 if (p_data->deactivate_type != NFA_DEACTIVATE_TYPE_DISCOVERY) 2426 { 2427 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_NTF; 2428 nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.tle); 2429 } 2430 break; 2431 case NFA_DM_RF_DEACTIVATE_RSP: 2432 nfa_dm_cb.disc_cb.disc_flags &= ~NFA_DM_DISC_FLAGS_W4_RSP; 2433 /* if deactivate type in CMD was IDLE */ 2434 if (!(nfa_dm_cb.disc_cb.disc_flags & NFA_DM_DISC_FLAGS_W4_NTF)) 2435 { 2436 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_RSP, &(p_data->nfc_discover)); 2437 2438 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 2439 nfa_dm_start_rf_discover (); 2440 } 2441 break; 2442 case NFA_DM_RF_DEACTIVATE_NTF: 2443 /* clear both W4_RSP and W4_NTF because of race condition between deactivat CMD and link loss */ 2444 nfa_dm_cb.disc_cb.disc_flags &= ~(NFA_DM_DISC_FLAGS_W4_RSP|NFA_DM_DISC_FLAGS_W4_NTF); 2445 nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.tle); 2446 2447 /* there is no active protocol in this state, so broadcast to all by using NFA_DM_RF_DEACTIVATE_RSP */ 2448 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_RSP, &(p_data->nfc_discover)); 2449 2450 if (p_data->nfc_discover.deactivate.type == NFC_DEACTIVATE_TYPE_IDLE) 2451 { 2452 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 2453 nfa_dm_start_rf_discover (); 2454 } 2455 else if (p_data->nfc_discover.deactivate.type == NFA_DEACTIVATE_TYPE_DISCOVERY) 2456 { 2457 nfa_dm_disc_new_state (NFA_DM_RFST_DISCOVERY); 2458 } 2459 else 2460 { 2461 NFA_TRACE_ERROR0 ("Unexpected deactivation type"); 2462 nfa_dm_disc_new_state (NFA_DM_RFST_IDLE); 2463 nfa_dm_start_rf_discover (); 2464 } 2465 break; 2466 case NFA_DM_RF_INTF_ACTIVATED_NTF: 2467 nfa_dm_disc_new_state (NFA_DM_RFST_LISTEN_ACTIVE); 2468 if (nfa_dm_disc_notify_activation (&(p_data->nfc_discover)) == NFA_STATUS_FAILED) 2469 { 2470 NFA_TRACE_DEBUG0 ("Not matched, restart discovery after receiving deactivate ntf"); 2471 2472 /* after receiving deactivate event, restart discovery */ 2473 NFC_Deactivate (NFA_DEACTIVATE_TYPE_IDLE); 2474 } 2475 break; 2476 default: 2477 NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_listen_sleep (): Unexpected discovery event"); 2478 break; 2479 } 2480} 2481 2482/******************************************************************************* 2483** 2484** Function nfa_dm_disc_sm_lp_listen 2485** 2486** Description Processing discovery events in NFA_DM_RFST_LP_LISTEN state 2487** 2488** Returns void 2489** 2490*******************************************************************************/ 2491static void nfa_dm_disc_sm_lp_listen (tNFA_DM_RF_DISC_SM_EVENT event, 2492 tNFA_DM_RF_DISC_DATA *p_data) 2493{ 2494 switch (event) 2495 { 2496 case NFA_DM_RF_INTF_ACTIVATED_NTF: 2497 nfa_dm_disc_new_state (NFA_DM_RFST_LP_ACTIVE); 2498 nfa_dm_disc_notify_activation (&(p_data->nfc_discover)); 2499 if (nfa_dm_disc_notify_activation (&(p_data->nfc_discover)) == NFA_STATUS_FAILED) 2500 { 2501 NFA_TRACE_DEBUG0 ("Not matched, unexpected activation"); 2502 } 2503 break; 2504 2505 default: 2506 NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_lp_listen (): Unexpected discovery event"); 2507 break; 2508 } 2509} 2510 2511/******************************************************************************* 2512** 2513** Function nfa_dm_disc_sm_lp_active 2514** 2515** Description Processing discovery events in NFA_DM_RFST_LP_ACTIVE state 2516** 2517** Returns void 2518** 2519*******************************************************************************/ 2520static void nfa_dm_disc_sm_lp_active (tNFA_DM_RF_DISC_SM_EVENT event, 2521 tNFA_DM_RF_DISC_DATA *p_data) 2522{ 2523 switch (event) 2524 { 2525 case NFA_DM_RF_DEACTIVATE_NTF: 2526 nfa_dm_disc_new_state (NFA_DM_RFST_LP_LISTEN); 2527 nfa_dm_disc_notify_deactivation (NFA_DM_RF_DEACTIVATE_NTF, &(p_data->nfc_discover)); 2528 break; 2529 default: 2530 NFA_TRACE_ERROR0 ("nfa_dm_disc_sm_lp_active (): Unexpected discovery event"); 2531 break; 2532 } 2533} 2534 2535/******************************************************************************* 2536** 2537** Function nfa_dm_disc_sm_execute 2538** 2539** Description Processing discovery related events 2540** 2541** Returns void 2542** 2543*******************************************************************************/ 2544void nfa_dm_disc_sm_execute (tNFA_DM_RF_DISC_SM_EVENT event, tNFA_DM_RF_DISC_DATA *p_data) 2545{ 2546#if (BT_TRACE_VERBOSE == TRUE) 2547 NFA_TRACE_DEBUG5 ("nfa_dm_disc_sm_execute (): state: %s (%d), event: %s(%d) disc_flags: 0x%x", 2548 nfa_dm_disc_state_2_str (nfa_dm_cb.disc_cb.disc_state), nfa_dm_cb.disc_cb.disc_state, 2549 nfa_dm_disc_event_2_str (event), event, nfa_dm_cb.disc_cb.disc_flags); 2550#else 2551 NFA_TRACE_DEBUG3 ("nfa_dm_disc_sm_execute(): state: %d, event:%d disc_flags: 0x%x", 2552 nfa_dm_cb.disc_cb.disc_state, event, nfa_dm_cb.disc_cb.disc_flags); 2553#endif 2554 2555 switch (nfa_dm_cb.disc_cb.disc_state) 2556 { 2557 /* RF Discovery State - Idle */ 2558 case NFA_DM_RFST_IDLE: 2559 nfa_dm_disc_sm_idle (event, p_data); 2560 break; 2561 2562 /* RF Discovery State - Discovery */ 2563 case NFA_DM_RFST_DISCOVERY: 2564 nfa_dm_disc_sm_discovery (event, p_data); 2565 break; 2566 2567 /*RF Discovery State - Wait for all discoveries */ 2568 case NFA_DM_RFST_W4_ALL_DISCOVERIES: 2569 nfa_dm_disc_sm_w4_all_discoveries (event, p_data); 2570 break; 2571 2572 /* RF Discovery State - Wait for host selection */ 2573 case NFA_DM_RFST_W4_HOST_SELECT: 2574 nfa_dm_disc_sm_w4_host_select (event, p_data); 2575 break; 2576 2577 /* RF Discovery State - Poll mode activated */ 2578 case NFA_DM_RFST_POLL_ACTIVE: 2579 nfa_dm_disc_sm_poll_active (event, p_data); 2580 break; 2581 2582 /* RF Discovery State - listen mode activated */ 2583 case NFA_DM_RFST_LISTEN_ACTIVE: 2584 nfa_dm_disc_sm_listen_active (event, p_data); 2585 break; 2586 2587 /* RF Discovery State - listen mode sleep */ 2588 case NFA_DM_RFST_LISTEN_SLEEP: 2589 nfa_dm_disc_sm_listen_sleep (event, p_data); 2590 break; 2591 2592 /* Listening in Low Power mode */ 2593 case NFA_DM_RFST_LP_LISTEN: 2594 nfa_dm_disc_sm_lp_listen (event, p_data); 2595 break; 2596 2597 /* Activated in Low Power mode */ 2598 case NFA_DM_RFST_LP_ACTIVE: 2599 nfa_dm_disc_sm_lp_active (event, p_data); 2600 break; 2601 } 2602#if (BT_TRACE_VERBOSE == TRUE) 2603 NFA_TRACE_DEBUG3 ("nfa_dm_disc_sm_execute (): new state: %s (%d), disc_flags: 0x%x", 2604 nfa_dm_disc_state_2_str (nfa_dm_cb.disc_cb.disc_state), nfa_dm_cb.disc_cb.disc_state, 2605 nfa_dm_cb.disc_cb.disc_flags); 2606#else 2607 NFA_TRACE_DEBUG2 ("nfa_dm_disc_sm_execute(): new state: %d, disc_flags: 0x%x", 2608 nfa_dm_cb.disc_cb.disc_state, nfa_dm_cb.disc_cb.disc_flags); 2609#endif 2610} 2611 2612/******************************************************************************* 2613** 2614** Function nfa_dm_add_rf_discover 2615** 2616** Description Add discovery configuration and callback function 2617** 2618** Returns valid handle if success 2619** 2620*******************************************************************************/ 2621tNFA_HANDLE nfa_dm_add_rf_discover (tNFA_DM_DISC_TECH_PROTO_MASK disc_mask, 2622 tNFA_DM_DISC_HOST_ID host_id, 2623 tNFA_DISCOVER_CBACK *p_disc_cback) 2624{ 2625 UINT8 xx; 2626 2627 NFA_TRACE_DEBUG1 ("nfa_dm_add_rf_discover () disc_mask=0x%x", disc_mask); 2628 2629 for (xx = 0; xx < NFA_DM_DISC_NUM_ENTRIES; xx++) 2630 { 2631 if (!nfa_dm_cb.disc_cb.entry[xx].in_use) 2632 { 2633 nfa_dm_cb.disc_cb.entry[xx].in_use = TRUE; 2634 nfa_dm_cb.disc_cb.entry[xx].requested_disc_mask = disc_mask; 2635 nfa_dm_cb.disc_cb.entry[xx].host_id = host_id; 2636 nfa_dm_cb.disc_cb.entry[xx].p_disc_cback = p_disc_cback; 2637 nfa_dm_cb.disc_cb.entry[xx].disc_flags = NFA_DM_DISC_FLAGS_NOTIFY; 2638 return xx; 2639 } 2640 } 2641 2642 return NFA_HANDLE_INVALID; 2643} 2644 2645/******************************************************************************* 2646** 2647** Function nfa_dm_start_excl_discovery 2648** 2649** Description Start exclusive RF discovery 2650** 2651** Returns void 2652** 2653*******************************************************************************/ 2654void nfa_dm_start_excl_discovery (tNFA_TECHNOLOGY_MASK poll_tech_mask, 2655 tNFA_LISTEN_CFG *p_listen_cfg, 2656 tNFA_DISCOVER_CBACK *p_disc_cback) 2657{ 2658 tNFA_DM_DISC_TECH_PROTO_MASK poll_disc_mask = 0; 2659 2660 NFA_TRACE_DEBUG0 ("nfa_dm_start_excl_discovery ()"); 2661 2662 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_A) 2663 { 2664 poll_disc_mask |= NFA_DM_DISC_MASK_PA_T1T; 2665 poll_disc_mask |= NFA_DM_DISC_MASK_PA_T2T; 2666 poll_disc_mask |= NFA_DM_DISC_MASK_PA_ISO_DEP; 2667 poll_disc_mask |= NFA_DM_DISC_MASK_PA_NFC_DEP; 2668 poll_disc_mask |= NFA_DM_DISC_MASK_P_LEGACY; 2669 } 2670 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_A_ACTIVE) 2671 { 2672 poll_disc_mask |= NFA_DM_DISC_MASK_PAA_NFC_DEP; 2673 } 2674 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_B) 2675 { 2676 poll_disc_mask |= NFA_DM_DISC_MASK_PB_ISO_DEP; 2677 } 2678 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_F) 2679 { 2680 poll_disc_mask |= NFA_DM_DISC_MASK_PF_T3T; 2681 poll_disc_mask |= NFA_DM_DISC_MASK_PF_NFC_DEP; 2682 } 2683 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_F_ACTIVE) 2684 { 2685 poll_disc_mask |= NFA_DM_DISC_MASK_PFA_NFC_DEP; 2686 } 2687 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_ISO15693) 2688 { 2689 poll_disc_mask |= NFA_DM_DISC_MASK_P_ISO15693; 2690 } 2691 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_B_PRIME) 2692 { 2693 poll_disc_mask |= NFA_DM_DISC_MASK_P_B_PRIME; 2694 } 2695 if (poll_tech_mask & NFA_TECHNOLOGY_MASK_KOVIO) 2696 { 2697 poll_disc_mask |= NFA_DM_DISC_MASK_P_KOVIO; 2698 } 2699 2700 nfa_dm_cb.disc_cb.excl_disc_entry.in_use = TRUE; 2701 nfa_dm_cb.disc_cb.excl_disc_entry.requested_disc_mask = poll_disc_mask; 2702 nfa_dm_cb.disc_cb.excl_disc_entry.host_id = NFA_DM_DISC_HOST_ID_DH; 2703 nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback = p_disc_cback; 2704 nfa_dm_cb.disc_cb.excl_disc_entry.disc_flags = NFA_DM_DISC_FLAGS_NOTIFY; 2705 2706 memcpy (&nfa_dm_cb.disc_cb.excl_listen_config, p_listen_cfg, sizeof (tNFA_LISTEN_CFG)); 2707 2708 nfa_dm_disc_sm_execute (NFA_DM_RF_DISCOVER_CMD, NULL); 2709} 2710 2711/******************************************************************************* 2712** 2713** Function nfa_dm_stop_excl_discovery 2714** 2715** Description Stop exclusive RF discovery 2716** 2717** Returns void 2718** 2719*******************************************************************************/ 2720void nfa_dm_stop_excl_discovery (void) 2721{ 2722 NFA_TRACE_DEBUG0 ("nfa_dm_stop_excl_discovery ()"); 2723 2724 nfa_dm_cb.disc_cb.excl_disc_entry.in_use = FALSE; 2725 nfa_dm_cb.disc_cb.excl_disc_entry.p_disc_cback = NULL; 2726} 2727 2728/******************************************************************************* 2729** 2730** Function nfa_dm_delete_rf_discover 2731** 2732** Description Remove discovery configuration and callback function 2733** 2734** Returns void 2735** 2736*******************************************************************************/ 2737void nfa_dm_delete_rf_discover (tNFA_HANDLE handle) 2738{ 2739 NFA_TRACE_DEBUG1 ("nfa_dm_delete_rf_discover () handle=0x%x", handle); 2740 2741 if (handle < NFA_DM_DISC_NUM_ENTRIES) 2742 { 2743 nfa_dm_cb.disc_cb.entry[handle].in_use = FALSE; 2744 } 2745 else 2746 { 2747 NFA_TRACE_ERROR0 ("Invalid discovery handle"); 2748 } 2749} 2750 2751/******************************************************************************* 2752** 2753** Function nfa_dm_rf_discover_select 2754** 2755** Description Select target, protocol and RF interface 2756** 2757** Returns void 2758** 2759*******************************************************************************/ 2760void nfa_dm_rf_discover_select (UINT8 rf_disc_id, 2761 tNFA_NFC_PROTOCOL protocol, 2762 tNFA_INTF_TYPE rf_interface) 2763{ 2764 tNFA_DM_DISC_SELECT_PARAMS select_params; 2765 tNFA_CONN_EVT_DATA conn_evt; 2766 2767 NFA_TRACE_DEBUG3 ("nfa_dm_disc_select () rf_disc_id:0x%X, protocol:0x%X, rf_interface:0x%X", 2768 rf_disc_id, protocol, rf_interface); 2769 2770 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_W4_HOST_SELECT) 2771 { 2772 /* state is OK: notify the status when the response is received from NFCC */ 2773 select_params.rf_disc_id = rf_disc_id; 2774 select_params.protocol = protocol; 2775 select_params.rf_interface = rf_interface; 2776 2777 nfa_dm_cb.disc_cb.disc_flags |= NFA_DM_DISC_FLAGS_NOTIFY; 2778 nfa_dm_disc_sm_execute (NFA_DM_RF_DISCOVER_SELECT_CMD, (tNFA_DM_RF_DISC_DATA *) &select_params); 2779 } 2780 else 2781 { 2782 /* Wrong state: notify failed status right away */ 2783 conn_evt.status = NFA_STATUS_FAILED; 2784 nfa_dm_conn_cback_event_notify (NFA_SELECT_RESULT_EVT, &conn_evt); 2785 } 2786} 2787 2788/******************************************************************************* 2789** 2790** Function nfa_dm_rf_deactivate 2791** 2792** Description Deactivate NFC link 2793** 2794** Returns NFA_STATUS_OK if success 2795** 2796*******************************************************************************/ 2797tNFA_STATUS nfa_dm_rf_deactivate (tNFA_DEACTIVATE_TYPE deactivate_type) 2798{ 2799 NFA_TRACE_DEBUG1 ("nfa_dm_rf_deactivate () deactivate_type:0x%X", deactivate_type); 2800 2801 if (deactivate_type == NFA_DEACTIVATE_TYPE_SLEEP) 2802 { 2803 if (nfa_dm_cb.disc_cb.activated_protocol == NFA_PROTOCOL_NFC_DEP) 2804 deactivate_type = NFC_DEACTIVATE_TYPE_SLEEP_AF; 2805 else 2806 deactivate_type = NFC_DEACTIVATE_TYPE_SLEEP; 2807 } 2808 2809 if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_IDLE) 2810 { 2811 return NFA_STATUS_FAILED; 2812 } 2813 else if (nfa_dm_cb.disc_cb.disc_state == NFA_DM_RFST_DISCOVERY) 2814 { 2815 if (deactivate_type == NFA_DEACTIVATE_TYPE_DISCOVERY) 2816 { 2817 if (nfa_dm_cb.disc_cb.kovio_tle.in_use) 2818 { 2819 nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.kovio_tle); 2820 nfa_dm_disc_kovio_timeout_cback (&nfa_dm_cb.disc_cb.kovio_tle); 2821 return NFA_STATUS_OK; 2822 } 2823 else 2824 { 2825 /* it could be race condition. */ 2826 NFA_TRACE_DEBUG0 ("nfa_dm_rf_deactivate (): already in discovery state"); 2827 return NFA_STATUS_FAILED; 2828 } 2829 } 2830 else if (deactivate_type == NFA_DEACTIVATE_TYPE_IDLE) 2831 { 2832 if (nfa_dm_cb.disc_cb.kovio_tle.in_use) 2833 { 2834 nfa_sys_stop_timer (&nfa_dm_cb.disc_cb.kovio_tle); 2835 nfa_dm_disc_kovio_timeout_cback (&nfa_dm_cb.disc_cb.kovio_tle); 2836 } 2837 nfa_dm_disc_sm_execute (NFA_DM_RF_DEACTIVATE_CMD, (tNFA_DM_RF_DISC_DATA *) &deactivate_type); 2838 return NFA_STATUS_OK; 2839 } 2840 else 2841 { 2842 return NFA_STATUS_FAILED; 2843 } 2844 } 2845 else 2846 { 2847 nfa_dm_disc_sm_execute (NFA_DM_RF_DEACTIVATE_CMD, (tNFA_DM_RF_DISC_DATA *) &deactivate_type); 2848 return NFA_STATUS_OK; 2849 } 2850} 2851 2852#if (BT_TRACE_VERBOSE == TRUE) 2853/******************************************************************************* 2854** 2855** Function nfa_dm_disc_state_2_str 2856** 2857** Description convert nfc discovery state to string 2858** 2859*******************************************************************************/ 2860static char *nfa_dm_disc_state_2_str (UINT8 state) 2861{ 2862 switch (state) 2863 { 2864 case NFA_DM_RFST_IDLE: 2865 return "IDLE"; 2866 2867 case NFA_DM_RFST_DISCOVERY: 2868 return "DISCOVERY"; 2869 2870 case NFA_DM_RFST_W4_ALL_DISCOVERIES: 2871 return "W4_ALL_DISCOVERIES"; 2872 2873 case NFA_DM_RFST_W4_HOST_SELECT: 2874 return "W4_HOST_SELECT"; 2875 2876 case NFA_DM_RFST_POLL_ACTIVE: 2877 return "POLL_ACTIVE"; 2878 2879 case NFA_DM_RFST_LISTEN_ACTIVE: 2880 return "LISTEN_ACTIVE"; 2881 2882 case NFA_DM_RFST_LISTEN_SLEEP: 2883 return "LISTEN_SLEEP"; 2884 2885 case NFA_DM_RFST_LP_LISTEN: 2886 return "LP_LISTEN"; 2887 2888 case NFA_DM_RFST_LP_ACTIVE: 2889 return "LP_ACTIVE"; 2890 } 2891 return "Unknown"; 2892} 2893 2894/******************************************************************************* 2895** 2896** Function nfa_dm_disc_event_2_str 2897** 2898** Description convert nfc discovery RSP/NTF to string 2899** 2900*******************************************************************************/ 2901static char *nfa_dm_disc_event_2_str (UINT8 event) 2902{ 2903 switch (event) 2904 { 2905 case NFA_DM_RF_DISCOVER_CMD: 2906 return "DISCOVER_CMD"; 2907 2908 case NFA_DM_RF_DISCOVER_RSP: 2909 return "DISCOVER_RSP"; 2910 2911 case NFA_DM_RF_DISCOVER_NTF: 2912 return "DISCOVER_NTF"; 2913 2914 case NFA_DM_RF_DISCOVER_SELECT_CMD: 2915 return "SELECT_CMD"; 2916 2917 case NFA_DM_RF_DISCOVER_SELECT_RSP: 2918 return "SELECT_RSP"; 2919 2920 case NFA_DM_RF_INTF_ACTIVATED_NTF: 2921 return "ACTIVATED_NTF"; 2922 2923 case NFA_DM_RF_DEACTIVATE_CMD: 2924 return "DEACTIVATE_CMD"; 2925 2926 case NFA_DM_RF_DEACTIVATE_RSP: 2927 return "DEACTIVATE_RSP"; 2928 2929 case NFA_DM_RF_DEACTIVATE_NTF: 2930 return "DEACTIVATE_NTF"; 2931 2932 case NFA_DM_LP_LISTEN_CMD: 2933 return "NFA_DM_LP_LISTEN_CMD"; 2934 2935 case NFA_DM_CORE_INTF_ERROR_NTF: 2936 return "INTF_ERROR_NTF"; 2937 2938 } 2939 return "Unknown"; 2940} 2941#endif /* BT_TRACE_VERBOSE */ 2942