1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu *  Copyright (C) 2010-2014 Broadcom Corporation
4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  you may not use this file except in compliance with the License.
7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  You may obtain a copy of the License at:
8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  See the License for the specific language governing permissions and
15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  limitations under the License.
16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  This file contains the implementation for Type 4 tag in Reader/Writer
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  mode.
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h>
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_target.h"
28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "bt_types.h"
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "trace_api.h"
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_INCLUDED == TRUE)
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_api.h"
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_int.h"
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "rw_api.h"
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "rw_int.h"
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "tags_int.h"
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "gki.h"
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* main state */
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_STATE_NOT_ACTIVATED              0x00    /* T4T is not activated                 */
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_STATE_IDLE                       0x01    /* waiting for upper layer API          */
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_STATE_DETECT_NDEF                0x02    /* performing NDEF detection precedure  */
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_STATE_READ_NDEF                  0x03    /* performing read NDEF procedure       */
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_STATE_UPDATE_NDEF                0x04    /* performing update NDEF procedure     */
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_STATE_PRESENCE_CHECK             0x05    /* checking presence of tag             */
475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define RW_T4T_STATE_SET_READ_ONLY              0x06    /* convert tag to read only             */
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* sub state */
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_SUBSTATE_WAIT_SELECT_APP         0x00    /* waiting for response of selecting AID    */
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_SUBSTATE_WAIT_SELECT_CC          0x01    /* waiting for response of selecting CC     */
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_SUBSTATE_WAIT_CC_FILE            0x02    /* waiting for response of reading CC       */
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_SUBSTATE_WAIT_SELECT_NDEF_FILE   0x03    /* waiting for response of selecting NDEF   */
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_SUBSTATE_WAIT_READ_NLEN          0x04    /* waiting for response of reading NLEN     */
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_SUBSTATE_WAIT_READ_RESP          0x05    /* waiting for response of reading file     */
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_SUBSTATE_WAIT_UPDATE_RESP        0x06    /* waiting for response of updating file    */
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_SUBSTATE_WAIT_UPDATE_NLEN        0x07    /* waiting for response of updating NLEN    */
585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define RW_T4T_SUBSTATE_WAIT_UPDATE_CC          0x08    /* waiting for response of updating CC      */
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *rw_t4t_get_state_name (UINT8 state);
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *rw_t4t_get_sub_state_name (UINT8 sub_state);
63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_send_to_lower (BT_HDR *p_c_apdu);
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_select_file (UINT16 file_id);
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_read_file (UINT16 offset, UINT16 length, BOOLEAN is_continue);
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_update_nlen (UINT16 ndef_len);
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_update_file (void);
705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic BOOLEAN rw_t4t_update_cc_to_readonly (void);
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_select_application (UINT8 version);
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_validate_cc_file (void);
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t4t_handle_error (tNFC_STATUS status, UINT8 sw1, UINT8 sw2);
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t4t_sm_detect_ndef (BT_HDR *p_r_apdu);
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t4t_sm_read_ndef (BT_HDR *p_r_apdu);
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t4t_sm_update_ndef (BT_HDR  *p_r_apdu);
775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic void rw_t4t_sm_set_readonly (BT_HDR  *p_r_apdu);
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t4t_data_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data);
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t4t_send_to_lower
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send C-APDU to lower layer
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_send_to_lower (BT_HDR *p_c_apdu)
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE)
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    DispRWT4Tags (p_c_apdu, FALSE);
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (NFC_SendData (NFC_RF_CONN_ID, p_c_apdu) != NFC_STATUS_OK)
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR0 ("rw_t4t_send_to_lower (): NFC_SendData () failed");
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfc_start_quick_timer (&rw_cb.tcb.t4t.timer, NFC_TTYPE_RW_T4T_RESPONSE,
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                           (RW_T4T_TOUT_RESP * QUICK_TIMER_TICKS_PER_SEC) / 1000);
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return TRUE;
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t4t_select_file
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send Select Command (by File ID) to peer
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_select_file (UINT16 file_id)
117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR      *p_c_apdu;
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       *p;
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    RW_TRACE_DEBUG1 ("rw_t4t_select_file (): File ID:0x%04X", file_id);
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_c_apdu = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID);
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!p_c_apdu)
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR0 ("rw_t4t_select_file (): Cannot allocate buffer");
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_c_apdu->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = (UINT8 *) (p_c_apdu + 1) + p_c_apdu->offset;
133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T4T_CMD_CLASS);
135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T4T_CMD_INS_SELECT);
136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T4T_CMD_P1_SELECT_BY_FILE_ID);
137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if current version mapping is V2.0 */
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (rw_cb.tcb.t4t.version == T4T_VERSION_2_0)
140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, T4T_CMD_P2_FIRST_OR_ONLY_0CH);
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else /* version 1.0 */
144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, T4T_CMD_P2_FIRST_OR_ONLY_00H);
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T4T_FILE_ID_SIZE);
149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_BE_STREAM (p, file_id);
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_c_apdu->len = T4T_CMD_MAX_HDR_SIZE + T4T_FILE_ID_SIZE;
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!rw_t4t_send_to_lower (p_c_apdu))
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return TRUE;
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t4t_read_file
164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send ReadBinary Command to peer
166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_read_file (UINT16 offset, UINT16 length, BOOLEAN is_continue)
171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T4T_CB      *p_t4t = &rw_cb.tcb.t4t;
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR          *p_c_apdu;
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           *p;
175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    RW_TRACE_DEBUG3 ("rw_t4t_read_file () offset:%d, length:%d, is_continue:%d, ",
177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      offset, length, is_continue);
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_c_apdu = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID);
180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!p_c_apdu)
182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR0 ("rw_t4t_read_file (): Cannot allocate buffer");
184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if this is the first reading */
188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (is_continue == FALSE)
189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* initialise starting offset and total length */
191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* these will be updated when receiving response */
192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->rw_offset = offset;
193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->rw_length = length;
194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* adjust reading length if payload is bigger than max size per single command */
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (length > p_t4t->max_read_size)
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        length = (UINT8) (p_t4t->max_read_size);
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_c_apdu->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = (UINT8 *) (p_c_apdu + 1) + p_c_apdu->offset;
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
205a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    UINT8_TO_BE_STREAM (p, (T4T_CMD_CLASS | rw_cb.tcb.t4t.channel));
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T4T_CMD_INS_READ_BINARY);
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_BE_STREAM (p, offset);
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, length); /* Le */
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_c_apdu->len = T4T_CMD_MIN_HDR_SIZE + 1; /* adding Le */
211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!rw_t4t_send_to_lower (p_c_apdu))
213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return TRUE;
218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t4t_update_nlen
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send UpdateBinary Command to update NLEN to peer
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_update_nlen (UINT16 ndef_len)
230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR          *p_c_apdu;
232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           *p;
233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    RW_TRACE_DEBUG1 ("rw_t4t_update_nlen () NLEN:%d", ndef_len);
235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_c_apdu = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID);
237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!p_c_apdu)
239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR0 ("rw_t4t_update_nlen (): Cannot allocate buffer");
241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_c_apdu->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = (UINT8 *) (p_c_apdu + 1) + p_c_apdu->offset;
246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T4T_CMD_CLASS);
248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T4T_CMD_INS_UPDATE_BINARY);
249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_BE_STREAM (p, 0x0000);                    /* offset for NLEN */
250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T4T_FILE_LENGTH_SIZE);
251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_BE_STREAM (p, ndef_len);
252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_c_apdu->len = T4T_CMD_MAX_HDR_SIZE + T4T_FILE_LENGTH_SIZE;
254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!rw_t4t_send_to_lower (p_c_apdu))
256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return TRUE;
261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t4t_update_file
266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send UpdateBinary Command to peer
268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_update_file (void)
273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T4T_CB      *p_t4t = &rw_cb.tcb.t4t;
275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR          *p_c_apdu;
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           *p;
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16          length;
278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    RW_TRACE_DEBUG2 ("rw_t4t_update_file () rw_offset:%d, rw_length:%d",
280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      p_t4t->rw_offset, p_t4t->rw_length);
281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_c_apdu = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID);
283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!p_c_apdu)
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR0 ("rw_t4t_write_file (): Cannot allocate buffer");
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* try to send all of remaining data */
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    length = p_t4t->rw_length;
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* adjust updating length if payload is bigger than max size per single command */
294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (length > p_t4t->max_update_size)
295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        length = (UINT8) (p_t4t->max_update_size);
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_c_apdu->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = (UINT8 *) (p_c_apdu + 1) + p_c_apdu->offset;
301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T4T_CMD_CLASS);
303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T4T_CMD_INS_UPDATE_BINARY);
304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_BE_STREAM (p, p_t4t->rw_offset);
305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, length);
306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    memcpy (p, p_t4t->p_update_data, length);
308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_c_apdu->len = T4T_CMD_MAX_HDR_SIZE + length;
310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!rw_t4t_send_to_lower (p_c_apdu))
312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* adjust offset, length and pointer for remaining data */
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t4t->rw_offset     += length;
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t4t->rw_length     -= length;
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t4t->p_update_data += length;
320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return TRUE;
322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         rw_t4t_update_cc_to_readonly
3275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
3285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      Send UpdateBinary Command for changing Write access
3295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
3305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns          TRUE if success
3315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
3325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
3335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic BOOLEAN rw_t4t_update_cc_to_readonly (void)
3345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{
3355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    BT_HDR          *p_c_apdu;
3365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8           *p;
3375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    RW_TRACE_DEBUG0 ("rw_t4t_update_cc_to_readonly (): Remove Write access from CC");
3395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    p_c_apdu = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID);
3415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (!p_c_apdu)
3435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
3445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        RW_TRACE_ERROR0 ("rw_t4t_update_cc_to_readonly (): Cannot allocate buffer");
3455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        return FALSE;
3465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
3475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    p_c_apdu->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
3495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    p = (UINT8 *) (p_c_apdu + 1) + p_c_apdu->offset;
3505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    /* Add Command Header */
3525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8_TO_BE_STREAM (p, T4T_CMD_CLASS);
3535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8_TO_BE_STREAM (p, T4T_CMD_INS_UPDATE_BINARY);
3545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT16_TO_BE_STREAM (p, (T4T_FC_TLV_OFFSET_IN_CC + T4T_FC_WRITE_ACCESS_OFFSET_IN_TLV)); /* Offset for Read Write access byte of CC */
3555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8_TO_BE_STREAM (p, 1); /* Length of write access field in cc interms of bytes */
3565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    /* Remove Write access */
3585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8_TO_BE_STREAM (p, T4T_FC_NO_WRITE_ACCESS);
3595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    p_c_apdu->len = T4T_CMD_MAX_HDR_SIZE + 1;
3625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (!rw_t4t_send_to_lower (p_c_apdu))
3645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
3655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        return FALSE;
3665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
3675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    return TRUE;
3695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
3705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
3715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
3725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t4t_select_application
374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Select Application
376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NDEF Tag Application Select - C-APDU
378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        CLA INS P1 P2 Lc Data(AID)      Le
380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  V1.0: 00  A4  04 00 07 D2760000850100 -
381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  V2.0: 00  A4  04 00 07 D2760000850101 00
382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_select_application (UINT8 version)
387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR      *p_c_apdu;
389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       *p;
390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    RW_TRACE_DEBUG1 ("rw_t4t_select_application () version:0x%X", version);
392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_c_apdu = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID);
394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!p_c_apdu)
396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR0 ("rw_t4t_select_application (): Cannot allocate buffer");
398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_c_apdu->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = (UINT8 *) (p_c_apdu + 1) + p_c_apdu->offset;
403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T4T_CMD_CLASS);
405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T4T_CMD_INS_SELECT);
406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T4T_CMD_P1_SELECT_BY_NAME);
407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T4T_CMD_P2_FIRST_OR_ONLY_00H);
408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (version == T4T_VERSION_1_0)   /* this is for V1.0 */
410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, T4T_V10_NDEF_TAG_AID_LEN);
412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        memcpy (p, t4t_v10_ndef_tag_aid, T4T_V10_NDEF_TAG_AID_LEN);
414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_c_apdu->len = T4T_CMD_MAX_HDR_SIZE + T4T_V10_NDEF_TAG_AID_LEN;
416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (version == T4T_VERSION_2_0)   /* this is for V2.0 */
418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, T4T_V20_NDEF_TAG_AID_LEN);
420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        memcpy (p, t4t_v20_ndef_tag_aid, T4T_V20_NDEF_TAG_AID_LEN);
422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p += T4T_V20_NDEF_TAG_AID_LEN;
423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, 0x00); /* Le set to 0x00 */
425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_c_apdu->len = T4T_CMD_MAX_HDR_SIZE + T4T_V20_NDEF_TAG_AID_LEN + 1;
427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!rw_t4t_send_to_lower (p_c_apdu))
434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return TRUE;
439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t4t_validate_cc_file
444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Validate CC file and mandatory NDEF TLV
446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_validate_cc_file (void)
451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T4T_CB  *p_t4t = &rw_cb.tcb.t4t;
453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    RW_TRACE_DEBUG0 ("rw_t4t_validate_cc_file ()");
455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_t4t->cc_file.cclen < T4T_CC_FILE_MIN_LEN)
457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR1 ("rw_t4t_validate_cc_file (): CCLEN (%d) is too short",
459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                         p_t4t->cc_file.cclen);
460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (T4T_GET_MAJOR_VERSION (p_t4t->cc_file.version) != T4T_GET_MAJOR_VERSION (p_t4t->version))
464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR2 ("rw_t4t_validate_cc_file (): Peer version (0x%02X) is matched to ours (0x%02X)",
466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                         p_t4t->cc_file.version, p_t4t->version);
467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_t4t->cc_file.max_le < 0x000F)
471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR1 ("rw_t4t_validate_cc_file (): MaxLe (%d) is too small",
473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                         p_t4t->cc_file.max_le);
474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_t4t->cc_file.max_lc < 0x0001)
478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR1 ("rw_t4t_validate_cc_file (): MaxLc (%d) is too small",
480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                         p_t4t->cc_file.max_lc);
481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (p_t4t->cc_file.ndef_fc.file_id == T4T_CC_FILE_ID)
485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ||(p_t4t->cc_file.ndef_fc.file_id == 0xE102)
486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ||(p_t4t->cc_file.ndef_fc.file_id == 0xE103)
487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ||((p_t4t->cc_file.ndef_fc.file_id == 0x0000) && (p_t4t->cc_file.version == 0x20))
488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ||(p_t4t->cc_file.ndef_fc.file_id == 0x3F00)
489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ||(p_t4t->cc_file.ndef_fc.file_id == 0x3FFF)
490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ||(p_t4t->cc_file.ndef_fc.file_id == 0xFFFF)  )
491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR1 ("rw_t4t_validate_cc_file (): File ID (0x%04X) is invalid",
493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                          p_t4t->cc_file.ndef_fc.file_id);
494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (p_t4t->cc_file.ndef_fc.max_file_size < 0x0005)
498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ||(p_t4t->cc_file.ndef_fc.max_file_size == 0xFFFF)  )
499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR1 ("rw_t4t_validate_cc_file (): max_file_size (%d) is reserved",
501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                         p_t4t->cc_file.ndef_fc.max_file_size);
502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_t4t->cc_file.ndef_fc.read_access != T4T_FC_READ_ACCESS)
506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR1 ("rw_t4t_validate_cc_file (): Read Access (0x%02X) is invalid",
508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                          p_t4t->cc_file.ndef_fc.read_access);
509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (p_t4t->cc_file.ndef_fc.write_access != T4T_FC_WRITE_ACCESS)
513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(p_t4t->cc_file.ndef_fc.write_access != T4T_FC_NO_WRITE_ACCESS)  )
514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR1 ("rw_t4t_validate_cc_file (): Write Access (0x%02X) is invalid",
516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                          p_t4t->cc_file.ndef_fc.write_access);
517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return FALSE;
518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return TRUE;
521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t4t_handle_error
526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      notify error to application and clean up
528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t4t_handle_error (tNFC_STATUS status, UINT8 sw1, UINT8 sw2)
533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T4T_CB  *p_t4t = &rw_cb.tcb.t4t;
535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_DATA    rw_data;
536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_EVENT   event;
537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5387c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    RW_TRACE_DEBUG4 ("rw_t4t_handle_error (): status:0x%02X, sw1:0x%02X, sw2:0x%02X, state:0x%X",
539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      status, sw1, sw2, p_t4t->state);
540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfc_stop_quick_timer (&p_t4t->timer);
542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (rw_cb.p_cback)
544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_data.status = status;
546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_data.t4t_sw.sw1    = sw1;
548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_data.t4t_sw.sw2    = sw2;
549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        switch (p_t4t->state)
551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case RW_T4T_STATE_DETECT_NDEF:
553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            rw_data.ndef.flags  = RW_NDEF_FL_UNKNOWN;
554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            event = RW_T4T_NDEF_DETECT_EVT;
555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case RW_T4T_STATE_READ_NDEF:
558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            event = RW_T4T_NDEF_READ_FAIL_EVT;
559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case RW_T4T_STATE_UPDATE_NDEF:
562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            event = RW_T4T_NDEF_UPDATE_FAIL_EVT;
563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case RW_T4T_STATE_PRESENCE_CHECK:
566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            event = RW_T4T_PRESENCE_CHECK_EVT;
567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            rw_data.status = NFC_STATUS_FAILED;
568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        case RW_T4T_STATE_SET_READ_ONLY:
5715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            event = RW_T4T_SET_TO_RO_EVT;
5725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            break;
5735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        default:
575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            event = RW_T4T_MAX_EVT;
576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->state = RW_T4T_STATE_IDLE;
580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (event != RW_T4T_MAX_EVT)
582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            (*(rw_cb.p_cback)) (event, &rw_data);
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        p_t4t->state = RW_T4T_STATE_IDLE;
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         rw_t4t_sm_detect_ndef
595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      State machine for NDEF detection procedure
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 rw_t4t_sm_detect_ndef (BT_HDR *p_r_apdu)
602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T4T_CB  *p_t4t = &rw_cb.tcb.t4t;
604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       *p, type, length;
605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      status_words, nlen;
606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_DATA    rw_data;
607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    RW_TRACE_DEBUG2 ("rw_t4t_sm_detect_ndef (): sub_state:%s (%d)",
610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      rw_t4t_get_sub_state_name (p_t4t->sub_state), p_t4t->sub_state);
611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    RW_TRACE_DEBUG1 ("rw_t4t_sm_detect_ndef (): sub_state=%d", p_t4t->sub_state);
613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* get status words */
616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = (UINT8 *) (p_r_apdu + 1) + p_r_apdu->offset;
617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p += (p_r_apdu->len - T4T_RSP_STATUS_WORDS_SIZE);
618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BE_STREAM_TO_UINT16 (status_words, p);
619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status_words != T4T_RSP_CMD_CMPLTED)
621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* try V1.0 after failing of V2.0 */
623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (p_t4t->sub_state == RW_T4T_SUBSTATE_WAIT_SELECT_APP)
624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(p_t4t->version   == T4T_VERSION_2_0)  )
625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t4t->version = T4T_VERSION_1_0;
627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            RW_TRACE_DEBUG1 ("rw_t4t_sm_detect_ndef (): retry with version=0x%02X",
629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                              p_t4t->version);
630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (!rw_t4t_select_application (T4T_VERSION_1_0))
632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0);
634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return;
636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->ndef_status &= ~ (RW_T4T_NDEF_STATUS_NDEF_DETECTED);
639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_t4t_handle_error (NFC_STATUS_CMD_NOT_CMPLTD, *(p-2), *(p-1));
640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (p_t4t->sub_state)
644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_SUBSTATE_WAIT_SELECT_APP:
646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* NDEF Tag application has been selected then select CC file */
648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!rw_t4t_select_file (T4T_CC_FILE_ID))
649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0);
651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t4t->sub_state = RW_T4T_SUBSTATE_WAIT_SELECT_CC;
655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_SUBSTATE_WAIT_SELECT_CC:
659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* CC file has been selected then read mandatory part of CC file */
661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!rw_t4t_read_file (0x00, T4T_CC_FILE_MIN_LEN, FALSE))
662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0);
664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t4t->sub_state = RW_T4T_SUBSTATE_WAIT_CC_FILE;
668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_SUBSTATE_WAIT_CC_FILE:
672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* CC file has been read then validate and select mandatory NDEF file */
674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_r_apdu->len >= T4T_CC_FILE_MIN_LEN + T4T_RSP_STATUS_WORDS_SIZE)
675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p = (UINT8 *) (p_r_apdu + 1) + p_r_apdu->offset;
677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            BE_STREAM_TO_UINT16 (p_t4t->cc_file.cclen, p);
679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            BE_STREAM_TO_UINT8 (p_t4t->cc_file.version, p);
680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            BE_STREAM_TO_UINT16 (p_t4t->cc_file.max_le, p);
681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            BE_STREAM_TO_UINT16 (p_t4t->cc_file.max_lc, p);
682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            BE_STREAM_TO_UINT8 (type, p);
684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            BE_STREAM_TO_UINT8 (length, p);
685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (  (type == T4T_NDEF_FILE_CONTROL_TYPE)
687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                &&(length == T4T_FILE_CONTROL_LENGTH)  )
688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                BE_STREAM_TO_UINT16 (p_t4t->cc_file.ndef_fc.file_id, p);
690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                BE_STREAM_TO_UINT16 (p_t4t->cc_file.ndef_fc.max_file_size, p);
691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                BE_STREAM_TO_UINT8 (p_t4t->cc_file.ndef_fc.read_access, p);
692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                BE_STREAM_TO_UINT8 (p_t4t->cc_file.ndef_fc.write_access, p);
693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                RW_TRACE_DEBUG0 ("Capability Container (CC) file");
696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                RW_TRACE_DEBUG1 ("  CCLEN:  0x%04X",    p_t4t->cc_file.cclen);
697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                RW_TRACE_DEBUG1 ("  Version:0x%02X",    p_t4t->cc_file.version);
698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                RW_TRACE_DEBUG1 ("  MaxLe:  0x%04X",    p_t4t->cc_file.max_le);
699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                RW_TRACE_DEBUG1 ("  MaxLc:  0x%04X",    p_t4t->cc_file.max_lc);
700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                RW_TRACE_DEBUG0 ("  NDEF File Control TLV");
701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                RW_TRACE_DEBUG1 ("    FileID:      0x%04X", p_t4t->cc_file.ndef_fc.file_id);
702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                RW_TRACE_DEBUG1 ("    MaxFileSize: 0x%04X", p_t4t->cc_file.ndef_fc.max_file_size);
703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                RW_TRACE_DEBUG1 ("    ReadAccess:  0x%02X", p_t4t->cc_file.ndef_fc.read_access);
704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                RW_TRACE_DEBUG1 ("    WriteAccess: 0x%02X", p_t4t->cc_file.ndef_fc.write_access);
705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (rw_t4t_validate_cc_file ())
708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (!rw_t4t_select_file (p_t4t->cc_file.ndef_fc.file_id))
710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0);
712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    else
714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        p_t4t->sub_state = RW_T4T_SUBSTATE_WAIT_SELECT_NDEF_FILE;
716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    break;
718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* invalid response or CC file */
723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->ndef_status &= ~ (RW_T4T_NDEF_STATUS_NDEF_DETECTED);
724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_t4t_handle_error (NFC_STATUS_BAD_RESP, 0, 0);
725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_SUBSTATE_WAIT_SELECT_NDEF_FILE:
728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* NDEF file has been selected then read the first 2 bytes (NLEN) */
730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!rw_t4t_read_file (0, T4T_FILE_LENGTH_SIZE, FALSE))
731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0);
733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t4t->sub_state = RW_T4T_SUBSTATE_WAIT_READ_NLEN;
737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_SUBSTATE_WAIT_READ_NLEN:
741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* NLEN has been read then report upper layer */
743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_r_apdu->len == T4T_FILE_LENGTH_SIZE + T4T_RSP_STATUS_WORDS_SIZE)
744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* get length of NDEF */
746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p = (UINT8 *) (p_r_apdu + 1) + p_r_apdu->offset;
747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            BE_STREAM_TO_UINT16 (nlen, p);
748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (nlen <= p_t4t->cc_file.ndef_fc.max_file_size - T4T_FILE_LENGTH_SIZE)
750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t4t->ndef_status = RW_T4T_NDEF_STATUS_NDEF_DETECTED;
752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_t4t->cc_file.ndef_fc.write_access != T4T_FC_WRITE_ACCESS)
754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_t4t->ndef_status |= RW_T4T_NDEF_STATUS_NDEF_READ_ONLY;
756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* Get max bytes to read per command */
759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_t4t->cc_file.max_le >= RW_T4T_MAX_DATA_PER_READ)
760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_t4t->max_read_size = RW_T4T_MAX_DATA_PER_READ;
762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_t4t->max_read_size = p_t4t->cc_file.max_le;
766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* Le: valid range is 0x01 to 0xFF */
769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_t4t->max_read_size >= T4T_MAX_LENGTH_LE)
770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_t4t->max_read_size = T4T_MAX_LENGTH_LE;
772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* Get max bytes to update per command */
775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_t4t->cc_file.max_lc >= RW_T4T_MAX_DATA_PER_WRITE)
776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_t4t->max_update_size = RW_T4T_MAX_DATA_PER_WRITE;
778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_t4t->max_update_size = p_t4t->cc_file.max_lc;
782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* Lc: valid range is 0x01 to 0xFF */
785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_t4t->max_update_size >= T4T_MAX_LENGTH_LC)
786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_t4t->max_update_size = T4T_MAX_LENGTH_LC;
788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t4t->ndef_length = nlen;
791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t4t->state       = RW_T4T_STATE_IDLE;
792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (rw_cb.p_cback)
794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    rw_data.ndef.status   = NFC_STATUS_OK;
796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    rw_data.ndef.protocol = NFC_PROTOCOL_ISO_DEP;
797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    rw_data.ndef.max_size = (UINT32) (p_t4t->cc_file.ndef_fc.max_file_size - (UINT16) T4T_FILE_LENGTH_SIZE);
798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    rw_data.ndef.cur_size = nlen;
799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    rw_data.ndef.flags    = RW_NDEF_FL_SUPPORTED | RW_NDEF_FL_FORMATED;
800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (p_t4t->cc_file.ndef_fc.write_access != T4T_FC_WRITE_ACCESS)
801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        rw_data.ndef.flags    |= RW_NDEF_FL_READ_ONLY;
803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    (*(rw_cb.p_cback)) (RW_T4T_NDEF_DETECT_EVT, &rw_data);
806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    RW_TRACE_DEBUG0 ("rw_t4t_sm_detect_ndef (): Sent RW_T4T_NDEF_DETECT_EVT");
808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* NLEN should be less than max file size */
813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                RW_TRACE_ERROR2 ("rw_t4t_sm_detect_ndef (): NLEN (%d) + 2 must be <= max file size (%d)",
814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                 nlen, p_t4t->cc_file.ndef_fc.max_file_size);
815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t4t->ndef_status &= ~ (RW_T4T_NDEF_STATUS_NDEF_DETECTED);
817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                rw_t4t_handle_error (NFC_STATUS_BAD_RESP, 0, 0);
818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* response payload size should be T4T_FILE_LENGTH_SIZE */
823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            RW_TRACE_ERROR2 ("rw_t4t_sm_detect_ndef (): Length (%d) of R-APDU must be %d",
824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             p_r_apdu->len, T4T_FILE_LENGTH_SIZE + T4T_RSP_STATUS_WORDS_SIZE);
825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t4t->ndef_status &= ~ (RW_T4T_NDEF_STATUS_NDEF_DETECTED);
827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            rw_t4t_handle_error (NFC_STATUS_BAD_RESP, 0, 0);
828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR1 ("rw_t4t_sm_detect_ndef (): unknown sub_state=%d", p_t4t->sub_state);
833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0);
834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t4t_sm_read_ndef
841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      State machine for NDEF read procedure
843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t4t_sm_read_ndef (BT_HDR *p_r_apdu)
848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T4T_CB  *p_t4t = &rw_cb.tcb.t4t;
850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       *p;
851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      status_words;
852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_DATA    rw_data;
853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    RW_TRACE_DEBUG2 ("rw_t4t_sm_read_ndef (): sub_state:%s (%d)",
856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      rw_t4t_get_sub_state_name (p_t4t->sub_state), p_t4t->sub_state);
857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    RW_TRACE_DEBUG1 ("rw_t4t_sm_read_ndef (): sub_state=%d", p_t4t->sub_state);
859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* get status words */
862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = (UINT8 *) (p_r_apdu + 1) + p_r_apdu->offset;
863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p += (p_r_apdu->len - T4T_RSP_STATUS_WORDS_SIZE);
864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BE_STREAM_TO_UINT16 (status_words, p);
865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status_words != T4T_RSP_CMD_CMPLTED)
867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_t4t_handle_error (NFC_STATUS_CMD_NOT_CMPLTD, *(p-2), *(p-1));
869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_r_apdu);
870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (p_t4t->sub_state)
874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_SUBSTATE_WAIT_READ_RESP:
876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Read partial or complete data */
878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_r_apdu->len -= T4T_RSP_STATUS_WORDS_SIZE;
879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if ((p_r_apdu->len > 0) && (p_r_apdu->len <= p_t4t->rw_length))
881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t4t->rw_length -= p_r_apdu->len;
883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t4t->rw_offset += p_r_apdu->len;
884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (rw_cb.p_cback)
886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                rw_data.data.status = NFC_STATUS_OK;
888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                rw_data.data.p_data = p_r_apdu;
889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* if need to read more data */
891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_t4t->rw_length > 0)
892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    (*(rw_cb.p_cback)) (RW_T4T_NDEF_READ_EVT, &rw_data);
894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (!rw_t4t_read_file (p_t4t->rw_offset, p_t4t->rw_length, TRUE))
896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0);
898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_t4t->state = RW_T4T_STATE_IDLE;
903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    (*(rw_cb.p_cback)) (RW_T4T_NDEF_READ_CPLT_EVT, &rw_data);
905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    RW_TRACE_DEBUG0 ("rw_t4t_sm_read_ndef (): Sent RW_T4T_NDEF_READ_CPLT_EVT");
907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_r_apdu = NULL;
911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t4t->rw_length = 0;
915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t4t->state = RW_T4T_STATE_IDLE;
916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            RW_TRACE_ERROR2 ("rw_t4t_sm_read_ndef (): invalid payload length (%d), rw_length (%d)",
921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                             p_r_apdu->len, p_t4t->rw_length);
922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            rw_t4t_handle_error (NFC_STATUS_BAD_RESP, 0, 0);
923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR1 ("rw_t4t_sm_read_ndef (): unknown sub_state = %d", p_t4t->sub_state);
928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0);
929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_r_apdu)
933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_r_apdu);
934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t4t_sm_update_ndef
939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      State machine for NDEF update procedure
941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t4t_sm_update_ndef (BT_HDR  *p_r_apdu)
946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T4T_CB  *p_t4t = &rw_cb.tcb.t4t;
948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       *p;
949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      status_words;
950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_DATA    rw_data;
951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    RW_TRACE_DEBUG2 ("rw_t4t_sm_update_ndef (): sub_state:%s (%d)",
954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      rw_t4t_get_sub_state_name (p_t4t->sub_state), p_t4t->sub_state);
955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    RW_TRACE_DEBUG1 ("rw_t4t_sm_update_ndef (): sub_state=%d", p_t4t->sub_state);
957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Get status words */
960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = (UINT8 *) (p_r_apdu + 1) + p_r_apdu->offset;
961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p += (p_r_apdu->len - T4T_RSP_STATUS_WORDS_SIZE);
962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BE_STREAM_TO_UINT16 (status_words, p);
963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status_words != T4T_RSP_CMD_CMPLTED)
965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_t4t_handle_error (NFC_STATUS_CMD_NOT_CMPLTD, *(p-2), *(p-1));
967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (p_t4t->sub_state)
971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_SUBSTATE_WAIT_UPDATE_NLEN:
973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* NLEN has been updated */
975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if need to update data */
976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t4t->p_update_data)
977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t4t->sub_state = RW_T4T_SUBSTATE_WAIT_UPDATE_RESP;
979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (!rw_t4t_update_file ())
981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0);
983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t4t->p_update_data = NULL;
984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t4t->state = RW_T4T_STATE_IDLE;
989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* just finished last step of updating (updating NLEN) */
991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (rw_cb.p_cback)
992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                rw_data.status = NFC_STATUS_OK;
994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                (*(rw_cb.p_cback)) (RW_T4T_NDEF_UPDATE_CPLT_EVT, &rw_data);
996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                RW_TRACE_DEBUG0 ("rw_t4t_sm_update_ndef (): Sent RW_T4T_NDEF_UPDATE_CPLT_EVT");
997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_SUBSTATE_WAIT_UPDATE_RESP:
1002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if updating is not completed */
1004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t4t->rw_length > 0)
1005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (!rw_t4t_update_file ())
1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0);
1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t4t->p_update_data = NULL;
1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t4t->p_update_data = NULL;
1015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* update NLEN as last step of updating file */
1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (!rw_t4t_update_nlen (p_t4t->ndef_length))
1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0);
1020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t4t->sub_state = RW_T4T_SUBSTATE_WAIT_UPDATE_NLEN;
1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR1 ("rw_t4t_sm_update_ndef (): unknown sub_state = %d", p_t4t->sub_state);
1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0);
1031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
10375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         rw_t4t_sm_set_readonly
10385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
10395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      State machine for CC update procedure
10405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
10415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns          none
10425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
10435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
10445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic void rw_t4t_sm_set_readonly (BT_HDR  *p_r_apdu)
10455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{
10465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    tRW_T4T_CB  *p_t4t = &rw_cb.tcb.t4t;
10475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8       *p;
10485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT16      status_words;
10495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    tRW_DATA    rw_data;
10505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
10515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#if (BT_TRACE_VERBOSE == TRUE)
10525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    RW_TRACE_DEBUG2 ("rw_t4t_sm_set_readonly (): sub_state:%s (%d)",
10535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                      rw_t4t_get_sub_state_name (p_t4t->sub_state), p_t4t->sub_state);
10545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#else
10555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    RW_TRACE_DEBUG1 ("rw_t4t_sm_set_readonly (): sub_state=%d", p_t4t->sub_state);
10565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#endif
10575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
10585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    /* Get status words */
10595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    p = (UINT8 *) (p_r_apdu + 1) + p_r_apdu->offset;
10605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    p += (p_r_apdu->len - T4T_RSP_STATUS_WORDS_SIZE);
10615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    BE_STREAM_TO_UINT16 (status_words, p);
10625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
10635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (status_words != T4T_RSP_CMD_CMPLTED)
10645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
10655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        rw_t4t_handle_error (NFC_STATUS_CMD_NOT_CMPLTD, *(p-2), *(p-1));
10665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        return;
10675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
10685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
10695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    switch (p_t4t->sub_state)
10705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
10715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    case RW_T4T_SUBSTATE_WAIT_SELECT_CC:
10725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
10735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* CC file has been selected then update write access to read-only in CC file */
10745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (!rw_t4t_update_cc_to_readonly ())
10755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
10765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0);
10775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
10785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else
10795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
10805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            p_t4t->sub_state = RW_T4T_SUBSTATE_WAIT_UPDATE_CC;
10815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
10825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        break;
10835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
10845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    case RW_T4T_SUBSTATE_WAIT_UPDATE_CC:
10855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* CC Updated, Select NDEF File to allow NDEF operation */
10865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        p_t4t->cc_file.ndef_fc.write_access = T4T_FC_NO_WRITE_ACCESS;
10875c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        p_t4t->ndef_status |= RW_T4T_NDEF_STATUS_NDEF_READ_ONLY;
10885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
10895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (!rw_t4t_select_file (p_t4t->cc_file.ndef_fc.file_id))
10905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
10915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0);
10925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
10935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else
10945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
10955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            p_t4t->sub_state = RW_T4T_SUBSTATE_WAIT_SELECT_NDEF_FILE;
10965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
10975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        break;
10985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
10995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    case RW_T4T_SUBSTATE_WAIT_SELECT_NDEF_FILE:
11005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        p_t4t->state = RW_T4T_STATE_IDLE;
11015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* just finished last step of configuring tag read only (Selecting NDEF file CC) */
11025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (rw_cb.p_cback)
11035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
11045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            rw_data.status = NFC_STATUS_OK;
11055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
11065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            RW_TRACE_DEBUG0 ("rw_t4t_sm_set_readonly (): Sent RW_T4T_SET_TO_RO_EVT");
11075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            (*(rw_cb.p_cback)) (RW_T4T_SET_TO_RO_EVT, &rw_data);
11085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
11095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        break;
11105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
11115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    default:
11125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        RW_TRACE_ERROR1 ("rw_t4t_sm_set_readonly (): unknown sub_state = %d", p_t4t->sub_state);
11135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0);
11145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        break;
11155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
11165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
11175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
11185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
11195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t4t_process_timeout
1121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      process timeout event
1123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
1125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_t4t_process_timeout (TIMER_LIST_ENT *p_tle)
1128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    RW_TRACE_DEBUG1 ("rw_t4t_process_timeout () event=%d", p_tle->event);
1130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_tle->event == NFC_TTYPE_RW_T4T_RESPONSE)
1132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_t4t_handle_error (NFC_STATUS_TIMEOUT, 0, 0);
1134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR1 ("rw_t4t_process_timeout () unknown event=%d", p_tle->event);
1138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t4t_data_cback
1144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This callback function receives the data from NFCC.
1146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t4t_data_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data)
1151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T4T_CB *p_t4t    = &rw_cb.tcb.t4t;
11537c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    BT_HDR     *p_r_apdu;
1154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_DATA    rw_data;
1155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
1157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8  begin_state   = p_t4t->state;
1158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    RW_TRACE_DEBUG1 ("rw_t4t_data_cback () event = 0x%X", event);
1161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfc_stop_quick_timer (&p_t4t->timer);
1162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (event)
1164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_DEACTIVATE_CEVT:
1166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        NFC_SetStaticRfCback (NULL);
1167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->state = RW_T4T_STATE_NOT_ACTIVATED;
1168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
1169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_ERROR_CEVT:
11717c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        rw_data.status = (tNFC_STATUS) (*(UINT8*) p_data);
11727c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
11737c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        if (p_t4t->state != RW_T4T_STATE_IDLE)
1174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
11757c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            rw_t4t_handle_error (rw_data.status, 0, 0);
1176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            (*(rw_cb.p_cback)) (RW_T4T_INTF_ERROR_EVT, &rw_data);
1180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
1182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_DATA_CEVT:
11847c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        p_r_apdu = (BT_HDR *) p_data->data.p_data;
1185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
1188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
1189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE)
1192a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    if (p_t4t->state != RW_T4T_STATE_IDLE)
1193a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        DispRWT4Tags (p_r_apdu, TRUE);
1194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
1197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    RW_TRACE_DEBUG2 ("RW T4T state: <%s (%d)>",
1198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        rw_t4t_get_state_name (p_t4t->state), p_t4t->state);
1199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
1200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    RW_TRACE_DEBUG1 ("RW T4T state: %d", p_t4t->state);
1201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (p_t4t->state)
1204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_STATE_IDLE:
1206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Unexpected R-APDU, it should be raw frame response */
1207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* forward to upper layer without parsing */
1208a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#if (BT_TRACE_VERBOSE == TRUE)
1209a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        RW_TRACE_DEBUG2 ("RW T4T Raw Frame: Len [0x%X] Status [%s]", p_r_apdu->len, NFC_GetStatusName (p_data->data.status));
1210a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#else
1211a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        RW_TRACE_DEBUG2 ("RW T4T Raw Frame: Len [0x%X] Status [0x%X]", p_r_apdu->len, p_data->data.status);
1212a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#endif
1213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (rw_cb.p_cback)
1214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1215a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            rw_data.raw_frame.status = p_data->data.status;
1216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            rw_data.raw_frame.p_data = p_r_apdu;
1217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            (*(rw_cb.p_cback)) (RW_T4T_RAW_FRAME_EVT, &rw_data);
1218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_r_apdu = NULL;
1219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            GKI_freebuf (p_r_apdu);
1223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_STATE_DETECT_NDEF:
1226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_t4t_sm_detect_ndef (p_r_apdu);
1227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_r_apdu);
1228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_STATE_READ_NDEF:
1230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_t4t_sm_read_ndef (p_r_apdu);
1231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* p_r_apdu may send upper lyaer */
1232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_STATE_UPDATE_NDEF:
1234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_t4t_sm_update_ndef (p_r_apdu);
1235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_r_apdu);
1236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_STATE_PRESENCE_CHECK:
1238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if any response, send presence check with ok */
1239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_data.status = NFC_STATUS_OK;
1240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t4t->state = RW_T4T_STATE_IDLE;
1241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        (*(rw_cb.p_cback)) (RW_T4T_PRESENCE_CHECK_EVT, &rw_data);
1242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_r_apdu);
1243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
12445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    case RW_T4T_STATE_SET_READ_ONLY:
12455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        rw_t4t_sm_set_readonly (p_r_apdu);
12465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        GKI_freebuf (p_r_apdu);
12475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        break;
1248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
1249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR1 ("rw_t4t_data_cback (): invalid state=%d", p_t4t->state);
1250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_r_apdu);
1251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
1255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (begin_state != p_t4t->state)
1256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_DEBUG2 ("RW T4T state changed:<%s> -> <%s>",
1258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                          rw_t4t_get_state_name (begin_state),
1259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                          rw_t4t_get_state_name (p_t4t->state));
1260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t4t_select
1268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Initialise T4T
1270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
1272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_t4t_select (void)
1275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T4T_CB  *p_t4t = &rw_cb.tcb.t4t;
1277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    RW_TRACE_DEBUG0 ("rw_t4t_select ()");
1279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_SetStaticRfCback (rw_t4t_data_cback);
1281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t4t->state   = RW_T4T_STATE_IDLE;
1283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t4t->version = T4T_MY_VERSION;
1284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* set it min of max R-APDU data size before reading CC file */
1286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t4t->cc_file.max_le = T4T_MIN_MLE;
1287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* These will be udated during NDEF detection */
1289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t4t->max_read_size   = T4T_MAX_LENGTH_LE;
1290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t4t->max_update_size = T4T_MAX_LENGTH_LC;
1291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return NFC_STATUS_OK;
1293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T4tDetectNDef
1298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function performs NDEF detection procedure
1300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  RW_T4T_NDEF_DETECT_EVT will be returned
1302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
1304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if T4T is busy or other error
1305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T4tDetectNDef (void)
1308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    RW_TRACE_API0 ("RW_T4tDetectNDef ()");
1310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (rw_cb.tcb.t4t.state != RW_T4T_STATE_IDLE)
1312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR1 ("RW_T4tDetectNDef ():Unable to start command at state (0x%X)",
1314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                          rw_cb.tcb.t4t.state);
1315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return NFC_STATUS_FAILED;
1316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (rw_cb.tcb.t4t.ndef_status & RW_T4T_NDEF_STATUS_NDEF_DETECTED)
1319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* NDEF Tag application has been selected then select CC file */
1321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!rw_t4t_select_file (T4T_CC_FILE_ID))
1322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return NFC_STATUS_FAILED;
1324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_cb.tcb.t4t.sub_state = RW_T4T_SUBSTATE_WAIT_SELECT_CC;
1326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Select NDEF Tag Application */
1330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!rw_t4t_select_application (rw_cb.tcb.t4t.version))
1331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return NFC_STATUS_FAILED;
1333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_cb.tcb.t4t.sub_state = RW_T4T_SUBSTATE_WAIT_SELECT_APP;
1335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    rw_cb.tcb.t4t.state     = RW_T4T_STATE_DETECT_NDEF;
1338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return NFC_STATUS_OK;
1340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T4tReadNDef
1345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function performs NDEF read procedure
1347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Note: RW_T4tDetectNDef () must be called before using this
1348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  The following event will be returned
1350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      RW_T4T_NDEF_READ_EVT for each segmented NDEF message
1351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      RW_T4T_NDEF_READ_CPLT_EVT for the last segment or complete NDEF
1352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      RW_T4T_NDEF_READ_FAIL_EVT for failure
1353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
1355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if T4T is busy or other error
1356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T4tReadNDef (void)
1359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    RW_TRACE_API0 ("RW_T4tReadNDef ()");
1361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (rw_cb.tcb.t4t.state != RW_T4T_STATE_IDLE)
1363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR1 ("RW_T4tReadNDef ():Unable to start command at state (0x%X)",
1365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                          rw_cb.tcb.t4t.state);
1366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return NFC_STATUS_FAILED;
1367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if NDEF has been detected */
1370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (rw_cb.tcb.t4t.ndef_status & RW_T4T_NDEF_STATUS_NDEF_DETECTED)
1371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* start reading NDEF */
1373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!rw_t4t_read_file (T4T_FILE_LENGTH_SIZE, rw_cb.tcb.t4t.ndef_length, FALSE))
1374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return NFC_STATUS_FAILED;
1376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_cb.tcb.t4t.state     = RW_T4T_STATE_READ_NDEF;
1379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_cb.tcb.t4t.sub_state = RW_T4T_SUBSTATE_WAIT_READ_RESP;
1380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return NFC_STATUS_OK;
1382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR0 ("RW_T4tReadNDef ():No NDEF detected");
1386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return NFC_STATUS_FAILED;
1387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T4tUpdateNDef
1393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function performs NDEF update procedure
1395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Note: RW_T4tDetectNDef () must be called before using this
1396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        Updating data must not be removed until returning event
1397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  The following event will be returned
1399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      RW_T4T_NDEF_UPDATE_CPLT_EVT for complete
1400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      RW_T4T_NDEF_UPDATE_FAIL_EVT for failure
1401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
1403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if T4T is busy or other error
1404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T4tUpdateNDef (UINT16 length, UINT8 *p_data)
1407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    RW_TRACE_API1 ("RW_T4tUpdateNDef () length:%d", length);
1409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (rw_cb.tcb.t4t.state != RW_T4T_STATE_IDLE)
1411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR1 ("RW_T4tUpdateNDef ():Unable to start command at state (0x%X)",
1413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                          rw_cb.tcb.t4t.state);
1414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return NFC_STATUS_FAILED;
1415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if NDEF has been detected */
1418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (rw_cb.tcb.t4t.ndef_status & RW_T4T_NDEF_STATUS_NDEF_DETECTED)
1419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if read-only */
1421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (rw_cb.tcb.t4t.ndef_status & RW_T4T_NDEF_STATUS_NDEF_READ_ONLY)
1422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            RW_TRACE_ERROR0 ("RW_T4tUpdateNDef ():NDEF is read-only");
1424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return NFC_STATUS_FAILED;
1425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (rw_cb.tcb.t4t.cc_file.ndef_fc.max_file_size < length + T4T_FILE_LENGTH_SIZE)
1428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            RW_TRACE_ERROR2 ("RW_T4tUpdateNDef ():data (%d bytes) plus NLEN is more than max file size (%d)",
1430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                              length, rw_cb.tcb.t4t.cc_file.ndef_fc.max_file_size);
1431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return NFC_STATUS_FAILED;
1432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* store NDEF length and data */
1435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_cb.tcb.t4t.ndef_length   = length;
1436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_cb.tcb.t4t.p_update_data = p_data;
1437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_cb.tcb.t4t.rw_offset     = T4T_FILE_LENGTH_SIZE;
1439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_cb.tcb.t4t.rw_length     = length;
1440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* set NLEN to 0x0000 for the first step */
1442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!rw_t4t_update_nlen (0x0000))
1443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return NFC_STATUS_FAILED;
1445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_cb.tcb.t4t.state     = RW_T4T_STATE_UPDATE_NDEF;
1448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_cb.tcb.t4t.sub_state = RW_T4T_SUBSTATE_WAIT_UPDATE_NLEN;
1449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return NFC_STATUS_OK;
1451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR0 ("RW_T4tUpdateNDef ():No NDEF detected");
1455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return NFC_STATUS_FAILED;
1456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
1460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T4tPresenceCheck
1462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description
1464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      Check if the tag is still in the field.
1465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      The RW_T4T_PRESENCE_CHECK_EVT w/ status is used to indicate presence
1467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      or non-presence.
1468a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu**      option is RW_T4T_CHK_EMPTY_I_BLOCK, use empty I block for presence check.
1469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns
1471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      NFC_STATUS_OK, if raw data frame sent
1472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation
1473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      NFC_STATUS_FAILED: other error
1474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
1476a24be4f06674b2707b57904deaa0dff5a95823bdEvan ChutNFC_STATUS RW_T4tPresenceCheck (UINT8 option)
1477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS retval = NFC_STATUS_OK;
1479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_DATA    evt_data;
1480a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    BOOLEAN     status;
1481a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    BT_HDR      *p_data;
1482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1483a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    RW_TRACE_API1 ("RW_T4tPresenceCheck () %d", option);
1484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* If RW_SelectTagType was not called (no conn_callback) return failure */
1486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!rw_cb.p_cback)
1487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        retval = NFC_STATUS_FAILED;
1489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* If we are not activated, then RW_T4T_PRESENCE_CHECK_EVT with NFC_STATUS_FAILED */
1491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (rw_cb.tcb.t4t.state == RW_T4T_STATE_NOT_ACTIVATED)
1492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        evt_data.status = NFC_STATUS_FAILED;
1494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        (*rw_cb.p_cback) (RW_T4T_PRESENCE_CHECK_EVT, &evt_data);
1495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* If command is pending, assume tag is still present */
1497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (rw_cb.tcb.t4t.state != RW_T4T_STATE_IDLE)
1498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        evt_data.status = NFC_STATUS_OK;
15005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        (*rw_cb.p_cback) (RW_T4T_PRESENCE_CHECK_EVT, &evt_data);
1501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1504a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        status = FALSE;
1505a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        if (option == RW_T4T_CHK_EMPTY_I_BLOCK)
1506a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        {
1507a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            /* use empty I block for presence check */
1508a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            if ((p_data = (BT_HDR *) GKI_getbuf (NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE)) != NULL)
1509a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            {
1510a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                p_data->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
1511a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                p_data->len    = 0;
1512a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                if (NFC_SendData (NFC_RF_CONN_ID, (BT_HDR*) p_data) == NFC_STATUS_OK)
1513a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                    status = TRUE;
1514a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            }
1515a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        }
1516a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        else
1517a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        {
1518a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            /* use read binary on the given channel */
1519a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            rw_cb.tcb.t4t.channel = 0;
1520a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            if (option <= RW_T4T_CHK_READ_BINARY_CH3)
1521a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu                rw_cb.tcb.t4t.channel = option;
1522a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            status = rw_t4t_read_file (0, 1, FALSE);
1523a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu            rw_cb.tcb.t4t.channel = 0;
1524a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        }
1525a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
1526a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu        if (status == TRUE)
1527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            rw_cb.tcb.t4t.state = RW_T4T_STATE_PRESENCE_CHECK;
1529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            retval = NFC_STATUS_NO_BUFFERS;
1533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (retval);
1537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
15395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*****************************************************************************
15405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
15415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         RW_T4tSetNDefReadOnly
15425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
15435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      This function performs NDEF read-only procedure
15445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**                  Note: RW_T4tDetectNDef() must be called before using this
15455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
15465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**                  The RW_T4T_SET_TO_RO_EVT event will be returned.
15475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
15485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns          NFC_STATUS_OK if success
15495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**                  NFC_STATUS_FAILED if T4T is busy or other error
15505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
15515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*****************************************************************************/
15525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn CoenentNFC_STATUS RW_T4tSetNDefReadOnly (void)
15535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{
15545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    tNFC_STATUS retval = NFC_STATUS_OK;
15555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    tRW_DATA    evt_data;
15565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
15575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    RW_TRACE_API0 ("RW_T4tSetNDefReadOnly ()");
15585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
15595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (rw_cb.tcb.t4t.state != RW_T4T_STATE_IDLE)
15605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
15615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        RW_TRACE_ERROR1 ("RW_T4tSetNDefReadOnly ():Unable to start command at state (0x%X)",
15625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                          rw_cb.tcb.t4t.state);
15635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        return NFC_STATUS_FAILED;
15645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
15655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
15665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    /* if NDEF has been detected */
15675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (rw_cb.tcb.t4t.ndef_status & RW_T4T_NDEF_STATUS_NDEF_DETECTED)
15685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
15695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* if read-only */
15705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (rw_cb.tcb.t4t.ndef_status & RW_T4T_NDEF_STATUS_NDEF_READ_ONLY)
15715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
15727c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu            RW_TRACE_API0 ("RW_T4tSetNDefReadOnly (): NDEF is already read-only");
15737c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
15745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            evt_data.status = NFC_STATUS_OK;
15755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            (*rw_cb.p_cback) (RW_T4T_SET_TO_RO_EVT, &evt_data);
15765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            return (retval);
15775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
15785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
15795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* NDEF Tag application has been selected then select CC file */
15805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (!rw_t4t_select_file (T4T_CC_FILE_ID))
15815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
15825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            return NFC_STATUS_FAILED;
15835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
15845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
15855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        rw_cb.tcb.t4t.state     = RW_T4T_STATE_SET_READ_ONLY;
15865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        rw_cb.tcb.t4t.sub_state = RW_T4T_SUBSTATE_WAIT_SELECT_CC;
15875c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
15885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        return NFC_STATUS_OK;
15895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
15905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    else
15915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
15925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        RW_TRACE_ERROR0 ("RW_T4tSetNDefReadOnly ():No NDEF detected");
15935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        return NFC_STATUS_FAILED;
15945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
15955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    return (retval);
15965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
15975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
1599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t4t_get_state_name
1602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function returns the state name.
1604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NOTE             conditionally compiled to save memory.
1606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to the name
1608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *rw_t4t_get_state_name (UINT8 state)
1611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (state)
1613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_STATE_NOT_ACTIVATED:
1615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("NOT_ACTIVATED");
1616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_STATE_IDLE:
1617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("IDLE");
1618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_STATE_DETECT_NDEF:
1619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("NDEF_DETECTION");
1620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_STATE_READ_NDEF:
1621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("READ_NDEF");
1622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_STATE_UPDATE_NDEF:
1623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("UPDATE_NDEF");
1624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_STATE_PRESENCE_CHECK:
1625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("PRESENCE_CHECK");
16267c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu    case RW_T4T_STATE_SET_READ_ONLY:
16277c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu        return ("SET_READ_ONLY");
16287c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
1629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
1630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("???? UNKNOWN STATE");
1631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t4t_get_sub_state_name
1637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function returns the sub_state name.
1639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NOTE             conditionally compiled to save memory.
1641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to the name
1643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *rw_t4t_get_sub_state_name (UINT8 sub_state)
1646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (sub_state)
1648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_SUBSTATE_WAIT_SELECT_APP:
1650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("WAIT_SELECT_APP");
1651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_SUBSTATE_WAIT_SELECT_CC:
1652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("WAIT_SELECT_CC");
1653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_SUBSTATE_WAIT_CC_FILE:
1654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("WAIT_CC_FILE");
1655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_SUBSTATE_WAIT_SELECT_NDEF_FILE:
1656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("WAIT_SELECT_NDEF_FILE");
1657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_SUBSTATE_WAIT_READ_NLEN:
1658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("WAIT_READ_NLEN");
1659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_SUBSTATE_WAIT_READ_RESP:
1661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("WAIT_READ_RESP");
1662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_SUBSTATE_WAIT_UPDATE_RESP:
1663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("WAIT_UPDATE_RESP");
1664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T4T_SUBSTATE_WAIT_UPDATE_NLEN:
1665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("WAIT_UPDATE_NLEN");
1666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
1667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("???? UNKNOWN SUBSTATE");
1668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* (NFC_INCLUDED == TRUE) */
1673