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