1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Copyright (C) 2010-2012 Broadcom Corporation
4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  you may not use this file except in compliance with the License.
7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  You may obtain a copy of the License at:
8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  See the License for the specific language governing permissions and
15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  limitations under the License.
16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  This file contains the implementation for Type 4 tag in Card Emulation
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  mode.
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h>
26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_target.h"
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "bt_types.h"
28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "trace_api.h"
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_INCLUDED == TRUE)
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_api.h"
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_int.h"
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "ce_api.h"
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "ce_int.h"
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "tags_int.h"
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "gki.h"
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (CE_TEST_INCLUDED == TRUE) /* test only */
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN mapping_aid_test_enabled = FALSE;
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8   ce_test_tag_app_id[T4T_V20_NDEF_TAG_AID_LEN] = {0xD2, 0x76, 0x00, 0x00, 0x85, 0x01, 0x01};
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ce_t4t_send_to_lower
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send packet to lower layer
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN ce_t4t_send_to_lower (BT_HDR *p_r_apdu)
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE)
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    DispCET4Tags (p_r_apdu, FALSE);
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (NFC_SendData (NFC_RF_CONN_ID, p_r_apdu) != NFC_STATUS_OK)
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR0 ("ce_t4t_send_to_lower (): NFC_SendData () failed");
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return TRUE;
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ce_t4t_send_status
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send status on R-APDU to peer
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN ce_t4t_send_status (UINT16 status)
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR      *p_r_apdu;
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       *p;
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG1 ("ce_t4t_send_status (): Status:0x%04X", status);
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_r_apdu = (BT_HDR *) GKI_getpoolbuf (NFC_CE_POOL_ID);
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!p_r_apdu)
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR0 ("ce_t4t_send_status (): Cannot allocate buffer");
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_r_apdu->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = (UINT8 *) (p_r_apdu + 1) + p_r_apdu->offset;
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_BE_STREAM (p, status);
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_r_apdu->len = T4T_RSP_STATUS_WORDS_SIZE;
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!ce_t4t_send_to_lower (p_r_apdu))
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return TRUE;
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ce_t4t_select_file
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Select a file
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN ce_t4t_select_file (UINT16 file_id)
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t;
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG1 ("ce_t4t_select_file (): FileID:0x%04X", file_id);
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (file_id == T4T_CC_FILE_ID)
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_DEBUG0 ("ce_t4t_select_file (): Select CC file");
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->status |= CE_T4T_STATUS_CC_FILE_SELECTED;
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->status &= ~ (CE_T4T_STATUS_NDEF_SELECTED);
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return TRUE;
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (file_id == CE_T4T_MANDATORY_NDEF_FILE_ID)
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_DEBUG3 ("ce_t4t_select_file (): NLEN:0x%04X, MaxFileSize:0x%04X, WriteAccess:%s",
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                          p_t4t->nlen,
133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                          p_t4t->max_file_size,
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                          (p_t4t->status & CE_T4T_STATUS_NDEF_FILE_READ_ONLY ? "RW" : "RO"));
135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->status |= CE_T4T_STATUS_NDEF_SELECTED;
137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->status &= ~ (CE_T4T_STATUS_CC_FILE_SELECTED);
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return TRUE;
140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR1 ("ce_t4t_select_file (): Cannot find file ID (0x%04X)", file_id);
144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->status &= ~ (CE_T4T_STATUS_CC_FILE_SELECTED);
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->status &= ~ (CE_T4T_STATUS_NDEF_SELECTED);
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ce_t4t_read_binary
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Read data from selected file and send R-APDU to peer
157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN ce_t4t_read_binary (UINT16 offset, UINT8 length)
162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t;
164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       *p_src = NULL, *p_dst;
165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR      *p_r_apdu;
166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG3 ("ce_t4t_read_binary (): Offset:0x%04X, Length:0x%04X, selected status = 0x%02X",
168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      offset, length, p_t4t->status);
169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_t4t->status & CE_T4T_STATUS_CC_FILE_SELECTED)
171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_src = p_t4t->cc_file;
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (p_t4t->status & CE_T4T_STATUS_NDEF_SELECTED)
175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t4t->p_scratch_buf)
177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_src = p_t4t->p_scratch_buf;
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_src = p_t4t->p_ndef_msg;
180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_src)
183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_r_apdu = (BT_HDR *) GKI_getpoolbuf (NFC_CE_POOL_ID);
185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!p_r_apdu)
187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            CE_TRACE_ERROR0 ("ce_t4t_read_binary (): Cannot allocate buffer");
189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return FALSE;
190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_r_apdu->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_dst = (UINT8 *) (p_r_apdu + 1) + p_r_apdu->offset;
194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_r_apdu->len = length;
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* add NLEN before NDEF message and adjust offset             */
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if NDEF file is selected and offset < T4T_FILE_LENGTH_SIZE */
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if ((p_t4t->status & CE_T4T_STATUS_NDEF_SELECTED) && (length > 0))
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (offset == 0)
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                UINT16_TO_BE_STREAM (p_dst, p_t4t->nlen);
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (length == 1)
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    length = 0;
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_dst--;
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else /* length >= 2 */
211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    length -= T4T_FILE_LENGTH_SIZE;
212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else if (offset == 1)
214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                UINT8_TO_BE_STREAM (p_dst, (UINT8) (p_t4t->nlen));
216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                offset = 0;
218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                length--;
219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                offset -= T4T_FILE_LENGTH_SIZE;
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (length > 0)
227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            memcpy (p_dst, p_src + offset, length);
229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_dst += length;
230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_BE_STREAM (p_dst, T4T_RSP_CMD_CMPLTED);
233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_r_apdu->len += T4T_RSP_STATUS_WORDS_SIZE;
234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!ce_t4t_send_to_lower (p_r_apdu))
236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return FALSE;
238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return TRUE;
240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR0 ("ce_t4t_read_binary (): No selected file");
244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!ce_t4t_send_status (T4T_RSP_CMD_NOT_ALLOWED))
246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return FALSE;
248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return TRUE;
250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ce_t4t_update_binary
256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Update file and send R-APDU to peer
258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN ce_t4t_update_binary (UINT16 offset, UINT8 length, UINT8 *p_data)
263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t;
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       *p;
266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8        file_length[2];
267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16       starting_offset, status_words;
268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_DATA     ce_data;
269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG3 ("ce_t4t_update_binary (): Offset:0x%04X, Length:0x%04X, selected status = 0x%02X",
271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      offset, length, p_t4t->status);
272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    starting_offset = offset;
274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* update file size (NLEN) */
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((offset < T4T_FILE_LENGTH_SIZE) && (length > 0))
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p = file_length;
279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_BE_STREAM (p, p_t4t->nlen);
280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        while ((offset < T4T_FILE_LENGTH_SIZE) && (length > 0))
282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            *(file_length + offset++) = *(p_data++);
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            length--;
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p = file_length;
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        BE_STREAM_TO_UINT16 (p_t4t->nlen, p);
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (length > 0)
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        memcpy (p_t4t->p_scratch_buf + offset - T4T_FILE_LENGTH_SIZE, p_data, length);
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    status_words = T4T_RSP_CMD_CMPLTED;
295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if this is the last step: writing non-zero length in NLEN */
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((starting_offset == 0) && (p_t4t->nlen > 0))
298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_stop_quick_timer (&p_t4t->timer);
300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (ce_cb.p_cback)
302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_data.update_info.status = NFC_STATUS_OK;
304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_data.update_info.length = p_t4t->nlen;
305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_data.update_info.p_data = p_t4t->p_scratch_buf;
306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            (*ce_cb.p_cback) (CE_T4T_NDEF_UPDATE_CPLT_EVT, &ce_data);
308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            CE_TRACE_DEBUG0 ("ce_t4t_update_binary (): Sent CE_T4T_NDEF_UPDATE_CPLT_EVT");
309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->status &= ~ (CE_T4T_STATUS_NDEF_FILE_UPDATING);
312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (!(p_t4t->status & CE_T4T_STATUS_NDEF_FILE_UPDATING))
314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* starting of updating */
316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->status |= CE_T4T_STATUS_NDEF_FILE_UPDATING;
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_start_quick_timer (&p_t4t->timer, NFC_TTYPE_CE_T4T_UPDATE,
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                               (CE_T4T_TOUT_UPDATE * QUICK_TIMER_TICKS_PER_SEC) / 1000);
320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (ce_cb.p_cback)
322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            (*ce_cb.p_cback) (CE_T4T_NDEF_UPDATE_START_EVT, NULL);
323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!ce_t4t_send_status (status_words))
326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status_words == T4T_RSP_CMD_CMPLTED)
331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return TRUE;
333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return FALSE;
335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ce_t4t_set_version_in_cc
340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      update version in CC file
342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  If reader selects NDEF Tag Application with V1.0 AID then
343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  set V1.0 into CC file.
344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  If reader selects NDEF Tag Application with V2.0 AID then
345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  set V2.0 into CC file.
346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void ce_t4t_set_version_in_cc (UINT8 version)
351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t;
353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       *p;
354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG1 ("ce_t4t_set_version_in_cc (): version = 0x%02X", version);
356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = p_t4t->cc_file + T4T_VERSION_OFFSET_IN_CC;
358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, version);
360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ce_t4t_process_select_file_cmd
365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function processes Select Command by file ID.
367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN ce_t4t_process_select_file_cmd (UINT8 *p_cmd)
372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8  data_len;
374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16 file_id, status_words;
375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG0 ("ce_t4t_process_select_file_cmd ()");
377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_cmd++; /* skip P2 */
379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Lc Byte */
381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BE_STREAM_TO_UINT8 (data_len, p_cmd);
382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (data_len == T4T_FILE_ID_SIZE)
384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* File ID */
386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        BE_STREAM_TO_UINT16 (file_id, p_cmd);
387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (ce_t4t_select_file (file_id))
389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            status_words = T4T_RSP_CMD_CMPLTED;
391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            status_words = T4T_RSP_NOT_FOUND;
395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status_words = T4T_RSP_WRONG_LENGTH;
400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!ce_t4t_send_status (status_words))
403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status_words == T4T_RSP_CMD_CMPLTED)
408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return TRUE;
410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return FALSE;
412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ce_t4t_process_select_app_cmd
417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function processes Select Command by AID.
419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void ce_t4t_process_select_app_cmd (UINT8 *p_cmd, BT_HDR *p_c_apdu)
424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8    data_len;
426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16   status_words = 0x0000; /* invalid status words */
427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_DATA ce_data;
428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8    xx;
429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG0 ("ce_t4t_process_select_app_cmd ()");
431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_cmd++; /* skip P2 */
433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Lc Byte */
435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BE_STREAM_TO_UINT8 (data_len, p_cmd);
436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (CE_TEST_INCLUDED == TRUE)
438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (mapping_aid_test_enabled)
439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (data_len == T4T_V20_NDEF_TAG_AID_LEN)
441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(!memcmp(p_cmd, ce_test_tag_app_id, data_len))
442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(ce_cb.mem.t4t.p_ndef_msg)  )
443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            GKI_freebuf (p_c_apdu);
445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_t4t_send_status ((UINT16) T4T_RSP_CMD_CMPLTED);
446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return;
447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /*
452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** Compare AIDs registered by applications
453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** if found, use callback of the application
454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** otherwise, return error and maintain the same status
455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    */
456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ce_cb.mem.t4t.selected_aid_idx = CE_T4T_MAX_REG_AID;
457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (xx = 0; xx < CE_T4T_MAX_REG_AID; xx++)
458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (ce_cb.mem.t4t.reg_aid[xx].aid_len > 0)
460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(ce_cb.mem.t4t.reg_aid[xx].aid_len == data_len)
461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(!(memcmp(ce_cb.mem.t4t.reg_aid[xx].aid, p_cmd, data_len)))  )
462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_cb.mem.t4t.selected_aid_idx = xx;
464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if found matched AID */
469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (ce_cb.mem.t4t.selected_aid_idx < CE_T4T_MAX_REG_AID)
470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_CC_FILE_SELECTED);
472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_NDEF_SELECTED);
473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_T4T_APP_SELECTED);
474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_WILDCARD_AID_SELECTED);
475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.mem.t4t.status |= CE_T4T_STATUS_REG_AID_SELECTED;
476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_DEBUG4 ("ce_t4t_process_select_app_cmd (): Registered AID[%02X%02X%02X%02X...] is selected",
478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                         ce_cb.mem.t4t.reg_aid[ce_cb.mem.t4t.selected_aid_idx].aid[0],
479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                         ce_cb.mem.t4t.reg_aid[ce_cb.mem.t4t.selected_aid_idx].aid[1],
480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                         ce_cb.mem.t4t.reg_aid[ce_cb.mem.t4t.selected_aid_idx].aid[2],
481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                         ce_cb.mem.t4t.reg_aid[ce_cb.mem.t4t.selected_aid_idx].aid[3]);
482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_data.raw_frame.status = NFC_STATUS_OK;
484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_data.raw_frame.p_data = p_c_apdu;
485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_data.raw_frame.aid_handle = ce_cb.mem.t4t.selected_aid_idx;
486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_c_apdu = NULL;
488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        (*(ce_cb.mem.t4t.reg_aid[ce_cb.mem.t4t.selected_aid_idx].p_cback)) (CE_T4T_RAW_FRAME_EVT, &ce_data);
490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (  (data_len == T4T_V20_NDEF_TAG_AID_LEN)
492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             &&(!memcmp(p_cmd, t4t_v20_ndef_tag_aid, data_len - 1))
493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             &&(ce_cb.mem.t4t.p_ndef_msg)  )
494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_cmd += data_len - 1;
496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* adjust version if possible */
498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if ((*p_cmd) == 0x00)
499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_t4t_set_version_in_cc (T4T_VERSION_1_0);
501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            status_words = T4T_RSP_CMD_CMPLTED;
502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if ((*p_cmd) == 0x01)
504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_t4t_set_version_in_cc (T4T_VERSION_2_0);
506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            status_words = T4T_RSP_CMD_CMPLTED;
507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            CE_TRACE_DEBUG0 ("ce_t4t_process_select_app_cmd (): Not found matched AID");
511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            status_words = T4T_RSP_NOT_FOUND;
512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (ce_cb.mem.t4t.p_wildcard_aid_cback)
515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_CC_FILE_SELECTED);
517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_NDEF_SELECTED);
518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_T4T_APP_SELECTED);
519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_REG_AID_SELECTED);
520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_cb.mem.t4t.status |= CE_T4T_STATUS_WILDCARD_AID_SELECTED;
521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_data.raw_frame.status = NFC_STATUS_OK;
523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_data.raw_frame.p_data = p_c_apdu;
524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_data.raw_frame.aid_handle = CE_T4T_WILDCARD_AID_HANDLE;
525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_c_apdu = NULL;
526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_DEBUG0 ("CET4T: Forward raw frame (SELECT APP) to wildcard AID handler");
528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        (*(ce_cb.mem.t4t.p_wildcard_aid_cback)) (CE_T4T_RAW_FRAME_EVT, &ce_data);
529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_DEBUG0 ("ce_t4t_process_select_app_cmd (): Not found matched AID or not listening T4T NDEF");
533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status_words = T4T_RSP_NOT_FOUND;
534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status_words)
537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if T4T CE can support */
539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (status_words == T4T_RSP_CMD_CMPLTED)
540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_CC_FILE_SELECTED);
542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_NDEF_SELECTED);
543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_REG_AID_SELECTED);
544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_WILDCARD_AID_SELECTED);
545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_cb.mem.t4t.status |= CE_T4T_STATUS_T4T_APP_SELECTED;
546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            CE_TRACE_DEBUG0 ("ce_t4t_process_select_app_cmd (): T4T CE App selected");
548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_t4t_send_status (status_words);
551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_c_apdu);
552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if status_words is not set then upper layer will send R-APDU */
554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return;
556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ce_t4t_process_timeout
561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      process timeout event
563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid ce_t4t_process_timeout (TIMER_LIST_ENT *p_tle)
568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t;
570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_DATA     ce_data;
571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG1 ("ce_t4t_process_timeout () event=%d", p_tle->event);
573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_tle->event == NFC_TTYPE_CE_T4T_UPDATE)
575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t4t->status & CE_T4T_STATUS_NDEF_FILE_UPDATING)
577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_data.status = NFC_STATUS_TIMEOUT;
579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (ce_cb.p_cback)
581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                (*ce_cb.p_cback) (CE_T4T_NDEF_UPDATE_ABORT_EVT, &ce_data);
582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t4t->status &= ~ (CE_T4T_STATUS_NDEF_FILE_UPDATING);
584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR1 ("ce_t4t_process_timeout () unknown event=%d", p_tle->event);
589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ce_t4t_data_cback
595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This callback function receives the data from NFCC.
597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void ce_t4t_data_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data)
602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR  *p_c_apdu = (BT_HDR *) p_data->data.p_data;
604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   *p_cmd;
605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8    cla, instruct, select_type = 0, length;
606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16   offset, max_file_size;
607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_DATA ce_data;
608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (event == NFC_DEACTIVATE_CEVT)
610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFC_SetStaticRfCback (NULL);
612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (event != NFC_DATA_CEVT)
615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE)
620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    DispCET4Tags (p_c_apdu, TRUE);
621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG1 ("ce_t4t_data_cback (): conn_id = 0x%02X", conn_id);
624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_cmd = (UINT8 *) (p_c_apdu + 1) + p_c_apdu->offset;
626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Class Byte */
628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BE_STREAM_TO_UINT8 (cla, p_cmd);
629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Don't check class if registered AID has been selected */
631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (cla != T4T_CMD_CLASS)
632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&((ce_cb.mem.t4t.status & CE_T4T_STATUS_REG_AID_SELECTED) == 0)  )
633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR1 ("CET4T: Unsupported Class byte (0x%02X)", cla);
635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_c_apdu);
636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_t4t_send_status (T4T_RSP_CLASS_NOT_SUPPORTED);
637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Instruction Byte */
641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BE_STREAM_TO_UINT8 (instruct, p_cmd);
642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((cla == T4T_CMD_CLASS) && (instruct == T4T_CMD_INS_SELECT))
644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* P1 Byte */
646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        BE_STREAM_TO_UINT8 (select_type, p_cmd);
647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (select_type == T4T_CMD_P1_SELECT_BY_NAME)
649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_t4t_process_select_app_cmd (p_cmd, p_c_apdu);
651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return;
652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if registered AID is selected */
656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (ce_cb.mem.t4t.status & CE_T4T_STATUS_REG_AID_SELECTED)
657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_DEBUG0 ("CET4T: Forward raw frame to registered AID");
659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* forward raw frame to upper layer */
661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (ce_cb.mem.t4t.selected_aid_idx < NFC_MAX_AID_LEN)
662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_data.raw_frame.status = NFC_STATUS_OK;
664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_data.raw_frame.p_data = p_c_apdu;
665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_data.raw_frame.aid_handle = ce_cb.mem.t4t.selected_aid_idx;
666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_c_apdu = NULL;
667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            (*(ce_cb.mem.t4t.reg_aid[ce_cb.mem.t4t.selected_aid_idx].p_cback)) (CE_T4T_RAW_FRAME_EVT, &ce_data);
669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            GKI_freebuf (p_c_apdu);
673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_t4t_send_status (T4T_RSP_NOT_FOUND);
674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (ce_cb.mem.t4t.status & CE_T4T_STATUS_WILDCARD_AID_SELECTED)
677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_DEBUG0 ("CET4T: Forward raw frame to wildcard AID handler");
679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* forward raw frame to upper layer */
681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_data.raw_frame.status = NFC_STATUS_OK;
682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_data.raw_frame.p_data = p_c_apdu;
683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_data.raw_frame.aid_handle = CE_T4T_WILDCARD_AID_HANDLE;
684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_c_apdu = NULL;
685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        (*(ce_cb.mem.t4t.p_wildcard_aid_cback)) (CE_T4T_RAW_FRAME_EVT, &ce_data);
687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (ce_cb.mem.t4t.status & CE_T4T_STATUS_T4T_APP_SELECTED)
689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (instruct == T4T_CMD_INS_SELECT)
691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* P1 Byte is already parsed */
693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (select_type == T4T_CMD_P1_SELECT_BY_FILE_ID)
694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ce_t4t_process_select_file_cmd (p_cmd);
696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                CE_TRACE_ERROR1 ("CET4T: Bad P1 byte (0x%02X)", select_type);
700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ce_t4t_send_status (T4T_RSP_WRONG_PARAMS);
701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (instruct == T4T_CMD_INS_READ_BINARY)
704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (  (ce_cb.mem.t4t.status & CE_T4T_STATUS_CC_FILE_SELECTED)
706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ||(ce_cb.mem.t4t.status & CE_T4T_STATUS_NDEF_SELECTED)  )
707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (ce_cb.mem.t4t.status & CE_T4T_STATUS_CC_FILE_SELECTED)
709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    max_file_size = T4T_FC_TLV_OFFSET_IN_CC + T4T_FILE_CONTROL_TLV_SIZE;
711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    max_file_size = ce_cb.mem.t4t.max_file_size;
715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                BE_STREAM_TO_UINT16 (offset, p_cmd); /* Offset */
718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                BE_STREAM_TO_UINT8 (length, p_cmd); /* Le     */
719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* check if valid parameters */
721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (length <= CE_T4T_MAX_LE)
722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* CE allows to read more than current file size but not max file size */
724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (length + offset > max_file_size)
725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        if (offset < max_file_size)
727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        {
728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            length = (UINT8) (max_file_size - offset);
729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            CE_TRACE_DEBUG2 ("CET4T: length is reduced to %d by max_file_size (%d)",
731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                              length, max_file_size);
732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        }
733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        else
734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        {
735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            CE_TRACE_ERROR2 ("CET4T: offset (%d) must be less than max_file_size (%d)",
736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                              offset, max_file_size);
737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            length = 0;
738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        }
739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    CE_TRACE_ERROR2 ("CET4T: length (%d) must be less than MLe (%d)",
744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      length, CE_T4T_MAX_LE);
745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    length = 0;
746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (length > 0)
749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ce_t4t_read_binary (offset, length);
750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ce_t4t_send_status (T4T_RSP_WRONG_PARAMS);
752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                CE_TRACE_ERROR0 ("CET4T: File has not been selected");
756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ce_t4t_send_status (T4T_RSP_CMD_NOT_ALLOWED);
757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (instruct == T4T_CMD_INS_UPDATE_BINARY)
760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (ce_cb.mem.t4t.status & CE_T4T_STATUS_NDEF_FILE_READ_ONLY)
762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                CE_TRACE_ERROR0 ("CET4T: No access right");
764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ce_t4t_send_status (T4T_RSP_CMD_NOT_ALLOWED);
765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else if (ce_cb.mem.t4t.status & CE_T4T_STATUS_NDEF_SELECTED)
767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                BE_STREAM_TO_UINT16 (offset, p_cmd); /* Offset */
769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                BE_STREAM_TO_UINT8 (length, p_cmd); /* Lc     */
770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* check if valid parameters */
772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (length <= CE_T4T_MAX_LC)
773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (length + offset > ce_cb.mem.t4t.max_file_size)
775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        CE_TRACE_ERROR3 ("CET4T: length (%d) + offset (%d) must be less than max_file_size (%d)",
777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                          length, offset, ce_cb.mem.t4t.max_file_size);
778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        length = 0;
779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    CE_TRACE_ERROR2 ("CET4T: length (%d) must be less than MLc (%d)",
784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      length, CE_T4T_MAX_LC);
785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    length = 0;
786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (length > 0)
789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ce_t4t_update_binary (offset, length, p_cmd);
790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ce_t4t_send_status (T4T_RSP_WRONG_PARAMS);
792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                CE_TRACE_ERROR0 ("CET4T: NDEF File has not been selected");
796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ce_t4t_send_status (T4T_RSP_CMD_NOT_ALLOWED);
797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            CE_TRACE_ERROR1 ("CET4T: Unsupported Instruction byte (0x%02X)", instruct);
802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_t4t_send_status (T4T_RSP_INSTR_NOT_SUPPORTED);
803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR0 ("CET4T: Application has not been selected");
808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ce_t4t_send_status (T4T_RSP_CMD_NOT_ALLOWED);
809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_c_apdu)
812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_c_apdu);
813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ce_select_t4t
818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Select Type 4 Tag
820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS ce_select_t4t (void)
825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t;
827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG0 ("ce_select_t4t ()");
829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfc_stop_quick_timer (&p_t4t->timer);
831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* clear other than read-only flag */
833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t4t->status &= CE_T4T_STATUS_NDEF_FILE_READ_ONLY;
834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_SetStaticRfCback (ce_t4t_data_cback);
836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return NFC_STATUS_OK;
838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         CE_T4tSetLocalNDEFMsg
843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Initialise CE Type 4 Tag with mandatory NDEF message
845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  The following event may be returned
847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      CE_T4T_UPDATE_START_EVT for starting update
848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      CE_T4T_UPDATE_CPLT_EVT for complete update
849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      CE_T4T_UPDATE_ABORT_EVT for failure of update
850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      CE_T4T_RAW_FRAME_EVT for raw frame
851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  read_only:      TRUE if read only
853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  ndef_msg_max:   Max NDEF message size
854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  ndef_msg_len:   NDEF message size
855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  p_ndef_msg:     NDEF message (excluding NLEN)
856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  p_scratch_buf:  temp storage for update
857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS CE_T4tSetLocalNDEFMsg (BOOLEAN    read_only,
862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   UINT16     ndef_msg_max,
863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   UINT16     ndef_msg_len,
864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   UINT8      *p_ndef_msg,
865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   UINT8      *p_scratch_buf)
866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t;
868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       *p;
869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_API3 ("CE_T4tSetLocalNDEFMsg () read_only=%d, ndef_msg_max=%d, ndef_msg_len=%d",
871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                   read_only, ndef_msg_max, ndef_msg_len);
872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!p_ndef_msg)
874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->p_ndef_msg = NULL;
876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_DEBUG0 ("CE_T4tSetLocalNDEFMsg (): T4T is disabled");
878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return NFC_STATUS_OK;
879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((!read_only) && (!p_scratch_buf))
882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR0 ("CE_T4tSetLocalNDEFMsg (): p_scratch_buf cannot be NULL if not read-only");
884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return NFC_STATUS_FAILED;
885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (CE_TEST_INCLUDED == TRUE)
888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    mapping_aid_test_enabled = FALSE;
889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Initialise CC file */
892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = p_t4t->cc_file;
893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_BE_STREAM (p, T4T_CC_FILE_MIN_LEN);
895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T4T_MY_VERSION);
896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_BE_STREAM (p, CE_T4T_MAX_LE);
897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_BE_STREAM (p, CE_T4T_MAX_LC);
898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Mandatory NDEF File Control TLV */
900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T4T_NDEF_FILE_CONTROL_TYPE);            /* type */
901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T4T_FILE_CONTROL_LENGTH);               /* length */
902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_BE_STREAM (p, CE_T4T_MANDATORY_NDEF_FILE_ID);         /* file ID */
903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_BE_STREAM (p, ndef_msg_max + T4T_FILE_LENGTH_SIZE);   /* max NDEF file size */
904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T4T_FC_READ_ACCESS);                    /* read access */
905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (read_only)
907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, T4T_FC_NO_WRITE_ACCESS);    /* read only */
909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->status |= CE_T4T_STATUS_NDEF_FILE_READ_ONLY;
910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, T4T_FC_WRITE_ACCESS);       /* write access */
914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->status &= ~ (CE_T4T_STATUS_NDEF_FILE_READ_ONLY);
915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* set mandatory NDEF file */
918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t4t->p_ndef_msg    = p_ndef_msg;
919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t4t->nlen          = ndef_msg_len;
920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t4t->max_file_size = ndef_msg_max + T4T_FILE_LENGTH_SIZE;
921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Initialize scratch buffer */
923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t4t->p_scratch_buf = p_scratch_buf;
924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_scratch_buf)
926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        memcpy (p_scratch_buf, p_ndef_msg, ndef_msg_len);
928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return NFC_STATUS_OK;
931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         CE_T4tRegisterAID
936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Register AID in CE T4T
938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  aid_len: length of AID (up to NFC_MAX_AID_LEN)
940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  p_aid:   AID
941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  p_cback: Raw frame will be forwarded with CE_RAW_FRAME_EVT
942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tCE_T4T_AID_HANDLE if successful,
944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  CE_T4T_AID_HANDLE_INVALID otherwisse
945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttCE_T4T_AID_HANDLE CE_T4tRegisterAID (UINT8 aid_len, UINT8 *p_aid, tCE_CBACK *p_cback)
948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t;
950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       xx;
951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Handle registering callback for wildcard AID (all AIDs) */
953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (aid_len == 0)
954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_API0 ("CE_T4tRegisterAID (): registering callback for wildcard AID ");
956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Check if a wildcard callback is already registered (only one is allowed) */
958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t4t->p_wildcard_aid_cback != NULL)
959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            CE_TRACE_ERROR0 ("CE_T4tRegisterAID (): only one wildcard AID can be registered at time.");
961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return CE_T4T_AID_HANDLE_INVALID;
962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_DEBUG1 ("CE_T4tRegisterAID (): handle 0x%02x registered (for wildcard AID)", CE_T4T_WILDCARD_AID_HANDLE);
965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->p_wildcard_aid_cback = p_cback;
966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return CE_T4T_WILDCARD_AID_HANDLE;
967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_API5 ("CE_T4tRegisterAID () AID [%02X%02X%02X%02X...], %d bytes",
971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                   *p_aid, *(p_aid+1), *(p_aid+2), *(p_aid+3), aid_len);
972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (aid_len > NFC_MAX_AID_LEN)
974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR1 ("CE_T4tRegisterAID (): AID is up to %d bytes", NFC_MAX_AID_LEN);
976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return CE_T4T_AID_HANDLE_INVALID;
977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_cback == NULL)
980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR0 ("CE_T4tRegisterAID (): callback must be provided");
982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return CE_T4T_AID_HANDLE_INVALID;
983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (xx = 0; xx < CE_T4T_MAX_REG_AID; xx++)
986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (p_t4t->reg_aid[xx].aid_len == aid_len)
988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(!(memcmp(p_t4t->reg_aid[xx].aid, p_aid, aid_len)))  )
989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            CE_TRACE_ERROR0 ("CE_T4tRegisterAID (): already registered");
991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return CE_T4T_AID_HANDLE_INVALID;
992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (xx = 0; xx < CE_T4T_MAX_REG_AID; xx++)
996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t4t->reg_aid[xx].aid_len == 0)
998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t4t->reg_aid[xx].aid_len = aid_len;
1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t4t->reg_aid[xx].p_cback = p_cback;
1001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            memcpy (p_t4t->reg_aid[xx].aid, p_aid, aid_len);
1002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
1003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (xx >= CE_T4T_MAX_REG_AID)
1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR0 ("CE_T4tRegisterAID (): No resource");
1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return CE_T4T_AID_HANDLE_INVALID;
1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_DEBUG1 ("CE_T4tRegisterAID (): handle 0x%02x registered", xx);
1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (xx);
1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         CE_T4tDeregisterAID
1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Deregister AID in CE T4T
1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectNFC_API extern void CE_T4tDeregisterAID (tCE_T4T_AID_HANDLE aid_handle)
1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t;
1031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_API1 ("CE_T4tDeregisterAID () handle 0x%02x", aid_handle);
1033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check if deregistering wildcard AID */
1035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (aid_handle == CE_T4T_WILDCARD_AID_HANDLE)
1036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t4t->p_wildcard_aid_cback != NULL)
1038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t4t->p_wildcard_aid_cback = NULL;
1040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            CE_TRACE_ERROR0 ("CE_T4tDeregisterAID (): Invalid handle");
1044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
1046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Deregister AID */
1049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((aid_handle >= CE_T4T_MAX_REG_AID) || (p_t4t->reg_aid[aid_handle].aid_len==0))
1050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        CE_TRACE_ERROR0 ("CE_T4tDeregisterAID (): Invalid handle");
1052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->reg_aid[aid_handle].aid_len = 0;
1056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->reg_aid[aid_handle].p_cback = NULL;
1057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         CE_T4TTestSetCC
1063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set fields in Capability Container File for testing
1065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
1067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS CE_T4TTestSetCC (UINT16 cc_len,
1070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             UINT8  version,
1071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             UINT16 max_le,
1072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             UINT16 max_lc)
1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (CE_TEST_INCLUDED == TRUE)
1075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t;
1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       *p;
1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG4 ("CE_T4TTestSetCC (): CCLen:0x%04X, Ver:0x%02X, MaxLe:0x%04X, MaxLc:0x%04X",
1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      cc_len, version, max_le, max_lc);
1080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* CC file */
1082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = p_t4t->cc_file;
1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (cc_len != 0xFFFF)
1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_BE_STREAM (p, cc_len);
1087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p += 2;
1090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (version != 0xFF)
1092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        mapping_aid_test_enabled = TRUE;
1094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (version == T4T_VERSION_1_0)
1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_test_tag_app_id[T4T_V20_NDEF_TAG_AID_LEN - 1] = 0x00;
1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (version == T4T_VERSION_2_0)
1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_test_tag_app_id[T4T_V20_NDEF_TAG_AID_LEN - 1] = 0x01;
1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else /* Undefined version */
1099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ce_test_tag_app_id[T4T_V20_NDEF_TAG_AID_LEN - 1] = 0xFF;
1100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, version);
1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        mapping_aid_test_enabled = FALSE;
1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p += 1;
1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (max_le != 0xFFFF)
1110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_BE_STREAM (p, max_le);
1112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p += 2;
1115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (max_lc != 0xFFFF)
1117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_BE_STREAM (p, max_lc);
1119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p += 2;
1122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return NFC_STATUS_OK;
1124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
1125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return NFC_STATUS_FAILED;
1126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         CE_T4TTestSetNDEFCtrlTLV
1132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set fields in NDEF File Control TLV for testing
1134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
1136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS CE_T4TTestSetNDEFCtrlTLV (UINT8  type,
1139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      UINT8  length,
1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      UINT16 file_id,
1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      UINT16 max_file_size,
1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      UINT8  read_access,
1143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      UINT8  write_access)
1144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (CE_TEST_INCLUDED == TRUE)
1146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t;
1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       *p;
1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    CE_TRACE_DEBUG6 ("CE_T4TTestSetNDEFCtrlTLV (): type:0x%02X, len:0x%02X, FileID:0x%04X, MaxFile:0x%04X, RdAcc:0x%02X, WrAcc:0x%02X",
1150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      type, length, file_id, max_file_size, read_access, write_access);
1151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* NDEF File control TLV */
1153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = p_t4t->cc_file + T4T_FC_TLV_OFFSET_IN_CC;
1154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (type != 0xFF)
1156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, type);
1158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p += 1;
1161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (length != 0xFF)
1163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, length);
1165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p += 1;
1168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (file_id != 0xFFFF)
1170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_BE_STREAM (p, file_id);
1172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p += 2;
1175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (max_file_size != 0xFFFF)
1177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_BE_STREAM (p, max_file_size);
1179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p += 2;
1182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (read_access != 0xFF)
1184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, read_access);
1186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p += 1;
1189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (write_access != 0xFF)
1191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, write_access);
1193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p += 1;
1196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return NFC_STATUS_OK;
1198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
1199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return NFC_STATUS_FAILED;
1200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* NFC_INCLUDED == TRUE */
1203