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 1 tag NDEF operation in
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Reader/Writer 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
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_INCLUDED == TRUE)
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_api.h"
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nci_hmsgs.h"
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "rw_api.h"
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "rw_int.h"
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_int.h"
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "gki.h"
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (defined (RW_NDEF_INCLUDED) && (RW_NDEF_INCLUDED == TRUE))
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Local Functions */
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_rall_rsp (BOOLEAN *p_notify,UINT8 *p_data);
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_dyn_read_rsp (BOOLEAN *p_notify, UINT8 *p_data);
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_write_rsp (BOOLEAN *p_notify, UINT8 *p_data);
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_read_rsp (BOOLEAN *p_callback, UINT8 *p_data);
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_tlv_detect_rsp (UINT8 *p_data);
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_ndef_read_rsp (UINT8 *p_data);
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_ndef_write_rsp (UINT8 *p_data);
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_ndef_rall_rsp (void);
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_ndef_write_first_block (void);
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_next_ndef_write_block (void);
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_send_ndef_byte (UINT8 data, UINT8 block, UINT8 index, UINT8 msg_len);
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_send_ndef_block (UINT8 *p_data, UINT8 block);
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 rw_t1t_prepare_ndef_bytes (UINT8 *p_data, UINT8 *p_length_field, UINT8 *p_index, BOOLEAN b_one_byte, UINT8 block, UINT8 lengthfield_len);
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 rw_t1t_get_ndef_flags (void);
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT16 rw_t1t_get_ndef_max_size (void);
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t1t_is_lock_reserved_otp_byte (UINT16 index);
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t1t_is_read_only_byte (UINT16 index);
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 rw_t1t_get_lock_bits_for_segment (UINT8 segment,UINT8 *p_start_byte, UINT8 *p_start_bit,UINT8 *p_end_byte);
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t1t_update_attributes (void);
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t1t_update_lock_attributes (void);
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t1t_extract_lock_bytes (UINT8 *p_data);
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t1t_update_tag_state (void);
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectconst UINT8 rw_t1t_mask_bits[8] =
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_handle_rsp
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function handles the response received for all commands
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  sent to tag
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          event to be sent to application
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttRW_EVENT rw_t1t_handle_rsp (const tT1T_CMD_RSP_INFO * p_info, BOOLEAN *p_notify, UINT8 *p_data, tNFC_STATUS *p_status)
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_EVENT   rw_event;
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t  = &rw_cb.tcb.t1t;
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       adds;
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if(  (p_t1t->state == RW_T1T_STATE_READ)
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project       ||(p_t1t->state == RW_T1T_STATE_WRITE)  )
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return t1t_info_to_evt (p_info);
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    rw_event = rw_t1t_info_to_event (p_info);
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_info->opcode == T1T_CMD_RALL)
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *p_status = rw_t1t_handle_rall_rsp (p_notify,p_data);
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (p_info->opcode == T1T_CMD_RSEG)
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        adds = *p_data;
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (adds == 0)
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->b_rseg   = TRUE;
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            rw_t1t_update_tag_state ();
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            rw_t1t_update_attributes ();
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            rw_t1t_update_lock_attributes ();
1035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            memcpy (p_t1t->mem, (UINT8 *) (p_data + T1T_ADD_LEN), T1T_SEGMENT_SIZE);
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *p_status = rw_t1t_handle_dyn_read_rsp (p_notify,p_data);
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (p_info->opcode == T1T_CMD_READ8)
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *p_status = rw_t1t_handle_dyn_read_rsp (p_notify,p_data);
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *p_status = rw_t1t_handle_write_rsp (p_notify,p_data);
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return rw_event;
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_info_to_event
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function returns RW event code based on the current state
123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          RW event code
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttRW_EVENT rw_t1t_info_to_event (const tT1T_CMD_RSP_INFO * p_info)
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_EVENT   rw_event;
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t  = &rw_cb.tcb.t1t;
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (p_t1t->state)
133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_TLV_DETECT:
135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t1t->tlv_detect == TAG_NDEF_TLV)
136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            rw_event = RW_T1T_NDEF_DETECT_EVT;
137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            rw_event = RW_T1T_TLV_DETECT_EVT;
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_READ_NDEF:
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_event = RW_T1T_NDEF_READ_EVT;
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_WRITE_NDEF:
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_event = RW_T1T_NDEF_WRITE_EVT;
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_SET_TAG_RO:
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_event = RW_T1T_SET_TAG_RO_EVT;
151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_CHECK_PRESENCE:
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_event = RW_T1T_PRESENCE_CHECK_EVT;
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_FORMAT_TAG:
158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_event = RW_T1T_FORMAT_CPLT_EVT;
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project	    rw_event = t1t_info_to_evt (p_info);
163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return rw_event;
166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_extract_lock_bytes
171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function will extract lock bytes if any present in the
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  response data
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Parameters       p_data: Data bytes in the response of RSEG/READ8/RALL command
1765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_t1t_extract_lock_bytes (UINT8 *p_data)
181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16              end;
183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16              start;
184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8               num_locks;
185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16              lock_offset = 0;
186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16              offset;
187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB          *p_t1t          = &rw_cb.tcb.t1t;
188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tT1T_CMD_RSP_INFO   *p_cmd_rsp_info = (tT1T_CMD_RSP_INFO *) rw_cb.tcb.t1t.p_cmd_rsp_info;
189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    num_locks = 0;
191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Based on the Command used to read Tag, calculate the offset of the tag read */
192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_cmd_rsp_info->opcode == T1T_CMD_RSEG)
193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        start = p_t1t->segment * T1T_SEGMENT_SIZE;
1955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        end   = start + T1T_SEGMENT_SIZE;
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (p_cmd_rsp_info->opcode == T1T_CMD_READ8)
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        start = p_t1t->block_read * T1T_BLOCK_SIZE;
2005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        end   = start + T1T_BLOCK_SIZE;
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (p_cmd_rsp_info->opcode == T1T_CMD_RALL)
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        start = 0;
205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        end   = T1T_STATIC_SIZE;
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Collect lock bytes that are present in the part of the data read from Tag */
211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while (num_locks < p_t1t->num_lockbytes)
212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t1t->lockbyte[num_locks].b_lock_read == FALSE)
214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            /* Get the exact offset of the dynamic lock byte in the tag */
216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            offset = p_t1t->lock_tlv[p_t1t->lockbyte[num_locks].tlv_index].offset + p_t1t->lockbyte[num_locks].byte_index;
217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (  (offset <  end)
218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                &&(offset >= start)  )
219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
2215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                /* This dynamic lock byte is in the response */
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_cmd_rsp_info->opcode == T1T_CMD_RSEG)
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
2245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    lock_offset = (offset % T1T_SEGMENT_SIZE);
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else if (p_cmd_rsp_info->opcode == T1T_CMD_READ8)
227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
2285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    lock_offset = (offset % T1T_BLOCK_SIZE);
229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else if (p_cmd_rsp_info->opcode == T1T_CMD_RALL)
231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    lock_offset = offset;
233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->lockbyte[num_locks].lock_byte    = p_data[lock_offset];
236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->lockbyte[num_locks].b_lock_read  = TRUE;
237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        num_locks++;
242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_update_tag_attributes
248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function will update tag attributes based on cc, ndef
250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  message length
251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_t1t_update_tag_state (void)
256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t          = &rw_cb.tcb.t1t;
258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Set Tag state based on CC value and NDEF Message length */
260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  ((p_t1t->mem[T1T_CC_NMN_BYTE] == T1T_CC_NMN) || (p_t1t->mem[T1T_CC_NMN_BYTE] == 0))
261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&((p_t1t->mem[T1T_CC_VNO_BYTE] == T1T_CC_VNO) || (p_t1t->mem[T1T_CC_VNO_BYTE] == T1T_CC_LEGACY_VNO))
2625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        &&((p_t1t->mem[T1T_CC_RWA_BYTE] == T1T_CC_RWA_RW) || (p_t1t->mem[T1T_CC_RWA_BYTE] == T1T_CC_RWA_RO))  )
263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Valid CC value, so Tag is initialized */
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t1t->ndef_msg_len > 0)
266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (p_t1t->mem[T1T_CC_RWA_BYTE] == T1T_CC_RWA_RO)
268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* NDEF Message presence, CC indication sets Tag as READ ONLY  */
270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->tag_attribute = RW_T1_TAG_ATTRB_READ_ONLY;
271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else if (p_t1t->mem[T1T_CC_RWA_BYTE] == T1T_CC_RWA_RW)
273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* NDEF Message presence, CC indication sets Tag as READ WRITE */
275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->tag_attribute = RW_T1_TAG_ATTRB_READ_WRITE;
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* If NDEF is not yet detected then Tag remains in Initialized state
281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            *  after NDEF Detection the Tag state may be updated */
282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->tag_attribute = RW_T1_TAG_ATTRB_INITIALIZED;
283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->tag_attribute = RW_T1_TAG_ATTRB_UNKNOWN;
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_read_locks
294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function will send command to read next unread locks
296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK, if all locks are read successfully
298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED, if reading locks failed
299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_CONTINUE, if reading locks is in progress
300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_t1t_read_locks (void)
303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       num_locks   = 0;
305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t      = &rw_cb.tcb.t1t;
306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS status      = NFC_STATUS_CONTINUE;
307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      offset;
308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while (num_locks < p_t1t->num_lockbytes)
310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t1t->lockbyte[num_locks].b_lock_read == FALSE)
312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            offset = p_t1t->lock_tlv[p_t1t->lockbyte[num_locks].tlv_index].offset + p_t1t->lockbyte[num_locks].byte_index;
314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (offset < T1T_STATIC_SIZE)
315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project               p_t1t->lockbyte[num_locks].lock_byte   = p_t1t->mem[offset];
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project               p_t1t->lockbyte[num_locks].b_lock_read = TRUE;
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else if (offset < (p_t1t->mem[T1T_CC_TMS_BYTE] + 1) * T1T_BLOCK_SIZE)
320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* send READ8 command */
3225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                p_t1t->block_read = (UINT8) (offset/T1T_BLOCK_SIZE);
3235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                if ((status = rw_t1t_send_dyn_cmd (T1T_CMD_READ8, p_t1t->block_read, NULL)) == NFC_STATUS_OK)
324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* Reading Locks */
326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    status          = NFC_STATUS_CONTINUE;
327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_t1t->substate = RW_T1T_SUBSTATE_WAIT_READ_LOCKS;
328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* Read locks failed */
334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                status = NFC_STATUS_FAILED;
335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        num_locks++;
339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (num_locks == p_t1t->num_lockbytes)
341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* All locks are read */
343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = NFC_STATUS_OK;
344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_handle_write_rsp
352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function handles response received for WRITE_E8,
354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  WRITE_NE8, WRITE_E, WRITE_NE commands
355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          status of the current NDEF/TLV Operation
357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_write_rsp (BOOLEAN *p_notify, UINT8 *p_data)
360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t      = &rw_cb.tcb.t1t;
362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS status      = NFC_STATUS_OK;
363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       num_locks;
364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       lock_count;
365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       value;
366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       addr;
367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       write_block[T1T_BLOCK_SIZE];
368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      offset;
369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      next_offset;
370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       num_bits;
371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       next_num_bits;
372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    *p_notify = FALSE;
374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (p_t1t->state)
376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_WRITE:
378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *p_notify = TRUE;
379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_FORMAT_TAG:
382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t1t->substate == RW_T1T_SUBSTATE_WAIT_SET_NULL_NDEF)
383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (rw_cb.tcb.t1t.hr[0] != T1T_STATIC_HR0 || rw_cb.tcb.t1t.hr[1] >= RW_T1T_HR1_MIN)
385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                *p_notify = TRUE;
386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_t1t->work_offset < (T1T_BLOCK_SIZE - 1))
389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_t1t->work_offset++;
391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* send WRITE-E command */
392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    RW_T1T_BLD_ADD ((addr), 1, (UINT8) p_t1t->work_offset);
393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if ((status = rw_t1t_send_static_cmd (T1T_CMD_WRITE_E, addr, p_t1t->ndef_first_block[(UINT8) p_t1t->work_offset])) != NFC_STATUS_OK)
395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        *p_notify = TRUE;
396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    *p_notify = TRUE;
399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* send WRITE-E8 command */
405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if ((status = rw_t1t_send_dyn_cmd (T1T_CMD_WRITE_E8, 2, p_t1t->ndef_final_block)) != NFC_STATUS_OK)
406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                *p_notify = TRUE;
407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->substate = RW_T1T_SUBSTATE_WAIT_SET_NULL_NDEF;
409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_SET_TAG_RO:
413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        switch (p_t1t->substate)
414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case RW_T1T_SUBSTATE_WAIT_SET_CC_RWA_RO:
416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (!p_t1t->b_hard_lock)
418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                status    = NFC_STATUS_OK;
420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                *p_notify = TRUE;
421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if ((p_t1t->hr[0] & 0x0F) != 1)
425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                memset (write_block,0,T1T_BLOCK_SIZE);
427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                write_block[0] = 0xFF;
428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                write_block[1] = 0xFF;
429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* send WRITE-NE8 command */
431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if ((status = rw_t1t_send_dyn_cmd (T1T_CMD_WRITE_NE8, T1T_LOCK_BLOCK, write_block)) != NFC_STATUS_OK)
432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    *p_notify       = TRUE;
433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_t1t->substate = RW_T1T_SUBSTATE_WAIT_SET_DYN_LOCK_BITS;
435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* send WRITE-NE command */
439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                RW_T1T_BLD_ADD ((addr), (T1T_LOCK_BLOCK), (0));
440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if ((status = rw_t1t_send_static_cmd (T1T_CMD_WRITE_NE, addr, 0xFF)) != NFC_STATUS_OK)
441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    *p_notify       = TRUE;
442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_t1t->substate = RW_T1T_SUBSTATE_WAIT_SET_ST_LOCK_BITS;
444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case RW_T1T_SUBSTATE_WAIT_SET_ST_LOCK_BITS:
448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* send WRITE-NE command */
450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            RW_T1T_BLD_ADD ((addr), (T1T_LOCK_BLOCK), (1));
451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if ((status = rw_t1t_send_static_cmd (T1T_CMD_WRITE_NE, addr, 0xFF)) != NFC_STATUS_OK)
452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                *p_notify       = TRUE;
453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->substate = RW_T1T_SUBSTATE_WAIT_SET_DYN_LOCK_BITS;
455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case RW_T1T_SUBSTATE_WAIT_SET_DYN_LOCK_BITS:
459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            num_locks = 0;
460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            while (num_locks < p_t1t->num_lockbytes)
461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_t1t->lockbyte[num_locks].lock_status == RW_T1T_LOCK_UPDATE_INITIATED)
463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_t1t->lockbyte[num_locks].lock_status = RW_T1T_LOCK_UPDATED;
465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                num_locks++;
467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            num_locks = 0;
470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            while (num_locks < p_t1t->num_lockbytes)
471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_t1t->lockbyte[num_locks].lock_status == RW_T1T_LOCK_NOT_UPDATED)
473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    offset = p_t1t->lock_tlv[p_t1t->lockbyte[num_locks].tlv_index].offset + p_t1t->lockbyte[num_locks].byte_index;
475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    num_bits = ((p_t1t->lockbyte[num_locks].byte_index + 1)* 8 <= p_t1t->lock_tlv[p_t1t->lockbyte[num_locks].tlv_index].num_bits) ? 8 : p_t1t->lock_tlv[p_t1t->lockbyte[num_locks].tlv_index].num_bits % 8;
476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if ((p_t1t->hr[0] & 0x0F) != 1)
478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        memset (write_block,0,T1T_BLOCK_SIZE);
480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        write_block[(UINT8) (offset%T1T_BLOCK_SIZE)] |=  tags_pow (2,num_bits) - 1;
482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        lock_count = num_locks + 1;
483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        while (lock_count < p_t1t->num_lockbytes)
484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        {
485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            next_offset = p_t1t->lock_tlv[p_t1t->lockbyte[lock_count].tlv_index].offset + p_t1t->lockbyte[lock_count].byte_index;
486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            next_num_bits = ((p_t1t->lockbyte[lock_count].byte_index + 1)* 8 <= p_t1t->lock_tlv[p_t1t->lockbyte[lock_count].tlv_index].num_bits) ? 8 : p_t1t->lock_tlv[p_t1t->lockbyte[lock_count].tlv_index].num_bits % 8;
487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            if (next_offset/T1T_BLOCK_SIZE == offset/T1T_BLOCK_SIZE)
489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            {
490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                write_block[(UINT8) (next_offset%T1T_BLOCK_SIZE)] |=  tags_pow (2,next_num_bits) - 1;
491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            }
492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            else
493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                break;
494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            lock_count ++;
495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        }
496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        /* send WRITE-NE8 command */
498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        if ((status = rw_t1t_send_dyn_cmd (T1T_CMD_WRITE_NE8, (UINT8) (offset/T1T_BLOCK_SIZE), write_block)) == NFC_STATUS_OK)
499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        {
500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            p_t1t->substate = RW_T1T_SUBSTATE_WAIT_SET_DYN_LOCK_BITS;
501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            while (lock_count >  num_locks)
502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            {
503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                p_t1t->lockbyte[lock_count - 1].lock_status = RW_T1T_LOCK_UPDATE_INITIATED;
504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                lock_count --;
505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            }
506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        }
507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        else
508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            *p_notify       = TRUE;
509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    else
511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        /* send WRITE-NE command */
513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        RW_T1T_BLD_ADD ((addr), ((UINT8) (offset/T1T_BLOCK_SIZE)), ((UINT8) (offset%T1T_BLOCK_SIZE)));
514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        value = (UINT8) (tags_pow (2,num_bits) - 1);
515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        if ((status = rw_t1t_send_static_cmd (T1T_CMD_WRITE_NE, addr, value)) == NFC_STATUS_OK)
516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        {
517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            p_t1t->substate = RW_T1T_SUBSTATE_WAIT_SET_DYN_LOCK_BITS;
518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            p_t1t->lockbyte[num_locks].lock_status = RW_T1T_LOCK_UPDATE_INITIATED;
519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        }
520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        else
521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            *p_notify       = TRUE;
522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    break;
524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                num_locks++;
526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (num_locks == p_t1t->num_lockbytes)
528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                rw_t1t_update_lock_attributes ();
530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                status    = NFC_STATUS_OK;
531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                *p_notify = TRUE;
532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_WRITE_NDEF:
538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        switch (p_t1t->substate)
539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case RW_T1T_SUBSTATE_WAIT_VALIDATE_NDEF:
541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->ndef_msg_len  = p_t1t->new_ndef_msg_len;
542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->tag_attribute = RW_T1_TAG_ATTRB_READ_WRITE;
543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            *p_notify = TRUE;
544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case RW_T1T_SUBSTATE_WAIT_NDEF_UPDATED:
547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            status      = rw_t1t_handle_ndef_write_rsp (p_data);
548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (status == NFC_STATUS_OK)
549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->substate = RW_T1T_SUBSTATE_WAIT_VALIDATE_NDEF;
551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else if (status == NFC_STATUS_FAILED)
553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* Send Negative response to upper layer */
555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                *p_notify       = TRUE;
556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case RW_T1T_SUBSTATE_WAIT_NDEF_WRITE:
560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            status = rw_t1t_handle_ndef_write_rsp (p_data);
561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (status == NFC_STATUS_FAILED)
563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* Send Negative response to upper layer */
565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                *p_notify       = TRUE;
566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else if (status == NFC_STATUS_OK)
568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->substate = RW_T1T_SUBSTATE_WAIT_NDEF_UPDATED;
570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case RW_T1T_SUBSTATE_WAIT_INVALIDATE_NDEF:
574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            status = rw_t1t_handle_ndef_write_rsp (p_data);
575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (status == NFC_STATUS_FAILED)
576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* Send Negative response to upper layer */
578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                *p_notify   = TRUE;
579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else if (status == NFC_STATUS_CONTINUE)
581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->substate = RW_T1T_SUBSTATE_WAIT_NDEF_WRITE;
583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->substate = RW_T1T_SUBSTATE_WAIT_NDEF_UPDATED;
587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_handle_read_rsp
598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
5995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      This function handle the data bytes excluding ADD(S)/ADD8 field
6005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**                  received as part of RSEG, RALL, READ8 command response
601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          status of the current NDEF/TLV Operation
603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
6055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn CoenentNFC_STATUS rw_t1t_handle_read_rsp (BOOLEAN *p_notify, UINT8 *p_data)
606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB              *p_t1t  = &rw_cb.tcb.t1t;
608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS             status  = NFC_STATUS_OK;
609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_DETECT_NDEF_DATA    ndef_data;
610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_DETECT_TLV_DATA     tlv_data;
611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8                   count;
612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_READ_DATA           evt_data;
613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    *p_notify = FALSE;
615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Handle the response based on the current state */
616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (p_t1t->state)
617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_READ:
619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *p_notify = TRUE;
620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_READ_NDEF:
623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = rw_t1t_handle_ndef_rall_rsp ();
624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (status != NFC_STATUS_CONTINUE)
625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.status = status;
627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            evt_data.p_data = NULL;
628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            rw_t1t_handle_op_complete ();
629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            (*rw_cb.p_cback) (RW_T1T_NDEF_READ_EVT, (tRW_DATA *) &evt_data);
630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_TLV_DETECT:
634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        switch (p_t1t->substate)
635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case RW_T1T_SUBSTATE_WAIT_READ_LOCKS:
637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            status = rw_t1t_read_locks ();
638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (status != NFC_STATUS_CONTINUE)
639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                rw_t1t_update_lock_attributes ();
641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* Send positive response to upper layer */
642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_t1t->tlv_detect == TAG_LOCK_CTRL_TLV)
643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    tlv_data.protocol   = NFC_PROTOCOL_T1T;
645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    tlv_data.num_bytes  = p_t1t->num_lockbytes;
646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    tlv_data.status = status;
647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    rw_t1t_handle_op_complete ();
648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    (*rw_cb.p_cback) (RW_T1T_TLV_DETECT_EVT, (tRW_DATA *) &tlv_data);
649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else if (p_t1t->tlv_detect == TAG_NDEF_TLV)
651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ndef_data.protocol  = NFC_PROTOCOL_T1T;
653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ndef_data.flags     = rw_t1t_get_ndef_flags ();
654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ndef_data.flags    |= RW_NDEF_FL_FORMATED;
655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ndef_data.max_size  = (UINT32) rw_t1t_get_ndef_max_size ();
656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ndef_data.cur_size  = p_t1t->ndef_msg_len;
657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (ndef_data.max_size  < ndef_data.cur_size)
659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        ndef_data.flags    |= RW_NDEF_FL_READ_ONLY;
661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        ndef_data.max_size  = ndef_data.cur_size;
662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (!(ndef_data.flags & RW_NDEF_FL_READ_ONLY))
665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        ndef_data.flags    |= RW_NDEF_FL_SOFT_LOCKABLE;
667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        if (status == NFC_STATUS_OK)
668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            ndef_data.flags    |= RW_NDEF_FL_HARD_LOCKABLE;
669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ndef_data.status = status;
671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    rw_t1t_handle_op_complete ();
672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    (*rw_cb.p_cback) (RW_T1T_NDEF_DETECT_EVT, (tRW_DATA *)&ndef_data);
673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case RW_T1T_SUBSTATE_NONE:
678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (p_t1t->tlv_detect == TAG_MEM_CTRL_TLV)
679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                tlv_data.status    = rw_t1t_handle_tlv_detect_rsp (p_t1t->mem);
681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                tlv_data.protocol  = NFC_PROTOCOL_T1T;
682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                tlv_data.num_bytes = 0;
683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                count              = 0;
684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                while (count < p_t1t->num_mem_tlvs)
685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    tlv_data.num_bytes += p_t1t->mem_tlv[p_t1t->num_mem_tlvs].num_bytes;
687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    count++;
688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                rw_t1t_handle_op_complete ();
690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* Send response to upper layer */
691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                (*rw_cb.p_cback) (RW_T1T_TLV_DETECT_EVT, (tRW_DATA *) &tlv_data);
692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else if (p_t1t->tlv_detect == TAG_LOCK_CTRL_TLV)
694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                tlv_data.status    = rw_t1t_handle_tlv_detect_rsp (p_t1t->mem);
696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                tlv_data.protocol  = NFC_PROTOCOL_T1T;
697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                tlv_data.num_bytes = p_t1t->num_lockbytes;
698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (tlv_data.status == NFC_STATUS_FAILED)
700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    rw_t1t_handle_op_complete ();
702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* Send Negative response to upper layer */
704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    (*rw_cb.p_cback) (RW_T1T_TLV_DETECT_EVT, (tRW_DATA *)&tlv_data);
705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    rw_t1t_extract_lock_bytes (p_data);
709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    status = rw_t1t_read_locks ();
710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (status != NFC_STATUS_CONTINUE)
711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        /* Send positive response to upper layer */
713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        tlv_data.status = status;
714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        rw_t1t_handle_op_complete ();
715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        (*rw_cb.p_cback) (RW_T1T_TLV_DETECT_EVT, (tRW_DATA *) &tlv_data);
717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else if (p_t1t->tlv_detect == TAG_NDEF_TLV)
721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ndef_data.protocol  = NFC_PROTOCOL_T1T;
723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                ndef_data.flags     = rw_t1t_get_ndef_flags ();
724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_t1t->mem[T1T_CC_NMN_BYTE] == T1T_CC_NMN)
726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ndef_data.status    = rw_t1t_handle_tlv_detect_rsp (p_t1t->mem);
728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ndef_data.cur_size  = p_t1t->ndef_msg_len;
730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (ndef_data.status == NFC_STATUS_FAILED)
731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        ndef_data.max_size  = (UINT32) rw_t1t_get_ndef_max_size ();
733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        if (ndef_data.max_size  < ndef_data.cur_size)
734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        {
735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            ndef_data.flags    |= RW_NDEF_FL_READ_ONLY;
736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            ndef_data.max_size  = ndef_data.cur_size;
737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        }
738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        if (!(ndef_data.flags & RW_NDEF_FL_READ_ONLY))
739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        {
740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            ndef_data.flags    |= RW_NDEF_FL_SOFT_LOCKABLE;
741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        }
742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        /* Send Negative response to upper layer */
743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        rw_t1t_handle_op_complete ();
744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        (*rw_cb.p_cback) (RW_T1T_NDEF_DETECT_EVT, (tRW_DATA *) &ndef_data);
746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    else
748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        ndef_data.flags    |= RW_NDEF_FL_FORMATED;
750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        rw_t1t_extract_lock_bytes (p_data);
751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        status = rw_t1t_read_locks ();
752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        if (status != NFC_STATUS_CONTINUE)
753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        {
754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            ndef_data.max_size  = (UINT32) rw_t1t_get_ndef_max_size ();
755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            if (ndef_data.max_size  < ndef_data.cur_size)
756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            {
757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                ndef_data.flags    |= RW_NDEF_FL_READ_ONLY;
758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                ndef_data.max_size  = ndef_data.cur_size;
759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            }
760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            if (!(ndef_data.flags & RW_NDEF_FL_READ_ONLY))
762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            {
763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                ndef_data.flags    |= RW_NDEF_FL_SOFT_LOCKABLE;
764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                if (status == NFC_STATUS_OK)
765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    ndef_data.flags    |= RW_NDEF_FL_HARD_LOCKABLE;
766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            }
767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            /* Send positive response to upper layer */
768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            ndef_data.status = status;
769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            rw_t1t_handle_op_complete ();
770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            (*rw_cb.p_cback) (RW_T1T_NDEF_DETECT_EVT, (tRW_DATA *)&ndef_data);
772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        }
773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* Send Negative response to upper layer */
778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ndef_data.status    = NFC_STATUS_FAILED;
779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ndef_data.max_size  = (UINT32) rw_t1t_get_ndef_max_size ();
780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ndef_data.cur_size  = p_t1t->ndef_msg_len;
781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (ndef_data.max_size  < ndef_data.cur_size)
782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        ndef_data.flags    |= RW_NDEF_FL_READ_ONLY;
784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        ndef_data.max_size  = ndef_data.cur_size;
785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (!(ndef_data.flags & RW_NDEF_FL_READ_ONLY))
787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        ndef_data.flags    |= RW_NDEF_FL_SOFT_LOCKABLE;
789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        ndef_data.flags    |= RW_NDEF_FL_SOFT_LOCKABLE;
790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    rw_t1t_handle_op_complete ();
792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    (*rw_cb.p_cback) (RW_T1T_NDEF_DETECT_EVT, (tRW_DATA *) &ndef_data);
794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_handle_dyn_read_rsp
806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function handles response received for READ8, RSEG
808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  commands based on the current state
809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          status of the current NDEF/TLV Operation
811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_dyn_read_rsp (BOOLEAN *p_notify, UINT8 *p_data)
814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS status  = NFC_STATUS_OK;
816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t  = &rw_cb.tcb.t1t;
817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    *p_notify = FALSE;
819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    p_data += T1T_ADD_LEN;
8215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    rw_t1t_extract_lock_bytes (p_data);
823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_t1t->state == RW_T1T_STATE_READ_NDEF)
825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = rw_t1t_handle_ndef_read_rsp (p_data);
827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (status == NFC_STATUS_FAILED)
828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ||(status == NFC_STATUS_OK)  )
829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Send response to upper layer */
831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            *p_notify = TRUE;
832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (p_t1t->state == RW_T1T_STATE_WRITE_NDEF)
835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = rw_t1t_handle_ndef_write_rsp (p_data);
837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (status == NFC_STATUS_FAILED)
838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Send response to upper layer */
840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            *p_notify = TRUE;
841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (status == NFC_STATUS_CONTINUE)
843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->substate = RW_T1T_SUBSTATE_WAIT_INVALIDATE_NDEF;
845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
8495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        status = rw_t1t_handle_read_rsp (p_notify, p_data);
850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_handle_rall_rsp
857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Handle response to RALL - Collect CC, set Tag state
859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_rall_rsp (BOOLEAN *p_notify,UINT8 *p_data)
864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t   = &rw_cb.tcb.t1t;
866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_data      += T1T_HR_LEN; /* skip HR */
868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    memcpy (p_t1t->mem, (UINT8 *) p_data, T1T_STATIC_SIZE);
869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t1t->segment  = 0;
870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    rw_t1t_extract_lock_bytes (p_data);
871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_data      += T1T_UID_LEN + T1T_RES_BYTE_LEN; /* skip Block 0, UID and Reserved byte */
873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    RW_TRACE_DEBUG0 ("rw_t1t_handle_rall_rsp ()");
875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    rw_t1t_update_tag_state ();
877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    rw_t1t_update_attributes ();
878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    rw_t1t_update_lock_attributes ();
879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t1t->b_update = TRUE;
880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (rw_t1t_handle_read_rsp (p_notify, p_t1t->mem));
881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_handle_tlv_detect_rsp
886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Handle response to the last command sent while
888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  detecting tlv
889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK, if tlv detect is complete & success
891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED,if tlv detect failed
892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_tlv_detect_rsp (UINT8 *p_data)
895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      offset;
897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      len;
898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       xx;
899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       *p_readbytes;
900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       index;
901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       tlv_detect_state = RW_T1T_SUBSTATE_WAIT_TLV_DETECT;
902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       found_tlv = TAG_NULL_TLV;
903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t          = &rw_cb.tcb.t1t;
904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BOOLEAN     failed          = FALSE;
905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BOOLEAN     found           = FALSE;
906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       count           = 0;
907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS status          = NFC_STATUS_FAILED;
908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       start_offset    = T1T_UID_LEN + T1T_CC_LEN + T1T_RES_BYTE_LEN;
909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       end_offset      = T1T_STATIC_SIZE - (2*T1T_BLOCK_SIZE);
910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       bytes_read      = T1T_STATIC_SIZE;
911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       tlv_value[T1T_DEFAULT_TLV_LEN];
912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      bytes_count = 0;
913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_readbytes = p_data;
915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (offset = start_offset; offset < end_offset  && !failed && !found;)
917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (rw_t1t_is_lock_reserved_otp_byte ((UINT16) (offset)) == TRUE)
919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            offset++;
921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            continue;
922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        switch (tlv_detect_state)
924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case RW_T1T_SUBSTATE_WAIT_TLV_DETECT:
926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Search for the tag */
927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            found_tlv = p_readbytes[offset++];
928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            switch (found_tlv)
929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            case TAG_NULL_TLV:         /* May be used for padding. SHALL ignore this */
931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            case TAG_NDEF_TLV:
934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_t1t->tlv_detect == TAG_NDEF_TLV)
935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    index = (offset % T1T_BLOCK_SIZE);
937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* Backup ndef first block */
938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    memcpy (&p_t1t->ndef_first_block[0],&p_readbytes[offset-index],index);
939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    memcpy (&p_t1t->ndef_first_block[index],&p_readbytes[offset],T1T_BLOCK_SIZE - index);
940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    tlv_detect_state = RW_T1T_SUBSTATE_WAIT_FIND_LEN_FIELD_LEN;
941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else if (p_t1t->tlv_detect == TAG_PROPRIETARY_TLV)
943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    tlv_detect_state = RW_T1T_SUBSTATE_WAIT_FIND_LEN_FIELD_LEN;
945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else if (  ((p_t1t->tlv_detect == TAG_LOCK_CTRL_TLV) && (p_t1t->num_lockbytes > 0))
947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                         ||((p_t1t->tlv_detect == TAG_MEM_CTRL_TLV) && (p_t1t->num_mem_tlvs > 0))  )
948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    found = TRUE;
950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    failed = TRUE;
954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            case TAG_LOCK_CTRL_TLV:
958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            case TAG_MEM_CTRL_TLV:
959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                tlv_detect_state = RW_T1T_SUBSTATE_WAIT_READ_TLV_LEN0;
960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            case TAG_PROPRIETARY_TLV:
963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_t1t->tlv_detect == TAG_PROPRIETARY_TLV)
964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    index = (offset % T1T_BLOCK_SIZE);
966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* Backup ndef first block */
967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    tlv_detect_state = RW_T1T_SUBSTATE_WAIT_FIND_LEN_FIELD_LEN;
968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
971c11a054fc2855196292b062a843321121b591cc0Evan Chu                    /* NDEF/LOCK/MEM TLV can exist after Proprietary Tlv so we continue searching, skiping proprietary tlv */
972c11a054fc2855196292b062a843321121b591cc0Evan Chu                    tlv_detect_state = RW_T1T_SUBSTATE_WAIT_FIND_LEN_FIELD_LEN;
973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            case TAG_TERMINATOR_TLV:   /* Last TLV block in the data area. Must be no NDEF nessage */
977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (  ((p_t1t->tlv_detect == TAG_LOCK_CTRL_TLV) && (p_t1t->num_lockbytes > 0))
978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ||((p_t1t->tlv_detect == TAG_MEM_CTRL_TLV) && (p_t1t->num_mem_tlvs > 0))  )
979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    found = TRUE;
981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    failed = TRUE;
985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            default:
988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                failed = TRUE;
989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case RW_T1T_SUBSTATE_WAIT_FIND_LEN_FIELD_LEN:
993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            len = p_readbytes[offset];
994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            switch (found_tlv)
995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            case TAG_NDEF_TLV:
997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->ndef_header_offset = offset + p_t1t->work_offset;
998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (len == T1T_LONG_NDEF_LEN_FIELD_BYTE0)
999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* The next two bytes constitute length bytes */
1001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    tlv_detect_state     = RW_T1T_SUBSTATE_WAIT_READ_TLV_LEN0;
1002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
1004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* one byte length field */
1006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_t1t->ndef_msg_len = len;
1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    bytes_count  = p_t1t->ndef_msg_len;
1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    tlv_detect_state     = RW_T1T_SUBSTATE_WAIT_READ_TLV_VALUE;
1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            case TAG_PROPRIETARY_TLV:
1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (len == 0xFF)
1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* The next two bytes constitute length bytes */
1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    tlv_detect_state     = RW_T1T_SUBSTATE_WAIT_READ_TLV_LEN0;
1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* one byte length field */
1021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    bytes_count  = len;
1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    tlv_detect_state     = RW_T1T_SUBSTATE_WAIT_READ_TLV_VALUE;
1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
1025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            offset++;
1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case RW_T1T_SUBSTATE_WAIT_READ_TLV_LEN0:
1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            switch (found_tlv)
1031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            case TAG_LOCK_CTRL_TLV:
1033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            case TAG_MEM_CTRL_TLV:
1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                len = p_readbytes[offset];
1036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (len == T1T_DEFAULT_TLV_LEN)
1037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* Valid Lock control TLV */
1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    tlv_detect_state = RW_T1T_SUBSTATE_WAIT_READ_TLV_VALUE;
1040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    bytes_count = T1T_DEFAULT_TLV_LEN;
1041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else if (  ((p_t1t->tlv_detect == TAG_LOCK_CTRL_TLV) && (p_t1t->num_lockbytes > 0))
1043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                         ||((p_t1t->tlv_detect == TAG_MEM_CTRL_TLV) && (p_t1t->num_mem_tlvs > 0))  )
1044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    found = TRUE;
1046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
1048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    failed = TRUE;
1050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
1052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            case TAG_NDEF_TLV:
1054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            case TAG_PROPRIETARY_TLV:
1055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* The first length byte */
1056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                bytes_count  = (UINT8) p_readbytes[offset];
1057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                tlv_detect_state     = RW_T1T_SUBSTATE_WAIT_READ_TLV_LEN1;
1058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
1059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            offset++;
1061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
1062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case RW_T1T_SUBSTATE_WAIT_READ_TLV_LEN1:
1064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            bytes_count  = (bytes_count << 8) + p_readbytes[offset];
1065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (found_tlv == TAG_NDEF_TLV)
1066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->ndef_msg_len = bytes_count;
1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            tlv_detect_state     = RW_T1T_SUBSTATE_WAIT_READ_TLV_VALUE;
1070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            offset++;
1071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
1072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case RW_T1T_SUBSTATE_WAIT_READ_TLV_VALUE:
1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            switch (found_tlv)
1075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            case TAG_NDEF_TLV:
1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if ((bytes_count == p_t1t->ndef_msg_len) && (p_t1t->tlv_detect == TAG_NDEF_TLV))
1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* The first byte offset after length field */
1080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_t1t->ndef_msg_offset = offset + p_t1t->work_offset;
1081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (bytes_count > 0)
1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    bytes_count--;
1084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_t1t->tlv_detect == TAG_NDEF_TLV)
1086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (p_t1t->ndef_msg_len > 0)
1088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
1089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        rw_t1t_update_tag_state ();
1090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
1091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    else
1092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        p_t1t->tag_attribute = RW_T1_TAG_ATTRB_INITIALIZED_NDEF;
1094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    found = TRUE;
1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else if (bytes_count == 0)
1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    tlv_detect_state = RW_T1T_SUBSTATE_WAIT_TLV_DETECT;
1100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            case TAG_LOCK_CTRL_TLV:
1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                bytes_count--;
1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (  (p_t1t->tlv_detect == TAG_LOCK_CTRL_TLV)
1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ||(p_t1t->tlv_detect == TAG_NDEF_TLV)  )
1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    tlv_value[2 - bytes_count] = p_readbytes[offset];
1109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (bytes_count == 0)
1110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
1111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        if (p_t1t->num_lock_tlvs < RW_T1T_MAX_LOCK_TLVS)
1112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        {
1113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            p_t1t->lock_tlv[p_t1t->num_lock_tlvs].offset   = (tlv_value[0] >> 4) & 0x0F;
1114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            p_t1t->lock_tlv[p_t1t->num_lock_tlvs].offset  *= (UINT8) tags_pow (2, tlv_value[2] & 0x0F);
1115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            p_t1t->lock_tlv[p_t1t->num_lock_tlvs].offset  += tlv_value[0] & 0x0F;
1116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            p_t1t->lock_tlv[p_t1t->num_lock_tlvs].bytes_locked_per_bit = (UINT8) tags_pow (2, ((tlv_value[2] & 0xF0) >> 4));
1117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            p_t1t->lock_tlv[p_t1t->num_lock_tlvs].num_bits = tlv_value[1];
1118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            count = tlv_value[1] / 8 + ((tlv_value[1] % 8 != 0)? 1:0);
1119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            xx = 0;
1120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            while (xx < count)
1121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            {
1122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                if (p_t1t->num_lockbytes < RW_T1T_MAX_LOCK_BYTES)
1123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                {
1124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    p_t1t->lockbyte[p_t1t->num_lockbytes].tlv_index = p_t1t->num_lock_tlvs;
1125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    p_t1t->lockbyte[p_t1t->num_lockbytes].byte_index = xx;
1126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    p_t1t->lockbyte[p_t1t->num_lockbytes].b_lock_read = FALSE;
1127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    p_t1t->num_lockbytes++;
1128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                }
1129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                else
1130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    RW_TRACE_ERROR1 ("T1T Buffer overflow error. Max supported lock bytes=0x%02X", RW_T1T_MAX_LOCK_BYTES);
1131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                xx++;
1132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            }
1133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            p_t1t->num_lock_tlvs++;
1134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            rw_t1t_update_attributes ();
1135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        }
1136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        else
1137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            RW_TRACE_ERROR1 ("T1T Buffer overflow error. Max supported lock tlvs=0x%02X", RW_T1T_MAX_LOCK_TLVS);
1138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        tlv_detect_state = RW_T1T_SUBSTATE_WAIT_TLV_DETECT;
1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
1143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (bytes_count == 0)
1145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
1146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        tlv_detect_state = RW_T1T_SUBSTATE_WAIT_TLV_DETECT;
1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
1150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            case TAG_MEM_CTRL_TLV:
1152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                bytes_count--;
1153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (  (p_t1t->tlv_detect == TAG_MEM_CTRL_TLV)
1154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ||(p_t1t->tlv_detect == TAG_NDEF_TLV)  )
1155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    tlv_value[2 - bytes_count] = p_readbytes[offset];
1157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (bytes_count == 0)
1158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
1159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        if (p_t1t->num_mem_tlvs >= RW_T1T_MAX_MEM_TLVS)
1160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        {
1161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            RW_TRACE_ERROR0 ("rw_t1t_handle_tlv_detect_rsp - Maximum buffer allocated for Memory tlv has reached");
1162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            failed  = TRUE;
1163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        }
1164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        else
1165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        {
1166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            /* Extract dynamic reserved bytes */
1167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            p_t1t->mem_tlv[p_t1t->num_mem_tlvs].offset   = (tlv_value[0] >> 4) & 0x0F;
1168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            p_t1t->mem_tlv[p_t1t->num_mem_tlvs].offset  *= (UINT8) tags_pow (2, tlv_value[2] & 0x0F);
1169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            p_t1t->mem_tlv[p_t1t->num_mem_tlvs].offset  += tlv_value[0] & 0x0F;
1170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            p_t1t->mem_tlv[p_t1t->num_mem_tlvs].num_bytes = tlv_value[1];
1171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            p_t1t->num_mem_tlvs++;
1172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            rw_t1t_update_attributes ();
1173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            tlv_detect_state = RW_T1T_SUBSTATE_WAIT_TLV_DETECT;
1174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        }
1175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
1176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
1178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (bytes_count == 0)
1180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
1181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        tlv_detect_state = RW_T1T_SUBSTATE_WAIT_TLV_DETECT;
1182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
1183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
1185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            case TAG_PROPRIETARY_TLV:
1187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                bytes_count--;
1188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_t1t->tlv_detect == TAG_PROPRIETARY_TLV)
1189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    found = TRUE;
1190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                else
1191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (bytes_count == 0)
1193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
1194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        tlv_detect_state = RW_T1T_SUBSTATE_WAIT_TLV_DETECT;
1195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
1196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
1198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            offset++;
1200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
1201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t1t->work_offset += bytes_read;
1205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    /* NDEF/Lock/Mem TLV to be found in segment 0, if not assume detection failed */
1207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!found && !failed)
1208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  ((p_t1t->tlv_detect == TAG_LOCK_CTRL_TLV) && (p_t1t->num_lockbytes > 0))
1210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ||((p_t1t->tlv_detect == TAG_MEM_CTRL_TLV) && (p_t1t->num_mem_tlvs > 0))  )
1211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            found = TRUE;
1213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (p_t1t->tlv_detect == TAG_NDEF_TLV)
1217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->tag_attribute = RW_T1_TAG_ATTRB_INITIALIZED;
1219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            failed = TRUE;
1221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    status = failed ? NFC_STATUS_FAILED : NFC_STATUS_OK;
1226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
1227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_handle_ndef_rall_rsp
1232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Handle response to RALL command sent while reading an
1234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NDEF message
1235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_CONTINUE, if NDEF read operation is not complete
1237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_OK, if NDEF read is successfull
1238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED,if NDEF read failed
1239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_ndef_rall_rsp (void)
1242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t  = &rw_cb.tcb.t1t;
1244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS status  = NFC_STATUS_CONTINUE;
1245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       count;
1246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       adds;
1247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    count               = (UINT8) p_t1t->ndef_msg_offset;
1249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t1t->work_offset  = 0;
1250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t1t->segment      = 0;
1251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while (count < T1T_STATIC_SIZE && p_t1t->work_offset < p_t1t->ndef_msg_len)
1253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (rw_t1t_is_lock_reserved_otp_byte (count) == FALSE)
1255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->p_ndef_buffer[p_t1t->work_offset] = p_t1t->mem[count];
1257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->work_offset++;
1258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        count++;
1260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_t1t->work_offset != p_t1t->ndef_msg_len)
1262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if ((p_t1t->hr[0] & 0x0F) != 1)
1264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (p_t1t->work_offset == 0)
1266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                return NFC_STATUS_FAILED;
1267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
1269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->block_read   = T1T_STATIC_BLOCKS + 1;
1271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->segment++;
1272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (p_t1t->ndef_msg_len - p_t1t->work_offset <= 8)
1274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if ((status = rw_t1t_send_dyn_cmd (T1T_CMD_READ8, p_t1t->block_read, NULL)) == NFC_STATUS_OK)
1276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_t1t->tlv_detect  = TAG_NDEF_TLV;
1278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_t1t->state    = RW_T1T_STATE_READ_NDEF;
1279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    status          = NFC_STATUS_CONTINUE;
1280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
1283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* send RSEG command */
1285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                RW_T1T_BLD_ADDS ((adds), (p_t1t->segment));
1286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if ((status = rw_t1t_send_dyn_cmd (T1T_CMD_RSEG, adds, NULL)) == NFC_STATUS_OK)
1287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_t1t->state    = RW_T1T_STATE_READ_NDEF;
1289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    status          = NFC_STATUS_CONTINUE;
1290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            RW_TRACE_ERROR1 ("RW_T1tReadNDef - Invalid NDEF len: %u or NDEF corrupted", p_t1t->ndef_msg_len);
1296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            status = NFC_STATUS_FAILED;
1297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = NFC_STATUS_OK;
1302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
1304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_handle_ndef_read_rsp
1309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Handle response to commands sent while reading an
1311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NDEF message
1312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_CONTINUE, if tlv read is not yet complete
1314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_OK, if tlv read is complete & success
1315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED,if tlv read failed
1316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_ndef_read_rsp (UINT8 *p_data)
1319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS         ndef_status = NFC_STATUS_CONTINUE;
1321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB          *p_t1t      = &rw_cb.tcb.t1t;
1322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8               index;
1323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8               adds;
1324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tT1T_CMD_RSP_INFO   *p_cmd_rsp_info = (tT1T_CMD_RSP_INFO *) rw_cb.tcb.t1t.p_cmd_rsp_info;
1325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* The Response received could be for Read8 or Read Segment command */
1327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch(p_cmd_rsp_info->opcode)
1328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case T1T_CMD_READ8:
1330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t1t->work_offset == 0)
1331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            index = p_t1t->ndef_msg_offset % T1T_BLOCK_SIZE;
1333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            index = 0;
1337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->segment = (p_t1t->block_read * T1T_BLOCK_SIZE)/T1T_SEGMENT_SIZE;
1339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        while (index < T1T_BLOCK_SIZE && p_t1t->work_offset < p_t1t->ndef_msg_len)
1340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (rw_t1t_is_lock_reserved_otp_byte ((UINT16) ((p_t1t->block_read * T1T_BLOCK_SIZE) + index)) == FALSE)
1342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
13435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                p_t1t->p_ndef_buffer[p_t1t->work_offset] = p_data[index];
1344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->work_offset++;
1345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            index++;
1347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case T1T_CMD_RSEG:
1351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t1t->work_offset == 0)
1352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            index = p_t1t->ndef_msg_offset % T1T_SEGMENT_SIZE;
1354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            index = 0;
1358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->block_read = ((p_t1t->segment + 1) * T1T_BLOCKS_PER_SEGMENT) - 1;
1360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        while (index < T1T_SEGMENT_SIZE && p_t1t->work_offset < p_t1t->ndef_msg_len)
1362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (rw_t1t_is_lock_reserved_otp_byte ((UINT16) (index)) == FALSE)
1364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
13655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                p_t1t->p_ndef_buffer[p_t1t->work_offset] = p_data[index];
1366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->work_offset++;
1367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            index++;
1369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
1373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_t1t->work_offset < p_t1t->ndef_msg_len)
1376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if ((p_t1t->hr[0] & 0x0F) != 1)
1378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if ((p_t1t->ndef_msg_len - p_t1t->work_offset) <= T1T_BLOCK_SIZE)
1380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->block_read++;
1382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if ((ndef_status = rw_t1t_send_dyn_cmd (T1T_CMD_READ8, (UINT8) (p_t1t->block_read), NULL)) == NFC_STATUS_OK)
1383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ndef_status  = NFC_STATUS_CONTINUE;
1385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
1388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->segment++;
1390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* send RSEG command */
1391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                RW_T1T_BLD_ADDS ((adds), (p_t1t->segment));
1392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if ((ndef_status = rw_t1t_send_dyn_cmd (T1T_CMD_RSEG, adds, NULL)) == NFC_STATUS_OK)
1393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    ndef_status  = NFC_STATUS_CONTINUE;
1395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ndef_status = NFC_STATUS_OK;
1402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return ndef_status;
1404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_next_ndef_write_block
1409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function prepare and writes ndef blocks
1411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_CONTINUE, if tlv write is not yet complete
1413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_OK, if tlv write is complete & success
1414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED,if tlv write failed
1415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_next_ndef_write_block (void)
1418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BOOLEAN     b_block_write_cmd   = FALSE;
1420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t              = &rw_cb.tcb.t1t;
1421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS ndef_status         = NFC_STATUS_CONTINUE;
1422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       write_block[8];
1423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       block;
1424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       index;
1425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       new_lengthfield_len;
1426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       length_field[3];
1427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      initial_offset;
1428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       count;
1429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Write NDEF Message */
1430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    new_lengthfield_len = p_t1t->new_ndef_msg_len > 254 ? 3:1;
1431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Identify the command to use for NDEF write operation */
1433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((p_t1t->hr[0] & 0x0F) != 1)
1434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Dynamic memory structure */
1436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        b_block_write_cmd = FALSE;
1437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        block           = p_t1t->ndef_block_written + 1;
1438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->segment  = (block * T1T_BLOCK_SIZE) /T1T_SEGMENT_SIZE;
1439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        count = 0;
1441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        while (block <= p_t1t->mem[T1T_CC_TMS_BYTE])
1442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            index = 0;
1444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (block == p_t1t->num_ndef_finalblock)
1445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* T1T_CMD_WRITE_E8 Command */
1447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                b_block_write_cmd = TRUE;
1448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
1449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            while (index < T1T_BLOCK_SIZE && p_t1t->work_offset < (p_t1t->new_ndef_msg_len + new_lengthfield_len))
1451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (rw_t1t_is_lock_reserved_otp_byte ((UINT16) ((block * T1T_BLOCK_SIZE) + index)) == FALSE)
1453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    count++;
1455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                index++;
1457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (count == T1T_BLOCK_SIZE)
1459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* T1T_CMD_WRITE_E8 Command */
1461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                b_block_write_cmd = TRUE;
1462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
1463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else if (count == 0)
1465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                index = 0;
1467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                block++;
1468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_t1t->segment != (block * T1T_BLOCK_SIZE) /T1T_SEGMENT_SIZE)
1469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_t1t->segment = (block * T1T_BLOCK_SIZE) /T1T_SEGMENT_SIZE;
1471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
1474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* T1T_CMD_WRITE_E Command */
1476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                b_block_write_cmd = FALSE;
1477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
1478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Static memory structure */
1484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        block       = p_t1t->ndef_block_written;
1485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        b_block_write_cmd = FALSE;
1486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    new_lengthfield_len = p_t1t->new_ndef_msg_len > 254 ? 3:1;
1489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (new_lengthfield_len == 3)
1490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        length_field[0] = T1T_LONG_NDEF_LEN_FIELD_BYTE0;
1492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        length_field[1] = (UINT8) (p_t1t->new_ndef_msg_len >> 8);
1493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        length_field[2] = (UINT8) (p_t1t->new_ndef_msg_len);
1494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        length_field[0] = (UINT8) (p_t1t->new_ndef_msg_len);
1498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (b_block_write_cmd)
1501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Dynamic memory structure */
1503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        index           = 0;
1504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->segment  = (block * T1T_BLOCK_SIZE) /T1T_SEGMENT_SIZE;
1505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        initial_offset  = p_t1t->work_offset;
1507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        block = rw_t1t_prepare_ndef_bytes (write_block, length_field,  &index, FALSE, block, new_lengthfield_len);
1508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t1t->work_offset == initial_offset)
1509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ndef_status = NFC_STATUS_FAILED;
1511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Send WRITE_E8 command */
1515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ndef_status = rw_t1t_send_ndef_block (write_block, block);
1516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Static memory structure */
1521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t1t->write_byte + 1 >= T1T_BLOCK_SIZE)
1522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            index = 0;
1524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            block++;
1525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            index       = p_t1t->write_byte + 1;
1529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        initial_offset  = p_t1t->work_offset;
1531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        block = rw_t1t_prepare_ndef_bytes (write_block, length_field, &index, TRUE, block, new_lengthfield_len);
1532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t1t->work_offset == initial_offset)
1533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ndef_status = NFC_STATUS_FAILED;
1535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* send WRITE-E command */
1539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ndef_status = rw_t1t_send_ndef_byte (write_block[index], block, index, new_lengthfield_len);
1540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return ndef_status;
1543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_ndef_write_first_block
1549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function writes ndef first block
1551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_CONTINUE, if tlv write is not yet complete
1553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_OK, if tlv write is complete & success
1554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED,if tlv write failed
1555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_ndef_write_first_block (void)
1558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS ndef_status = NFC_STATUS_CONTINUE;
1560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t      = &rw_cb.tcb.t1t;
1561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       block;
1562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       index;
1563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       new_lengthfield_len;
1564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       length_field[3];
1565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       write_block[8];
1566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* handle positive response to invalidating existing NDEF Message */
1568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t1t->work_offset = 0;
1569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    new_lengthfield_len = p_t1t->new_ndef_msg_len > 254 ? 3:1;
1570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (new_lengthfield_len == 3)
1571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        length_field[0] = T1T_LONG_NDEF_LEN_FIELD_BYTE0;
1573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        length_field[1] = (UINT8) (p_t1t->new_ndef_msg_len >> 8);
1574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        length_field[2] = (UINT8) (p_t1t->new_ndef_msg_len);
1575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        length_field[0] = (UINT8) (p_t1t->new_ndef_msg_len);
1579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* updating ndef_first_block with new ndef message */
1581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    memcpy(write_block,p_t1t->ndef_first_block,T1T_BLOCK_SIZE);
1582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    index = p_t1t->ndef_header_offset % T1T_BLOCK_SIZE;
1583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    block = (UINT8) (p_t1t->ndef_header_offset / T1T_BLOCK_SIZE);
1584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t1t->segment      = (UINT8) (p_t1t->ndef_header_offset/T1T_SEGMENT_SIZE);
1585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((p_t1t->hr[0] & 0x0F) != 1)
1587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Dynamic Memory structure */
1589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        block = rw_t1t_prepare_ndef_bytes (write_block, length_field, &index, FALSE, block, new_lengthfield_len);
1590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t1t->work_offset == 0)
1592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ndef_status = NFC_STATUS_FAILED;
1594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Send WRITE-E8 command based on the prepared write_block */
1598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ndef_status = rw_t1t_send_ndef_block (write_block, block);
1599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Static Memory structure */
1604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        block = rw_t1t_prepare_ndef_bytes (write_block, length_field, &index, TRUE, block, new_lengthfield_len);
1605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t1t->work_offset == 0)
1606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ndef_status = NFC_STATUS_FAILED;
1608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* send WRITE-E command */
1612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ndef_status = rw_t1t_send_ndef_byte (write_block[index], block, index, new_lengthfield_len);
1613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return ndef_status;
1617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_send_ndef_byte
1622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Sends ndef message or length field byte and update
1624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  status
1625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_CONTINUE, if tlv write is not yet complete
1627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_OK, if tlv write is complete & success
1628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED,if tlv write failed
1629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_send_ndef_byte (UINT8 data, UINT8 block, UINT8 index, UINT8 msg_len)
1632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS ndef_status = NFC_STATUS_CONTINUE;
1634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t      = &rw_cb.tcb.t1t;
1635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       addr;
1636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* send WRITE-E command */
1638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    RW_T1T_BLD_ADD ((addr), (block), (index));
1639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (NFC_STATUS_OK == rw_t1t_send_static_cmd (T1T_CMD_WRITE_E, addr, data))
1640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->write_byte           = index;
1642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->ndef_block_written   = block;
1643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t1t->work_offset == p_t1t->new_ndef_msg_len + msg_len)
1644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ndef_status =  NFC_STATUS_OK;
1646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ndef_status = NFC_STATUS_CONTINUE;
1650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ndef_status = NFC_STATUS_FAILED;
1655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return ndef_status;
1657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_prepare_ndef_bytes
1662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      prepares ndef block to write
1664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          block number where to write
1666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 rw_t1t_prepare_ndef_bytes (UINT8 *p_data, UINT8 *p_length_field, UINT8 *p_index, BOOLEAN b_one_byte, UINT8 block, UINT8 lengthfield_len)
1669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t          = &rw_cb.tcb.t1t;
1671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       first_block     = (UINT8) (p_t1t->ndef_header_offset / T1T_BLOCK_SIZE);
1672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      initial_offset  = p_t1t->work_offset;
1673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while (p_t1t->work_offset == initial_offset && block <= p_t1t->mem[T1T_CC_TMS_BYTE])
1675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (block == p_t1t->num_ndef_finalblock)
1677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(block != first_block)  )
1678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            memcpy (p_data,p_t1t->ndef_final_block,T1T_BLOCK_SIZE);
1680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Update length field */
1682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        while (  (*p_index < T1T_BLOCK_SIZE)
1683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project               &&(p_t1t->work_offset < lengthfield_len)  )
1684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (rw_t1t_is_lock_reserved_otp_byte ((UINT16) ((block * T1T_BLOCK_SIZE) + *p_index)) == FALSE)
1686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_data[*p_index] = p_length_field[p_t1t->work_offset];
1688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->work_offset++;
1689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (b_one_byte)
1690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    return block;
1691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            (*p_index)++;
1693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (p_t1t->work_offset == lengthfield_len)
1694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
1696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Update ndef message field */
1699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        while (*p_index < T1T_BLOCK_SIZE && p_t1t->work_offset < (p_t1t->new_ndef_msg_len + lengthfield_len))
1700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (rw_t1t_is_lock_reserved_otp_byte ((UINT16) ((block * T1T_BLOCK_SIZE) + *p_index)) == FALSE)
1702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_data[*p_index] = p_t1t->p_ndef_buffer[p_t1t->work_offset - lengthfield_len];
1704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->work_offset++;
1705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (b_one_byte)
1706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    return block;
1707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            (*p_index)++;
1709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t1t->work_offset == initial_offset)
1711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            *p_index = 0;
1713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            block++;
1714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (p_t1t->segment != (block * T1T_BLOCK_SIZE) /T1T_SEGMENT_SIZE)
1715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->segment = (block * T1T_BLOCK_SIZE) /T1T_SEGMENT_SIZE;
1717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return block;
1721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_send_ndef_block
1726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Sends ndef block and update status
1728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_CONTINUE, if tlv write is not yet complete
1730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_OK, if tlv write is complete & success
1731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED,if tlv write failed
1732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_send_ndef_block (UINT8 *p_data, UINT8 block)
1735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t      = &rw_cb.tcb.t1t;
1737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS ndef_status = NFC_STATUS_CONTINUE;
1738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (NFC_STATUS_OK == rw_t1t_send_dyn_cmd (T1T_CMD_WRITE_E8, block, p_data))
1740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->ndef_block_written = block;
1742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_t1t->ndef_block_written == p_t1t->num_ndef_finalblock)
1743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ndef_status  =  NFC_STATUS_OK;
1745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             ndef_status =  NFC_STATUS_CONTINUE;
1749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ndef_status = NFC_STATUS_FAILED;
1754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return ndef_status;
1756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_get_ndef_flags
1761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Prepare NDEF Flags
1763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NDEF Flag value
1765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 rw_t1t_get_ndef_flags (void)
1768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       flags   = 0;
1770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t  = &rw_cb.tcb.t1t;
1771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((p_t1t->hr[0] & 0xF0) == T1T_NDEF_SUPPORTED)
1773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        flags |= RW_NDEF_FL_SUPPORTED;
1774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (t1t_tag_init_data (p_t1t->hr[0]) != NULL)
1776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        flags |= RW_NDEF_FL_FORMATABLE;
1777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((p_t1t->mem[T1T_CC_RWA_BYTE] & 0x0F) == T1T_CC_RWA_RO)
1779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        flags |=RW_NDEF_FL_READ_ONLY;
1780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return flags;
1782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_get_ndef_max_size
1787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Calculate maximum size of NDEF message that can be written
1789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  on to the tag
1790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          Maximum size of NDEF Message
1792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT16 rw_t1t_get_ndef_max_size (void)
1795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16              offset;
1797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB          *p_t1t   = &rw_cb.tcb.t1t;
1798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16              tag_size = (p_t1t->mem[T1T_CC_TMS_BYTE] +1)* T1T_BLOCK_SIZE;
1799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const tT1T_INIT_TAG *p_ret;
1800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8               init_segment = p_t1t->segment;
1801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t1t->max_ndef_msg_len = 0;
1803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    offset                  = p_t1t->ndef_msg_offset;
1804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t1t->segment          = (UINT8) (p_t1t->ndef_msg_offset/T1T_SEGMENT_SIZE);
1805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (tag_size < T1T_STATIC_SIZE)
1807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ||(tag_size > (T1T_SEGMENT_SIZE * T1T_MAX_SEGMENTS))
1808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ||((p_t1t->mem[T1T_CC_NMN_BYTE] != T1T_CC_NMN) && (p_t1t->mem[T1T_CC_NMN_BYTE] != 0))  )
1809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Tag not formated, determine maximum NDEF size from HR */
1811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if  (  ((p_t1t->hr[0] & 0xF0) == T1T_NDEF_SUPPORTED)
1812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             &&((p_ret = t1t_tag_init_data (p_t1t->hr[0])) != NULL)  )
1813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->max_ndef_msg_len = ((p_ret->tms +1)* T1T_BLOCK_SIZE) - T1T_OTP_LOCK_RES_BYTES - T1T_UID_LEN - T1T_ADD_LEN - T1T_CC_LEN - T1T_TLV_TYPE_LEN - T1T_SHORT_NDEF_LEN_FIELD_LEN;
1815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (p_ret->b_dynamic)
1816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->max_ndef_msg_len -= (T1T_TLV_TYPE_LEN + T1T_DEFAULT_TLV_LEN_FIELD_LEN + T1T_DEFAULT_TLV_LEN + T1T_TLV_TYPE_LEN + T1T_DEFAULT_TLV_LEN_FIELD_LEN + T1T_DEFAULT_TLV_LEN);
1818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->max_ndef_msg_len -= T1T_DYNAMIC_LOCK_BYTES;
1819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            offset = tag_size;
1821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->segment = init_segment;
1825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return p_t1t->max_ndef_msg_len;
1826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Starting from NDEF Message offset find the first locked data byte */
1830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while (offset < tag_size)
1831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (rw_t1t_is_lock_reserved_otp_byte ((UINT16) (offset)) == FALSE)
1833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (rw_t1t_is_read_only_byte ((UINT16) offset) == TRUE)
1835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
1836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->max_ndef_msg_len++;
1837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        offset++;
1839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (offset % T1T_SEGMENT_SIZE == 0)
1840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->segment = (UINT8) (offset / T1T_SEGMENT_SIZE);
1842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* NDEF Length field length changes based on NDEF size */
1845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (p_t1t->max_ndef_msg_len >= T1T_LONG_NDEF_LEN_FIELD_BYTE0)
1846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&((p_t1t->ndef_msg_offset - p_t1t->ndef_header_offset) == T1T_SHORT_NDEF_LEN_FIELD_LEN)  )
1847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->max_ndef_msg_len -=  (p_t1t->max_ndef_msg_len == T1T_LONG_NDEF_LEN_FIELD_BYTE0)? 1 : (T1T_LONG_NDEF_LEN_FIELD_LEN - T1T_SHORT_NDEF_LEN_FIELD_LEN);
1849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t1t->segment = init_segment;
1852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return p_t1t->max_ndef_msg_len;
1853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_handle_ndef_write_rsp
1858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Handle response to commands sent while writing an
1860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NDEF message
1861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_CONTINUE, if tlv write is not yet complete
1863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_OK, if tlv write is complete & success
1864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED,if tlv write failed
1865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_ndef_write_rsp (UINT8 *p_data)
1868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t      = &rw_cb.tcb.t1t;
1870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS ndef_status = NFC_STATUS_CONTINUE;
1871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       addr;
1872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (p_t1t->substate)
1874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_SUBSTATE_WAIT_READ_NDEF_BLOCK:
1876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Backup ndef_final_block */
18775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        memcpy (p_t1t->ndef_final_block, p_data, T1T_BLOCK_SIZE);
1878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Invalidate existing NDEF Message */
1879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_T1T_BLD_ADD ((addr), (T1T_CC_BLOCK), (T1T_CC_NMN_OFFSET));
1880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (NFC_STATUS_OK == rw_t1t_send_static_cmd (T1T_CMD_WRITE_E, addr, 0))
1881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ndef_status     = NFC_STATUS_CONTINUE;
1883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->state    = RW_T1T_STATE_WRITE_NDEF;
1884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->substate = RW_T1T_SUBSTATE_WAIT_INVALIDATE_NDEF;
1885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ndef_status = NFC_STATUS_FAILED;
1889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_SUBSTATE_WAIT_INVALIDATE_NDEF:
1893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ndef_status = rw_t1t_ndef_write_first_block ();
1894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_SUBSTATE_WAIT_NDEF_WRITE:
1897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ndef_status = rw_t1t_next_ndef_write_block ();
1898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_SUBSTATE_WAIT_NDEF_UPDATED:
1901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Validate new NDEF Message */
1902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_T1T_BLD_ADD ((addr), (T1T_CC_BLOCK), (T1T_CC_NMN_OFFSET));
1903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (NFC_STATUS_OK == rw_t1t_send_static_cmd (T1T_CMD_WRITE_E, addr, T1T_CC_NMN))
1904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ndef_status     = NFC_STATUS_OK;
1906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ndef_status     = NFC_STATUS_FAILED;
1910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
1913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
1914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return ndef_status;
1917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_update_attributes
1922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function will prepare attributes for the current
1924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  segment. Every bit in the attribute refers to one byte of
1925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  tag content.The bit corresponding to a tag byte will be set
1926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  to '1' when the Tag byte is read only,otherwise will be set
1927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  to '0'
1928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
1930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t1t_update_attributes (void)
1933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       count       = 0;
1935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t      = &rw_cb.tcb.t1t;
1936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      lower_offset;
1937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      upper_offset;
1938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       num_bytes;
1939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      offset;
1940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       bits_per_byte  = 8;
1941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    count = 0;
1943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while (count < T1T_BLOCKS_PER_SEGMENT)
1944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->attr[count] = 0x00;
1946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        count++;
1947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    lower_offset  = p_t1t->segment * T1T_SEGMENT_SIZE;
1950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    upper_offset  = (p_t1t->segment + 1)* T1T_SEGMENT_SIZE;
1951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_t1t->segment == 0)
1953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* UID/Lock/Reserved/OTP bytes */
1955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->attr[0x00] = 0xFF; /* Uid bytes */
1956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->attr[0x0D] = 0xFF; /* Reserved bytes */
1957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->attr[0x0E] = 0xFF; /* lock/otp bytes */
1958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->attr[0x0F] = 0xFF; /* lock/otp bytes */
1959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* update attr based on lock control and mem control tlvs */
1962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    count = 0;
1963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while (count < p_t1t->num_lockbytes)
1964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        offset = p_t1t->lock_tlv[p_t1t->lockbyte[count].tlv_index].offset + p_t1t->lockbyte[count].byte_index;
1966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (offset >= lower_offset && offset < upper_offset)
1967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Set the corresponding bit in attr to indicate - lock byte */
1969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->attr[(offset % T1T_SEGMENT_SIZE) / bits_per_byte] |= rw_t1t_mask_bits[(offset % T1T_SEGMENT_SIZE) % bits_per_byte];
1970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        count++;
1972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    count = 0;
1974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while (count < p_t1t->num_mem_tlvs)
1975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        num_bytes = 0;
1977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        while (num_bytes < p_t1t->mem_tlv[count].num_bytes)
1978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            offset = p_t1t->mem_tlv[count].offset + num_bytes;
1980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (offset >= lower_offset && offset < upper_offset)
1981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* Set the corresponding bit in attr to indicate - reserved byte */
1983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->attr[(offset % T1T_SEGMENT_SIZE) / bits_per_byte] |= rw_t1t_mask_bits[(offset % T1T_SEGMENT_SIZE) % bits_per_byte];
1984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            num_bytes++;
1986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        count++;
1988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_get_lock_bits_for_segment
1994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function will identify the index of the dynamic lock
1996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  byte that covers the current segment
1997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters:      segment, segment number
1999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  p_start_byte, pointer to hold the first lock byte index
2000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  p_start_bit, pointer to hold the first lock bit index
2001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  p_end_byte, pointer to hold the last lock byte index
2002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          Total lock bits that covers the specified segment
2004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 rw_t1t_get_lock_bits_for_segment (UINT8 segment,UINT8 *p_start_byte, UINT8 *p_start_bit,UINT8 *p_end_byte)
2007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t              = &rw_cb.tcb.t1t;
2009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      byte_count          = T1T_SEGMENT_SIZE;
2010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       total_bits          = 0;
2011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       num_dynamic_locks   = 0;
2012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       bit_count           = 0;
2013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      tag_size            = (p_t1t->mem[T1T_CC_TMS_BYTE] +1) * T1T_BLOCK_SIZE;
2014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      lower_offset;
2015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      upper_offset;
2016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BOOLEAN     b_all_bits_are_locks = TRUE;
2017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       bytes_locked_per_bit;
2018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       num_bits;
2019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    upper_offset    = (segment + 1) * T1T_SEGMENT_SIZE;
2021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (upper_offset > tag_size)
2023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        upper_offset = tag_size;
2024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    lower_offset    = segment * T1T_SEGMENT_SIZE;
2026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    *p_start_byte   = num_dynamic_locks;
2027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    *p_start_bit    = 0;
2028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while (  (byte_count <= lower_offset)
2030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project           &&(num_dynamic_locks < p_t1t->num_lockbytes)  )
2031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        bytes_locked_per_bit = p_t1t->lock_tlv[p_t1t->lockbyte[num_dynamic_locks].tlv_index].bytes_locked_per_bit;
2033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Number of bits in the current lock byte */
2034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        b_all_bits_are_locks = ((p_t1t->lockbyte[num_dynamic_locks].byte_index + 1) * TAG_BITS_PER_BYTE <= p_t1t->lock_tlv[p_t1t->lockbyte[num_dynamic_locks].tlv_index].num_bits);
2035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        num_bits = b_all_bits_are_locks ? TAG_BITS_PER_BYTE : p_t1t->lock_tlv[p_t1t->lockbyte[num_dynamic_locks].tlv_index].num_bits % TAG_BITS_PER_BYTE;
2036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Skip lock bits that covers all previous segments */
2038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (bytes_locked_per_bit * num_bits + byte_count <= lower_offset)
2039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            byte_count += bytes_locked_per_bit * num_bits;
2041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            num_dynamic_locks++;
2042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
2044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* The first lock bit that covers this segment is present in this segment */
2046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            bit_count = 0;
2047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            while (bit_count < num_bits)
2048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
2049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                byte_count += bytes_locked_per_bit;
2050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (byte_count > lower_offset)
2051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
2052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    *p_start_byte = num_dynamic_locks;
2053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    *p_end_byte = num_dynamic_locks;
2054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    *p_start_bit  = bit_count;
2055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    bit_count++;
2056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    total_bits = 1;
2057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    break;
2058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
2059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                bit_count++;
2060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
2061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (num_dynamic_locks == p_t1t->num_lockbytes)
2064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return 0;
2066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while (  (byte_count < upper_offset)
2068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project           &&(num_dynamic_locks < p_t1t->num_lockbytes)  )
2069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        bytes_locked_per_bit = p_t1t->lock_tlv[p_t1t->lockbyte[num_dynamic_locks].tlv_index].bytes_locked_per_bit;
2071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Number of bits in the current lock byte */
2073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        b_all_bits_are_locks = ((p_t1t->lockbyte[num_dynamic_locks].byte_index + 1) * TAG_BITS_PER_BYTE <= p_t1t->lock_tlv[p_t1t->lockbyte[num_dynamic_locks].tlv_index].num_bits);
2074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        num_bits             =  b_all_bits_are_locks ? TAG_BITS_PER_BYTE : p_t1t->lock_tlv[p_t1t->lockbyte[num_dynamic_locks].tlv_index].num_bits % TAG_BITS_PER_BYTE;
2075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Collect all lock bits that covers the current segment */
2077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if ((bytes_locked_per_bit * (num_bits - bit_count)) + byte_count < upper_offset)
2078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            byte_count       += bytes_locked_per_bit * (num_bits - bit_count);
2080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            total_bits       += num_bits - bit_count;
2081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            bit_count         = 0;
2082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            *p_end_byte       = num_dynamic_locks;
2083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            num_dynamic_locks++;
2084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
2086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* The last lock byte that covers the current segment */
2088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            bit_count = 0;
2089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            while (bit_count < num_bits)
2090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
2091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                byte_count += bytes_locked_per_bit;
2092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (byte_count >= upper_offset)
2093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
2094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    *p_end_byte = num_dynamic_locks;
2095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    total_bits += (bit_count + 1);
2096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    break;
2097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
2098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                bit_count++;
2099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
2100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return total_bits;
2103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_update_lock_attributes
2108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function will check if the tag index passed as
2110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  argument is a locked byte and return
2111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  TRUE or FALSE
2112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters:      index, the index of the byte in the tag
2114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE, if the specified index in the tag is a locked or
2117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        reserved or otp byte
2118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  FALSE, otherwise
2119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t1t_update_lock_attributes (void)
2122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       xx = 0;
2124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       bytes_locked_per_lock_bit;
2125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       num_static_lock_bytes       = 0;
2126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       num_dynamic_lock_bytes      = 0;
2127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       bits_covered                = 0;
2128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       bytes_covered               = 0;
2129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       block_count                 = 0;
2130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t = &rw_cb.tcb.t1t;
2131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       start_lock_byte;
2132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       start_lock_bit;
2133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       end_lock_byte;
2134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       num_lock_bits;
2135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       total_bits;
2136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    block_count = 0;
2139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while (block_count < T1T_BLOCKS_PER_SEGMENT)
2140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->lock_attr[block_count] = 0x00;
2142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        block_count++;
2143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* update lock_attr based on static lock bytes */
2146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_t1t->segment == 0)
2147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        xx                      = 0;
2149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        num_static_lock_bytes   = 0;
2150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        block_count             = 0;
2151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        num_lock_bits           = 8;
2152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        while (num_static_lock_bytes < T1T_NUM_STATIC_LOCK_BYTES)
2154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Update lock attribute based on 2 static locks */
2156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            while (xx < num_lock_bits)
2157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
2158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->lock_attr[block_count] = 0x00;
2159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_t1t->mem[T1T_LOCK_0_OFFSET + num_static_lock_bytes] & rw_t1t_mask_bits[xx++])
2161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
2162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* If the bit is set then 1 block is locked */
2163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_t1t->lock_attr[block_count] = 0xFF;
2164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
2165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                block_count++;
2167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
2168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            num_static_lock_bytes++;
2169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            xx = 0;
2170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Locked bytes */
2172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->lock_attr[0x00] = 0xFF;
2173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->lock_attr[0x0D] = 0xFF;
2174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
2176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* update lock_attr based on segment and using dynamic lock bytes */
2178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if ((total_bits = rw_t1t_get_lock_bits_for_segment (p_t1t->segment,&start_lock_byte, &start_lock_bit,&end_lock_byte)) != 0)
2179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            xx                       = start_lock_bit;
2181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            num_dynamic_lock_bytes   = start_lock_byte;
2182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            bits_covered             = 0;
2183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            bytes_covered            = 0;
2184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            block_count              = 0;
2185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            num_lock_bits            = 8;
2186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->lock_attr[block_count] = 0;
2188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            while (num_dynamic_lock_bytes <= end_lock_byte)
2190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
2191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                bytes_locked_per_lock_bit   = p_t1t->lock_tlv[p_t1t->lockbyte[num_dynamic_lock_bytes].tlv_index].bytes_locked_per_bit;
2192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (num_dynamic_lock_bytes == end_lock_byte)
2193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
2194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    num_lock_bits = (total_bits % 8 == 0)? 8:total_bits % 8;
2195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
2196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                while (xx < num_lock_bits)
2197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
2198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    bytes_covered = 0;
2199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    while (bytes_covered < bytes_locked_per_lock_bit)
2200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
2201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        /* Set/clear lock_attr byte bits based on whether a particular lock bit is set or not
2202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                         * each bit in lock_attr represents one byte in Tag read only attribute */
2203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        if (p_t1t->lockbyte[num_dynamic_lock_bytes].lock_byte & rw_t1t_mask_bits[xx])
2204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        {
2205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            p_t1t->lock_attr[block_count] |= 0x01 << bits_covered;
2206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        }
2207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        bytes_covered++;
2208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        bits_covered++;
2209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        if (bits_covered == 8)
2210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        {
2211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            bits_covered = 0;
2212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            block_count++;
2213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            if (block_count < T1T_BLOCKS_PER_SEGMENT)
2214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                p_t1t->lock_attr[block_count] = 0;
2215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        }
2216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
2217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    xx++;
2218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
2219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                num_dynamic_lock_bytes++;
2220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                xx = 0;
2221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
2222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_is_lock_reserved_otp_byte
2229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function will check if the tag index passed as
2231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  argument is a lock or reserved or otp byte
2232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters:      index, the index of the byte in the tag's current segment
2234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE, if the specified index in the tag is a locked or
2237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        reserved or otp byte
2238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  FALSE, otherwise
2239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t1t_is_lock_reserved_otp_byte (UINT16 index)
2242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t = &rw_cb.tcb.t1t;
2244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_t1t->attr_seg != p_t1t->segment)
2246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Update p_t1t->attr to reflect the current segment */
2248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_t1t_update_attributes ();
2249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->attr_seg = p_t1t->segment;
2250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    index = index % T1T_SEGMENT_SIZE;
2252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Every bit in p_t1t->attr indicates one specific byte of the tag is either a lock/reserved/otp byte or not
2254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project     * So, each array element in p_t1t->attr covers one block in the tag as T1 block size and array element size is 8
2255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project     * Find the block and offset for the index (passed as argument) and Check if the offset bit in the
2256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project     * p_t1t->attr[block] is set or not. If the bit is set then it is a lock/reserved/otp byte, otherwise not */
2257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return ((p_t1t->attr[index /8] & rw_t1t_mask_bits[index % 8]) == 0) ? FALSE:TRUE;
2259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_is_read_only_byte
2264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function will check if the tag index passed as
2266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  argument is a read only byte
2267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters:      index, the index of the byte in the tag's current segment
2269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE, if the specified index in the tag is a locked or
2272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        reserved or otp byte
2273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  FALSE, otherwise
2274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t1t_is_read_only_byte (UINT16 index)
2277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t = &rw_cb.tcb.t1t;
2279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_t1t->lock_attr_seg != p_t1t->segment)
2281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Update p_t1t->lock_attr to reflect the current segment */
2283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_t1t_update_lock_attributes ();
2284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->lock_attr_seg = p_t1t->segment;
2285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    index = index % T1T_SEGMENT_SIZE;
2288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Every bit in p_t1t->lock_attr indicates one specific byte of the tag is a read only byte or read write byte
2289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project     * So, each array element in p_t1t->lock_attr covers one block in the tag as T1 block size and array element size is 8
2290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project     * Find the block and offset for the index (passed as argument) and Check if the offset bit in the
2291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project     * p_t1t->lock_attr[block] is set or not. If the bit is set then it is a read only byte, otherwise read write byte */
2292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return ((p_t1t->lock_attr[index /8] & rw_t1t_mask_bits[index % 8]) == 0) ? FALSE:TRUE;
2294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
2297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tFormatNDef
2299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description
2301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      Format Tag content
2302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns
2304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      NFC_STATUS_OK, Command sent to format Tag
2305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      NFC_STATUS_REJECTED: Invalid HR0 and cannot format the tag
2306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      NFC_STATUS_FAILED: other error
2307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
2309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T1tFormatNDef (void)
2310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB          *p_t1t  = &rw_cb.tcb.t1t;
2312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS         status  = NFC_STATUS_FAILED;
2313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const tT1T_INIT_TAG *p_ret;
2314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8               addr;
2315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8               *p;
2316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_t1t->state != RW_T1T_STATE_IDLE)
2318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_WARNING1 ("RW_T1tFormatNDef - Tag not initialized/ Busy! State: %u", p_t1t->state);
2320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NFC_STATUS_FAILED);
2321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((p_t1t->hr[0] & 0xF0) != T1T_NDEF_SUPPORTED)
2324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_WARNING1 ("RW_T1tFormatNDef - Cannot format tag as NDEF not supported. HR0: %u", p_t1t->hr[0]);
2326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NFC_STATUS_REJECTED);
2327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((p_ret = t1t_tag_init_data (p_t1t->hr[0])) == NULL)
2330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_WARNING2 ("RW_T1tFormatNDef - Invalid HR - HR0: %u, HR1: %u", p_t1t->hr[0], p_t1t->hr[1]);
2332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NFC_STATUS_REJECTED);
2333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    memset (p_t1t->ndef_first_block, 0, T1T_BLOCK_SIZE);
2336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    memset (p_t1t->ndef_final_block, 0, T1T_BLOCK_SIZE);
2337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = p_t1t->ndef_first_block;
2338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Prepare Capability Container */
2340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T1T_CC_NMN);
2341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T1T_CC_VNO);
2342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, p_ret->tms);
2343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, T1T_CC_RWA_RW);
2344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_ret->b_dynamic)
2345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Prepare Lock and Memory TLV */
2347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, TAG_LOCK_CTRL_TLV);
2348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, T1T_DEFAULT_TLV_LEN);
2349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, p_ret->lock_tlv[0]);
2350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, p_ret->lock_tlv[1]);
2351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p = p_t1t->ndef_final_block;
2352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, p_ret->lock_tlv[2]);
2353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, TAG_MEM_CTRL_TLV);
2354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, T1T_DEFAULT_TLV_LEN);
2355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, p_ret->mem_tlv[0]);
2356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, p_ret->mem_tlv[1]);
2357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT8_TO_BE_STREAM (p, p_ret->mem_tlv[2]);
2358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Prepare NULL NDEF TLV */
2360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, TAG_NDEF_TLV);
2361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, 0);
2362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (rw_cb.tcb.t1t.hr[0] != T1T_STATIC_HR0 || rw_cb.tcb.t1t.hr[1] >= RW_T1T_HR1_MIN)
2364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* send WRITE-E8 command */
2366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if ((status = rw_t1t_send_dyn_cmd (T1T_CMD_WRITE_E8, 1, p_t1t->ndef_first_block)) == NFC_STATUS_OK)
2367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->state    = RW_T1T_STATE_FORMAT_TAG;
2369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->b_update = FALSE;
2370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->b_rseg   = FALSE;
2371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (p_ret->b_dynamic)
2372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->substate = RW_T1T_SUBSTATE_WAIT_SET_CC;
2373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
2374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_t1t->substate = RW_T1T_SUBSTATE_WAIT_SET_NULL_NDEF;
2375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
2378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* send WRITE-E command */
2380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_T1T_BLD_ADD ((addr), 1, 0);
2381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if ((status = rw_t1t_send_static_cmd (T1T_CMD_WRITE_E, addr, p_t1t->ndef_first_block[0])) == NFC_STATUS_OK)
2383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->work_offset  = 0;
2385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->state        = RW_T1T_STATE_FORMAT_TAG;
2386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->substate     = RW_T1T_SUBSTATE_WAIT_SET_NULL_NDEF;
2387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->b_update     = FALSE;
2388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->b_rseg       = FALSE;
2389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
2393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tLocateTlv
2398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function is called to find the start of the given TLV
2400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters:      tlv_type, Type of TLV to find
2402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NCI_STATUS_OK, if detection was started. Otherwise, error status.
2404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T1tLocateTlv (UINT8 tlv_type)
2407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS     status = NFC_STATUS_FAILED;
2409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB      *p_t1t= &rw_cb.tcb.t1t;
2410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           adds;
2411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_t1t->state != RW_T1T_STATE_IDLE)
2413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_WARNING1 ("RW_T1tLocateTlv - Busy - State: %u", p_t1t->state);
2415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NFC_STATUS_FAILED);
2416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t1t->tlv_detect = tlv_type;
2418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if(  (p_t1t->tlv_detect == TAG_NDEF_TLV)
2420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project       &&(((p_t1t->hr[0]) & 0xF0) != T1T_NDEF_SUPPORTED)  )
2421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR0 ("RW_T1tLocateTlv - Error: NDEF not supported by the tag");
2423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NFC_STATUS_REFUSED);
2424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (p_t1t->tlv_detect == TAG_MEM_CTRL_TLV)
2427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ||(p_t1t->tlv_detect == TAG_NDEF_TLV)  )
2428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->num_mem_tlvs = 0;
2430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (p_t1t->tlv_detect == TAG_LOCK_CTRL_TLV)
2433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ||(p_t1t->tlv_detect == TAG_NDEF_TLV)  )
2434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->num_lockbytes = 0;
2436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->num_lock_tlvs = 0;
2437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
24395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    /* Start reading memory, looking for the TLV */
24405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    p_t1t->segment = 0;
24415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if ((p_t1t->hr[0] & 0x0F) != 1)
2442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
24435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* send RSEG command */
24445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        RW_T1T_BLD_ADDS ((adds), (p_t1t->segment));
24455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        status = rw_t1t_send_dyn_cmd (T1T_CMD_RSEG, adds, NULL);
2446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
24475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    else
24485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
24495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        status = rw_t1t_send_static_cmd (T1T_CMD_RALL, 0, 0);
24505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
24515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (status == NFC_STATUS_OK)
2452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->tlv_detect   = tlv_type;
2454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->work_offset  = 0;
2455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->state        = RW_T1T_STATE_TLV_DETECT;
2456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->substate     = RW_T1T_SUBSTATE_NONE;
2457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
2460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
2463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tDetectNDef
2465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description
2467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      This function is used to perform NDEF detection on a Type 1 tag, and
2468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      retrieve the tag's NDEF attribute information (block 0).
2469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      Before using this API, the application must call RW_SelectTagType to
2471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      indicate that a Type 1 tag has been activated.
2472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns
2474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      NFC_STATUS_OK: ndef detection procedure started
2475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      NFC_STATUS_WRONG_PROTOCOL: type 1 tag not activated
2476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      NFC_STATUS_BUSY: another command is already in progress
2477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      NFC_STATUS_FAILED: other error
2478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
2480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T1tDetectNDef (void)
2481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return RW_T1tLocateTlv (TAG_NDEF_TLV);
2483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tReadNDef
2488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function can be called to read the NDEF message on the tag.
2490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters:      p_buffer:   The buffer into which to read the NDEF message
2492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  buf_len:    The length of the buffer
2493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NCI_STATUS_OK, if read was started. Otherwise, error status.
2495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T1tReadNDef (UINT8 *p_buffer, UINT16 buf_len)
2498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS     status = NFC_STATUS_FAILED;
2500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB      *p_t1t = &rw_cb.tcb.t1t;
2501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BOOLEAN         b_notify;
2502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8           adds;
2503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const tT1T_CMD_RSP_INFO *p_cmd_rsp_info_rall = t1t_cmd_to_rsp_info (T1T_CMD_RALL);
2504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    const tT1T_CMD_RSP_INFO *p_cmd_rsp_info_rseg = t1t_cmd_to_rsp_info (T1T_CMD_RSEG);
2505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_t1t->state != RW_T1T_STATE_IDLE)
2509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_WARNING1 ("RW_T1tReadNDef - Busy - State: %u", p_t1t->state);
2511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NFC_STATUS_FAILED);
2512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check HR0 if NDEF supported by the tag */
2515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (((p_t1t->hr[0]) & 0xF0) != T1T_NDEF_SUPPORTED)
2516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR0 ("RW_T1tReadNDef - Error: NDEF not supported by the tag");
2518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NFC_STATUS_REFUSED);
2519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_t1t->tag_attribute  == RW_T1_TAG_ATTRB_INITIALIZED_NDEF)
2522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_WARNING1 ("RW_T1tReadNDef - NDEF Message length is zero, NDEF Length : %u ", p_t1t->ndef_msg_len);
2524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NFC_STATUS_NOT_INITIALIZED);
2525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (p_t1t->tag_attribute != RW_T1_TAG_ATTRB_READ_WRITE)
2528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(p_t1t->tag_attribute != RW_T1_TAG_ATTRB_READ_ONLY)  )
2529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR0 ("RW_T1tReadNDef - Error: NDEF detection not performed yet/ Tag is in Initialized state");
2531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NFC_STATUS_FAILED);
2532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (buf_len < p_t1t->ndef_msg_len)
2535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_WARNING2 ("RW_T1tReadNDef - buffer size: %u  less than NDEF msg sise: %u", buf_len, p_t1t->ndef_msg_len);
2537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NFC_STATUS_FAILED);
2538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t1t->p_ndef_buffer = p_buffer;
2540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_t1t->b_rseg == TRUE)
2542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* If already got response to RSEG 0 */
2544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->state = RW_T1T_STATE_READ_NDEF;
2545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->p_cmd_rsp_info = (tT1T_CMD_RSP_INFO *)p_cmd_rsp_info_rseg;
2546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_t1t_handle_read_rsp (&b_notify,p_t1t->mem);
2548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status       = NFC_STATUS_OK;
2549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (p_t1t->b_update == TRUE)
2551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* If already got response to RALL */
2553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->state = RW_T1T_STATE_READ_NDEF;
2554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->p_cmd_rsp_info = (tT1T_CMD_RSP_INFO *) p_cmd_rsp_info_rall;
2555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        rw_t1t_handle_read_rsp (&b_notify,p_t1t->mem);
2557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status       = NFC_STATUS_OK;
2558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
2561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->segment      = 0;
2563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->work_offset  = 0;
2564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if ((p_t1t->hr[0] & 0x0F) != 1)
2565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* send RSEG command */
2567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            RW_T1T_BLD_ADDS ((adds), (p_t1t->segment));
2568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            status = rw_t1t_send_dyn_cmd (T1T_CMD_RSEG, adds, NULL);
2569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
2571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            status = rw_t1t_send_static_cmd (T1T_CMD_RALL, 0, 0);
2573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (status == NFC_STATUS_OK)
2575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->state = RW_T1T_STATE_READ_NDEF;
2576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
2580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tWriteNDef
2585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function can be called to write an NDEF message to the tag.
2587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters:      msg_len:    The length of the buffer
2589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  p_msg:      The NDEF message to write
2590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NCI_STATUS_OK, if write was started. Otherwise, error status.
2592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T1tWriteNDef (UINT16 msg_len, UINT8 *p_msg)
2595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS status          = NFC_STATUS_FAILED;
2597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t          = &rw_cb.tcb.t1t;
2598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      num_ndef_bytes;
2599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      offset;
2600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       addr;
2601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       init_lengthfield_len;
2602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       new_lengthfield_len;
2603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16      init_ndef_msg_offset;
2604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_t1t->state != RW_T1T_STATE_IDLE)
2606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_WARNING1 ("RW_T1tWriteNDef - Busy - State: %u", p_t1t->state);
2608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NFC_STATUS_FAILED);
2609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Check HR0 if NDEF supported by the tag */
2612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (((p_t1t->hr[0]) & 0xF0) != T1T_NDEF_SUPPORTED)
2613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR0 ("RW_T1tWriteNDef - Error: NDEF not supported by the tag");
2615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NFC_STATUS_REFUSED);
2616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (p_t1t->tag_attribute  != RW_T1_TAG_ATTRB_READ_WRITE)
2619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(p_t1t->tag_attribute  != RW_T1_TAG_ATTRB_INITIALIZED_NDEF)  )
2620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR0 ("RW_T1tWriteNDef - Tag cannot update NDEF");
2622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NFC_STATUS_REFUSED);
2623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (msg_len > p_t1t->max_ndef_msg_len)
2626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_ERROR1 ("RW_T1tWriteNDef - Cannot write NDEF of size greater than %u bytes", p_t1t->max_ndef_msg_len);
2628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NFC_STATUS_REFUSED);
2629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t1t->p_ndef_buffer        = p_msg;
2632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t1t->new_ndef_msg_len     = msg_len;
2633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    new_lengthfield_len         = p_t1t->new_ndef_msg_len > 254 ? 3:1;
2634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    init_lengthfield_len        = (UINT8) (p_t1t->ndef_msg_offset - p_t1t->ndef_header_offset);
2635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    init_ndef_msg_offset        = p_t1t->ndef_msg_offset;
2636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* ndef_msg_offset should reflect the new ndef message offset */
2638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (init_lengthfield_len > new_lengthfield_len)
2639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->ndef_msg_offset  =  init_ndef_msg_offset - (T1T_LONG_NDEF_LEN_FIELD_LEN - T1T_SHORT_NDEF_LEN_FIELD_LEN);
2641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (init_lengthfield_len < new_lengthfield_len)
2643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->ndef_msg_offset  =  init_ndef_msg_offset + (T1T_LONG_NDEF_LEN_FIELD_LEN - T1T_SHORT_NDEF_LEN_FIELD_LEN);
2645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    num_ndef_bytes              = 0;
2648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    offset                      = p_t1t->ndef_msg_offset;
2649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t1t->segment              = (UINT8) (p_t1t->ndef_msg_offset/T1T_SEGMENT_SIZE);
2650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Locate NDEF final block based on the size of new NDEF Message */
2652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while (num_ndef_bytes < p_t1t->new_ndef_msg_len)
2653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (rw_t1t_is_lock_reserved_otp_byte ((UINT16) offset) == FALSE)
2655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            num_ndef_bytes++;
2656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        offset++;
2658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (offset % T1T_SEGMENT_SIZE == 0)
2659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->segment      = (UINT8) (offset / T1T_SEGMENT_SIZE);
2661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t1t->b_update = FALSE;
2665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t1t->b_rseg   = FALSE;
2666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((p_t1t->hr[0] & 0x0F) != 1)
2668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Dynamic data structure */
26705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        p_t1t->block_read = (UINT8) ((offset - 1)/T1T_BLOCK_SIZE);
2671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Read NDEF final block before updating */
26725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if ((status = rw_t1t_send_dyn_cmd (T1T_CMD_READ8, p_t1t->block_read, NULL)) == NFC_STATUS_OK)
2673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
26745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            p_t1t->num_ndef_finalblock = p_t1t->block_read;
2675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->state    = RW_T1T_STATE_WRITE_NDEF;
2676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->substate = RW_T1T_SUBSTATE_WAIT_READ_NDEF_BLOCK;
2677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
2680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* NDEF detected and Static memory structure so send WRITE-E command */
2682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_T1T_BLD_ADD ((addr), (T1T_CC_BLOCK), (T1T_CC_NMN_OFFSET));
2683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if ((status = rw_t1t_send_static_cmd (T1T_CMD_WRITE_E, addr, 0)) == NFC_STATUS_OK)
2684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->state    = RW_T1T_STATE_WRITE_NDEF;
2686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->substate = RW_T1T_SUBSTATE_WAIT_INVALIDATE_NDEF;
2687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status != NFC_STATUS_OK)
2692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if status failed, reset ndef_msg_offset to initial message */
2694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_t1t->ndef_msg_offset = init_ndef_msg_offset;
2695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
2697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tSetTagReadOnly
2702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function can be called to set t1 tag as read only.
2704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters:      None
2706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NCI_STATUS_OK, if setting tag as read only was started.
2708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Otherwise, error status.
2709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T1tSetTagReadOnly (BOOLEAN b_hard_lock)
2712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tNFC_STATUS status      = NFC_STATUS_FAILED;
2714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tRW_T1T_CB  *p_t1t      = &rw_cb.tcb.t1t;
2715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       addr;
2716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8       num_locks;
2717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_t1t->state != RW_T1T_STATE_IDLE)
2719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_TRACE_WARNING1 ("RW_T1tSetTagReadOnly - Busy - State: %u", p_t1t->state);
2721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (NFC_STATUS_BUSY);
2722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_t1t->b_hard_lock = b_hard_lock;
2725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (p_t1t->tag_attribute == RW_T1_TAG_ATTRB_READ_WRITE)
2727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ||(p_t1t->tag_attribute == RW_T1_TAG_ATTRB_INITIALIZED)
2728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ||(p_t1t->tag_attribute == RW_T1_TAG_ATTRB_INITIALIZED_NDEF)  )
2729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* send WRITE-NE command */
2731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        RW_T1T_BLD_ADD ((addr), (T1T_CC_BLOCK), (T1T_CC_RWA_OFFSET));
2732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if ((status = rw_t1t_send_static_cmd (T1T_CMD_WRITE_NE, addr, 0x0F)) == NFC_STATUS_OK)
2733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
2734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->b_update = FALSE;
2735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->b_rseg   = FALSE;
2736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (p_t1t->b_hard_lock)
2738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
2739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                num_locks = 0;
2740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                while (num_locks < p_t1t->num_lockbytes)
2741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
2742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p_t1t->lockbyte[num_locks].lock_status = RW_T1T_LOCK_NOT_UPDATED;
2743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    num_locks++;
2744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
2745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
2746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->state    = RW_T1T_STATE_SET_TAG_RO;
2747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_t1t->substate = RW_T1T_SUBSTATE_WAIT_SET_CC_RWA_RO;
2748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
2752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
2755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_get_sub_state_name
2758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function returns the sub_state name.
2760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NOTE             conditionally compiled to save memory.
2762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to the name
2764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *rw_t1t_get_sub_state_name (UINT8 sub_state)
2767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (sub_state)
2769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_SUBSTATE_NONE:
2771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("NONE");
2772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_SUBSTATE_WAIT_READ_TLV_VALUE:
2773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("EXTRACT_TLV_VALUE");
2774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_SUBSTATE_WAIT_READ_LOCKS:
2775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("READING_LOCKS");
2776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_SUBSTATE_WAIT_READ_NDEF_BLOCK:
2777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("READ_NDEF_FINAL_BLOCK");
2778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_SUBSTATE_WAIT_INVALIDATE_NDEF:
2779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("INVALIDATING_NDEF");
2780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_SUBSTATE_WAIT_NDEF_WRITE:
2781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("WRITE_NDEF_TLV_MESSAGE");
2782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_SUBSTATE_WAIT_NDEF_UPDATED:
2783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("WAITING_RSP_FOR_LAST_NDEF_WRITE");
2784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_SUBSTATE_WAIT_VALIDATE_NDEF:
2785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("VALIDATING_NDEF");
2786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_SUBSTATE_WAIT_SET_CC_RWA_RO:
2787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("SET_RWA_RO");
2788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_SUBSTATE_WAIT_SET_ST_LOCK_BITS:
2789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("SET_STATIC_LOCK_BITS");
2790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_SUBSTATE_WAIT_SET_DYN_LOCK_BITS:
2791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("SET_DYNAMIC_LOCK_BITS");
2792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
2794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return ("???? UNKNOWN SUBSTATE");
2795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* (BT_TRACE_VERBOSE == TRUE) */
2798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* (defined ((RW_NDEF_INCLUDED) && (RW_NDEF_INCLUDED == TRUE)) */
2800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* (NFC_INCLUDED == TRUE) */
2802