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 195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * This file contains the implementation for ISO 15693 in Reader/Writer 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * mode. 24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h> 27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_target.h" 28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "bt_types.h" 29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "trace_api.h" 30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_INCLUDED == TRUE) 32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_api.h" 34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_int.h" 35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "rw_api.h" 36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "rw_int.h" 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_I93_TOUT_RESP 1000 /* Response timeout */ 39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_I93_TOUT_STAY_QUIET 200 /* stay quiet timeout */ 40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_I93_READ_MULTI_BLOCK_SIZE 128 /* max reading data if read multi block is supported */ 41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_I93_FORMAT_DATA_LEN 8 /* CC, zero length NDEF, Terminator TLV */ 4285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu#define RW_I93_GET_MULTI_BLOCK_SEC_SIZE 512 /* max getting lock status if get multi block sec is supported */ 43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* main state */ 45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectenum 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_STATE_NOT_ACTIVATED, /* ISO15693 is not activated */ 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_STATE_IDLE, /* waiting for upper layer API */ 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_STATE_BUSY, /* waiting for response from tag */ 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_STATE_DETECT_NDEF, /* performing NDEF detection precedure */ 52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_STATE_READ_NDEF, /* performing read NDEF procedure */ 53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_STATE_UPDATE_NDEF, /* performing update NDEF procedure */ 54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_STATE_FORMAT, /* performing format procedure */ 55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_STATE_SET_READ_ONLY, /* performing set read-only procedure */ 56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_STATE_PRESENCE_CHECK /* checking presence of tag */ 58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* sub state */ 61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectenum 62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_SUBSTATE_WAIT_UID, /* waiting for response of inventory */ 64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_SUBSTATE_WAIT_SYS_INFO, /* waiting for response of get sys info */ 65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_SUBSTATE_WAIT_CC, /* waiting for reading CC */ 66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_SUBSTATE_SEARCH_NDEF_TLV, /* searching NDEF TLV */ 67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_SUBSTATE_CHECK_LOCK_STATUS, /* check if any NDEF TLV is locked */ 68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_SUBSTATE_RESET_LEN, /* set length to 0 to update NDEF TLV */ 70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_SUBSTATE_WRITE_NDEF, /* writing NDEF and Terminator TLV */ 71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_SUBSTATE_UPDATE_LEN, /* set length into NDEF TLV */ 72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI, /* reset DSFID and AFI */ 74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_SUBSTATE_CHECK_READ_ONLY, /* check if any block is locked */ 75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV, /* write CC and empty NDEF/Terminator TLV */ 76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_SUBSTATE_WAIT_UPDATE_CC, /* updating CC as read-only */ 78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_SUBSTATE_LOCK_NDEF_TLV, /* lock blocks of NDEF TLV */ 79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_I93_SUBSTATE_WAIT_LOCK_CC /* lock block of CC */ 80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *rw_i93_get_state_name (UINT8 state); 84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *rw_i93_get_sub_state_name (UINT8 sub_state); 8585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chustatic char *rw_i93_get_tag_name (UINT8 product_version); 86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_i93_data_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data); 89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_i93_handle_error (tNFC_STATUS status); 9085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan ChutNFC_STATUS rw_i93_send_cmd_get_sys_info (UINT8 *p_uid, UINT8 extra_flag); 91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_get_product_version 95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Get product version from UID 97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_i93_get_product_version (UINT8 *p_uid) 102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_I93_CB *p_i93 = &rw_cb.tcb.i93; 104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!memcmp (p_i93->uid, p_uid, I93_UID_BYTE_LEN)) 106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_i93_get_product_version ()"); 111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_i93->uid, p_uid, I93_UID_BYTE_LEN); 113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_uid[1] == I93_UID_IC_MFG_CODE_NXP) 115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_uid[2] == I93_UID_ICODE_SLI) 117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->product_version = RW_I93_ICODE_SLI; 118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_uid[2] == I93_UID_ICODE_SLI_S) 119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->product_version = RW_I93_ICODE_SLI_S; 120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_uid[2] == I93_UID_ICODE_SLI_L) 121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->product_version = RW_I93_ICODE_SLI_L; 122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->product_version = RW_I93_UNKNOWN_PRODUCT; 124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_uid[1] == I93_UID_IC_MFG_CODE_TI) 126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_uid[2] & I93_UID_TAG_IT_HF_I_PRODUCT_ID_MASK) == I93_UID_TAG_IT_HF_I_PLUS_INLAY) 128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->product_version = RW_I93_TAG_IT_HF_I_PLUS_INLAY; 129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ((p_uid[2] & I93_UID_TAG_IT_HF_I_PRODUCT_ID_MASK) == I93_UID_TAG_IT_HF_I_PLUS_CHIP) 130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->product_version = RW_I93_TAG_IT_HF_I_PLUS_CHIP; 131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ((p_uid[2] & I93_UID_TAG_IT_HF_I_PRODUCT_ID_MASK) == I93_UID_TAG_IT_HF_I_STD_CHIP_INLAY) 132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->product_version = RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY; 133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ((p_uid[2] & I93_UID_TAG_IT_HF_I_PRODUCT_ID_MASK) == I93_UID_TAG_IT_HF_I_PRO_CHIP_INLAY) 134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->product_version = RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY; 135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->product_version = RW_I93_UNKNOWN_PRODUCT; 137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 13885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else if ( (p_uid[1] == I93_UID_IC_MFG_CODE_STM) 13985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu &&(p_i93->info_flags & I93_INFO_FLAG_IC_REF) ) 14085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 14185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (p_i93->ic_reference == I93_IC_REF_STM_M24LR04E_R) 14285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->product_version = RW_I93_STM_M24LR04E_R; 14385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else if (p_i93->ic_reference == I93_IC_REF_STM_M24LR16E_R) 14485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->product_version = RW_I93_STM_M24LR16E_R; 14585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else if (p_i93->ic_reference == I93_IC_REF_STM_M24LR64E_R) 14685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->product_version = RW_I93_STM_M24LR64E_R; 14785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else 14885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 14985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu switch (p_i93->ic_reference & I93_IC_REF_STM_MASK) 15085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 15185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu case I93_IC_REF_STM_LRI1K: 15285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->product_version = RW_I93_STM_LRI1K; 15385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu break; 15485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu case I93_IC_REF_STM_LRI2K: 15585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->product_version = RW_I93_STM_LRI2K; 15685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu break; 15785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu case I93_IC_REF_STM_LRIS2K: 15885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->product_version = RW_I93_STM_LRIS2K; 15985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu break; 16085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu case I93_IC_REF_STM_LRIS64K: 16185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->product_version = RW_I93_STM_LRIS64K; 16285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu break; 16385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu case I93_IC_REF_STM_M24LR64_R: 16485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->product_version = RW_I93_STM_M24LR64_R; 16585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu break; 16685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu default: 16785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->product_version = RW_I93_UNKNOWN_PRODUCT; 16885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu break; 16985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 17085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 17185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->product_version = RW_I93_UNKNOWN_PRODUCT; 175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu#if (BT_TRACE_VERBOSE == TRUE) 17885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu RW_TRACE_DEBUG1 ("product_version = <%s>", rw_i93_get_tag_name(p_i93->product_version)); 17985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu#else 180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("product_version = %d", p_i93->product_version); 18185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu#endif 182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_i93->product_version) 184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY: 186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY: 187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* these don't support Get System Information Command */ 188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* these support only Inventory, Stay Quiet, Read Single Block, Write Single Block, Lock Block */ 189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->block_size = I93_TAG_IT_HF_I_STD_PRO_CHIP_INLAY_BLK_SIZE; 190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->num_block = I93_TAG_IT_HF_I_STD_PRO_CHIP_INLAY_NUM_USER_BLK; 191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 19285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu default: 193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 19985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** Function rw_i93_process_sys_info 20085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** 20185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** Description Store system information of tag 20285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** 20385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** Returns FALSE if retrying with protocol extension flag 20485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** 20585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu*******************************************************************************/ 20685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan ChuBOOLEAN rw_i93_process_sys_info (UINT8* p_data) 20785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu{ 20885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT8 *p = p_data; 20985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu tRW_I93_CB *p_i93 = &rw_cb.tcb.i93; 21085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT8 uid[I93_UID_BYTE_LEN], *p_uid; 21185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 21285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu RW_TRACE_DEBUG0 ("rw_i93_process_sys_info ()"); 21385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 21485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu STREAM_TO_UINT8 (p_i93->info_flags, p); 21585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 21685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_uid = uid; 21785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu STREAM_TO_ARRAY8 (p_uid, p); 21885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 21985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (p_i93->info_flags & I93_INFO_FLAG_DSFID) 22085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 22185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu STREAM_TO_UINT8 (p_i93->dsfid, p); 22285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 22385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (p_i93->info_flags & I93_INFO_FLAG_AFI) 22485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 22585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu STREAM_TO_UINT8 (p_i93->afi, p); 22685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 22785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (p_i93->info_flags & I93_INFO_FLAG_MEM_SIZE) 22885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 22985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (p_i93->intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK) 23085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 23185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu STREAM_TO_UINT16 (p_i93->num_block, p); 23285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 23385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else 23485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 23585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu STREAM_TO_UINT8 (p_i93->num_block, p); 23685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 23785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* it is one less than actual number of bytes */ 23885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->num_block += 1; 23985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 24085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu STREAM_TO_UINT8 (p_i93->block_size, p); 24185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* it is one less than actual number of blocks */ 24285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->block_size = (p_i93->block_size & 0x1F) + 1; 24385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 24485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (p_i93->info_flags & I93_INFO_FLAG_IC_REF) 24585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 24685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu STREAM_TO_UINT8 (p_i93->ic_reference, p); 24785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 24885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* clear existing UID to set product version */ 24985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->uid[0] = 0x00; 25085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 25185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* store UID and get product version */ 25285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_i93_get_product_version (p_uid); 25385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 25485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (p_i93->uid[0] == I93_UID_FIRST_BYTE) 25585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 25685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if ( (p_i93->uid[1] == I93_UID_IC_MFG_CODE_NXP) 25785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu &&(p_i93->ic_reference == I93_IC_REF_ICODE_SLI_L) ) 25885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 25985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->num_block = 8; 26085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->block_size = 4; 26185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 26285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else if (p_i93->uid[1] == I93_UID_IC_MFG_CODE_STM) 26385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 26485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* 26585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ** LRI1K: 010000xx(b), blockSize: 4, numberBlocks: 0x20 26685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ** LRI2K: 001000xx(b), blockSize: 4, numberBlocks: 0x40 26785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ** LRIS2K: 001010xx(b), blockSize: 4, numberBlocks: 0x40 26885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ** LRIS64K: 010001xx(b), blockSize: 4, numberBlocks: 0x800 26985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ** M24LR64-R: 001011xx(b), blockSize: 4, numberBlocks: 0x800 27085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ** M24LR04E-R: 01011010(b), blockSize: 4, numberBlocks: 0x80 27185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ** M24LR16E-R: 01001110(b), blockSize: 4, numberBlocks: 0x200 27285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ** M24LR64E-R: 01011110(b), blockSize: 4, numberBlocks: 0x800 27385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu */ 27485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if ( (p_i93->product_version == RW_I93_STM_M24LR16E_R) 27585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ||(p_i93->product_version == RW_I93_STM_M24LR64E_R) ) 27685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 27785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* 27885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ** M24LR16E-R or M24LR64E-R returns system information without memory size, 27985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ** if option flag is not set. 28085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ** LRIS64K and M24LR64-R return error if option flag is not set. 28185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu */ 28285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (!(p_i93->intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK)) 28385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 28485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* get memory size with protocol extension flag */ 28585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (rw_i93_send_cmd_get_sys_info (NULL, I93_FLAG_PROT_EXT_YES) == NFC_STATUS_OK) 28685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 28785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* STM supports more than 2040 bytes */ 28885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->intl_flags |= RW_I93_FLAG_16BIT_NUM_BLOCK; 28985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 29085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return FALSE; 29185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 29285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 29385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return TRUE; 29485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 29585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else if ( (p_i93->product_version == RW_I93_STM_LRI2K) 29685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu &&(p_i93->ic_reference == 0x21) ) 29785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 29885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* workaround of byte order in memory size information */ 29985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->num_block = 64; 30085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->block_size = 4; 30185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 30285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 30385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 30485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 30585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 30685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return TRUE; 30785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu} 30885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 30985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu/******************************************************************************* 31085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** 31185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** Function rw_i93_check_sys_info_prot_ext 31285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** 31385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** Description Check if need to set protocol extension flag to get system info 31485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** 31585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** Returns TRUE if sent Get System Info with protocol extension flag 31685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** 31785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu*******************************************************************************/ 31885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan ChuBOOLEAN rw_i93_check_sys_info_prot_ext (UINT8 error_code) 31985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu{ 32085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu tRW_I93_CB *p_i93 = &rw_cb.tcb.i93; 32185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 32285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu RW_TRACE_DEBUG0 ("rw_i93_check_sys_info_prot_ext ()"); 32385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 32485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if ( (p_i93->uid[1] == I93_UID_IC_MFG_CODE_STM) 32585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu &&(p_i93->sent_cmd == I93_CMD_GET_SYS_INFO) 32685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu &&(error_code == I93_ERROR_CODE_OPTION_NOT_SUPPORTED) 32785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu &&(rw_i93_send_cmd_get_sys_info (NULL, I93_FLAG_PROT_EXT_YES) == NFC_STATUS_OK) ) 32885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 32985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return TRUE; 33085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 33185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else 33285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 33385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return FALSE; 33485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 33585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu} 33685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 33785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu/******************************************************************************* 33885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** 339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_send_to_upper 340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send response to upper layer 342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_i93_send_to_upper (BT_HDR *p_resp) 347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p = (UINT8 *) (p_resp + 1) + p_resp->offset, *p_uid; 349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 length = p_resp->len; 350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_I93_CB *p_i93 = &rw_cb.tcb.i93; 351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA rw_data; 352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 event = RW_I93_MAX_EVT; 353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 flags; 354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_buff; 355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_i93_send_to_upper ()"); 357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project STREAM_TO_UINT8 (flags, p); 359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length--; 360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (flags & I93_FLAG_ERROR_DETECTED) 362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 36385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if ((length) && (rw_i93_check_sys_info_prot_ext(*p))) 36485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 36585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* getting system info with protocol extension flag */ 36685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* This STM tag supports more than 2040 bytes */ 36785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->intl_flags |= RW_I93_FLAG_16BIT_NUM_BLOCK; 36885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->state = RW_I93_STATE_BUSY; 36985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 37085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else 37185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 37285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* notify error to upper layer */ 37385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_data.i93_cmd_cmpl.status = NFC_STATUS_FAILED; 37485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_data.i93_cmd_cmpl.command = p_i93->sent_cmd; 37585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu STREAM_TO_UINT8 (rw_data.i93_cmd_cmpl.error_code, p); 376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 37785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_cb.tcb.i93.sent_cmd = 0; 37885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu (*(rw_cb.p_cback)) (RW_I93_CMD_CMPL_EVT, &rw_data); 37985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_i93->sent_cmd) 384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case I93_CMD_INVENTORY: 386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* forward inventory response */ 388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.i93_inventory.status = NFC_STATUS_OK; 389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project STREAM_TO_UINT8 (rw_data.i93_inventory.dsfid, p); 390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_uid = rw_data.i93_inventory.uid; 392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project STREAM_TO_ARRAY8 (p_uid, p); 393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* store UID and get product version */ 395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_get_product_version (p_uid); 396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project event = RW_I93_INVENTORY_EVT; 398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case I93_CMD_READ_SINGLE_BLOCK: 401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case I93_CMD_READ_MULTI_BLOCK: 402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case I93_CMD_GET_MULTI_BLK_SEC: 403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* forward tag data or security status */ 405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_buff = (BT_HDR*) GKI_getbuf ((UINT16) (length + BT_HDR_SIZE)); 406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_buff) 408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_buff->offset = 0; 410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_buff->len = length; 411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy ((p_buff + 1), p, length); 413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.i93_data.status = NFC_STATUS_OK; 415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.i93_data.command = p_i93->sent_cmd; 416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.i93_data.p_data = p_buff; 417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project event = RW_I93_DATA_EVT; 419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.i93_cmd_cmpl.status = NFC_STATUS_NO_BUFFERS; 423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.i93_cmd_cmpl.command = p_i93->sent_cmd; 424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.i93_cmd_cmpl.error_code = 0; 425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project event = RW_I93_CMD_CMPL_EVT; 427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case I93_CMD_WRITE_SINGLE_BLOCK: 431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case I93_CMD_LOCK_BLOCK: 432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case I93_CMD_WRITE_MULTI_BLOCK: 433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case I93_CMD_SELECT: 434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case I93_CMD_RESET_TO_READY: 435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case I93_CMD_WRITE_AFI: 436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case I93_CMD_LOCK_AFI: 437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case I93_CMD_WRITE_DSFID: 438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case I93_CMD_LOCK_DSFID: 439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* notify the complete of command */ 441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.i93_cmd_cmpl.status = NFC_STATUS_OK; 442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.i93_cmd_cmpl.command = p_i93->sent_cmd; 443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.i93_cmd_cmpl.error_code = 0; 444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project event = RW_I93_CMD_CMPL_EVT; 446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case I93_CMD_GET_SYS_INFO: 449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 45085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (rw_i93_process_sys_info (p)) 451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 45285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_data.i93_sys_info.status = NFC_STATUS_OK; 45385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_data.i93_sys_info.info_flags = p_i93->info_flags; 45485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_data.i93_sys_info.dsfid = p_i93->dsfid; 45585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_data.i93_sys_info.afi = p_i93->afi; 45685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_data.i93_sys_info.num_block = p_i93->num_block; 45785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_data.i93_sys_info.block_size = p_i93->block_size; 45885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_data.i93_sys_info.IC_reference = p_i93->ic_reference; 459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 46085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu memcpy (rw_data.i93_sys_info.uid, p_i93->uid, I93_UID_BYTE_LEN); 461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 46285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu event = RW_I93_SYS_INFO_EVT; 463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 46485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else 465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 46685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* retrying with protocol extension flag */ 46785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->state = RW_I93_STATE_BUSY; 46885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return; 469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.sent_cmd = 0; 477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (event != RW_I93_MAX_EVT) 478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (event, &rw_data); 480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_i93_send_to_upper (): Invalid response"); 484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_send_to_lower 490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send Request frame to lower layer 492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if success 494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN rw_i93_send_to_lower (BT_HDR *p_msg) 497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE) 499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project DispRWI93Tag (p_msg, FALSE, 0x00); 500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 50285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* store command for retransmitting */ 50385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (rw_cb.tcb.i93.p_retry_cmd) 50485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 50585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu GKI_freebuf (rw_cb.tcb.i93.p_retry_cmd); 50685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_cb.tcb.i93.p_retry_cmd = NULL; 50785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 50885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 50985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_cb.tcb.i93.p_retry_cmd = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 51085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 51185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (rw_cb.tcb.i93.p_retry_cmd) 51285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 51385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu memcpy (rw_cb.tcb.i93.p_retry_cmd, p_msg, sizeof (BT_HDR) + p_msg->offset + p_msg->len); 51485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 51585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (NFC_SendData (NFC_RF_CONN_ID, p_msg) != NFC_STATUS_OK) 517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_i93_send_to_lower (): NFC_SendData () failed"); 519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_start_quick_timer (&rw_cb.tcb.i93.timer, NFC_TTYPE_RW_I93_RESPONSE, 523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (RW_I93_TOUT_RESP*QUICK_TIMER_TICKS_PER_SEC)/1000); 524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_send_cmd_inventory 531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send Inventory Request to VICC 533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 5375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn CoenentNFC_STATUS rw_i93_send_cmd_inventory (UINT8 *p_uid, BOOLEAN including_afi, UINT8 afi) 538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd; 5405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 *p, flags; 541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_TRACE_DEBUG2 ("rw_i93_send_cmd_inventory () including_afi:%d, AFI:0x%02X", including_afi, afi); 543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_cmd) 547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_i93_send_cmd_inventory (): Cannot allocate buffer"); 549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_NO_BUFFERS; 550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 553bf6bb391ed16bde3c9512fc69ab28b2d7060954bMartijn Coenen p_cmd->len = 3; 554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_cmd + 1) + p_cmd->offset; 555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Flags */ 5575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen flags = (I93_FLAG_SLOT_ONE | I93_FLAG_INVENTORY_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE); 5585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (including_afi) 5595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 5605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen flags |= I93_FLAG_AFI_PRESENT; 5615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 5625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 5635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8_TO_STREAM (p, flags); 564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Command Code */ 566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, I93_CMD_INVENTORY); 567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (including_afi) 5695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 5705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Parameters */ 5715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8_TO_STREAM (p, afi); /* Optional AFI */ 5725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cmd->len++; 5735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 5745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_uid) 576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, I93_UID_BYTE_LEN*8); /* Mask Length */ 578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY8_TO_STREAM (p, p_uid); /* UID */ 579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->len += I93_UID_BYTE_LEN; 580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, 0x00); /* Mask Length */ 584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_to_lower (p_cmd)) 587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.sent_cmd = I93_CMD_INVENTORY; 589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_send_cmd_stay_quiet 600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send Stay Quiet Request to VICC 602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_i93_send_cmd_stay_quiet (void) 607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd; 609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_i93_send_cmd_stay_quiet ()"); 612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_cmd) 616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_i93_send_cmd_stay_quiet (): Cannot allocate buffer"); 618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_NO_BUFFERS; 619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->len = 10; 623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_cmd + 1) + p_cmd->offset; 624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Flags */ 626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE)); 627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Command Code */ 629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, I93_CMD_STAY_QUIET); 630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Parameters */ 632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY8_TO_STREAM (p, rw_cb.tcb.i93.uid); /* UID */ 633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_to_lower (p_cmd)) 635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.sent_cmd = I93_CMD_STAY_QUIET; 637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* restart timer for stay quiet */ 639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_start_quick_timer (&rw_cb.tcb.i93.timer, NFC_TTYPE_RW_I93_RESPONSE, 640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (RW_I93_TOUT_STAY_QUIET * QUICK_TIMER_TICKS_PER_SEC) / 1000); 641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_send_cmd_read_single_block 652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send Read Single Block Request to VICC 654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 65885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan ChutNFC_STATUS rw_i93_send_cmd_read_single_block (UINT16 block_number, BOOLEAN read_security) 659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd; 66185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT8 *p, flags; 662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_i93_send_cmd_read_single_block ()"); 664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_cmd) 668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_i93_send_cmd_read_single_block (): Cannot allocate buffer"); 670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_NO_BUFFERS; 671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->len = 11; 675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_cmd + 1) + p_cmd->offset; 676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Flags */ 67885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu flags = (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE); 67985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (read_security) 68185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu flags |= I93_FLAG_OPTION_SET; 68285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 68385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK) 68485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu flags |= I93_FLAG_PROT_EXT_YES; 68585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 68685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT8_TO_STREAM (p, flags); 687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Command Code */ 689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, I93_CMD_READ_SINGLE_BLOCK); 690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Parameters */ 692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY8_TO_STREAM (p, rw_cb.tcb.i93.uid); /* UID */ 69385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 69485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK) 69585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 69685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT16_TO_STREAM (p, block_number); /* Block number */ 69785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_cmd->len++; 69885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 69985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else 70085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 70185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT8_TO_STREAM (p, block_number); /* Block number */ 70285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_to_lower (p_cmd)) 705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.sent_cmd = I93_CMD_READ_SINGLE_BLOCK; 707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_send_cmd_write_single_block 718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send Write Single Block Request to VICC 720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 72485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan ChutNFC_STATUS rw_i93_send_cmd_write_single_block (UINT16 block_number, UINT8 *p_data) 725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd; 72785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT8 *p, flags; 728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_i93_send_cmd_write_single_block ()"); 730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_cmd) 734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_i93_send_cmd_write_single_block (): Cannot allocate buffer"); 736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_NO_BUFFERS; 737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->len = 11 + rw_cb.tcb.i93.block_size; 741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_cmd + 1) + p_cmd->offset; 742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Flags */ 744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_PLUS_INLAY) 745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_PLUS_CHIP) 746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) 747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY) ) 748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Option must be set for TI tag */ 75085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu flags = (I93_FLAG_ADDRESS_SET | I93_FLAG_OPTION_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE); 751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 75485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu flags = (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE); 755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 75785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK) 75885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu flags |= I93_FLAG_PROT_EXT_YES; 75985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 76085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT8_TO_STREAM (p, flags); 76185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Command Code */ 763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, I93_CMD_WRITE_SINGLE_BLOCK); 764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Parameters */ 766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY8_TO_STREAM (p, rw_cb.tcb.i93.uid); /* UID */ 76785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 76885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK) 76985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 77085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT16_TO_STREAM (p, block_number); /* Block number */ 77185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_cmd->len++; 77285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 77385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else 77485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 77585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT8_TO_STREAM (p, block_number); /* Block number */ 77685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 77785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Data */ 780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY_TO_STREAM (p, p_data, rw_cb.tcb.i93.block_size); 781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_to_lower (p_cmd)) 783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.sent_cmd = I93_CMD_WRITE_SINGLE_BLOCK; 785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_send_cmd_lock_block 796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send Lock Block Request to VICC 798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 79985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** STM LRIS64K, M24LR64-R, M24LR04E-R, M24LR16E-R, M24LR64E-R 80085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** do not support. 80185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** 802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_i93_send_cmd_lock_block (UINT8 block_number) 806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd; 808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_i93_send_cmd_lock_block ()"); 811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_cmd) 815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_i93_send_cmd_lock_block (): Cannot allocate buffer"); 817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_NO_BUFFERS; 818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->len = 11; 822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_cmd + 1) + p_cmd->offset; 823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Flags */ 825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_PLUS_INLAY) 826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_PLUS_CHIP) 827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) 828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY) ) 829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Option must be set for TI tag */ 831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, (I93_FLAG_ADDRESS_SET | I93_FLAG_OPTION_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE)); 832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE)); 836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Command Code */ 839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, I93_CMD_LOCK_BLOCK); 840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Parameters */ 842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY8_TO_STREAM (p, rw_cb.tcb.i93.uid); /* UID */ 843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, block_number); /* Block number */ 844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_to_lower (p_cmd)) 846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.sent_cmd = I93_CMD_LOCK_BLOCK; 848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_send_cmd_read_multi_blocks 859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send Read Multiple Blocks Request to VICC 861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 86585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan ChutNFC_STATUS rw_i93_send_cmd_read_multi_blocks (UINT16 first_block_number, UINT16 number_blocks) 866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd; 86885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT8 *p, flags; 869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_i93_send_cmd_read_multi_blocks ()"); 871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_cmd) 875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_i93_send_cmd_read_multi_blocks (): Cannot allocate buffer"); 877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_NO_BUFFERS; 878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->len = 12; 882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_cmd + 1) + p_cmd->offset; 883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Flags */ 88585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu flags = (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE); 88685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 88785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK) 88885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu flags |= I93_FLAG_PROT_EXT_YES; 88985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 89085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT8_TO_STREAM (p, flags); 891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Command Code */ 893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, I93_CMD_READ_MULTI_BLOCK); 894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Parameters */ 896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY8_TO_STREAM (p, rw_cb.tcb.i93.uid); /* UID */ 89785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 89885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK) 89985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 90085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT16_TO_STREAM (p, first_block_number); /* First block number */ 90185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_cmd->len++; 90285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 90385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else 90485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 90585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT8_TO_STREAM (p, first_block_number); /* First block number */ 90685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 90785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, number_blocks - 1); /* Number of blocks, 0x00 to read one block */ 909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_to_lower (p_cmd)) 911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.sent_cmd = I93_CMD_READ_MULTI_BLOCK; 913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_send_cmd_write_multi_blocks 924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send Write Multiple Blocks Request to VICC 926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_i93_send_cmd_write_multi_blocks (UINT8 first_block_number, 931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 number_blocks, 932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_data) 933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd; 935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_i93_send_cmd_write_multi_blocks ()"); 938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_cmd) 942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_i93_send_cmd_write_multi_blocks (): Cannot allocate buffer"); 944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_NO_BUFFERS; 945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->len = 12 + number_blocks * rw_cb.tcb.i93.block_size; 949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_cmd + 1) + p_cmd->offset; 950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Flags */ 952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE)); 953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Command Code */ 955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, I93_CMD_WRITE_MULTI_BLOCK); 956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Parameters */ 958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY8_TO_STREAM (p, rw_cb.tcb.i93.uid); /* UID */ 959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, first_block_number); /* First block number */ 960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, number_blocks - 1); /* Number of blocks, 0x00 to read one block */ 961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Data */ 963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY_TO_STREAM (p, p_data, number_blocks * rw_cb.tcb.i93.block_size); 964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_to_lower (p_cmd)) 966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.sent_cmd = I93_CMD_WRITE_MULTI_BLOCK; 968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_send_cmd_select 979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send Select Request to VICC 981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_i93_send_cmd_select (UINT8 *p_uid) 986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd; 988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_i93_send_cmd_select ()"); 991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_cmd) 995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_i93_send_cmd_select (): Cannot allocate buffer"); 997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_NO_BUFFERS; 998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 1001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->len = 10 ; 1002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_cmd + 1) + p_cmd->offset; 1003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Flags */ 1005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE)); 1006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Command Code */ 1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, I93_CMD_SELECT); 1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Parameters */ 1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY8_TO_STREAM (p, p_uid); /* UID */ 1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_to_lower (p_cmd)) 1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.sent_cmd = I93_CMD_SELECT; 1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 1021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_send_cmd_reset_to_ready 1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send Reset to Ready Request to VICC 1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_i93_send_cmd_reset_to_ready (void) 1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd; 1036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 1037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_i93_send_cmd_reset_to_ready ()"); 1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 1041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_cmd) 1043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_i93_send_cmd_reset_to_ready (): Cannot allocate buffer"); 1045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_NO_BUFFERS; 1046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 1049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->len = 10 ; 1050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_cmd + 1) + p_cmd->offset; 1051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Flags */ 1053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE)); 1054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Command Code */ 1056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, I93_CMD_RESET_TO_READY); 1057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Parameters */ 1059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY8_TO_STREAM (p, rw_cb.tcb.i93.uid); /* UID */ 1060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_to_lower (p_cmd)) 1062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.sent_cmd = I93_CMD_RESET_TO_READY; 1064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 1065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_send_cmd_write_afi 1075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send Write AFI Request to VICC 1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_i93_send_cmd_write_afi (UINT8 afi) 1082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd; 1084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_i93_send_cmd_write_afi ()"); 1087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 1089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_cmd) 1091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_i93_send_cmd_write_afi (): Cannot allocate buffer"); 1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_NO_BUFFERS; 1094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->len = 11; 1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_cmd + 1) + p_cmd->offset; 1099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Flags */ 1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE)); 1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Command Code */ 1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, I93_CMD_WRITE_AFI); 1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Parameters */ 1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY8_TO_STREAM (p, rw_cb.tcb.i93.uid); /* UID */ 1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, afi); /* AFI */ 1109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_to_lower (p_cmd)) 1111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.sent_cmd = I93_CMD_WRITE_AFI; 1113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 1114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 1118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_send_cmd_lock_afi 1124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send Lock AFI Request to VICC 1126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_i93_send_cmd_lock_afi (void) 1131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd; 1133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 1134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_i93_send_cmd_lock_afi ()"); 1136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 1138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_cmd) 1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_i93_send_cmd_lock_afi (): Cannot allocate buffer"); 1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_NO_BUFFERS; 1143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 1146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->len = 10; 1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_cmd + 1) + p_cmd->offset; 1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Flags */ 1150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE)); 1151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Command Code */ 1153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, I93_CMD_LOCK_AFI); 1154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Parameters */ 1156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY8_TO_STREAM (p, rw_cb.tcb.i93.uid); /* UID */ 1157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_to_lower (p_cmd)) 1159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.sent_cmd = I93_CMD_LOCK_AFI; 1161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 1162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 1166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_send_cmd_write_dsfid 1172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send Write DSFID Request to VICC 1174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_i93_send_cmd_write_dsfid (UINT8 dsfid) 1179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd; 1181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 1182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_i93_send_cmd_write_dsfid ()"); 1184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 1186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_cmd) 1188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_i93_send_cmd_write_dsfid (): Cannot allocate buffer"); 1190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_NO_BUFFERS; 1191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 1194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->len = 11; 1195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_cmd + 1) + p_cmd->offset; 1196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Flags */ 1198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE)); 1199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Command Code */ 1201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, I93_CMD_WRITE_DSFID); 1202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Parameters */ 1204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY8_TO_STREAM (p, rw_cb.tcb.i93.uid); /* UID */ 1205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, dsfid); /* DSFID */ 1206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_to_lower (p_cmd)) 1208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.sent_cmd = I93_CMD_WRITE_DSFID; 1210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 1211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 1215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_send_cmd_lock_dsfid 1221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send Lock DSFID Request to VICC 1223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_i93_send_cmd_lock_dsfid (void) 1228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd; 1230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 1231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_i93_send_cmd_lock_dsfid ()"); 1233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 1235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_cmd) 1237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_i93_send_cmd_lock_dsfid (): Cannot allocate buffer"); 1239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_NO_BUFFERS; 1240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 1243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->len = 10; 1244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_cmd + 1) + p_cmd->offset; 1245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Flags */ 1247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE)); 1248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Command Code */ 1250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, I93_CMD_LOCK_DSFID); 1251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Parameters */ 1253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY8_TO_STREAM (p, rw_cb.tcb.i93.uid); /* UID */ 1254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_to_lower (p_cmd)) 1256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.sent_cmd = I93_CMD_LOCK_DSFID; 1258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 1259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 1263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_send_cmd_get_sys_info 1269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send Get System Information Request to VICC 1271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 127585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan ChutNFC_STATUS rw_i93_send_cmd_get_sys_info (UINT8 *p_uid, UINT8 extra_flags) 1276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd; 1278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 1279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_i93_send_cmd_get_sys_info ()"); 1281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 1283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_cmd) 1285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_i93_send_cmd_get_sys_info (): Cannot allocate buffer"); 1287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_NO_BUFFERS; 1288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 1291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->len = 10; 1292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_cmd + 1) + p_cmd->offset; 1293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Flags */ 129585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT8_TO_STREAM (p, (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE | extra_flags)); 1296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Command Code */ 1298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, I93_CMD_GET_SYS_INFO); 1299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Parameters */ 1301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_uid) 1302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY8_TO_STREAM (p, p_uid); /* UID */ 1304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY8_TO_STREAM (p, rw_cb.tcb.i93.uid); /* UID */ 1308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_to_lower (p_cmd)) 1311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.sent_cmd = I93_CMD_GET_SYS_INFO; 1313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 1314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 1318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_send_cmd_get_multi_block_sec 1324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send Get Multiple Block Security Status Request to VICC 1326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 133085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan ChutNFC_STATUS rw_i93_send_cmd_get_multi_block_sec (UINT16 first_block_number, 1331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 number_blocks) 1332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd; 133485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT8 *p, flags; 1335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_i93_send_cmd_get_multi_block_sec ()"); 1337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 1339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_cmd) 1341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_i93_send_cmd_get_multi_block_sec (): Cannot allocate buffer"); 1343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_NO_BUFFERS; 1344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 1347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd->len = 12; 1348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_cmd + 1) + p_cmd->offset; 1349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Flags */ 135185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu flags = (I93_FLAG_ADDRESS_SET | RW_I93_FLAG_SUB_CARRIER | RW_I93_FLAG_DATA_RATE); 135285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 135385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK) 135485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu flags |= I93_FLAG_PROT_EXT_YES; 135585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 135685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT8_TO_STREAM (p, flags); 1357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Command Code */ 1359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, I93_CMD_GET_MULTI_BLK_SEC); 1360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Parameters */ 1362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY8_TO_STREAM (p, rw_cb.tcb.i93.uid); /* UID */ 136385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 136485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_16BIT_NUM_BLOCK) 136585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 136685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT16_TO_STREAM (p, first_block_number); /* First block number */ 136785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT16_TO_STREAM (p, number_blocks - 1); /* Number of blocks, 0x00 to read one block */ 136885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_cmd->len += 2; 136985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 137085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else 137185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 137285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT8_TO_STREAM (p, first_block_number); /* First block number */ 137385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT8_TO_STREAM (p, number_blocks - 1); /* Number of blocks, 0x00 to read one block */ 137485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 1375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_to_lower (p_cmd)) 1377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.sent_cmd = I93_CMD_GET_MULTI_BLK_SEC; 1379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 1380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 1384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_get_next_blocks 1390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Read as many blocks as possible (up to RW_I93_READ_MULTI_BLOCK_SIZE) 1392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_i93_get_next_blocks (UINT16 offset) 1397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_I93_CB *p_i93 = &rw_cb.tcb.i93; 139985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT16 first_block; 1400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 num_block; 1401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 140285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu RW_TRACE_DEBUG0 ("rw_i93_get_next_blocks ()"); 140385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 140485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu first_block = offset / p_i93->block_size; 1405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* more blocks, more efficent but more error rate */ 1407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->intl_flags & RW_I93_FLAG_READ_MULTI_BLOCK) 1409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_block = RW_I93_READ_MULTI_BLOCK_SIZE / p_i93->block_size; 1411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (num_block + first_block > p_i93->num_block) 1413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_block = p_i93->num_block - first_block; 1414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 141585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (p_i93->uid[1] == I93_UID_IC_MFG_CODE_STM) 141685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 141785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* LRIS64K, M24LR64-R, M24LR04E-R, M24LR16E-R, M24LR64E-R requires 141885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ** The max number of blocks is 32 and they are all located in the same sector. 141985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ** The sector is 32 blocks of 4 bytes. 142085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu */ 142185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if ( (p_i93->product_version == RW_I93_STM_LRIS64K) 142285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ||(p_i93->product_version == RW_I93_STM_M24LR64_R) 142385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ||(p_i93->product_version == RW_I93_STM_M24LR04E_R) 142485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ||(p_i93->product_version == RW_I93_STM_M24LR16E_R) 142585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ||(p_i93->product_version == RW_I93_STM_M24LR64E_R) ) 142685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 142785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (num_block > I93_STM_MAX_BLOCKS_PER_READ) 142885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu num_block = I93_STM_MAX_BLOCKS_PER_READ; 142985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 143085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if ((first_block / I93_STM_BLOCKS_PER_SECTOR) 143185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu != ((first_block + num_block - 1) / I93_STM_BLOCKS_PER_SECTOR)) 143285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 143385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu num_block = I93_STM_BLOCKS_PER_SECTOR - (first_block % I93_STM_BLOCKS_PER_SECTOR); 143485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 143585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 143685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 143785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 1438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return rw_i93_send_cmd_read_multi_blocks (first_block, num_block); 1439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return rw_i93_send_cmd_read_single_block (first_block, FALSE); 1443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 144885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** Function rw_i93_get_next_block_sec 144985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** 145085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** Description Get as many security of blocks as possible from p_i93->rw_offset 145185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** (up to RW_I93_GET_MULTI_BLOCK_SEC_SIZE) 145285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** 145385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** Returns tNFC_STATUS 145485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** 145585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu*******************************************************************************/ 145685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan ChutNFC_STATUS rw_i93_get_next_block_sec (void) 145785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu{ 145885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu tRW_I93_CB *p_i93 = &rw_cb.tcb.i93; 145985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT16 num_blocks; 146085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 146185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu RW_TRACE_DEBUG0 ("rw_i93_get_next_block_sec ()"); 146285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 146385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (p_i93->num_block <= p_i93->rw_offset) 146485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 146585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu RW_TRACE_ERROR2 ("rw_offset(0x%x) must be less than num_block(0x%x)", 146685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->rw_offset, p_i93->num_block); 146785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return NFC_STATUS_FAILED; 146885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 146985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 147085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu num_blocks = p_i93->num_block - p_i93->rw_offset; 147185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 147285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (num_blocks > RW_I93_GET_MULTI_BLOCK_SEC_SIZE) 147385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu num_blocks = RW_I93_GET_MULTI_BLOCK_SEC_SIZE; 147485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 147585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return rw_i93_send_cmd_get_multi_block_sec (p_i93->rw_offset, num_blocks); 147685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu} 147785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 147885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu/******************************************************************************* 147985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** 1480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_sm_detect_ndef 1481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process NDEF detection procedure 1483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1. Get UID if not having yet 1485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2. Get System Info if not having yet 1486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3. Read first block for CC 1487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4. Search NDEF Type and length 1488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 5. Get block status to get max NDEF size and read-only status 1489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 1491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_i93_sm_detect_ndef (BT_HDR *p_resp) 1494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p = (UINT8 *) (p_resp + 1) + p_resp->offset, *p_uid; 149685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT8 flags, u8 = 0, cc[4]; 149785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT16 length = p_resp->len, xx, block, first_block, last_block, num_blocks; 1498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_I93_CB *p_i93 = &rw_cb.tcb.i93; 1499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA rw_data; 1500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status = NFC_STATUS_FAILED; 1501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 1503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG2 ("rw_i93_sm_detect_ndef () sub_state:%s (0x%x)", 1504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_get_sub_state_name (p_i93->sub_state), p_i93->sub_state); 1505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else 1506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("rw_i93_sm_detect_ndef () sub_state:0x%x", p_i93->sub_state); 1507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 1508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project STREAM_TO_UINT8 (flags, p); 1510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length--; 1511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (flags & I93_FLAG_ERROR_DETECTED) 1513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 151485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if ((length) && (rw_i93_check_sys_info_prot_ext(*p))) 151585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 151685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* getting system info with protocol extension flag */ 151785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* This STM tag supports more than 2040 bytes */ 151885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->intl_flags |= RW_I93_FLAG_16BIT_NUM_BLOCK; 151985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 152085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else 152185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 152285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu RW_TRACE_DEBUG1 ("Got error flags (0x%02x)", flags); 152385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_i93_handle_error (NFC_STATUS_FAILED); 152485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 1525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 1526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_i93->sub_state) 1529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_WAIT_UID: 1531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project STREAM_TO_UINT8 (u8, p); /* DSFID */ 1533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_uid = p_i93->uid; 1534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project STREAM_TO_ARRAY8 (p_uid, p); 1535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (u8 != I93_DFS_UNSUPPORTED) 1537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if Data Storage Format is unknown */ 1539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("Got unknown DSFID (0x%02x)", u8); 1540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 1541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* get system information to get memory size */ 154585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (rw_i93_send_cmd_get_sys_info (NULL, I93_FLAG_PROT_EXT_NO) == NFC_STATUS_OK) 1546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sub_state = RW_I93_SUBSTATE_WAIT_SYS_INFO; 1548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 1552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_WAIT_SYS_INFO: 1557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 155885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->block_size = 0; 155985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->num_block = 0; 1560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 156185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (!rw_i93_process_sys_info (p)) 1562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 156385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* retrying with protocol extension flag */ 156485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu break; 1565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 156785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if ((p_i93->block_size == 0)||(p_i93->num_block == 0)) 1568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("Unable to get tag memory size"); 1570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (status); 1571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* read CC in the first block */ 157585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (rw_i93_send_cmd_read_single_block (0x0000, FALSE) == NFC_STATUS_OK) 1576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sub_state = RW_I93_SUBSTATE_WAIT_CC; 1578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 1582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_WAIT_CC: 1587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* assume block size is more than 4 */ 1589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project STREAM_TO_ARRAY (cc, p, 4); 1590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = NFC_STATUS_FAILED; 1592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* 1594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Capability Container (CC) 1595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** 1596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** CC[0] : magic number (0xE1) 1597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** CC[1] : Bit 7-6:Major version number 1598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** : Bit 5-4:Minor version number 1599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** : Bit 3-2:Read access condition (00b: read access granted without any security) 1600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** : Bit 1-0:Write access condition (00b: write access granted without any security) 160185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ** CC[2] : Memory size in 8 bytes (Ex. 0x04 is 32 bytes) [STM, set to 0xFF if more than 2040bytes] 160285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ** CC[3] : Bit 0:Read multiple blocks is supported [NXP, STM] 160385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ** : Bit 1:Inventory page read is supported [NXP] 160485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ** : Bit 2:More than 2040 bytes are supported [STM] 1605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project */ 1606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG4 ("rw_i93_sm_detect_ndef (): cc: 0x%02X 0x%02X 0x%02X 0x%02X", cc[0], cc[1], cc[2], cc[3]); 1608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG2 ("rw_i93_sm_detect_ndef (): Total blocks:0x%04X, Block size:0x%02X", p_i93->num_block, p_i93->block_size ); 1609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (cc[0] == I93_ICODE_CC_MAGIC_NUMER) 161185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu &&( (cc[3] & I93_STM_CC_OVERFLOW_MASK) 161285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ||(cc[2] * 8) == (p_i93->num_block * p_i93->block_size) ) ) 1613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((cc[1] & I93_ICODE_CC_READ_ACCESS_MASK) == I93_ICODE_CC_READ_ACCESS_GRANTED) 1615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((cc[1] & I93_ICODE_CC_WRITE_ACCESS_MASK) != I93_ICODE_CC_WRITE_ACCESS_GRANTED) 1617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* read-only or password required to write */ 1619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->intl_flags |= RW_I93_FLAG_READ_ONLY; 1620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (cc[3] & I93_ICODE_CC_MBREAD_MASK) 1622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* tag supports read multi blocks command */ 1624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->intl_flags |= RW_I93_FLAG_READ_MULTI_BLOCK; 1625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = NFC_STATUS_OK; 1627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 1631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* seach NDEF TLV from offset 4 */ 1633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_offset = 4; 1634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_get_next_blocks (p_i93->rw_offset) == NFC_STATUS_OK) 1636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sub_state = RW_I93_SUBSTATE_SEARCH_NDEF_TLV; 1638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->tlv_detect_state = RW_I93_TLV_DETECT_STATE_TYPE; 1639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 1643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 1648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_SEARCH_NDEF_TLV: 1652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* search TLV within read blocks */ 165485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu for (xx = 0; xx < length; xx++) 1655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if looking for type */ 1657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->tlv_detect_state == RW_I93_TLV_DETECT_STATE_TYPE) 1658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 165985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (*(p + xx) == I93_ICODE_TLV_TYPE_NULL) 1660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project continue; 1662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 166385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else if ( (*(p + xx) == I93_ICODE_TLV_TYPE_NDEF) 166485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu ||(*(p + xx) == I93_ICODE_TLV_TYPE_PROP) ) 1665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* store found type and get length field */ 166785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->tlv_type = *(p + xx); 166885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->ndef_tlv_start_offset = p_i93->rw_offset + xx; 1669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->tlv_detect_state = RW_I93_TLV_DETECT_STATE_LENGTH_1; 1671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 167285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else if (*(p + xx) == I93_ICODE_TLV_TYPE_TERM) 1673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* no NDEF TLV found */ 1675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->tlv_type = I93_ICODE_TLV_TYPE_TERM; 1676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 168085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu RW_TRACE_DEBUG1 ("Invalid type: 0x%02x", *(p + xx)); 1681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 1682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 1683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_i93->tlv_detect_state == RW_I93_TLV_DETECT_STATE_LENGTH_1) 1686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if 3 bytes length field */ 168885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (*(p + xx) == 0xFF) 1689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* need 2 more bytes for length field */ 1691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->tlv_detect_state = RW_I93_TLV_DETECT_STATE_LENGTH_2; 1692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 169585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->tlv_length = *(p + xx); 1696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->tlv_detect_state = RW_I93_TLV_DETECT_STATE_VALUE; 1697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->tlv_type == I93_ICODE_TLV_TYPE_NDEF) 1699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->ndef_tlv_last_offset = p_i93->ndef_tlv_start_offset + 1 + p_i93->tlv_length; 1701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_i93->tlv_detect_state == RW_I93_TLV_DETECT_STATE_LENGTH_2) 1706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* the second byte of 3 bytes length field */ 170885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->tlv_length = *(p + xx); 1709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->tlv_detect_state = RW_I93_TLV_DETECT_STATE_LENGTH_3; 1710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_i93->tlv_detect_state == RW_I93_TLV_DETECT_STATE_LENGTH_3) 1712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* the last byte of 3 bytes length field */ 171485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->tlv_length = (p_i93->tlv_length << 8) + *(p + xx); 1715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->tlv_detect_state = RW_I93_TLV_DETECT_STATE_VALUE; 1716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->tlv_type == I93_ICODE_TLV_TYPE_NDEF) 1718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->ndef_tlv_last_offset = p_i93->ndef_tlv_start_offset + 3 + p_i93->tlv_length; 1720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_i93->tlv_detect_state == RW_I93_TLV_DETECT_STATE_VALUE) 1724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* this is other than NDEF TLV */ 172685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (p_i93->tlv_length <= length - xx) 1727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* skip value field */ 172985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu xx += (UINT8)p_i93->tlv_length; 1730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->tlv_detect_state = RW_I93_TLV_DETECT_STATE_TYPE; 1731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* read more data */ 173585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->tlv_length -= (length - xx); 1736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* found NDEF TLV and read length field */ 1742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_i93->tlv_type == I93_ICODE_TLV_TYPE_NDEF) 1743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_i93->tlv_detect_state == RW_I93_TLV_DETECT_STATE_VALUE) ) 1744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->ndef_length = p_i93->tlv_length; 1746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* get lock status to see if read-only */ 1748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_i93->product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) 1749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_i93->product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY) 1750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||((p_i93->uid[1] == I93_UID_IC_MFG_CODE_NXP) && (p_i93->ic_reference & I93_ICODE_IC_REF_MBREAD_MASK)) ) 1751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* these doesn't support GetMultiBlockSecurityStatus */ 1753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_offset = p_i93->ndef_tlv_start_offset; 175585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu first_block = p_i93->ndef_tlv_start_offset / p_i93->block_size; 1756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* read block to get lock status */ 1758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_send_cmd_read_single_block (first_block, TRUE); 1759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sub_state = RW_I93_SUBSTATE_CHECK_LOCK_STATUS; 1760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 176385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* block offset for read-only check */ 176485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->rw_offset = 0; 176585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 176685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (rw_i93_get_next_block_sec () == NFC_STATUS_OK) 1767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sub_state = RW_I93_SUBSTATE_CHECK_LOCK_STATUS; 1769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 1773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* read more data */ 1779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_offset += length; 1780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->rw_offset >= p_i93->block_size * p_i93->num_block) 1782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 1784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (rw_i93_get_next_blocks (p_i93->rw_offset) == NFC_STATUS_OK) 1786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sub_state = RW_I93_SUBSTATE_SEARCH_NDEF_TLV; 1788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 1792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_CHECK_LOCK_STATUS: 1797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_i93->product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) 1799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_i93->product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY) 1800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||((p_i93->uid[1] == I93_UID_IC_MFG_CODE_NXP) && (p_i93->ic_reference & I93_ICODE_IC_REF_MBREAD_MASK)) ) 1801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* these doesn't support GetMultiBlockSecurityStatus */ 1803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 180485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu block = (p_i93->rw_offset / p_i93->block_size); 180585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu last_block = (p_i93->ndef_tlv_last_offset / p_i93->block_size); 1806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((*p) & I93_BLOCK_LOCKED) 1808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 180985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (block <= last_block) 1810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->intl_flags |= RW_I93_FLAG_READ_ONLY; 1812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if we need to check more user blocks */ 181785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (block + 1 < p_i93->num_block) 1818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_offset += p_i93->block_size; 1820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* read block to get lock status */ 182285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_i93_send_cmd_read_single_block ((UINT16)(p_i93->rw_offset / p_i93->block_size), TRUE); 1823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->max_ndef_length = p_i93->ndef_length 1828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* add available bytes including the last block of NDEF TLV */ 182985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu + (p_i93->block_size * (block - last_block) + 1) 1830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project - (p_i93->ndef_tlv_last_offset % p_i93->block_size) 1831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project - 1; 1832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 183585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (p_i93->rw_offset == 0) 183685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 183785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->max_ndef_length = p_i93->ndef_length 183885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* add available bytes in the last block of NDEF TLV */ 183985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu + p_i93->block_size 184085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu - (p_i93->ndef_tlv_last_offset % p_i93->block_size) 184185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu - 1; 184285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 184385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu first_block = (p_i93->ndef_tlv_start_offset / p_i93->block_size); 184485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 184585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else 184685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 184785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu first_block = 0; 184885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 1849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 185085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu last_block = (p_i93->ndef_tlv_last_offset / p_i93->block_size); 185185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu num_blocks = length; 1852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 185385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu for (block = first_block; block < num_blocks; block++) 1854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if any block of NDEF TLV is locked */ 185685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if ((block + p_i93->rw_offset) <= last_block) 1857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 185885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (*(p + block) & I93_BLOCK_LOCKED) 1859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->intl_flags |= RW_I93_FLAG_READ_ONLY; 1861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 186685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (*(p + block) & I93_BLOCK_LOCKED) 1867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* no more consecutive unlocked block */ 1869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* add block size if not locked */ 1874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->max_ndef_length += p_i93->block_size; 1875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 187885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 187985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* update next security of block to check */ 188085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->rw_offset += num_blocks; 188185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 188285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* if need to check more */ 188385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (p_i93->num_block > p_i93->rw_offset) 188485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 188585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (rw_i93_get_next_block_sec () != NFC_STATUS_OK) 188685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 188785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_i93_handle_error (NFC_STATUS_FAILED); 188885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 188985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu break; 189085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 189185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 189285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 189385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* check if need to adjust max NDEF length */ 189485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if ( (p_i93->ndef_length < 0xFF) 189585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu &&(p_i93->max_ndef_length >= 0xFF) ) 189685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 189785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* 3 bytes length field must be used */ 189885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->max_ndef_length -= 2; 1899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.status = NFC_STATUS_OK; 1902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.protocol = NFC_PROTOCOL_15693; 1903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.flags = 0; 1904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.flags |= RW_NDEF_FL_SUPPORTED; 1905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.flags |= RW_NDEF_FL_FORMATED; 1906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.flags |= RW_NDEF_FL_FORMATABLE; 1907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.cur_size = p_i93->ndef_length; 1908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->intl_flags & RW_I93_FLAG_READ_ONLY) 1910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.flags |= RW_NDEF_FL_READ_ONLY; 1912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.max_size = p_i93->ndef_length; 1913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.flags |= RW_NDEF_FL_HARD_LOCKABLE; 1917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.max_size = p_i93->max_ndef_length; 1918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->state = RW_I93_STATE_IDLE; 1921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sent_cmd = 0; 1922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG3 ("NDEF cur_size(%d),max_size (%d), flags (0x%x)", 1924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.cur_size, 1925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.max_size, 1926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.flags); 1927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_I93_NDEF_DETECT_EVT, &rw_data); 1929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 1932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_sm_read_ndef 1939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process NDEF read procedure 1941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 1943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_i93_sm_read_ndef (BT_HDR *p_resp) 1946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p = (UINT8 *) (p_resp + 1) + p_resp->offset; 1948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 flags; 1949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 offset, length = p_resp->len; 1950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_I93_CB *p_i93 = &rw_cb.tcb.i93; 1951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA rw_data; 1952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_i93_sm_read_ndef ()"); 1954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project STREAM_TO_UINT8 (flags, p); 1956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length--; 1957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (flags & I93_FLAG_ERROR_DETECTED) 1959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("Got error flags (0x%02x)", flags); 1961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 1962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 1963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if this is the first block */ 1966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->rw_length == 0) 1967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* get start of NDEF in the first block */ 1969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset = p_i93->ndef_tlv_start_offset % p_i93->block_size; 1970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->ndef_length < 0xFF) 1972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset += 2; 1974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset += 4; 1978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* adjust offset if read more blocks because the first block doesn't have NDEF */ 1981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset -= (p_i93->rw_offset - p_i93->ndef_tlv_start_offset); 1982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset = 0; 1986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if read enough data to skip type and length field for the beginning */ 1989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (offset < length) 1990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset++; /* flags */ 1992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_resp->offset += offset; 1993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_resp->len -= offset; 1994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.data.status = NFC_STATUS_OK; 1996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.data.p_data = p_resp; 1997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_length += p_resp->len; 1999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if read all of NDEF data */ 2002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->rw_length >= p_i93->ndef_length) 2003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* remove extra btyes in the last block */ 2005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_resp->len -= (p_i93->rw_length - p_i93->ndef_length); 2006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->state = RW_I93_STATE_IDLE; 2008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sent_cmd = 0; 2009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG2 ("NDEF read complete read (%d)/total (%d)", 2011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_resp->len, 2012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->ndef_length); 2013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_I93_NDEF_READ_CPLT_EVT, &rw_data); 2015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG2 ("NDEF read segment read (%d)/total (%d)", 2019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_resp->len, 2020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->ndef_length); 2021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_I93_NDEF_READ_EVT, &rw_data); 2023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* this will make read data from next block */ 2025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_offset += length; 2026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_get_next_blocks (p_i93->rw_offset) != NFC_STATUS_OK) 2028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_sm_update_ndef 2037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process NDEF update procedure 2039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1. Set length field to zero 2041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2. Write NDEF and Terminator TLV 2042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3. Set length field to NDEF length 2043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 2045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_i93_sm_update_ndef (BT_HDR *p_resp) 2048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p = (UINT8 *) (p_resp + 1) + p_resp->offset; 205085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT8 flags, xx, length_offset, buff[I93_MAX_BLOCK_LENGH]; 205185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT16 length = p_resp->len, block_number; 2052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_I93_CB *p_i93 = &rw_cb.tcb.i93; 2053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA rw_data; 2054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 2056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG2 ("rw_i93_sm_update_ndef () sub_state:%s (0x%x)", 2057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_get_sub_state_name (p_i93->sub_state), p_i93->sub_state); 2058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else 2059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("rw_i93_sm_update_ndef () sub_state:0x%x", p_i93->sub_state); 2060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 2061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project STREAM_TO_UINT8 (flags, p); 2063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length--; 2064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (flags & I93_FLAG_ERROR_DETECTED) 2066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( ( (p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_INLAY) 2068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_CHIP) 2069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_i93->product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) 2070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_i93->product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY) ) 2071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project && 2072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p == I93_ERROR_CODE_BLOCK_FAIL_TO_WRITE) ) 2073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* ignore error */ 2075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("Got error flags (0x%02x)", flags); 2079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 2081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_i93->sub_state) 2085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_RESET_LEN: 2087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* get offset of length field */ 2089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length_offset = (p_i93->ndef_tlv_start_offset + 1) % p_i93->block_size; 2090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* set length to zero */ 2092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *(p + length_offset) = 0x00; 2093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->ndef_length > 0) 2095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if 3 bytes length field is needed */ 2097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->ndef_length >= 0xFF) 2098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project xx = length_offset + 3; 2100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project xx = length_offset + 1; 2104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* write the first part of NDEF in the same block */ 2107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for ( ; xx < p_i93->block_size; xx++) 2108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->rw_length < p_i93->ndef_length) 2110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *(p + xx) = *(p_i93->p_update_data + p_i93->rw_length++); 2112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *(p + xx) = I93_ICODE_TLV_TYPE_NULL; 2116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 212085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu block_number = (p_i93->ndef_tlv_start_offset + 1) / p_i93->block_size; 2121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_cmd_write_single_block (block_number, p) == NFC_STATUS_OK) 2123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* update next writing offset */ 2125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_offset = (block_number + 1) * p_i93->block_size; 2126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sub_state = RW_I93_SUBSTATE_WRITE_NDEF; 2127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_WRITE_NDEF: 2135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if it's not the end of tag memory */ 2137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->rw_offset < p_i93->block_size * p_i93->num_block) 2138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 213985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu block_number = p_i93->rw_offset / p_i93->block_size; 2140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if we have more data to write */ 2142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->rw_length < p_i93->ndef_length) 2143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = p_i93->p_update_data + p_i93->rw_length; 2145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_offset += p_i93->block_size; 2147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_length += p_i93->block_size; 2148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if this is the last block of NDEF TLV */ 2150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->rw_length > p_i93->ndef_length) 2151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* length of NDEF TLV in the block */ 2153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project xx = (UINT8) (p_i93->block_size - (p_i93->rw_length - p_i93->ndef_length)); 2154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* set NULL TLV in the unused part of block */ 2156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memset (buff, I93_ICODE_TLV_TYPE_NULL, p_i93->block_size); 2157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (buff, p, xx); 2158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = buff; 2159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if it's the end of tag memory */ 2161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_i93->rw_offset >= p_i93->block_size * p_i93->num_block) 2162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(xx < p_i93->block_size) ) 2163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project buff[xx] = I93_ICODE_TLV_TYPE_TERM; 2165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->ndef_tlv_last_offset = p_i93->rw_offset - p_i93->block_size + xx - 1; 2168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_cmd_write_single_block (block_number, p) != NFC_STATUS_OK) 2171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if this is the very next block of NDEF TLV */ 2178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (block_number == (p_i93->ndef_tlv_last_offset / p_i93->block_size) + 1) 2179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_offset += p_i93->block_size; 2181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* write Terminator TLV and NULL TLV */ 2183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memset (buff, I93_ICODE_TLV_TYPE_NULL, p_i93->block_size); 2184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project buff[0] = I93_ICODE_TLV_TYPE_TERM; 2185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = buff; 2186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_cmd_write_single_block (block_number, p) != NFC_STATUS_OK) 2188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* finished writing NDEF and Terminator TLV */ 2195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* read length field to update length */ 219685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu block_number = (p_i93->ndef_tlv_start_offset + 1) / p_i93->block_size; 2197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_cmd_read_single_block (block_number, FALSE) == NFC_STATUS_OK) 2199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* set offset to length field */ 2201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_offset = p_i93->ndef_tlv_start_offset + 1; 2202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* get size of length field */ 2204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->ndef_length >= 0xFF) 2205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_length = 3; 2207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_i93->ndef_length > 0) 2209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_length = 1; 2211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_length = 0; 2215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sub_state = RW_I93_SUBSTATE_UPDATE_LEN; 2218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if we have no more data to write */ 2229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->rw_length >= p_i93->ndef_length) 2230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* finished writing NDEF and Terminator TLV */ 2232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* read length field to update length */ 223385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu block_number = (p_i93->ndef_tlv_start_offset + 1) / p_i93->block_size; 2234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_cmd_read_single_block (block_number, FALSE) == NFC_STATUS_OK) 2236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* set offset to length field */ 2238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_offset = p_i93->ndef_tlv_start_offset + 1; 2239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* get size of length field */ 2241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->ndef_length >= 0xFF) 2242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_length = 3; 2244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_i93->ndef_length > 0) 2246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_length = 1; 2248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_length = 0; 2252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sub_state = RW_I93_SUBSTATE_UPDATE_LEN; 2255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_UPDATE_LEN: 2263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if we have more length field to write */ 2265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->rw_length > 0) 2266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if we got ack for writing, read next block to update rest of length field */ 2268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (length == 0) 2269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 227085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu block_number = p_i93->rw_offset / p_i93->block_size; 2271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_cmd_read_single_block (block_number, FALSE) != NFC_STATUS_OK) 2273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length_offset = p_i93->rw_offset % p_i93->block_size; 2280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* update length field within the read block */ 2282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (xx = length_offset; xx < p_i93->block_size; xx++) 2283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->rw_length == 3) 2285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *(p + xx) = 0xFF; 2286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_i93->rw_length == 2) 2287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *(p + xx) = (UINT8) ((p_i93->ndef_length >> 8) & 0xFF); 2288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_i93->rw_length == 1) 2289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *(p + xx) = (UINT8) (p_i93->ndef_length & 0xFF); 2290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_length--; 2292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->rw_length == 0) 2293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 229685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu block_number = (p_i93->rw_offset / p_i93->block_size); 2297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_cmd_write_single_block (block_number, p) == NFC_STATUS_OK) 2299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* set offset to the beginning of next block */ 2301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_offset += p_i93->block_size - (p_i93->rw_offset % p_i93->block_size); 2302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG3 ("NDEF update complete, %d bytes, (%d-%d)", 2312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->ndef_length, 2313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->ndef_tlv_start_offset, 2314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->ndef_tlv_last_offset); 2315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->state = RW_I93_STATE_IDLE; 2317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sent_cmd = 0; 2318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->p_update_data = NULL; 2319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.status = NFC_STATUS_OK; 2321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_I93_NDEF_UPDATE_CPLT_EVT, &rw_data); 2322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 2326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_sm_format 2333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process format procedure 2335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1. Get UID 2337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2. Get sys info for memory size (reset AFI/DSFID) 2338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3. Get block status to get read-only status 2339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4. Write CC and empty NDEF 2340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 2342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_i93_sm_format (BT_HDR *p_resp) 2345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p = (UINT8 *) (p_resp + 1) + p_resp->offset, *p_uid; 234785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT8 flags; 234885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT16 length = p_resp->len, xx, block_number; 2349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_I93_CB *p_i93 = &rw_cb.tcb.i93; 2350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA rw_data; 2351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status = NFC_STATUS_FAILED; 2352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 2354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG2 ("rw_i93_sm_format () sub_state:%s (0x%x)", 2355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_get_sub_state_name (p_i93->sub_state), p_i93->sub_state); 2356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else 2357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("rw_i93_sm_format () sub_state:0x%x", p_i93->sub_state); 2358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 2359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project STREAM_TO_UINT8 (flags, p); 2361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length--; 2362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (flags & I93_FLAG_ERROR_DETECTED) 2364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( ( (p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_INLAY) 2366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_CHIP) 2367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_i93->product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) 2368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_i93->product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY) ) 2369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project && 2370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p == I93_ERROR_CODE_BLOCK_FAIL_TO_WRITE) ) 2371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* ignore error */ 2373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 237485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else if ((length) && (rw_i93_check_sys_info_prot_ext(*p))) 237585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 237685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* getting system info with protocol extension flag */ 237785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* This STM tag supports more than 2040 bytes */ 237885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->intl_flags |= RW_I93_FLAG_16BIT_NUM_BLOCK; 237985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return; 238085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 2381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("Got error flags (0x%02x)", flags); 2384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 2386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_i93->sub_state) 2390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_WAIT_UID: 2392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p++; /* skip DSFID */ 2394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_uid = p_i93->uid; 2395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project STREAM_TO_ARRAY8 (p_uid, p); /* store UID */ 2396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* get system information to get memory size */ 239885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (rw_i93_send_cmd_get_sys_info (NULL, I93_FLAG_PROT_EXT_NO) == NFC_STATUS_OK) 2399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sub_state = RW_I93_SUBSTATE_WAIT_SYS_INFO; 2401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_WAIT_SYS_INFO: 2409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 241085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->block_size = 0; 241185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->num_block = 0; 2412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 241385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (!rw_i93_process_sys_info (p)) 241485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 241585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* retrying with protocol extension flag */ 241685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu break; 241785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 241885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 241985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (p_i93->info_flags & I93_INFO_FLAG_DSFID) 2420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* DSFID, if any DSFID then reset */ 242285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (p_i93->dsfid != I93_DFS_UNSUPPORTED) 2423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->intl_flags |= RW_I93_FLAG_RESET_DSFID; 2425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 242785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (p_i93->info_flags & I93_INFO_FLAG_AFI) 2428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* AFI, reset to 0 */ 243085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (p_i93->afi != 0x00) 2431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->intl_flags |= RW_I93_FLAG_RESET_AFI; 2433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 243685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if ((p_i93->block_size == 0)||(p_i93->num_block == 0)) 2437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 243885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu RW_TRACE_DEBUG0 ("Unable to get tag memory size"); 2439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (status); 2440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_i93->intl_flags & RW_I93_FLAG_RESET_DSFID) 2442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_cmd_write_dsfid (I93_DFS_UNSUPPORTED) == NFC_STATUS_OK) 2444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sub_state = RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI; 2446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_i93->intl_flags & RW_I93_FLAG_RESET_AFI) 2453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_cmd_write_afi (0x00) == NFC_STATUS_OK) 2455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sub_state = RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI; 2457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* get lock status to see if read-only */ 2466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_i93->uid[1] == I93_UID_IC_MFG_CODE_NXP) && (p_i93->ic_reference & I93_ICODE_IC_REF_MBREAD_MASK)) 2467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* these doesn't support GetMultiBlockSecurityStatus */ 2469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.rw_offset = 0; 2471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* read blocks with option flag to get block security status */ 247385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (rw_i93_send_cmd_read_single_block (0x0000, TRUE) == NFC_STATUS_OK) 2474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sub_state = RW_I93_SUBSTATE_CHECK_READ_ONLY; 2476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 248485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* block offset for read-only check */ 248585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->rw_offset = 0; 248685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 248785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (rw_i93_get_next_block_sec () == NFC_STATUS_OK) 248885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 248985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->sub_state = RW_I93_SUBSTATE_CHECK_READ_ONLY; 249085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 249185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else 249285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 249385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_i93_handle_error (NFC_STATUS_FAILED); 249485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 2495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI: 2501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->sent_cmd == I93_CMD_WRITE_DSFID) 2503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->intl_flags &= ~RW_I93_FLAG_RESET_DSFID; 2505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_i93->sent_cmd == I93_CMD_WRITE_AFI) 2507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->intl_flags &= ~RW_I93_FLAG_RESET_AFI; 2509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->intl_flags & RW_I93_FLAG_RESET_DSFID) 2512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_cmd_write_dsfid (I93_DFS_UNSUPPORTED) == NFC_STATUS_OK) 2514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sub_state = RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI; 2516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_i93->intl_flags & RW_I93_FLAG_RESET_AFI) 2523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_cmd_write_afi (0x00) == NFC_STATUS_OK) 2525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sub_state = RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI; 2527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* get lock status to see if read-only */ 2536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_i93->uid[1] == I93_UID_IC_MFG_CODE_NXP) && (p_i93->ic_reference & I93_ICODE_IC_REF_MBREAD_MASK)) 2537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* these doesn't support GetMultiBlockSecurityStatus */ 2539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.rw_offset = 0; 2541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* read blocks with option flag to get block security status */ 254385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (rw_i93_send_cmd_read_single_block (0x0000, TRUE) == NFC_STATUS_OK) 2544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sub_state = RW_I93_SUBSTATE_CHECK_READ_ONLY; 2546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 255485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* block offset for read-only check */ 255585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->rw_offset = 0; 255685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 255785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (rw_i93_get_next_block_sec () == NFC_STATUS_OK) 255885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 255985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->sub_state = RW_I93_SUBSTATE_CHECK_READ_ONLY; 256085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 256185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else 256285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 256385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_i93_handle_error (NFC_STATUS_FAILED); 256485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 2565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_CHECK_READ_ONLY: 2570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_i93->product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) 2572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_i93->product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY) 2573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||((p_i93->uid[1] == I93_UID_IC_MFG_CODE_NXP) && (p_i93->ic_reference & I93_ICODE_IC_REF_MBREAD_MASK)) ) 2574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((*p) & I93_BLOCK_LOCKED) 2576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if we checked all of user blocks */ 2582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_i93->rw_offset / p_i93->block_size) + 1 == p_i93->num_block) 2583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_i93->product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) 2585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_i93->product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY) ) 2586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* read the block which has AFI */ 2588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_offset = I93_TAG_IT_HF_I_STD_PRO_CHIP_INLAY_AFI_LOCATION; 258985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_i93_send_cmd_read_single_block ((UINT16)(p_i93->rw_offset/p_i93->block_size), TRUE); 2590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_i93->rw_offset == I93_TAG_IT_HF_I_STD_PRO_CHIP_INLAY_AFI_LOCATION) 2594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* no block is locked */ 2596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_offset += p_i93->block_size; 260085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_i93_send_cmd_read_single_block ((UINT16)(p_i93->rw_offset/p_i93->block_size), TRUE); 2601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if any block is locked, we cannot format it */ 260785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu for (xx = 0; xx < length; xx++) 2608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 260985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (*(p + xx) & I93_BLOCK_LOCKED) 2610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 261585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 261685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* update block offset for read-only check */ 261785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->rw_offset += length; 261885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 261985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* if need to get more lock status of blocks */ 262085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (p_i93->num_block > p_i93->rw_offset) 262185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 262285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (rw_i93_get_next_block_sec () != NFC_STATUS_OK) 262385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 262485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_i93_handle_error (NFC_STATUS_FAILED); 262585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 262685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu break; 262785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 2628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* get buffer to store CC, zero length NDEF TLV and Terminator TLV */ 2631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->p_update_data = (UINT8*) GKI_getbuf (RW_I93_FORMAT_DATA_LEN); 2632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_i93->p_update_data) 2634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_i93_sm_format (): Cannot allocate buffer"); 2636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = p_i93->p_update_data; 2641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Capability Container */ 2643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *(p++) = I93_ICODE_CC_MAGIC_NUMER; /* magic number */ 2644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *(p++) = 0x40; /* version 1.0, read/write */ 264585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 264685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* if memory size is less than 2048 bytes */ 264785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (((p_i93->num_block * p_i93->block_size) / 8) < 0x100) 264885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu *(p++) = (UINT8) ((p_i93->num_block * p_i93->block_size) / 8); /* memory size */ 264985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else 265085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu *(p++) = 0xFF; 2651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_i93->product_version == RW_I93_ICODE_SLI) 2653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_i93->product_version == RW_I93_ICODE_SLI_S) 2654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_i93->product_version == RW_I93_ICODE_SLI_L) ) 2655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->ic_reference & I93_ICODE_IC_REF_MBREAD_MASK) 2657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *(p++) = I93_ICODE_CC_IPREAD_MASK; /* IPREAD */ 2658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *(p++) = I93_ICODE_CC_MBREAD_MASK; /* MBREAD, read multi block command supported */ 2660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ( (p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_INLAY) 2662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_CHIP) ) 2663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *(p++) = I93_ICODE_CC_MBREAD_MASK; /* MBREAD, read multi block command supported */ 2665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ( (p_i93->product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) 2667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_i93->product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY) ) 2668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *(p++) = 0; 2670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 267385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* STM except LRIS2K, Broadcom supports read multi block command */ 267485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 267585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* if memory size is more than 2040 bytes (which is not LRIS2K) */ 267685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (((p_i93->num_block * p_i93->block_size) / 8) > 0xFF) 267785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu *(p++) = (I93_ICODE_CC_MBREAD_MASK | I93_STM_CC_OVERFLOW_MASK); 267885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else if (p_i93->product_version == RW_I93_STM_LRIS2K) 267985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu *(p++) = 0x00; 268085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu else 268185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu *(p++) = I93_ICODE_CC_MBREAD_MASK; 2682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* zero length NDEF and Terminator TLV */ 2685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *(p++) = I93_ICODE_TLV_TYPE_NDEF; 2686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *(p++) = 0x00; 2687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *(p++) = I93_ICODE_TLV_TYPE_TERM; 2688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *(p++) = I93_ICODE_TLV_TYPE_NULL; 2689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* start from block 0 */ 2691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_offset = 0; 2692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_cmd_write_single_block (0, p_i93->p_update_data) == NFC_STATUS_OK) 2694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sub_state = RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV; 2696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_offset += p_i93->block_size; 2697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV: 2705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if we have more data to write */ 2707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->rw_offset < RW_I93_FORMAT_DATA_LEN) 2708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 270985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu block_number = (p_i93->rw_offset / p_i93->block_size); 2710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = p_i93->p_update_data + p_i93->rw_offset; 2711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_cmd_write_single_block (block_number, p) == NFC_STATUS_OK) 2713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sub_state = RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV; 2715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_offset += p_i93->block_size; 2716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_i93->p_update_data); 2725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->p_update_data = NULL; 2726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->state = RW_I93_STATE_IDLE; 2728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sent_cmd = 0; 2729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.status = NFC_STATUS_OK; 2731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_I93_FORMAT_CPLT_EVT, &rw_data); 2732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 2736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_sm_set_read_only 2743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process read-only procedure 2745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1. Update CC as read-only 2747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2. Lock all block of NDEF TLV 2748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3. Lock block of CC 2749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 2751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_i93_sm_set_read_only (BT_HDR *p_resp) 2754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p = (UINT8 *) (p_resp + 1) + p_resp->offset; 2756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 flags, block_number; 2757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 length = p_resp->len; 2758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_I93_CB *p_i93 = &rw_cb.tcb.i93; 2759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA rw_data; 2760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 2762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG2 ("rw_i93_sm_set_read_only () sub_state:%s (0x%x)", 2763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_get_sub_state_name (p_i93->sub_state), p_i93->sub_state); 2764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else 2765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("rw_i93_sm_set_read_only () sub_state:0x%x", p_i93->sub_state); 2766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 2767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project STREAM_TO_UINT8 (flags, p); 2769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length--; 2770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (flags & I93_FLAG_ERROR_DETECTED) 2772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( ( (p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_INLAY) 2774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_i93->product_version == RW_I93_TAG_IT_HF_I_PLUS_CHIP) 2775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_i93->product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) 2776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_i93->product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY) ) 2777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project && 2778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p == I93_ERROR_CODE_BLOCK_FAIL_TO_WRITE) ) 2779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* ignore error */ 2781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("Got error flags (0x%02x)", flags); 2785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 2787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_i93->sub_state) 2791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_WAIT_CC: 2793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* mark CC as read-only */ 2795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *(p+1) |= I93_ICODE_CC_READ_ONLY; 2796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_cmd_write_single_block (0, p) == NFC_STATUS_OK) 2798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sub_state = RW_I93_SUBSTATE_WAIT_UPDATE_CC; 2800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_WAIT_UPDATE_CC: 2808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* successfully write CC then lock all blocks of NDEF TLV */ 2810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_offset = p_i93->ndef_tlv_start_offset; 2811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project block_number = (UINT8) (p_i93->rw_offset / p_i93->block_size); 2812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_cmd_lock_block (block_number) == NFC_STATUS_OK) 2814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_offset += p_i93->block_size; 2816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sub_state = RW_I93_SUBSTATE_LOCK_NDEF_TLV; 2817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_LOCK_NDEF_TLV: 2825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if we need to lock more blocks */ 2827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->rw_offset < p_i93->ndef_tlv_last_offset) 2828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* get the next block of NDEF TLV */ 2830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project block_number = (UINT8) (p_i93->rw_offset / p_i93->block_size); 2831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_cmd_lock_block (block_number) == NFC_STATUS_OK) 2833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->rw_offset += p_i93->block_size; 2835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if the first block of NDEF TLV is different from block of CC */ 2842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_i93->ndef_tlv_start_offset / p_i93->block_size != 0) 2843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* lock block of CC */ 2845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_cmd_lock_block (0) == NFC_STATUS_OK) 2846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sub_state = RW_I93_SUBSTATE_WAIT_LOCK_CC; 2848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_handle_error (NFC_STATUS_FAILED); 2852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->intl_flags |= RW_I93_FLAG_READ_ONLY; 2857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->state = RW_I93_STATE_IDLE; 2858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sent_cmd = 0; 2859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.status = NFC_STATUS_OK; 2861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_I93_SET_TAG_RO_EVT, &rw_data); 2862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_WAIT_LOCK_CC: 2866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->intl_flags |= RW_I93_FLAG_READ_ONLY; 2868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->state = RW_I93_STATE_IDLE; 2869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sent_cmd = 0; 2870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.status = NFC_STATUS_OK; 2872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_I93_SET_TAG_RO_EVT, &rw_data); 2873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 2876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_handle_error 2883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description notify error to application and clean up 2885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 2887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_i93_handle_error (tNFC_STATUS status) 2890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_I93_CB *p_i93 = &rw_cb.tcb.i93; 2892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA rw_data; 2893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_EVENT event; 2894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG2 ("rw_i93_handle_error (): status:0x%02X, state:0x%X", 2896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status, p_i93->state); 2897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_stop_quick_timer (&p_i93->timer); 2899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.p_cback) 2901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.status = status; 2903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_i93->state) 2905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_IDLE: /* in case of RawFrame */ 2907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project event = RW_I93_INTF_ERROR_EVT; 2908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_BUSY: 2911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->sent_cmd == I93_CMD_STAY_QUIET) 2912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* There is no response to Stay Quiet command */ 2914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.i93_cmd_cmpl.status = NFC_STATUS_OK; 2915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.i93_cmd_cmpl.command = I93_CMD_STAY_QUIET; 2916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.i93_cmd_cmpl.error_code = 0; 2917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project event = RW_I93_CMD_CMPL_EVT; 2918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project event = RW_I93_INTF_ERROR_EVT; 2922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_DETECT_NDEF: 2926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.protocol = NFC_PROTOCOL_15693; 2927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.cur_size = 0; 2928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.max_size = 0; 2929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.flags = 0; 2930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.flags |= RW_NDEF_FL_FORMATABLE; 2931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.flags |= RW_NDEF_FL_UNKNOWN; 2932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project event = RW_I93_NDEF_DETECT_EVT; 2933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_READ_NDEF: 2936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project event = RW_I93_NDEF_READ_FAIL_EVT; 2937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_UPDATE_NDEF: 2940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->p_update_data = NULL; 2941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project event = RW_I93_NDEF_UPDATE_FAIL_EVT; 2942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_FORMAT: 2945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_i93->p_update_data) 2946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_i93->p_update_data); 2948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->p_update_data = NULL; 2949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project event = RW_I93_FORMAT_CPLT_EVT; 2951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_SET_READ_ONLY: 2954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project event = RW_I93_SET_TAG_RO_EVT; 2955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_PRESENCE_CHECK: 2958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project event = RW_I93_PRESENCE_CHECK_EVT; 2959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 2962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project event = RW_I93_MAX_EVT; 2963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->state = RW_I93_STATE_IDLE; 2967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sent_cmd = 0; 2968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (event != RW_I93_MAX_EVT) 2970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (event, &rw_data); 2972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->state = RW_I93_STATE_IDLE; 2977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_process_timeout 2983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description process timeout event 2985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 2987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_i93_process_timeout (TIMER_LIST_ENT *p_tle) 2990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 299185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu BT_HDR *p_buf; 299285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 2993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("rw_i93_process_timeout () event=%d", p_tle->event); 2994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_tle->event == NFC_TTYPE_RW_I93_RESPONSE) 2996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 299785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if ( (rw_cb.tcb.i93.retry_count < RW_MAX_RETRIES) 299885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu &&(rw_cb.tcb.i93.p_retry_cmd) 299985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu &&(rw_cb.tcb.i93.sent_cmd != I93_CMD_STAY_QUIET)) 300085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 300185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_cb.tcb.i93.retry_count++; 300285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu RW_TRACE_ERROR1 ("rw_i93_process_timeout (): retry_count = %d", rw_cb.tcb.i93.retry_count); 300385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 300485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_buf = rw_cb.tcb.i93.p_retry_cmd; 300585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_cb.tcb.i93.p_retry_cmd = NULL; 30067c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu 30077c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu if (rw_i93_send_to_lower (p_buf)) 300885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 30097c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu return; 301085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 301185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 30127c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu 30137c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu /* all retrial is done or failed to send command to lower layer */ 30147c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu if (rw_cb.tcb.i93.p_retry_cmd) 30157c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu { 30167c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu GKI_freebuf (rw_cb.tcb.i93.p_retry_cmd); 30177c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu rw_cb.tcb.i93.p_retry_cmd = NULL; 30187c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu rw_cb.tcb.i93.retry_count = 0; 30197c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu } 30207c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu rw_i93_handle_error (NFC_STATUS_TIMEOUT); 3021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 3023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("rw_i93_process_timeout () unknown event=%d", p_tle->event); 3025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 3029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_data_cback 3031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This callback function receives the data from NFCC. 3033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 3035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_i93_data_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data) 3038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_I93_CB *p_i93 = &rw_cb.tcb.i93; 30407c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu BT_HDR *p_resp; 3041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA rw_data; 3042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 3044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 begin_state = p_i93->state; 3045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 3046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("rw_i93_data_cback () event = 0x%X", event); 3048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (event == NFC_DEACTIVATE_CEVT) 3050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(event == NFC_ERROR_CEVT) ) 3051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_stop_quick_timer (&p_i93->timer); 3053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (event == NFC_ERROR_CEVT) 3055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 305685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if ( (p_i93->retry_count < RW_MAX_RETRIES) 305785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu &&(p_i93->p_retry_cmd) ) 305885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 305985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->retry_count++; 306085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 306185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu RW_TRACE_ERROR1 ("rw_i93_data_cback (): retry_count = %d", p_i93->retry_count); 306285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 306385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_resp = p_i93->p_retry_cmd; 306485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->p_retry_cmd = NULL; 30657c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu if (rw_i93_send_to_lower (p_resp)) 306685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 30677c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu return; 306885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 30697c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu } 307085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 30717c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu /* all retrial is done or failed to send command to lower layer */ 30727c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu if (p_i93->p_retry_cmd) 30737c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu { 30747c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu GKI_freebuf (p_i93->p_retry_cmd); 30757c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu p_i93->p_retry_cmd = NULL; 30767c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu p_i93->retry_count = 0; 307785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 30787c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu 30797c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu rw_i93_handle_error ((tNFC_STATUS) (*(UINT8*) p_data)); 3080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 3082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_SetStaticRfCback (NULL); 3084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->state = RW_I93_STATE_NOT_ACTIVATED; 3085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 3087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (event != NFC_DATA_CEVT) 3090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 3092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 30947c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu p_resp = (BT_HDR *) p_data->data.p_data; 30957c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu 3096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_stop_quick_timer (&p_i93->timer); 3097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 309885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* free retry buffer */ 309985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu if (p_i93->p_retry_cmd) 310085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 310185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu GKI_freebuf (p_i93->p_retry_cmd); 310285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->p_retry_cmd = NULL; 310385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p_i93->retry_count = 0; 310485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 310585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 3106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE) 3107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project DispRWI93Tag (p_resp, TRUE, p_i93->sent_cmd); 3108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 3109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 3111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG2 ("RW I93 state: <%s (%d)>", 3112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_get_state_name (p_i93->state), p_i93->state); 3113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else 3114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("RW I93 state: %d", p_i93->state); 3115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 3116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_i93->state) 3118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_IDLE: 3120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Unexpected Response from VICC, it should be raw frame response */ 3121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* forward to upper layer without parsing */ 3122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sent_cmd = 0; 3123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.p_cback) 3124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3125a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu rw_data.raw_frame.status = p_data->data.status; 3126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.raw_frame.p_data = p_resp; 3127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_I93_RAW_FRAME_EVT, &rw_data); 3128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_resp = NULL; 3129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 3131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_resp); 3133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 3135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_BUSY: 3136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->state = RW_I93_STATE_IDLE; 3137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_send_to_upper (p_resp); 3138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_resp); 3139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 3140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_DETECT_NDEF: 3142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_sm_detect_ndef (p_resp); 3143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_resp); 3144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 3145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_READ_NDEF: 3147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_sm_read_ndef (p_resp); 3148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* p_resp may send upper lyaer */ 3149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 3150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_UPDATE_NDEF: 3152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_sm_update_ndef (p_resp); 3153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_resp); 3154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 3155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_FORMAT: 3157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_sm_format (p_resp); 3158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_resp); 3159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 3160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_SET_READ_ONLY: 3162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_sm_set_read_only (p_resp); 3163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_resp); 3164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 3165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_PRESENCE_CHECK: 3167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->state = RW_I93_STATE_IDLE; 3168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->sent_cmd = 0; 3169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if any response, send presence check with ok */ 3171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.status = NFC_STATUS_OK; 3172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_I93_PRESENCE_CHECK_EVT, &rw_data); 3173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_resp); 3174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 3175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 3177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("rw_i93_data_cback (): invalid state=%d", p_i93->state); 3178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_resp); 3179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 3180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 3183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (begin_state != p_i93->state) 3184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG2 ("RW I93 state changed:<%s> -> <%s>", 3186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_get_state_name (begin_state), 3187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_i93_get_state_name (p_i93->state)); 3188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 3190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 3193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_select 3195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Initialise ISO 15693 RW 3197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 3199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 320185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan ChutNFC_STATUS rw_i93_select (UINT8 *p_uid) 3202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_I93_CB *p_i93 = &rw_cb.tcb.i93; 320485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT8 uid[I93_UID_BYTE_LEN], *p; 3205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_i93_select ()"); 3207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_SetStaticRfCback (rw_i93_data_cback); 3209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_i93->state = RW_I93_STATE_IDLE; 3211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 321285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* convert UID to big endian format - MSB(0xE0) in first byte */ 321385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu p = uid; 321485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu STREAM_TO_ARRAY8 (p, p_uid); 321585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 321685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_i93_get_product_version (uid); 321785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 3218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 3219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 3222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_I93Inventory 3224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 32255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description This function send Inventory command with/without AFI 3226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** If UID is provided then set UID[0]:MSB, ... UID[7]:LSB 3227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_I93_RESPONSE_EVT will be returned 3229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 3231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS if out of buffer 3232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_BUSY if busy 3233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED if other error 3234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 32365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn CoenentNFC_STATUS RW_I93Inventory (BOOLEAN including_afi, UINT8 afi, UINT8 *p_uid) 3237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status; 3239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 32405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_TRACE_API2 ("RW_I93Inventory (), including_afi:%d, AFI:0x%02X", including_afi, afi); 3241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) 3243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_I93Inventory ():Unable to start command at state (0x%X)", 3245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state); 3246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_BUSY; 3247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 32495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen status = rw_i93_send_cmd_inventory (p_uid, including_afi, afi); 3250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 3252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state = RW_I93_STATE_BUSY; 3254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (status); 3257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 3260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_I93StayQuiet 3262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function send Inventory command 3264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_I93_CMD_CMPL_EVT will be returned 3266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 3268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS if out of buffer 3269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_BUSY if busy 3270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED if other error 3271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_I93StayQuiet (void) 3274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status; 3276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_I93StayQuiet ()"); 3278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) 3280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_I93StayQuiet ():Unable to start command at state (0x%X)", 3282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state); 3283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_BUSY; 3284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_i93_send_cmd_stay_quiet (); 3287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 3288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state = RW_I93_STATE_BUSY; 3290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 3293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 3296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_I93ReadSingleBlock 3298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function send Read Single Block command 3300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_I93_RESPONSE_EVT will be returned 3302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 3304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS if out of buffer 3305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_BUSY if busy 3306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED if other error 3307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 330985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan ChutNFC_STATUS RW_I93ReadSingleBlock (UINT16 block_number) 3310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status; 3312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API1 ("RW_I93ReadSingleBlock () block_number:0x%02X", block_number); 3314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) 3316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_I93ReadSingleBlock ():Unable to start command at state (0x%X)", 3318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state); 3319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_BUSY; 3320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_i93_send_cmd_read_single_block (block_number, FALSE); 3323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 3324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state = RW_I93_STATE_BUSY; 3326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 3329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 3332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_I93WriteSingleBlock 3334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function send Write Single Block command 3336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Application must get block size first by calling RW_I93GetSysInfo(). 3337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_I93_CMD_CMPL_EVT will be returned 3339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 3341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS if out of buffer 3342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_BUSY if busy 3343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED if other error 3344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 334685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan ChutNFC_STATUS RW_I93WriteSingleBlock (UINT16 block_number, 334785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT8 *p_data) 3348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status; 3350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_I93WriteSingleBlock ()"); 3352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) 3354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_I93WriteSingleBlock ():Unable to start command at state (0x%X)", 3356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state); 3357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_BUSY; 3358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.block_size == 0) 3361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("RW_I93WriteSingleBlock ():Block size is unknown"); 3363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 3364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_i93_send_cmd_write_single_block (block_number, p_data); 3367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 3368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state = RW_I93_STATE_BUSY; 3370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 3373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 3376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_I93LockBlock 3378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function send Lock Block command 3380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_I93_CMD_CMPL_EVT will be returned 3382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 3384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS if out of buffer 3385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_BUSY if busy 3386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED if other error 3387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_I93LockBlock (UINT8 block_number) 3390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status; 3392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_I93LockBlock ()"); 3394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) 3396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_I93LockBlock ():Unable to start command at state (0x%X)", 3398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state); 3399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_BUSY; 3400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_i93_send_cmd_lock_block (block_number); 3403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 3404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state = RW_I93_STATE_BUSY; 3406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 3409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 3412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_I93ReadMultipleBlocks 3414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function send Read Multiple Blocks command 3416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_I93_RESPONSE_EVT will be returned 3418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 3420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS if out of buffer 3421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_BUSY if busy 3422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED if other error 3423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 342585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan ChutNFC_STATUS RW_I93ReadMultipleBlocks (UINT16 first_block_number, 3426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 number_blocks) 3427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status; 3429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_I93ReadMultipleBlocks ()"); 3431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) 3433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_I93ReadMultipleBlocks ():Unable to start command at state (0x%X)", 3435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state); 3436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_BUSY; 3437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_i93_send_cmd_read_multi_blocks (first_block_number, number_blocks); 3440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 3441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state = RW_I93_STATE_BUSY; 3443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 3446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 3449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_I93WriteMultipleBlocks 3451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function send Write Multiple Blocks command 3453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_I93_CMD_CMPL_EVT will be returned 3455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 3457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS if out of buffer 3458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_BUSY if busy 3459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED if other error 3460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_I93WriteMultipleBlocks (UINT8 first_block_number, 3463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 number_blocks, 3464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_data) 3465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status; 3467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_I93WriteMultipleBlocks ()"); 3469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) 3471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_I93WriteMultipleBlocks ():Unable to start command at state (0x%X)", 3473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state); 3474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_BUSY; 3475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.block_size == 0) 3478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("RW_I93WriteSingleBlock ():Block size is unknown"); 3480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 3481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_i93_send_cmd_write_multi_blocks (first_block_number, number_blocks, p_data); 3484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 3485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state = RW_I93_STATE_BUSY; 3487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 3490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 3493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_I93Select 3495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function send Select command 3497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** UID[0]: 0xE0, MSB 3499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** UID[1]: IC Mfg Code 3500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** ... 3501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** UID[7]: LSB 3502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_I93_CMD_CMPL_EVT will be returned 3504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 3506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS if out of buffer 3507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_BUSY if busy 3508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED if other error 3509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_I93Select (UINT8 *p_uid) 3512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status; 3514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_I93Select ()"); 3516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) 3518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_I93Select ():Unable to start command at state (0x%X)", 3520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state); 3521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_BUSY; 3522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_uid) 3525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_i93_send_cmd_select (p_uid); 3527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 3528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state = RW_I93_STATE_BUSY; 3530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 3533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("RW_I93Select ():UID shall be provided"); 3535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = NFC_STATUS_FAILED; 3536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 3539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 3542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_I93ResetToReady 3544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function send Reset To Ready command 3546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_I93_CMD_CMPL_EVT will be returned 3548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 3550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS if out of buffer 3551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_BUSY if busy 3552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED if other error 3553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_I93ResetToReady (void) 3556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status; 3558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_I93ResetToReady ()"); 3560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) 3562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_I93ResetToReady ():Unable to start command at state (0x%X)", 3564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state); 3565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_BUSY; 3566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_i93_send_cmd_reset_to_ready (); 3569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 3570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state = RW_I93_STATE_BUSY; 3572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 3575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 3578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_I93WriteAFI 3580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function send Write AFI command 3582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_I93_CMD_CMPL_EVT will be returned 3584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 3586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS if out of buffer 3587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_BUSY if busy 3588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED if other error 3589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_I93WriteAFI (UINT8 afi) 3592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status; 3594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_I93WriteAFI ()"); 3596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) 3598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_I93WriteAFI ():Unable to start command at state (0x%X)", 3600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state); 3601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_BUSY; 3602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_i93_send_cmd_write_afi (afi); 3605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 3606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state = RW_I93_STATE_BUSY; 3608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 3611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 3614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_I93LockAFI 3616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function send Lock AFI command 3618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_I93_CMD_CMPL_EVT will be returned 3620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 3622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS if out of buffer 3623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_BUSY if busy 3624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED if other error 3625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_I93LockAFI (void) 3628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status; 3630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_I93LockAFI ()"); 3632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) 3634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_I93LockAFI ():Unable to start command at state (0x%X)", 3636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state); 3637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_BUSY; 3638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_i93_send_cmd_lock_afi (); 3641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 3642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state = RW_I93_STATE_BUSY; 3644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 3647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 3650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_I93WriteDSFID 3652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function send Write DSFID command 3654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_I93_CMD_CMPL_EVT will be returned 3656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 3658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS if out of buffer 3659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_BUSY if busy 3660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED if other error 3661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_I93WriteDSFID (UINT8 dsfid) 3664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status; 3666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_I93WriteDSFID ()"); 3668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) 3670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_I93WriteDSFID ():Unable to start command at state (0x%X)", 3672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state); 3673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_BUSY; 3674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_i93_send_cmd_write_dsfid (dsfid); 3677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 3678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state = RW_I93_STATE_BUSY; 3680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 3683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 3686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_I93LockDSFID 3688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function send Lock DSFID command 3690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_I93_CMD_CMPL_EVT will be returned 3692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 3694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS if out of buffer 3695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_BUSY if busy 3696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED if other error 3697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_I93LockDSFID (void) 3700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status; 3702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_I93LockDSFID ()"); 3704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) 3706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_I93LockDSFID ():Unable to start command at state (0x%X)", 3708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state); 3709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_BUSY; 3710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_i93_send_cmd_lock_dsfid (); 3713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 3714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state = RW_I93_STATE_BUSY; 3716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 3719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 3722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_I93GetSysInfo 3724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function send Get System Information command 3726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_I93_RESPONSE_EVT will be returned 3728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 3730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS if out of buffer 3731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_BUSY if busy 3732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED if other error 3733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_I93GetSysInfo (UINT8 *p_uid) 3736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status; 3738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_I93GetSysInfo ()"); 3740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) 3742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_I93GetSysInfo ():Unable to start command at state (0x%X)", 3744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state); 3745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_BUSY; 3746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_uid) 3749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 375085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu status = rw_i93_send_cmd_get_sys_info (p_uid, I93_FLAG_PROT_EXT_NO); 3751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 3753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 375485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu status = rw_i93_send_cmd_get_sys_info (NULL, I93_FLAG_PROT_EXT_NO); 3755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 3758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state = RW_I93_STATE_BUSY; 3760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 3763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 3766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_I93GetMultiBlockSecurityStatus 3768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function send Get Multiple Block Security Status command 3770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_I93_RESPONSE_EVT will be returned 3772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 3774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS if out of buffer 3775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_BUSY if busy 3776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED if other error 3777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 377985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan ChutNFC_STATUS RW_I93GetMultiBlockSecurityStatus (UINT16 first_block_number, 3780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 number_blocks) 3781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status; 3783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_I93GetMultiBlockSecurityStatus ()"); 3785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) 3787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_I93GetMultiBlockSecurityStatus ():Unable to start command at state (0x%X)", 3789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state); 3790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_BUSY; 3791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_i93_send_cmd_get_multi_block_sec (first_block_number, number_blocks); 3794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 3795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state = RW_I93_STATE_BUSY; 3797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 3800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 3803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_I93DetectNDef 3805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function performs NDEF detection procedure 3807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_I93_NDEF_DETECT_EVT 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 busy or other error 3812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_I93DetectNDef (void) 3815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status; 3817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_I93_RW_SUBSTATE sub_state; 3818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_I93DetectNDef ()"); 3820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) 3822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_I93DetectNDef ():Unable to start command at state (0x%X)", 3824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state); 3825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 3826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.uid[0] != I93_UID_FIRST_BYTE) 3829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 38305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen status = rw_i93_send_cmd_inventory (NULL, FALSE, 0x00); 3831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project sub_state = RW_I93_SUBSTATE_WAIT_UID; 3832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ( (rw_cb.tcb.i93.num_block == 0) 3834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(rw_cb.tcb.i93.block_size == 0) ) 3835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 383685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu status = rw_i93_send_cmd_get_sys_info (rw_cb.tcb.i93.uid, I93_FLAG_PROT_EXT_NO); 3837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project sub_state = RW_I93_SUBSTATE_WAIT_SYS_INFO; 383885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 383985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* clear all flags */ 384085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_cb.tcb.i93.intl_flags = 0; 3841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 3843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* read CC in the first block */ 384585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu status = rw_i93_send_cmd_read_single_block (0x0000, FALSE); 3846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project sub_state = RW_I93_SUBSTATE_WAIT_CC; 3847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 3850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state = RW_I93_STATE_DETECT_NDEF; 3852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.sub_state = sub_state; 385385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 385485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* clear flags except flag for 2 bytes of number of blocks */ 385585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_cb.tcb.i93.intl_flags &= RW_I93_FLAG_16BIT_NUM_BLOCK; 3856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (status); 3859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 3862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_I93ReadNDef 3864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function performs NDEF read procedure 3866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Note: RW_I93DetectNDef () must be called before using this 3867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The following event will be returned 3869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_I93_NDEF_READ_EVT for each segmented NDEF message 3870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_I93_NDEF_READ_CPLT_EVT for the last segment or complete NDEF 3871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_I93_NDEF_READ_FAIL_EVT for failure 3872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 3874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED if I93 is busy or other error 3875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_I93ReadNDef (void) 3878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_I93ReadNDef ()"); 3880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) 3882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_I93ReadNDef ():Unable to start command at state (0x%X)", 3884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state); 3885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 3886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (rw_cb.tcb.i93.tlv_type == I93_ICODE_TLV_TYPE_NDEF) 3889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(rw_cb.tcb.i93.ndef_length > 0) ) 3890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.rw_offset = rw_cb.tcb.i93.ndef_tlv_start_offset; 3892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.rw_length = 0; 3893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_get_next_blocks (rw_cb.tcb.i93.rw_offset) == NFC_STATUS_OK) 3895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state = RW_I93_STATE_READ_NDEF; 3897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 3899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 3901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 3904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("RW_I93ReadNDef ():No NDEF detected"); 3906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 3907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 3910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 3913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_I93UpdateNDef 3915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function performs NDEF update procedure 3917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Note: RW_I93DetectNDef () must be called before using this 3918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Updating data must not be removed until returning event 3919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The following event will be returned 3921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_I93_NDEF_UPDATE_CPLT_EVT for complete 3922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_I93_NDEF_UPDATE_FAIL_EVT for failure 3923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 3925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED if I93 is busy or other error 3926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_I93UpdateNDef (UINT16 length, UINT8 *p_data) 3929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 393085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu UINT16 block_number; 3931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API1 ("RW_I93UpdateNDef () length:%d", length); 3933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) 3935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_I93UpdateNDef ():Unable to start command at state (0x%X)", 3937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state); 3938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 3939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.tlv_type == I93_ICODE_TLV_TYPE_NDEF) 3942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_READ_ONLY) 3944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("RW_I93UpdateNDef ():NDEF is read-only"); 3946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 3947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.max_ndef_length < length) 3949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR2 ("RW_I93UpdateNDef ():data (%d bytes) is more than max NDEF length (%d)", 3951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length, rw_cb.tcb.i93.max_ndef_length); 3952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 3953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.ndef_length = length; 3956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.p_update_data = p_data; 3957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* read length field */ 3959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.rw_offset = rw_cb.tcb.i93.ndef_tlv_start_offset + 1; 3960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.rw_length = 0; 3961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 396285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu block_number = rw_cb.tcb.i93.rw_offset / rw_cb.tcb.i93.block_size; 3963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_cmd_read_single_block (block_number, FALSE) == NFC_STATUS_OK) 3965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state = RW_I93_STATE_UPDATE_NDEF; 3967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.sub_state = RW_I93_SUBSTATE_RESET_LEN; 3968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 3970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 3972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 3975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("RW_I93ReadNDef ():No NDEF detected"); 3977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 3978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 3981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 3984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_I93FormatNDef 3986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function performs formatting procedure 3988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_I93_FORMAT_CPLT_EVT will be returned 3990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 3992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED if busy or other error 3993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_I93FormatNDef (void) 3996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status; 3998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_I93_RW_SUBSTATE sub_state; 3999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_I93FormatNDef ()"); 4001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) 4003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 4004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_I93FormatNDef ():Unable to start command at state (0x%X)", 4005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state); 4006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 4007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 4008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY) 4010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(rw_cb.tcb.i93.product_version == RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY) ) 4011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 4012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* These don't support GetSystemInformation and GetMultiBlockSecurityStatus */ 4013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.rw_offset = 0; 4014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* read blocks with option flag to get block security status */ 401685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu status = rw_i93_send_cmd_read_single_block (0x0000, TRUE); 4017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project sub_state = RW_I93_SUBSTATE_CHECK_READ_ONLY; 4018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 4019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 4020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 40215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen status = rw_i93_send_cmd_inventory (rw_cb.tcb.i93.uid, FALSE, 0x00); 4022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project sub_state = RW_I93_SUBSTATE_WAIT_UID; 4023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 4024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 4026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 4027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state = RW_I93_STATE_FORMAT; 4028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.sub_state = sub_state; 4029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.intl_flags = 0; 4030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 4031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (status); 4033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 4034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 4036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_I93SetTagReadOnly 4038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function performs NDEF read-only procedure 4040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Note: RW_I93DetectNDef () must be called before using this 4041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Updating data must not be removed until returning event 4042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The RW_I93_SET_TAG_RO_EVT event will be returned. 4044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 4046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED if I93 is busy or other error 4047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 4049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_I93SetTagReadOnly (void) 4050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 4051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_I93SetTagReadOnly ()"); 4052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) 4054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 4055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_I93SetTagReadOnly ():Unable to start command at state (0x%X)", 4056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state); 4057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 4058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 4059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.tlv_type == I93_ICODE_TLV_TYPE_NDEF) 4061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 4062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.i93.intl_flags & RW_I93_FLAG_READ_ONLY) 4063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 4064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("RW_I93SetTagReadOnly ():NDEF is already read-only"); 4065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 4066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 4067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* get CC in the first block */ 4069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_i93_send_cmd_read_single_block (0, FALSE) == NFC_STATUS_OK) 4070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 4071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state = RW_I93_STATE_SET_READ_ONLY; 4072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.sub_state = RW_I93_SUBSTATE_WAIT_CC; 4073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 4074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 4075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 4076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 4077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 4078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 4079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 4080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 4081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("RW_I93SetTagReadOnly ():No NDEF detected"); 4082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 4083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 4084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 4086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 4087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 4089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_I93PresenceCheck 4091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Check if the tag is still in the field. 4093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The RW_I93_PRESENCE_CHECK_EVT w/ status is used to indicate 4095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** presence or non-presence. 4096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK, if raw data frame sent 4098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 4099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 4100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 4102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_I93PresenceCheck (void) 4103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 4104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status; 4106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA evt_data; 4107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_I93PresenceCheck ()"); 4109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!rw_cb.p_cback) 4111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 4112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 4113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 4114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (rw_cb.tcb.i93.state == RW_I93_STATE_NOT_ACTIVATED) 4115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 4116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_FAILED; 4117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*rw_cb.p_cback) (RW_T4T_PRESENCE_CHECK_EVT, &evt_data); 4118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 4120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 4121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (rw_cb.tcb.i93.state != RW_I93_STATE_IDLE) 4122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 4123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_BUSY; 4124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 4125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 4126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 41275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* The support of AFI by the VICC is optional, so do not include AFI */ 41285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen status = rw_i93_send_cmd_inventory (rw_cb.tcb.i93.uid, FALSE, 0x00); 4129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 4131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 413285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu /* do not retry during presence check */ 413385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu rw_cb.tcb.i93.retry_count = RW_MAX_RETRIES; 4134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.i93.state = RW_I93_STATE_PRESENCE_CHECK; 4135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 4136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 4137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (status); 4139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 4140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 4142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 4143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_get_state_name 4145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function returns the state name. 4147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NOTE conditionally compiled to save memory. 4149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns pointer to the name 4151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 4153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *rw_i93_get_state_name (UINT8 state) 4154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 4155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (state) 4156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 4157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_NOT_ACTIVATED: 4158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("NOT_ACTIVATED"); 4159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_IDLE: 4160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("IDLE"); 4161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_BUSY: 4162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("BUSY"); 4163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_DETECT_NDEF: 4165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("NDEF_DETECTION"); 4166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_READ_NDEF: 4167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("READ_NDEF"); 4168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_UPDATE_NDEF: 4169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("UPDATE_NDEF"); 4170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_FORMAT: 4171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("FORMAT"); 4172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_SET_READ_ONLY: 4173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("SET_READ_ONLY"); 4174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_STATE_PRESENCE_CHECK: 4176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("PRESENCE_CHECK"); 4177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 4178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("???? UNKNOWN STATE"); 4179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 4180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 4181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 4183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_i93_get_sub_state_name 4185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function returns the sub_state name. 4187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NOTE conditionally compiled to save memory. 4189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns pointer to the name 4191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 4193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *rw_i93_get_sub_state_name (UINT8 sub_state) 4194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 4195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (sub_state) 4196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 4197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_WAIT_UID: 4198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("WAIT_UID"); 4199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_WAIT_SYS_INFO: 4200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("WAIT_SYS_INFO"); 4201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_WAIT_CC: 4202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("WAIT_CC"); 4203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_SEARCH_NDEF_TLV: 4204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("SEARCH_NDEF_TLV"); 4205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_CHECK_LOCK_STATUS: 4206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("CHECK_LOCK_STATUS"); 4207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_RESET_LEN: 4208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("RESET_LEN"); 4209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_WRITE_NDEF: 4210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("WRITE_NDEF"); 4211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_UPDATE_LEN: 4212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("UPDATE_LEN"); 4213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI: 4214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("WAIT_RESET_DSFID_AFI"); 4215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_CHECK_READ_ONLY: 4216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("CHECK_READ_ONLY"); 4217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV: 4218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("WRITE_CC_NDEF_TLV"); 4219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_WAIT_UPDATE_CC: 4220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("WAIT_UPDATE_CC"); 4221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_LOCK_NDEF_TLV: 4222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("LOCK_NDEF_TLV"); 4223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_I93_SUBSTATE_WAIT_LOCK_CC: 4224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("WAIT_LOCK_CC"); 4225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 4226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("???? UNKNOWN SUBSTATE"); 4227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 4228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 422985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 423085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu/******************************************************************************* 423185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** 423285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** Function rw_i93_get_tag_name 423385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** 423485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** Description This function returns the tag name. 423585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** 423685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** NOTE conditionally compiled to save memory. 423785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** 423885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** Returns pointer to the name 423985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu** 424085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu*******************************************************************************/ 424185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chustatic char *rw_i93_get_tag_name (UINT8 product_version) 424285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu{ 424385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu switch (product_version) 424485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu { 424585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu case RW_I93_ICODE_SLI: 424685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return ("SLI/SLIX"); 424785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu case RW_I93_ICODE_SLI_S: 424885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return ("SLI-S/SLIX-S"); 424985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu case RW_I93_ICODE_SLI_L: 425085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return ("SLI-L/SLIX-L"); 425185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu case RW_I93_TAG_IT_HF_I_PLUS_INLAY: 425285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return ("Tag-it HF-I Plus Inlay"); 425385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu case RW_I93_TAG_IT_HF_I_PLUS_CHIP: 425485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return ("Tag-it HF-I Plus Chip"); 425585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu case RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY: 425685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return ("Tag-it HF-I Standard Chip/Inlyas"); 425785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu case RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY: 425885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return ("Tag-it HF-I Pro Chip/Inlays"); 425985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu case RW_I93_STM_LRI1K: 426085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return ("LRi1K"); 426185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu case RW_I93_STM_LRI2K: 426285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return ("LRi2K"); 426385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu case RW_I93_STM_LRIS2K: 426485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return ("LRiS2K"); 426585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu case RW_I93_STM_LRIS64K: 426685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return ("LRiS64K"); 426785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu case RW_I93_STM_M24LR64_R: 426885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return ("M24LR64"); 426985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu case RW_I93_STM_M24LR04E_R: 427085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return ("M24LR04E"); 427185b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu case RW_I93_STM_M24LR16E_R: 427285b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return ("M24LR16E"); 427385b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu case RW_I93_STM_M24LR64E_R: 427485b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return ("M24LR64E"); 427585b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu case RW_I93_UNKNOWN_PRODUCT: 427685b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu default: 427785b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu return ("UNKNOWN"); 427885b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu } 427985b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu} 428085b7e84f6cc61506c94e98844cac9ce50bbbe9dcEvan Chu 4281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 4282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* (NFC_INCLUDED == TRUE) */ 4284