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