1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu * Copyright (C) 2011-2014 Broadcom Corporation 4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * you may not use this file except in compliance with the License. 7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * You may obtain a copy of the License at: 8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * See the License for the specific language governing permissions and 15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * limitations under the License. 16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * This file contains the action functions the NFA_CE state machine. 22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h> 258a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach 268a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include <android-base/stringprintf.h> 278a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include <base/logging.h> 288a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach 296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "ce_api.h" 306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "ndef_utils.h" 31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_ce_int.h" 32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_mem_co.h" 339343bf46e1ffabdd10973a3b71baa503567e319dRuchi Kandoi 34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE) 35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_ee_int.h" 36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 388a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbachusing android::base::StringPrintf; 398a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach 408a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbachextern bool nfc_debug_enabled; 418a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach 42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project* Protocol-specific event handlers 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_handle_t3t_evt 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handler for Type-3 tag card emulation events 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ce_handle_t3t_evt(tCE_EVENT event, tCE_DATA* p_ce_data) { 566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CE_CB* p_cb = &nfa_ce_cb; 576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CONN_EVT_DATA conn_evt; 58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 596767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 606767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("nfa_ce_handle_t3t_evt: event 0x%x", event); 61641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna /* For the felica on host for nfcFcallback */ 62641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna for (uint8_t idx = 0; idx < NFA_CE_LISTEN_INFO_IDX_INVALID; idx++) { 63641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna if ((p_cb->listen_info[idx].flags & NFA_CE_LISTEN_INFO_IN_USE) && 64641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna (p_cb->listen_info[idx].flags & NFA_CE_LISTEN_INFO_FELICA) && 65641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna (p_cb->listen_info[idx].flags & NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND)) { 66641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna p_cb->idx_cur_active = idx; 67641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna p_cb->p_active_conn_cback = 68641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna p_cb->listen_info[p_cb->idx_cur_active].p_conn_cback; 69641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna break; 70641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna } 71641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna } 726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (event) { 73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case CE_T3T_NDEF_UPDATE_START_EVT: 746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify app using callback associated with the active ndef */ 756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->idx_cur_active == NFA_CE_LISTEN_INFO_IDX_NDEF) { 766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.status = NFA_STATUS_OK; 776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_cb->p_active_conn_cback)(NFA_CE_NDEF_WRITE_START_EVT, &conn_evt); 786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 796767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf( 806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "nfa_ce_handle_t3t_evt: got CE_T3T_UPDATE_START_EVT, but no active " 816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "NDEF"); 826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case CE_T3T_NDEF_UPDATE_CPLT_EVT: 866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify app using callback associated with the active ndef */ 876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->idx_cur_active == NFA_CE_LISTEN_INFO_IDX_NDEF) { 886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ndef_write_cplt.status = NFA_STATUS_OK; 896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ndef_write_cplt.len = p_ce_data->update_info.length; 906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ndef_write_cplt.p_data = p_ce_data->update_info.p_data; 916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_cb->p_active_conn_cback)(NFA_CE_NDEF_WRITE_CPLT_EVT, &conn_evt); 926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 936767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf( 946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "nfa_ce_handle_t3t_evt: got CE_T3T_UPDATE_CPLT_EVT, but no active " 956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "NDEF"); 966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case CE_T3T_RAW_FRAME_EVT: 1006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->idx_cur_active == NFA_CE_LISTEN_INFO_IDX_NDEF) { 1016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.data.status = p_ce_data->raw_frame.status; 1026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.data.p_data = (uint8_t*)(p_ce_data->raw_frame.p_data + 1) + 1036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ce_data->raw_frame.p_data->offset; 1046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.data.len = p_ce_data->raw_frame.p_data->len; 1056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_cb->p_active_conn_cback)(NFA_DATA_EVT, &conn_evt); 1066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 107641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna /* If we have not notified the app of activation, do so now */ 108641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna if (p_cb->listen_info[p_cb->idx_cur_active].flags & 109641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND) { 110641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna p_cb->listen_info[p_cb->idx_cur_active].flags &= 111641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna ~NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND; 112641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna 113641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna conn_evt.ce_activated.handle = 114641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)p_cb->idx_cur_active); 115641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna memcpy(&(conn_evt.ce_activated.activate_ntf), 116641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna &p_cb->activation_params, sizeof(tNFC_ACTIVATE_DEVT)); 117641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna conn_evt.ce_activated.status = NFA_STATUS_OK; 118641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna 119641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna (*p_cb->p_active_conn_cback)(NFA_CE_ACTIVATED_EVT, &conn_evt); 120641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna } 121641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna /* Notify app of t3t raw data */ 1226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ce_data.status = p_ce_data->raw_frame.status; 1236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ce_data.handle = 1246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)p_cb->idx_cur_active)); 1256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ce_data.p_data = (uint8_t*)(p_ce_data->raw_frame.p_data + 1) + 1266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ce_data->raw_frame.p_data->offset; 1276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ce_data.len = p_ce_data->raw_frame.p_data->len; 1286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_cb->p_active_conn_cback)(NFA_CE_DATA_EVT, &conn_evt); 1296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_ce_data->raw_frame.p_data); 1316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 1346767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf( 1356767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi "nfa_ce_handle_t3t_evt unhandled event=0x%02x", event); 1366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 1376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_handle_t4t_evt 143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handler for Type-4 tag card emulation events (for NDEF case) 145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ce_handle_t4t_evt(tCE_EVENT event, tCE_DATA* p_ce_data) { 1506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CE_CB* p_cb = &nfa_ce_cb; 1516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CONN_EVT_DATA conn_evt; 152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1536767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 1546767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("nfa_ce_handle_t4t_evt: event 0x%x", event); 1556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* AID for NDEF selected. we had notified the app of activation. */ 1576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->idx_cur_active = NFA_CE_LISTEN_INFO_IDX_NDEF; 1586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[p_cb->idx_cur_active].flags & 1596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_T4T_ACTIVATE_PND) { 1606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->p_active_conn_cback = 1616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[p_cb->idx_cur_active].p_conn_cback; 1626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (event) { 165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case CE_T4T_NDEF_UPDATE_START_EVT: 1666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.status = NFA_STATUS_OK; 1676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_cb->p_active_conn_cback)(NFA_CE_NDEF_WRITE_START_EVT, &conn_evt); 1686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case CE_T4T_NDEF_UPDATE_CPLT_EVT: 1716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ndef_write_cplt.len = p_ce_data->update_info.length; 1726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ndef_write_cplt.p_data = p_ce_data->update_info.p_data; 173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (NDEF_MsgValidate(p_ce_data->update_info.p_data, 1756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ce_data->update_info.length, true) != NDEF_OK) 1766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ndef_write_cplt.status = NFA_STATUS_FAILED; 1776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else 1786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ndef_write_cplt.status = NFA_STATUS_OK; 179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_cb->p_active_conn_cback)(NFA_CE_NDEF_WRITE_CPLT_EVT, &conn_evt); 1816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case CE_T4T_NDEF_UPDATE_ABORT_EVT: 1846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ndef_write_cplt.len = 0; 1856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ndef_write_cplt.status = NFA_STATUS_FAILED; 1866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ndef_write_cplt.p_data = NULL; 1876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_cb->p_active_conn_cback)(NFA_CE_NDEF_WRITE_CPLT_EVT, &conn_evt); 1886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 1916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* CE_T4T_RAW_FRAME_EVT is not used in NFA CE */ 1926767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf( 1936767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi "nfa_ce_handle_t4t_evt unhandled event=0x%02x", event); 1946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 1956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_handle_t4t_aid_evt 201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handler for Type-4 tag AID events (for AIDs registered using 203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFA_CeRegisterT4tAidOnDH) 204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ce_handle_t4t_aid_evt(tCE_EVENT event, tCE_DATA* p_ce_data) { 2096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CE_CB* p_cb = &nfa_ce_cb; 2106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t listen_info_idx; 2116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CONN_EVT_DATA conn_evt; 2126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2136767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 2146767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("nfa_ce_handle_t4t_aid_evt: event 0x%x", event); 2156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Get listen_info for this aid callback */ 2176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (listen_info_idx = 0; listen_info_idx < NFA_CE_LISTEN_INFO_IDX_INVALID; 2186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi listen_info_idx++) { 2196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_cb->listen_info[listen_info_idx].flags & 2206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_IN_USE) && 2216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->listen_info[listen_info_idx].flags & 2226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_T4T_AID) && 2236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->listen_info[listen_info_idx].t4t_aid_handle == 2246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ce_data->raw_frame.aid_handle)) { 2256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->idx_cur_active = listen_info_idx; 2266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->p_active_conn_cback = 2276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[p_cb->idx_cur_active].p_conn_cback; 2286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (event == CE_T4T_RAW_FRAME_EVT) { 2336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (listen_info_idx != NFA_CE_LISTEN_INFO_IDX_INVALID) { 2346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Found listen_info entry */ 2356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ce_activated.handle = 2366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)p_cb->idx_cur_active); 2376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If we have not notified the app of activation, do so now */ 2396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[p_cb->idx_cur_active].flags & 2406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_T4T_ACTIVATE_PND) { 2416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[p_cb->idx_cur_active].flags &= 2426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ~NFA_CE_LISTEN_INFO_T4T_ACTIVATE_PND; 2436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memcpy(&(conn_evt.ce_activated.activate_ntf), &p_cb->activation_params, 2456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sizeof(tNFC_ACTIVATE_DEVT)); 2466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ce_activated.status = NFA_STATUS_OK; 2476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_cb->p_active_conn_cback)(NFA_CE_ACTIVATED_EVT, &conn_evt); 2486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify app of AID data */ 2516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ce_data.status = p_ce_data->raw_frame.status; 2526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ce_data.handle = 2536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)p_cb->idx_cur_active); 2546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ce_data.p_data = (uint8_t*)(p_ce_data->raw_frame.p_data + 1) + 2556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ce_data->raw_frame.p_data->offset; 2566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ce_data.len = p_ce_data->raw_frame.p_data->len; 2576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_cb->p_active_conn_cback)(NFA_CE_DATA_EVT, &conn_evt); 2586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 2596767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf( 2606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "nfa_ce_handle_t4t_aid_evt: unable to find listen_info for aid hdl " 2616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "%i", 2626767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi p_ce_data->raw_frame.aid_handle); 263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_ce_data->raw_frame.p_data); 2666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project* Discovery configuration and discovery event handlers 271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_discovery_cback 276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Processing event from discovery callback 278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns None 280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ce_discovery_cback(tNFA_DM_RF_DISC_EVT event, tNFC_DISCOVER* p_data) { 2836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CE_MSG ce_msg; 2846767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event:0x%02X", event); 285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (event) { 287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFA_DM_RF_DISC_START_EVT: 2886767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf( 2896767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi "nfa_ce_handle_disc_start (status=0x%x)", p_data->start); 2906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFA_DM_RF_DISC_ACTIVATED_EVT: 2936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ce_msg.activate_ntf.hdr.event = NFA_CE_ACTIVATE_NTF_EVT; 2946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ce_msg.activate_ntf.p_activation_params = &p_data->activate; 2956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_hdl_event((NFC_HDR*)&ce_msg); 2966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFA_DM_RF_DISC_DEACTIVATED_EVT: 2996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* DM broadcasts deactivaiton event in listen sleep state, so check before 3006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * processing */ 3016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfa_ce_cb.flags & NFA_CE_FLAGS_LISTEN_ACTIVE_SLEEP) { 3026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ce_msg.hdr.event = NFA_CE_DEACTIVATE_NTF_EVT; 3036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ce_msg.hdr.layer_specific = p_data->deactivate.type; 3046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_hdl_event((NFC_HDR*)&ce_msg); 3056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 3066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 3096767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf("Unexpected event"); 3106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 3116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_ce_t3t_set_listen_params 317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Set t3t listening parameters 319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfc_ce_t3t_set_listen_params(void) { 3246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t i; 3256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CE_CB* p_cb = &nfa_ce_cb; 32653d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna uint8_t tlv[128], *p_params; 3276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t tlv_size; 3286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t t3t_flags2_mask = 0xFFFF; /* Mask of which T3T_IDs are disabled */ 3296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t t3t_idx = 0; 33053d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna uint8_t adv_Feat = 1; 33153d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna uint8_t t3tPMM[NCI_T3T_PMM_LEN] = {0xFF, 0xFF, 0xFF, 0xFF, 33253d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna 0xFF, 0xFF, 0xFF, 0xFF}; 3336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Point to start of tlv buffer */ 3356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_params = tlv; 3366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Set system code and NFCID2 */ 3386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (i = 0; i < NFA_CE_LISTEN_INFO_MAX; i++) { 3396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_IN_USE) && 3406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->listen_info[i].protocol_mask & NFA_PROTOCOL_MASK_T3T)) { 3416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Set tag's system code and NFCID2 */ 3426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p_params, NFC_PMID_LF_T3T_ID1 + t3t_idx); /* type */ 34353d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna /* length */ 34453d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna UINT8_TO_STREAM(p_params, NCI_PARAM_LEN_LF_T3T_ID(NFC_GetNCIVersion())); 3456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* System Code */ 3466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_BE_STREAM(p_params, p_cb->listen_info[i].t3t_system_code); 3476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_BE_STREAM(p_params, p_cb->listen_info[i].t3t_nfcid2, 3486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_RF_F_UID_LEN); 34953d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna if (NFC_GetNCIVersion() == NCI_VERSION_2_0) { 35053d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna ARRAY_TO_BE_STREAM(p_params, p_cb->listen_info[i].t3t_pmm, 35153d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna NCI_T3T_PMM_LEN); 35253d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna } 3536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Set mask for this ID */ 3546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi t3t_flags2_mask &= ~((uint16_t)(1 << t3t_idx)); 3556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi t3t_idx++; 356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* For NCI draft 22+, the polarity of NFC_PMID_LF_T3T_FLAGS2 is flipped */ 3606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi t3t_flags2_mask = ~t3t_flags2_mask; 361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p_params, NFC_PMID_LF_T3T_FLAGS2); /* type */ 3636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p_params, NCI_PARAM_LEN_LF_T3T_FLAGS2); /* length */ 3646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Mask of IDs to disable listening */ 3656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM(p_params, t3t_flags2_mask); 366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 36753d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna if (NFC_GetNCIVersion() == NCI_VERSION_2_0) { 36853d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna /*Name changed in NCI2.0*/ 36953d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna UINT8_TO_STREAM(p_params, NCI_PARAM_ID_LF_T3T_RD_ALLOWED); /* type */ 37053d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna UINT8_TO_STREAM(p_params, NCI_PARAM_LEN_LF_T3T_RD_ALLOWED); /* length */ 37153d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna } else { 37253d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna UINT8_TO_STREAM(p_params, NCI_PARAM_ID_LF_CON_ADV_FEAT); /* type */ 37353d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna UINT8_TO_STREAM(p_params, NCI_PARAM_LEN_LF_CON_ADV_FEAT); /* length */ 37453d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna } 37553d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna UINT8_TO_STREAM(p_params, adv_Feat); 37653d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna 37753d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna if (NFC_GetNCIVersion() != NCI_VERSION_2_0) { 37853d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna UINT8_TO_STREAM(p_params, NCI_PARAM_ID_LF_T3T_PMM); /* type */ 37953d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna UINT8_TO_STREAM(p_params, NCI_PARAM_LEN_LF_T3T_PMM); /* length */ 38053d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna ARRAY_TO_BE_STREAM(p_params, t3tPMM, NCI_T3T_PMM_LEN); 38153d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna } 3826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tlv_size = (uint8_t)(p_params - tlv); 383d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna if (appl_dta_mode_flag == 0x01) { 384d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna nfa_dm_cb.eDtaMode |= NFA_DTA_HCEF_MODE; 385d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna } 3866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_dm_check_set_config(tlv_size, (uint8_t*)tlv, false); 387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_t3t_generate_rand_nfcid 392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Generate a random NFCID2 for Type-3 tag 394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ce_t3t_generate_rand_nfcid(uint8_t nfcid2[NCI_RF_F_UID_LEN]) { 3996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint32_t rand_seed = GKI_get_tick_count(); 4006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* For Type-3 tag, nfcid2 starts witn 02:fe */ 4026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfcid2[0] = 0x02; 4036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfcid2[1] = 0xFE; 4046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* The remaining 6 bytes are random */ 4066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfcid2[2] = (uint8_t)(rand_seed & 0xFF); 4076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfcid2[3] = (uint8_t)(rand_seed >> 8 & 0xFF); 4086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rand_seed >>= (rand_seed & 3); 4096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfcid2[4] = (uint8_t)(rand_seed & 0xFF); 4106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfcid2[5] = (uint8_t)(rand_seed >> 8 & 0xFF); 4116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rand_seed >>= (rand_seed & 3); 4126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfcid2[6] = (uint8_t)(rand_seed & 0xFF); 4136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfcid2[7] = (uint8_t)(rand_seed >> 8 & 0xFF); 414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_start_listening 419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Start listening 421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFA_STATUS_OK if successful 423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 4256fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS nfa_ce_start_listening(void) { 4266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_DM_DISC_TECH_PROTO_MASK listen_mask; 4276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CE_CB* p_cb = &nfa_ce_cb; 4286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_HANDLE disc_handle; 4296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t listen_info_idx; 4306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /*************************************************************************/ 4326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Construct protocol preference list to listen for */ 4336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* First, get protocol preference for active NDEF (if any) */ 4356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags & 4366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_IN_USE) && 4376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle == 4386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_HANDLE_INVALID)) { 4396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi listen_mask = 0; 4406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].protocol_mask & 4426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_PROTOCOL_MASK_T3T) { 4436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* set T3T config params */ 4446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ce_t3t_set_listen_params(); 4456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi listen_mask |= NFA_DM_DISC_MASK_LF_T3T; 4476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].protocol_mask & 4506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_PROTOCOL_MASK_ISO_DEP) { 4516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi listen_mask |= nfa_ce_cb.isodep_disc_mask; 4526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi disc_handle = nfa_dm_add_rf_discover(listen_mask, NFA_DM_DISC_HOST_ID_DH, 4556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_discovery_cback); 456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (disc_handle == NFA_HANDLE_INVALID) 4586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 4596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else 4606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle = 4616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi disc_handle; 4626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Next, add protocols from non-NDEF, if any */ 4656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (listen_info_idx = 0; listen_info_idx < NFA_CE_LISTEN_INFO_IDX_INVALID; 4666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi listen_info_idx++) { 4676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* add RF discovery to DM only if it is not added yet */ 4686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_cb->listen_info[listen_info_idx].flags & 4696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_IN_USE) && 4706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->listen_info[listen_info_idx].rf_disc_handle == 4716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_HANDLE_INVALID)) { 4726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[listen_info_idx].flags & 4736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_FELICA) { 4746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* set T3T config params */ 4756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ce_t3t_set_listen_params(); 4766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi disc_handle = nfa_dm_add_rf_discover(NFA_DM_DISC_MASK_LF_T3T, 4786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_DM_DISC_HOST_ID_DH, 4796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_discovery_cback); 480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (disc_handle == NFA_HANDLE_INVALID) 4826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 4846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].rf_disc_handle = disc_handle; 4856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->listen_info[listen_info_idx].flags & 4866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_T4T_AID) { 4876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi disc_handle = nfa_dm_add_rf_discover(nfa_ce_cb.isodep_disc_mask, 4886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_DM_DISC_HOST_ID_DH, 4896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_discovery_cback); 490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (disc_handle == NFA_HANDLE_INVALID) 4926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 4936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else 4946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].rf_disc_handle = disc_handle; 4956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE) 4976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (p_cb->listen_info[listen_info_idx].flags & 4986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_UICC) { 4996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi listen_mask = 0; 5006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfa_ee_is_active(p_cb->listen_info[listen_info_idx].ee_handle)) { 5016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[listen_info_idx].tech_mask & 5026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_TECHNOLOGY_MASK_A) { 5036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi listen_mask |= NFA_DM_DISC_MASK_LA_ISO_DEP; 5046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 5056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[listen_info_idx].tech_mask & 5066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_TECHNOLOGY_MASK_B) { 5076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi listen_mask |= NFA_DM_DISC_MASK_LB_ISO_DEP; 5086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 5096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[listen_info_idx].tech_mask & 5106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_TECHNOLOGY_MASK_F) { 5116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi listen_mask |= NFA_DM_DISC_MASK_LF_T3T; 5126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 5136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[listen_info_idx].tech_mask & 5146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_TECHNOLOGY_MASK_B_PRIME) { 5156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi listen_mask |= NFA_DM_DISC_MASK_L_B_PRIME; 5166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 5186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (listen_mask) { 5206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Start listening for requested technologies */ 5216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* register discovery callback to NFA DM */ 5226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi disc_handle = nfa_dm_add_rf_discover( 5236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi listen_mask, 5246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (tNFA_DM_DISC_HOST_ID)( 5256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].ee_handle & 0x00FF), 5266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_discovery_cback); 5276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (disc_handle == NFA_HANDLE_INVALID) 5296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_FAILED); 5306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else { 5316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].rf_disc_handle = disc_handle; 5326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].tech_proto_mask = listen_mask; 5336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 5346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 5356767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf( 5366767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi "UICC[0x%x] is not activated", 5376767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi p_cb->listen_info[listen_info_idx].ee_handle); 5386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 5396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 5406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif 541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 5426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return NFA_STATUS_OK; 545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_restart_listen_check 550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 551552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description Called on deactivation. Check if any active listen_info 552552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** entries to listen for 553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if listening is restarted. 555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** FALSE if listening not restarted 556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 5586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_ce_restart_listen_check(void) { 5596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CE_CB* p_cb = &nfa_ce_cb; 5606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t listen_info_idx; 5616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if any active entries in listen_info table */ 5636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (listen_info_idx = 0; listen_info_idx < NFA_CE_LISTEN_INFO_MAX; 5646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi listen_info_idx++) { 5656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[listen_info_idx].flags & NFA_CE_LISTEN_INFO_IN_USE) 5666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 5676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 5686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Restart listening if there are any active listen_info entries */ 5706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (listen_info_idx != NFA_CE_LISTEN_INFO_IDX_INVALID) { 5716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* restart listening */ 5726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_start_listening(); 5736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 5746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* No active listen_info entries */ 5756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return false; 5766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 5776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return true; 579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_remove_listen_info_entry 584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 585552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description Remove entry from listen_info table. (when API deregister is 586552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** called or listen_start failed) 587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 5926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ce_remove_listen_info_entry(uint8_t listen_info_idx, bool notify_app) { 5936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CE_CB* p_cb = &nfa_ce_cb; 5946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CONN_EVT_DATA conn_evt; 5956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5966767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 5976767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("NFA_CE: removing listen_info entry %i", listen_info_idx); 5986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify app that listening has stopped if requested (for API deregister) */ 6006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* For LISTEN_START failures, app has already notified of NFA_LISTEN_START_EVT 6016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * failure */ 6026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (notify_app) { 6036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (listen_info_idx == NFA_CE_LISTEN_INFO_IDX_NDEF) { 6046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.status = NFA_STATUS_OK; 6056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_cb->listen_info[listen_info_idx].p_conn_cback)( 6066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LOCAL_TAG_CONFIGURED_EVT, &conn_evt); 6076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE) 6096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (p_cb->listen_info[listen_info_idx].flags & 6106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_UICC) { 6116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.status = NFA_STATUS_OK; 6126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_cb->listen_info[listen_info_idx].p_conn_cback)( 6136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_UICC_LISTEN_CONFIGURED_EVT, &conn_evt); 6146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 6166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else { 6176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ce_deregistered.handle = NFA_HANDLE_GROUP_CE | listen_info_idx; 6186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_cb->listen_info[listen_info_idx].p_conn_cback)( 6196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_DEREGISTERED_EVT, &conn_evt); 620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 6216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 6236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Handle NDEF stopping */ 6246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (listen_info_idx == NFA_CE_LISTEN_INFO_IDX_NDEF) { 6256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* clear NDEF contents */ 6266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi CE_T3tSetLocalNDEFMsg(true, 0, 0, NULL, NULL); 6276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi CE_T4tSetLocalNDEFMsg(true, 0, 0, NULL, NULL); 628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 6296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[listen_info_idx].protocol_mask & 6306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_PROTOCOL_MASK_T3T) { 6316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].protocol_mask = 0; 632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 6336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* clear T3T Flags for NDEF */ 6346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ce_t3t_set_listen_params(); 635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 6376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Free scratch buffer for this NDEF, if one was allocated */ 6386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_free_scratch_buf(); 6396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 6406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If stopping listening Felica system code, then clear T3T Flags for this */ 6416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (p_cb->listen_info[listen_info_idx].flags & 6426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_FELICA) { 6436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].protocol_mask = 0; 6446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* clear T3T Flags for registered Felica system code */ 6466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_ce_t3t_set_listen_params(); 6476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 6486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If stopping listening T4T AID, then deregister this AID from CE_T4T */ 6496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (p_cb->listen_info[listen_info_idx].flags & 6506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_T4T_AID) { 6516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Free t4t_aid_cback used by this AID */ 6526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi CE_T4tDeregisterAID(p_cb->listen_info[listen_info_idx].t4t_aid_handle); 6536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 6546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[listen_info_idx].rf_disc_handle != NFA_HANDLE_INVALID) { 6566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_dm_delete_rf_discover( 6576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].rf_disc_handle); 6586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].rf_disc_handle = NFA_HANDLE_INVALID; 6596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 6606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Remove entry from listen_info table */ 6626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].flags = 0; 663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_free_scratch_buf 668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description free scratch buffer (if one is allocated) 670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns nothing 672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 6746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ce_free_scratch_buf(void) { 6756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CE_CB* p_cb = &nfa_ce_cb; 6766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->p_scratch_buf) { 6776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_mem_co_free(p_cb->p_scratch_buf); 6786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->p_scratch_buf = NULL; 6796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_realloc_scratch_buffer 685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Set scratch buffer if necessary (for writable NDEF messages) 687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFA_STATUS_OK if successful 689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 6916fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFA_STATUS nfa_ce_realloc_scratch_buffer(void) { 6926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_STATUS result = NFA_STATUS_OK; 6936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If current NDEF message is read-only, then we do not need a scratch buffer 6956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi */ 6966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfa_ce_cb.listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags & 6976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_CE_LISTEN_INFO_READONLY_NDEF) { 6986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Free existing scratch buffer, if one was allocated */ 6996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_free_scratch_buf(); 7006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 7016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If no scratch buffer allocated yet, or if current scratch buffer size is 7026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * different from current ndef size, */ 7036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* then allocate a new scratch buffer. */ 7046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nfa_ce_cb.p_scratch_buf == NULL) || 7056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (nfa_ce_cb.scratch_buf_size != nfa_ce_cb.ndef_max_size)) { 7066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Free existing scratch buffer, if one was allocated */ 7076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_free_scratch_buf(); 7086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7090c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi nfa_ce_cb.p_scratch_buf = 7100c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi (uint8_t*)nfa_mem_co_alloc(nfa_ce_cb.ndef_max_size); 7110c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (nfa_ce_cb.p_scratch_buf != NULL) { 7126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_cb.scratch_buf_size = nfa_ce_cb.ndef_max_size; 7136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 7146767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf( 7156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "Unable to allocate scratch buffer for writable NDEF message (%i " 7166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "bytes)", 7176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_cb.ndef_max_size); 7186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi result = NFA_STATUS_FAILED; 7196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 7216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 7236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (result); 724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_set_content 729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Set NDEF contents 731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 7356fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS nfa_ce_set_content(void) { 7366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS status; 7376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CE_CB* p_cb = &nfa_ce_cb; 7386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_PROTOCOL_MASK ndef_protocol_mask; 7396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool readonly; 7406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if listening for NDEF */ 7426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (!(p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags & 7436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_IN_USE)) { 7446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Not listening for NDEF */ 7456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFA_STATUS_OK); 7466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 7476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7486767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Setting NDEF contents"); 7496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi readonly = (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags & 7516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_CE_LISTEN_INFO_READONLY_NDEF) 7526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ? true 7536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi : false; 7546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ndef_protocol_mask = 7556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].protocol_mask; 7566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Allocate a scratch buffer if needed (for handling write-requests) */ 7580c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi status = nfa_ce_realloc_scratch_buffer(); 7590c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (status == NFA_STATUS_OK) { 7606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((ndef_protocol_mask & NFA_PROTOCOL_MASK_T3T) && 7616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (status == NFA_STATUS_OK)) { 7626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Type3Tag - NFC-F */ 7636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = CE_T3tSetLocalNDEFMsg(readonly, p_cb->ndef_max_size, 7646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_cur_size, p_cb->p_ndef_data, 7656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->p_scratch_buf); 766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 7686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((ndef_protocol_mask & NFA_PROTOCOL_MASK_ISO_DEP) && 7696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (status == NFA_STATUS_OK)) { 7706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* ISODEP/4A,4B- NFC-A or NFC-B */ 7716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = CE_T4tSetLocalNDEFMsg(readonly, p_cb->ndef_max_size, 7726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_cur_size, p_cb->p_ndef_data, 7736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->p_scratch_buf); 774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 7756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 7776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (status != NFA_STATUS_OK) { 7786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* clear NDEF contents */ 7796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi CE_T3tSetLocalNDEFMsg(true, 0, 0, NULL, NULL); 7806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi CE_T4tSetLocalNDEFMsg(true, 0, 0, NULL, NULL); 781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 7826767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf("Unable to set contents (error %02x)", status); 7836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 7856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (status); 786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_activate_ntf 791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Action when activation has occured (NFA_CE_ACTIVATE_NTF_EVT) 793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - Find the listen_info entry assocated with this activation 795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - get the app callback that registered for this listen 796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - call CE_SetActivatedTagType with activation parameters 797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE (message buffer to be freed by caller) 799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 8016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_ce_activate_ntf(tNFA_CE_MSG* p_ce_msg) { 8026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_ACTIVATE_DEVT* p_activation_params = 8036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ce_msg->activate_ntf.p_activation_params; 8046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CE_CB* p_cb = &nfa_ce_cb; 8056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CONN_EVT_DATA conn_evt; 8066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tCE_CBACK* p_ce_cback = NULL; 8076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t t3t_system_code = 0xFFFF; 8086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t listen_info_idx = NFA_CE_LISTEN_INFO_IDX_INVALID; 8096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_nfcid2 = NULL; 8106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t i; 8116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool t4t_activate_pending = false; 8126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 813641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna bool t3t_activate_pending = false; 814641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna bool t3t_offhost_entry_found = false; 815641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna uint8_t t3t_activate_idx = 0; 816641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna uint8_t t3t_offhost_idx = 0; 817641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna 8186767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf( 8196767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi "protocol=%d", p_ce_msg->activate_ntf.p_activation_params->protocol); 8206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Tag is in listen active state */ 8226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags |= NFA_CE_FLAGS_LISTEN_ACTIVE_SLEEP; 8236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Store activation parameters */ 8256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memcpy(&p_cb->activation_params, p_activation_params, 8266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sizeof(tNFC_ACTIVATE_DEVT)); 8276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Find the listen_info entry corresponding to this activation */ 8296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->activation_params.protocol == NFA_PROTOCOL_T3T) { 8306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Look for T3T entries in listen_info table that match activated system 8316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * code and NFCID2 */ 8326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (listen_info_idx = 0; listen_info_idx < NFA_CE_LISTEN_INFO_IDX_INVALID; 8336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi listen_info_idx++) { 8346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Look for entries with NFA_PROTOCOL_MASK_T3T */ 8356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[listen_info_idx].flags & 8366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_IN_USE) { 8376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[listen_info_idx].protocol_mask & 8386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_PROTOCOL_MASK_T3T) { 8396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if system_code and nfcid2 that matches activation params */ 8406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_nfcid2 = p_cb->listen_info[listen_info_idx].t3t_nfcid2; 8416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi t3t_system_code = p_cb->listen_info[listen_info_idx].t3t_system_code; 8426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Compare NFCID2 (note: NFCC currently does not return system code in 8446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * activation parameters) */ 8456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((memcmp(p_nfcid2, 8466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->activation_params.rf_tech_param.param.lf.nfcid2, 8476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_RF_F_UID_LEN) == 0) 8486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* && (t3t_system_code == p_ce_msg->activation.p_activate_info->rf_tech_param.param.lf.system_code) */) { 849641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna p_cb->listen_info[listen_info_idx].flags |= 850641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND; 851641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna t3t_activate_pending = true; 852641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna t3t_activate_idx = listen_info_idx; 8536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 8566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if entry is for T3T UICC */ 8576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_cb->listen_info[listen_info_idx].flags & 8586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_UICC) && 8596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->listen_info[listen_info_idx].tech_mask & 8606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_TECHNOLOGY_MASK_F)) { 861641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna t3t_offhost_entry_found = true; 862641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna t3t_offhost_idx = listen_info_idx; 8636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 8676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ce_cback = nfa_ce_handle_t3t_evt; 868641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna /* If listening for PROTO_T3T on DH and eSE/UICC, then notify CE module 869641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna * now and wait for reader/writer to SELECT a target */ 870641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna if (t3t_activate_pending && t3t_offhost_entry_found) { 871641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna CE_SetActivatedTagType(&p_cb->activation_params, t3t_system_code, 872641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna p_ce_cback); 873641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna return true; 874641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna } else if (t3t_activate_pending) { 875641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna listen_info_idx = t3t_activate_idx; 876641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna } else if (t3t_offhost_entry_found) { 877641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna listen_info_idx = t3t_offhost_idx; 878641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna } 8796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->activation_params.protocol == NFA_PROTOCOL_ISO_DEP) { 8806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ce_cback = nfa_ce_handle_t4t_evt; 881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 8826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* For T4T, we do not know which AID will be selected yet */ 883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 8846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* For all T4T entries in listen_info, set T4T_ACTIVATE_NOTIFY_PENDING flag 8856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi */ 8866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (i = 0; i < NFA_CE_LISTEN_INFO_IDX_INVALID; i++) { 8876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_IN_USE) { 8886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[i].protocol_mask & NFA_PROTOCOL_MASK_ISO_DEP) { 8896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Found listen_info table entry for T4T raw listen */ 8906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[i].flags |= NFA_CE_LISTEN_INFO_T4T_ACTIVATE_PND; 891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 8926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If entry if for NDEF, select it, so application gets nofitifed of 8936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * ACTIVATE_EVT now */ 8946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (i == NFA_CE_LISTEN_INFO_IDX_NDEF) { 8956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi listen_info_idx = NFA_CE_LISTEN_INFO_IDX_NDEF; 8966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 8986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi t4t_activate_pending = true; 899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 9016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (NFC_NFCEE_INCLUDED == TRUE) 9026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if entry is for ISO_DEP UICC */ 9036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_UICC) { 9046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (((p_cb->activation_params.rf_tech_param.mode == 9056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_DISCOVERY_TYPE_LISTEN_A) && 9066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->listen_info[i].tech_proto_mask & 9076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_DM_DISC_MASK_LA_ISO_DEP)) || 9086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_cb->activation_params.rf_tech_param.mode == 9096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_DISCOVERY_TYPE_LISTEN_B) && 9106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->listen_info[i].tech_proto_mask & 9116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_DM_DISC_MASK_LB_ISO_DEP))) { 9126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi listen_info_idx = i; 9136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 9156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif 9166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 9196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If listening for ISO_DEP, but not NDEF nor UICC, then notify CE module 9206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * now and wait for reader/writer to SELECT an AID */ 9216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (t4t_activate_pending && 9226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (listen_info_idx == NFA_CE_LISTEN_INFO_IDX_INVALID)) { 9236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi CE_SetActivatedTagType(&p_cb->activation_params, 0, p_ce_cback); 9246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return true; 925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 9266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->activation_params.intf_param.type == 9276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_INTERFACE_EE_DIRECT_RF) { 9286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* search any entry listening UICC */ 9296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (i = 0; i < NFA_CE_LISTEN_INFO_IDX_INVALID; i++) { 9306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_IN_USE) && 9316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_UICC)) { 9326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi listen_info_idx = i; 9336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 9346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 9366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 9376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if valid listen_info entry was found */ 9396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((listen_info_idx == NFA_CE_LISTEN_INFO_IDX_INVALID) || 9406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((listen_info_idx == NFA_CE_LISTEN_INFO_IDX_NDEF) && 9416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi !(p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags & 9426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_IN_USE))) { 9436767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf( 9446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "No listen_info found for this activation. listen_info_idx=%d", 9456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi listen_info_idx); 9464a179646f6d5567830a0383050aee7610a0222a6Ruchi Kandoi return true; 9476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 9486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].flags &= 9506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ~NFA_CE_LISTEN_INFO_T4T_ACTIVATE_PND; 951641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna p_cb->listen_info[listen_info_idx].flags &= 952641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna ~NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND; 9536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Get CONN_CBACK for this activation */ 9556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->p_active_conn_cback = p_cb->listen_info[listen_info_idx].p_conn_cback; 9566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->idx_cur_active = listen_info_idx; 9576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_cb->idx_cur_active == NFA_CE_LISTEN_INFO_IDX_NDEF) || 9596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->listen_info[p_cb->idx_cur_active].flags & 9606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_UICC)) { 9616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memcpy(&(conn_evt.activated.activate_ntf), &p_cb->activation_params, 9626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sizeof(tNFC_ACTIVATE_DEVT)); 9636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_cb->p_active_conn_cback)(NFA_ACTIVATED_EVT, &conn_evt); 9656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 9666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ce_activated.handle = 9676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)p_cb->idx_cur_active); 9686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memcpy(&(conn_evt.ce_activated.activate_ntf), &p_cb->activation_params, 9696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sizeof(tNFC_ACTIVATE_DEVT)); 9706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ce_activated.status = NFA_STATUS_OK; 9716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_cb->p_active_conn_cback)(NFA_CE_ACTIVATED_EVT, &conn_evt); 9736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 9746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* we don't need any CE subsystem in case of NFCEE direct RF interface */ 9766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_ce_cback) { 9776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify CE subsystem */ 9786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi CE_SetActivatedTagType(&p_cb->activation_params, t3t_system_code, 9796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ce_cback); 9806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 9816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return true; 982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_deactivate_ntf 987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Action when deactivate occurs. (NFA_CE_DEACTIVATE_NTF_EVT) 989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 990552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** - If deactivate due to API deregister, then remove its entry 991552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** from listen_info table 992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - If NDEF was modified while activated, then restore 994552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** original NDEF contents 995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - Restart listening (if any active entries in listen table) 997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE (message buffer to be freed by caller) 999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 10016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_ce_deactivate_ntf(tNFA_CE_MSG* p_ce_msg) { 10026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_DEACT_TYPE deact_type = (tNFC_DEACT_TYPE)p_ce_msg->hdr.layer_specific; 10036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CE_CB* p_cb = &nfa_ce_cb; 10046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CONN_EVT_DATA conn_evt; 10056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t i; 10066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 10076767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("deact_type=%d", deact_type); 10086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 10096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if deactivating to SLEEP mode */ 10106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((deact_type == NFC_DEACTIVATE_TYPE_SLEEP) || 10116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (deact_type == NFC_DEACTIVATE_TYPE_SLEEP_AF)) { 10126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfa_ce_cb.idx_wild_card == NFA_CE_LISTEN_INFO_IDX_INVALID) { 10136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* notify deactivated as sleep and wait for reactivation or deactivation 10146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * to idle */ 10156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.deactivated.type = deact_type; 10166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 10176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* if T4T AID application has not been selected then p_active_conn_cback 10186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * could be NULL */ 10196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->p_active_conn_cback) 10206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_cb->p_active_conn_cback)(NFA_DEACTIVATED_EVT, &conn_evt); 10216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 10226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ce_deactivated.handle = 10236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)nfa_ce_cb.idx_wild_card); 10246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ce_deactivated.type = deact_type; 10256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->p_active_conn_cback) 10266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_cb->p_active_conn_cback)(NFA_CE_DEACTIVATED_EVT, &conn_evt); 1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return true; 10306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 10316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi deact_type = NFC_DEACTIVATE_TYPE_IDLE; 10326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 10336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 10346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Tag is in idle state */ 10356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~NFA_CE_FLAGS_LISTEN_ACTIVE_SLEEP; 10366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 10376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* First, notify app of deactivation */ 10386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (i = 0; i < NFA_CE_LISTEN_INFO_IDX_INVALID; i++) { 10396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_IN_USE) { 10406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_UICC) && 10416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (i == p_cb->idx_cur_active)) { 10426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.deactivated.type = deact_type; 10436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_cb->p_active_conn_cback)(NFA_DEACTIVATED_EVT, &conn_evt); 10446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if ((p_cb->activation_params.protocol == NFA_PROTOCOL_ISO_DEP) && 10456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->listen_info[i].protocol_mask & 10466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_PROTOCOL_MASK_ISO_DEP)) { 10476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Don't send NFA_DEACTIVATED_EVT if NFA_ACTIVATED_EVT wasn't sent */ 10486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (!(p_cb->listen_info[i].flags & 10496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_T4T_ACTIVATE_PND)) { 10506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (i == NFA_CE_LISTEN_INFO_IDX_NDEF) { 10516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.deactivated.type = deact_type; 10526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_cb->p_active_conn_cback)(NFA_DEACTIVATED_EVT, &conn_evt); 10536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 10546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ce_deactivated.handle = 10556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)i); 10566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ce_deactivated.type = deact_type; 10576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_cb->p_active_conn_cback)(NFA_CE_DEACTIVATED_EVT, &conn_evt); 10586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 10606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if ((p_cb->activation_params.protocol == NFA_PROTOCOL_T3T) && 10616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->listen_info[i].protocol_mask & NFA_PROTOCOL_MASK_T3T)) { 1062641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna /* Don't send NFA_DEACTIVATED_EVT if NFA_ACTIVATED_EVT wasn't sent */ 1063641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna if (!(p_cb->listen_info[i].flags & 1064641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND)) { 1065641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna if (i == NFA_CE_LISTEN_INFO_IDX_NDEF) { 1066641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna conn_evt.deactivated.type = deact_type; 1067641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna (*p_cb->p_active_conn_cback)(NFA_DEACTIVATED_EVT, &conn_evt); 1068641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna } else { 1069641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna conn_evt.ce_deactivated.handle = 1070641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)i); 1071641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna conn_evt.ce_deactivated.type = deact_type; 1072641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna (*p_cb->p_active_conn_cback)(NFA_CE_DEACTIVATED_EVT, &conn_evt); 1073641314c190b224db4de3557a9e86c840b3e16bb4Love Khanna } 10746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 10756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 10776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if app initiated the deactivation (due to API deregister). If so, 10806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * remove entry from listen_info table. */ 10816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->flags & NFA_CE_FLAGS_APP_INIT_DEACTIVATION) { 10826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~NFA_CE_FLAGS_APP_INIT_DEACTIVATION; 10836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_remove_listen_info_entry(p_cb->idx_cur_active, true); 10846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->p_active_conn_cback = NULL; 10876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->idx_cur_active = NFA_CE_LISTEN_INFO_IDX_INVALID; 1088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Restart listening (if any listen_info entries are still active) */ 10906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_restart_listen_check(); 1091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return true; 1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_disable_local_tag 1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Disable local NDEF tag 1100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - clean up control block 1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - remove NDEF discovery configuration 1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 11066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_ce_disable_local_tag(void) { 11076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CE_CB* p_cb = &nfa_ce_cb; 11086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CONN_EVT_DATA evt_data; 11096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11106767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Disabling local NDEF tag"); 11116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If local NDEF tag is in use, then disable it */ 11136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags & 11146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_IN_USE) { 11156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* NDEF Tag is in not idle state */ 11166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_cb->flags & NFA_CE_FLAGS_LISTEN_ACTIVE_SLEEP) && 11176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->idx_cur_active == NFA_CE_LISTEN_INFO_IDX_NDEF)) { 11186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* wait for deactivation */ 11196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags |= NFA_CE_FLAGS_APP_INIT_DEACTIVATION; 11206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_IDLE); 11216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 11226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify DM to stop listening for ndef */ 11236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle != 11246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_HANDLE_INVALID) { 11256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_dm_delete_rf_discover( 11266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle); 11276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle = 11286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_HANDLE_INVALID; 11296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 11306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_remove_listen_info_entry(NFA_CE_LISTEN_INFO_IDX_NDEF, true); 1131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 11326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 11336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify application */ 11346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFA_STATUS_OK; 11356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_dm_conn_cback_event_notify(NFA_CE_LOCAL_TAG_CONFIGURED_EVT, &evt_data); 11366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_api_cfg_local_tag 1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Configure local NDEF tag 1144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - store ndef attributes in to control block 1145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - update discovery configuration 1146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE (message buffer to be freed by caller) 1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 11506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_ce_api_cfg_local_tag(tNFA_CE_MSG* p_ce_msg) { 11516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CE_CB* p_cb = &nfa_ce_cb; 11526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CONN_EVT_DATA conn_evt; 1153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 11546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if disabling local tag */ 11556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_ce_msg->local_tag.protocol_mask == 0) { 11566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_disable_local_tag(); 11576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return true; 11586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 11596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11606767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf( 11616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "Configuring local NDEF tag: protocol_mask=%01x cur_size=%i, " 11626767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi "max_size=%i, readonly=%i uid_len=%i", 11636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ce_msg->local_tag.protocol_mask, p_ce_msg->local_tag.ndef_cur_size, 11646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ce_msg->local_tag.ndef_max_size, p_ce_msg->local_tag.read_only, 11656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ce_msg->local_tag.uid_len); 11666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If local tag was already set, then check if NFA_CeConfigureLocalTag called 11686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * to change protocol mask */ 11696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags & 11706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_IN_USE) && 11716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle != 11726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_HANDLE_INVALID) && 11736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].protocol_mask & 11746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (NFA_PROTOCOL_MASK_T3T | NFA_PROTOCOL_MASK_ISO_DEP)) != 11756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_ce_msg->local_tag.protocol_mask & 11766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (NFA_PROTOCOL_MASK_T3T | NFA_PROTOCOL_MASK_ISO_DEP)))) { 11776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Listening for different tag protocols. Stop discovery */ 11786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_dm_delete_rf_discover( 11796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle); 11806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].rf_disc_handle = 11816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_HANDLE_INVALID; 11826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* clear NDEF contents */ 11846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi CE_T3tSetLocalNDEFMsg(true, 0, 0, NULL, NULL); 11856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi CE_T4tSetLocalNDEFMsg(true, 0, 0, NULL, NULL); 11866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 11876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Store NDEF info to control block */ 11896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->p_ndef_data = p_ce_msg->local_tag.p_ndef_data; 11906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_cur_size = p_ce_msg->local_tag.ndef_cur_size; 11916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_max_size = p_ce_msg->local_tag.ndef_max_size; 11926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Fill in LISTEN_INFO entry for NDEF */ 11946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags = 11956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_IN_USE; 11966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].protocol_mask = 11976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ce_msg->local_tag.protocol_mask; 11986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].p_conn_cback = 11996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_dm_conn_cback_event_notify; 12006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_ce_msg->local_tag.read_only) 12016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].flags |= 12026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_CE_LISTEN_INFO_READONLY_NDEF; 12036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].t3t_system_code = 12046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_SYSTEM_CODE_NDEF; 12056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Set NDEF contents */ 12076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.status = NFA_STATUS_FAILED; 12086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[NFA_CE_LISTEN_INFO_IDX_NDEF].protocol_mask & 12106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (NFA_PROTOCOL_MASK_T3T | NFA_PROTOCOL_MASK_ISO_DEP)) { 12116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Ok to set contents now */ 12126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfa_ce_set_content() != NFA_STATUS_OK) { 12136767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf( 12146767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi "nfa_ce_api_cfg_local_tag: could not set contents"); 12156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_dm_conn_cback_event_notify(NFA_CE_LOCAL_TAG_CONFIGURED_EVT, 12166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi &conn_evt); 12176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return true; 1218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 12206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Start listening and notify app of status */ 12216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.status = nfa_ce_start_listening(); 12226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_dm_conn_cback_event_notify(NFA_CE_LOCAL_TAG_CONFIGURED_EVT, &conn_evt); 12236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 12256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return true; 1226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_api_reg_listen 1231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Register listen params for Felica system code, T4T AID, 1233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** or UICC 1234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE (message buffer to be freed by caller) 1236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 12386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_ce_api_reg_listen(tNFA_CE_MSG* p_ce_msg) { 12396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CE_CB* p_cb = &nfa_ce_cb; 12406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CONN_EVT_DATA conn_evt; 12416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t i; 12426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t listen_info_idx = NFA_CE_LISTEN_INFO_IDX_INVALID; 12436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12446767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 12456767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("Registering UICC/Felica/Type-4 tag listener. Type=%i", 12466767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi p_ce_msg->reg_listen.listen_type); 12476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Look for available entry in listen_info table */ 12496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* - If registering UICC listen, make sure there isn't another entry for the 12506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * ee_handle */ 12516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* - Skip over entry 0 (reserved for local NDEF tag) */ 12526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (i = 1; i < NFA_CE_LISTEN_INFO_MAX; i++) { 12536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_ce_msg->reg_listen.listen_type == NFA_CE_REG_TYPE_UICC) && 12546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_IN_USE) && 12556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_UICC) && 12566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->listen_info[i].ee_handle == p_ce_msg->reg_listen.ee_handle)) { 12576767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf("UICC (0x%x) listening already specified", 12586767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi p_ce_msg->reg_listen.ee_handle); 12596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.status = NFA_STATUS_FAILED; 12606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_dm_conn_cback_event_notify(NFA_CE_UICC_LISTEN_CONFIGURED_EVT, 12616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi &conn_evt); 12626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return true; 1263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 12646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If this is a free entry, and we haven't found one yet, remember it */ 12656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if ((!(p_cb->listen_info[i].flags & NFA_CE_LISTEN_INFO_IN_USE)) && 12666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (listen_info_idx == NFA_CE_LISTEN_INFO_IDX_INVALID)) { 12676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi listen_info_idx = i; 1268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 12696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 12706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add new entry to listen_info table */ 12726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (listen_info_idx == NFA_CE_LISTEN_INFO_IDX_INVALID) { 12736767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf("Maximum listen callbacks exceeded (%i)", 12746767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi NFA_CE_LISTEN_INFO_MAX); 12756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_ce_msg->reg_listen.listen_type == NFA_CE_REG_TYPE_UICC) { 12776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.status = NFA_STATUS_FAILED; 12786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_dm_conn_cback_event_notify(NFA_CE_UICC_LISTEN_CONFIGURED_EVT, 12796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi &conn_evt); 12806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 12816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify application */ 12826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ce_registered.handle = NFA_HANDLE_INVALID; 12836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ce_registered.status = NFA_STATUS_FAILED; 12846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_ce_msg->reg_listen.p_conn_cback)(NFA_CE_REGISTERED_EVT, &conn_evt); 12856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 12866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return true; 12876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 12886767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 12896767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("NFA_CE: adding listen_info entry %i", listen_info_idx); 12906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Store common parameters */ 12926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Mark entry as 'in-use', and NFA_CE_LISTEN_INFO_START_NTF_PND */ 12936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* (LISTEN_START_EVT will be notified when discovery successfully starts */ 12946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].flags = 12956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_IN_USE | NFA_CE_LISTEN_INFO_START_NTF_PND; 12966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].rf_disc_handle = NFA_HANDLE_INVALID; 12976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].protocol_mask = 0; 12986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Store type-specific parameters */ 13006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (p_ce_msg->reg_listen.listen_type) { 13016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case NFA_CE_REG_TYPE_ISO_DEP: 13026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].protocol_mask = 13036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_PROTOCOL_MASK_ISO_DEP; 13046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].flags |= NFA_CE_LISTEN_INFO_T4T_AID; 13056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].p_conn_cback = 13066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ce_msg->reg_listen.p_conn_cback; 13076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 13086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Register this AID with CE_T4T */ 13090c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cb->listen_info[listen_info_idx].t4t_aid_handle = CE_T4tRegisterAID( 13100c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_ce_msg->reg_listen.aid_len, p_ce_msg->reg_listen.aid, 13110c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi nfa_ce_handle_t4t_aid_evt); 13120c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cb->listen_info[listen_info_idx].t4t_aid_handle == 13130c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi CE_T4T_AID_HANDLE_INVALID) { 13146767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf("Unable to register AID"); 13156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].flags = 0; 13166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 13176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify application */ 13186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ce_registered.handle = NFA_HANDLE_INVALID; 13196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ce_registered.status = NFA_STATUS_FAILED; 13206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_ce_msg->reg_listen.p_conn_cback)(NFA_CE_REGISTERED_EVT, 13216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi &conn_evt); 13226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 13236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return true; 13246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 13256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[listen_info_idx].t4t_aid_handle == 13266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi CE_T4T_WILDCARD_AID_HANDLE) 13276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_cb.idx_wild_card = listen_info_idx; 13286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 1329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 13306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case NFA_CE_REG_TYPE_FELICA: 13316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].protocol_mask = 13326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_PROTOCOL_MASK_T3T; 13336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].flags |= NFA_CE_LISTEN_INFO_FELICA; 13346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].p_conn_cback = 13356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ce_msg->reg_listen.p_conn_cback; 13366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 13376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Store system code and nfcid2 */ 13386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].t3t_system_code = 13396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ce_msg->reg_listen.system_code; 13406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memcpy(p_cb->listen_info[listen_info_idx].t3t_nfcid2, 13416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ce_msg->reg_listen.nfcid2, NCI_RF_F_UID_LEN); 134253d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna memcpy(p_cb->listen_info[listen_info_idx].t3t_pmm, 134353d98cc8b51a44d8c7f0a376acfd842c937df40aLove Khanna p_ce_msg->reg_listen.t3tPmm, NCI_T3T_PMM_LEN); 13446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 1345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE) 13476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case NFA_CE_REG_TYPE_UICC: 13486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].flags |= NFA_CE_LISTEN_INFO_UICC; 13496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].p_conn_cback = 13506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi &nfa_dm_conn_cback_event_notify; 13516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 13526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Store EE handle and Tech */ 13536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].ee_handle = 13546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ce_msg->reg_listen.ee_handle; 13556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].tech_mask = 13566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ce_msg->reg_listen.tech_mask; 13576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 1358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 1359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 13606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 13626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Start listening */ 13630c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi conn_evt.status = nfa_ce_start_listening(); 13640c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (conn_evt.status != NFA_STATUS_OK) { 13656767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf( 13666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "nfa_ce_api_reg_listen: unable to register new listen params with DM"); 13676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].flags = 0; 13686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 13696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 13706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Nofitify app of status */ 13716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_ce_msg->reg_listen.listen_type == NFA_CE_REG_TYPE_UICC) { 13726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_cb->listen_info[listen_info_idx].p_conn_cback)( 13736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_UICC_LISTEN_CONFIGURED_EVT, &conn_evt); 13746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 13756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.ce_registered.handle = NFA_HANDLE_GROUP_CE | listen_info_idx; 13766767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi DLOG_IF(INFO, nfc_debug_enabled) 13776767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi << StringPrintf("nfa_ce_api_reg_listen: registered handle 0x%04X", 13786767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi conn_evt.ce_registered.handle); 13796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_cb->listen_info[listen_info_idx].p_conn_cback)(NFA_CE_REGISTERED_EVT, 13806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi &conn_evt); 13816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 13826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 13836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return true; 1384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_api_dereg_listen 1389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Deregister listen params 1391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE (message buffer to be freed by caller) 1393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 13956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_ce_api_dereg_listen(tNFA_CE_MSG* p_ce_msg) { 13966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CE_CB* p_cb = &nfa_ce_cb; 13976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t listen_info_idx; 13986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFA_CONN_EVT_DATA conn_evt; 1399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_NFCEE_INCLUDED == TRUE) 14016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if deregistering UICC , or virtual secure element listen */ 14026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_ce_msg->dereg_listen.listen_info == NFA_CE_LISTEN_INFO_UICC) { 14036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Deregistering UICC listen. Look for listen_info for this UICC ee handle 14046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi */ 14056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (listen_info_idx = 0; listen_info_idx < NFA_CE_LISTEN_INFO_MAX; 14066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi listen_info_idx++) { 14076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_cb->listen_info[listen_info_idx].flags & 14086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_IN_USE) && 14096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->listen_info[listen_info_idx].flags & 14106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_UICC) && 14116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->listen_info[listen_info_idx].ee_handle == 14126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ce_msg->dereg_listen.handle)) { 14136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* UICC is in not idle state */ 14146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_cb->flags & NFA_CE_FLAGS_LISTEN_ACTIVE_SLEEP) && 14156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->idx_cur_active == listen_info_idx)) { 14166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* wait for deactivation */ 14176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags |= NFA_CE_FLAGS_APP_INIT_DEACTIVATION; 14186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_IDLE); 14196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 14206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Stop listening */ 14216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[listen_info_idx].rf_disc_handle != 14226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_HANDLE_INVALID) { 14236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_dm_delete_rf_discover( 14246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].rf_disc_handle); 14256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].rf_disc_handle = 14266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_HANDLE_INVALID; 14276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 14286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 14296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Remove entry and notify application */ 14306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_remove_listen_info_entry(listen_info_idx, true); 1431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 14326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 14336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 14346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 14366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (listen_info_idx == NFA_CE_LISTEN_INFO_MAX) { 14376767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf("cannot find listen_info for UICC"); 14386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.status = NFA_STATUS_INVALID_PARAM; 14396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_dm_conn_cback_event_notify(NFA_CE_UICC_LISTEN_CONFIGURED_EVT, 14406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi &conn_evt); 1441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 14426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else 1443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 14446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 14456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Deregistering virtual secure element listen */ 14466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi listen_info_idx = p_ce_msg->dereg_listen.handle & NFA_HANDLE_MASK; 14476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfa_ce_cb.idx_wild_card == listen_info_idx) { 14486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_cb.idx_wild_card = NFA_CE_LISTEN_INFO_IDX_INVALID; 14496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 14516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((listen_info_idx < NFA_CE_LISTEN_INFO_MAX) && 14526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->listen_info[listen_info_idx].flags & 14536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_CE_LISTEN_INFO_IN_USE)) { 14546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* virtual secure element is in not idle state */ 14556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_cb->flags & NFA_CE_FLAGS_LISTEN_ACTIVE_SLEEP) && 14566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->idx_cur_active == listen_info_idx)) { 14576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* wait for deactivation */ 14586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags |= NFA_CE_FLAGS_APP_INIT_DEACTIVATION; 14596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_dm_rf_deactivate(NFA_DEACTIVATE_TYPE_IDLE); 14606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 14616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Stop listening */ 14626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->listen_info[listen_info_idx].rf_disc_handle != 14636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_HANDLE_INVALID) { 14646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_dm_delete_rf_discover( 14656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].rf_disc_handle); 14666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->listen_info[listen_info_idx].rf_disc_handle = 14676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFA_HANDLE_INVALID; 1468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 14696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 14706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Remove entry and notify application */ 14716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_remove_listen_info_entry(listen_info_idx, true); 14726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 14736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 14746767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi LOG(ERROR) << StringPrintf( 14756767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi "cannot find listen_info for " 14766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "Felica/T4tAID"); 14776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi conn_evt.status = NFA_STATUS_INVALID_PARAM; 14786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_dm_conn_cback_event_notify(NFA_CE_DEREGISTERED_EVT, &conn_evt); 1479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 14806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 14826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return true; 1483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfa_ce_api_cfg_isodep_tech 1488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1489552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description Configure the technologies (NFC-A and/or NFC-B) to listen 1490552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** for ISO-DEP 1491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE (message buffer to be freed by caller) 1493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 14956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool nfa_ce_api_cfg_isodep_tech(tNFA_CE_MSG* p_ce_msg) { 14966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_cb.isodep_disc_mask = 0; 14976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_ce_msg->hdr.layer_specific & NFA_TECHNOLOGY_MASK_A) 14986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_cb.isodep_disc_mask = NFA_DM_DISC_MASK_LA_ISO_DEP; 14996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 15006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_ce_msg->hdr.layer_specific & NFA_TECHNOLOGY_MASK_B) 15016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfa_ce_cb.isodep_disc_mask |= NFA_DM_DISC_MASK_LB_ISO_DEP; 15026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return true; 1503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1504