blob: 990aba170e4c5cd9364f87f8fc5057377234020d [file] [log] [blame]
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001/******************************************************************************
2 *
Evan Chue9629ba2014-01-31 11:18:47 -05003 * Copyright (C) 2011-2014 Broadcom Corporation
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08004 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18
19/******************************************************************************
20 *
21 * This file contains the implementation for ISO 15693 in Reader/Writer
22 * mode.
23 *
24 ******************************************************************************/
25#include <string.h>
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -080026#include "bt_types.h"
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -080027#include "nfc_target.h"
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -080028#include "trace_api.h"
29
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -080030#include "nfc_api.h"
31#include "nfc_int.h"
32#include "rw_api.h"
33#include "rw_int.h"
34
Ruchi Kandoi46e6e282017-01-30 14:26:10 -080035/* Response timeout */
36#define RW_I93_TOUT_RESP 1000
37/* stay quiet timeout */
38#define RW_I93_TOUT_STAY_QUIET 200
39/* max reading data if read multi block is supported */
40#define RW_I93_READ_MULTI_BLOCK_SIZE 128
41/* CC, zero length NDEF, Terminator TLV */
42#define RW_I93_FORMAT_DATA_LEN 8
43/* max getting lock status if get multi block sec is supported */
44#define RW_I93_GET_MULTI_BLOCK_SEC_SIZE 253
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -080045
46/* main state */
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -080047enum {
48 RW_I93_STATE_NOT_ACTIVATED, /* ISO15693 is not activated */
49 RW_I93_STATE_IDLE, /* waiting for upper layer API */
50 RW_I93_STATE_BUSY, /* waiting for response from tag */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -080051
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -080052 RW_I93_STATE_DETECT_NDEF, /* performing NDEF detection precedure */
53 RW_I93_STATE_READ_NDEF, /* performing read NDEF procedure */
54 RW_I93_STATE_UPDATE_NDEF, /* performing update NDEF procedure */
55 RW_I93_STATE_FORMAT, /* performing format procedure */
56 RW_I93_STATE_SET_READ_ONLY, /* performing set read-only procedure */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -080057
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -080058 RW_I93_STATE_PRESENCE_CHECK /* checking presence of tag */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -080059};
60
61/* sub state */
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -080062enum {
63 RW_I93_SUBSTATE_WAIT_UID, /* waiting for response of inventory */
64 RW_I93_SUBSTATE_WAIT_SYS_INFO, /* waiting for response of get sys info */
65 RW_I93_SUBSTATE_WAIT_CC, /* waiting for reading CC */
66 RW_I93_SUBSTATE_SEARCH_NDEF_TLV, /* searching NDEF TLV */
67 RW_I93_SUBSTATE_CHECK_LOCK_STATUS, /* check if any NDEF TLV is locked */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -080068
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -080069 RW_I93_SUBSTATE_RESET_LEN, /* set length to 0 to update NDEF TLV */
70 RW_I93_SUBSTATE_WRITE_NDEF, /* writing NDEF and Terminator TLV */
71 RW_I93_SUBSTATE_UPDATE_LEN, /* set length into NDEF TLV */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -080072
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -080073 RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI, /* reset DSFID and AFI */
74 RW_I93_SUBSTATE_CHECK_READ_ONLY, /* check if any block is locked */
75 RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV, /* write CC and empty NDEF/Terminator TLV
76 */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -080077
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -080078 RW_I93_SUBSTATE_WAIT_UPDATE_CC, /* updating CC as read-only */
79 RW_I93_SUBSTATE_LOCK_NDEF_TLV, /* lock blocks of NDEF TLV */
80 RW_I93_SUBSTATE_WAIT_LOCK_CC /* lock block of CC */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -080081};
82
83#if (BT_TRACE_VERBOSE == TRUE)
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -070084static std::string rw_i93_get_state_name(uint8_t state);
85static std::string rw_i93_get_sub_state_name(uint8_t sub_state);
86static std::string rw_i93_get_tag_name(uint8_t product_version);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -080087#endif
88
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -080089static void rw_i93_data_cback(uint8_t conn_id, tNFC_CONN_EVT event,
90 tNFC_CONN* p_data);
91void rw_i93_handle_error(tNFC_STATUS status);
92tNFC_STATUS rw_i93_send_cmd_get_sys_info(uint8_t* p_uid, uint8_t extra_flag);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -080093
94/*******************************************************************************
95**
96** Function rw_i93_get_product_version
97**
98** Description Get product version from UID
99**
100** Returns void
101**
102*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800103void rw_i93_get_product_version(uint8_t* p_uid) {
104 tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800105
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800106 if (!memcmp(p_i93->uid, p_uid, I93_UID_BYTE_LEN)) {
107 return;
108 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800109
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800110 RW_TRACE_DEBUG0("rw_i93_get_product_version ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800111
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800112 memcpy(p_i93->uid, p_uid, I93_UID_BYTE_LEN);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800113
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800114 if (p_uid[1] == I93_UID_IC_MFG_CODE_NXP) {
115 if (p_uid[2] == I93_UID_ICODE_SLI)
116 p_i93->product_version = RW_I93_ICODE_SLI;
117 else if (p_uid[2] == I93_UID_ICODE_SLI_S)
118 p_i93->product_version = RW_I93_ICODE_SLI_S;
119 else if (p_uid[2] == I93_UID_ICODE_SLI_L)
120 p_i93->product_version = RW_I93_ICODE_SLI_L;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800121 else
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800122 p_i93->product_version = RW_I93_UNKNOWN_PRODUCT;
123 } else if (p_uid[1] == I93_UID_IC_MFG_CODE_TI) {
124 if ((p_uid[2] & I93_UID_TAG_IT_HF_I_PRODUCT_ID_MASK) ==
125 I93_UID_TAG_IT_HF_I_PLUS_INLAY)
126 p_i93->product_version = RW_I93_TAG_IT_HF_I_PLUS_INLAY;
127 else if ((p_uid[2] & I93_UID_TAG_IT_HF_I_PRODUCT_ID_MASK) ==
128 I93_UID_TAG_IT_HF_I_PLUS_CHIP)
129 p_i93->product_version = RW_I93_TAG_IT_HF_I_PLUS_CHIP;
130 else if ((p_uid[2] & I93_UID_TAG_IT_HF_I_PRODUCT_ID_MASK) ==
131 I93_UID_TAG_IT_HF_I_STD_CHIP_INLAY)
132 p_i93->product_version = RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY;
133 else if ((p_uid[2] & I93_UID_TAG_IT_HF_I_PRODUCT_ID_MASK) ==
134 I93_UID_TAG_IT_HF_I_PRO_CHIP_INLAY)
135 p_i93->product_version = RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY;
136 else
137 p_i93->product_version = RW_I93_UNKNOWN_PRODUCT;
138 } else if ((p_uid[1] == I93_UID_IC_MFG_CODE_STM) &&
139 (p_i93->info_flags & I93_INFO_FLAG_IC_REF)) {
140 if (p_i93->ic_reference == I93_IC_REF_STM_M24LR04E_R)
141 p_i93->product_version = RW_I93_STM_M24LR04E_R;
142 else if (p_i93->ic_reference == I93_IC_REF_STM_M24LR16E_R)
143 p_i93->product_version = RW_I93_STM_M24LR16E_R;
144 else if (p_i93->ic_reference == I93_IC_REF_STM_M24LR64E_R)
145 p_i93->product_version = RW_I93_STM_M24LR64E_R;
146 else {
147 switch (p_i93->ic_reference & I93_IC_REF_STM_MASK) {
148 case I93_IC_REF_STM_LRI1K:
149 p_i93->product_version = RW_I93_STM_LRI1K;
150 break;
151 case I93_IC_REF_STM_LRI2K:
152 p_i93->product_version = RW_I93_STM_LRI2K;
153 break;
154 case I93_IC_REF_STM_LRIS2K:
155 p_i93->product_version = RW_I93_STM_LRIS2K;
156 break;
157 case I93_IC_REF_STM_LRIS64K:
158 p_i93->product_version = RW_I93_STM_LRIS64K;
159 break;
160 case I93_IC_REF_STM_M24LR64_R:
161 p_i93->product_version = RW_I93_STM_M24LR64_R;
162 break;
163 default:
164 p_i93->product_version = RW_I93_UNKNOWN_PRODUCT;
165 break;
166 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800167 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800168 } else {
169 p_i93->product_version = RW_I93_UNKNOWN_PRODUCT;
170 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800171
Evan Chu85b7e842013-01-18 11:02:50 -0500172#if (BT_TRACE_VERBOSE == TRUE)
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800173 RW_TRACE_DEBUG1("product_version = <%s>",
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -0700174 rw_i93_get_tag_name(p_i93->product_version).c_str());
Evan Chu85b7e842013-01-18 11:02:50 -0500175#else
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800176 RW_TRACE_DEBUG1("product_version = %d", p_i93->product_version);
Evan Chu85b7e842013-01-18 11:02:50 -0500177#endif
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800178
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800179 switch (p_i93->product_version) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800180 case RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY:
181 case RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800182 /* these don't support Get System Information Command */
183 /* these support only Inventory, Stay Quiet, Read Single Block, Write
184 * Single Block, Lock Block */
185 p_i93->block_size = I93_TAG_IT_HF_I_STD_PRO_CHIP_INLAY_BLK_SIZE;
186 p_i93->num_block = I93_TAG_IT_HF_I_STD_PRO_CHIP_INLAY_NUM_USER_BLK;
187 break;
Evan Chu85b7e842013-01-18 11:02:50 -0500188 default:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800189 break;
190 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800191}
192
193/*******************************************************************************
194**
Evan Chu85b7e842013-01-18 11:02:50 -0500195** Function rw_i93_process_sys_info
196**
197** Description Store system information of tag
198**
199** Returns FALSE if retrying with protocol extension flag
200**
201*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800202bool rw_i93_process_sys_info(uint8_t* p_data) {
203 uint8_t* p = p_data;
204 tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
205 uint8_t uid[I93_UID_BYTE_LEN], *p_uid;
Evan Chu85b7e842013-01-18 11:02:50 -0500206
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800207 RW_TRACE_DEBUG0("rw_i93_process_sys_info ()");
Evan Chu85b7e842013-01-18 11:02:50 -0500208
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800209 STREAM_TO_UINT8(p_i93->info_flags, p);
Evan Chu85b7e842013-01-18 11:02:50 -0500210
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800211 p_uid = uid;
212 STREAM_TO_ARRAY8(p_uid, p);
Evan Chu85b7e842013-01-18 11:02:50 -0500213
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800214 if (p_i93->info_flags & I93_INFO_FLAG_DSFID) {
215 STREAM_TO_UINT8(p_i93->dsfid, p);
216 }
217 if (p_i93->info_flags & I93_INFO_FLAG_AFI) {
218 STREAM_TO_UINT8(p_i93->afi, p);
219 }
220 if (p_i93->info_flags & I93_INFO_FLAG_MEM_SIZE) {
221 if (p_i93->intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK) {
222 STREAM_TO_UINT16(p_i93->num_block, p);
223 } else {
224 STREAM_TO_UINT8(p_i93->num_block, p);
Evan Chu85b7e842013-01-18 11:02:50 -0500225 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800226 /* it is one less than actual number of bytes */
227 p_i93->num_block += 1;
Evan Chu85b7e842013-01-18 11:02:50 -0500228
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800229 STREAM_TO_UINT8(p_i93->block_size, p);
230 /* it is one less than actual number of blocks */
231 p_i93->block_size = (p_i93->block_size & 0x1F) + 1;
232 }
233 if (p_i93->info_flags & I93_INFO_FLAG_IC_REF) {
234 STREAM_TO_UINT8(p_i93->ic_reference, p);
Evan Chu85b7e842013-01-18 11:02:50 -0500235
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800236 /* clear existing UID to set product version */
237 p_i93->uid[0] = 0x00;
Evan Chu85b7e842013-01-18 11:02:50 -0500238
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800239 /* store UID and get product version */
240 rw_i93_get_product_version(p_uid);
Evan Chu85b7e842013-01-18 11:02:50 -0500241
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800242 if (p_i93->uid[0] == I93_UID_FIRST_BYTE) {
243 if ((p_i93->uid[1] == I93_UID_IC_MFG_CODE_NXP) &&
244 (p_i93->ic_reference == I93_IC_REF_ICODE_SLI_L)) {
245 p_i93->num_block = 8;
246 p_i93->block_size = 4;
247 } else if (p_i93->uid[1] == I93_UID_IC_MFG_CODE_STM) {
248 /*
249 ** LRI1K: 010000xx(b), blockSize: 4, numberBlocks: 0x20
250 ** LRI2K: 001000xx(b), blockSize: 4, numberBlocks: 0x40
251 ** LRIS2K: 001010xx(b), blockSize: 4, numberBlocks: 0x40
252 ** LRIS64K: 010001xx(b), blockSize: 4, numberBlocks: 0x800
253 ** M24LR64-R: 001011xx(b), blockSize: 4, numberBlocks: 0x800
254 ** M24LR04E-R: 01011010(b), blockSize: 4, numberBlocks: 0x80
255 ** M24LR16E-R: 01001110(b), blockSize: 4, numberBlocks: 0x200
256 ** M24LR64E-R: 01011110(b), blockSize: 4, numberBlocks: 0x800
257 */
258 if ((p_i93->product_version == RW_I93_STM_M24LR16E_R) ||
259 (p_i93->product_version == RW_I93_STM_M24LR64E_R)) {
260 /*
261 ** M24LR16E-R or M24LR64E-R returns system information
262 ** without memory size, if option flag is not set.
263 ** LRIS64K and M24LR64-R return error if option flag is not
264 ** set.
265 */
266 if (!(p_i93->intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK)) {
267 /* get memory size with protocol extension flag */
268 if (rw_i93_send_cmd_get_sys_info(NULL, I93_FLAG_PROT_EXT_YES) ==
269 NFC_STATUS_OK) {
270 /* STM supports more than 2040 bytes */
271 p_i93->intl_flags |= RW_I93_FLAG_16BIT_NUM_BLOCK;
272
273 return false;
Evan Chu85b7e842013-01-18 11:02:50 -0500274 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800275 }
276 return true;
277 } else if ((p_i93->product_version == RW_I93_STM_LRI2K) &&
278 (p_i93->ic_reference == 0x21)) {
279 /* workaround of byte order in memory size information */
280 p_i93->num_block = 64;
281 p_i93->block_size = 4;
Evan Chu85b7e842013-01-18 11:02:50 -0500282 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800283 }
Evan Chu85b7e842013-01-18 11:02:50 -0500284 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800285 }
Evan Chu85b7e842013-01-18 11:02:50 -0500286
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800287 return true;
Evan Chu85b7e842013-01-18 11:02:50 -0500288}
289
290/*******************************************************************************
291**
292** Function rw_i93_check_sys_info_prot_ext
293**
Ruchi Kandoi552f2b72017-01-28 16:22:55 -0800294** Description Check if need to set protocol extension flag to get system
295** info
Evan Chu85b7e842013-01-18 11:02:50 -0500296**
297** Returns TRUE if sent Get System Info with protocol extension flag
298**
299*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800300bool rw_i93_check_sys_info_prot_ext(uint8_t error_code) {
301 tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
Evan Chu85b7e842013-01-18 11:02:50 -0500302
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800303 RW_TRACE_DEBUG0("rw_i93_check_sys_info_prot_ext ()");
Evan Chu85b7e842013-01-18 11:02:50 -0500304
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800305 if ((p_i93->uid[1] == I93_UID_IC_MFG_CODE_STM) &&
306 (p_i93->sent_cmd == I93_CMD_GET_SYS_INFO) &&
307 (error_code == I93_ERROR_CODE_OPTION_NOT_SUPPORTED) &&
308 (rw_i93_send_cmd_get_sys_info(NULL, I93_FLAG_PROT_EXT_YES) ==
309 NFC_STATUS_OK)) {
310 return true;
311 } else {
312 return false;
313 }
Evan Chu85b7e842013-01-18 11:02:50 -0500314}
315
316/*******************************************************************************
317**
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800318** Function rw_i93_send_to_upper
319**
320** Description Send response to upper layer
321**
322** Returns void
323**
324*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800325void rw_i93_send_to_upper(NFC_HDR* p_resp) {
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -0700326 uint8_t *p = (uint8_t*)(p_resp + 1) + p_resp->offset, *p_uid;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800327 uint16_t length = p_resp->len;
328 tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
329 tRW_DATA rw_data;
330 uint8_t event = RW_I93_MAX_EVT;
331 uint8_t flags;
332 NFC_HDR* p_buff;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800333
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800334 RW_TRACE_DEBUG0("rw_i93_send_to_upper ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800335
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800336 STREAM_TO_UINT8(flags, p);
337 length--;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800338
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800339 if (flags & I93_FLAG_ERROR_DETECTED) {
340 if ((length) && (rw_i93_check_sys_info_prot_ext(*p))) {
341 /* getting system info with protocol extension flag */
342 /* This STM tag supports more than 2040 bytes */
343 p_i93->intl_flags |= RW_I93_FLAG_16BIT_NUM_BLOCK;
344 p_i93->state = RW_I93_STATE_BUSY;
345 } else {
346 /* notify error to upper layer */
347 rw_data.i93_cmd_cmpl.status = NFC_STATUS_FAILED;
348 rw_data.i93_cmd_cmpl.command = p_i93->sent_cmd;
349 STREAM_TO_UINT8(rw_data.i93_cmd_cmpl.error_code, p);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800350
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800351 rw_cb.tcb.i93.sent_cmd = 0;
352 (*(rw_cb.p_cback))(RW_I93_CMD_CMPL_EVT, &rw_data);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800353 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800354 return;
355 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800356
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800357 switch (p_i93->sent_cmd) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800358 case I93_CMD_INVENTORY:
359
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800360 /* forward inventory response */
361 rw_data.i93_inventory.status = NFC_STATUS_OK;
362 STREAM_TO_UINT8(rw_data.i93_inventory.dsfid, p);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800363
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800364 p_uid = rw_data.i93_inventory.uid;
365 STREAM_TO_ARRAY8(p_uid, p);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800366
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800367 /* store UID and get product version */
368 rw_i93_get_product_version(p_uid);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800369
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800370 event = RW_I93_INVENTORY_EVT;
371 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800372
373 case I93_CMD_READ_SINGLE_BLOCK:
374 case I93_CMD_READ_MULTI_BLOCK:
375 case I93_CMD_GET_MULTI_BLK_SEC:
376
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800377 /* forward tag data or security status */
378 p_buff = (NFC_HDR*)GKI_getbuf((uint16_t)(length + NFC_HDR_SIZE));
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800379
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800380 if (p_buff) {
381 p_buff->offset = 0;
382 p_buff->len = length;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800383
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800384 memcpy((p_buff + 1), p, length);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800385
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800386 rw_data.i93_data.status = NFC_STATUS_OK;
387 rw_data.i93_data.command = p_i93->sent_cmd;
388 rw_data.i93_data.p_data = p_buff;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800389
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800390 event = RW_I93_DATA_EVT;
391 } else {
392 rw_data.i93_cmd_cmpl.status = NFC_STATUS_NO_BUFFERS;
393 rw_data.i93_cmd_cmpl.command = p_i93->sent_cmd;
394 rw_data.i93_cmd_cmpl.error_code = 0;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800395
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800396 event = RW_I93_CMD_CMPL_EVT;
397 }
398 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800399
400 case I93_CMD_WRITE_SINGLE_BLOCK:
401 case I93_CMD_LOCK_BLOCK:
402 case I93_CMD_WRITE_MULTI_BLOCK:
403 case I93_CMD_SELECT:
404 case I93_CMD_RESET_TO_READY:
405 case I93_CMD_WRITE_AFI:
406 case I93_CMD_LOCK_AFI:
407 case I93_CMD_WRITE_DSFID:
408 case I93_CMD_LOCK_DSFID:
409
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800410 /* notify the complete of command */
411 rw_data.i93_cmd_cmpl.status = NFC_STATUS_OK;
412 rw_data.i93_cmd_cmpl.command = p_i93->sent_cmd;
413 rw_data.i93_cmd_cmpl.error_code = 0;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800414
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800415 event = RW_I93_CMD_CMPL_EVT;
416 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800417
418 case I93_CMD_GET_SYS_INFO:
419
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800420 if (rw_i93_process_sys_info(p)) {
421 rw_data.i93_sys_info.status = NFC_STATUS_OK;
422 rw_data.i93_sys_info.info_flags = p_i93->info_flags;
423 rw_data.i93_sys_info.dsfid = p_i93->dsfid;
424 rw_data.i93_sys_info.afi = p_i93->afi;
425 rw_data.i93_sys_info.num_block = p_i93->num_block;
426 rw_data.i93_sys_info.block_size = p_i93->block_size;
427 rw_data.i93_sys_info.IC_reference = p_i93->ic_reference;
Evan Chu85b7e842013-01-18 11:02:50 -0500428
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800429 memcpy(rw_data.i93_sys_info.uid, p_i93->uid, I93_UID_BYTE_LEN);
Evan Chu85b7e842013-01-18 11:02:50 -0500430
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800431 event = RW_I93_SYS_INFO_EVT;
432 } else {
433 /* retrying with protocol extension flag */
434 p_i93->state = RW_I93_STATE_BUSY;
435 return;
436 }
437 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800438
439 default:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800440 break;
441 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800442
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800443 rw_cb.tcb.i93.sent_cmd = 0;
444 if (event != RW_I93_MAX_EVT) {
445 (*(rw_cb.p_cback))(event, &rw_data);
446 } else {
447 RW_TRACE_ERROR0("rw_i93_send_to_upper (): Invalid response");
448 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800449}
450
451/*******************************************************************************
452**
453** Function rw_i93_send_to_lower
454**
455** Description Send Request frame to lower layer
456**
457** Returns TRUE if success
458**
459*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800460bool rw_i93_send_to_lower(NFC_HDR* p_msg) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800461#if (BT_TRACE_PROTOCOL == TRUE)
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800462 DispRWI93Tag(p_msg, false, 0x00);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800463#endif
464
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800465 /* store command for retransmitting */
466 if (rw_cb.tcb.i93.p_retry_cmd) {
467 GKI_freebuf(rw_cb.tcb.i93.p_retry_cmd);
468 rw_cb.tcb.i93.p_retry_cmd = NULL;
469 }
Evan Chu85b7e842013-01-18 11:02:50 -0500470
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800471 rw_cb.tcb.i93.p_retry_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
Evan Chu85b7e842013-01-18 11:02:50 -0500472
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800473 if (rw_cb.tcb.i93.p_retry_cmd) {
474 memcpy(rw_cb.tcb.i93.p_retry_cmd, p_msg,
475 sizeof(NFC_HDR) + p_msg->offset + p_msg->len);
476 }
Evan Chu85b7e842013-01-18 11:02:50 -0500477
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800478 if (NFC_SendData(NFC_RF_CONN_ID, p_msg) != NFC_STATUS_OK) {
479 RW_TRACE_ERROR0("rw_i93_send_to_lower (): NFC_SendData () failed");
480 return false;
481 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800482
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800483 nfc_start_quick_timer(&rw_cb.tcb.i93.timer, NFC_TTYPE_RW_I93_RESPONSE,
484 (RW_I93_TOUT_RESP * QUICK_TIMER_TICKS_PER_SEC) / 1000);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800485
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800486 return true;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800487}
488
489/*******************************************************************************
490**
491** Function rw_i93_send_cmd_inventory
492**
493** Description Send Inventory Request to VICC
494**
495** Returns tNFC_STATUS
496**
497*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800498tNFC_STATUS rw_i93_send_cmd_inventory(uint8_t* p_uid, bool including_afi,
499 uint8_t afi) {
500 NFC_HDR* p_cmd;
501 uint8_t *p, flags;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800502
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800503 RW_TRACE_DEBUG2("rw_i93_send_cmd_inventory () including_afi:%d, AFI:0x%02X",
504 including_afi, afi);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800505
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800506 p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800507
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800508 if (!p_cmd) {
509 RW_TRACE_ERROR0("rw_i93_send_cmd_inventory (): Cannot allocate buffer");
510 return NFC_STATUS_NO_BUFFERS;
511 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800512
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800513 p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
514 p_cmd->len = 3;
515 p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800516
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800517 /* Flags */
518 flags = (I93_FLAG_SLOT_ONE | I93_FLAG_INVENTORY_SET |
519 RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE);
520 if (including_afi) {
521 flags |= I93_FLAG_AFI_PRESENT;
522 }
Martijn Coenen5c65c3a2013-03-27 13:23:36 -0700523
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800524 UINT8_TO_STREAM(p, flags);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800525
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800526 /* Command Code */
527 UINT8_TO_STREAM(p, I93_CMD_INVENTORY);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800528
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800529 if (including_afi) {
530 /* Parameters */
531 UINT8_TO_STREAM(p, afi); /* Optional AFI */
532 p_cmd->len++;
533 }
Martijn Coenen5c65c3a2013-03-27 13:23:36 -0700534
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800535 if (p_uid) {
536 UINT8_TO_STREAM(p, I93_UID_BYTE_LEN * 8); /* Mask Length */
537 ARRAY8_TO_STREAM(p, p_uid); /* UID */
538 p_cmd->len += I93_UID_BYTE_LEN;
539 } else {
540 UINT8_TO_STREAM(p, 0x00); /* Mask Length */
541 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800542
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800543 if (rw_i93_send_to_lower(p_cmd)) {
544 rw_cb.tcb.i93.sent_cmd = I93_CMD_INVENTORY;
545 return NFC_STATUS_OK;
546 } else {
547 return NFC_STATUS_FAILED;
548 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800549}
550
551/*******************************************************************************
552**
553** Function rw_i93_send_cmd_stay_quiet
554**
555** Description Send Stay Quiet Request to VICC
556**
557** Returns tNFC_STATUS
558**
559*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800560tNFC_STATUS rw_i93_send_cmd_stay_quiet(void) {
561 NFC_HDR* p_cmd;
562 uint8_t* p;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800563
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800564 RW_TRACE_DEBUG0("rw_i93_send_cmd_stay_quiet ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800565
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800566 p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800567
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800568 if (!p_cmd) {
569 RW_TRACE_ERROR0("rw_i93_send_cmd_stay_quiet (): Cannot allocate buffer");
570 return NFC_STATUS_NO_BUFFERS;
571 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800572
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800573 p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
574 p_cmd->len = 10;
575 p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800576
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800577 /* Flags */
578 UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
579 RW_I93_FLAG_DATA_RATE));
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800580
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800581 /* Command Code */
582 UINT8_TO_STREAM(p, I93_CMD_STAY_QUIET);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800583
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800584 /* Parameters */
585 ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800586
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800587 if (rw_i93_send_to_lower(p_cmd)) {
588 rw_cb.tcb.i93.sent_cmd = I93_CMD_STAY_QUIET;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800589
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800590 /* restart timer for stay quiet */
591 nfc_start_quick_timer(
592 &rw_cb.tcb.i93.timer, NFC_TTYPE_RW_I93_RESPONSE,
593 (RW_I93_TOUT_STAY_QUIET * QUICK_TIMER_TICKS_PER_SEC) / 1000);
594 return NFC_STATUS_OK;
595 } else {
596 return NFC_STATUS_FAILED;
597 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800598}
599
600/*******************************************************************************
601**
602** Function rw_i93_send_cmd_read_single_block
603**
604** Description Send Read Single Block Request to VICC
605**
606** Returns tNFC_STATUS
607**
608*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800609tNFC_STATUS rw_i93_send_cmd_read_single_block(uint16_t block_number,
610 bool read_security) {
611 NFC_HDR* p_cmd;
612 uint8_t *p, flags;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800613
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800614 RW_TRACE_DEBUG0("rw_i93_send_cmd_read_single_block ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800615
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800616 p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800617
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800618 if (!p_cmd) {
619 RW_TRACE_ERROR0(
620 "rw_i93_send_cmd_read_single_block (): Cannot allocate buffer");
621 return NFC_STATUS_NO_BUFFERS;
622 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800623
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800624 p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
625 p_cmd->len = 11;
626 p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800627
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800628 /* Flags */
629 flags =
630 (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE);
Evan Chu85b7e842013-01-18 11:02:50 -0500631
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800632 if (read_security) flags |= I93_FLAG_OPTION_SET;
Evan Chu85b7e842013-01-18 11:02:50 -0500633
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800634 if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK)
635 flags |= I93_FLAG_PROT_EXT_YES;
Evan Chu85b7e842013-01-18 11:02:50 -0500636
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800637 UINT8_TO_STREAM(p, flags);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800638
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800639 /* Command Code */
640 UINT8_TO_STREAM(p, I93_CMD_READ_SINGLE_BLOCK);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800641
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800642 /* Parameters */
643 ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
Evan Chu85b7e842013-01-18 11:02:50 -0500644
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800645 if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK) {
646 UINT16_TO_STREAM(p, block_number); /* Block number */
647 p_cmd->len++;
648 } else {
649 UINT8_TO_STREAM(p, block_number); /* Block number */
650 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800651
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800652 if (rw_i93_send_to_lower(p_cmd)) {
653 rw_cb.tcb.i93.sent_cmd = I93_CMD_READ_SINGLE_BLOCK;
654 return NFC_STATUS_OK;
655 } else {
656 return NFC_STATUS_FAILED;
657 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800658}
659
660/*******************************************************************************
661**
662** Function rw_i93_send_cmd_write_single_block
663**
664** Description Send Write Single Block Request to VICC
665**
666** Returns tNFC_STATUS
667**
668*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800669tNFC_STATUS rw_i93_send_cmd_write_single_block(uint16_t block_number,
670 uint8_t* p_data) {
671 NFC_HDR* p_cmd;
672 uint8_t *p, flags;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800673
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800674 RW_TRACE_DEBUG0("rw_i93_send_cmd_write_single_block ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800675
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800676 p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800677
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800678 if (!p_cmd) {
679 RW_TRACE_ERROR0(
680 "rw_i93_send_cmd_write_single_block (): Cannot allocate buffer");
681 return NFC_STATUS_NO_BUFFERS;
682 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800683
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800684 p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
685 p_cmd->len = 11 + rw_cb.tcb.i93.block_size;
686 p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800687
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800688 /* Flags */
689 if ((rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_PLUS_INLAY) ||
690 (rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_PLUS_CHIP) ||
691 (rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) ||
692 (rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY)) {
693 /* Option must be set for TI tag */
694 flags = (I93_FLAG_ADDRESS_SET | I93_FLAG_OPTION_SET |
695 RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE);
696 } else {
697 flags = (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
698 RW_I93_FLAG_DATA_RATE);
699 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800700
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800701 if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK)
702 flags |= I93_FLAG_PROT_EXT_YES;
Evan Chu85b7e842013-01-18 11:02:50 -0500703
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800704 UINT8_TO_STREAM(p, flags);
Evan Chu85b7e842013-01-18 11:02:50 -0500705
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800706 /* Command Code */
707 UINT8_TO_STREAM(p, I93_CMD_WRITE_SINGLE_BLOCK);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800708
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800709 /* Parameters */
710 ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
Evan Chu85b7e842013-01-18 11:02:50 -0500711
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800712 if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK) {
713 UINT16_TO_STREAM(p, block_number); /* Block number */
714 p_cmd->len++;
715 } else {
716 UINT8_TO_STREAM(p, block_number); /* Block number */
717 }
Evan Chu85b7e842013-01-18 11:02:50 -0500718
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800719 /* Data */
720 ARRAY_TO_STREAM(p, p_data, rw_cb.tcb.i93.block_size);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800721
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800722 if (rw_i93_send_to_lower(p_cmd)) {
723 rw_cb.tcb.i93.sent_cmd = I93_CMD_WRITE_SINGLE_BLOCK;
724 return NFC_STATUS_OK;
725 } else {
726 return NFC_STATUS_FAILED;
727 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800728}
729
730/*******************************************************************************
731**
732** Function rw_i93_send_cmd_lock_block
733**
734** Description Send Lock Block Request to VICC
735**
Evan Chu85b7e842013-01-18 11:02:50 -0500736** STM LRIS64K, M24LR64-R, M24LR04E-R, M24LR16E-R, M24LR64E-R
737** do not support.
738**
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800739** Returns tNFC_STATUS
740**
741*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800742tNFC_STATUS rw_i93_send_cmd_lock_block(uint8_t block_number) {
743 NFC_HDR* p_cmd;
744 uint8_t* p;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800745
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800746 RW_TRACE_DEBUG0("rw_i93_send_cmd_lock_block ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800747
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800748 p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800749
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800750 if (!p_cmd) {
751 RW_TRACE_ERROR0("rw_i93_send_cmd_lock_block (): Cannot allocate buffer");
752 return NFC_STATUS_NO_BUFFERS;
753 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800754
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800755 p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
756 p_cmd->len = 11;
757 p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800758
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800759 /* Flags */
760 if ((rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_PLUS_INLAY) ||
761 (rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_PLUS_CHIP) ||
762 (rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) ||
763 (rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY)) {
764 /* Option must be set for TI tag */
765 UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | I93_FLAG_OPTION_SET |
766 RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE));
767 } else {
768 UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
769 RW_I93_FLAG_DATA_RATE));
770 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800771
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800772 /* Command Code */
773 UINT8_TO_STREAM(p, I93_CMD_LOCK_BLOCK);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800774
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800775 /* Parameters */
776 ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
777 UINT8_TO_STREAM(p, block_number); /* Block number */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800778
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800779 if (rw_i93_send_to_lower(p_cmd)) {
780 rw_cb.tcb.i93.sent_cmd = I93_CMD_LOCK_BLOCK;
781 return NFC_STATUS_OK;
782 } else {
783 return NFC_STATUS_FAILED;
784 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800785}
786
787/*******************************************************************************
788**
789** Function rw_i93_send_cmd_read_multi_blocks
790**
791** Description Send Read Multiple Blocks Request to VICC
792**
793** Returns tNFC_STATUS
794**
795*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800796tNFC_STATUS rw_i93_send_cmd_read_multi_blocks(uint16_t first_block_number,
797 uint16_t number_blocks) {
798 NFC_HDR* p_cmd;
799 uint8_t *p, flags;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800800
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800801 RW_TRACE_DEBUG0("rw_i93_send_cmd_read_multi_blocks ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800802
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800803 p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800804
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800805 if (!p_cmd) {
806 RW_TRACE_ERROR0(
807 "rw_i93_send_cmd_read_multi_blocks (): Cannot allocate buffer");
808 return NFC_STATUS_NO_BUFFERS;
809 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800810
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800811 p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
812 p_cmd->len = 12;
813 p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800814
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800815 /* Flags */
816 flags =
817 (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE);
Evan Chu85b7e842013-01-18 11:02:50 -0500818
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800819 if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK)
820 flags |= I93_FLAG_PROT_EXT_YES;
Evan Chu85b7e842013-01-18 11:02:50 -0500821
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800822 UINT8_TO_STREAM(p, flags);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800823
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800824 /* Command Code */
825 UINT8_TO_STREAM(p, I93_CMD_READ_MULTI_BLOCK);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800826
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800827 /* Parameters */
828 ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
Evan Chu85b7e842013-01-18 11:02:50 -0500829
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800830 if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK) {
831 UINT16_TO_STREAM(p, first_block_number); /* First block number */
832 p_cmd->len++;
833 } else {
834 UINT8_TO_STREAM(p, first_block_number); /* First block number */
835 }
Evan Chu85b7e842013-01-18 11:02:50 -0500836
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800837 UINT8_TO_STREAM(
838 p, number_blocks - 1); /* Number of blocks, 0x00 to read one block */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800839
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800840 if (rw_i93_send_to_lower(p_cmd)) {
841 rw_cb.tcb.i93.sent_cmd = I93_CMD_READ_MULTI_BLOCK;
842 return NFC_STATUS_OK;
843 } else {
844 return NFC_STATUS_FAILED;
845 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800846}
847
848/*******************************************************************************
849**
850** Function rw_i93_send_cmd_write_multi_blocks
851**
852** Description Send Write Multiple Blocks Request to VICC
853**
854** Returns tNFC_STATUS
855**
856*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800857tNFC_STATUS rw_i93_send_cmd_write_multi_blocks(uint8_t first_block_number,
858 uint16_t number_blocks,
859 uint8_t* p_data) {
860 NFC_HDR* p_cmd;
861 uint8_t* p;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800862
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800863 RW_TRACE_DEBUG0("rw_i93_send_cmd_write_multi_blocks ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800864
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800865 p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800866
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800867 if (!p_cmd) {
868 RW_TRACE_ERROR0(
869 "rw_i93_send_cmd_write_multi_blocks (): Cannot allocate buffer");
870 return NFC_STATUS_NO_BUFFERS;
871 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800872
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800873 p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
874 p_cmd->len = 12 + number_blocks * rw_cb.tcb.i93.block_size;
875 p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800876
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800877 /* Flags */
878 UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
879 RW_I93_FLAG_DATA_RATE));
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800880
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800881 /* Command Code */
882 UINT8_TO_STREAM(p, I93_CMD_WRITE_MULTI_BLOCK);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800883
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800884 /* Parameters */
885 ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
886 UINT8_TO_STREAM(p, first_block_number); /* First block number */
887 UINT8_TO_STREAM(
888 p, number_blocks - 1); /* Number of blocks, 0x00 to read one block */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800889
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800890 /* Data */
891 ARRAY_TO_STREAM(p, p_data, number_blocks * rw_cb.tcb.i93.block_size);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800892
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800893 if (rw_i93_send_to_lower(p_cmd)) {
894 rw_cb.tcb.i93.sent_cmd = I93_CMD_WRITE_MULTI_BLOCK;
895 return NFC_STATUS_OK;
896 } else {
897 return NFC_STATUS_FAILED;
898 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800899}
900
901/*******************************************************************************
902**
903** Function rw_i93_send_cmd_select
904**
905** Description Send Select Request to VICC
906**
907** Returns tNFC_STATUS
908**
909*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800910tNFC_STATUS rw_i93_send_cmd_select(uint8_t* p_uid) {
911 NFC_HDR* p_cmd;
912 uint8_t* p;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800913
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800914 RW_TRACE_DEBUG0("rw_i93_send_cmd_select ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800915
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800916 p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800917
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800918 if (!p_cmd) {
919 RW_TRACE_ERROR0("rw_i93_send_cmd_select (): Cannot allocate buffer");
920 return NFC_STATUS_NO_BUFFERS;
921 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800922
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800923 p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
924 p_cmd->len = 10;
925 p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800926
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800927 /* Flags */
928 UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
929 RW_I93_FLAG_DATA_RATE));
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800930
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800931 /* Command Code */
932 UINT8_TO_STREAM(p, I93_CMD_SELECT);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800933
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800934 /* Parameters */
935 ARRAY8_TO_STREAM(p, p_uid); /* UID */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800936
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800937 if (rw_i93_send_to_lower(p_cmd)) {
938 rw_cb.tcb.i93.sent_cmd = I93_CMD_SELECT;
939 return NFC_STATUS_OK;
940 } else {
941 return NFC_STATUS_FAILED;
942 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800943}
944
945/*******************************************************************************
946**
947** Function rw_i93_send_cmd_reset_to_ready
948**
949** Description Send Reset to Ready Request to VICC
950**
951** Returns tNFC_STATUS
952**
953*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800954tNFC_STATUS rw_i93_send_cmd_reset_to_ready(void) {
955 NFC_HDR* p_cmd;
956 uint8_t* p;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800957
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800958 RW_TRACE_DEBUG0("rw_i93_send_cmd_reset_to_ready ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800959
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800960 p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800961
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800962 if (!p_cmd) {
963 RW_TRACE_ERROR0(
964 "rw_i93_send_cmd_reset_to_ready (): Cannot allocate buffer");
965 return NFC_STATUS_NO_BUFFERS;
966 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800967
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800968 p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
969 p_cmd->len = 10;
970 p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800971
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800972 /* Flags */
973 UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
974 RW_I93_FLAG_DATA_RATE));
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800975
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800976 /* Command Code */
977 UINT8_TO_STREAM(p, I93_CMD_RESET_TO_READY);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800978
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800979 /* Parameters */
980 ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800981
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800982 if (rw_i93_send_to_lower(p_cmd)) {
983 rw_cb.tcb.i93.sent_cmd = I93_CMD_RESET_TO_READY;
984 return NFC_STATUS_OK;
985 } else {
986 return NFC_STATUS_FAILED;
987 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -0800988}
989
990/*******************************************************************************
991**
992** Function rw_i93_send_cmd_write_afi
993**
994** Description Send Write AFI Request to VICC
995**
996** Returns tNFC_STATUS
997**
998*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -0800999tNFC_STATUS rw_i93_send_cmd_write_afi(uint8_t afi) {
1000 NFC_HDR* p_cmd;
1001 uint8_t* p;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001002
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001003 RW_TRACE_DEBUG0("rw_i93_send_cmd_write_afi ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001004
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001005 p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001006
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001007 if (!p_cmd) {
1008 RW_TRACE_ERROR0("rw_i93_send_cmd_write_afi (): Cannot allocate buffer");
1009 return NFC_STATUS_NO_BUFFERS;
1010 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001011
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001012 p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
1013 p_cmd->len = 11;
1014 p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001015
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001016 /* Flags */
1017 UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
1018 RW_I93_FLAG_DATA_RATE));
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001019
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001020 /* Command Code */
1021 UINT8_TO_STREAM(p, I93_CMD_WRITE_AFI);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001022
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001023 /* Parameters */
1024 ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
1025 UINT8_TO_STREAM(p, afi); /* AFI */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001026
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001027 if (rw_i93_send_to_lower(p_cmd)) {
1028 rw_cb.tcb.i93.sent_cmd = I93_CMD_WRITE_AFI;
1029 return NFC_STATUS_OK;
1030 } else {
1031 return NFC_STATUS_FAILED;
1032 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001033}
1034
1035/*******************************************************************************
1036**
1037** Function rw_i93_send_cmd_lock_afi
1038**
1039** Description Send Lock AFI Request to VICC
1040**
1041** Returns tNFC_STATUS
1042**
1043*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001044tNFC_STATUS rw_i93_send_cmd_lock_afi(void) {
1045 NFC_HDR* p_cmd;
1046 uint8_t* p;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001047
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001048 RW_TRACE_DEBUG0("rw_i93_send_cmd_lock_afi ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001049
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001050 p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001051
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001052 if (!p_cmd) {
1053 RW_TRACE_ERROR0("rw_i93_send_cmd_lock_afi (): Cannot allocate buffer");
1054 return NFC_STATUS_NO_BUFFERS;
1055 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001056
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001057 p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
1058 p_cmd->len = 10;
1059 p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001060
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001061 /* Flags */
1062 UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
1063 RW_I93_FLAG_DATA_RATE));
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001064
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001065 /* Command Code */
1066 UINT8_TO_STREAM(p, I93_CMD_LOCK_AFI);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001067
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001068 /* Parameters */
1069 ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001070
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001071 if (rw_i93_send_to_lower(p_cmd)) {
1072 rw_cb.tcb.i93.sent_cmd = I93_CMD_LOCK_AFI;
1073 return NFC_STATUS_OK;
1074 } else {
1075 return NFC_STATUS_FAILED;
1076 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001077}
1078
1079/*******************************************************************************
1080**
1081** Function rw_i93_send_cmd_write_dsfid
1082**
1083** Description Send Write DSFID Request to VICC
1084**
1085** Returns tNFC_STATUS
1086**
1087*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001088tNFC_STATUS rw_i93_send_cmd_write_dsfid(uint8_t dsfid) {
1089 NFC_HDR* p_cmd;
1090 uint8_t* p;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001091
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001092 RW_TRACE_DEBUG0("rw_i93_send_cmd_write_dsfid ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001093
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001094 p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001095
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001096 if (!p_cmd) {
1097 RW_TRACE_ERROR0("rw_i93_send_cmd_write_dsfid (): Cannot allocate buffer");
1098 return NFC_STATUS_NO_BUFFERS;
1099 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001100
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001101 p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
1102 p_cmd->len = 11;
1103 p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001104
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001105 /* Flags */
1106 UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
1107 RW_I93_FLAG_DATA_RATE));
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001108
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001109 /* Command Code */
1110 UINT8_TO_STREAM(p, I93_CMD_WRITE_DSFID);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001111
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001112 /* Parameters */
1113 ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
1114 UINT8_TO_STREAM(p, dsfid); /* DSFID */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001115
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001116 if (rw_i93_send_to_lower(p_cmd)) {
1117 rw_cb.tcb.i93.sent_cmd = I93_CMD_WRITE_DSFID;
1118 return NFC_STATUS_OK;
1119 } else {
1120 return NFC_STATUS_FAILED;
1121 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001122}
1123
1124/*******************************************************************************
1125**
1126** Function rw_i93_send_cmd_lock_dsfid
1127**
1128** Description Send Lock DSFID Request to VICC
1129**
1130** Returns tNFC_STATUS
1131**
1132*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001133tNFC_STATUS rw_i93_send_cmd_lock_dsfid(void) {
1134 NFC_HDR* p_cmd;
1135 uint8_t* p;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001136
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001137 RW_TRACE_DEBUG0("rw_i93_send_cmd_lock_dsfid ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001138
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001139 p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001140
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001141 if (!p_cmd) {
1142 RW_TRACE_ERROR0("rw_i93_send_cmd_lock_dsfid (): Cannot allocate buffer");
1143 return NFC_STATUS_NO_BUFFERS;
1144 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001145
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001146 p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
1147 p_cmd->len = 10;
1148 p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001149
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001150 /* Flags */
1151 UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
1152 RW_I93_FLAG_DATA_RATE));
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001153
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001154 /* Command Code */
1155 UINT8_TO_STREAM(p, I93_CMD_LOCK_DSFID);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001156
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001157 /* Parameters */
1158 ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001159
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001160 if (rw_i93_send_to_lower(p_cmd)) {
1161 rw_cb.tcb.i93.sent_cmd = I93_CMD_LOCK_DSFID;
1162 return NFC_STATUS_OK;
1163 } else {
1164 return NFC_STATUS_FAILED;
1165 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001166}
1167
1168/*******************************************************************************
1169**
1170** Function rw_i93_send_cmd_get_sys_info
1171**
1172** Description Send Get System Information Request to VICC
1173**
1174** Returns tNFC_STATUS
1175**
1176*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001177tNFC_STATUS rw_i93_send_cmd_get_sys_info(uint8_t* p_uid, uint8_t extra_flags) {
1178 NFC_HDR* p_cmd;
1179 uint8_t* p;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001180
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001181 RW_TRACE_DEBUG0("rw_i93_send_cmd_get_sys_info ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001182
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001183 p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001184
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001185 if (!p_cmd) {
1186 RW_TRACE_ERROR0("rw_i93_send_cmd_get_sys_info (): Cannot allocate buffer");
1187 return NFC_STATUS_NO_BUFFERS;
1188 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001189
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001190 p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
1191 p_cmd->len = 10;
1192 p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001193
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001194 /* Flags */
1195 UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
1196 RW_I93_FLAG_DATA_RATE | extra_flags));
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001197
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001198 /* Command Code */
1199 UINT8_TO_STREAM(p, I93_CMD_GET_SYS_INFO);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001200
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001201 /* Parameters */
1202 if (p_uid) {
1203 ARRAY8_TO_STREAM(p, p_uid); /* UID */
1204 } else {
1205 ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
1206 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001207
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001208 if (rw_i93_send_to_lower(p_cmd)) {
1209 rw_cb.tcb.i93.sent_cmd = I93_CMD_GET_SYS_INFO;
1210 return NFC_STATUS_OK;
1211 } else {
1212 return NFC_STATUS_FAILED;
1213 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001214}
1215
1216/*******************************************************************************
1217**
1218** Function rw_i93_send_cmd_get_multi_block_sec
1219**
1220** Description Send Get Multiple Block Security Status Request to VICC
1221**
1222** Returns tNFC_STATUS
1223**
1224*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001225tNFC_STATUS rw_i93_send_cmd_get_multi_block_sec(uint16_t first_block_number,
1226 uint16_t number_blocks) {
1227 NFC_HDR* p_cmd;
1228 uint8_t *p, flags;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001229
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001230 RW_TRACE_DEBUG0("rw_i93_send_cmd_get_multi_block_sec ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001231
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001232 p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001233
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001234 if (!p_cmd) {
1235 RW_TRACE_ERROR0(
1236 "rw_i93_send_cmd_get_multi_block_sec (): Cannot allocate buffer");
1237 return NFC_STATUS_NO_BUFFERS;
1238 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001239
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001240 p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
1241 p_cmd->len = 12;
1242 p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001243
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001244 /* Flags */
1245 flags =
1246 (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE);
Evan Chu85b7e842013-01-18 11:02:50 -05001247
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001248 if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK)
1249 flags |= I93_FLAG_PROT_EXT_YES;
Evan Chu85b7e842013-01-18 11:02:50 -05001250
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001251 UINT8_TO_STREAM(p, flags);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001252
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001253 /* Command Code */
1254 UINT8_TO_STREAM(p, I93_CMD_GET_MULTI_BLK_SEC);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001255
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001256 /* Parameters */
1257 ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
Evan Chu85b7e842013-01-18 11:02:50 -05001258
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001259 if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK) {
1260 UINT16_TO_STREAM(p, first_block_number); /* First block number */
1261 UINT16_TO_STREAM(
1262 p, number_blocks - 1); /* Number of blocks, 0x00 to read one block */
1263 p_cmd->len += 2;
1264 } else {
1265 UINT8_TO_STREAM(p, first_block_number); /* First block number */
1266 UINT8_TO_STREAM(
1267 p, number_blocks - 1); /* Number of blocks, 0x00 to read one block */
1268 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001269
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001270 if (rw_i93_send_to_lower(p_cmd)) {
1271 rw_cb.tcb.i93.sent_cmd = I93_CMD_GET_MULTI_BLK_SEC;
1272 return NFC_STATUS_OK;
1273 } else {
1274 return NFC_STATUS_FAILED;
1275 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001276}
1277
1278/*******************************************************************************
1279**
1280** Function rw_i93_get_next_blocks
1281**
Ruchi Kandoi552f2b72017-01-28 16:22:55 -08001282** Description Read as many blocks as possible (up to
1283** RW_I93_READ_MULTI_BLOCK_SIZE)
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001284**
1285** Returns tNFC_STATUS
1286**
1287*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001288tNFC_STATUS rw_i93_get_next_blocks(uint16_t offset) {
1289 tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
1290 uint16_t first_block;
1291 uint16_t num_block;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001292
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001293 RW_TRACE_DEBUG0("rw_i93_get_next_blocks ()");
Evan Chu85b7e842013-01-18 11:02:50 -05001294
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001295 first_block = offset / p_i93->block_size;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001296
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001297 /* more blocks, more efficent but more error rate */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001298
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001299 if (p_i93->intl_flags & RW_I93_FLAG_READ_MULTI_BLOCK) {
1300 num_block = RW_I93_READ_MULTI_BLOCK_SIZE / p_i93->block_size;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001301
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001302 if (num_block + first_block > p_i93->num_block)
1303 num_block = p_i93->num_block - first_block;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001304
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001305 if (p_i93->uid[1] == I93_UID_IC_MFG_CODE_STM) {
1306 /* LRIS64K, M24LR64-R, M24LR04E-R, M24LR16E-R, M24LR64E-R requires
1307 ** - The max number of blocks is 32 and they are all located in the
1308 ** same sector.
1309 ** - The sector is 32 blocks of 4 bytes.
1310 */
1311 if ((p_i93->product_version == RW_I93_STM_LRIS64K) ||
1312 (p_i93->product_version == RW_I93_STM_M24LR64_R) ||
1313 (p_i93->product_version == RW_I93_STM_M24LR04E_R) ||
1314 (p_i93->product_version == RW_I93_STM_M24LR16E_R) ||
1315 (p_i93->product_version == RW_I93_STM_M24LR64E_R)) {
1316 if (num_block > I93_STM_MAX_BLOCKS_PER_READ)
1317 num_block = I93_STM_MAX_BLOCKS_PER_READ;
Evan Chu85b7e842013-01-18 11:02:50 -05001318
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001319 if ((first_block / I93_STM_BLOCKS_PER_SECTOR) !=
1320 ((first_block + num_block - 1) / I93_STM_BLOCKS_PER_SECTOR)) {
1321 num_block = I93_STM_BLOCKS_PER_SECTOR -
1322 (first_block % I93_STM_BLOCKS_PER_SECTOR);
Evan Chu85b7e842013-01-18 11:02:50 -05001323 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001324 }
1325 }
Evan Chu85b7e842013-01-18 11:02:50 -05001326
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001327 return rw_i93_send_cmd_read_multi_blocks(first_block, num_block);
1328 } else {
1329 return rw_i93_send_cmd_read_single_block(first_block, false);
1330 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001331}
1332
1333/*******************************************************************************
1334**
Evan Chu85b7e842013-01-18 11:02:50 -05001335** Function rw_i93_get_next_block_sec
1336**
Ruchi Kandoi552f2b72017-01-28 16:22:55 -08001337** Description Get as many security of blocks as possible from
1338** p_i93->rw_offset (up to RW_I93_GET_MULTI_BLOCK_SEC_SIZE)
Evan Chu85b7e842013-01-18 11:02:50 -05001339**
1340** Returns tNFC_STATUS
1341**
1342*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001343tNFC_STATUS rw_i93_get_next_block_sec(void) {
1344 tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
1345 uint16_t num_blocks;
Evan Chu85b7e842013-01-18 11:02:50 -05001346
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001347 RW_TRACE_DEBUG0("rw_i93_get_next_block_sec ()");
Evan Chu85b7e842013-01-18 11:02:50 -05001348
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001349 if (p_i93->num_block <= p_i93->rw_offset) {
1350 RW_TRACE_ERROR2("rw_offset(0x%x) must be less than num_block(0x%x)",
1351 p_i93->rw_offset, p_i93->num_block);
1352 return NFC_STATUS_FAILED;
1353 }
Evan Chu85b7e842013-01-18 11:02:50 -05001354
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001355 num_blocks = p_i93->num_block - p_i93->rw_offset;
Evan Chu85b7e842013-01-18 11:02:50 -05001356
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001357 if (num_blocks > RW_I93_GET_MULTI_BLOCK_SEC_SIZE)
1358 num_blocks = RW_I93_GET_MULTI_BLOCK_SEC_SIZE;
Evan Chu85b7e842013-01-18 11:02:50 -05001359
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001360 return rw_i93_send_cmd_get_multi_block_sec(p_i93->rw_offset, num_blocks);
Evan Chu85b7e842013-01-18 11:02:50 -05001361}
1362
1363/*******************************************************************************
1364**
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001365** Function rw_i93_sm_detect_ndef
1366**
1367** Description Process NDEF detection procedure
1368**
1369** 1. Get UID if not having yet
1370** 2. Get System Info if not having yet
1371** 3. Read first block for CC
1372** 4. Search NDEF Type and length
Ruchi Kandoi552f2b72017-01-28 16:22:55 -08001373** 5. Get block status to get max NDEF size and read-only
1374** status
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001375**
1376** Returns void
1377**
1378*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001379void rw_i93_sm_detect_ndef(NFC_HDR* p_resp) {
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07001380 uint8_t *p = (uint8_t*)(p_resp + 1) + p_resp->offset, *p_uid;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001381 uint8_t flags, u8 = 0, cc[4];
1382 uint16_t length = p_resp->len, xx, block, first_block, last_block, num_blocks;
1383 tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
1384 tRW_DATA rw_data;
1385 tNFC_STATUS status = NFC_STATUS_FAILED;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001386
1387#if (BT_TRACE_VERBOSE == TRUE)
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001388 RW_TRACE_DEBUG2("rw_i93_sm_detect_ndef () sub_state:%s (0x%x)",
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07001389 rw_i93_get_sub_state_name(p_i93->sub_state).c_str(),
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001390 p_i93->sub_state);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001391#else
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001392 RW_TRACE_DEBUG1("rw_i93_sm_detect_ndef () sub_state:0x%x", p_i93->sub_state);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001393#endif
1394
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001395 STREAM_TO_UINT8(flags, p);
1396 length--;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001397
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001398 if (flags & I93_FLAG_ERROR_DETECTED) {
1399 if ((length) && (rw_i93_check_sys_info_prot_ext(*p))) {
1400 /* getting system info with protocol extension flag */
1401 /* This STM tag supports more than 2040 bytes */
1402 p_i93->intl_flags |= RW_I93_FLAG_16BIT_NUM_BLOCK;
1403 } else {
1404 RW_TRACE_DEBUG1("Got error flags (0x%02x)", flags);
1405 rw_i93_handle_error(NFC_STATUS_FAILED);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001406 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001407 return;
1408 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001409
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001410 switch (p_i93->sub_state) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001411 case RW_I93_SUBSTATE_WAIT_UID:
1412
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001413 STREAM_TO_UINT8(u8, p); /* DSFID */
1414 p_uid = p_i93->uid;
1415 STREAM_TO_ARRAY8(p_uid, p);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001416
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001417 if (u8 != I93_DFS_UNSUPPORTED) {
1418 /* if Data Storage Format is unknown */
1419 RW_TRACE_DEBUG1("Got unknown DSFID (0x%02x)", u8);
1420 rw_i93_handle_error(NFC_STATUS_FAILED);
1421 } else {
1422 /* get system information to get memory size */
1423 if (rw_i93_send_cmd_get_sys_info(NULL, I93_FLAG_PROT_EXT_NO) ==
1424 NFC_STATUS_OK) {
1425 p_i93->sub_state = RW_I93_SUBSTATE_WAIT_SYS_INFO;
1426 } else {
1427 rw_i93_handle_error(NFC_STATUS_FAILED);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001428 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001429 }
1430 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001431
1432 case RW_I93_SUBSTATE_WAIT_SYS_INFO:
1433
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001434 p_i93->block_size = 0;
1435 p_i93->num_block = 0;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001436
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001437 if (!rw_i93_process_sys_info(p)) {
1438 /* retrying with protocol extension flag */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001439 break;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001440 }
1441
1442 if ((p_i93->block_size == 0) || (p_i93->num_block == 0)) {
1443 RW_TRACE_DEBUG0("Unable to get tag memory size");
1444 rw_i93_handle_error(status);
1445 } else {
1446 /* read CC in the first block */
1447 if (rw_i93_send_cmd_read_single_block(0x0000, false) == NFC_STATUS_OK) {
1448 p_i93->sub_state = RW_I93_SUBSTATE_WAIT_CC;
1449 } else {
1450 rw_i93_handle_error(NFC_STATUS_FAILED);
1451 }
1452 }
1453 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001454
1455 case RW_I93_SUBSTATE_WAIT_CC:
1456
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001457 /* assume block size is more than 4 */
1458 STREAM_TO_ARRAY(cc, p, 4);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001459
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001460 status = NFC_STATUS_FAILED;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001461
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001462 /*
1463 ** Capability Container (CC)
1464 **
1465 ** CC[0] : magic number (0xE1)
1466 ** CC[1] : Bit 7-6:Major version number
1467 ** : Bit 5-4:Minor version number
1468 ** : Bit 3-2:Read access condition (00b: read access granted
1469 ** without any security)
1470 ** : Bit 1-0:Write access condition (00b: write access granted
1471 ** without any security)
1472 ** CC[2] : Memory size in 8 bytes (Ex. 0x04 is 32 bytes) [STM, set to
1473 ** 0xFF if more than 2040bytes]
1474 ** CC[3] : Bit 0:Read multiple blocks is supported [NXP, STM]
1475 ** : Bit 1:Inventory page read is supported [NXP]
1476 ** : Bit 2:More than 2040 bytes are supported [STM]
1477 */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001478
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001479 RW_TRACE_DEBUG4(
1480 "rw_i93_sm_detect_ndef (): cc: 0x%02X 0x%02X 0x%02X 0x%02X", cc[0],
1481 cc[1], cc[2], cc[3]);
1482 RW_TRACE_DEBUG2(
1483 "rw_i93_sm_detect_ndef (): Total blocks:0x%04X, Block size:0x%02X",
1484 p_i93->num_block, p_i93->block_size);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001485
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001486 if ((cc[0] == I93_ICODE_CC_MAGIC_NUMER) &&
1487 ((cc[3] & I93_STM_CC_OVERFLOW_MASK) ||
1488 (cc[2] * 8) == (p_i93->num_block * p_i93->block_size))) {
1489 if ((cc[1] & I93_ICODE_CC_READ_ACCESS_MASK) ==
1490 I93_ICODE_CC_READ_ACCESS_GRANTED) {
1491 if ((cc[1] & I93_ICODE_CC_WRITE_ACCESS_MASK) !=
1492 I93_ICODE_CC_WRITE_ACCESS_GRANTED) {
1493 /* read-only or password required to write */
1494 p_i93->intl_flags |= RW_I93_FLAG_READ_ONLY;
1495 }
1496 if (cc[3] & I93_ICODE_CC_MBREAD_MASK) {
1497 /* tag supports read multi blocks command */
1498 p_i93->intl_flags |= RW_I93_FLAG_READ_MULTI_BLOCK;
1499 }
1500 status = NFC_STATUS_OK;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001501 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001502 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001503
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001504 if (status == NFC_STATUS_OK) {
1505 /* seach NDEF TLV from offset 4 when CC file coded on 4 bytes NFC Forum
1506 */
1507 if (cc[2] != 0)
1508 p_i93->rw_offset = 4;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001509 else
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001510 p_i93->rw_offset = 8;
1511
1512 if (rw_i93_get_next_blocks(p_i93->rw_offset) == NFC_STATUS_OK) {
1513 p_i93->sub_state = RW_I93_SUBSTATE_SEARCH_NDEF_TLV;
1514 p_i93->tlv_detect_state = RW_I93_TLV_DETECT_STATE_TYPE;
1515 } else {
1516 rw_i93_handle_error(NFC_STATUS_FAILED);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001517 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001518 } else {
1519 rw_i93_handle_error(NFC_STATUS_FAILED);
1520 }
1521 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001522
1523 case RW_I93_SUBSTATE_SEARCH_NDEF_TLV:
1524
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001525 /* search TLV within read blocks */
1526 for (xx = 0; xx < length; xx++) {
1527 /* if looking for type */
1528 if (p_i93->tlv_detect_state == RW_I93_TLV_DETECT_STATE_TYPE) {
1529 if (*(p + xx) == I93_ICODE_TLV_TYPE_NULL) {
1530 continue;
1531 } else if ((*(p + xx) == I93_ICODE_TLV_TYPE_NDEF) ||
1532 (*(p + xx) == I93_ICODE_TLV_TYPE_PROP)) {
1533 /* store found type and get length field */
1534 p_i93->tlv_type = *(p + xx);
1535 p_i93->ndef_tlv_start_offset = p_i93->rw_offset + xx;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001536
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001537 p_i93->tlv_detect_state = RW_I93_TLV_DETECT_STATE_LENGTH_1;
1538 } else if (*(p + xx) == I93_ICODE_TLV_TYPE_TERM) {
1539 /* no NDEF TLV found */
1540 p_i93->tlv_type = I93_ICODE_TLV_TYPE_TERM;
1541 break;
1542 } else {
1543 RW_TRACE_DEBUG1("Invalid type: 0x%02x", *(p + xx));
1544 rw_i93_handle_error(NFC_STATUS_FAILED);
1545 return;
1546 }
1547 } else if (p_i93->tlv_detect_state ==
1548 RW_I93_TLV_DETECT_STATE_LENGTH_1) {
1549 /* if 3 bytes length field */
1550 if (*(p + xx) == 0xFF) {
1551 /* need 2 more bytes for length field */
1552 p_i93->tlv_detect_state = RW_I93_TLV_DETECT_STATE_LENGTH_2;
1553 } else {
1554 p_i93->tlv_length = *(p + xx);
1555 p_i93->tlv_detect_state = RW_I93_TLV_DETECT_STATE_VALUE;
1556
1557 if (p_i93->tlv_type == I93_ICODE_TLV_TYPE_NDEF) {
1558 p_i93->ndef_tlv_last_offset =
1559 p_i93->ndef_tlv_start_offset + 1 + p_i93->tlv_length;
1560 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001561 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001562 }
1563 } else if (p_i93->tlv_detect_state ==
1564 RW_I93_TLV_DETECT_STATE_LENGTH_2) {
1565 /* the second byte of 3 bytes length field */
1566 p_i93->tlv_length = *(p + xx);
1567 p_i93->tlv_detect_state = RW_I93_TLV_DETECT_STATE_LENGTH_3;
1568 } else if (p_i93->tlv_detect_state ==
1569 RW_I93_TLV_DETECT_STATE_LENGTH_3) {
1570 /* the last byte of 3 bytes length field */
1571 p_i93->tlv_length = (p_i93->tlv_length << 8) + *(p + xx);
1572 p_i93->tlv_detect_state = RW_I93_TLV_DETECT_STATE_VALUE;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001573
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001574 if (p_i93->tlv_type == I93_ICODE_TLV_TYPE_NDEF) {
1575 p_i93->ndef_tlv_last_offset =
1576 p_i93->ndef_tlv_start_offset + 3 + p_i93->tlv_length;
1577 break;
1578 }
1579 } else if (p_i93->tlv_detect_state == RW_I93_TLV_DETECT_STATE_VALUE) {
1580 /* this is other than NDEF TLV */
1581 if (p_i93->tlv_length <= length - xx) {
1582 /* skip value field */
1583 xx += (uint8_t)p_i93->tlv_length;
1584 p_i93->tlv_detect_state = RW_I93_TLV_DETECT_STATE_TYPE;
1585 } else {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001586 /* read more data */
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001587 p_i93->tlv_length -= (length - xx);
1588 break;
1589 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001590 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001591 }
1592
1593 /* found NDEF TLV and read length field */
1594 if ((p_i93->tlv_type == I93_ICODE_TLV_TYPE_NDEF) &&
1595 (p_i93->tlv_detect_state == RW_I93_TLV_DETECT_STATE_VALUE)) {
1596 p_i93->ndef_length = p_i93->tlv_length;
1597
1598 /* get lock status to see if read-only */
1599 if ((p_i93->product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) ||
1600 (p_i93->product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY) ||
1601 ((p_i93->uid[1] == I93_UID_IC_MFG_CODE_NXP) &&
1602 (p_i93->ic_reference & I93_ICODE_IC_REF_MBREAD_MASK))) {
1603 /* these doesn't support GetMultiBlockSecurityStatus */
1604
1605 p_i93->rw_offset = p_i93->ndef_tlv_start_offset;
1606 first_block = p_i93->ndef_tlv_start_offset / p_i93->block_size;
1607
1608 /* read block to get lock status */
1609 rw_i93_send_cmd_read_single_block(first_block, true);
1610 p_i93->sub_state = RW_I93_SUBSTATE_CHECK_LOCK_STATUS;
1611 } else {
1612 /* block offset for read-only check */
1613 p_i93->rw_offset = 0;
1614
1615 if (rw_i93_get_next_block_sec() == NFC_STATUS_OK) {
1616 p_i93->sub_state = RW_I93_SUBSTATE_CHECK_LOCK_STATUS;
1617 } else {
1618 rw_i93_handle_error(NFC_STATUS_FAILED);
1619 }
1620 }
1621 } else {
1622 /* read more data */
1623 p_i93->rw_offset += length;
1624
1625 if (p_i93->rw_offset >= p_i93->block_size * p_i93->num_block) {
1626 rw_i93_handle_error(NFC_STATUS_FAILED);
1627 } else if (rw_i93_get_next_blocks(p_i93->rw_offset) == NFC_STATUS_OK) {
1628 p_i93->sub_state = RW_I93_SUBSTATE_SEARCH_NDEF_TLV;
1629 } else {
1630 rw_i93_handle_error(NFC_STATUS_FAILED);
1631 }
1632 }
1633 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001634
1635 case RW_I93_SUBSTATE_CHECK_LOCK_STATUS:
1636
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001637 if ((p_i93->product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) ||
1638 (p_i93->product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY) ||
1639 ((p_i93->uid[1] == I93_UID_IC_MFG_CODE_NXP) &&
1640 (p_i93->ic_reference & I93_ICODE_IC_REF_MBREAD_MASK))) {
1641 /* these doesn't support GetMultiBlockSecurityStatus */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001642
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001643 block = (p_i93->rw_offset / p_i93->block_size);
1644 last_block = (p_i93->ndef_tlv_last_offset / p_i93->block_size);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001645
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001646 if ((*p) & I93_BLOCK_LOCKED) {
1647 if (block <= last_block) {
1648 p_i93->intl_flags |= RW_I93_FLAG_READ_ONLY;
1649 }
1650 } else {
1651 /* if we need to check more user blocks */
1652 if (block + 1 < p_i93->num_block) {
1653 p_i93->rw_offset += p_i93->block_size;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001654
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001655 /* read block to get lock status */
1656 rw_i93_send_cmd_read_single_block(
1657 (uint16_t)(p_i93->rw_offset / p_i93->block_size), true);
1658 break;
1659 }
Evan Chu85b7e842013-01-18 11:02:50 -05001660 }
1661
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001662 p_i93->max_ndef_length =
1663 p_i93->ndef_length
1664 /* add available bytes including the last block of NDEF TLV */
1665 + (p_i93->block_size * (block - last_block) + 1) -
1666 (p_i93->ndef_tlv_last_offset % p_i93->block_size) - 1;
1667 } else {
1668 if (p_i93->rw_offset == 0) {
1669 p_i93->max_ndef_length =
1670 p_i93->ndef_length
1671 /* add available bytes in the last block of NDEF TLV */
1672 + p_i93->block_size -
1673 (p_i93->ndef_tlv_last_offset % p_i93->block_size) - 1;
1674
1675 first_block = (p_i93->ndef_tlv_start_offset / p_i93->block_size);
1676 } else {
1677 first_block = 0;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001678 }
1679
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001680 last_block = (p_i93->ndef_tlv_last_offset / p_i93->block_size);
1681 num_blocks = length;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001682
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001683 for (block = first_block; block < num_blocks; block++) {
1684 /* if any block of NDEF TLV is locked */
1685 if ((block + p_i93->rw_offset) <= last_block) {
1686 if (*(p + block) & I93_BLOCK_LOCKED) {
1687 p_i93->intl_flags |= RW_I93_FLAG_READ_ONLY;
1688 break;
1689 }
1690 } else {
1691 if (*(p + block) & I93_BLOCK_LOCKED) {
1692 /* no more consecutive unlocked block */
1693 break;
1694 } else {
1695 /* add block size if not locked */
1696 p_i93->max_ndef_length += p_i93->block_size;
1697 }
1698 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001699 }
1700
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001701 /* update next security of block to check */
1702 p_i93->rw_offset += num_blocks;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001703
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001704 /* if need to check more */
1705 if (p_i93->num_block > p_i93->rw_offset) {
1706 if (rw_i93_get_next_block_sec() != NFC_STATUS_OK) {
1707 rw_i93_handle_error(NFC_STATUS_FAILED);
1708 }
1709 break;
1710 }
1711 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001712
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001713 /* check if need to adjust max NDEF length */
1714 if ((p_i93->ndef_length < 0xFF) && (p_i93->max_ndef_length >= 0xFF)) {
1715 /* 3 bytes length field must be used */
1716 p_i93->max_ndef_length -= 2;
1717 }
1718
1719 rw_data.ndef.status = NFC_STATUS_OK;
Love Khanna57a3dfa2017-03-28 20:03:38 +05301720 rw_data.ndef.protocol = NFC_PROTOCOL_T5T;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001721 rw_data.ndef.flags = 0;
1722 rw_data.ndef.flags |= RW_NDEF_FL_SUPPORTED;
1723 rw_data.ndef.flags |= RW_NDEF_FL_FORMATED;
1724 rw_data.ndef.flags |= RW_NDEF_FL_FORMATABLE;
1725 rw_data.ndef.cur_size = p_i93->ndef_length;
1726
1727 if (p_i93->intl_flags & RW_I93_FLAG_READ_ONLY) {
1728 rw_data.ndef.flags |= RW_NDEF_FL_READ_ONLY;
1729 rw_data.ndef.max_size = p_i93->ndef_length;
1730 } else {
1731 rw_data.ndef.flags |= RW_NDEF_FL_HARD_LOCKABLE;
1732 rw_data.ndef.max_size = p_i93->max_ndef_length;
1733 }
1734
1735 p_i93->state = RW_I93_STATE_IDLE;
1736 p_i93->sent_cmd = 0;
1737
1738 RW_TRACE_DEBUG3("NDEF cur_size(%d),max_size (%d), flags (0x%x)",
1739 rw_data.ndef.cur_size, rw_data.ndef.max_size,
1740 rw_data.ndef.flags);
1741
1742 (*(rw_cb.p_cback))(RW_I93_NDEF_DETECT_EVT, &rw_data);
1743 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001744
1745 default:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001746 break;
1747 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001748}
1749
1750/*******************************************************************************
1751**
1752** Function rw_i93_sm_read_ndef
1753**
1754** Description Process NDEF read procedure
1755**
1756** Returns void
1757**
1758*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001759void rw_i93_sm_read_ndef(NFC_HDR* p_resp) {
1760 uint8_t* p = (uint8_t*)(p_resp + 1) + p_resp->offset;
1761 uint8_t flags;
1762 uint16_t offset, length = p_resp->len;
1763 tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
1764 tRW_DATA rw_data;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001765
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001766 RW_TRACE_DEBUG0("rw_i93_sm_read_ndef ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001767
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001768 STREAM_TO_UINT8(flags, p);
1769 length--;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001770
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001771 if (flags & I93_FLAG_ERROR_DETECTED) {
1772 RW_TRACE_DEBUG1("Got error flags (0x%02x)", flags);
1773 rw_i93_handle_error(NFC_STATUS_FAILED);
1774 return;
1775 }
1776
1777 /* if this is the first block */
1778 if (p_i93->rw_length == 0) {
1779 /* get start of NDEF in the first block */
1780 offset = p_i93->ndef_tlv_start_offset % p_i93->block_size;
1781
1782 if (p_i93->ndef_length < 0xFF) {
1783 offset += 2;
1784 } else {
1785 offset += 4;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001786 }
1787
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001788 /* adjust offset if read more blocks because the first block doesn't have
1789 * NDEF */
1790 offset -= (p_i93->rw_offset - p_i93->ndef_tlv_start_offset);
1791 } else {
1792 offset = 0;
1793 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001794
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001795 /* if read enough data to skip type and length field for the beginning */
1796 if (offset < length) {
1797 offset++; /* flags */
1798 p_resp->offset += offset;
1799 p_resp->len -= offset;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001800
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001801 rw_data.data.status = NFC_STATUS_OK;
1802 rw_data.data.p_data = p_resp;
1803
1804 p_i93->rw_length += p_resp->len;
1805 } else {
1806 /* in case of no Ndef data included */
1807 p_resp->len = 0;
1808 }
1809
1810 /* if read all of NDEF data */
1811 if (p_i93->rw_length >= p_i93->ndef_length) {
1812 /* remove extra btyes in the last block */
1813 p_resp->len -= (p_i93->rw_length - p_i93->ndef_length);
1814
1815 p_i93->state = RW_I93_STATE_IDLE;
1816 p_i93->sent_cmd = 0;
1817
1818 RW_TRACE_DEBUG2("NDEF read complete read (%d)/total (%d)", p_resp->len,
1819 p_i93->ndef_length);
1820
1821 (*(rw_cb.p_cback))(RW_I93_NDEF_READ_CPLT_EVT, &rw_data);
1822 } else {
1823 RW_TRACE_DEBUG2("NDEF read segment read (%d)/total (%d)", p_resp->len,
1824 p_i93->ndef_length);
1825
1826 if (p_resp->len > 0) {
1827 (*(rw_cb.p_cback))(RW_I93_NDEF_READ_EVT, &rw_data);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001828 }
1829
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001830 /* this will make read data from next block */
1831 p_i93->rw_offset += length;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001832
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001833 if (rw_i93_get_next_blocks(p_i93->rw_offset) != NFC_STATUS_OK) {
1834 rw_i93_handle_error(NFC_STATUS_FAILED);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001835 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001836 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001837}
1838
1839/*******************************************************************************
1840**
1841** Function rw_i93_sm_update_ndef
1842**
1843** Description Process NDEF update procedure
1844**
1845** 1. Set length field to zero
1846** 2. Write NDEF and Terminator TLV
1847** 3. Set length field to NDEF length
1848**
1849** Returns void
1850**
1851*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001852void rw_i93_sm_update_ndef(NFC_HDR* p_resp) {
1853 uint8_t* p = (uint8_t*)(p_resp + 1) + p_resp->offset;
1854 uint8_t flags, xx, length_offset, buff[I93_MAX_BLOCK_LENGH];
1855 uint16_t length = p_resp->len, block_number;
1856 tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
1857 tRW_DATA rw_data;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001858
1859#if (BT_TRACE_VERBOSE == TRUE)
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001860 RW_TRACE_DEBUG2("rw_i93_sm_update_ndef () sub_state:%s (0x%x)",
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07001861 rw_i93_get_sub_state_name(p_i93->sub_state).c_str(),
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001862 p_i93->sub_state);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001863#else
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001864 RW_TRACE_DEBUG1("rw_i93_sm_update_ndef () sub_state:0x%x", p_i93->sub_state);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001865#endif
1866
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001867 STREAM_TO_UINT8(flags, p);
1868 length--;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001869
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001870 if (flags & I93_FLAG_ERROR_DETECTED) {
1871 if (((p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_INLAY) ||
1872 (p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_CHIP) ||
1873 (p_i93->product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) ||
1874 (p_i93->product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY)) &&
1875 (*p == I93_ERROR_CODE_BLOCK_FAIL_TO_WRITE)) {
1876 /* ignore error */
1877 } else {
1878 RW_TRACE_DEBUG1("Got error flags (0x%02x)", flags);
1879 rw_i93_handle_error(NFC_STATUS_FAILED);
1880 return;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001881 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001882 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001883
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001884 switch (p_i93->sub_state) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001885 case RW_I93_SUBSTATE_RESET_LEN:
1886
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001887 /* get offset of length field */
1888 length_offset = (p_i93->ndef_tlv_start_offset + 1) % p_i93->block_size;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001889
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001890 /* set length to zero */
1891 *(p + length_offset) = 0x00;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001892
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001893 if (p_i93->ndef_length > 0) {
1894 /* if 3 bytes length field is needed */
1895 if (p_i93->ndef_length >= 0xFF) {
1896 xx = length_offset + 3;
1897 } else {
1898 xx = length_offset + 1;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001899 }
1900
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001901 /* write the first part of NDEF in the same block */
1902 for (; xx < p_i93->block_size; xx++) {
1903 if (p_i93->rw_length < p_i93->ndef_length) {
1904 *(p + xx) = *(p_i93->p_update_data + p_i93->rw_length++);
1905 } else {
1906 *(p + xx) = I93_ICODE_TLV_TYPE_NULL;
1907 }
1908 }
1909 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001910
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001911 block_number = (p_i93->ndef_tlv_start_offset + 1) / p_i93->block_size;
1912
1913 if (rw_i93_send_cmd_write_single_block(block_number, p) ==
1914 NFC_STATUS_OK) {
1915 /* update next writing offset */
1916 p_i93->rw_offset = (block_number + 1) * p_i93->block_size;
1917 p_i93->sub_state = RW_I93_SUBSTATE_WRITE_NDEF;
1918 } else {
1919 rw_i93_handle_error(NFC_STATUS_FAILED);
1920 }
1921 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001922
1923 case RW_I93_SUBSTATE_WRITE_NDEF:
1924
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001925 /* if it's not the end of tag memory */
1926 if (p_i93->rw_offset < p_i93->block_size * p_i93->num_block) {
1927 block_number = p_i93->rw_offset / p_i93->block_size;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001928
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001929 /* if we have more data to write */
1930 if (p_i93->rw_length < p_i93->ndef_length) {
1931 p = p_i93->p_update_data + p_i93->rw_length;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001932
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001933 p_i93->rw_offset += p_i93->block_size;
1934 p_i93->rw_length += p_i93->block_size;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001935
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001936 /* if this is the last block of NDEF TLV */
1937 if (p_i93->rw_length > p_i93->ndef_length) {
1938 /* length of NDEF TLV in the block */
1939 xx = (uint8_t)(p_i93->block_size -
1940 (p_i93->rw_length - p_i93->ndef_length));
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001941
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001942 /* set NULL TLV in the unused part of block */
1943 memset(buff, I93_ICODE_TLV_TYPE_NULL, p_i93->block_size);
1944 memcpy(buff, p, xx);
1945 p = buff;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001946
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001947 /* if it's the end of tag memory */
1948 if ((p_i93->rw_offset >= p_i93->block_size * p_i93->num_block) &&
1949 (xx < p_i93->block_size)) {
1950 buff[xx] = I93_ICODE_TLV_TYPE_TERM;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001951 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001952
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001953 p_i93->ndef_tlv_last_offset =
1954 p_i93->rw_offset - p_i93->block_size + xx - 1;
1955 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001956
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001957 if (rw_i93_send_cmd_write_single_block(block_number, p) !=
1958 NFC_STATUS_OK) {
1959 rw_i93_handle_error(NFC_STATUS_FAILED);
1960 }
1961 } else {
1962 /* if this is the very next block of NDEF TLV */
1963 if (block_number ==
1964 (p_i93->ndef_tlv_last_offset / p_i93->block_size) + 1) {
1965 p_i93->rw_offset += p_i93->block_size;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001966
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001967 /* write Terminator TLV and NULL TLV */
1968 memset(buff, I93_ICODE_TLV_TYPE_NULL, p_i93->block_size);
1969 buff[0] = I93_ICODE_TLV_TYPE_TERM;
1970 p = buff;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001971
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001972 if (rw_i93_send_cmd_write_single_block(block_number, p) !=
1973 NFC_STATUS_OK) {
1974 rw_i93_handle_error(NFC_STATUS_FAILED);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08001975 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08001976 } else {
1977 /* finished writing NDEF and Terminator TLV */
1978 /* read length field to update length */
1979 block_number =
1980 (p_i93->ndef_tlv_start_offset + 1) / p_i93->block_size;
1981
1982 if (rw_i93_send_cmd_read_single_block(block_number, false) ==
1983 NFC_STATUS_OK) {
1984 /* set offset to length field */
1985 p_i93->rw_offset = p_i93->ndef_tlv_start_offset + 1;
1986
1987 /* get size of length field */
1988 if (p_i93->ndef_length >= 0xFF) {
1989 p_i93->rw_length = 3;
1990 } else if (p_i93->ndef_length > 0) {
1991 p_i93->rw_length = 1;
1992 } else {
1993 p_i93->rw_length = 0;
1994 }
1995
1996 p_i93->sub_state = RW_I93_SUBSTATE_UPDATE_LEN;
1997 } else {
1998 rw_i93_handle_error(NFC_STATUS_FAILED);
1999 }
2000 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002001 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002002 } else {
2003 /* if we have no more data to write */
2004 if (p_i93->rw_length >= p_i93->ndef_length) {
2005 /* finished writing NDEF and Terminator TLV */
2006 /* read length field to update length */
2007 block_number = (p_i93->ndef_tlv_start_offset + 1) / p_i93->block_size;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002008
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002009 if (rw_i93_send_cmd_read_single_block(block_number, false) ==
2010 NFC_STATUS_OK) {
2011 /* set offset to length field */
2012 p_i93->rw_offset = p_i93->ndef_tlv_start_offset + 1;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002013
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002014 /* get size of length field */
2015 if (p_i93->ndef_length >= 0xFF) {
2016 p_i93->rw_length = 3;
2017 } else if (p_i93->ndef_length > 0) {
2018 p_i93->rw_length = 1;
2019 } else {
2020 p_i93->rw_length = 0;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002021 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002022
2023 p_i93->sub_state = RW_I93_SUBSTATE_UPDATE_LEN;
2024 break;
2025 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002026 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002027 rw_i93_handle_error(NFC_STATUS_FAILED);
2028 }
2029 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002030
2031 case RW_I93_SUBSTATE_UPDATE_LEN:
2032
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002033 /* if we have more length field to write */
2034 if (p_i93->rw_length > 0) {
2035 /* if we got ack for writing, read next block to update rest of length
2036 * field */
2037 if (length == 0) {
2038 block_number = p_i93->rw_offset / p_i93->block_size;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002039
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002040 if (rw_i93_send_cmd_read_single_block(block_number, false) !=
2041 NFC_STATUS_OK) {
2042 rw_i93_handle_error(NFC_STATUS_FAILED);
2043 }
2044 } else {
2045 length_offset = p_i93->rw_offset % p_i93->block_size;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002046
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002047 /* update length field within the read block */
2048 for (xx = length_offset; xx < p_i93->block_size; xx++) {
2049 if (p_i93->rw_length == 3)
2050 *(p + xx) = 0xFF;
2051 else if (p_i93->rw_length == 2)
2052 *(p + xx) = (uint8_t)((p_i93->ndef_length >> 8) & 0xFF);
2053 else if (p_i93->rw_length == 1)
2054 *(p + xx) = (uint8_t)(p_i93->ndef_length & 0xFF);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002055
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002056 p_i93->rw_length--;
2057 if (p_i93->rw_length == 0) break;
2058 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002059
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002060 block_number = (p_i93->rw_offset / p_i93->block_size);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002061
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002062 if (rw_i93_send_cmd_write_single_block(block_number, p) ==
2063 NFC_STATUS_OK) {
2064 /* set offset to the beginning of next block */
2065 p_i93->rw_offset +=
2066 p_i93->block_size - (p_i93->rw_offset % p_i93->block_size);
2067 } else {
2068 rw_i93_handle_error(NFC_STATUS_FAILED);
2069 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002070 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002071 } else {
2072 RW_TRACE_DEBUG3("NDEF update complete, %d bytes, (%d-%d)",
2073 p_i93->ndef_length, p_i93->ndef_tlv_start_offset,
2074 p_i93->ndef_tlv_last_offset);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002075
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002076 p_i93->state = RW_I93_STATE_IDLE;
2077 p_i93->sent_cmd = 0;
2078 p_i93->p_update_data = NULL;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002079
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002080 rw_data.status = NFC_STATUS_OK;
2081 (*(rw_cb.p_cback))(RW_I93_NDEF_UPDATE_CPLT_EVT, &rw_data);
2082 }
2083 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002084
2085 default:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002086 break;
2087 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002088}
2089
2090/*******************************************************************************
2091**
2092** Function rw_i93_sm_format
2093**
2094** Description Process format procedure
2095**
2096** 1. Get UID
2097** 2. Get sys info for memory size (reset AFI/DSFID)
2098** 3. Get block status to get read-only status
2099** 4. Write CC and empty NDEF
2100**
2101** Returns void
2102**
2103*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002104void rw_i93_sm_format(NFC_HDR* p_resp) {
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07002105 uint8_t *p = (uint8_t*)(p_resp + 1) + p_resp->offset, *p_uid;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002106 uint8_t flags;
2107 uint16_t length = p_resp->len, xx, block_number;
2108 tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
2109 tRW_DATA rw_data;
2110 tNFC_STATUS status = NFC_STATUS_FAILED;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002111
2112#if (BT_TRACE_VERBOSE == TRUE)
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002113 RW_TRACE_DEBUG2("rw_i93_sm_format () sub_state:%s (0x%x)",
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07002114 rw_i93_get_sub_state_name(p_i93->sub_state).c_str(),
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002115 p_i93->sub_state);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002116#else
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002117 RW_TRACE_DEBUG1("rw_i93_sm_format () sub_state:0x%x", p_i93->sub_state);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002118#endif
2119
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002120 STREAM_TO_UINT8(flags, p);
2121 length--;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002122
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002123 if (flags & I93_FLAG_ERROR_DETECTED) {
2124 if (((p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_INLAY) ||
2125 (p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_CHIP) ||
2126 (p_i93->product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) ||
2127 (p_i93->product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY)) &&
2128 (*p == I93_ERROR_CODE_BLOCK_FAIL_TO_WRITE)) {
2129 /* ignore error */
2130 } else if ((length) && (rw_i93_check_sys_info_prot_ext(*p))) {
2131 /* getting system info with protocol extension flag */
2132 /* This STM tag supports more than 2040 bytes */
2133 p_i93->intl_flags |= RW_I93_FLAG_16BIT_NUM_BLOCK;
2134 return;
2135 } else {
2136 RW_TRACE_DEBUG1("Got error flags (0x%02x)", flags);
2137 rw_i93_handle_error(NFC_STATUS_FAILED);
2138 return;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002139 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002140 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002141
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002142 switch (p_i93->sub_state) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002143 case RW_I93_SUBSTATE_WAIT_UID:
2144
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002145 p++; /* skip DSFID */
2146 p_uid = p_i93->uid;
2147 STREAM_TO_ARRAY8(p_uid, p); /* store UID */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002148
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002149 /* get system information to get memory size */
2150 if (rw_i93_send_cmd_get_sys_info(NULL, I93_FLAG_PROT_EXT_NO) ==
2151 NFC_STATUS_OK) {
2152 p_i93->sub_state = RW_I93_SUBSTATE_WAIT_SYS_INFO;
2153 } else {
2154 rw_i93_handle_error(NFC_STATUS_FAILED);
2155 }
2156 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002157
2158 case RW_I93_SUBSTATE_WAIT_SYS_INFO:
2159
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002160 p_i93->block_size = 0;
2161 p_i93->num_block = 0;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002162
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002163 if (!rw_i93_process_sys_info(p)) {
2164 /* retrying with protocol extension flag */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002165 break;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002166 }
2167
2168 if (p_i93->info_flags & I93_INFO_FLAG_DSFID) {
2169 /* DSFID, if any DSFID then reset */
2170 if (p_i93->dsfid != I93_DFS_UNSUPPORTED) {
2171 p_i93->intl_flags |= RW_I93_FLAG_RESET_DSFID;
2172 }
2173 }
2174 if (p_i93->info_flags & I93_INFO_FLAG_AFI) {
2175 /* AFI, reset to 0 */
2176 if (p_i93->afi != 0x00) {
2177 p_i93->intl_flags |= RW_I93_FLAG_RESET_AFI;
2178 }
2179 }
2180
2181 if ((p_i93->block_size == 0) || (p_i93->num_block == 0)) {
2182 RW_TRACE_DEBUG0("Unable to get tag memory size");
2183 rw_i93_handle_error(status);
2184 } else if (p_i93->intl_flags & RW_I93_FLAG_RESET_DSFID) {
2185 if (rw_i93_send_cmd_write_dsfid(I93_DFS_UNSUPPORTED) == NFC_STATUS_OK) {
2186 p_i93->sub_state = RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI;
2187 } else {
2188 rw_i93_handle_error(NFC_STATUS_FAILED);
2189 }
2190 } else if (p_i93->intl_flags & RW_I93_FLAG_RESET_AFI) {
2191 if (rw_i93_send_cmd_write_afi(0x00) == NFC_STATUS_OK) {
2192 p_i93->sub_state = RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI;
2193 } else {
2194 rw_i93_handle_error(NFC_STATUS_FAILED);
2195 }
2196 } else {
2197 /* get lock status to see if read-only */
2198 if ((p_i93->uid[1] == I93_UID_IC_MFG_CODE_NXP) &&
2199 (p_i93->ic_reference & I93_ICODE_IC_REF_MBREAD_MASK)) {
2200 /* these doesn't support GetMultiBlockSecurityStatus */
2201
2202 rw_cb.tcb.i93.rw_offset = 0;
2203
2204 /* read blocks with option flag to get block security status */
2205 if (rw_i93_send_cmd_read_single_block(0x0000, true) ==
2206 NFC_STATUS_OK) {
2207 p_i93->sub_state = RW_I93_SUBSTATE_CHECK_READ_ONLY;
2208 } else {
2209 rw_i93_handle_error(NFC_STATUS_FAILED);
2210 }
2211 } else {
2212 /* block offset for read-only check */
2213 p_i93->rw_offset = 0;
2214
2215 if (rw_i93_get_next_block_sec() == NFC_STATUS_OK) {
2216 p_i93->sub_state = RW_I93_SUBSTATE_CHECK_READ_ONLY;
2217 } else {
2218 rw_i93_handle_error(NFC_STATUS_FAILED);
2219 }
2220 }
2221 }
2222
2223 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002224
2225 case RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI:
2226
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002227 if (p_i93->sent_cmd == I93_CMD_WRITE_DSFID) {
2228 p_i93->intl_flags &= ~RW_I93_FLAG_RESET_DSFID;
2229 } else if (p_i93->sent_cmd == I93_CMD_WRITE_AFI) {
2230 p_i93->intl_flags &= ~RW_I93_FLAG_RESET_AFI;
2231 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002232
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002233 if (p_i93->intl_flags & RW_I93_FLAG_RESET_DSFID) {
2234 if (rw_i93_send_cmd_write_dsfid(I93_DFS_UNSUPPORTED) == NFC_STATUS_OK) {
2235 p_i93->sub_state = RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI;
2236 } else {
2237 rw_i93_handle_error(NFC_STATUS_FAILED);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002238 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002239 } else if (p_i93->intl_flags & RW_I93_FLAG_RESET_AFI) {
2240 if (rw_i93_send_cmd_write_afi(0x00) == NFC_STATUS_OK) {
2241 p_i93->sub_state = RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI;
2242 } else {
2243 rw_i93_handle_error(NFC_STATUS_FAILED);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002244 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002245 } else {
2246 /* get lock status to see if read-only */
2247 if ((p_i93->uid[1] == I93_UID_IC_MFG_CODE_NXP) &&
2248 (p_i93->ic_reference & I93_ICODE_IC_REF_MBREAD_MASK)) {
2249 /* these doesn't support GetMultiBlockSecurityStatus */
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002250
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002251 rw_cb.tcb.i93.rw_offset = 0;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002252
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002253 /* read blocks with option flag to get block security status */
2254 if (rw_i93_send_cmd_read_single_block(0x0000, true) ==
2255 NFC_STATUS_OK) {
2256 p_i93->sub_state = RW_I93_SUBSTATE_CHECK_READ_ONLY;
2257 } else {
2258 rw_i93_handle_error(NFC_STATUS_FAILED);
2259 }
2260 } else {
2261 /* block offset for read-only check */
2262 p_i93->rw_offset = 0;
Evan Chu85b7e842013-01-18 11:02:50 -05002263
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002264 if (rw_i93_get_next_block_sec() == NFC_STATUS_OK) {
2265 p_i93->sub_state = RW_I93_SUBSTATE_CHECK_READ_ONLY;
2266 } else {
2267 rw_i93_handle_error(NFC_STATUS_FAILED);
2268 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002269 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002270 }
2271 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002272
2273 case RW_I93_SUBSTATE_CHECK_READ_ONLY:
2274
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002275 if ((p_i93->product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) ||
2276 (p_i93->product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY) ||
2277 ((p_i93->uid[1] == I93_UID_IC_MFG_CODE_NXP) &&
2278 (p_i93->ic_reference & I93_ICODE_IC_REF_MBREAD_MASK))) {
2279 if ((*p) & I93_BLOCK_LOCKED) {
2280 rw_i93_handle_error(NFC_STATUS_FAILED);
2281 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002282 }
2283
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002284 /* if we checked all of user blocks */
2285 if ((p_i93->rw_offset / p_i93->block_size) + 1 == p_i93->num_block) {
2286 if ((p_i93->product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) ||
2287 (p_i93->product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY)) {
2288 /* read the block which has AFI */
2289 p_i93->rw_offset = I93_TAG_IT_HF_I_STD_PRO_CHIP_INLAY_AFI_LOCATION;
2290 rw_i93_send_cmd_read_single_block(
2291 (uint16_t)(p_i93->rw_offset / p_i93->block_size), true);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002292 break;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002293 }
2294 } else if (p_i93->rw_offset ==
2295 I93_TAG_IT_HF_I_STD_PRO_CHIP_INLAY_AFI_LOCATION) {
2296 /* no block is locked */
2297 } else {
2298 p_i93->rw_offset += p_i93->block_size;
2299 rw_i93_send_cmd_read_single_block(
2300 (uint16_t)(p_i93->rw_offset / p_i93->block_size), true);
2301 break;
2302 }
2303 } else {
2304 /* if any block is locked, we cannot format it */
2305 for (xx = 0; xx < length; xx++) {
2306 if (*(p + xx) & I93_BLOCK_LOCKED) {
2307 rw_i93_handle_error(NFC_STATUS_FAILED);
2308 break;
2309 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002310 }
2311
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002312 /* update block offset for read-only check */
2313 p_i93->rw_offset += length;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002314
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002315 /* if need to get more lock status of blocks */
2316 if (p_i93->num_block > p_i93->rw_offset) {
2317 if (rw_i93_get_next_block_sec() != NFC_STATUS_OK) {
2318 rw_i93_handle_error(NFC_STATUS_FAILED);
2319 }
2320 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002321 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002322 }
Evan Chu85b7e842013-01-18 11:02:50 -05002323
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002324 /* get buffer to store CC, zero length NDEF TLV and Terminator TLV */
2325 p_i93->p_update_data = (uint8_t*)GKI_getbuf(RW_I93_FORMAT_DATA_LEN);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002326
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002327 if (!p_i93->p_update_data) {
2328 RW_TRACE_ERROR0("rw_i93_sm_format (): Cannot allocate buffer");
2329 rw_i93_handle_error(NFC_STATUS_FAILED);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002330 break;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002331 }
2332
2333 p = p_i93->p_update_data;
2334
2335 /* Capability Container */
2336 *(p++) = I93_ICODE_CC_MAGIC_NUMER; /* magic number */
2337 *(p++) = 0x40; /* version 1.0, read/write */
2338
2339 /* if memory size is less than 2048 bytes */
2340 if (((p_i93->num_block * p_i93->block_size) / 8) < 0x100)
2341 *(p++) = (uint8_t)((p_i93->num_block * p_i93->block_size) /
2342 8); /* memory size */
2343 else
2344 *(p++) = 0xFF;
2345
2346 if ((p_i93->product_version == RW_I93_ICODE_SLI) ||
2347 (p_i93->product_version == RW_I93_ICODE_SLI_S) ||
2348 (p_i93->product_version == RW_I93_ICODE_SLI_L)) {
2349 if (p_i93->ic_reference & I93_ICODE_IC_REF_MBREAD_MASK)
2350 *(p++) = I93_ICODE_CC_IPREAD_MASK; /* IPREAD */
2351 else
2352 *(p++) = I93_ICODE_CC_MBREAD_MASK; /* MBREAD, read multi block command
2353 supported */
2354 } else if ((p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_INLAY) ||
2355 (p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_CHIP)) {
2356 *(p++) = I93_ICODE_CC_MBREAD_MASK; /* MBREAD, read multi block command
2357 supported */
2358 } else if ((p_i93->product_version ==
2359 RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) ||
2360 (p_i93->product_version ==
2361 RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY)) {
2362 *(p++) = 0;
2363 } else {
2364 /* STM except LRIS2K, Broadcom supports read multi block command */
2365
2366 /* if memory size is more than 2040 bytes (which is not LRIS2K) */
2367 if (((p_i93->num_block * p_i93->block_size) / 8) > 0xFF)
2368 *(p++) = (I93_ICODE_CC_MBREAD_MASK | I93_STM_CC_OVERFLOW_MASK);
2369 else if (p_i93->product_version == RW_I93_STM_LRIS2K)
2370 *(p++) = 0x00;
2371 else
2372 *(p++) = I93_ICODE_CC_MBREAD_MASK;
2373 }
2374
2375 /* zero length NDEF and Terminator TLV */
2376 *(p++) = I93_ICODE_TLV_TYPE_NDEF;
2377 *(p++) = 0x00;
2378 *(p++) = I93_ICODE_TLV_TYPE_TERM;
2379 *(p++) = I93_ICODE_TLV_TYPE_NULL;
2380
2381 /* start from block 0 */
2382 p_i93->rw_offset = 0;
2383
2384 if (rw_i93_send_cmd_write_single_block(0, p_i93->p_update_data) ==
2385 NFC_STATUS_OK) {
2386 p_i93->sub_state = RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV;
2387 p_i93->rw_offset += p_i93->block_size;
2388 } else {
2389 rw_i93_handle_error(NFC_STATUS_FAILED);
2390 }
2391 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002392
2393 case RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV:
2394
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002395 /* if we have more data to write */
2396 if (p_i93->rw_offset < RW_I93_FORMAT_DATA_LEN) {
2397 block_number = (p_i93->rw_offset / p_i93->block_size);
2398 p = p_i93->p_update_data + p_i93->rw_offset;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002399
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002400 if (rw_i93_send_cmd_write_single_block(block_number, p) ==
2401 NFC_STATUS_OK) {
2402 p_i93->sub_state = RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV;
2403 p_i93->rw_offset += p_i93->block_size;
2404 } else {
2405 rw_i93_handle_error(NFC_STATUS_FAILED);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002406 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002407 } else {
2408 GKI_freebuf(p_i93->p_update_data);
2409 p_i93->p_update_data = NULL;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002410
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002411 p_i93->state = RW_I93_STATE_IDLE;
2412 p_i93->sent_cmd = 0;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002413
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002414 rw_data.status = NFC_STATUS_OK;
2415 (*(rw_cb.p_cback))(RW_I93_FORMAT_CPLT_EVT, &rw_data);
2416 }
2417 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002418
2419 default:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002420 break;
2421 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002422}
2423
2424/*******************************************************************************
2425**
2426** Function rw_i93_sm_set_read_only
2427**
2428** Description Process read-only procedure
2429**
2430** 1. Update CC as read-only
2431** 2. Lock all block of NDEF TLV
2432** 3. Lock block of CC
2433**
2434** Returns void
2435**
2436*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002437void rw_i93_sm_set_read_only(NFC_HDR* p_resp) {
2438 uint8_t* p = (uint8_t*)(p_resp + 1) + p_resp->offset;
2439 uint8_t flags, block_number;
2440 uint16_t length = p_resp->len;
2441 tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
2442 tRW_DATA rw_data;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002443
2444#if (BT_TRACE_VERBOSE == TRUE)
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002445 RW_TRACE_DEBUG2("rw_i93_sm_set_read_only () sub_state:%s (0x%x)",
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07002446 rw_i93_get_sub_state_name(p_i93->sub_state).c_str(),
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002447 p_i93->sub_state);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002448#else
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002449 RW_TRACE_DEBUG1("rw_i93_sm_set_read_only () sub_state:0x%x",
2450 p_i93->sub_state);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002451#endif
2452
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002453 STREAM_TO_UINT8(flags, p);
2454 length--;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002455
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002456 if (flags & I93_FLAG_ERROR_DETECTED) {
2457 if (((p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_INLAY) ||
2458 (p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_CHIP) ||
2459 (p_i93->product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) ||
2460 (p_i93->product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY)) &&
2461 (*p == I93_ERROR_CODE_BLOCK_FAIL_TO_WRITE)) {
2462 /* ignore error */
2463 } else {
2464 RW_TRACE_DEBUG1("Got error flags (0x%02x)", flags);
2465 rw_i93_handle_error(NFC_STATUS_FAILED);
2466 return;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002467 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002468 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002469
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002470 switch (p_i93->sub_state) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002471 case RW_I93_SUBSTATE_WAIT_CC:
2472
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002473 /* mark CC as read-only */
2474 *(p + 1) |= I93_ICODE_CC_READ_ONLY;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002475
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002476 if (rw_i93_send_cmd_write_single_block(0, p) == NFC_STATUS_OK) {
2477 p_i93->sub_state = RW_I93_SUBSTATE_WAIT_UPDATE_CC;
2478 } else {
2479 rw_i93_handle_error(NFC_STATUS_FAILED);
2480 }
2481 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002482
2483 case RW_I93_SUBSTATE_WAIT_UPDATE_CC:
2484
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002485 /* successfully write CC then lock all blocks of NDEF TLV */
2486 p_i93->rw_offset = p_i93->ndef_tlv_start_offset;
2487 block_number = (uint8_t)(p_i93->rw_offset / p_i93->block_size);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002488
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002489 if (rw_i93_send_cmd_lock_block(block_number) == NFC_STATUS_OK) {
2490 p_i93->rw_offset += p_i93->block_size;
2491 p_i93->sub_state = RW_I93_SUBSTATE_LOCK_NDEF_TLV;
2492 } else {
2493 rw_i93_handle_error(NFC_STATUS_FAILED);
2494 }
2495 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002496
2497 case RW_I93_SUBSTATE_LOCK_NDEF_TLV:
2498
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002499 /* if we need to lock more blocks */
2500 if (p_i93->rw_offset < p_i93->ndef_tlv_last_offset) {
2501 /* get the next block of NDEF TLV */
2502 block_number = (uint8_t)(p_i93->rw_offset / p_i93->block_size);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002503
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002504 if (rw_i93_send_cmd_lock_block(block_number) == NFC_STATUS_OK) {
2505 p_i93->rw_offset += p_i93->block_size;
2506 } else {
2507 rw_i93_handle_error(NFC_STATUS_FAILED);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002508 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002509 }
2510 /* if the first block of NDEF TLV is different from block of CC */
2511 else if (p_i93->ndef_tlv_start_offset / p_i93->block_size != 0) {
2512 /* lock block of CC */
2513 if (rw_i93_send_cmd_lock_block(0) == NFC_STATUS_OK) {
2514 p_i93->sub_state = RW_I93_SUBSTATE_WAIT_LOCK_CC;
2515 } else {
2516 rw_i93_handle_error(NFC_STATUS_FAILED);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002517 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002518 } else {
2519 p_i93->intl_flags |= RW_I93_FLAG_READ_ONLY;
2520 p_i93->state = RW_I93_STATE_IDLE;
2521 p_i93->sent_cmd = 0;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002522
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002523 rw_data.status = NFC_STATUS_OK;
2524 (*(rw_cb.p_cback))(RW_I93_SET_TAG_RO_EVT, &rw_data);
2525 }
2526 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002527
2528 case RW_I93_SUBSTATE_WAIT_LOCK_CC:
2529
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002530 p_i93->intl_flags |= RW_I93_FLAG_READ_ONLY;
2531 p_i93->state = RW_I93_STATE_IDLE;
2532 p_i93->sent_cmd = 0;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002533
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002534 rw_data.status = NFC_STATUS_OK;
2535 (*(rw_cb.p_cback))(RW_I93_SET_TAG_RO_EVT, &rw_data);
2536 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002537
2538 default:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002539 break;
2540 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002541}
2542
2543/*******************************************************************************
2544**
2545** Function rw_i93_handle_error
2546**
2547** Description notify error to application and clean up
2548**
2549** Returns none
2550**
2551*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002552void rw_i93_handle_error(tNFC_STATUS status) {
2553 tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
2554 tRW_DATA rw_data;
2555 tRW_EVENT event;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002556
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002557 RW_TRACE_DEBUG2("rw_i93_handle_error (): status:0x%02X, state:0x%X", status,
2558 p_i93->state);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002559
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002560 nfc_stop_quick_timer(&p_i93->timer);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002561
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002562 if (rw_cb.p_cback) {
2563 rw_data.status = status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002564
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002565 switch (p_i93->state) {
2566 case RW_I93_STATE_IDLE: /* in case of RawFrame */
2567 event = RW_I93_INTF_ERROR_EVT;
2568 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002569
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002570 case RW_I93_STATE_BUSY:
2571 if (p_i93->sent_cmd == I93_CMD_STAY_QUIET) {
2572 /* There is no response to Stay Quiet command */
2573 rw_data.i93_cmd_cmpl.status = NFC_STATUS_OK;
2574 rw_data.i93_cmd_cmpl.command = I93_CMD_STAY_QUIET;
2575 rw_data.i93_cmd_cmpl.error_code = 0;
2576 event = RW_I93_CMD_CMPL_EVT;
2577 } else {
2578 event = RW_I93_INTF_ERROR_EVT;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002579 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002580 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002581
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002582 case RW_I93_STATE_DETECT_NDEF:
Love Khanna57a3dfa2017-03-28 20:03:38 +05302583 rw_data.ndef.protocol = NFC_PROTOCOL_T5T;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002584 rw_data.ndef.cur_size = 0;
2585 rw_data.ndef.max_size = 0;
2586 rw_data.ndef.flags = 0;
2587 rw_data.ndef.flags |= RW_NDEF_FL_FORMATABLE;
2588 rw_data.ndef.flags |= RW_NDEF_FL_UNKNOWN;
2589 event = RW_I93_NDEF_DETECT_EVT;
2590 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002591
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002592 case RW_I93_STATE_READ_NDEF:
2593 event = RW_I93_NDEF_READ_FAIL_EVT;
2594 break;
2595
2596 case RW_I93_STATE_UPDATE_NDEF:
2597 p_i93->p_update_data = NULL;
2598 event = RW_I93_NDEF_UPDATE_FAIL_EVT;
2599 break;
2600
2601 case RW_I93_STATE_FORMAT:
2602 if (p_i93->p_update_data) {
2603 GKI_freebuf(p_i93->p_update_data);
2604 p_i93->p_update_data = NULL;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002605 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002606 event = RW_I93_FORMAT_CPLT_EVT;
2607 break;
2608
2609 case RW_I93_STATE_SET_READ_ONLY:
2610 event = RW_I93_SET_TAG_RO_EVT;
2611 break;
2612
2613 case RW_I93_STATE_PRESENCE_CHECK:
2614 event = RW_I93_PRESENCE_CHECK_EVT;
2615 break;
2616
2617 default:
2618 event = RW_I93_MAX_EVT;
2619 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002620 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002621
2622 p_i93->state = RW_I93_STATE_IDLE;
2623 p_i93->sent_cmd = 0;
2624
2625 if (event != RW_I93_MAX_EVT) {
2626 (*(rw_cb.p_cback))(event, &rw_data);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002627 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002628 } else {
2629 p_i93->state = RW_I93_STATE_IDLE;
2630 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002631}
2632
2633/*******************************************************************************
2634**
2635** Function rw_i93_process_timeout
2636**
2637** Description process timeout event
2638**
2639** Returns none
2640**
2641*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002642void rw_i93_process_timeout(TIMER_LIST_ENT* p_tle) {
2643 NFC_HDR* p_buf;
Evan Chu85b7e842013-01-18 11:02:50 -05002644
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002645 RW_TRACE_DEBUG1("rw_i93_process_timeout () event=%d", p_tle->event);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002646
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002647 if (p_tle->event == NFC_TTYPE_RW_I93_RESPONSE) {
2648 if ((rw_cb.tcb.i93.retry_count < RW_MAX_RETRIES) &&
2649 (rw_cb.tcb.i93.p_retry_cmd) &&
2650 (rw_cb.tcb.i93.sent_cmd != I93_CMD_STAY_QUIET)) {
2651 rw_cb.tcb.i93.retry_count++;
2652 RW_TRACE_ERROR1("rw_i93_process_timeout (): retry_count = %d",
2653 rw_cb.tcb.i93.retry_count);
Evan Chu85b7e842013-01-18 11:02:50 -05002654
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002655 p_buf = rw_cb.tcb.i93.p_retry_cmd;
2656 rw_cb.tcb.i93.p_retry_cmd = NULL;
Evan Chu7c69b272013-05-14 12:48:36 -04002657
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002658 if (rw_i93_send_to_lower(p_buf)) {
2659 return;
2660 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002661 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002662
2663 /* all retrial is done or failed to send command to lower layer */
2664 if (rw_cb.tcb.i93.p_retry_cmd) {
2665 GKI_freebuf(rw_cb.tcb.i93.p_retry_cmd);
2666 rw_cb.tcb.i93.p_retry_cmd = NULL;
2667 rw_cb.tcb.i93.retry_count = 0;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002668 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002669 rw_i93_handle_error(NFC_STATUS_TIMEOUT);
2670 } else {
2671 RW_TRACE_ERROR1("rw_i93_process_timeout () unknown event=%d", p_tle->event);
2672 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002673}
2674
2675/*******************************************************************************
2676**
2677** Function rw_i93_data_cback
2678**
2679** Description This callback function receives the data from NFCC.
2680**
2681** Returns none
2682**
2683*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002684static void rw_i93_data_cback(uint8_t conn_id, tNFC_CONN_EVT event,
2685 tNFC_CONN* p_data) {
2686 tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
2687 NFC_HDR* p_resp;
2688 tRW_DATA rw_data;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002689
2690#if (BT_TRACE_VERBOSE == TRUE)
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002691 uint8_t begin_state = p_i93->state;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002692#endif
2693
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002694 RW_TRACE_DEBUG1("rw_i93_data_cback () event = 0x%X", event);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002695
Love Khanna57a3dfa2017-03-28 20:03:38 +05302696 if ((event == NFC_DEACTIVATE_CEVT) || (event == NFC_ERROR_CEVT) ||
2697 ((event == NFC_DATA_CEVT) && (p_data->status != NFC_STATUS_OK))) {
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002698 nfc_stop_quick_timer(&p_i93->timer);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002699
Jizhou Liao499be102017-08-11 12:57:12 -07002700 if (event == NFC_ERROR_CEVT || (p_data->status != NFC_STATUS_OK)) {
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002701 if ((p_i93->retry_count < RW_MAX_RETRIES) && (p_i93->p_retry_cmd)) {
2702 p_i93->retry_count++;
Evan Chu85b7e842013-01-18 11:02:50 -05002703
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002704 RW_TRACE_ERROR1("rw_i93_data_cback (): retry_count = %d",
2705 p_i93->retry_count);
Evan Chu85b7e842013-01-18 11:02:50 -05002706
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002707 p_resp = p_i93->p_retry_cmd;
2708 p_i93->p_retry_cmd = NULL;
2709 if (rw_i93_send_to_lower(p_resp)) {
2710 return;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002711 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002712 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002713
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002714 /* all retrial is done or failed to send command to lower layer */
2715 if (p_i93->p_retry_cmd) {
2716 GKI_freebuf(p_i93->p_retry_cmd);
Evan Chu85b7e842013-01-18 11:02:50 -05002717 p_i93->p_retry_cmd = NULL;
2718 p_i93->retry_count = 0;
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002719 }
2720
2721 rw_i93_handle_error((tNFC_STATUS)(*(uint8_t*)p_data));
2722 } else {
2723 /* free retry buffer */
2724 if (p_i93->p_retry_cmd) {
2725 GKI_freebuf(p_i93->p_retry_cmd);
2726 p_i93->p_retry_cmd = NULL;
2727 p_i93->retry_count = 0;
2728 }
2729 NFC_SetStaticRfCback(NULL);
2730 p_i93->state = RW_I93_STATE_NOT_ACTIVATED;
Evan Chu85b7e842013-01-18 11:02:50 -05002731 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002732 return;
2733 }
2734
2735 if (event != NFC_DATA_CEVT) {
2736 return;
2737 }
2738
2739 p_resp = (NFC_HDR*)p_data->data.p_data;
2740
2741 nfc_stop_quick_timer(&p_i93->timer);
2742
2743 /* free retry buffer */
2744 if (p_i93->p_retry_cmd) {
2745 GKI_freebuf(p_i93->p_retry_cmd);
2746 p_i93->p_retry_cmd = NULL;
2747 p_i93->retry_count = 0;
2748 }
Evan Chu85b7e842013-01-18 11:02:50 -05002749
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002750#if (BT_TRACE_PROTOCOL == TRUE)
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002751 DispRWI93Tag(p_resp, true, p_i93->sent_cmd);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002752#endif
2753
2754#if (BT_TRACE_VERBOSE == TRUE)
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002755 RW_TRACE_DEBUG2("RW I93 state: <%s (%d)>",
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07002756 rw_i93_get_state_name(p_i93->state).c_str(), p_i93->state);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002757#else
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002758 RW_TRACE_DEBUG1("RW I93 state: %d", p_i93->state);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002759#endif
2760
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002761 switch (p_i93->state) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002762 case RW_I93_STATE_IDLE:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002763 /* Unexpected Response from VICC, it should be raw frame response */
2764 /* forward to upper layer without parsing */
2765 p_i93->sent_cmd = 0;
2766 if (rw_cb.p_cback) {
2767 rw_data.raw_frame.status = p_data->data.status;
2768 rw_data.raw_frame.p_data = p_resp;
2769 (*(rw_cb.p_cback))(RW_I93_RAW_FRAME_EVT, &rw_data);
2770 p_resp = NULL;
2771 } else {
2772 GKI_freebuf(p_resp);
2773 }
2774 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002775 case RW_I93_STATE_BUSY:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002776 p_i93->state = RW_I93_STATE_IDLE;
2777 rw_i93_send_to_upper(p_resp);
2778 GKI_freebuf(p_resp);
2779 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002780
2781 case RW_I93_STATE_DETECT_NDEF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002782 rw_i93_sm_detect_ndef(p_resp);
2783 GKI_freebuf(p_resp);
2784 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002785
2786 case RW_I93_STATE_READ_NDEF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002787 rw_i93_sm_read_ndef(p_resp);
2788 /* p_resp may send upper lyaer */
2789 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002790
2791 case RW_I93_STATE_UPDATE_NDEF:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002792 rw_i93_sm_update_ndef(p_resp);
2793 GKI_freebuf(p_resp);
2794 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002795
2796 case RW_I93_STATE_FORMAT:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002797 rw_i93_sm_format(p_resp);
2798 GKI_freebuf(p_resp);
2799 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002800
2801 case RW_I93_STATE_SET_READ_ONLY:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002802 rw_i93_sm_set_read_only(p_resp);
2803 GKI_freebuf(p_resp);
2804 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002805
2806 case RW_I93_STATE_PRESENCE_CHECK:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002807 p_i93->state = RW_I93_STATE_IDLE;
2808 p_i93->sent_cmd = 0;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002809
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002810 /* if any response, send presence check with ok */
2811 rw_data.status = NFC_STATUS_OK;
2812 (*(rw_cb.p_cback))(RW_I93_PRESENCE_CHECK_EVT, &rw_data);
2813 GKI_freebuf(p_resp);
2814 break;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002815
2816 default:
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002817 RW_TRACE_ERROR1("rw_i93_data_cback (): invalid state=%d", p_i93->state);
2818 GKI_freebuf(p_resp);
2819 break;
2820 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002821
2822#if (BT_TRACE_VERBOSE == TRUE)
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002823 if (begin_state != p_i93->state) {
2824 RW_TRACE_DEBUG2("RW I93 state changed:<%s> -> <%s>",
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07002825 rw_i93_get_state_name(begin_state).c_str(),
2826 rw_i93_get_state_name(p_i93->state).c_str());
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002827 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002828#endif
2829}
2830
2831/*******************************************************************************
2832**
2833** Function rw_i93_select
2834**
Love Khanna57a3dfa2017-03-28 20:03:38 +05302835** Description Initialise ISO 15693 / T5T RW
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002836**
2837** Returns NFC_STATUS_OK if success
2838**
2839*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002840tNFC_STATUS rw_i93_select(uint8_t* p_uid) {
2841 tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
2842 uint8_t uid[I93_UID_BYTE_LEN], *p;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002843
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002844 RW_TRACE_DEBUG0("rw_i93_select ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002845
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002846 NFC_SetStaticRfCback(rw_i93_data_cback);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002847
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002848 p_i93->state = RW_I93_STATE_IDLE;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002849
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002850 /* convert UID to big endian format - MSB(0xE0) in first byte */
2851 p = uid;
2852 STREAM_TO_ARRAY8(p, p_uid);
Evan Chu85b7e842013-01-18 11:02:50 -05002853
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002854 rw_i93_get_product_version(uid);
Evan Chu85b7e842013-01-18 11:02:50 -05002855
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002856 return NFC_STATUS_OK;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002857}
2858
2859/*******************************************************************************
2860**
2861** Function RW_I93Inventory
2862**
Martijn Coenen5c65c3a2013-03-27 13:23:36 -07002863** Description This function send Inventory command with/without AFI
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002864** If UID is provided then set UID[0]:MSB, ... UID[7]:LSB
2865**
2866** RW_I93_RESPONSE_EVT will be returned
2867**
2868** Returns NFC_STATUS_OK if success
2869** NFC_STATUS_NO_BUFFERS if out of buffer
2870** NFC_STATUS_BUSY if busy
2871** NFC_STATUS_FAILED if other error
2872**
2873*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002874tNFC_STATUS RW_I93Inventory(bool including_afi, uint8_t afi, uint8_t* p_uid) {
2875 tNFC_STATUS status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002876
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002877 RW_TRACE_API2("RW_I93Inventory (), including_afi:%d, AFI:0x%02X",
2878 including_afi, afi);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002879
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002880 if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
2881 RW_TRACE_ERROR1(
2882 "RW_I93Inventory ():Unable to start command at state (0x%X)",
2883 rw_cb.tcb.i93.state);
2884 return NFC_STATUS_BUSY;
2885 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002886
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002887 status = rw_i93_send_cmd_inventory(p_uid, including_afi, afi);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002888
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002889 if (status == NFC_STATUS_OK) {
2890 rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
2891 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002892
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002893 return (status);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002894}
2895
2896/*******************************************************************************
2897**
2898** Function RW_I93StayQuiet
2899**
2900** Description This function send Inventory command
2901**
2902** RW_I93_CMD_CMPL_EVT will be returned
2903**
2904** Returns NFC_STATUS_OK if success
2905** NFC_STATUS_NO_BUFFERS if out of buffer
2906** NFC_STATUS_BUSY if busy
2907** NFC_STATUS_FAILED if other error
2908**
2909*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002910tNFC_STATUS RW_I93StayQuiet(void) {
2911 tNFC_STATUS status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002912
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002913 RW_TRACE_API0("RW_I93StayQuiet ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002914
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002915 if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
2916 RW_TRACE_ERROR1(
2917 "RW_I93StayQuiet ():Unable to start command at state (0x%X)",
2918 rw_cb.tcb.i93.state);
2919 return NFC_STATUS_BUSY;
2920 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002921
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002922 status = rw_i93_send_cmd_stay_quiet();
2923 if (status == NFC_STATUS_OK) {
2924 rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
2925 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002926
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002927 return status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002928}
2929
2930/*******************************************************************************
2931**
2932** Function RW_I93ReadSingleBlock
2933**
2934** Description This function send Read Single Block command
2935**
2936** RW_I93_RESPONSE_EVT will be returned
2937**
2938** Returns NFC_STATUS_OK if success
2939** NFC_STATUS_NO_BUFFERS if out of buffer
2940** NFC_STATUS_BUSY if busy
2941** NFC_STATUS_FAILED if other error
2942**
2943*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002944tNFC_STATUS RW_I93ReadSingleBlock(uint16_t block_number) {
2945 tNFC_STATUS status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002946
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002947 RW_TRACE_API1("RW_I93ReadSingleBlock () block_number:0x%02X", block_number);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002948
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002949 if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
2950 RW_TRACE_ERROR1(
2951 "RW_I93ReadSingleBlock ():Unable to start command at state (0x%X)",
2952 rw_cb.tcb.i93.state);
2953 return NFC_STATUS_BUSY;
2954 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002955
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002956 status = rw_i93_send_cmd_read_single_block(block_number, false);
2957 if (status == NFC_STATUS_OK) {
2958 rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
2959 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002960
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002961 return status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002962}
2963
2964/*******************************************************************************
2965**
2966** Function RW_I93WriteSingleBlock
2967**
2968** Description This function send Write Single Block command
Ruchi Kandoi552f2b72017-01-28 16:22:55 -08002969** Application must get block size first by calling
2970** RW_I93GetSysInfo().
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002971**
2972** RW_I93_CMD_CMPL_EVT will be returned
2973**
2974** Returns NFC_STATUS_OK if success
2975** NFC_STATUS_NO_BUFFERS if out of buffer
2976** NFC_STATUS_BUSY if busy
2977** NFC_STATUS_FAILED if other error
2978**
2979*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002980tNFC_STATUS RW_I93WriteSingleBlock(uint16_t block_number, uint8_t* p_data) {
2981 tNFC_STATUS status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002982
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002983 RW_TRACE_API0("RW_I93WriteSingleBlock ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002984
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002985 if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
2986 RW_TRACE_ERROR1(
2987 "RW_I93WriteSingleBlock ():Unable to start command at state (0x%X)",
2988 rw_cb.tcb.i93.state);
2989 return NFC_STATUS_BUSY;
2990 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002991
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002992 if (rw_cb.tcb.i93.block_size == 0) {
2993 RW_TRACE_ERROR0("RW_I93WriteSingleBlock ():Block size is unknown");
2994 return NFC_STATUS_FAILED;
2995 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08002996
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08002997 status = rw_i93_send_cmd_write_single_block(block_number, p_data);
2998 if (status == NFC_STATUS_OK) {
2999 rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
3000 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003001
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003002 return status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003003}
3004
3005/*******************************************************************************
3006**
3007** Function RW_I93LockBlock
3008**
3009** Description This function send Lock Block command
3010**
3011** RW_I93_CMD_CMPL_EVT will be returned
3012**
3013** Returns NFC_STATUS_OK if success
3014** NFC_STATUS_NO_BUFFERS if out of buffer
3015** NFC_STATUS_BUSY if busy
3016** NFC_STATUS_FAILED if other error
3017**
3018*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003019tNFC_STATUS RW_I93LockBlock(uint8_t block_number) {
3020 tNFC_STATUS status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003021
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003022 RW_TRACE_API0("RW_I93LockBlock ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003023
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003024 if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
3025 RW_TRACE_ERROR1(
3026 "RW_I93LockBlock ():Unable to start command at state (0x%X)",
3027 rw_cb.tcb.i93.state);
3028 return NFC_STATUS_BUSY;
3029 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003030
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003031 status = rw_i93_send_cmd_lock_block(block_number);
3032 if (status == NFC_STATUS_OK) {
3033 rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
3034 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003035
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003036 return status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003037}
3038
3039/*******************************************************************************
3040**
3041** Function RW_I93ReadMultipleBlocks
3042**
3043** Description This function send Read Multiple Blocks command
3044**
3045** RW_I93_RESPONSE_EVT will be returned
3046**
3047** Returns NFC_STATUS_OK if success
3048** NFC_STATUS_NO_BUFFERS if out of buffer
3049** NFC_STATUS_BUSY if busy
3050** NFC_STATUS_FAILED if other error
3051**
3052*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003053tNFC_STATUS RW_I93ReadMultipleBlocks(uint16_t first_block_number,
3054 uint16_t number_blocks) {
3055 tNFC_STATUS status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003056
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003057 RW_TRACE_API0("RW_I93ReadMultipleBlocks ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003058
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003059 if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
3060 RW_TRACE_ERROR1(
3061 "RW_I93ReadMultipleBlocks ():Unable to start command at state (0x%X)",
3062 rw_cb.tcb.i93.state);
3063 return NFC_STATUS_BUSY;
3064 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003065
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003066 status = rw_i93_send_cmd_read_multi_blocks(first_block_number, number_blocks);
3067 if (status == NFC_STATUS_OK) {
3068 rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
3069 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003070
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003071 return status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003072}
3073
3074/*******************************************************************************
3075**
3076** Function RW_I93WriteMultipleBlocks
3077**
3078** Description This function send Write Multiple Blocks command
3079**
3080** RW_I93_CMD_CMPL_EVT will be returned
3081**
3082** Returns NFC_STATUS_OK if success
3083** NFC_STATUS_NO_BUFFERS if out of buffer
3084** NFC_STATUS_BUSY if busy
3085** NFC_STATUS_FAILED if other error
3086**
3087*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003088tNFC_STATUS RW_I93WriteMultipleBlocks(uint8_t first_block_number,
3089 uint16_t number_blocks, uint8_t* p_data) {
3090 tNFC_STATUS status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003091
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003092 RW_TRACE_API0("RW_I93WriteMultipleBlocks ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003093
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003094 if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
3095 RW_TRACE_ERROR1(
3096 "RW_I93WriteMultipleBlocks ():Unable to start command at state (0x%X)",
3097 rw_cb.tcb.i93.state);
3098 return NFC_STATUS_BUSY;
3099 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003100
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003101 if (rw_cb.tcb.i93.block_size == 0) {
3102 RW_TRACE_ERROR0("RW_I93WriteSingleBlock ():Block size is unknown");
3103 return NFC_STATUS_FAILED;
3104 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003105
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003106 status = rw_i93_send_cmd_write_multi_blocks(first_block_number, number_blocks,
3107 p_data);
3108 if (status == NFC_STATUS_OK) {
3109 rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
3110 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003111
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003112 return status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003113}
3114
3115/*******************************************************************************
3116**
3117** Function RW_I93Select
3118**
3119** Description This function send Select command
3120**
3121** UID[0]: 0xE0, MSB
3122** UID[1]: IC Mfg Code
3123** ...
3124** UID[7]: LSB
3125**
3126** RW_I93_CMD_CMPL_EVT will be returned
3127**
3128** Returns NFC_STATUS_OK if success
3129** NFC_STATUS_NO_BUFFERS if out of buffer
3130** NFC_STATUS_BUSY if busy
3131** NFC_STATUS_FAILED if other error
3132**
3133*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003134tNFC_STATUS RW_I93Select(uint8_t* p_uid) {
3135 tNFC_STATUS status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003136
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003137 RW_TRACE_API0("RW_I93Select ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003138
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003139 if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
3140 RW_TRACE_ERROR1("RW_I93Select ():Unable to start command at state (0x%X)",
3141 rw_cb.tcb.i93.state);
3142 return NFC_STATUS_BUSY;
3143 }
3144
3145 if (p_uid) {
3146 status = rw_i93_send_cmd_select(p_uid);
3147 if (status == NFC_STATUS_OK) {
3148 rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003149 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003150 } else {
3151 RW_TRACE_ERROR0("RW_I93Select ():UID shall be provided");
3152 status = NFC_STATUS_FAILED;
3153 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003154
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003155 return status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003156}
3157
3158/*******************************************************************************
3159**
3160** Function RW_I93ResetToReady
3161**
3162** Description This function send Reset To Ready command
3163**
3164** RW_I93_CMD_CMPL_EVT will be returned
3165**
3166** Returns NFC_STATUS_OK if success
3167** NFC_STATUS_NO_BUFFERS if out of buffer
3168** NFC_STATUS_BUSY if busy
3169** NFC_STATUS_FAILED if other error
3170**
3171*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003172tNFC_STATUS RW_I93ResetToReady(void) {
3173 tNFC_STATUS status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003174
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003175 RW_TRACE_API0("RW_I93ResetToReady ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003176
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003177 if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
3178 RW_TRACE_ERROR1(
3179 "RW_I93ResetToReady ():Unable to start command at state (0x%X)",
3180 rw_cb.tcb.i93.state);
3181 return NFC_STATUS_BUSY;
3182 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003183
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003184 status = rw_i93_send_cmd_reset_to_ready();
3185 if (status == NFC_STATUS_OK) {
3186 rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
3187 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003188
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003189 return status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003190}
3191
3192/*******************************************************************************
3193**
3194** Function RW_I93WriteAFI
3195**
3196** Description This function send Write AFI command
3197**
3198** RW_I93_CMD_CMPL_EVT will be returned
3199**
3200** Returns NFC_STATUS_OK if success
3201** NFC_STATUS_NO_BUFFERS if out of buffer
3202** NFC_STATUS_BUSY if busy
3203** NFC_STATUS_FAILED if other error
3204**
3205*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003206tNFC_STATUS RW_I93WriteAFI(uint8_t afi) {
3207 tNFC_STATUS status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003208
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003209 RW_TRACE_API0("RW_I93WriteAFI ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003210
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003211 if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
3212 RW_TRACE_ERROR1("RW_I93WriteAFI ():Unable to start command at state (0x%X)",
3213 rw_cb.tcb.i93.state);
3214 return NFC_STATUS_BUSY;
3215 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003216
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003217 status = rw_i93_send_cmd_write_afi(afi);
3218 if (status == NFC_STATUS_OK) {
3219 rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
3220 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003221
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003222 return status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003223}
3224
3225/*******************************************************************************
3226**
3227** Function RW_I93LockAFI
3228**
3229** Description This function send Lock AFI command
3230**
3231** RW_I93_CMD_CMPL_EVT will be returned
3232**
3233** Returns NFC_STATUS_OK if success
3234** NFC_STATUS_NO_BUFFERS if out of buffer
3235** NFC_STATUS_BUSY if busy
3236** NFC_STATUS_FAILED if other error
3237**
3238*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003239tNFC_STATUS RW_I93LockAFI(void) {
3240 tNFC_STATUS status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003241
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003242 RW_TRACE_API0("RW_I93LockAFI ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003243
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003244 if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
3245 RW_TRACE_ERROR1("RW_I93LockAFI ():Unable to start command at state (0x%X)",
3246 rw_cb.tcb.i93.state);
3247 return NFC_STATUS_BUSY;
3248 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003249
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003250 status = rw_i93_send_cmd_lock_afi();
3251 if (status == NFC_STATUS_OK) {
3252 rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
3253 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003254
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003255 return status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003256}
3257
3258/*******************************************************************************
3259**
3260** Function RW_I93WriteDSFID
3261**
3262** Description This function send Write DSFID command
3263**
3264** RW_I93_CMD_CMPL_EVT will be returned
3265**
3266** Returns NFC_STATUS_OK if success
3267** NFC_STATUS_NO_BUFFERS if out of buffer
3268** NFC_STATUS_BUSY if busy
3269** NFC_STATUS_FAILED if other error
3270**
3271*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003272tNFC_STATUS RW_I93WriteDSFID(uint8_t dsfid) {
3273 tNFC_STATUS status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003274
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003275 RW_TRACE_API0("RW_I93WriteDSFID ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003276
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003277 if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
3278 RW_TRACE_ERROR1(
3279 "RW_I93WriteDSFID ():Unable to start command at state (0x%X)",
3280 rw_cb.tcb.i93.state);
3281 return NFC_STATUS_BUSY;
3282 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003283
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003284 status = rw_i93_send_cmd_write_dsfid(dsfid);
3285 if (status == NFC_STATUS_OK) {
3286 rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
3287 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003288
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003289 return status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003290}
3291
3292/*******************************************************************************
3293**
3294** Function RW_I93LockDSFID
3295**
3296** Description This function send Lock DSFID command
3297**
3298** RW_I93_CMD_CMPL_EVT will be returned
3299**
3300** Returns NFC_STATUS_OK if success
3301** NFC_STATUS_NO_BUFFERS if out of buffer
3302** NFC_STATUS_BUSY if busy
3303** NFC_STATUS_FAILED if other error
3304**
3305*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003306tNFC_STATUS RW_I93LockDSFID(void) {
3307 tNFC_STATUS status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003308
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003309 RW_TRACE_API0("RW_I93LockDSFID ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003310
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003311 if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
3312 RW_TRACE_ERROR1(
3313 "RW_I93LockDSFID ():Unable to start command at state (0x%X)",
3314 rw_cb.tcb.i93.state);
3315 return NFC_STATUS_BUSY;
3316 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003317
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003318 status = rw_i93_send_cmd_lock_dsfid();
3319 if (status == NFC_STATUS_OK) {
3320 rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
3321 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003322
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003323 return status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003324}
3325
3326/*******************************************************************************
3327**
3328** Function RW_I93GetSysInfo
3329**
3330** Description This function send Get System Information command
3331**
3332** RW_I93_RESPONSE_EVT will be returned
3333**
3334** Returns NFC_STATUS_OK if success
3335** NFC_STATUS_NO_BUFFERS if out of buffer
3336** NFC_STATUS_BUSY if busy
3337** NFC_STATUS_FAILED if other error
3338**
3339*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003340tNFC_STATUS RW_I93GetSysInfo(uint8_t* p_uid) {
3341 tNFC_STATUS status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003342
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003343 RW_TRACE_API0("RW_I93GetSysInfo ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003344
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003345 if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
3346 RW_TRACE_ERROR1(
3347 "RW_I93GetSysInfo ():Unable to start command at state (0x%X)",
3348 rw_cb.tcb.i93.state);
3349 return NFC_STATUS_BUSY;
3350 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003351
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003352 if (p_uid) {
3353 status = rw_i93_send_cmd_get_sys_info(p_uid, I93_FLAG_PROT_EXT_NO);
3354 } else {
3355 status = rw_i93_send_cmd_get_sys_info(NULL, I93_FLAG_PROT_EXT_NO);
3356 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003357
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003358 if (status == NFC_STATUS_OK) {
3359 rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
3360 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003361
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003362 return status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003363}
3364
3365/*******************************************************************************
3366**
3367** Function RW_I93GetMultiBlockSecurityStatus
3368**
Ruchi Kandoi552f2b72017-01-28 16:22:55 -08003369** Description This function send Get Multiple Block Security Status
3370** command
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003371**
3372** RW_I93_RESPONSE_EVT will be returned
3373**
3374** Returns NFC_STATUS_OK if success
3375** NFC_STATUS_NO_BUFFERS if out of buffer
3376** NFC_STATUS_BUSY if busy
3377** NFC_STATUS_FAILED if other error
3378**
3379*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003380tNFC_STATUS RW_I93GetMultiBlockSecurityStatus(uint16_t first_block_number,
3381 uint16_t number_blocks) {
3382 tNFC_STATUS status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003383
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003384 RW_TRACE_API0("RW_I93GetMultiBlockSecurityStatus ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003385
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003386 if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
3387 RW_TRACE_ERROR1(
3388 "RW_I93GetMultiBlockSecurityStatus ():Unable to start command at state "
3389 "(0x%X)",
3390 rw_cb.tcb.i93.state);
3391 return NFC_STATUS_BUSY;
3392 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003393
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003394 status =
3395 rw_i93_send_cmd_get_multi_block_sec(first_block_number, number_blocks);
3396 if (status == NFC_STATUS_OK) {
3397 rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
3398 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003399
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003400 return status;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003401}
3402
3403/*******************************************************************************
3404**
3405** Function RW_I93DetectNDef
3406**
3407** Description This function performs NDEF detection procedure
3408**
3409** RW_I93_NDEF_DETECT_EVT will be returned
3410**
3411** Returns NFC_STATUS_OK if success
3412** NFC_STATUS_FAILED if busy or other error
3413**
3414*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003415tNFC_STATUS RW_I93DetectNDef(void) {
3416 tNFC_STATUS status;
3417 tRW_I93_RW_SUBSTATE sub_state;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003418
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003419 RW_TRACE_API0("RW_I93DetectNDef ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003420
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003421 if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
3422 RW_TRACE_ERROR1(
3423 "RW_I93DetectNDef ():Unable to start command at state (0x%X)",
3424 rw_cb.tcb.i93.state);
3425 return NFC_STATUS_FAILED;
3426 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003427
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003428 if (rw_cb.tcb.i93.uid[0] != I93_UID_FIRST_BYTE) {
3429 status = rw_i93_send_cmd_inventory(NULL, false, 0x00);
3430 sub_state = RW_I93_SUBSTATE_WAIT_UID;
3431 } else if ((rw_cb.tcb.i93.num_block == 0) ||
3432 (rw_cb.tcb.i93.block_size == 0)) {
3433 status =
3434 rw_i93_send_cmd_get_sys_info(rw_cb.tcb.i93.uid, I93_FLAG_PROT_EXT_NO);
3435 sub_state = RW_I93_SUBSTATE_WAIT_SYS_INFO;
Evan Chu85b7e842013-01-18 11:02:50 -05003436
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003437 /* clear all flags */
3438 rw_cb.tcb.i93.intl_flags = 0;
3439 } else {
3440 /* read CC in the first block */
3441 status = rw_i93_send_cmd_read_single_block(0x0000, false);
3442 sub_state = RW_I93_SUBSTATE_WAIT_CC;
3443 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003444
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003445 if (status == NFC_STATUS_OK) {
3446 rw_cb.tcb.i93.state = RW_I93_STATE_DETECT_NDEF;
3447 rw_cb.tcb.i93.sub_state = sub_state;
Evan Chu85b7e842013-01-18 11:02:50 -05003448
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003449 /* clear flags except flag for 2 bytes of number of blocks */
3450 rw_cb.tcb.i93.intl_flags &= RW_I93_FLAG_16BIT_NUM_BLOCK;
3451 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003452
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003453 return (status);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003454}
3455
3456/*******************************************************************************
3457**
3458** Function RW_I93ReadNDef
3459**
3460** Description This function performs NDEF read procedure
3461** Note: RW_I93DetectNDef () must be called before using this
3462**
3463** The following event will be returned
3464** RW_I93_NDEF_READ_EVT for each segmented NDEF message
Ruchi Kandoi552f2b72017-01-28 16:22:55 -08003465** RW_I93_NDEF_READ_CPLT_EVT for the last segment or
3466** complete NDEF
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003467** RW_I93_NDEF_READ_FAIL_EVT for failure
3468**
3469** Returns NFC_STATUS_OK if success
3470** NFC_STATUS_FAILED if I93 is busy or other error
3471**
3472*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003473tNFC_STATUS RW_I93ReadNDef(void) {
3474 RW_TRACE_API0("RW_I93ReadNDef ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003475
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003476 if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
3477 RW_TRACE_ERROR1("RW_I93ReadNDef ():Unable to start command at state (0x%X)",
3478 rw_cb.tcb.i93.state);
3479 return NFC_STATUS_FAILED;
3480 }
3481
3482 if ((rw_cb.tcb.i93.tlv_type == I93_ICODE_TLV_TYPE_NDEF) &&
3483 (rw_cb.tcb.i93.ndef_length > 0)) {
3484 rw_cb.tcb.i93.rw_offset = rw_cb.tcb.i93.ndef_tlv_start_offset;
3485 rw_cb.tcb.i93.rw_length = 0;
3486
3487 if (rw_i93_get_next_blocks(rw_cb.tcb.i93.rw_offset) == NFC_STATUS_OK) {
3488 rw_cb.tcb.i93.state = RW_I93_STATE_READ_NDEF;
3489 } else {
3490 return NFC_STATUS_FAILED;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003491 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003492 } else {
3493 RW_TRACE_ERROR0("RW_I93ReadNDef ():No NDEF detected");
3494 return NFC_STATUS_FAILED;
3495 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003496
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003497 return NFC_STATUS_OK;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003498}
3499
3500/*******************************************************************************
3501**
3502** Function RW_I93UpdateNDef
3503**
3504** Description This function performs NDEF update procedure
3505** Note: RW_I93DetectNDef () must be called before using this
Ruchi Kandoi552f2b72017-01-28 16:22:55 -08003506** Updating data must not be removed until returning
3507** event
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003508**
3509** The following event will be returned
3510** RW_I93_NDEF_UPDATE_CPLT_EVT for complete
3511** RW_I93_NDEF_UPDATE_FAIL_EVT for failure
3512**
3513** Returns NFC_STATUS_OK if success
3514** NFC_STATUS_FAILED if I93 is busy or other error
3515**
3516*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003517tNFC_STATUS RW_I93UpdateNDef(uint16_t length, uint8_t* p_data) {
3518 uint16_t block_number;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003519
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003520 RW_TRACE_API1("RW_I93UpdateNDef () length:%d", length);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003521
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003522 if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
3523 RW_TRACE_ERROR1(
3524 "RW_I93UpdateNDef ():Unable to start command at state (0x%X)",
3525 rw_cb.tcb.i93.state);
3526 return NFC_STATUS_FAILED;
3527 }
3528
3529 if (rw_cb.tcb.i93.tlv_type == I93_ICODE_TLV_TYPE_NDEF) {
3530 if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_READ_ONLY) {
3531 RW_TRACE_ERROR0("RW_I93UpdateNDef ():NDEF is read-only");
3532 return NFC_STATUS_FAILED;
3533 }
3534 if (rw_cb.tcb.i93.max_ndef_length < length) {
3535 RW_TRACE_ERROR2(
3536 "RW_I93UpdateNDef ():data (%d bytes) is more than max NDEF length "
3537 "(%d)",
3538 length, rw_cb.tcb.i93.max_ndef_length);
3539 return NFC_STATUS_FAILED;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003540 }
3541
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003542 rw_cb.tcb.i93.ndef_length = length;
3543 rw_cb.tcb.i93.p_update_data = p_data;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003544
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003545 /* read length field */
3546 rw_cb.tcb.i93.rw_offset = rw_cb.tcb.i93.ndef_tlv_start_offset + 1;
3547 rw_cb.tcb.i93.rw_length = 0;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003548
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003549 block_number = rw_cb.tcb.i93.rw_offset / rw_cb.tcb.i93.block_size;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003550
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003551 if (rw_i93_send_cmd_read_single_block(block_number, false) ==
3552 NFC_STATUS_OK) {
3553 rw_cb.tcb.i93.state = RW_I93_STATE_UPDATE_NDEF;
3554 rw_cb.tcb.i93.sub_state = RW_I93_SUBSTATE_RESET_LEN;
3555 } else {
3556 return NFC_STATUS_FAILED;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003557 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003558 } else {
3559 RW_TRACE_ERROR0("RW_I93ReadNDef ():No NDEF detected");
3560 return NFC_STATUS_FAILED;
3561 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003562
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003563 return NFC_STATUS_OK;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003564}
3565
3566/*******************************************************************************
3567**
3568** Function RW_I93FormatNDef
3569**
3570** Description This function performs formatting procedure
3571**
3572** RW_I93_FORMAT_CPLT_EVT will be returned
3573**
3574** Returns NFC_STATUS_OK if success
3575** NFC_STATUS_FAILED if busy or other error
3576**
3577*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003578tNFC_STATUS RW_I93FormatNDef(void) {
3579 tNFC_STATUS status;
3580 tRW_I93_RW_SUBSTATE sub_state;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003581
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003582 RW_TRACE_API0("RW_I93FormatNDef ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003583
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003584 if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
3585 RW_TRACE_ERROR1(
3586 "RW_I93FormatNDef ():Unable to start command at state (0x%X)",
3587 rw_cb.tcb.i93.state);
3588 return NFC_STATUS_FAILED;
3589 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003590
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003591 if ((rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) ||
3592 (rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY)) {
3593 /* These don't support GetSystemInformation and GetMultiBlockSecurityStatus
3594 */
3595 rw_cb.tcb.i93.rw_offset = 0;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003596
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003597 /* read blocks with option flag to get block security status */
3598 status = rw_i93_send_cmd_read_single_block(0x0000, true);
3599 sub_state = RW_I93_SUBSTATE_CHECK_READ_ONLY;
3600 } else {
3601 status = rw_i93_send_cmd_inventory(rw_cb.tcb.i93.uid, false, 0x00);
3602 sub_state = RW_I93_SUBSTATE_WAIT_UID;
3603 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003604
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003605 if (status == NFC_STATUS_OK) {
3606 rw_cb.tcb.i93.state = RW_I93_STATE_FORMAT;
3607 rw_cb.tcb.i93.sub_state = sub_state;
3608 rw_cb.tcb.i93.intl_flags = 0;
3609 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003610
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003611 return (status);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003612}
3613
3614/*******************************************************************************
3615**
3616** Function RW_I93SetTagReadOnly
3617**
3618** Description This function performs NDEF read-only procedure
3619** Note: RW_I93DetectNDef () must be called before using this
Ruchi Kandoi552f2b72017-01-28 16:22:55 -08003620** Updating data must not be removed until returning
3621** event
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003622**
3623** The RW_I93_SET_TAG_RO_EVT event will be returned.
3624**
3625** Returns NFC_STATUS_OK if success
3626** NFC_STATUS_FAILED if I93 is busy or other error
3627**
3628*******************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003629tNFC_STATUS RW_I93SetTagReadOnly(void) {
3630 RW_TRACE_API0("RW_I93SetTagReadOnly ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003631
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003632 if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
3633 RW_TRACE_ERROR1(
3634 "RW_I93SetTagReadOnly ():Unable to start command at state (0x%X)",
3635 rw_cb.tcb.i93.state);
3636 return NFC_STATUS_FAILED;
3637 }
3638
3639 if (rw_cb.tcb.i93.tlv_type == I93_ICODE_TLV_TYPE_NDEF) {
3640 if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_READ_ONLY) {
3641 RW_TRACE_ERROR0("RW_I93SetTagReadOnly ():NDEF is already read-only");
3642 return NFC_STATUS_FAILED;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003643 }
3644
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003645 /* get CC in the first block */
3646 if (rw_i93_send_cmd_read_single_block(0, false) == NFC_STATUS_OK) {
3647 rw_cb.tcb.i93.state = RW_I93_STATE_SET_READ_ONLY;
3648 rw_cb.tcb.i93.sub_state = RW_I93_SUBSTATE_WAIT_CC;
3649 } else {
3650 return NFC_STATUS_FAILED;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003651 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003652 } else {
3653 RW_TRACE_ERROR0("RW_I93SetTagReadOnly ():No NDEF detected");
3654 return NFC_STATUS_FAILED;
3655 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003656
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003657 return NFC_STATUS_OK;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003658}
3659
3660/*****************************************************************************
3661**
3662** Function RW_I93PresenceCheck
3663**
3664** Description Check if the tag is still in the field.
3665**
3666** The RW_I93_PRESENCE_CHECK_EVT w/ status is used to indicate
3667** presence or non-presence.
3668**
3669** Returns NFC_STATUS_OK, if raw data frame sent
Ruchi Kandoi552f2b72017-01-28 16:22:55 -08003670** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this
3671** operation
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003672** NFC_STATUS_FAILED: other error
3673**
3674*****************************************************************************/
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003675tNFC_STATUS RW_I93PresenceCheck(void) {
3676 tNFC_STATUS status;
3677 tRW_DATA evt_data;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003678
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003679 RW_TRACE_API0("RW_I93PresenceCheck ()");
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003680
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003681 if (!rw_cb.p_cback) {
3682 return NFC_STATUS_FAILED;
3683 } else if (rw_cb.tcb.i93.state == RW_I93_STATE_NOT_ACTIVATED) {
3684 evt_data.status = NFC_STATUS_FAILED;
3685 (*rw_cb.p_cback)(RW_T4T_PRESENCE_CHECK_EVT, &evt_data);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003686
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003687 return NFC_STATUS_OK;
3688 } else if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
3689 return NFC_STATUS_BUSY;
3690 } else {
3691 /* The support of AFI by the VICC is optional, so do not include AFI */
3692 status = rw_i93_send_cmd_inventory(rw_cb.tcb.i93.uid, false, 0x00);
3693
3694 if (status == NFC_STATUS_OK) {
3695 /* do not retry during presence check */
3696 rw_cb.tcb.i93.retry_count = RW_MAX_RETRIES;
3697 rw_cb.tcb.i93.state = RW_I93_STATE_PRESENCE_CHECK;
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003698 }
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003699 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003700
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003701 return (status);
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003702}
3703
3704#if (BT_TRACE_VERBOSE == TRUE)
3705/*******************************************************************************
3706**
3707** Function rw_i93_get_state_name
3708**
3709** Description This function returns the state name.
3710**
3711** NOTE conditionally compiled to save memory.
3712**
3713** Returns pointer to the name
3714**
3715*******************************************************************************/
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003716static std::string rw_i93_get_state_name(uint8_t state) {
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003717 switch (state) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003718 case RW_I93_STATE_NOT_ACTIVATED:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003719 return "NOT_ACTIVATED";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003720 case RW_I93_STATE_IDLE:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003721 return "IDLE";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003722 case RW_I93_STATE_BUSY:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003723 return "BUSY";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003724 case RW_I93_STATE_DETECT_NDEF:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003725 return "NDEF_DETECTION";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003726 case RW_I93_STATE_READ_NDEF:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003727 return "READ_NDEF";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003728 case RW_I93_STATE_UPDATE_NDEF:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003729 return "UPDATE_NDEF";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003730 case RW_I93_STATE_FORMAT:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003731 return "FORMAT";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003732 case RW_I93_STATE_SET_READ_ONLY:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003733 return "SET_READ_ONLY";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003734 case RW_I93_STATE_PRESENCE_CHECK:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003735 return "PRESENCE_CHECK";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003736 default:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003737 return "???? UNKNOWN STATE";
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003738 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003739}
3740
3741/*******************************************************************************
3742**
3743** Function rw_i93_get_sub_state_name
3744**
3745** Description This function returns the sub_state name.
3746**
3747** NOTE conditionally compiled to save memory.
3748**
3749** Returns pointer to the name
3750**
3751*******************************************************************************/
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003752static std::string rw_i93_get_sub_state_name(uint8_t sub_state) {
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003753 switch (sub_state) {
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003754 case RW_I93_SUBSTATE_WAIT_UID:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003755 return "WAIT_UID";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003756 case RW_I93_SUBSTATE_WAIT_SYS_INFO:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003757 return "WAIT_SYS_INFO";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003758 case RW_I93_SUBSTATE_WAIT_CC:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003759 return "WAIT_CC";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003760 case RW_I93_SUBSTATE_SEARCH_NDEF_TLV:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003761 return "SEARCH_NDEF_TLV";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003762 case RW_I93_SUBSTATE_CHECK_LOCK_STATUS:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003763 return "CHECK_LOCK_STATUS";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003764 case RW_I93_SUBSTATE_RESET_LEN:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003765 return "RESET_LEN";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003766 case RW_I93_SUBSTATE_WRITE_NDEF:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003767 return "WRITE_NDEF";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003768 case RW_I93_SUBSTATE_UPDATE_LEN:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003769 return "UPDATE_LEN";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003770 case RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003771 return "WAIT_RESET_DSFID_AFI";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003772 case RW_I93_SUBSTATE_CHECK_READ_ONLY:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003773 return "CHECK_READ_ONLY";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003774 case RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003775 return "WRITE_CC_NDEF_TLV";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003776 case RW_I93_SUBSTATE_WAIT_UPDATE_CC:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003777 return "WAIT_UPDATE_CC";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003778 case RW_I93_SUBSTATE_LOCK_NDEF_TLV:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003779 return "LOCK_NDEF_TLV";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003780 case RW_I93_SUBSTATE_WAIT_LOCK_CC:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003781 return "WAIT_LOCK_CC";
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003782 default:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003783 return "???? UNKNOWN SUBSTATE";
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003784 }
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003785}
Evan Chu85b7e842013-01-18 11:02:50 -05003786
3787/*******************************************************************************
3788**
3789** Function rw_i93_get_tag_name
3790**
3791** Description This function returns the tag name.
3792**
3793** NOTE conditionally compiled to save memory.
3794**
3795** Returns pointer to the name
3796**
3797*******************************************************************************/
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003798static std::string rw_i93_get_tag_name(uint8_t product_version) {
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003799 switch (product_version) {
Evan Chu85b7e842013-01-18 11:02:50 -05003800 case RW_I93_ICODE_SLI:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003801 return "SLI/SLIX";
Evan Chu85b7e842013-01-18 11:02:50 -05003802 case RW_I93_ICODE_SLI_S:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003803 return "SLI-S/SLIX-S";
Evan Chu85b7e842013-01-18 11:02:50 -05003804 case RW_I93_ICODE_SLI_L:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003805 return "SLI-L/SLIX-L";
Evan Chu85b7e842013-01-18 11:02:50 -05003806 case RW_I93_TAG_IT_HF_I_PLUS_INLAY:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003807 return "Tag-it HF-I Plus Inlay";
Evan Chu85b7e842013-01-18 11:02:50 -05003808 case RW_I93_TAG_IT_HF_I_PLUS_CHIP:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003809 return "Tag-it HF-I Plus Chip";
Evan Chu85b7e842013-01-18 11:02:50 -05003810 case RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003811 return "Tag-it HF-I Standard Chip/Inlyas";
Evan Chu85b7e842013-01-18 11:02:50 -05003812 case RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003813 return "Tag-it HF-I Pro Chip/Inlays";
Evan Chu85b7e842013-01-18 11:02:50 -05003814 case RW_I93_STM_LRI1K:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003815 return "LRi1K";
Evan Chu85b7e842013-01-18 11:02:50 -05003816 case RW_I93_STM_LRI2K:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003817 return "LRi2K";
Evan Chu85b7e842013-01-18 11:02:50 -05003818 case RW_I93_STM_LRIS2K:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003819 return "LRiS2K";
Evan Chu85b7e842013-01-18 11:02:50 -05003820 case RW_I93_STM_LRIS64K:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003821 return "LRiS64K";
Evan Chu85b7e842013-01-18 11:02:50 -05003822 case RW_I93_STM_M24LR64_R:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003823 return "M24LR64";
Evan Chu85b7e842013-01-18 11:02:50 -05003824 case RW_I93_STM_M24LR04E_R:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003825 return "M24LR04E";
Evan Chu85b7e842013-01-18 11:02:50 -05003826 case RW_I93_STM_M24LR16E_R:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003827 return "M24LR16E";
Evan Chu85b7e842013-01-18 11:02:50 -05003828 case RW_I93_STM_M24LR64E_R:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003829 return "M24LR64E";
Evan Chu85b7e842013-01-18 11:02:50 -05003830 case RW_I93_UNKNOWN_PRODUCT:
3831 default:
Ruchi Kandoi7dab0e52017-08-03 13:09:49 -07003832 return "UNKNOWN";
Ruchi Kandoi6fca02d2017-01-30 14:28:16 -08003833 }
Evan Chu85b7e842013-01-18 11:02:50 -05003834}
3835
The Android Open Source Projecte9df6ba2012-12-13 14:55:37 -08003836#endif