1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu *  Copyright (C) 2011-2014 Broadcom Corporation
4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  you may not use this file except in compliance with the License.
7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  You may obtain a copy of the License at:
8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  See the License for the specific language governing permissions and
15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  limitations under the License.
16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  This file contains the implementation for ISO 15693 in Reader/Writer
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  mode.
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h>
268a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach
278a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include <android-base/stringprintf.h>
288a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include <base/logging.h>
298a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach
306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfc_target.h"
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
328a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include "bt_types.h"
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_api.h"
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_int.h"
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "rw_api.h"
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "rw_int.h"
378a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include "trace_api.h"
388a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach
398a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbachusing android::base::StringPrintf;
408a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach
418a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbachextern bool nfc_debug_enabled;
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4346e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi/* Response timeout     */
4446e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi#define RW_I93_TOUT_RESP 1000
4546e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi/* stay quiet timeout   */
4646e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi#define RW_I93_TOUT_STAY_QUIET 200
4746e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi/* max reading data if read multi block is supported */
4846e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi#define RW_I93_READ_MULTI_BLOCK_SIZE 128
4946e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi/* CC, zero length NDEF, Terminator TLV              */
5046e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi#define RW_I93_FORMAT_DATA_LEN 8
5146e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi/* max getting lock status if get multi block sec is supported */
5246e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi#define RW_I93_GET_MULTI_BLOCK_SEC_SIZE 253
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* main state */
556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoienum {
566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_STATE_NOT_ACTIVATED, /* ISO15693 is not activated            */
576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_STATE_IDLE,          /* waiting for upper layer API          */
586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_STATE_BUSY,          /* waiting for response from tag        */
596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_STATE_DETECT_NDEF,   /* performing NDEF detection precedure  */
616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_STATE_READ_NDEF,     /* performing read NDEF procedure       */
626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_STATE_UPDATE_NDEF,   /* performing update NDEF procedure     */
636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_STATE_FORMAT,        /* performing format procedure          */
646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_STATE_SET_READ_ONLY, /* performing set read-only procedure   */
656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_STATE_PRESENCE_CHECK /* checking presence of tag             */
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project};
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* sub state */
706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoienum {
716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_SUBSTATE_WAIT_UID,          /* waiting for response of inventory    */
726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_SUBSTATE_WAIT_SYS_INFO,     /* waiting for response of get sys info */
736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_SUBSTATE_WAIT_CC,           /* waiting for reading CC               */
746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_SUBSTATE_SEARCH_NDEF_TLV,   /* searching NDEF TLV                   */
756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_SUBSTATE_CHECK_LOCK_STATUS, /* check if any NDEF TLV is locked      */
766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_SUBSTATE_RESET_LEN,  /* set length to 0 to update NDEF TLV   */
786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_SUBSTATE_WRITE_NDEF, /* writing NDEF and Terminator TLV      */
796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_SUBSTATE_UPDATE_LEN, /* set length into NDEF TLV             */
806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI, /* reset DSFID and AFI */
826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_SUBSTATE_CHECK_READ_ONLY,   /* check if any block is locked         */
836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV, /* write CC and empty NDEF/Terminator TLV
846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                        */
856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_SUBSTATE_WAIT_UPDATE_CC, /* updating CC as read-only             */
876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_SUBSTATE_LOCK_NDEF_TLV,  /* lock blocks of NDEF TLV              */
886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_I93_SUBSTATE_WAIT_LOCK_CC    /* lock block of CC                     */
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project};
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
917dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoistatic std::string rw_i93_get_state_name(uint8_t state);
927dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoistatic std::string rw_i93_get_sub_state_name(uint8_t sub_state);
937dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoistatic std::string rw_i93_get_tag_name(uint8_t product_version);
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_i93_data_cback(uint8_t conn_id, tNFC_CONN_EVT event,
966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                              tNFC_CONN* p_data);
976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_i93_handle_error(tNFC_STATUS status);
986fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_i93_send_cmd_get_sys_info(uint8_t* p_uid, uint8_t extra_flag);
99867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael ColladotNFC_STATUS rw_i93_send_cmd_get_ext_sys_info(uint8_t* p_uid);
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_get_product_version
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Get product version from UID
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_i93_get_product_version(uint8_t* p_uid) {
1116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!memcmp(p_i93->uid, p_uid, I93_UID_BYTE_LEN)) {
1146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return;
1156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1176767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  memcpy(p_i93->uid, p_uid, I93_UID_BYTE_LEN);
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_uid[1] == I93_UID_IC_MFG_CODE_NXP) {
1226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_uid[2] == I93_UID_ICODE_SLI)
1236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->product_version = RW_I93_ICODE_SLI;
1246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    else if (p_uid[2] == I93_UID_ICODE_SLI_S)
1256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->product_version = RW_I93_ICODE_SLI_S;
1266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    else if (p_uid[2] == I93_UID_ICODE_SLI_L)
1276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->product_version = RW_I93_ICODE_SLI_L;
1286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    else
1296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->product_version = RW_I93_UNKNOWN_PRODUCT;
1306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (p_uid[1] == I93_UID_IC_MFG_CODE_TI) {
1316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((p_uid[2] & I93_UID_TAG_IT_HF_I_PRODUCT_ID_MASK) ==
1326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        I93_UID_TAG_IT_HF_I_PLUS_INLAY)
1336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->product_version = RW_I93_TAG_IT_HF_I_PLUS_INLAY;
1346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    else if ((p_uid[2] & I93_UID_TAG_IT_HF_I_PRODUCT_ID_MASK) ==
1356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             I93_UID_TAG_IT_HF_I_PLUS_CHIP)
1366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->product_version = RW_I93_TAG_IT_HF_I_PLUS_CHIP;
1376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    else if ((p_uid[2] & I93_UID_TAG_IT_HF_I_PRODUCT_ID_MASK) ==
1386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             I93_UID_TAG_IT_HF_I_STD_CHIP_INLAY)
1396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->product_version = RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY;
1406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    else if ((p_uid[2] & I93_UID_TAG_IT_HF_I_PRODUCT_ID_MASK) ==
1416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             I93_UID_TAG_IT_HF_I_PRO_CHIP_INLAY)
1426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->product_version = RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY;
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->product_version = RW_I93_UNKNOWN_PRODUCT;
1456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if ((p_uid[1] == I93_UID_IC_MFG_CODE_STM) &&
1466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             (p_i93->info_flags & I93_INFO_FLAG_IC_REF)) {
1476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_i93->ic_reference == I93_IC_REF_STM_M24LR04E_R)
1486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->product_version = RW_I93_STM_M24LR04E_R;
1496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    else if (p_i93->ic_reference == I93_IC_REF_STM_M24LR16E_R)
1506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->product_version = RW_I93_STM_M24LR16E_R;
1516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    else if (p_i93->ic_reference == I93_IC_REF_STM_M24LR64E_R)
1526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->product_version = RW_I93_STM_M24LR64E_R;
153867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    else if (p_i93->ic_reference == I93_IC_REF_STM_ST25DVHIK)
154867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      p_i93->product_version = RW_I93_STM_ST25DVHIK;
155867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    else if (p_i93->ic_reference == I93_IC_REF_STM_ST25DV04K)
156867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      p_i93->product_version = RW_I93_STM_ST25DV04K;
1576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    else {
1586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      switch (p_i93->ic_reference & I93_IC_REF_STM_MASK) {
1596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        case I93_IC_REF_STM_LRI1K:
1606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->product_version = RW_I93_STM_LRI1K;
1616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          break;
1626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        case I93_IC_REF_STM_LRI2K:
1636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->product_version = RW_I93_STM_LRI2K;
1646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          break;
1656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        case I93_IC_REF_STM_LRIS2K:
1666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->product_version = RW_I93_STM_LRIS2K;
1676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          break;
1686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        case I93_IC_REF_STM_LRIS64K:
1696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->product_version = RW_I93_STM_LRIS64K;
1706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          break;
1716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        case I93_IC_REF_STM_M24LR64_R:
1726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->product_version = RW_I93_STM_M24LR64_R;
1736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          break;
1746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        default:
1756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->product_version = RW_I93_UNKNOWN_PRODUCT;
1766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          break;
1776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
1806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_i93->product_version = RW_I93_UNKNOWN_PRODUCT;
1816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1836767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
1846767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("product_version = <%s>",
1856767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                      rw_i93_get_tag_name(p_i93->product_version).c_str());
186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (p_i93->product_version) {
188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY:
189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY:
1906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* these don't support Get System Information Command */
1916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* these support only Inventory, Stay Quiet, Read Single Block, Write
1926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       * Single Block, Lock Block */
1936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->block_size = I93_TAG_IT_HF_I_STD_PRO_CHIP_INLAY_BLK_SIZE;
1946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->num_block = I93_TAG_IT_HF_I_STD_PRO_CHIP_INLAY_NUM_USER_BLK;
1956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
19685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu    default:
1976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
1986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
203867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado** Function         rw_i93_process_ext_sys_info
204867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado**
205867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado** Description      Store extended system information of tag
206867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado**
207867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado** Returns          FALSE if retrying with protocol extension flag
208867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado**
209867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado*******************************************************************************/
210867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Colladobool rw_i93_process_ext_sys_info(uint8_t* p_data) {
211867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  uint8_t* p = p_data;
212867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
213867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  uint8_t uid[I93_UID_BYTE_LEN], *p_uid;
214867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
215867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
216867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
217867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  STREAM_TO_UINT8(p_i93->info_flags, p);
218867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
219867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  p_uid = uid;
220867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  STREAM_TO_ARRAY8(p_uid, p);
221867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
222867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  if (p_i93->info_flags & I93_INFO_FLAG_DSFID) {
223867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    STREAM_TO_UINT8(p_i93->dsfid, p);
224867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  }
225867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  if (p_i93->info_flags & I93_INFO_FLAG_AFI) {
226867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    STREAM_TO_UINT8(p_i93->afi, p);
227867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  }
228867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  if (p_i93->info_flags & I93_INFO_FLAG_MEM_SIZE) {
229867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    STREAM_TO_UINT16(p_i93->num_block, p);
230867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
231867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    /* it is one less than actual number of bytes */
232867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    p_i93->num_block += 1;
233867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
234867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    STREAM_TO_UINT8(p_i93->block_size, p);
235867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    /* it is one less than actual number of blocks */
236867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    p_i93->block_size = (p_i93->block_size & 0x1F) + 1;
237867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  }
238867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  if (p_i93->info_flags & I93_INFO_FLAG_IC_REF) {
239867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    STREAM_TO_UINT8(p_i93->ic_reference, p);
240867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
241867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    /* clear existing UID to set product version */
242867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    p_i93->uid[0] = 0x00;
243867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
244867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    /* store UID and get product version */
245867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    rw_i93_get_product_version(p_uid);
246867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
247867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    if (p_i93->uid[0] == I93_UID_FIRST_BYTE) {
248867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      if (p_i93->uid[1] == I93_UID_IC_MFG_CODE_STM) {
249867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado        /* STM supports more than 2040 bytes */
250867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado        p_i93->intl_flags |= RW_I93_FLAG_EXT_COMMANDS;
251867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      }
252867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    }
253867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  }
254867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  return true;
255867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado}
256867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
257867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado/*******************************************************************************
258867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado**
25985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** Function         rw_i93_process_sys_info
26085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu**
26185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** Description      Store system information of tag
26285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu**
26385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** Returns          FALSE if retrying with protocol extension flag
26485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu**
26585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu*******************************************************************************/
2666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool rw_i93_process_sys_info(uint8_t* p_data) {
2676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p = p_data;
2686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
2696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t uid[I93_UID_BYTE_LEN], *p_uid;
2706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2716767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
2726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  STREAM_TO_UINT8(p_i93->info_flags, p);
2746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_uid = uid;
2766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  STREAM_TO_ARRAY8(p_uid, p);
2776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_i93->info_flags & I93_INFO_FLAG_DSFID) {
2796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    STREAM_TO_UINT8(p_i93->dsfid, p);
2806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_i93->info_flags & I93_INFO_FLAG_AFI) {
2826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    STREAM_TO_UINT8(p_i93->afi, p);
2836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_i93->info_flags & I93_INFO_FLAG_MEM_SIZE) {
2856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_i93->intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK) {
2866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      STREAM_TO_UINT16(p_i93->num_block, p);
2876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
2886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      STREAM_TO_UINT8(p_i93->num_block, p);
2896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
2906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* it is one less than actual number of bytes */
2916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_i93->num_block += 1;
2926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    STREAM_TO_UINT8(p_i93->block_size, p);
2946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* it is one less than actual number of blocks */
2956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_i93->block_size = (p_i93->block_size & 0x1F) + 1;
2966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_i93->info_flags & I93_INFO_FLAG_IC_REF) {
2986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    STREAM_TO_UINT8(p_i93->ic_reference, p);
2996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* clear existing UID to set product version */
3016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_i93->uid[0] = 0x00;
3026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* store UID and get product version */
3046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_i93_get_product_version(p_uid);
3056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_i93->uid[0] == I93_UID_FIRST_BYTE) {
3076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((p_i93->uid[1] == I93_UID_IC_MFG_CODE_NXP) &&
3086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (p_i93->ic_reference == I93_IC_REF_ICODE_SLI_L)) {
3096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->num_block = 8;
3106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->block_size = 4;
3116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else if (p_i93->uid[1] == I93_UID_IC_MFG_CODE_STM) {
3126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /*
3136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        **  LRI1K:      010000xx(b), blockSize: 4, numberBlocks: 0x20
3146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        **  LRI2K:      001000xx(b), blockSize: 4, numberBlocks: 0x40
3156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        **  LRIS2K:     001010xx(b), blockSize: 4, numberBlocks: 0x40
3166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        **  LRIS64K:    010001xx(b), blockSize: 4, numberBlocks: 0x800
3176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        **  M24LR64-R:  001011xx(b), blockSize: 4, numberBlocks: 0x800
3186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        **  M24LR04E-R: 01011010(b), blockSize: 4, numberBlocks: 0x80
3196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        **  M24LR16E-R: 01001110(b), blockSize: 4, numberBlocks: 0x200
3206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        **  M24LR64E-R: 01011110(b), blockSize: 4, numberBlocks: 0x800
3216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        */
3226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if ((p_i93->product_version == RW_I93_STM_M24LR16E_R) ||
3236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (p_i93->product_version == RW_I93_STM_M24LR64E_R)) {
3246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /*
3256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          ** M24LR16E-R or M24LR64E-R returns system information
3266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          ** without memory size, if option flag is not set.
3276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          ** LRIS64K and M24LR64-R return error if option flag is not
3286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          ** set.
3296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          */
3306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (!(p_i93->intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK)) {
3316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            /* get memory size with protocol extension flag */
3326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            if (rw_i93_send_cmd_get_sys_info(NULL, I93_FLAG_PROT_EXT_YES) ==
3336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                NFC_STATUS_OK) {
3346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              /* STM supports more than 2040 bytes */
3356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              p_i93->intl_flags |= RW_I93_FLAG_16BIT_NUM_BLOCK;
3366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              return false;
3386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            }
3396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
3406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else if ((p_i93->product_version == RW_I93_STM_LRI2K) &&
3416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   (p_i93->ic_reference == 0x21)) {
3426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* workaround of byte order in memory size information */
3436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->num_block = 64;
3446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->block_size = 4;
345867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado        } else if (!(p_i93->info_flags & I93_INFO_FLAG_MEM_SIZE)) {
346867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado          if (!(p_i93->intl_flags & RW_I93_FLAG_EXT_COMMANDS)) {
347867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado            if (rw_i93_send_cmd_get_ext_sys_info(NULL) == NFC_STATUS_OK) {
348867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado              /* STM supports more than 2040 bytes */
349867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado              p_i93->intl_flags |= RW_I93_FLAG_EXT_COMMANDS;
350867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
351867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado              return false;
352867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado            }
353867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado          }
3546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
3556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
3566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
3576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
36085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu}
36185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
36285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu/*******************************************************************************
36385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu**
36485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** Function         rw_i93_check_sys_info_prot_ext
36585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu**
366552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      Check if need to set protocol extension flag to get system
367552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  info
36885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu**
36985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** Returns          TRUE if sent Get System Info with protocol extension flag
37085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu**
37185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu*******************************************************************************/
3726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool rw_i93_check_sys_info_prot_ext(uint8_t error_code) {
3736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
3746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3756767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
3766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_i93->uid[1] == I93_UID_IC_MFG_CODE_STM) &&
3786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (p_i93->sent_cmd == I93_CMD_GET_SYS_INFO) &&
3796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (error_code == I93_ERROR_CODE_OPTION_NOT_SUPPORTED) &&
3806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (rw_i93_send_cmd_get_sys_info(NULL, I93_FLAG_PROT_EXT_YES) ==
3816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       NFC_STATUS_OK)) {
3826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return true;
3836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
3846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return false;
3856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
38685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu}
38785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
38885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu/*******************************************************************************
38985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu**
390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_send_to_upper
391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send response to upper layer
393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_i93_send_to_upper(NFC_HDR* p_resp) {
3987dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi  uint8_t *p = (uint8_t*)(p_resp + 1) + p_resp->offset, *p_uid;
3996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t length = p_resp->len;
4006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
4016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_DATA rw_data;
4026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t event = RW_I93_MAX_EVT;
4036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t flags;
4046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_buff;
4056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4066767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
4076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  STREAM_TO_UINT8(flags, p);
4096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  length--;
4106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (flags & I93_FLAG_ERROR_DETECTED) {
4126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((length) && (rw_i93_check_sys_info_prot_ext(*p))) {
4136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* getting system info with protocol extension flag */
4146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* This STM tag supports more than 2040 bytes */
4156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->intl_flags |= RW_I93_FLAG_16BIT_NUM_BLOCK;
4166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->state = RW_I93_STATE_BUSY;
4176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
4186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* notify error to upper layer */
4196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_data.i93_cmd_cmpl.status = NFC_STATUS_FAILED;
4206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_data.i93_cmd_cmpl.command = p_i93->sent_cmd;
4216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      STREAM_TO_UINT8(rw_data.i93_cmd_cmpl.error_code, p);
4226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_cb.tcb.i93.sent_cmd = 0;
4246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (*(rw_cb.p_cback))(RW_I93_CMD_CMPL_EVT, &rw_data);
4256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
4266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return;
4276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
4286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (p_i93->sent_cmd) {
430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case I93_CMD_INVENTORY:
431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* forward inventory response */
4336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_data.i93_inventory.status = NFC_STATUS_OK;
4346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      STREAM_TO_UINT8(rw_data.i93_inventory.dsfid, p);
435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_uid = rw_data.i93_inventory.uid;
4376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      STREAM_TO_ARRAY8(p_uid, p);
438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* store UID and get product version */
4406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_i93_get_product_version(p_uid);
441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      event = RW_I93_INVENTORY_EVT;
4436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case I93_CMD_READ_SINGLE_BLOCK:
446867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    case I93_CMD_EXT_READ_SINGLE_BLOCK:
447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case I93_CMD_READ_MULTI_BLOCK:
448867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    case I93_CMD_EXT_READ_MULTI_BLOCK:
449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case I93_CMD_GET_MULTI_BLK_SEC:
450867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    case I93_CMD_EXT_GET_MULTI_BLK_SEC:
451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* forward tag data or security status */
4536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buff = (NFC_HDR*)GKI_getbuf((uint16_t)(length + NFC_HDR_SIZE));
454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_buff) {
4566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buff->offset = 0;
4576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buff->len = length;
458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        memcpy((p_buff + 1), p, length);
460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.i93_data.status = NFC_STATUS_OK;
4626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.i93_data.command = p_i93->sent_cmd;
4636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.i93_data.p_data = p_buff;
464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        event = RW_I93_DATA_EVT;
4666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
4676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.i93_cmd_cmpl.status = NFC_STATUS_NO_BUFFERS;
4686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.i93_cmd_cmpl.command = p_i93->sent_cmd;
4696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.i93_cmd_cmpl.error_code = 0;
470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        event = RW_I93_CMD_CMPL_EVT;
4726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
4736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case I93_CMD_WRITE_SINGLE_BLOCK:
476867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    case I93_CMD_EXT_WRITE_SINGLE_BLOCK:
477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case I93_CMD_LOCK_BLOCK:
478867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    case I93_CMD_EXT_LOCK_BLOCK:
479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case I93_CMD_WRITE_MULTI_BLOCK:
480867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    case I93_CMD_EXT_WRITE_MULTI_BLOCK:
481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case I93_CMD_SELECT:
482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case I93_CMD_RESET_TO_READY:
483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case I93_CMD_WRITE_AFI:
484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case I93_CMD_LOCK_AFI:
485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case I93_CMD_WRITE_DSFID:
486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case I93_CMD_LOCK_DSFID:
487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* notify the complete of command */
4896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_data.i93_cmd_cmpl.status = NFC_STATUS_OK;
4906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_data.i93_cmd_cmpl.command = p_i93->sent_cmd;
4916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_data.i93_cmd_cmpl.error_code = 0;
492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      event = RW_I93_CMD_CMPL_EVT;
4946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case I93_CMD_GET_SYS_INFO:
497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (rw_i93_process_sys_info(p)) {
4996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.i93_sys_info.status = NFC_STATUS_OK;
5006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.i93_sys_info.info_flags = p_i93->info_flags;
5016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.i93_sys_info.dsfid = p_i93->dsfid;
5026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.i93_sys_info.afi = p_i93->afi;
5036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.i93_sys_info.num_block = p_i93->num_block;
5046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.i93_sys_info.block_size = p_i93->block_size;
5056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.i93_sys_info.IC_reference = p_i93->ic_reference;
5066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        memcpy(rw_data.i93_sys_info.uid, p_i93->uid, I93_UID_BYTE_LEN);
5086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        event = RW_I93_SYS_INFO_EVT;
5106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
5116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* retrying with protocol extension flag */
5126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->state = RW_I93_STATE_BUSY;
5136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        return;
5146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
5156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
517867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    case I93_CMD_EXT_GET_SYS_INFO:
518867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
519867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      if (rw_i93_process_ext_sys_info(p)) {
520867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado        rw_data.i93_sys_info.status = NFC_STATUS_OK;
521867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado        rw_data.i93_sys_info.info_flags = p_i93->info_flags;
522867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado        rw_data.i93_sys_info.dsfid = p_i93->dsfid;
523867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado        rw_data.i93_sys_info.afi = p_i93->afi;
524867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado        rw_data.i93_sys_info.num_block = p_i93->num_block;
525867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado        rw_data.i93_sys_info.block_size = p_i93->block_size;
526867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado        rw_data.i93_sys_info.IC_reference = p_i93->ic_reference;
527867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
528867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado        memcpy(rw_data.i93_sys_info.uid, p_i93->uid, I93_UID_BYTE_LEN);
529867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
530867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado        event = RW_I93_SYS_INFO_EVT;
531867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      } else {
532867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado        /* retrying with protocol extension flag or with extended sys info
533867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado         * command */
534867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado        p_i93->state = RW_I93_STATE_BUSY;
535867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado        return;
536867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      }
537867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      break;
538867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
5406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
5416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
5426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  rw_cb.tcb.i93.sent_cmd = 0;
5446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (event != RW_I93_MAX_EVT) {
5456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    (*(rw_cb.p_cback))(event, &rw_data);
5466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
5476767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Invalid response");
5486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_send_to_lower
554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send Request frame to lower layer
556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if success
558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool rw_i93_send_to_lower(NFC_HDR* p_msg) {
5616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* store command for retransmitting */
5626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.p_retry_cmd) {
5636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_freebuf(rw_cb.tcb.i93.p_retry_cmd);
5646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.p_retry_cmd = NULL;
5656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
56685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
5676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  rw_cb.tcb.i93.p_retry_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
56885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
5696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.p_retry_cmd) {
5706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    memcpy(rw_cb.tcb.i93.p_retry_cmd, p_msg,
5716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           sizeof(NFC_HDR) + p_msg->offset + p_msg->len);
5726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
57385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
5746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (NFC_SendData(NFC_RF_CONN_ID, p_msg) != NFC_STATUS_OK) {
5756767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("failed");
5766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return false;
5776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfc_start_quick_timer(&rw_cb.tcb.i93.timer, NFC_TTYPE_RW_I93_RESPONSE,
5806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                        (RW_I93_TOUT_RESP * QUICK_TIMER_TICKS_PER_SEC) / 1000);
581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_send_cmd_inventory
588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send Inventory Request to VICC
590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5946fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_i93_send_cmd_inventory(uint8_t* p_uid, bool including_afi,
5956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                      uint8_t afi) {
5966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_cmd;
5976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t *p, flags;
598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5996767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
6006767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("including_afi:%d, AFI:0x%02X", including_afi, afi);
601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_cmd) {
6056767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
6066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_NO_BUFFERS;
6076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
6096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
6106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->len = 3;
6116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Flags */
6146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  flags = (I93_FLAG_SLOT_ONE | I93_FLAG_INVENTORY_SET |
6156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE);
6166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (including_afi) {
6176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    flags |= I93_FLAG_AFI_PRESENT;
6186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, flags);
6215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
6226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Command Code */
6236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, I93_CMD_INVENTORY);
624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (including_afi) {
6266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Parameters */
6276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    UINT8_TO_STREAM(p, afi); /* Optional AFI */
6286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd->len++;
6296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_uid) {
6326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    UINT8_TO_STREAM(p, I93_UID_BYTE_LEN * 8); /* Mask Length */
6336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ARRAY8_TO_STREAM(p, p_uid);               /* UID */
6346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd->len += I93_UID_BYTE_LEN;
6356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
6366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    UINT8_TO_STREAM(p, 0x00); /* Mask Length */
6376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_i93_send_to_lower(p_cmd)) {
6406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.sent_cmd = I93_CMD_INVENTORY;
6416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_OK;
6426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
6436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
6446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_send_cmd_stay_quiet
650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send Stay Quiet Request to VICC
652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
6566fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_i93_send_cmd_stay_quiet(void) {
6576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_cmd;
6586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6606767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_cmd) {
6656767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
6666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_NO_BUFFERS;
6676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
6706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->len = 10;
6716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Flags */
6746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
6756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      RW_I93_FLAG_DATA_RATE));
676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Command Code */
6786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, I93_CMD_STAY_QUIET);
679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Parameters */
6816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_i93_send_to_lower(p_cmd)) {
6846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.sent_cmd = I93_CMD_STAY_QUIET;
685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* restart timer for stay quiet */
6876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfc_start_quick_timer(
6886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        &rw_cb.tcb.i93.timer, NFC_TTYPE_RW_I93_RESPONSE,
6896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (RW_I93_TOUT_STAY_QUIET * QUICK_TIMER_TICKS_PER_SEC) / 1000);
6906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_OK;
6916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
6926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
6936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_send_cmd_read_single_block
699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send Read Single Block Request to VICC
701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
7056fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_i93_send_cmd_read_single_block(uint16_t block_number,
7066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                              bool read_security) {
7076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_cmd;
7086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t *p, flags;
709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7106767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_cmd) {
7156767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
7166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_NO_BUFFERS;
7176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
7206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->len = 11;
7216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Flags */
7246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  flags =
7256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE);
72685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
7276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (read_security) flags |= I93_FLAG_OPTION_SET;
72885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
7296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK)
7306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    flags |= I93_FLAG_PROT_EXT_YES;
73185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
7326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, flags);
733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Command Code */
735867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
736867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    UINT8_TO_STREAM(p, I93_CMD_EXT_READ_SINGLE_BLOCK);
737867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  } else {
738867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    UINT8_TO_STREAM(p, I93_CMD_READ_SINGLE_BLOCK);
739867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  }
740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Parameters */
7426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
74385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
744867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK ||
745867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
7466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    UINT16_TO_STREAM(p, block_number); /* Block number */
7476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd->len++;
7486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
7496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    UINT8_TO_STREAM(p, block_number); /* Block number */
7506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_i93_send_to_lower(p_cmd)) {
753867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS)
754867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      rw_cb.tcb.i93.sent_cmd = I93_CMD_EXT_READ_SINGLE_BLOCK;
755867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    else
756867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      rw_cb.tcb.i93.sent_cmd = I93_CMD_READ_SINGLE_BLOCK;
7576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_OK;
7586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
7596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
7606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_send_cmd_write_single_block
766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send Write Single Block Request to VICC
768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
7726fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_i93_send_cmd_write_single_block(uint16_t block_number,
7736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                               uint8_t* p_data) {
7746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_cmd;
7756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t *p, flags;
7766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7776767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
7786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
7806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_cmd) {
7826767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
7836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_NO_BUFFERS;
7846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
7856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
7876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->len = 11 + rw_cb.tcb.i93.block_size;
7886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
7896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Flags */
7916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_PLUS_INLAY) ||
7926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_PLUS_CHIP) ||
7936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) ||
7946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY)) {
7956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Option must be set for TI tag */
7966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    flags = (I93_FLAG_ADDRESS_SET | I93_FLAG_OPTION_SET |
7976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE);
7986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
7996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    flags = (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
8006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             RW_I93_FLAG_DATA_RATE);
8016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK)
8046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    flags |= I93_FLAG_PROT_EXT_YES;
8056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, flags);
8076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Command Code */
809867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
810867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    UINT8_TO_STREAM(p, I93_CMD_EXT_WRITE_SINGLE_BLOCK);
811867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  } else {
812867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    UINT8_TO_STREAM(p, I93_CMD_WRITE_SINGLE_BLOCK);
813867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  }
8146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Parameters */
8166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
8176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
818867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK ||
819867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
8206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    UINT16_TO_STREAM(p, block_number); /* Block number */
8216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd->len++;
8226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
8236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    UINT8_TO_STREAM(p, block_number); /* Block number */
8246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Data */
8276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ARRAY_TO_STREAM(p, p_data, rw_cb.tcb.i93.block_size);
8286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_i93_send_to_lower(p_cmd)) {
830867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS)
831867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      rw_cb.tcb.i93.sent_cmd = I93_CMD_EXT_WRITE_SINGLE_BLOCK;
832867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    else
833867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      rw_cb.tcb.i93.sent_cmd = I93_CMD_WRITE_SINGLE_BLOCK;
8346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_OK;
8356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
8366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
8376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_send_cmd_lock_block
843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send Lock Block Request to VICC
845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
84685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu**                  STM LRIS64K, M24LR64-R, M24LR04E-R, M24LR16E-R, M24LR64E-R
84785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu**                  do not support.
84885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu**
849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
8526fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_i93_send_cmd_lock_block(uint8_t block_number) {
8536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_cmd;
8546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
8556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8566767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
8576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
8596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_cmd) {
8616767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
8626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_NO_BUFFERS;
8636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
8666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->len = 11;
8676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
8686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Flags */
8706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_PLUS_INLAY) ||
8716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_PLUS_CHIP) ||
8726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) ||
8736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY)) {
8746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Option must be set for TI tag */
8756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | I93_FLAG_OPTION_SET |
8766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                        RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE));
8776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
8786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
8796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                        RW_I93_FLAG_DATA_RATE));
8806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Command Code */
883867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
884867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    UINT8_TO_STREAM(p, I93_CMD_EXT_LOCK_BLOCK);
885867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  } else {
886867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    UINT8_TO_STREAM(p, I93_CMD_LOCK_BLOCK);
887867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  }
8886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Parameters */
8906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
891867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
892867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
893867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    UINT16_TO_STREAM(p, block_number); /* Block number */
894867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    p_cmd->len++;
895867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  } else {
896867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    UINT8_TO_STREAM(p, block_number); /* Block number */
897867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  }
8986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_i93_send_to_lower(p_cmd)) {
900867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS)
901867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      rw_cb.tcb.i93.sent_cmd = I93_CMD_EXT_LOCK_BLOCK;
902867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    else
903867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      rw_cb.tcb.i93.sent_cmd = I93_CMD_LOCK_BLOCK;
9046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_OK;
9056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
9066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
9076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_send_cmd_read_multi_blocks
913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send Read Multiple Blocks Request to VICC
915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
9196fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_i93_send_cmd_read_multi_blocks(uint16_t first_block_number,
9206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                              uint16_t number_blocks) {
9216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_cmd;
9226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t *p, flags;
923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9246767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_cmd) {
9296767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
9306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_NO_BUFFERS;
9316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
9346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->len = 12;
9356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Flags */
9386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  flags =
9396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE);
94085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
941867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK) {
9426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    flags |= I93_FLAG_PROT_EXT_YES;
943867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  }
94485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
9456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, flags);
946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Command Code */
948867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
949867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    UINT8_TO_STREAM(p, I93_CMD_EXT_READ_MULTI_BLOCK);
950867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  } else {
951867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    UINT8_TO_STREAM(p, I93_CMD_READ_MULTI_BLOCK);
952867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  }
953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Parameters */
9556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
95685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
957867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK ||
958867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
9596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    UINT16_TO_STREAM(p, first_block_number); /* First block number */
9606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd->len++;
9616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
9626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    UINT8_TO_STREAM(p, first_block_number); /* First block number */
9636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
96485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
965867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
966867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    UINT16_TO_STREAM(
967867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado        p, number_blocks - 1); /* Number of blocks, 0x00 to read one block */
968867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    p_cmd->len++;
969867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  } else {
970867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    UINT8_TO_STREAM(
971867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado        p, number_blocks - 1); /* Number of blocks, 0x00 to read one block */
972867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  }
973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_i93_send_to_lower(p_cmd)) {
975867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS)
976867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      rw_cb.tcb.i93.sent_cmd = I93_CMD_EXT_READ_MULTI_BLOCK;
977867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    else
978867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      rw_cb.tcb.i93.sent_cmd = I93_CMD_READ_MULTI_BLOCK;
9796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_OK;
9806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
9816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
9826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_send_cmd_write_multi_blocks
988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send Write Multiple Blocks Request to VICC
990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
994867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael ColladotNFC_STATUS rw_i93_send_cmd_write_multi_blocks(uint16_t first_block_number,
9956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                               uint16_t number_blocks,
9966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                               uint8_t* p_data) {
9976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_cmd;
9986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10006767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
1001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
1003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_cmd) {
10056767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
10066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_NO_BUFFERS;
10076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
10106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->len = 12 + number_blocks * rw_cb.tcb.i93.block_size;
10116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Flags */
10146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
10156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      RW_I93_FLAG_DATA_RATE));
1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Command Code */
1018867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
1019867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    INT8_TO_STREAM(p, I93_CMD_EXT_WRITE_MULTI_BLOCK);
1020867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  } else {
1021867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    UINT8_TO_STREAM(p, I93_CMD_WRITE_MULTI_BLOCK);
1022867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  }
1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Parameters */
10256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
1026867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
1027867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    UINT16_TO_STREAM(p, first_block_number); /* Block number */
1028867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    UINT16_TO_STREAM(
1029867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado        p, number_blocks - 1); /* Number of blocks, 0x00 to read one block */
1030867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    p_cmd->len += 2;
1031867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  } else {
1032867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    UINT8_TO_STREAM(p, first_block_number); /* Block number */
1033867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    UINT8_TO_STREAM(
1034867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado        p, number_blocks - 1); /* Number of blocks, 0x00 to read one block */
1035867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  }
1036867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
10376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(
10386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p, number_blocks - 1); /* Number of blocks, 0x00 to read one block */
1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Data */
10416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ARRAY_TO_STREAM(p, p_data, number_blocks * rw_cb.tcb.i93.block_size);
1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_i93_send_to_lower(p_cmd)) {
1044867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS)
1045867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      rw_cb.tcb.i93.sent_cmd = I93_CMD_EXT_WRITE_MULTI_BLOCK;
1046867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    else
1047867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      rw_cb.tcb.i93.sent_cmd = I93_CMD_WRITE_MULTI_BLOCK;
10486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_OK;
10496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
10506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
10516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_send_cmd_select
1057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send Select Request to VICC
1059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
1061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
10636fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_i93_send_cmd_select(uint8_t* p_uid) {
10646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_cmd;
10656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
1066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10676767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
1070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_cmd) {
10726767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
10736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_NO_BUFFERS;
10746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
10776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->len = 10;
10786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Flags */
10816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
10826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      RW_I93_FLAG_DATA_RATE));
1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Command Code */
10856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, I93_CMD_SELECT);
1086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Parameters */
10886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ARRAY8_TO_STREAM(p, p_uid); /* UID */
1089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
10906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_i93_send_to_lower(p_cmd)) {
10916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.sent_cmd = I93_CMD_SELECT;
10926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_OK;
10936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
10946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
10956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_send_cmd_reset_to_ready
1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send Reset to Ready Request to VICC
1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
11076fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_i93_send_cmd_reset_to_ready(void) {
11086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_cmd;
11096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
1110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
11116767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
1112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
11136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
1114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
11156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_cmd) {
11166767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
11176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_NO_BUFFERS;
11186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
11206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
11216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->len = 10;
11226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
1123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
11246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Flags */
11256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
11266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      RW_I93_FLAG_DATA_RATE));
1127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
11286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Command Code */
11296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, I93_CMD_RESET_TO_READY);
1130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
11316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Parameters */
11326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
1133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
11346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_i93_send_to_lower(p_cmd)) {
11356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.sent_cmd = I93_CMD_RESET_TO_READY;
11366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_OK;
11376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
11386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
11396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_send_cmd_write_afi
1145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send Write AFI Request to VICC
1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
1149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
11516fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_i93_send_cmd_write_afi(uint8_t afi) {
11526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_cmd;
11536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
1154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
11556767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
1156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
11576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
1158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
11596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_cmd) {
11606767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
11616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_NO_BUFFERS;
11626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
11646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
11656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->len = 11;
11666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
1167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
11686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Flags */
11696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
11706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      RW_I93_FLAG_DATA_RATE));
1171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
11726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Command Code */
11736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, I93_CMD_WRITE_AFI);
1174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
11756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Parameters */
11766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
11776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, afi);                /* AFI */
1178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
11796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_i93_send_to_lower(p_cmd)) {
11806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.sent_cmd = I93_CMD_WRITE_AFI;
11816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_OK;
11826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
11836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
11846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_send_cmd_lock_afi
1190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send Lock AFI Request to VICC
1192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
1194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
11966fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_i93_send_cmd_lock_afi(void) {
11976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_cmd;
11986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
1199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12006767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
1201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
1203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_cmd) {
12056767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
12066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_NO_BUFFERS;
12076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
12106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->len = 10;
12116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
1212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Flags */
12146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
12156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      RW_I93_FLAG_DATA_RATE));
1216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Command Code */
12186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, I93_CMD_LOCK_AFI);
1219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Parameters */
12216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
1222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_i93_send_to_lower(p_cmd)) {
12246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.sent_cmd = I93_CMD_LOCK_AFI;
12256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_OK;
12266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
12276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
12286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_send_cmd_write_dsfid
1234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send Write DSFID Request to VICC
1236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
1238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
12406fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_i93_send_cmd_write_dsfid(uint8_t dsfid) {
12416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_cmd;
12426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
1243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12446767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
1245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
1247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_cmd) {
12496767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
12506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_NO_BUFFERS;
12516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
12546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->len = 11;
12556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
1256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Flags */
12586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
12596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      RW_I93_FLAG_DATA_RATE));
1260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Command Code */
12626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, I93_CMD_WRITE_DSFID);
1263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Parameters */
12656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
12666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, dsfid);              /* DSFID */
1267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_i93_send_to_lower(p_cmd)) {
12696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.sent_cmd = I93_CMD_WRITE_DSFID;
12706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_OK;
12716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
12726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
12736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_send_cmd_lock_dsfid
1279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send Lock DSFID Request to VICC
1281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
1283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
12856fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_i93_send_cmd_lock_dsfid(void) {
12866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_cmd;
12876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
1288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12896767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
1290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
1292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_cmd) {
12946767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
12956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_NO_BUFFERS;
12966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
12996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->len = 10;
13006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
1301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
13026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Flags */
13036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
13046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      RW_I93_FLAG_DATA_RATE));
1305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
13066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Command Code */
13076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, I93_CMD_LOCK_DSFID);
1308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
13096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Parameters */
13106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
1311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
13126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_i93_send_to_lower(p_cmd)) {
13136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.sent_cmd = I93_CMD_LOCK_DSFID;
13146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_OK;
13156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
13166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
13176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1322867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado** Function         rw_i93_send_cmd_get_ext_sys_info
1323867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado**
1324867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado** Description      Send Get Extended System Information Request to VICC
1325867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado**
1326867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado** Returns          tNFC_STATUS
1327867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado**
1328867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado*******************************************************************************/
1329867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael ColladotNFC_STATUS rw_i93_send_cmd_get_ext_sys_info(uint8_t* p_uid) {
1330867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  NFC_HDR* p_cmd;
1331867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  uint8_t* p;
1332867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
1333867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
1334867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
1335867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
1336867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
1337867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  if (!p_cmd) {
1338867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    DLOG_IF(INFO, nfc_debug_enabled) << __func__ << "Cannot allocate buffer";
1339867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    return NFC_STATUS_NO_BUFFERS;
1340867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  }
1341867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
1342867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
1343867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  p_cmd->len = 11;
1344867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
1345867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
1346867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  /* Flags */
1347867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
1348867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado                      RW_I93_FLAG_DATA_RATE));
1349867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
1350867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  /* Command Code */
1351867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  UINT8_TO_STREAM(p, I93_CMD_EXT_GET_SYS_INFO);
1352867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
1353867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  /* Parameters request field */
1354867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  UINT8_TO_STREAM(p,
1355867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado                  (I93_INFO_FLAG_MOI | I93_INFO_FLAG_DSFID | I93_INFO_FLAG_AFI |
1356867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado                   I93_INFO_FLAG_MEM_SIZE | I93_INFO_FLAG_IC_REF));
1357867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
1358867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  /* Parameters */
1359867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  if (p_uid) {
1360867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    ARRAY8_TO_STREAM(p, p_uid); /* UID */
1361867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  } else {
1362867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
1363867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  }
1364867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
1365867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  if (rw_i93_send_to_lower(p_cmd)) {
1366867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    rw_cb.tcb.i93.sent_cmd = I93_CMD_EXT_GET_SYS_INFO;
1367867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    return NFC_STATUS_OK;
1368867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  } else {
1369867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    return NFC_STATUS_FAILED;
1370867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  }
1371867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado}
1372867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado
1373867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado/*******************************************************************************
1374867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado**
1375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_send_cmd_get_sys_info
1376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send Get System Information Request to VICC
1378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
1380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
13826fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_i93_send_cmd_get_sys_info(uint8_t* p_uid, uint8_t extra_flags) {
13836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_cmd;
13846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
1385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
13866767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
1387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
13886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
1389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
13906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_cmd) {
13916767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
13926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_NO_BUFFERS;
13936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
13956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
13966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->len = 10;
13976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
1398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
13996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Flags */
14006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER |
14016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      RW_I93_FLAG_DATA_RATE | extra_flags));
1402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Command Code */
14046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, I93_CMD_GET_SYS_INFO);
1405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Parameters */
14076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_uid) {
14086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ARRAY8_TO_STREAM(p, p_uid); /* UID */
14096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
14106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
14116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_i93_send_to_lower(p_cmd)) {
14146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.sent_cmd = I93_CMD_GET_SYS_INFO;
14156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_OK;
14166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
14176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
14186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_send_cmd_get_multi_block_sec
1424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send Get Multiple Block Security Status Request to VICC
1426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
1428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
14306fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_i93_send_cmd_get_multi_block_sec(uint16_t first_block_number,
14316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                                uint16_t number_blocks) {
14326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_cmd;
14336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t *p, flags;
1434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14356767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
1436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
1438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_cmd) {
14406767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Cannot allocate buffer");
14416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_NO_BUFFERS;
14426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
14456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_cmd->len = 12;
14466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_cmd + 1) + p_cmd->offset;
1447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Flags */
14496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  flags =
14506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE);
145185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
14526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK)
14536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    flags |= I93_FLAG_PROT_EXT_YES;
145485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
14556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_STREAM(p, flags);
1456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Command Code */
1458867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
1459867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    UINT8_TO_STREAM(p, I93_CMD_EXT_GET_MULTI_BLK_SEC);
1460867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  } else {
1461867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    UINT8_TO_STREAM(p, I93_CMD_GET_MULTI_BLK_SEC);
1462867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  }
1463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Parameters */
14656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ARRAY8_TO_STREAM(p, rw_cb.tcb.i93.uid); /* UID */
146685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
1467867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK ||
1468867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS) {
14696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    UINT16_TO_STREAM(p, first_block_number); /* First block number */
14706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    UINT16_TO_STREAM(
14716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p, number_blocks - 1); /* Number of blocks, 0x00 to read one block */
14726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd->len += 2;
14736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
14746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    UINT8_TO_STREAM(p, first_block_number); /* First block number */
14756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    UINT8_TO_STREAM(
14766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p, number_blocks - 1); /* Number of blocks, 0x00 to read one block */
14776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_i93_send_to_lower(p_cmd)) {
1480867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_EXT_COMMANDS)
1481867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      rw_cb.tcb.i93.sent_cmd = I93_CMD_EXT_GET_MULTI_BLK_SEC;
1482867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    else
1483867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      rw_cb.tcb.i93.sent_cmd = I93_CMD_GET_MULTI_BLK_SEC;
14846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_OK;
14856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
14866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
14876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_get_next_blocks
1493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1494552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      Read as many blocks as possible (up to
1495552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  RW_I93_READ_MULTI_BLOCK_SIZE)
1496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
1498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
15006fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_i93_get_next_blocks(uint16_t offset) {
15016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
15026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t first_block;
15036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t num_block;
150485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
15056767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
15066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
15076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  first_block = offset / p_i93->block_size;
15086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
15096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* more blocks, more efficent but more error rate */
15106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
15116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_i93->intl_flags & RW_I93_FLAG_READ_MULTI_BLOCK) {
15126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    num_block = RW_I93_READ_MULTI_BLOCK_SIZE / p_i93->block_size;
15136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
15146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (num_block + first_block > p_i93->num_block)
15156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      num_block = p_i93->num_block - first_block;
15166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
15176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_i93->uid[1] == I93_UID_IC_MFG_CODE_STM) {
15186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* LRIS64K, M24LR64-R, M24LR04E-R, M24LR16E-R, M24LR64E-R requires
15196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ** - The max number of blocks is 32 and they are all located in the
15206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      **   same sector.
15216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ** - The sector is 32 blocks of 4 bytes.
15226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      */
15236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((p_i93->product_version == RW_I93_STM_LRIS64K) ||
15246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (p_i93->product_version == RW_I93_STM_M24LR64_R) ||
15256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (p_i93->product_version == RW_I93_STM_M24LR04E_R) ||
15266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (p_i93->product_version == RW_I93_STM_M24LR16E_R) ||
15276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (p_i93->product_version == RW_I93_STM_M24LR64E_R)) {
15286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (num_block > I93_STM_MAX_BLOCKS_PER_READ)
15296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          num_block = I93_STM_MAX_BLOCKS_PER_READ;
15306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
15316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if ((first_block / I93_STM_BLOCKS_PER_SECTOR) !=
15326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            ((first_block + num_block - 1) / I93_STM_BLOCKS_PER_SECTOR)) {
15336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          num_block = I93_STM_BLOCKS_PER_SECTOR -
15346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      (first_block % I93_STM_BLOCKS_PER_SECTOR);
15356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
15366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
1537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
15386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
15396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return rw_i93_send_cmd_read_multi_blocks(first_block, num_block);
15406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
15416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return rw_i93_send_cmd_read_single_block(first_block, false);
15426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
154785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** Function         rw_i93_get_next_block_sec
154885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu**
1549552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      Get as many security of blocks as possible from
1550552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  p_i93->rw_offset (up to RW_I93_GET_MULTI_BLOCK_SEC_SIZE)
155185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu**
155285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** Returns          tNFC_STATUS
155385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu**
155485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu*******************************************************************************/
15556fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_i93_get_next_block_sec(void) {
15566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
15576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t num_blocks;
15586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
15596767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
15606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
15616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_i93->num_block <= p_i93->rw_offset) {
15626767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf(
15636767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        "rw_offset(0x%x) must be less than num_block(0x%x)", p_i93->rw_offset,
15646767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        p_i93->num_block);
15656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
15666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
156785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
15686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  num_blocks = p_i93->num_block - p_i93->rw_offset;
156985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
15706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (num_blocks > RW_I93_GET_MULTI_BLOCK_SEC_SIZE)
15716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    num_blocks = RW_I93_GET_MULTI_BLOCK_SEC_SIZE;
157285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
1573867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado  DLOG_IF(INFO, nfc_debug_enabled)
1574867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      << __func__ << std::hex << rw_cb.tcb.i93.intl_flags;
15756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return rw_i93_send_cmd_get_multi_block_sec(p_i93->rw_offset, num_blocks);
157685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu}
157785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
157885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu/*******************************************************************************
157985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu**
1580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_sm_detect_ndef
1581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process NDEF detection procedure
1583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  1. Get UID if not having yet
1585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  2. Get System Info if not having yet
1586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  3. Read first block for CC
1587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  4. Search NDEF Type and length
1588552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  5. Get block status to get max NDEF size and read-only
1589552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                     status
1590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
1592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
15946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_i93_sm_detect_ndef(NFC_HDR* p_resp) {
15957dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi  uint8_t *p = (uint8_t*)(p_resp + 1) + p_resp->offset, *p_uid;
15966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t flags, u8 = 0, cc[4];
15976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t length = p_resp->len, xx, block, first_block, last_block, num_blocks;
15986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
15996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_DATA rw_data;
16006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
1601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
16026767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
16036767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      "sub_state:%s (0x%x)",
16046767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      rw_i93_get_sub_state_name(p_i93->sub_state).c_str(), p_i93->sub_state);
1605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
16066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  STREAM_TO_UINT8(flags, p);
16076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  length--;
1608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
16096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (flags & I93_FLAG_ERROR_DETECTED) {
16106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((length) && (rw_i93_check_sys_info_prot_ext(*p))) {
16116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* getting system info with protocol extension flag */
16126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* This STM tag supports more than 2040 bytes */
16136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->intl_flags |= RW_I93_FLAG_16BIT_NUM_BLOCK;
16146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
16156767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      DLOG_IF(INFO, nfc_debug_enabled)
16166767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi          << StringPrintf("Got error flags (0x%02x)", flags);
16176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_i93_handle_error(NFC_STATUS_FAILED);
1618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
16196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return;
16206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
16226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (p_i93->sub_state) {
1623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_WAIT_UID:
1624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
16256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      STREAM_TO_UINT8(u8, p); /* DSFID */
16266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_uid = p_i93->uid;
16276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      STREAM_TO_ARRAY8(p_uid, p);
1628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
16296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (u8 != I93_DFS_UNSUPPORTED) {
16306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* if Data Storage Format is unknown */
16316767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        DLOG_IF(INFO, nfc_debug_enabled)
16326767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi            << StringPrintf("Got unknown DSFID (0x%02x)", u8);
16336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_i93_handle_error(NFC_STATUS_FAILED);
16346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
16356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* get system information to get memory size */
16366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (rw_i93_send_cmd_get_sys_info(NULL, I93_FLAG_PROT_EXT_NO) ==
16376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            NFC_STATUS_OK) {
16386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->sub_state = RW_I93_SUBSTATE_WAIT_SYS_INFO;
16396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
16406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          rw_i93_handle_error(NFC_STATUS_FAILED);
1641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
16426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
16436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
1644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_WAIT_SYS_INFO:
1646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
16476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->block_size = 0;
16486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->num_block = 0;
1649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
16506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (!rw_i93_process_sys_info(p)) {
16516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* retrying with protocol extension flag */
16526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
16536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
1654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
16556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((p_i93->block_size == 0) || (p_i93->num_block == 0)) {
16566767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        DLOG_IF(INFO, nfc_debug_enabled)
16576767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi            << StringPrintf("Unable to get tag memory size");
16586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_i93_handle_error(status);
16596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
16606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* read CC in the first block */
16616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (rw_i93_send_cmd_read_single_block(0x0000, false) == NFC_STATUS_OK) {
16626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->sub_state = RW_I93_SUBSTATE_WAIT_CC;
16636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
16646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          rw_i93_handle_error(NFC_STATUS_FAILED);
1665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
16666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
16676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
1668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_WAIT_CC:
1670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
16716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* assume block size is more than 4 */
16726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      STREAM_TO_ARRAY(cc, p, 4);
16736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
16746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      status = NFC_STATUS_FAILED;
16756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
16766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /*
16776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ** Capability Container (CC)
16786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      **
16796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ** CC[0] : magic number (0xE1)
16806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ** CC[1] : Bit 7-6:Major version number
16816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      **       : Bit 5-4:Minor version number
16826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      **       : Bit 3-2:Read access condition (00b: read access granted
16836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      **         without any security)
16846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      **       : Bit 1-0:Write access condition (00b: write access granted
16856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      **         without any security)
16866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ** CC[2] : Memory size in 8 bytes (Ex. 0x04 is 32 bytes) [STM, set to
16876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      **         0xFF if more than 2040bytes]
16886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ** CC[3] : Bit 0:Read multiple blocks is supported [NXP, STM]
16896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      **       : Bit 1:Inventory page read is supported [NXP]
16906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      **       : Bit 2:More than 2040 bytes are supported [STM]
16916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      */
16926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
16936767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
16946767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi          "cc: 0x%02X 0x%02X 0x%02X 0x%02X", cc[0], cc[1], cc[2], cc[3]);
16956767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      DLOG_IF(INFO, nfc_debug_enabled)
16966767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi          << StringPrintf("Total blocks:0x%04X, Block size:0x%02X",
16976767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                          p_i93->num_block, p_i93->block_size);
16986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1699867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      if ((cc[0] == I93_ICODE_CC_MAGIC_NUMER_E1) ||
1700867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado          (cc[0] == I93_ICODE_CC_MAGIC_NUMER_E2)) {
17016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if ((cc[1] & I93_ICODE_CC_READ_ACCESS_MASK) ==
17026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            I93_ICODE_CC_READ_ACCESS_GRANTED) {
17036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if ((cc[1] & I93_ICODE_CC_WRITE_ACCESS_MASK) !=
17046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              I93_ICODE_CC_WRITE_ACCESS_GRANTED) {
17056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            /* read-only or password required to write */
17066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->intl_flags |= RW_I93_FLAG_READ_ONLY;
17076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
17086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (cc[3] & I93_ICODE_CC_MBREAD_MASK) {
17096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            /* tag supports read multi blocks command */
17106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->intl_flags |= RW_I93_FLAG_READ_MULTI_BLOCK;
17116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
1712867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado          if (cc[0] == I93_ICODE_CC_MAGIC_NUMER_E2) {
1713867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado            p_i93->intl_flags |= RW_I93_FLAG_EXT_COMMANDS;
1714867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado          }
17156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          status = NFC_STATUS_OK;
17166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
17176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
17186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
17196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (status == NFC_STATUS_OK) {
17206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* seach NDEF TLV from offset 4 when CC file coded on 4 bytes NFC Forum
17216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         */
17226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (cc[2] != 0)
17236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->rw_offset = 4;
1724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
17256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->rw_offset = 8;
17266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
17276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (rw_i93_get_next_blocks(p_i93->rw_offset) == NFC_STATUS_OK) {
17286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->sub_state = RW_I93_SUBSTATE_SEARCH_NDEF_TLV;
17296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->tlv_detect_state = RW_I93_TLV_DETECT_STATE_TYPE;
17306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
17316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          rw_i93_handle_error(NFC_STATUS_FAILED);
1732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
17336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
17346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_i93_handle_error(NFC_STATUS_FAILED);
17356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
17366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
1737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_SEARCH_NDEF_TLV:
1739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
17406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* search TLV within read blocks */
17416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      for (xx = 0; xx < length; xx++) {
17426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* if looking for type */
17436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (p_i93->tlv_detect_state == RW_I93_TLV_DETECT_STATE_TYPE) {
17446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (*(p + xx) == I93_ICODE_TLV_TYPE_NULL) {
17456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            continue;
17466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          } else if ((*(p + xx) == I93_ICODE_TLV_TYPE_NDEF) ||
17476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                     (*(p + xx) == I93_ICODE_TLV_TYPE_PROP)) {
17486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            /* store found type and get length field */
17496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->tlv_type = *(p + xx);
17506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->ndef_tlv_start_offset = p_i93->rw_offset + xx;
17516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
17526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->tlv_detect_state = RW_I93_TLV_DETECT_STATE_LENGTH_1;
17536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          } else if (*(p + xx) == I93_ICODE_TLV_TYPE_TERM) {
17546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            /* no NDEF TLV found */
17556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->tlv_type = I93_ICODE_TLV_TYPE_TERM;
17566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            break;
17576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          } else {
17586767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi            DLOG_IF(INFO, nfc_debug_enabled)
17596767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                << StringPrintf("Invalid type: 0x%02x", *(p + xx));
17606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            rw_i93_handle_error(NFC_STATUS_FAILED);
17616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            return;
17626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
17636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else if (p_i93->tlv_detect_state ==
17646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   RW_I93_TLV_DETECT_STATE_LENGTH_1) {
17656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* if 3 bytes length field */
17666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (*(p + xx) == 0xFF) {
17676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            /* need 2 more bytes for length field */
17686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->tlv_detect_state = RW_I93_TLV_DETECT_STATE_LENGTH_2;
17696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          } else {
17706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->tlv_length = *(p + xx);
17716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->tlv_detect_state = RW_I93_TLV_DETECT_STATE_VALUE;
17726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
17736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            if (p_i93->tlv_type == I93_ICODE_TLV_TYPE_NDEF) {
17746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              p_i93->ndef_tlv_last_offset =
17756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  p_i93->ndef_tlv_start_offset + 1 + p_i93->tlv_length;
17766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              break;
17776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            }
17786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
17796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else if (p_i93->tlv_detect_state ==
17806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   RW_I93_TLV_DETECT_STATE_LENGTH_2) {
17816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* the second byte of 3 bytes length field */
17826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->tlv_length = *(p + xx);
17836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->tlv_detect_state = RW_I93_TLV_DETECT_STATE_LENGTH_3;
17846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else if (p_i93->tlv_detect_state ==
17856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   RW_I93_TLV_DETECT_STATE_LENGTH_3) {
17866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* the last byte of 3 bytes length field */
17876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->tlv_length = (p_i93->tlv_length << 8) + *(p + xx);
17886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->tlv_detect_state = RW_I93_TLV_DETECT_STATE_VALUE;
17896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
17906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (p_i93->tlv_type == I93_ICODE_TLV_TYPE_NDEF) {
17916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->ndef_tlv_last_offset =
17926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                p_i93->ndef_tlv_start_offset + 3 + p_i93->tlv_length;
17936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            break;
17946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
17956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else if (p_i93->tlv_detect_state == RW_I93_TLV_DETECT_STATE_VALUE) {
17966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* this is other than NDEF TLV */
17976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (p_i93->tlv_length <= length - xx) {
17986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            /* skip value field */
17996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            xx += (uint8_t)p_i93->tlv_length;
18006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->tlv_detect_state = RW_I93_TLV_DETECT_STATE_TYPE;
18016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          } else {
1802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* read more data */
18036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->tlv_length -= (length - xx);
18046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            break;
18056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
18066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
18076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
18086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
18096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* found NDEF TLV and read length field */
18106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((p_i93->tlv_type == I93_ICODE_TLV_TYPE_NDEF) &&
18116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (p_i93->tlv_detect_state == RW_I93_TLV_DETECT_STATE_VALUE)) {
18126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->ndef_length = p_i93->tlv_length;
18136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
18146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* get lock status to see if read-only */
18156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if ((p_i93->product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) ||
18166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (p_i93->product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY) ||
18176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            ((p_i93->uid[1] == I93_UID_IC_MFG_CODE_NXP) &&
18186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             (p_i93->ic_reference & I93_ICODE_IC_REF_MBREAD_MASK))) {
18196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* these doesn't support GetMultiBlockSecurityStatus */
18206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
18216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->rw_offset = p_i93->ndef_tlv_start_offset;
18226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          first_block = p_i93->ndef_tlv_start_offset / p_i93->block_size;
18236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
18246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* read block to get lock status */
18256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          rw_i93_send_cmd_read_single_block(first_block, true);
18266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->sub_state = RW_I93_SUBSTATE_CHECK_LOCK_STATUS;
18276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
18286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* block offset for read-only check */
18296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->rw_offset = 0;
18306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
18316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (rw_i93_get_next_block_sec() == NFC_STATUS_OK) {
18326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->sub_state = RW_I93_SUBSTATE_CHECK_LOCK_STATUS;
18336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          } else {
18346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            rw_i93_handle_error(NFC_STATUS_FAILED);
18356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
18366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
18376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
18386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* read more data */
18396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->rw_offset += length;
1840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
18416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (p_i93->rw_offset >= p_i93->block_size * p_i93->num_block) {
18426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          rw_i93_handle_error(NFC_STATUS_FAILED);
18436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else if (rw_i93_get_next_blocks(p_i93->rw_offset) == NFC_STATUS_OK) {
18446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->sub_state = RW_I93_SUBSTATE_SEARCH_NDEF_TLV;
18456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
18466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          rw_i93_handle_error(NFC_STATUS_FAILED);
1847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
18486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
18496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
1850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_CHECK_LOCK_STATUS:
1852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
18536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((p_i93->product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) ||
18546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (p_i93->product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY) ||
18556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          ((p_i93->uid[1] == I93_UID_IC_MFG_CODE_NXP) &&
18566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           (p_i93->ic_reference & I93_ICODE_IC_REF_MBREAD_MASK))) {
18576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* these doesn't support GetMultiBlockSecurityStatus */
1858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
18596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        block = (p_i93->rw_offset / p_i93->block_size);
18606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        last_block = (p_i93->ndef_tlv_last_offset / p_i93->block_size);
1861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
18626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if ((*p) & I93_BLOCK_LOCKED) {
18636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (block <= last_block) {
18646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->intl_flags |= RW_I93_FLAG_READ_ONLY;
18656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
18666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
18676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* if we need to check more user blocks */
18686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (block + 1 < p_i93->num_block) {
18696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->rw_offset += p_i93->block_size;
1870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
18716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            /* read block to get lock status */
18726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            rw_i93_send_cmd_read_single_block(
18736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                (uint16_t)(p_i93->rw_offset / p_i93->block_size), true);
18746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            break;
18756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
18766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
18776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
18786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->max_ndef_length =
18796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->ndef_length
18806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            /* add available bytes including the last block of NDEF TLV */
18816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            + (p_i93->block_size * (block - last_block) + 1) -
18826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (p_i93->ndef_tlv_last_offset % p_i93->block_size) - 1;
18836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
18846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (p_i93->rw_offset == 0) {
18856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->max_ndef_length =
18866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              p_i93->ndef_length
18876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              /* add available bytes in the last block of NDEF TLV */
18886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              + p_i93->block_size -
18896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              (p_i93->ndef_tlv_last_offset % p_i93->block_size) - 1;
18906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
18916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          first_block = (p_i93->ndef_tlv_start_offset / p_i93->block_size);
18926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
18936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          first_block = 0;
18946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
18956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
18966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        last_block = (p_i93->ndef_tlv_last_offset / p_i93->block_size);
18976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        num_blocks = length;
18986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
18996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        for (block = first_block; block < num_blocks; block++) {
19006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* if any block of NDEF TLV is locked */
19016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if ((block + p_i93->rw_offset) <= last_block) {
19026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            if (*(p + block) & I93_BLOCK_LOCKED) {
19036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              p_i93->intl_flags |= RW_I93_FLAG_READ_ONLY;
19046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              break;
19056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            }
19066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          } else {
19076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            if (*(p + block) & I93_BLOCK_LOCKED) {
19086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              /* no more consecutive unlocked block */
19096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              break;
19106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            } else {
19116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              /* add block size if not locked */
19126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              p_i93->max_ndef_length += p_i93->block_size;
19136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            }
19146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
19156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
19166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
19176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* update next security of block to check */
19186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->rw_offset += num_blocks;
19196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
19206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* if need to check more */
19216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (p_i93->num_block > p_i93->rw_offset) {
19226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (rw_i93_get_next_block_sec() != NFC_STATUS_OK) {
19236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            rw_i93_handle_error(NFC_STATUS_FAILED);
19246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
19256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          break;
19266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
19276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
19286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
19296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* check if need to adjust max NDEF length */
19306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((p_i93->ndef_length < 0xFF) && (p_i93->max_ndef_length >= 0xFF)) {
19316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* 3 bytes length field must be used */
19326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->max_ndef_length -= 2;
19336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
19346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
19356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_data.ndef.status = NFC_STATUS_OK;
193657a3dfa388d16f35d4182782b3ee017164c933ebLove Khanna      rw_data.ndef.protocol = NFC_PROTOCOL_T5T;
19376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_data.ndef.flags = 0;
19386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_data.ndef.flags |= RW_NDEF_FL_SUPPORTED;
19396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_data.ndef.flags |= RW_NDEF_FL_FORMATED;
19406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_data.ndef.flags |= RW_NDEF_FL_FORMATABLE;
19416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_data.ndef.cur_size = p_i93->ndef_length;
19426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
19436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_i93->intl_flags & RW_I93_FLAG_READ_ONLY) {
19446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.ndef.flags |= RW_NDEF_FL_READ_ONLY;
19456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.ndef.max_size = p_i93->ndef_length;
19466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
19476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.ndef.flags |= RW_NDEF_FL_HARD_LOCKABLE;
19486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.ndef.max_size = p_i93->max_ndef_length;
19496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
19506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
19516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->state = RW_I93_STATE_IDLE;
19526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->sent_cmd = 0;
19536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
19546767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
19556767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi          "NDEF cur_size(%d),max_size (%d), flags (0x%x)",
19566767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi          rw_data.ndef.cur_size, rw_data.ndef.max_size, rw_data.ndef.flags);
19576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
19586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (*(rw_cb.p_cback))(RW_I93_NDEF_DETECT_EVT, &rw_data);
19596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
1960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
19626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
19636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_sm_read_ndef
1969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process NDEF read procedure
1971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
1973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
19756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_i93_sm_read_ndef(NFC_HDR* p_resp) {
19766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p = (uint8_t*)(p_resp + 1) + p_resp->offset;
19776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t flags;
19786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t offset, length = p_resp->len;
19796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
19806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_DATA rw_data;
19816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
19826767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
19836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
19846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  STREAM_TO_UINT8(flags, p);
19856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  length--;
19866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
19876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (flags & I93_FLAG_ERROR_DETECTED) {
19886767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    DLOG_IF(INFO, nfc_debug_enabled)
19896767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        << StringPrintf("Got error flags (0x%02x)", flags);
19906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_i93_handle_error(NFC_STATUS_FAILED);
19916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return;
19926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
19936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
19946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* if this is the first block */
19956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_i93->rw_length == 0) {
19966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* get start of NDEF in the first block */
19976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    offset = p_i93->ndef_tlv_start_offset % p_i93->block_size;
19986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
19996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_i93->ndef_length < 0xFF) {
20006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      offset += 2;
20016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
20026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      offset += 4;
20036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
20046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
20056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* adjust offset if read more blocks because the first block doesn't have
20066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * NDEF */
20076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    offset -= (p_i93->rw_offset - p_i93->ndef_tlv_start_offset);
20086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
20096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    offset = 0;
20106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
20116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
20126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* if read enough data to skip type and length field for the beginning */
20136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (offset < length) {
20146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    offset++; /* flags */
20156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_resp->offset += offset;
20166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_resp->len -= offset;
20176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
20186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_data.data.status = NFC_STATUS_OK;
20196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_data.data.p_data = p_resp;
20206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
20216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_i93->rw_length += p_resp->len;
20226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
20236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* in case of no Ndef data included */
20246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_resp->len = 0;
20256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
20266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
20276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* if read all of NDEF data */
20286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_i93->rw_length >= p_i93->ndef_length) {
20296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* remove extra btyes in the last block */
20306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_resp->len -= (p_i93->rw_length - p_i93->ndef_length);
2031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
20326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_i93->state = RW_I93_STATE_IDLE;
20336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_i93->sent_cmd = 0;
2034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
20356767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    DLOG_IF(INFO, nfc_debug_enabled)
20366767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        << StringPrintf("NDEF read complete read (%d)/total (%d)", p_resp->len,
20376767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                        p_i93->ndef_length);
2038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
20396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    (*(rw_cb.p_cback))(RW_I93_NDEF_READ_CPLT_EVT, &rw_data);
20406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
20416767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    DLOG_IF(INFO, nfc_debug_enabled)
20426767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        << StringPrintf("NDEF read segment read (%d)/total (%d)", p_resp->len,
20436767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                        p_i93->ndef_length);
2044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
20456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_resp->len > 0) {
20466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (*(rw_cb.p_cback))(RW_I93_NDEF_READ_EVT, &rw_data);
2047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
20496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* this will make read data from next block */
20506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_i93->rw_offset += length;
2051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
20526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (rw_i93_get_next_blocks(p_i93->rw_offset) != NFC_STATUS_OK) {
20536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_i93_handle_error(NFC_STATUS_FAILED);
2054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
20556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_sm_update_ndef
2061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process NDEF update procedure
2063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  1. Set length field to zero
2065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  2. Write NDEF and Terminator TLV
2066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  3. Set length field to NDEF length
2067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
2069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
20716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_i93_sm_update_ndef(NFC_HDR* p_resp) {
20726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p = (uint8_t*)(p_resp + 1) + p_resp->offset;
20736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t flags, xx, length_offset, buff[I93_MAX_BLOCK_LENGH];
20746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t length = p_resp->len, block_number;
20756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
20766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_DATA rw_data;
2077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
20786767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
20796767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      "sub_state:%s (0x%x)",
20806767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      rw_i93_get_sub_state_name(p_i93->sub_state).c_str(), p_i93->sub_state);
2081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
20826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  STREAM_TO_UINT8(flags, p);
20836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  length--;
20846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
20856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (flags & I93_FLAG_ERROR_DETECTED) {
20866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (((p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_INLAY) ||
20876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         (p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_CHIP) ||
20886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         (p_i93->product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) ||
20896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         (p_i93->product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY)) &&
20906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (*p == I93_ERROR_CODE_BLOCK_FAIL_TO_WRITE)) {
20916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* ignore error */
20926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
20936767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      DLOG_IF(INFO, nfc_debug_enabled)
20946767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi          << StringPrintf("Got error flags (0x%02x)", flags);
20956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_i93_handle_error(NFC_STATUS_FAILED);
20966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return;
2097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
20986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
21006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (p_i93->sub_state) {
2101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_RESET_LEN:
2102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
21036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* get offset of length field */
21046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      length_offset = (p_i93->ndef_tlv_start_offset + 1) % p_i93->block_size;
2105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
21066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* set length to zero */
21076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      *(p + length_offset) = 0x00;
2108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
21096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_i93->ndef_length > 0) {
21106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* if 3 bytes length field is needed */
21116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (p_i93->ndef_length >= 0xFF) {
21126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          xx = length_offset + 3;
21136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
21146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          xx = length_offset + 1;
21156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
2116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
21176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* write the first part of NDEF in the same block */
21186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        for (; xx < p_i93->block_size; xx++) {
21196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (p_i93->rw_length < p_i93->ndef_length) {
21206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            *(p + xx) = *(p_i93->p_update_data + p_i93->rw_length++);
21216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          } else {
21226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            *(p + xx) = I93_ICODE_TLV_TYPE_NULL;
21236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
2124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
21256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
2126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
21276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      block_number = (p_i93->ndef_tlv_start_offset + 1) / p_i93->block_size;
2128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
21296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (rw_i93_send_cmd_write_single_block(block_number, p) ==
21306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          NFC_STATUS_OK) {
21316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* update next writing offset */
21326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->rw_offset = (block_number + 1) * p_i93->block_size;
21336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->sub_state = RW_I93_SUBSTATE_WRITE_NDEF;
21346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
21356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_i93_handle_error(NFC_STATUS_FAILED);
21366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
21376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
2138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_WRITE_NDEF:
2140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
21416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* if it's not the end of tag memory */
21426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_i93->rw_offset < p_i93->block_size * p_i93->num_block) {
21436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        block_number = p_i93->rw_offset / p_i93->block_size;
21446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
21456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* if we have more data to write */
21466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (p_i93->rw_length < p_i93->ndef_length) {
21476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p = p_i93->p_update_data + p_i93->rw_length;
21486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
21496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->rw_offset += p_i93->block_size;
21506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->rw_length += p_i93->block_size;
21516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
21526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* if this is the last block of NDEF TLV */
21536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (p_i93->rw_length > p_i93->ndef_length) {
21546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            /* length of NDEF TLV in the block */
21556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            xx = (uint8_t)(p_i93->block_size -
21566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                           (p_i93->rw_length - p_i93->ndef_length));
21576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
21586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            /* set NULL TLV in the unused part of block */
21596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            memset(buff, I93_ICODE_TLV_TYPE_NULL, p_i93->block_size);
21606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            memcpy(buff, p, xx);
21616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p = buff;
21626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
21636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            /* if it's the end of tag memory */
21646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            if ((p_i93->rw_offset >= p_i93->block_size * p_i93->num_block) &&
21656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                (xx < p_i93->block_size)) {
21666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              buff[xx] = I93_ICODE_TLV_TYPE_TERM;
21676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            }
21686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
21696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->ndef_tlv_last_offset =
21706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                p_i93->rw_offset - p_i93->block_size + xx - 1;
21716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
21726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
21736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (rw_i93_send_cmd_write_single_block(block_number, p) !=
21746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              NFC_STATUS_OK) {
21756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            rw_i93_handle_error(NFC_STATUS_FAILED);
21766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
21776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
21786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* if this is the very next block of NDEF TLV */
21796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (block_number ==
21806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              (p_i93->ndef_tlv_last_offset / p_i93->block_size) + 1) {
21816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->rw_offset += p_i93->block_size;
21826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
21836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            /* write Terminator TLV and NULL TLV */
21846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            memset(buff, I93_ICODE_TLV_TYPE_NULL, p_i93->block_size);
21856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            buff[0] = I93_ICODE_TLV_TYPE_TERM;
21866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p = buff;
21876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
21886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            if (rw_i93_send_cmd_write_single_block(block_number, p) !=
21896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                NFC_STATUS_OK) {
21906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              rw_i93_handle_error(NFC_STATUS_FAILED);
21916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            }
21926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          } else {
21936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            /* finished writing NDEF and Terminator TLV */
21946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            /* read length field to update length       */
21956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            block_number =
21966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                (p_i93->ndef_tlv_start_offset + 1) / p_i93->block_size;
21976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
21986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            if (rw_i93_send_cmd_read_single_block(block_number, false) ==
21996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                NFC_STATUS_OK) {
22006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              /* set offset to length field */
22016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              p_i93->rw_offset = p_i93->ndef_tlv_start_offset + 1;
22026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
22036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              /* get size of length field */
22046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              if (p_i93->ndef_length >= 0xFF) {
22056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                p_i93->rw_length = 3;
22066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              } else if (p_i93->ndef_length > 0) {
22076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                p_i93->rw_length = 1;
22086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              } else {
22096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                p_i93->rw_length = 0;
22106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              }
22116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
22126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              p_i93->sub_state = RW_I93_SUBSTATE_UPDATE_LEN;
22136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            } else {
22146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              rw_i93_handle_error(NFC_STATUS_FAILED);
22156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            }
22166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
22176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
22186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
22196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* if we have no more data to write */
22206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (p_i93->rw_length >= p_i93->ndef_length) {
22216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* finished writing NDEF and Terminator TLV */
22226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* read length field to update length       */
22236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          block_number = (p_i93->ndef_tlv_start_offset + 1) / p_i93->block_size;
22246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
22256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (rw_i93_send_cmd_read_single_block(block_number, false) ==
22266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              NFC_STATUS_OK) {
22276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            /* set offset to length field */
22286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->rw_offset = p_i93->ndef_tlv_start_offset + 1;
22296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
22306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            /* get size of length field */
22316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            if (p_i93->ndef_length >= 0xFF) {
22326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              p_i93->rw_length = 3;
22336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            } else if (p_i93->ndef_length > 0) {
22346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              p_i93->rw_length = 1;
22356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            } else {
22366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              p_i93->rw_length = 0;
22376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            }
22386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
22396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->sub_state = RW_I93_SUBSTATE_UPDATE_LEN;
22406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            break;
22416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
2242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
22436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_i93_handle_error(NFC_STATUS_FAILED);
22446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
22456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
2246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_UPDATE_LEN:
2248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
22496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* if we have more length field to write */
22506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_i93->rw_length > 0) {
22516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* if we got ack for writing, read next block to update rest of length
22526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         * field */
22536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (length == 0) {
22546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          block_number = p_i93->rw_offset / p_i93->block_size;
22556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
22566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (rw_i93_send_cmd_read_single_block(block_number, false) !=
22576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              NFC_STATUS_OK) {
22586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            rw_i93_handle_error(NFC_STATUS_FAILED);
22596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
22606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
22616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          length_offset = p_i93->rw_offset % p_i93->block_size;
22626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
22636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* update length field within the read block */
22646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          for (xx = length_offset; xx < p_i93->block_size; xx++) {
22656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            if (p_i93->rw_length == 3)
22666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              *(p + xx) = 0xFF;
22676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            else if (p_i93->rw_length == 2)
22686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              *(p + xx) = (uint8_t)((p_i93->ndef_length >> 8) & 0xFF);
22696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            else if (p_i93->rw_length == 1)
22706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              *(p + xx) = (uint8_t)(p_i93->ndef_length & 0xFF);
22716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
22726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->rw_length--;
22736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            if (p_i93->rw_length == 0) break;
22746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
22756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
22766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          block_number = (p_i93->rw_offset / p_i93->block_size);
22776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
22786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (rw_i93_send_cmd_write_single_block(block_number, p) ==
22796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              NFC_STATUS_OK) {
22806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            /* set offset to the beginning of next block */
22816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->rw_offset +=
22826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                p_i93->block_size - (p_i93->rw_offset % p_i93->block_size);
22836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          } else {
22846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            rw_i93_handle_error(NFC_STATUS_FAILED);
22856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
22866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
22876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
22886767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
22896767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi            "NDEF update complete, %d bytes, (%d-%d)", p_i93->ndef_length,
22906767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi            p_i93->ndef_tlv_start_offset, p_i93->ndef_tlv_last_offset);
22916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
22926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->state = RW_I93_STATE_IDLE;
22936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->sent_cmd = 0;
22946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->p_update_data = NULL;
22956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
22966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.status = NFC_STATUS_OK;
22976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (*(rw_cb.p_cback))(RW_I93_NDEF_UPDATE_CPLT_EVT, &rw_data);
22986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
22996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
2300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
23026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
23036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_sm_format
2309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process format procedure
2311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  1. Get UID
2313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  2. Get sys info for memory size (reset AFI/DSFID)
2314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  3. Get block status to get read-only status
2315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  4. Write CC and empty NDEF
2316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
2318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
23206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_i93_sm_format(NFC_HDR* p_resp) {
23217dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi  uint8_t *p = (uint8_t*)(p_resp + 1) + p_resp->offset, *p_uid;
23226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t flags;
23236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t length = p_resp->len, xx, block_number;
23246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
23256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_DATA rw_data;
23266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
2327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
23286767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
23296767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      "sub_state:%s (0x%x)",
23306767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      rw_i93_get_sub_state_name(p_i93->sub_state).c_str(), p_i93->sub_state);
2331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
23326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  STREAM_TO_UINT8(flags, p);
23336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  length--;
23346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
23356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (flags & I93_FLAG_ERROR_DETECTED) {
23366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (((p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_INLAY) ||
23376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         (p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_CHIP) ||
23386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         (p_i93->product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) ||
23396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         (p_i93->product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY)) &&
23406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (*p == I93_ERROR_CODE_BLOCK_FAIL_TO_WRITE)) {
23416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* ignore error */
23426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else if ((length) && (rw_i93_check_sys_info_prot_ext(*p))) {
23436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* getting system info with protocol extension flag */
23446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* This STM tag supports more than 2040 bytes */
23456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->intl_flags |= RW_I93_FLAG_16BIT_NUM_BLOCK;
23466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return;
23476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
23486767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      DLOG_IF(INFO, nfc_debug_enabled)
23496767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi          << StringPrintf("Got error flags (0x%02x)", flags);
23506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_i93_handle_error(NFC_STATUS_FAILED);
23516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return;
23526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
23536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
23546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
23556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (p_i93->sub_state) {
2356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_WAIT_UID:
2357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
23586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p++; /* skip DSFID */
23596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_uid = p_i93->uid;
23606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      STREAM_TO_ARRAY8(p_uid, p); /* store UID */
2361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
23626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* get system information to get memory size */
23636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (rw_i93_send_cmd_get_sys_info(NULL, I93_FLAG_PROT_EXT_NO) ==
23646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          NFC_STATUS_OK) {
23656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->sub_state = RW_I93_SUBSTATE_WAIT_SYS_INFO;
23666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
23676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_i93_handle_error(NFC_STATUS_FAILED);
23686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
23696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
2370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_WAIT_SYS_INFO:
2372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
23736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->block_size = 0;
23746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->num_block = 0;
237585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
23766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (!rw_i93_process_sys_info(p)) {
23776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* retrying with protocol extension flag */
23786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
23796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
23806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
23816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_i93->info_flags & I93_INFO_FLAG_DSFID) {
23826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* DSFID, if any DSFID then reset */
23836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (p_i93->dsfid != I93_DFS_UNSUPPORTED) {
23846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->intl_flags |= RW_I93_FLAG_RESET_DSFID;
23856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
23866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
23876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_i93->info_flags & I93_INFO_FLAG_AFI) {
23886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* AFI, reset to 0 */
23896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (p_i93->afi != 0x00) {
23906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->intl_flags |= RW_I93_FLAG_RESET_AFI;
23916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
23926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
23936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
23946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((p_i93->block_size == 0) || (p_i93->num_block == 0)) {
23956767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        DLOG_IF(INFO, nfc_debug_enabled)
23966767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi            << StringPrintf("Unable to get tag memory size");
23976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_i93_handle_error(status);
23986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else if (p_i93->intl_flags & RW_I93_FLAG_RESET_DSFID) {
23996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (rw_i93_send_cmd_write_dsfid(I93_DFS_UNSUPPORTED) == NFC_STATUS_OK) {
24006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->sub_state = RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI;
24016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
24026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          rw_i93_handle_error(NFC_STATUS_FAILED);
24036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
24046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else if (p_i93->intl_flags & RW_I93_FLAG_RESET_AFI) {
24056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (rw_i93_send_cmd_write_afi(0x00) == NFC_STATUS_OK) {
24066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->sub_state = RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI;
24076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
24086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          rw_i93_handle_error(NFC_STATUS_FAILED);
24096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
24106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
24116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* get lock status to see if read-only */
24126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if ((p_i93->uid[1] == I93_UID_IC_MFG_CODE_NXP) &&
24136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (p_i93->ic_reference & I93_ICODE_IC_REF_MBREAD_MASK)) {
24146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* these doesn't support GetMultiBlockSecurityStatus */
24156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
24166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          rw_cb.tcb.i93.rw_offset = 0;
24176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
24186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* read blocks with option flag to get block security status */
24196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (rw_i93_send_cmd_read_single_block(0x0000, true) ==
24206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              NFC_STATUS_OK) {
24216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->sub_state = RW_I93_SUBSTATE_CHECK_READ_ONLY;
24226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          } else {
24236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            rw_i93_handle_error(NFC_STATUS_FAILED);
24246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
24256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
24266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* block offset for read-only check */
24276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->rw_offset = 0;
24286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
24296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (rw_i93_get_next_block_sec() == NFC_STATUS_OK) {
24306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->sub_state = RW_I93_SUBSTATE_CHECK_READ_ONLY;
24316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          } else {
24326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            rw_i93_handle_error(NFC_STATUS_FAILED);
24336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
24346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
24356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
24366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
24376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
24386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
24396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI:
24406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
24416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_i93->sent_cmd == I93_CMD_WRITE_DSFID) {
24426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->intl_flags &= ~RW_I93_FLAG_RESET_DSFID;
24436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else if (p_i93->sent_cmd == I93_CMD_WRITE_AFI) {
24446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->intl_flags &= ~RW_I93_FLAG_RESET_AFI;
24456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
24466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
24476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_i93->intl_flags & RW_I93_FLAG_RESET_DSFID) {
24486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (rw_i93_send_cmd_write_dsfid(I93_DFS_UNSUPPORTED) == NFC_STATUS_OK) {
24496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->sub_state = RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI;
24506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
24516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          rw_i93_handle_error(NFC_STATUS_FAILED);
24526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
24536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else if (p_i93->intl_flags & RW_I93_FLAG_RESET_AFI) {
24546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (rw_i93_send_cmd_write_afi(0x00) == NFC_STATUS_OK) {
24556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->sub_state = RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI;
24566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
24576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          rw_i93_handle_error(NFC_STATUS_FAILED);
24586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
24596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
24606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* get lock status to see if read-only */
24616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if ((p_i93->uid[1] == I93_UID_IC_MFG_CODE_NXP) &&
24626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (p_i93->ic_reference & I93_ICODE_IC_REF_MBREAD_MASK)) {
24636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* these doesn't support GetMultiBlockSecurityStatus */
24646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
24656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          rw_cb.tcb.i93.rw_offset = 0;
24666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
24676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* read blocks with option flag to get block security status */
24686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (rw_i93_send_cmd_read_single_block(0x0000, true) ==
24696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              NFC_STATUS_OK) {
24706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->sub_state = RW_I93_SUBSTATE_CHECK_READ_ONLY;
24716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          } else {
24726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            rw_i93_handle_error(NFC_STATUS_FAILED);
24736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
24746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
24756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* block offset for read-only check */
24766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->rw_offset = 0;
24776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
24786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (rw_i93_get_next_block_sec() == NFC_STATUS_OK) {
24796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->sub_state = RW_I93_SUBSTATE_CHECK_READ_ONLY;
24806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          } else {
24816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            rw_i93_handle_error(NFC_STATUS_FAILED);
24826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
24836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
24846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
24856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
2486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
24876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    case RW_I93_SUBSTATE_CHECK_READ_ONLY:
2488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
24896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((p_i93->product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) ||
24906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (p_i93->product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY) ||
24916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          ((p_i93->uid[1] == I93_UID_IC_MFG_CODE_NXP) &&
24926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           (p_i93->ic_reference & I93_ICODE_IC_REF_MBREAD_MASK))) {
24936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if ((*p) & I93_BLOCK_LOCKED) {
24946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          rw_i93_handle_error(NFC_STATUS_FAILED);
24956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          break;
24966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
24976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
24986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* if we checked all of user blocks */
24996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if ((p_i93->rw_offset / p_i93->block_size) + 1 == p_i93->num_block) {
25006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if ((p_i93->product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) ||
25016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              (p_i93->product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY)) {
25026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            /* read the block which has AFI */
25036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_i93->rw_offset = I93_TAG_IT_HF_I_STD_PRO_CHIP_INLAY_AFI_LOCATION;
25046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            rw_i93_send_cmd_read_single_block(
25056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                (uint16_t)(p_i93->rw_offset / p_i93->block_size), true);
25066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            break;
25076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
25086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else if (p_i93->rw_offset ==
25096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   I93_TAG_IT_HF_I_STD_PRO_CHIP_INLAY_AFI_LOCATION) {
25106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* no block is locked */
25116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
25126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->rw_offset += p_i93->block_size;
25136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          rw_i93_send_cmd_read_single_block(
25146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              (uint16_t)(p_i93->rw_offset / p_i93->block_size), true);
25156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          break;
25166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
25176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
25186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* if any block is locked, we cannot format it */
25196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        for (xx = 0; xx < length; xx++) {
25206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (*(p + xx) & I93_BLOCK_LOCKED) {
25216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            rw_i93_handle_error(NFC_STATUS_FAILED);
2522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
25236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
2524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
25266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* update block offset for read-only check */
25276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->rw_offset += length;
252885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
25296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* if need to get more lock status of blocks */
25306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (p_i93->num_block > p_i93->rw_offset) {
25316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (rw_i93_get_next_block_sec() != NFC_STATUS_OK) {
25326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            rw_i93_handle_error(NFC_STATUS_FAILED);
25336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
25346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          break;
2535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
25366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
2537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
25386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* get buffer to store CC, zero length NDEF TLV and Terminator TLV */
25396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->p_update_data = (uint8_t*)GKI_getbuf(RW_I93_FORMAT_DATA_LEN);
2540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
25416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (!p_i93->p_update_data) {
25426767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        LOG(ERROR) << StringPrintf("Cannot allocate buffer");
25436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_i93_handle_error(NFC_STATUS_FAILED);
2544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
25456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
25466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
25476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p = p_i93->p_update_data;
25486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
25496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Capability Container */
2550867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      *(p++) = I93_ICODE_CC_MAGIC_NUMER_E1; /* magic number */
25516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      *(p++) = 0x40;                     /* version 1.0, read/write */
25526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
25536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* if memory size is less than 2048 bytes */
25546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (((p_i93->num_block * p_i93->block_size) / 8) < 0x100)
25556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        *(p++) = (uint8_t)((p_i93->num_block * p_i93->block_size) /
25566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                           8); /* memory size */
25576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      else
25586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        *(p++) = 0xFF;
25596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
25606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((p_i93->product_version == RW_I93_ICODE_SLI) ||
25616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (p_i93->product_version == RW_I93_ICODE_SLI_S) ||
25626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (p_i93->product_version == RW_I93_ICODE_SLI_L)) {
25636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (p_i93->ic_reference & I93_ICODE_IC_REF_MBREAD_MASK)
25646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          *(p++) = I93_ICODE_CC_IPREAD_MASK; /* IPREAD */
25656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        else
25666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          *(p++) = I93_ICODE_CC_MBREAD_MASK; /* MBREAD, read multi block command
25676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                                supported */
25686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else if ((p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_INLAY) ||
25696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                 (p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_CHIP)) {
25706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        *(p++) = I93_ICODE_CC_MBREAD_MASK; /* MBREAD, read multi block command
25716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                              supported */
25726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else if ((p_i93->product_version ==
25736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) ||
25746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                 (p_i93->product_version ==
25756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY)) {
25766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        *(p++) = 0;
25776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
25786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* STM except LRIS2K, Broadcom supports read multi block command */
25796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
25806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* if memory size is more than 2040 bytes (which is not LRIS2K) */
25816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (((p_i93->num_block * p_i93->block_size) / 8) > 0xFF)
25826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          *(p++) = (I93_ICODE_CC_MBREAD_MASK | I93_STM_CC_OVERFLOW_MASK);
25836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        else if (p_i93->product_version == RW_I93_STM_LRIS2K)
25846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          *(p++) = 0x00;
25856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        else
25866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          *(p++) = I93_ICODE_CC_MBREAD_MASK;
25876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
25886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
25896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* zero length NDEF and Terminator TLV */
25906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      *(p++) = I93_ICODE_TLV_TYPE_NDEF;
25916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      *(p++) = 0x00;
25926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      *(p++) = I93_ICODE_TLV_TYPE_TERM;
25936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      *(p++) = I93_ICODE_TLV_TYPE_NULL;
25946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
25956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* start from block 0 */
25966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->rw_offset = 0;
25976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
25986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (rw_i93_send_cmd_write_single_block(0, p_i93->p_update_data) ==
25996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          NFC_STATUS_OK) {
26006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->sub_state = RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV;
26016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->rw_offset += p_i93->block_size;
26026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
26036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_i93_handle_error(NFC_STATUS_FAILED);
26046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
26056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
2606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV:
2608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
26096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* if we have more data to write */
26106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_i93->rw_offset < RW_I93_FORMAT_DATA_LEN) {
26116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        block_number = (p_i93->rw_offset / p_i93->block_size);
26126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p = p_i93->p_update_data + p_i93->rw_offset;
26136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
26146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (rw_i93_send_cmd_write_single_block(block_number, p) ==
26156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            NFC_STATUS_OK) {
26166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->sub_state = RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV;
26176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->rw_offset += p_i93->block_size;
26186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
26196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          rw_i93_handle_error(NFC_STATUS_FAILED);
2620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
26216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
26226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_freebuf(p_i93->p_update_data);
26236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->p_update_data = NULL;
2624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
26256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->state = RW_I93_STATE_IDLE;
26266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->sent_cmd = 0;
2627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
26286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.status = NFC_STATUS_OK;
26296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (*(rw_cb.p_cback))(RW_I93_FORMAT_CPLT_EVT, &rw_data);
26306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
26316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
2632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
26346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
26356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_sm_set_read_only
2641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process read-only procedure
2643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  1. Update CC as read-only
2645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  2. Lock all block of NDEF TLV
2646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  3. Lock block of CC
2647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
2649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
26516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_i93_sm_set_read_only(NFC_HDR* p_resp) {
26526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p = (uint8_t*)(p_resp + 1) + p_resp->offset;
26536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t flags, block_number;
26546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t length = p_resp->len;
26556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
26566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_DATA rw_data;
2657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
26586767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
26596767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      "sub_state:%s (0x%x)",
26606767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      rw_i93_get_sub_state_name(p_i93->sub_state).c_str(), p_i93->sub_state);
2661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
26626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  STREAM_TO_UINT8(flags, p);
26636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  length--;
26646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
26656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (flags & I93_FLAG_ERROR_DETECTED) {
26666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (((p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_INLAY) ||
26676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         (p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_CHIP) ||
26686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         (p_i93->product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) ||
26696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         (p_i93->product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY)) &&
26706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (*p == I93_ERROR_CODE_BLOCK_FAIL_TO_WRITE)) {
26716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* ignore error */
26726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
26736767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      DLOG_IF(INFO, nfc_debug_enabled)
26746767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi          << StringPrintf("Got error flags (0x%02x)", flags);
26756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_i93_handle_error(NFC_STATUS_FAILED);
26766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return;
2677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
26786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
26806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (p_i93->sub_state) {
2681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_WAIT_CC:
2682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
26836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* mark CC as read-only */
26846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      *(p + 1) |= I93_ICODE_CC_READ_ONLY;
2685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
26866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (rw_i93_send_cmd_write_single_block(0, p) == NFC_STATUS_OK) {
26876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->sub_state = RW_I93_SUBSTATE_WAIT_UPDATE_CC;
26886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
26896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_i93_handle_error(NFC_STATUS_FAILED);
26906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
26916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
2692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_WAIT_UPDATE_CC:
2694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
26956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* successfully write CC then lock all blocks of NDEF TLV */
26966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->rw_offset = p_i93->ndef_tlv_start_offset;
26976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      block_number = (uint8_t)(p_i93->rw_offset / p_i93->block_size);
2698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
26996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (rw_i93_send_cmd_lock_block(block_number) == NFC_STATUS_OK) {
27006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->rw_offset += p_i93->block_size;
27016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->sub_state = RW_I93_SUBSTATE_LOCK_NDEF_TLV;
27026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
27036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_i93_handle_error(NFC_STATUS_FAILED);
27046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
27056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
2706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_LOCK_NDEF_TLV:
2708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
27096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* if we need to lock more blocks */
27106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_i93->rw_offset < p_i93->ndef_tlv_last_offset) {
27116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* get the next block of NDEF TLV */
27126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        block_number = (uint8_t)(p_i93->rw_offset / p_i93->block_size);
27136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
27146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (rw_i93_send_cmd_lock_block(block_number) == NFC_STATUS_OK) {
27156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->rw_offset += p_i93->block_size;
27166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
27176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          rw_i93_handle_error(NFC_STATUS_FAILED);
27186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
27196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
27206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* if the first block of NDEF TLV is different from block of CC */
27216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      else if (p_i93->ndef_tlv_start_offset / p_i93->block_size != 0) {
27226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* lock block of CC */
27236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (rw_i93_send_cmd_lock_block(0) == NFC_STATUS_OK) {
27246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->sub_state = RW_I93_SUBSTATE_WAIT_LOCK_CC;
27256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
27266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          rw_i93_handle_error(NFC_STATUS_FAILED);
27276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
27286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
27296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->intl_flags |= RW_I93_FLAG_READ_ONLY;
27306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->state = RW_I93_STATE_IDLE;
27316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->sent_cmd = 0;
2732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
27336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.status = NFC_STATUS_OK;
27346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (*(rw_cb.p_cback))(RW_I93_SET_TAG_RO_EVT, &rw_data);
27356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
27366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
2737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_WAIT_LOCK_CC:
2739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
27406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->intl_flags |= RW_I93_FLAG_READ_ONLY;
27416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->state = RW_I93_STATE_IDLE;
27426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->sent_cmd = 0;
2743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
27446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_data.status = NFC_STATUS_OK;
27456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (*(rw_cb.p_cback))(RW_I93_SET_TAG_RO_EVT, &rw_data);
27466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
2747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
27496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
27506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_handle_error
2756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      notify error to application and clean up
2758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
2760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
27626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_i93_handle_error(tNFC_STATUS status) {
27636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
27646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_DATA rw_data;
27656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_EVENT event;
2766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
27676767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
27686767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("status:0x%02X, state:0x%X", status, p_i93->state);
2769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
27706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfc_stop_quick_timer(&p_i93->timer);
2771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
27726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.p_cback) {
27736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_data.status = status;
2774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
27756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    switch (p_i93->state) {
27766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case RW_I93_STATE_IDLE: /* in case of RawFrame */
27776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        event = RW_I93_INTF_ERROR_EVT;
27786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
27806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case RW_I93_STATE_BUSY:
27816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (p_i93->sent_cmd == I93_CMD_STAY_QUIET) {
27826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* There is no response to Stay Quiet command */
27836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          rw_data.i93_cmd_cmpl.status = NFC_STATUS_OK;
27846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          rw_data.i93_cmd_cmpl.command = I93_CMD_STAY_QUIET;
27856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          rw_data.i93_cmd_cmpl.error_code = 0;
27866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          event = RW_I93_CMD_CMPL_EVT;
27876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else {
27886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          event = RW_I93_INTF_ERROR_EVT;
27896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
27906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
27926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case RW_I93_STATE_DETECT_NDEF:
279357a3dfa388d16f35d4182782b3ee017164c933ebLove Khanna        rw_data.ndef.protocol = NFC_PROTOCOL_T5T;
27946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.ndef.cur_size = 0;
27956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.ndef.max_size = 0;
27966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.ndef.flags = 0;
27976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.ndef.flags |= RW_NDEF_FL_FORMATABLE;
27986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.ndef.flags |= RW_NDEF_FL_UNKNOWN;
27996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        event = RW_I93_NDEF_DETECT_EVT;
28006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
28026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case RW_I93_STATE_READ_NDEF:
28036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        event = RW_I93_NDEF_READ_FAIL_EVT;
28046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
28066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case RW_I93_STATE_UPDATE_NDEF:
28076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->p_update_data = NULL;
28086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        event = RW_I93_NDEF_UPDATE_FAIL_EVT;
28096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
28116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case RW_I93_STATE_FORMAT:
28126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (p_i93->p_update_data) {
28136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          GKI_freebuf(p_i93->p_update_data);
28146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_i93->p_update_data = NULL;
28156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
28166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        event = RW_I93_FORMAT_CPLT_EVT;
28176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
28196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case RW_I93_STATE_SET_READ_ONLY:
28206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        event = RW_I93_SET_TAG_RO_EVT;
28216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
28236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case RW_I93_STATE_PRESENCE_CHECK:
28246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        event = RW_I93_PRESENCE_CHECK_EVT;
28256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
28276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      default:
28286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        event = RW_I93_MAX_EVT;
28296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
28306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
2831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
28326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_i93->state = RW_I93_STATE_IDLE;
28336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_i93->sent_cmd = 0;
2834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
28356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (event != RW_I93_MAX_EVT) {
28366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (*(rw_cb.p_cback))(event, &rw_data);
2837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
28386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
28396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_i93->state = RW_I93_STATE_IDLE;
28406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_process_timeout
2846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      process timeout event
2848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
2850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
28526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_i93_process_timeout(TIMER_LIST_ENT* p_tle) {
28536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_buf;
28547c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
28556767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event=%d", p_tle->event);
28566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
28576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_tle->event == NFC_TTYPE_RW_I93_RESPONSE) {
28586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((rw_cb.tcb.i93.retry_count < RW_MAX_RETRIES) &&
28596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (rw_cb.tcb.i93.p_retry_cmd) &&
28606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (rw_cb.tcb.i93.sent_cmd != I93_CMD_STAY_QUIET)) {
28616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_cb.tcb.i93.retry_count++;
28626767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf("retry_count = %d", rw_cb.tcb.i93.retry_count);
28636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
28646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf = rw_cb.tcb.i93.p_retry_cmd;
28656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_cb.tcb.i93.p_retry_cmd = NULL;
28666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
28676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (rw_i93_send_to_lower(p_buf)) {
28686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        return;
28696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
2870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
28716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
28726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* all retrial is done or failed to send command to lower layer */
28736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (rw_cb.tcb.i93.p_retry_cmd) {
28746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      GKI_freebuf(rw_cb.tcb.i93.p_retry_cmd);
28756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_cb.tcb.i93.p_retry_cmd = NULL;
28766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_cb.tcb.i93.retry_count = 0;
2877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
28786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_i93_handle_error(NFC_STATUS_TIMEOUT);
28796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
28806767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("unknown event=%d", p_tle->event);
28816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
2883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
2885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_data_cback
2887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This callback function receives the data from NFCC.
2889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
2891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
2892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
28939ba6d2423a011e341d94dfade2fcfb107483d4c6Ruchi Kandoistatic void rw_i93_data_cback(__attribute__((unused)) uint8_t conn_id,
28949ba6d2423a011e341d94dfade2fcfb107483d4c6Ruchi Kandoi                              tNFC_CONN_EVT event, tNFC_CONN* p_data) {
28956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
28966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_resp;
28976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_DATA rw_data;
2898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
28996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t begin_state = p_i93->state;
2900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
29016767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("event = 0x%X", event);
2902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
290357a3dfa388d16f35d4182782b3ee017164c933ebLove Khanna  if ((event == NFC_DEACTIVATE_CEVT) || (event == NFC_ERROR_CEVT) ||
290457a3dfa388d16f35d4182782b3ee017164c933ebLove Khanna      ((event == NFC_DATA_CEVT) && (p_data->status != NFC_STATUS_OK))) {
29056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfc_stop_quick_timer(&p_i93->timer);
2906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2907499be101ec6d38e3fe89b321767af7f087012953Jizhou Liao    if (event == NFC_ERROR_CEVT || (p_data->status != NFC_STATUS_OK)) {
29086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((p_i93->retry_count < RW_MAX_RETRIES) && (p_i93->p_retry_cmd)) {
29096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->retry_count++;
291085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
29116767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        LOG(ERROR) << StringPrintf("retry_count = %d", p_i93->retry_count);
291285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
29136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_resp = p_i93->p_retry_cmd;
29146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->p_retry_cmd = NULL;
29156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (rw_i93_send_to_lower(p_resp)) {
29166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          return;
29176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        }
29186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
291985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
29206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* all retrial is done or failed to send command to lower layer */
29216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_i93->p_retry_cmd) {
29226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_freebuf(p_i93->p_retry_cmd);
29236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->p_retry_cmd = NULL;
29246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->retry_count = 0;
29256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
29267c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
29276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_i93_handle_error((tNFC_STATUS)(*(uint8_t*)p_data));
29286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
29296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* free retry buffer */
29306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_i93->p_retry_cmd) {
29316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_freebuf(p_i93->p_retry_cmd);
29326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->p_retry_cmd = NULL;
29336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_i93->retry_count = 0;
29346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
29356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NFC_SetStaticRfCback(NULL);
29366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->state = RW_I93_STATE_NOT_ACTIVATED;
2937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
29386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return;
29396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
29416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (event != NFC_DATA_CEVT) {
29426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return;
29436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
29456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_resp = (NFC_HDR*)p_data->data.p_data;
29467c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu
29476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfc_stop_quick_timer(&p_i93->timer);
2948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
29496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* free retry buffer */
29506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_i93->p_retry_cmd) {
29516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_freebuf(p_i93->p_retry_cmd);
29526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_i93->p_retry_cmd = NULL;
29536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_i93->retry_count = 0;
29546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
295585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
29566767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
29576767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      "RW I93 state: <%s (%d)>", rw_i93_get_state_name(p_i93->state).c_str(),
29586767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      p_i93->state);
2959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
29606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (p_i93->state) {
2961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_STATE_IDLE:
29626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Unexpected Response from VICC, it should be raw frame response */
29636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* forward to upper layer without parsing */
29646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->sent_cmd = 0;
29656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (rw_cb.p_cback) {
29666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.raw_frame.status = p_data->data.status;
29676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_data.raw_frame.p_data = p_resp;
29686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (*(rw_cb.p_cback))(RW_I93_RAW_FRAME_EVT, &rw_data);
29696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_resp = NULL;
29706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
29716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_freebuf(p_resp);
29726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
29736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
2974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_STATE_BUSY:
29756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->state = RW_I93_STATE_IDLE;
29766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_i93_send_to_upper(p_resp);
29776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      GKI_freebuf(p_resp);
29786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
2979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_STATE_DETECT_NDEF:
29816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_i93_sm_detect_ndef(p_resp);
29826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      GKI_freebuf(p_resp);
29836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
2984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_STATE_READ_NDEF:
29866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_i93_sm_read_ndef(p_resp);
29876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* p_resp may send upper lyaer */
29886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
2989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_STATE_UPDATE_NDEF:
29916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_i93_sm_update_ndef(p_resp);
29926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      GKI_freebuf(p_resp);
29936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
2994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_STATE_FORMAT:
29966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_i93_sm_format(p_resp);
29976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      GKI_freebuf(p_resp);
29986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
2999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_STATE_SET_READ_ONLY:
30016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_i93_sm_set_read_only(p_resp);
30026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      GKI_freebuf(p_resp);
30036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
3004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_STATE_PRESENCE_CHECK:
30066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->state = RW_I93_STATE_IDLE;
30076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i93->sent_cmd = 0;
3008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
30096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* if any response, send presence check with ok */
30106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_data.status = NFC_STATUS_OK;
30116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (*(rw_cb.p_cback))(RW_I93_PRESENCE_CHECK_EVT, &rw_data);
30126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      GKI_freebuf(p_resp);
30136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
3014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
30166767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf("invalid state=%d", p_i93->state);
30176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      GKI_freebuf(p_resp);
30186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
30196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
30216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (begin_state != p_i93->state) {
30226767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    DLOG_IF(INFO, nfc_debug_enabled)
30236767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        << StringPrintf("RW I93 state changed:<%s> -> <%s>",
30246767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                        rw_i93_get_state_name(begin_state).c_str(),
30256767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                        rw_i93_get_state_name(p_i93->state).c_str());
30266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_select
3032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
303357a3dfa388d16f35d4182782b3ee017164c933ebLove Khanna** Description      Initialise ISO 15693 / T5T RW
3034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
3036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
30386fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_i93_select(uint8_t* p_uid) {
30396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_I93_CB* p_i93 = &rw_cb.tcb.i93;
30406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t uid[I93_UID_BYTE_LEN], *p;
3041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
30426767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
3043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
30446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_SetStaticRfCback(rw_i93_data_cback);
3045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
30466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_i93->state = RW_I93_STATE_IDLE;
3047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
30486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* convert UID to big endian format - MSB(0xE0) in first byte */
30496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = uid;
30506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  STREAM_TO_ARRAY8(p, p_uid);
305185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
30526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  rw_i93_get_product_version(uid);
305385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
30546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return NFC_STATUS_OK;
3055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_I93Inventory
3060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
30615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      This function send Inventory command with/without AFI
3062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  If UID is provided then set UID[0]:MSB, ... UID[7]:LSB
3063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  RW_I93_RESPONSE_EVT will be returned
3065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
3067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_NO_BUFFERS if out of buffer
3068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_BUSY if busy
3069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if other error
3070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
30726fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_I93Inventory(bool including_afi, uint8_t afi, uint8_t* p_uid) {
30736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status;
3074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
30756767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
30766767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf(", including_afi:%d, AFI:0x%02X", including_afi, afi);
3077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
30786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
30796767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
30806767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               rw_cb.tcb.i93.state);
30816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_BUSY;
30826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
30846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = rw_i93_send_cmd_inventory(p_uid, including_afi, afi);
3085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
30866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == NFC_STATUS_OK) {
30876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
30886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
30906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (status);
3091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_I93StayQuiet
3096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function send Inventory command
3098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  RW_I93_CMD_CMPL_EVT will be returned
3100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
3102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_NO_BUFFERS if out of buffer
3103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_BUSY if busy
3104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if other error
3105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
31076fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_I93StayQuiet(void) {
31086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status;
3109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
31106767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
3111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
31126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
31136767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
31146767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               rw_cb.tcb.i93.state);
31156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_BUSY;
31166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
31186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = rw_i93_send_cmd_stay_quiet();
31196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == NFC_STATUS_OK) {
31206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
31216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
31236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
3124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_I93ReadSingleBlock
3129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function send Read Single Block command
3131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  RW_I93_RESPONSE_EVT will be returned
3133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
3135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_NO_BUFFERS if out of buffer
3136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_BUSY if busy
3137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if other error
3138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
31406fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_I93ReadSingleBlock(uint16_t block_number) {
31416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status;
3142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
31436767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
31446767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("block_number:0x%02X", block_number);
3145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
31466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
31476767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
31486767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               rw_cb.tcb.i93.state);
31496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_BUSY;
31506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
31526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = rw_i93_send_cmd_read_single_block(block_number, false);
31536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == NFC_STATUS_OK) {
31546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
31556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
31576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
3158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_I93WriteSingleBlock
3163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function send Write Single Block command
3165552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  Application must get block size first by calling
3166552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  RW_I93GetSysInfo().
3167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  RW_I93_CMD_CMPL_EVT will be returned
3169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
3171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_NO_BUFFERS if out of buffer
3172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_BUSY if busy
3173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if other error
3174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
31766fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_I93WriteSingleBlock(uint16_t block_number, uint8_t* p_data) {
31776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status;
3178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
31796767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
3180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
31816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
31826767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
31836767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               rw_cb.tcb.i93.state);
31846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_BUSY;
31856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
31876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.block_size == 0) {
31886767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Block size is unknown");
31896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
31906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
31916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
31926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = rw_i93_send_cmd_write_single_block(block_number, p_data);
31936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == NFC_STATUS_OK) {
31946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
31956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
31966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
31976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
3198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_I93LockBlock
3203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function send Lock Block command
3205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  RW_I93_CMD_CMPL_EVT will be returned
3207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
3209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_NO_BUFFERS if out of buffer
3210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_BUSY if busy
3211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if other error
3212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
32146fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_I93LockBlock(uint8_t block_number) {
32156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status;
3216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
32176767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
3218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
32196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
32206767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
32216767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               rw_cb.tcb.i93.state);
32226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_BUSY;
32236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
32256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = rw_i93_send_cmd_lock_block(block_number);
32266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == NFC_STATUS_OK) {
32276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
32286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
32306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
3231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_I93ReadMultipleBlocks
3236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function send Read Multiple Blocks command
3238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  RW_I93_RESPONSE_EVT will be returned
3240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
3242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_NO_BUFFERS if out of buffer
3243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_BUSY if busy
3244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if other error
3245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
32476fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_I93ReadMultipleBlocks(uint16_t first_block_number,
32486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                     uint16_t number_blocks) {
32496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status;
3250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
32516767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
32526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
32536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
32546767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
32556767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               rw_cb.tcb.i93.state);
32566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_BUSY;
32576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
32586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
32596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = rw_i93_send_cmd_read_multi_blocks(first_block_number, number_blocks);
32606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == NFC_STATUS_OK) {
32616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
32626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
32646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
3265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_I93WriteMultipleBlocks
3270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function send Write Multiple Blocks command
3272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  RW_I93_CMD_CMPL_EVT will be returned
3274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
3276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_NO_BUFFERS if out of buffer
3277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_BUSY if busy
3278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if other error
3279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3281867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael ColladotNFC_STATUS RW_I93WriteMultipleBlocks(uint16_t first_block_number,
32826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                      uint16_t number_blocks, uint8_t* p_data) {
32836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status;
32846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
32856767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
32866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
32876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
32886767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
32896767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               rw_cb.tcb.i93.state);
32906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_BUSY;
32916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
32926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
32936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.block_size == 0) {
32946767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Block size is unknown");
32956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
32966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
32976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
32986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = rw_i93_send_cmd_write_multi_blocks(first_block_number, number_blocks,
32996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                              p_data);
33006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == NFC_STATUS_OK) {
33016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
33026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
33036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
33046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
3305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_I93Select
3310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function send Select command
3312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  UID[0]: 0xE0, MSB
3314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  UID[1]: IC Mfg Code
3315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  ...
3316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  UID[7]: LSB
3317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  RW_I93_CMD_CMPL_EVT will be returned
3319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
3321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_NO_BUFFERS if out of buffer
3322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_BUSY if busy
3323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if other error
3324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
33266fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_I93Select(uint8_t* p_uid) {
33276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status;
3328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
33296767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
3330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
33316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
33326767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
33336767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               rw_cb.tcb.i93.state);
33346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_BUSY;
33356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
33376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_uid) {
33386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = rw_i93_send_cmd_select(p_uid);
33396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (status == NFC_STATUS_OK) {
33406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
3341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
33426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
33436767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("UID shall be provided");
33446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = NFC_STATUS_FAILED;
33456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
33476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
3348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_I93ResetToReady
3353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function send Reset To Ready command
3355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  RW_I93_CMD_CMPL_EVT will be returned
3357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
3359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_NO_BUFFERS if out of buffer
3360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_BUSY if busy
3361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if other error
3362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
33646fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_I93ResetToReady(void) {
33656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status;
3366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
33676767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
3368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
33696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
33706767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
33716767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               rw_cb.tcb.i93.state);
33726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_BUSY;
33736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
33756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = rw_i93_send_cmd_reset_to_ready();
33766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == NFC_STATUS_OK) {
33776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
33786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
33806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
3381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_I93WriteAFI
3386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function send Write AFI command
3388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  RW_I93_CMD_CMPL_EVT will be returned
3390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
3392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_NO_BUFFERS if out of buffer
3393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_BUSY if busy
3394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if other error
3395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
33976fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_I93WriteAFI(uint8_t afi) {
33986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status;
3399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
34006767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
3401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
34026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
34036767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
34046767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               rw_cb.tcb.i93.state);
34056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_BUSY;
34066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
34086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = rw_i93_send_cmd_write_afi(afi);
34096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == NFC_STATUS_OK) {
34106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
34116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
34136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
3414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_I93LockAFI
3419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function send Lock AFI command
3421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  RW_I93_CMD_CMPL_EVT will be returned
3423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
3425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_NO_BUFFERS if out of buffer
3426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_BUSY if busy
3427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if other error
3428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
34306fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_I93LockAFI(void) {
34316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status;
3432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
34336767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
3434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
34356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
34366767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
34376767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               rw_cb.tcb.i93.state);
34386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_BUSY;
34396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
34416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = rw_i93_send_cmd_lock_afi();
34426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == NFC_STATUS_OK) {
34436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
34446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
34466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
3447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_I93WriteDSFID
3452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function send Write DSFID command
3454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  RW_I93_CMD_CMPL_EVT will be returned
3456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
3458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_NO_BUFFERS if out of buffer
3459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_BUSY if busy
3460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if other error
3461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
34636fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_I93WriteDSFID(uint8_t dsfid) {
34646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status;
3465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
34666767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
3467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
34686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
34696767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
34706767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               rw_cb.tcb.i93.state);
34716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_BUSY;
34726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
34746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = rw_i93_send_cmd_write_dsfid(dsfid);
34756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == NFC_STATUS_OK) {
34766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
34776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
34796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
3480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_I93LockDSFID
3485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function send Lock DSFID command
3487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  RW_I93_CMD_CMPL_EVT will be returned
3489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
3491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_NO_BUFFERS if out of buffer
3492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_BUSY if busy
3493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if other error
3494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
34966fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_I93LockDSFID(void) {
34976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status;
3498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
34996767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
3500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
35016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
35026767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
35036767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               rw_cb.tcb.i93.state);
35046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_BUSY;
35056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
35076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = rw_i93_send_cmd_lock_dsfid();
35086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == NFC_STATUS_OK) {
35096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
35106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
35126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
3513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_I93GetSysInfo
3518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function send Get System Information command
3520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  RW_I93_RESPONSE_EVT will be returned
3522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
3524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_NO_BUFFERS if out of buffer
3525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_BUSY if busy
3526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if other error
3527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
35296fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_I93GetSysInfo(uint8_t* p_uid) {
35306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status;
3531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
35326767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
3533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
35346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
35356767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
35366767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               rw_cb.tcb.i93.state);
35376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_BUSY;
35386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
35406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_uid) {
35416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = rw_i93_send_cmd_get_sys_info(p_uid, I93_FLAG_PROT_EXT_NO);
35426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
35436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = rw_i93_send_cmd_get_sys_info(NULL, I93_FLAG_PROT_EXT_NO);
35446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
35466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == NFC_STATUS_OK) {
35476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
35486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
35506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
3551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_I93GetMultiBlockSecurityStatus
3556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3557552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      This function send Get Multiple Block Security Status
3558552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  command
3559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  RW_I93_RESPONSE_EVT will be returned
3561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
3563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_NO_BUFFERS if out of buffer
3564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_BUSY if busy
3565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if other error
3566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
35686fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_I93GetMultiBlockSecurityStatus(uint16_t first_block_number,
35696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                              uint16_t number_blocks) {
35706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status;
35716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
35726767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
35736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
35746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
35756767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf(
35766767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        "Unable to start command at state "
35776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "(0x%X)",
35786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_cb.tcb.i93.state);
35796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_BUSY;
35806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
35816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
35826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status =
35836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_i93_send_cmd_get_multi_block_sec(first_block_number, number_blocks);
35846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == NFC_STATUS_OK) {
35856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.state = RW_I93_STATE_BUSY;
35866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
35876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
35886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
3589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_I93DetectNDef
3594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function performs NDEF detection procedure
3596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  RW_I93_NDEF_DETECT_EVT will be returned
3598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
3600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if busy or other error
3601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
36036fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_I93DetectNDef(void) {
36046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status;
36056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_I93_RW_SUBSTATE sub_state;
36066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
36076767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
36086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
36096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
36106767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
36116767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               rw_cb.tcb.i93.state);
36126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
36136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
36146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
36156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.uid[0] != I93_UID_FIRST_BYTE) {
36166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = rw_i93_send_cmd_inventory(NULL, false, 0x00);
36176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    sub_state = RW_I93_SUBSTATE_WAIT_UID;
36186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if ((rw_cb.tcb.i93.num_block == 0) ||
36196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             (rw_cb.tcb.i93.block_size == 0)) {
36206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status =
36216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_i93_send_cmd_get_sys_info(rw_cb.tcb.i93.uid, I93_FLAG_PROT_EXT_NO);
36226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    sub_state = RW_I93_SUBSTATE_WAIT_SYS_INFO;
36236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
36246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* clear all flags */
36256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.intl_flags = 0;
36266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
36276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* read CC in the first block */
36286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = rw_i93_send_cmd_read_single_block(0x0000, false);
36296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    sub_state = RW_I93_SUBSTATE_WAIT_CC;
36306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
36316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
36326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == NFC_STATUS_OK) {
36336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.state = RW_I93_STATE_DETECT_NDEF;
36346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.sub_state = sub_state;
36356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
36366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* clear flags except flag for 2 bytes of number of blocks */
36376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.intl_flags &= RW_I93_FLAG_16BIT_NUM_BLOCK;
36386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
36396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
36406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (status);
3641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_I93ReadNDef
3646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function performs NDEF read procedure
3648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Note: RW_I93DetectNDef () must be called before using this
3649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  The following event will be returned
3651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      RW_I93_NDEF_READ_EVT for each segmented NDEF message
3652552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                      RW_I93_NDEF_READ_CPLT_EVT for the last segment or
3653552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                      complete NDEF
3654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      RW_I93_NDEF_READ_FAIL_EVT for failure
3655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
3657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if I93 is busy or other error
3658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
36606fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_I93ReadNDef(void) {
36616767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
36626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
36636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
36646767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
36656767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               rw_cb.tcb.i93.state);
36666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
36676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
36686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
36696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((rw_cb.tcb.i93.tlv_type == I93_ICODE_TLV_TYPE_NDEF) &&
36706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (rw_cb.tcb.i93.ndef_length > 0)) {
36716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.rw_offset = rw_cb.tcb.i93.ndef_tlv_start_offset;
36726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.rw_length = 0;
36736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
36746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (rw_i93_get_next_blocks(rw_cb.tcb.i93.rw_offset) == NFC_STATUS_OK) {
36756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_cb.tcb.i93.state = RW_I93_STATE_READ_NDEF;
36766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
36776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return NFC_STATUS_FAILED;
36786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
36796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
36806767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("No NDEF detected");
36816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
36826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
36836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
36846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return NFC_STATUS_OK;
3685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_I93UpdateNDef
3690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function performs NDEF update procedure
3692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Note: RW_I93DetectNDef () must be called before using this
3693552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                        Updating data must not be removed until returning
3694552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                        event
3695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  The following event will be returned
3697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      RW_I93_NDEF_UPDATE_CPLT_EVT for complete
3698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                      RW_I93_NDEF_UPDATE_FAIL_EVT for failure
3699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
3701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if I93 is busy or other error
3702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
37046fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_I93UpdateNDef(uint16_t length, uint8_t* p_data) {
37056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t block_number;
3706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
37076767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("length:%d", length);
3708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
37096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
37106767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
37116767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               rw_cb.tcb.i93.state);
37126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
37136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
37156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.tlv_type == I93_ICODE_TLV_TYPE_NDEF) {
37166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_READ_ONLY) {
37176767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf("NDEF is read-only");
37186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return NFC_STATUS_FAILED;
37196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
37206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (rw_cb.tcb.i93.max_ndef_length < length) {
37216767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf(
37226767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi          "data (%d bytes) is more than max NDEF length "
37236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "(%d)",
37246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          length, rw_cb.tcb.i93.max_ndef_length);
37256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return NFC_STATUS_FAILED;
37266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
3727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
37286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.ndef_length = length;
37296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.p_update_data = p_data;
3730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
37316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* read length field */
37326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.rw_offset = rw_cb.tcb.i93.ndef_tlv_start_offset + 1;
37336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.rw_length = 0;
3734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
37356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    block_number = rw_cb.tcb.i93.rw_offset / rw_cb.tcb.i93.block_size;
3736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
37376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (rw_i93_send_cmd_read_single_block(block_number, false) ==
37386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NFC_STATUS_OK) {
37396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_cb.tcb.i93.state = RW_I93_STATE_UPDATE_NDEF;
37406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_cb.tcb.i93.sub_state = RW_I93_SUBSTATE_RESET_LEN;
37416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
37426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return NFC_STATUS_FAILED;
3743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
37446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
37456767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("No NDEF detected");
37466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
37476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
37496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return NFC_STATUS_OK;
3750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_I93FormatNDef
3755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function performs formatting procedure
3757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  RW_I93_FORMAT_CPLT_EVT will be returned
3759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
3761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if busy or other error
3762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
37646fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_I93FormatNDef(void) {
37656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status;
37666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_I93_RW_SUBSTATE sub_state;
37676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
37686767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
37696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
37706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
37716767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
37726767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               rw_cb.tcb.i93.state);
37736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
37746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
37756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
37766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) ||
37776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY)) {
37786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* These don't support GetSystemInformation and GetMultiBlockSecurityStatus
37796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     */
37806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.rw_offset = 0;
37816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
37826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* read blocks with option flag to get block security status */
37836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = rw_i93_send_cmd_read_single_block(0x0000, true);
37846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    sub_state = RW_I93_SUBSTATE_CHECK_READ_ONLY;
37856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
37866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = rw_i93_send_cmd_inventory(rw_cb.tcb.i93.uid, false, 0x00);
37876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    sub_state = RW_I93_SUBSTATE_WAIT_UID;
37886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
37896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
37906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == NFC_STATUS_OK) {
37916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.state = RW_I93_STATE_FORMAT;
37926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.sub_state = sub_state;
37936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.tcb.i93.intl_flags = 0;
37946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
37956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
37966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (status);
3797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_I93SetTagReadOnly
3802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function performs NDEF read-only procedure
3804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Note: RW_I93DetectNDef () must be called before using this
3805552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                        Updating data must not be removed until returning
3806552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                        event
3807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  The RW_I93_SET_TAG_RO_EVT event will be returned.
3809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if success
3811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED if I93 is busy or other error
3812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
38146fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_I93SetTagReadOnly(void) {
38156767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
38166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
38176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
38186767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Unable to start command at state (0x%X)",
38196767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               rw_cb.tcb.i93.state);
38206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
38216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
38226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
38236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.i93.tlv_type == I93_ICODE_TLV_TYPE_NDEF) {
38246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_READ_ONLY) {
38256767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf("NDEF is already read-only");
38266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return NFC_STATUS_FAILED;
38276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
38286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
38296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* get CC in the first block */
38306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (rw_i93_send_cmd_read_single_block(0, false) == NFC_STATUS_OK) {
38316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_cb.tcb.i93.state = RW_I93_STATE_SET_READ_ONLY;
38326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_cb.tcb.i93.sub_state = RW_I93_SUBSTATE_WAIT_CC;
38336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
38346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return NFC_STATUS_FAILED;
38356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
38366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
38376767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("No NDEF detected");
38386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
38396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
38406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
38416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return NFC_STATUS_OK;
3842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
3845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_I93PresenceCheck
3847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Check if the tag is still in the field.
3849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  The RW_I93_PRESENCE_CHECK_EVT w/ status is used to indicate
3851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  presence or non-presence.
3852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK, if raw data frame sent
3854552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this
3855552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  operation
3856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NFC_STATUS_FAILED: other error
3857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
38596fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_I93PresenceCheck(void) {
38606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status;
38616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_DATA evt_data;
3862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
38636767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
3864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
38656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!rw_cb.p_cback) {
38666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_FAILED;
38676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (rw_cb.tcb.i93.state == RW_I93_STATE_NOT_ACTIVATED) {
38686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.status = NFC_STATUS_FAILED;
38696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    (*rw_cb.p_cback)(RW_T4T_PRESENCE_CHECK_EVT, &evt_data);
3870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
38716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_OK;
38726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) {
38736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFC_STATUS_BUSY;
38746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
38756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* The support of AFI by the VICC is optional, so do not include AFI */
38766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = rw_i93_send_cmd_inventory(rw_cb.tcb.i93.uid, false, 0x00);
3877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
38786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (status == NFC_STATUS_OK) {
38796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* do not retry during presence check */
38806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_cb.tcb.i93.retry_count = RW_MAX_RETRIES;
38816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_cb.tcb.i93.state = RW_I93_STATE_PRESENCE_CHECK;
3882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
38836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
38856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (status);
3886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_get_state_name
3891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function returns the state name.
3893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NOTE             conditionally compiled to save memory.
3895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to the name
3897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
38997dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoistatic std::string rw_i93_get_state_name(uint8_t state) {
39006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (state) {
3901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_STATE_NOT_ACTIVATED:
39027dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "NOT_ACTIVATED";
3903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_STATE_IDLE:
39047dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "IDLE";
3905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_STATE_BUSY:
39067dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "BUSY";
3907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_STATE_DETECT_NDEF:
39087dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "NDEF_DETECTION";
3909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_STATE_READ_NDEF:
39107dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "READ_NDEF";
3911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_STATE_UPDATE_NDEF:
39127dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "UPDATE_NDEF";
3913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_STATE_FORMAT:
39147dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "FORMAT";
3915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_STATE_SET_READ_ONLY:
39167dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "SET_READ_ONLY";
3917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_STATE_PRESENCE_CHECK:
39187dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "PRESENCE_CHECK";
3919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
39207dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "???? UNKNOWN STATE";
39216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
3923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
3925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_i93_get_sub_state_name
3927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function returns the sub_state name.
3929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NOTE             conditionally compiled to save memory.
3931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to the name
3933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
3934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
39357dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoistatic std::string rw_i93_get_sub_state_name(uint8_t sub_state) {
39366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (sub_state) {
3937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_WAIT_UID:
39387dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "WAIT_UID";
3939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_WAIT_SYS_INFO:
39407dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "WAIT_SYS_INFO";
3941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_WAIT_CC:
39427dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "WAIT_CC";
3943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_SEARCH_NDEF_TLV:
39447dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "SEARCH_NDEF_TLV";
3945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_CHECK_LOCK_STATUS:
39467dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "CHECK_LOCK_STATUS";
3947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_RESET_LEN:
39487dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "RESET_LEN";
3949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_WRITE_NDEF:
39507dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "WRITE_NDEF";
3951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_UPDATE_LEN:
39527dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "UPDATE_LEN";
3953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI:
39547dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "WAIT_RESET_DSFID_AFI";
3955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_CHECK_READ_ONLY:
39567dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "CHECK_READ_ONLY";
3957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV:
39587dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "WRITE_CC_NDEF_TLV";
3959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_WAIT_UPDATE_CC:
39607dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "WAIT_UPDATE_CC";
3961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_LOCK_NDEF_TLV:
39627dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "LOCK_NDEF_TLV";
3963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_I93_SUBSTATE_WAIT_LOCK_CC:
39647dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "WAIT_LOCK_CC";
3965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
39667dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "???? UNKNOWN SUBSTATE";
39676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
396985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu
397085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu/*******************************************************************************
397185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu**
397285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** Function         rw_i93_get_tag_name
397385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu**
397485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** Description      This function returns the tag name.
397585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu**
397685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** NOTE             conditionally compiled to save memory.
397785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu**
397885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** Returns          pointer to the name
397985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu**
398085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu*******************************************************************************/
39817dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoistatic std::string rw_i93_get_tag_name(uint8_t product_version) {
39826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (product_version) {
398385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu    case RW_I93_ICODE_SLI:
39847dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "SLI/SLIX";
398585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu    case RW_I93_ICODE_SLI_S:
39867dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "SLI-S/SLIX-S";
398785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu    case RW_I93_ICODE_SLI_L:
39887dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "SLI-L/SLIX-L";
398985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu    case RW_I93_TAG_IT_HF_I_PLUS_INLAY:
39907dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "Tag-it HF-I Plus Inlay";
399185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu    case RW_I93_TAG_IT_HF_I_PLUS_CHIP:
39927dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "Tag-it HF-I Plus Chip";
399385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu    case RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY:
39947dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "Tag-it HF-I Standard Chip/Inlyas";
399585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu    case RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY:
39967dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "Tag-it HF-I Pro Chip/Inlays";
399785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu    case RW_I93_STM_LRI1K:
39987dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "LRi1K";
399985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu    case RW_I93_STM_LRI2K:
40007dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "LRi2K";
400185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu    case RW_I93_STM_LRIS2K:
40027dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "LRiS2K";
400385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu    case RW_I93_STM_LRIS64K:
40047dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "LRiS64K";
400585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu    case RW_I93_STM_M24LR64_R:
40067dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "M24LR64";
400785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu    case RW_I93_STM_M24LR04E_R:
40087dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "M24LR04E";
400985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu    case RW_I93_STM_M24LR16E_R:
40107dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "M24LR16E";
401185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu    case RW_I93_STM_M24LR64E_R:
40127dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "M24LR64E";
4013867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    case RW_I93_STM_ST25DV04K:
4014867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      return "ST25DV04";
4015867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado    case RW_I93_STM_ST25DVHIK:
4016867d5c37f21ea4a5ee521fe04b8ebd623d67a666Raphael Collado      return "ST25DV";
401785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu    case RW_I93_UNKNOWN_PRODUCT:
401885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu    default:
40197dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      return "UNKNOWN";
40206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
402185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu}
4022