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