1b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu/******************************************************************************
2b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
3b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  Copyright (C) 2010-2012 Broadcom Corporation
4b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
5b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  Licensed under the Apache License, Version 2.0 (the "License");
6b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  you may not use this file except in compliance with the License.
7b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  You may obtain a copy of the License at:
8b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
9b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  http://www.apache.org/licenses/LICENSE-2.0
10b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
11b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  Unless required by applicable law or agreed to in writing, software
12b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  distributed under the License is distributed on an "AS IS" BASIS,
13b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  See the License for the specific language governing permissions and
15b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  limitations under the License.
16b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
17b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu ******************************************************************************/
18b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu
19b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu/******************************************************************************
20b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
21b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  This file contains the implementation for Type 1 tag in Reader/Writer
22b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  mode.
23b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
24b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu ******************************************************************************/
2545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <string.h>
2645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfc_target.h"
2745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
2845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (NFC_INCLUDED == TRUE)
2945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfc_api.h"
3045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nci_hmsgs.h"
3145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "rw_api.h"
3245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "rw_int.h"
3345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "nfc_int.h"
3445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "gki.h"
3545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
3645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/* Local Functions */
3745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic tRW_EVENT rw_t1t_handle_rid_rsp (BT_HDR *p_pkt);
3845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void rw_t1t_data_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data);
3945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void rw_t1t_process_frame_error (void);
4045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void rw_t1t_process_error (void);
4145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void rw_t1t_handle_presence_check_rsp (tNFC_STATUS status);
4245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (BT_TRACE_VERBOSE == TRUE)
4345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic char *rw_t1t_get_state_name (UINT8 state);
4445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic char *rw_t1t_get_sub_state_name (UINT8 sub_state);
4545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic char *rw_t1t_get_event_name (UINT8 event);
4645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif
4745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
4845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
4945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
5045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         rw_t1t_data_cback
5145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
52e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Description      This callback function handles data from NFCC.
5345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
5445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          none
5545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
5645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
5745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void rw_t1t_data_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data)
5845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
5945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_T1T_CB              *p_t1t      = &rw_cb.tcb.t1t;
6045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_EVENT               rw_event    = RW_RAW_FRAME_EVT;
6145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    BOOLEAN                 b_notify    = TRUE;
6245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_DATA                evt_data;
6345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    BT_HDR                  *p_pkt;
6445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    UINT8                   *p;
6545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tT1T_CMD_RSP_INFO       *p_cmd_rsp_info     = (tT1T_CMD_RSP_INFO *) rw_cb.tcb.t1t.p_cmd_rsp_info;
6645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
6745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    p_pkt = (BT_HDR *) (p_data->data.p_data);
6845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (p_pkt == NULL)
6945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
7045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* Assume the data is just the response byte sequence */
7145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    p = (UINT8 *) (p_pkt + 1) + p_pkt->offset;
7245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
7345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (BT_TRACE_VERBOSE == TRUE)
7445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    RW_TRACE_DEBUG2 ("rw_t1t_data_cback (): state:%s (%d)", rw_t1t_get_state_name (p_t1t->state), p_t1t->state);
7545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#else
7645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    RW_TRACE_DEBUG1 ("rw_t1t_data_cback (): state=%d", p_t1t->state);
7745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif
7845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
7945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    evt_data.status = NFC_STATUS_OK;
80e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
8145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if(  (p_t1t->state == RW_T1T_STATE_IDLE)
8245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu       ||(!p_cmd_rsp_info)  )
8345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
84e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        /* If previous command was retransmitted and if response is pending to previous command retransmission,
85e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu         * check if lenght and ADD/ADD8/ADDS field matches the expected value of previous
8645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu         * retransmited command response. However, ignore ADD field if the command was RALL/RID
8745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu         */
8845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (  (p_t1t->prev_cmd_rsp_info.pend_retx_rsp)
8945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            &&(p_t1t->prev_cmd_rsp_info.rsp_len == p_pkt->len)
9045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            &&((p_t1t->prev_cmd_rsp_info.op_code == T1T_CMD_RID) || (p_t1t->prev_cmd_rsp_info.op_code == T1T_CMD_RALL) || (p_t1t->prev_cmd_rsp_info.addr == *p))  )
9145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
9245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Response to previous command retransmission */
9345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            RW_TRACE_ERROR2 ("T1T Response to previous command in Idle state. command=0x%02x, Remaining max retx rsp:0x%02x ", p_t1t->prev_cmd_rsp_info.op_code, p_t1t->prev_cmd_rsp_info.pend_retx_rsp - 1);
9445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p_t1t->prev_cmd_rsp_info.pend_retx_rsp--;
9545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            GKI_freebuf (p_pkt);
9645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
9745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        else
9845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
9945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Raw frame event */
10045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            evt_data.data.p_data = p_pkt;
10145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            (*rw_cb.p_cback) (RW_T1T_RAW_FRAME_EVT, (tRW_DATA *) &evt_data);
10245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
10345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
10445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
10545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
10645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (defined (RW_STATS_INCLUDED) && (RW_STATS_INCLUDED == TRUE))
10745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* Update rx stats */
10845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    rw_main_update_rx_stats (p_pkt->len);
10945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif  /* RW_STATS_INCLUDED */
11045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
11145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
11245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (  (p_pkt->len != p_cmd_rsp_info->rsp_len)
113ad483f6fa0128f07fd2187bb9c46c2e3f7728cc5Evan Chu        ||((p_cmd_rsp_info->opcode != T1T_CMD_RALL) && (p_cmd_rsp_info->opcode != T1T_CMD_RID) && (*p != p_t1t->addr))  )
11445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
11545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
116e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        /* If previous command was retransmitted and if response is pending to previous command retransmission,
117e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu         * then check if lenght and ADD/ADD8/ADDS field matches the expected value of previous
11845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu         * retransmited command response. However, ignore ADD field if the command was RALL/RID
11945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu         */
12045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (  (p_t1t->prev_cmd_rsp_info.pend_retx_rsp)
12145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            &&(p_t1t->prev_cmd_rsp_info.rsp_len == p_pkt->len)
12245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            &&((p_t1t->prev_cmd_rsp_info.op_code == T1T_CMD_RID) || (p_t1t->prev_cmd_rsp_info.op_code == T1T_CMD_RALL) || (p_t1t->prev_cmd_rsp_info.addr == *p))  )
12345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
12445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            RW_TRACE_ERROR2 ("T1T Response to previous command. command=0x%02x, Remaining max retx rsp:0x%02x", p_t1t->prev_cmd_rsp_info.op_code, p_t1t->prev_cmd_rsp_info.pend_retx_rsp - 1);
12545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p_t1t->prev_cmd_rsp_info.pend_retx_rsp--;
12645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
12745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        else
12845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
12945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Stop timer as some response to current command is received */
13045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            nfc_stop_quick_timer (&p_t1t->timer);
13145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Retrasmit the last sent command if retry-count < max retry */
13245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (BT_TRACE_VERBOSE == TRUE)
133ad483f6fa0128f07fd2187bb9c46c2e3f7728cc5Evan Chu            RW_TRACE_ERROR2 ("T1T Frame error. state=%s command (opcode) = 0x%02x", rw_t1t_get_state_name (p_t1t->state), p_cmd_rsp_info->opcode);
13445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#else
135ad483f6fa0128f07fd2187bb9c46c2e3f7728cc5Evan Chu            RW_TRACE_ERROR2 ("T1T Frame error. state=0x%02x command = 0x%02x ", p_t1t->state, p_cmd_rsp_info->opcode);
13645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif
13745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            rw_t1t_process_frame_error ();
13845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
13945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        GKI_freebuf (p_pkt);
14045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
14145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
14245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
14345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* Stop timer as response to current command is received */
14445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    nfc_stop_quick_timer (&p_t1t->timer);
14545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
14645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    RW_TRACE_EVENT2 ("RW RECV [%s]:0x%x RSP", t1t_info_to_str (p_cmd_rsp_info), p_cmd_rsp_info->opcode);
14745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
14845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* If we did not receive response to all retransmitted previous command,
14945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu     * dont expect that as response have come for the current command itself.
15045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu     */
15145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (p_t1t->prev_cmd_rsp_info.pend_retx_rsp)
15245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        memset (&(p_t1t->prev_cmd_rsp_info), 0, sizeof (tRW_T1T_PREV_CMD_RSP_INFO));
15345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
15445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (rw_cb.cur_retry)
15545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
15645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* If the current command was retransmitted to get this response, we might get
15745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu       response later to all or some of the retrasnmission of the current command
15845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu     */
15945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        p_t1t->prev_cmd_rsp_info.addr          = ((p_cmd_rsp_info->opcode != T1T_CMD_RALL) && (p_cmd_rsp_info->opcode != T1T_CMD_RID))? p_t1t->addr:0;
16045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        p_t1t->prev_cmd_rsp_info.rsp_len       = p_cmd_rsp_info->rsp_len;
16145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        p_t1t->prev_cmd_rsp_info.op_code       = p_cmd_rsp_info->opcode;
16245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        p_t1t->prev_cmd_rsp_info.pend_retx_rsp = (UINT8) rw_cb.cur_retry;
16345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
16445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
16545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    rw_cb.cur_retry = 0;
16645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
16745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (p_cmd_rsp_info->opcode == T1T_CMD_RID)
16845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
16945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        rw_event = rw_t1t_handle_rid_rsp (p_pkt);
17045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
17145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    else
17245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
17345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        rw_event = rw_t1t_handle_rsp (p_cmd_rsp_info, &b_notify, p, &evt_data.status);
17445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
17545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
17645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (b_notify)
17745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
17845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if(  (p_t1t->state != RW_T1T_STATE_READ)
17945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu           &&(p_t1t->state != RW_T1T_STATE_WRITE)  )
18045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
18145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            GKI_freebuf (p_pkt);
18245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            evt_data.data.p_data = NULL;
18345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
18445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        else
18545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
18645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            evt_data.data.p_data = p_pkt;
18745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
18845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        rw_t1t_handle_op_complete ();
18945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        (*rw_cb.p_cback) (rw_event, (tRW_DATA *) &evt_data);
19045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
19145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    else
19245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        GKI_freebuf (p_pkt);
19345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
19445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
19545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
19645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
19745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         rw_t1t_conn_cback
19845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
199e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Description      This callback function receives the events/data from NFCC.
20045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
20145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          none
20245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
20345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
20445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid rw_t1t_conn_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data)
20545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
20645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_T1T_CB          *p_t1t  = &rw_cb.tcb.t1t;
20745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_READ_DATA       evt_data;
20845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
20945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    RW_TRACE_DEBUG2 ("rw_t1t_conn_cback: conn_id=%i, evt=0x%x", conn_id, event);
21045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* Only handle static conn_id */
21145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (conn_id != NFC_RF_CONN_ID)
21245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
21345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_WARNING1 ("rw_t1t_conn_cback - Not static connection id: =%i", conn_id);
21445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
21545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
21645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
21745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    switch (event)
21845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
21945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case NFC_CONN_CREATE_CEVT:
22045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case NFC_CONN_CLOSE_CEVT:
22145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        break;
22245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
22345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case NFC_DEACTIVATE_CEVT:
22445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (defined (RW_STATS_INCLUDED) && (RW_STATS_INCLUDED == TRUE))
22545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* Display stats */
22645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        rw_main_log_stats ();
22745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif  /* RW_STATS_INCLUDED */
22845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
22945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* Stop t1t timer (if started) */
23045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfc_stop_quick_timer (&p_t1t->timer);
23145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
23245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* Free cmd buf for retransmissions */
23345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (p_t1t->p_cur_cmd_buf)
23445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
23545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            GKI_freebuf (p_t1t->p_cur_cmd_buf);
23645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p_t1t->p_cur_cmd_buf = NULL;
23745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
23845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
23945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        p_t1t->state = RW_T1T_STATE_NOT_ACTIVATED;
24045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        NFC_SetStaticRfCback (NULL);
24145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        break;
24245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
24345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case NFC_DATA_CEVT:
24445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (  (p_data != NULL)
24545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            &&(p_data->data.status == NFC_STATUS_OK)  )
24645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
24745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            rw_t1t_data_cback (conn_id, event, p_data);
24845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            break;
24945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
25045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* Data event with error status...fall through to NFC_ERROR_CEVT case */
25145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
25245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case NFC_ERROR_CEVT:
25345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (  (p_t1t->state == RW_T1T_STATE_NOT_ACTIVATED)
25445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            ||(p_t1t->state == RW_T1T_STATE_IDLE)  )
25545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
25645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (defined (RW_STATS_INCLUDED) && (RW_STATS_INCLUDED == TRUE))
25745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            rw_main_update_trans_error_stats ();
25845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif  /* RW_STATS_INCLUDED */
25945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
260ad483f6fa0128f07fd2187bb9c46c2e3f7728cc5Evan Chu            if (event == NFC_ERROR_CEVT)
261ad483f6fa0128f07fd2187bb9c46c2e3f7728cc5Evan Chu                evt_data.status = (tNFC_STATUS) (*(UINT8*) p_data);
262ad483f6fa0128f07fd2187bb9c46c2e3f7728cc5Evan Chu            else if (p_data)
26345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                evt_data.status = p_data->status;
26445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            else
26545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                evt_data.status = NFC_STATUS_FAILED;
26645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
26745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            evt_data.p_data = NULL;
26845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            (*rw_cb.p_cback) (RW_T1T_INTF_ERROR_EVT, (tRW_DATA *) &evt_data);
26945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            break;
27045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
27145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        nfc_stop_quick_timer (&p_t1t->timer);
27245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
27345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (defined (RW_STATS_INCLUDED) && (RW_STATS_INCLUDED == TRUE))
27445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        rw_main_update_trans_error_stats ();
27545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif  /* RW_STATS_INCLUDED */
27645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
27745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (p_t1t->state == RW_T1T_STATE_CHECK_PRESENCE)
27845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
27945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            rw_t1t_handle_presence_check_rsp (NFC_STATUS_FAILED);
28045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
28145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        else
28245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
28345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            rw_t1t_process_error ();
28445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
28545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        break;
28645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
28745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    default:
28845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        break;
28945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
29045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
29145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
29245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
29345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
29445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
29545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         rw_t1t_send_static_cmd
29645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
297e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Description      This function composes a Type 1 Tag command for static
298e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**                  memory and send through NCI to NFCC.
29945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
30045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          NFC_STATUS_OK if the command is successfuly sent to NCI
301e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**                  otherwise, error status
30245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
30345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
30445faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFC_STATUS rw_t1t_send_static_cmd (UINT8 opcode, UINT8 add, UINT8 dat)
30545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
30645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tNFC_STATUS             status  = NFC_STATUS_FAILED;
30745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_T1T_CB              *p_t1t  = &rw_cb.tcb.t1t;
30845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    const tT1T_CMD_RSP_INFO *p_cmd_rsp_info = t1t_cmd_to_rsp_info (opcode);
30945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    BT_HDR                  *p_data;
31045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    UINT8                   *p;
31145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
31245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (p_cmd_rsp_info)
31345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
31445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* a valid opcode for RW */
31545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        p_data = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID);
31645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (p_data)
31745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
31845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p_t1t->p_cmd_rsp_info   = (tT1T_CMD_RSP_INFO *) p_cmd_rsp_info;
31945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p_t1t->addr             = add;
32045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p_data->offset          = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
32145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p                       = (UINT8 *) (p_data + 1) + p_data->offset;
32245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            UINT8_TO_BE_STREAM (p, opcode);
32345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            UINT8_TO_BE_STREAM (p, add);
32445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            UINT8_TO_BE_STREAM (p, dat);
32545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
32645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            ARRAY_TO_STREAM (p, p_t1t->mem, T1T_CMD_UID_LEN);
32745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p_data->len     = p_cmd_rsp_info->cmd_len;
32845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
32945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Indicate first attempt to send command, back up cmd buffer in case needed for retransmission */
33045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            rw_cb.cur_retry = 0;
33145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            memcpy (p_t1t->p_cur_cmd_buf, p_data, sizeof (BT_HDR) + p_data->offset + p_data->len);
33245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
33345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (defined (RW_STATS_INCLUDED) && (RW_STATS_INCLUDED == TRUE))
33445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Update stats */
33545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            rw_main_update_tx_stats (p_data->len, FALSE);
33645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif  /* RW_STATS_INCLUDED */
33745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
33845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            RW_TRACE_EVENT2 ("RW SENT [%s]:0x%x CMD", t1t_info_to_str (p_cmd_rsp_info), p_cmd_rsp_info->opcode);
33945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if ((status = NFC_SendData (NFC_RF_CONN_ID, p_data)) == NFC_STATUS_OK)
34045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
341e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu                nfc_start_quick_timer (&p_t1t->timer, NFC_TTYPE_RW_T1T_RESPONSE,
342ad483f6fa0128f07fd2187bb9c46c2e3f7728cc5Evan Chu                       (RW_T1T_TOUT_RESP * QUICK_TIMER_TICKS_PER_SEC) / 1000);
34345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
34445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
34545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        else
34645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
34745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            status = NFC_STATUS_NO_BUFFERS;
34845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
34945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
35045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return status;
35145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
35245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
35345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
35445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
35545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         rw_t1t_send_dyn_cmd
35645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
35745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      This function composes a Type 1 Tag command for dynamic memory
358e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**                  and send through NCI to NFCC.
35945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
36045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          NFC_STATUS_OK if the command is successfuly sent to NCI
361e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**                  otherwise, error status
36245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
36345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
36445faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFC_STATUS rw_t1t_send_dyn_cmd (UINT8 opcode, UINT8 add, UINT8 *p_dat)
36545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
36645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tNFC_STATUS             status  = NFC_STATUS_FAILED;
36745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_T1T_CB              *p_t1t  = &rw_cb.tcb.t1t;
36845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    const tT1T_CMD_RSP_INFO *p_cmd_rsp_info = t1t_cmd_to_rsp_info (opcode);
36945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    BT_HDR                  *p_data;
37045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    UINT8                   *p;
37145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
37245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (p_cmd_rsp_info)
37345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
37445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* a valid opcode for RW */
37545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        p_data = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID);
37645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (p_data)
37745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
37845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p_t1t->p_cmd_rsp_info   = (tT1T_CMD_RSP_INFO *) p_cmd_rsp_info;
37945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p_t1t->addr             = add;
38045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p_data->offset          = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
38145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p                       = (UINT8 *) (p_data + 1) + p_data->offset;
38245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            UINT8_TO_BE_STREAM (p, opcode);
38345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            UINT8_TO_BE_STREAM (p, add);
38445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
38545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if (p_dat)
38645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
38745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                ARRAY_TO_STREAM (p, p_dat, 8);
38845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
38945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            else
39045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
39145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                memset (p, 0, 8);
39245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                p += 8;
39345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
39445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            ARRAY_TO_STREAM (p, p_t1t->mem, T1T_CMD_UID_LEN);
39545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p_data->len     = p_cmd_rsp_info->cmd_len;
39645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
39745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Indicate first attempt to send command, back up cmd buffer in case needed for retransmission */
39845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            rw_cb.cur_retry = 0;
39945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            memcpy (p_t1t->p_cur_cmd_buf, p_data, sizeof (BT_HDR) + p_data->offset + p_data->len);
40045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
40145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (defined (RW_STATS_INCLUDED) && (RW_STATS_INCLUDED == TRUE))
40245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Update stats */
40345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            rw_main_update_tx_stats (p_data->len, FALSE);
40445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif  /* RW_STATS_INCLUDED */
40545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
40645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            RW_TRACE_EVENT2 ("RW SENT [%s]:0x%x CMD", t1t_info_to_str (p_cmd_rsp_info), p_cmd_rsp_info->opcode);
40745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
40845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if ((status = NFC_SendData (NFC_RF_CONN_ID, p_data)) == NFC_STATUS_OK)
40945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
410e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu                nfc_start_quick_timer (&p_t1t->timer, NFC_TTYPE_RW_T1T_RESPONSE,
411ad483f6fa0128f07fd2187bb9c46c2e3f7728cc5Evan Chu                       (RW_T1T_TOUT_RESP * QUICK_TIMER_TICKS_PER_SEC) / 1000);
41245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
41345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
41445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        else
41545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
41645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            status = NFC_STATUS_NO_BUFFERS;
41745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
41845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
41945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return status;
42045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
42145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
42245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*****************************************************************************
42345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
42445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         rw_t1t_handle_rid_rsp
42545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
42645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      Handles response to RID: Collects HR, UID, notify up the
42745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  stack
42845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
42945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          event to notify application
43045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
43145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*****************************************************************************/
43245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic tRW_EVENT rw_t1t_handle_rid_rsp (BT_HDR *p_pkt)
43345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
43445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_T1T_CB  *p_t1t   = &rw_cb.tcb.t1t;
43545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_DATA    evt_data;
43645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    UINT8       *p_rid_rsp;
43745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
43845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    evt_data.status      = NFC_STATUS_OK;
43945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    evt_data.data.p_data = p_pkt;
44045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
44145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* Assume the data is just the response byte sequence */
44245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    p_rid_rsp = (UINT8 *) (p_pkt + 1) + p_pkt->offset;
44345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
44445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* Response indicates tag is present */
44545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (p_t1t->state == RW_T1T_STATE_CHECK_PRESENCE)
44645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
44745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* If checking for the presence of the tag then just notify */
44845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return RW_T1T_PRESENCE_CHECK_EVT;
44945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
45045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
45145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* Extract HR and UID from response */
45245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    STREAM_TO_ARRAY (p_t1t->hr,  p_rid_rsp, T1T_HR_LEN);
45345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
45445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (BT_TRACE_VERBOSE == TRUE)
45545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    RW_TRACE_DEBUG2 ("hr0:0x%x, hr1:0x%x", p_t1t->hr[0], p_t1t->hr[1]);
45645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    RW_TRACE_DEBUG4 ("rw_t1t_handle_rid_rsp (): UID0-3=%02x%02x%02x%02x", p_rid_rsp[0], p_rid_rsp[1], p_rid_rsp[2], p_rid_rsp[3]);
45745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#else
45845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    RW_TRACE_DEBUG0 ("rw_t1t_handle_rid_rsp ()");
45945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif
46045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
46145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* Fetch UID0-3 from RID response message */
46245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    STREAM_TO_ARRAY (p_t1t->mem,  p_rid_rsp, T1T_CMD_UID_LEN);
46345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
46445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* Notify RID response Event */
46545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return RW_T1T_RID_EVT;
46645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
46745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
46845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
46945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
47045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         rw_t1t_select
47145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
472e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Description      This function will set the callback function to
47345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**                  receive data from lower layers and also send rid command
47445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
47545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          none
47645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
47745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
47845faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFC_STATUS rw_t1t_select (UINT8 hr[T1T_HR_LEN], UINT8 uid[T1T_CMD_UID_LEN])
47945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
48045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tNFC_STATUS status  = NFC_STATUS_FAILED;
48145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_T1T_CB  *p_t1t  = &rw_cb.tcb.t1t;
48245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
48345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    p_t1t->state = RW_T1T_STATE_NOT_ACTIVATED;
48445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
48545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* Alloc cmd buf for retransmissions */
48645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (p_t1t->p_cur_cmd_buf ==  NULL)
48745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
48845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if ((p_t1t->p_cur_cmd_buf = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID)) == NULL)
48945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
49045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            RW_TRACE_ERROR0 ("rw_t1t_select: unable to allocate buffer for retransmission");
49145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            return status;
49245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
49345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
49445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
49545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    memcpy (p_t1t->hr, hr, T1T_HR_LEN);
49645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    memcpy (p_t1t->mem, uid, T1T_CMD_UID_LEN);
49745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
49845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    NFC_SetStaticRfCback (rw_t1t_conn_cback);
49945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
50045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    p_t1t->state    = RW_T1T_STATE_IDLE;
50145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
50245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return NFC_STATUS_OK;
50345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
50445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
50545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
50645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
50745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         rw_t1t_process_timeout
50845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
50945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      process timeout event
51045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
51145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          none
51245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
51345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
51445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid rw_t1t_process_timeout (TIMER_LIST_ENT *p_tle)
51545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
51645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_T1T_CB        *p_t1t  = &rw_cb.tcb.t1t;
51745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
51845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (BT_TRACE_VERBOSE == TRUE)
51945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    RW_TRACE_ERROR2 ("T1T timeout. state=%s command (opcode)=0x%02x ", rw_t1t_get_state_name (p_t1t->state), (rw_cb.tcb.t1t.p_cmd_rsp_info)->opcode);
52045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#else
52145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    RW_TRACE_ERROR2 ("T1T timeout. state=0x%02x command=0x%02x ", p_t1t->state, (rw_cb.tcb.t1t.p_cmd_rsp_info)->opcode);
52245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif
52345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
52445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (p_t1t->state == RW_T1T_STATE_CHECK_PRESENCE)
52545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
52645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* Tag has moved from range */
52745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        rw_t1t_handle_presence_check_rsp (NFC_STATUS_FAILED);
52845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
52945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    else if (p_t1t->state != RW_T1T_STATE_IDLE)
53045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
53145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        rw_t1t_process_error ();
53245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
53345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
53445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
53545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
53645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
53745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
53845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         rw_t1t_process_frame_error
53945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
54045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      Process frame crc error
54145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
54245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          none
54345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
54445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
54545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void rw_t1t_process_frame_error (void)
54645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
54745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (defined (RW_STATS_INCLUDED) && (RW_STATS_INCLUDED == TRUE))
54845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* Update stats */
54945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    rw_main_update_crc_error_stats ();
55045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif  /* RW_STATS_INCLUDED */
55145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
55245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* Process the error */
55345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    rw_t1t_process_error ();
55445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
55545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
55645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
55745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
55845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         rw_t1t_process_error
55945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
56045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      process timeout event
56145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
56245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          none
56345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
56445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
56545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic void rw_t1t_process_error (void)
56645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
56745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_READ_DATA           evt_data;
56845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_EVENT               rw_event;
56945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    BT_HDR                  *p_cmd_buf;
57045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_T1T_CB              *p_t1t  = &rw_cb.tcb.t1t;
57145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tT1T_CMD_RSP_INFO       *p_cmd_rsp_info = (tT1T_CMD_RSP_INFO *) rw_cb.tcb.t1t.p_cmd_rsp_info;
57245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_DETECT_NDEF_DATA    ndef_data;
57345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
57445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    RW_TRACE_DEBUG1 ("rw_t1t_process_error () State: %u", p_t1t->state);
57545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
57645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* Retry sending command if retry-count < max */
57745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (rw_cb.cur_retry < RW_MAX_RETRIES)
57845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
57945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* retry sending the command */
58045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        rw_cb.cur_retry++;
58145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
58245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_DEBUG2 ("T1T retransmission attempt %i of %i", rw_cb.cur_retry, RW_MAX_RETRIES);
58345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
58445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* allocate a new buffer for message */
58545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if ((p_cmd_buf = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID)) != NULL)
58645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
58745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            memcpy (p_cmd_buf, p_t1t->p_cur_cmd_buf, sizeof (BT_HDR) + p_t1t->p_cur_cmd_buf->offset + p_t1t->p_cur_cmd_buf->len);
58845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
58945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (defined (RW_STATS_INCLUDED) && (RW_STATS_INCLUDED == TRUE))
59045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            /* Update stats */
59145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            rw_main_update_tx_stats (p_cmd_buf->len, TRUE);
59245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif  /* RW_STATS_INCLUDED */
59345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
59445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if (NFC_SendData (NFC_RF_CONN_ID, p_cmd_buf) == NFC_STATUS_OK)
59545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
59645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                /* Start timer for waiting for response */
597e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu                nfc_start_quick_timer (&p_t1t->timer, NFC_TTYPE_RW_T1T_RESPONSE,
598ad483f6fa0128f07fd2187bb9c46c2e3f7728cc5Evan Chu                                       (RW_T1T_TOUT_RESP * QUICK_TIMER_TICKS_PER_SEC)/1000);
59945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
60045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                return;
60145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
60245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
60345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
60445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    else
60545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
606e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    /* we might get response later to all or some of the retrasnmission
60745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu     * of the current command, update previous command response information */
60845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_DEBUG1 ("T1T maximum retransmission attempts reached (%i)", RW_MAX_RETRIES);
60945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        p_t1t->prev_cmd_rsp_info.addr          = ((p_cmd_rsp_info->opcode != T1T_CMD_RALL) && (p_cmd_rsp_info->opcode != T1T_CMD_RID))? p_t1t->addr:0;
61045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        p_t1t->prev_cmd_rsp_info.rsp_len       = p_cmd_rsp_info->rsp_len;
61145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        p_t1t->prev_cmd_rsp_info.op_code       = p_cmd_rsp_info->opcode;
61245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        p_t1t->prev_cmd_rsp_info.pend_retx_rsp = RW_MAX_RETRIES;
61345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
61445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
61545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (defined (RW_STATS_INCLUDED) && (RW_STATS_INCLUDED == TRUE))
61645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* update failure count */
61745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    rw_main_update_fail_stats ();
61845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif  /* RW_STATS_INCLUDED */
61945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
62045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    rw_event        = rw_t1t_info_to_event (p_cmd_rsp_info);
62145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (p_t1t->state != RW_T1T_STATE_NOT_ACTIVATED)
62245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        rw_t1t_handle_op_complete ();
62345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
62445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    evt_data.status = NFC_STATUS_TIMEOUT;
62545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (rw_event == RW_T2T_NDEF_DETECT_EVT)
62645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
62745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        ndef_data.status    = evt_data.status;
62845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        ndef_data.protocol  = NFC_PROTOCOL_T1T;
62945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        ndef_data.flags     = RW_NDEF_FL_UNKNOWN;
63045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        ndef_data.max_size  = 0;
63145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        ndef_data.cur_size  = 0;
63245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        (*rw_cb.p_cback) (rw_event, (tRW_DATA *) &ndef_data);
63345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
63445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    else
63545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
63645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        evt_data.p_data = NULL;
63745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        (*rw_cb.p_cback) (rw_event, (tRW_DATA *) &evt_data);
63845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
63945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
64045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
64145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*****************************************************************************
64245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
64345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         rw_t1t_handle_presence_check_rsp
64445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
64545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      Handle response to presence check
64645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
64745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          Nothing
64845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
64945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*****************************************************************************/
65045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid rw_t1t_handle_presence_check_rsp (tNFC_STATUS status)
65145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
65245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_READ_DATA   evt_data;
65345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
65445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* Notify, Tag is present or not */
65545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    evt_data.status = status;
65645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    rw_t1t_handle_op_complete ();
65745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
65845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    (*(rw_cb.p_cback)) (RW_T1T_PRESENCE_CHECK_EVT, (tRW_DATA *) &evt_data);
65945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
66045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
66145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*****************************************************************************
66245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
66345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         rw_t1t_handle_op_complete
66445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
66545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      Reset to IDLE state
66645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
66745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          Nothing
66845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
66945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*****************************************************************************/
67045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid rw_t1t_handle_op_complete (void)
67145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
67245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_T1T_CB      *p_t1t  = &rw_cb.tcb.t1t;
67345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
67445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    p_t1t->state    = RW_T1T_STATE_IDLE;
675eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#if (defined (RW_NDEF_INCLUDED) && (RW_NDEF_INCLUDED == TRUE))
67645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    p_t1t->substate = RW_T1T_SUBSTATE_NONE;
677eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#endif
67845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return;
67945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
68045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
68145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*****************************************************************************
68245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
68345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         RW_T1tPresenceCheck
68445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
68545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description
68645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**      Check if the tag is still in the field.
687e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**
68845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**      The RW_T1T_PRESENCE_CHECK_EVT w/ status is used to indicate presence
68945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**      or non-presence.
69045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
69145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns
69245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**      NFC_STATUS_OK, if raw data frame sent
69345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**      NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation
69445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**      NFC_STATUS_FAILED: other error
69545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
69645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*****************************************************************************/
69745faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFC_STATUS RW_T1tPresenceCheck (void)
69845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
69945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tNFC_STATUS retval = NFC_STATUS_OK;
70045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_DATA evt_data;
70145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_CB *p_rw_cb = &rw_cb;
70245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
70345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    RW_TRACE_API0 ("RW_T1tPresenceCheck");
70445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
70545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* If RW_SelectTagType was not called (no conn_callback) return failure */
70645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (!p_rw_cb->p_cback)
70745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
70845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        retval = NFC_STATUS_FAILED;
70945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
71045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* If we are not activated, then RW_T1T_PRESENCE_CHECK_EVT status=FAIL */
71145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    else if (p_rw_cb->tcb.t1t.state == RW_T1T_STATE_NOT_ACTIVATED)
71245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
71345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        evt_data.status = NFC_STATUS_FAILED;
71445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        (*p_rw_cb->p_cback) (RW_T1T_PRESENCE_CHECK_EVT, &evt_data);
71545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
71645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* If command is pending, assume tag is still present */
71745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    else if (p_rw_cb->tcb.t1t.state != RW_T1T_STATE_IDLE)
71845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
71945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        evt_data.status = NFC_STATUS_OK;
72045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        (*p_rw_cb->p_cback) (RW_T1T_PRESENCE_CHECK_EVT, &evt_data);
72145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
72245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    else
72345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
72445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* IDLE state: send a RID command to the tag to see if it responds */
72545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if((retval = rw_t1t_send_static_cmd (T1T_CMD_RID, 0, 0))== NFC_STATUS_OK)
72645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
72745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p_rw_cb->tcb.t1t.state = RW_T1T_STATE_CHECK_PRESENCE;
728e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu        }
72945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
73045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
73145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return (retval);
73245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
73345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
73445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*****************************************************************************
73545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
73645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         RW_T1tRid
73745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
73845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description
739e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu**      This function sends a RID command for Reader/Writer mode.
74045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
74145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns
74245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**      NFC_STATUS_OK, if raw data frame sent
74345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**      NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation
74445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**      NFC_STATUS_FAILED: other error
74545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
74645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*****************************************************************************/
74745faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFC_STATUS RW_T1tRid (void)
74845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
74945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_T1T_CB  *p_t1t  = &rw_cb.tcb.t1t;
75045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tNFC_STATUS status  = NFC_STATUS_FAILED;
75145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
75245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    RW_TRACE_API0 ("RW_T1tRid");
75345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
75445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (p_t1t->state != RW_T1T_STATE_IDLE)
75545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
75645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_WARNING1 ("RW_T1tRid - Busy - State: %u", p_t1t->state);
75745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return (NFC_STATUS_BUSY);
75845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
75945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
76045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* send a RID command */
76145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if((status = rw_t1t_send_static_cmd (T1T_CMD_RID, 0, 0))== NFC_STATUS_OK)
76245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
76345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        p_t1t->state = RW_T1T_STATE_READ;
764e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu    }
76545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
76645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return (status);
76745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
76845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
76945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
77045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
77145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         RW_T1tReadAll
77245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
773e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Description      This function sends a RALL command for Reader/Writer mode.
77445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
77545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          tNFC_STATUS
77645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
77745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
77845faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFC_STATUS RW_T1tReadAll (void)
77945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
78045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_T1T_CB  *p_t1t  = &rw_cb.tcb.t1t;
78145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tNFC_STATUS status  = NFC_STATUS_FAILED;
78245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
78345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    RW_TRACE_API0 ("RW_T1tReadAll");
78445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
78545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (p_t1t->state != RW_T1T_STATE_IDLE)
78645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
78745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_WARNING1 ("RW_T1tReadAll - Busy - State: %u", p_t1t->state);
78845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return (NFC_STATUS_BUSY);
78945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
79045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
79145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* send RALL command */
79245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if ((status = rw_t1t_send_static_cmd (T1T_CMD_RALL, 0, 0)) == NFC_STATUS_OK)
79345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
79445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        p_t1t->state = RW_T1T_STATE_READ;
79545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
796e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu
79745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return status;
79845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
79945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
80045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
80145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
80245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         RW_T1tRead
80345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
804e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Description      This function sends a READ command for Reader/Writer mode.
80545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
80645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          tNFC_STATUS
80745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
80845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
80945faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFC_STATUS RW_T1tRead (UINT8 block, UINT8 byte)
81045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
81145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tNFC_STATUS status  = NFC_STATUS_FAILED;
81245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_T1T_CB  *p_t1t  = &rw_cb.tcb.t1t;
81345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    UINT8       addr;
81445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
81545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (p_t1t->state != RW_T1T_STATE_IDLE)
81645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
81745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_WARNING1 ("RW_T1tRead - Busy - State: %u", p_t1t->state);
81845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return (NFC_STATUS_BUSY);
81945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
82045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
82145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* send READ command */
82245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    RW_T1T_BLD_ADD ((addr), (block), (byte));
82345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if ((status = rw_t1t_send_static_cmd (T1T_CMD_READ, addr, 0)) == NFC_STATUS_OK)
82445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
82545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        p_t1t->state = RW_T1T_STATE_READ;
82645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
82745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return status;
82845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
82945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
83045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
83145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
83245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         RW_T1tWriteErase
83345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
834e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Description      This function sends a WRITE-E command for Reader/Writer mode.
83545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
83645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          tNFC_STATUS
83745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
83845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
83945faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFC_STATUS RW_T1tWriteErase (UINT8 block, UINT8 byte, UINT8 new_byte)
84045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
84145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tNFC_STATUS status  = NFC_STATUS_FAILED;
84245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_T1T_CB  *p_t1t  = &rw_cb.tcb.t1t;
84345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    UINT8       addr;
84445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
84545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (p_t1t->state != RW_T1T_STATE_IDLE)
84645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
84745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_WARNING1 ("RW_T1tWriteErase - Busy - State: %u", p_t1t->state);
84845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return (NFC_STATUS_BUSY);
84945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
85045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (  (p_t1t->tag_attribute == RW_T1_TAG_ATTRB_READ_ONLY)
85145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        &&(block != T1T_CC_BLOCK)
85245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        &&(byte  != T1T_CC_RWA_OFFSET)  )
85345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
85445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_ERROR0 ("RW_T1tWriteErase - Tag is in Read only state");
85545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return (NFC_STATUS_REFUSED);
85645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
85745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (  (block >= T1T_STATIC_BLOCKS)
85845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        ||(byte  >= T1T_BLOCK_SIZE   )  )
85945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
86045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_ERROR2 ("RW_T1tWriteErase - Invalid Block/byte: %u / %u", block, byte);
86145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return (NFC_STATUS_REFUSED);
86245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
86345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if(  (block == T1T_UID_BLOCK)
86445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu       ||(block == T1T_RES_BLOCK)  )
86545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
86645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_WARNING1 ("RW_T1tWriteErase - Cannot write to Locked block: %u", block);
86745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return (NFC_STATUS_REFUSED);
86845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
86945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* send WRITE-E command */
87045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    RW_T1T_BLD_ADD ((addr), (block), (byte));
87145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if ((status = rw_t1t_send_static_cmd (T1T_CMD_WRITE_E, addr, new_byte)) == NFC_STATUS_OK)
87245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
87345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        p_t1t->state = RW_T1T_STATE_WRITE;
87445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (block < T1T_BLOCKS_PER_SEGMENT)
87545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
87645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p_t1t->b_update = FALSE;
87745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p_t1t->b_rseg   = FALSE;
87845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
87945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
88045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return status;
88145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
88245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
88345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
88445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
88545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         RW_T1tWriteNoErase
88645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
887e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Description      This function sends a WRITE-NE command for Reader/Writer mode.
88845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
88945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          tNFC_STATUS
89045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
89145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
89245faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFC_STATUS RW_T1tWriteNoErase (UINT8 block, UINT8 byte, UINT8 new_byte)
89345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
89445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tNFC_STATUS status  = NFC_STATUS_FAILED;
89545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_T1T_CB  *p_t1t  = &rw_cb.tcb.t1t;
89645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    UINT8       addr;
89745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
89845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (p_t1t->state != RW_T1T_STATE_IDLE)
89945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
90045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_WARNING1 ("RW_T1tWriteNoErase - Busy - State: %u", p_t1t->state);
90145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return (NFC_STATUS_BUSY);
90245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
90345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (  (p_t1t->tag_attribute == RW_T1_TAG_ATTRB_READ_ONLY)
90445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        &&(block != T1T_CC_BLOCK)
90545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        &&(byte  != T1T_CC_RWA_OFFSET)  )
90645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
90745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_ERROR0 ("RW_T1tWriteErase - Tag is in Read only state");
90845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return (NFC_STATUS_REFUSED);
90945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
91045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (  (block >= T1T_STATIC_BLOCKS)
91145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        ||(byte  >= T1T_BLOCK_SIZE   )  )
91245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
91345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_ERROR2 ("RW_T1tWriteErase - Invalid Block/byte: %u / %u", block, byte);
91445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return (NFC_STATUS_REFUSED);
91545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
91645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if(  (block == T1T_UID_BLOCK)
91745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu       ||(block == T1T_RES_BLOCK)  )
91845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
91945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_WARNING1 ("RW_T1tWriteNoErase - Cannot write to Locked block: %u", block);
92045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return (NFC_STATUS_REFUSED);
92145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
92245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* send WRITE-NE command */
92345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    RW_T1T_BLD_ADD ((addr), (block), (byte));
92445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if ((status = rw_t1t_send_static_cmd (T1T_CMD_WRITE_NE, addr, new_byte)) == NFC_STATUS_OK)
92545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
92645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        p_t1t->state = RW_T1T_STATE_WRITE;
92745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (block < T1T_BLOCKS_PER_SEGMENT)
92845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
92945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p_t1t->b_update = FALSE;
93045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p_t1t->b_rseg   = FALSE;
93145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
93245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
93345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return status;
93445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
93545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
93645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
93745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
93845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         RW_T1tReadSeg
93945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
940e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Description      This function sends a RSEG command for Reader/Writer mode.
94145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
94245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          tNFC_STATUS
94345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
94445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
94545faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFC_STATUS RW_T1tReadSeg (UINT8 segment)
94645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
94745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tNFC_STATUS status  = NFC_STATUS_FAILED;
94845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_T1T_CB  *p_t1t  = &rw_cb.tcb.t1t;
94945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    UINT8       adds;
95045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
95145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (p_t1t->state != RW_T1T_STATE_IDLE)
95245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
95345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_WARNING1 ("RW_T1tReadSeg - Busy - State: %u", p_t1t->state);
95445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return (NFC_STATUS_BUSY);
95545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
95645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (segment >=  T1T_MAX_SEGMENTS)
95745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
95845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_ERROR1 ("RW_T1tReadSeg - Invalid Segment: %u", segment);
95945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return (NFC_STATUS_REFUSED);
96045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
96145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (rw_cb.tcb.t1t.hr[0] != T1T_STATIC_HR0)
96245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
96345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* send RSEG command */
96445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_T1T_BLD_ADDS ((adds), (segment));
96545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if ((status = rw_t1t_send_dyn_cmd (T1T_CMD_RSEG, adds, NULL)) == NFC_STATUS_OK)
96645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
96745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p_t1t->state = RW_T1T_STATE_READ;
96845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
96945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
97045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return status;
97145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
97245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
97345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
97445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
97545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         RW_T1tRead8
97645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
97745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      This function sends a READ8 command for Reader/Writer mode.
97845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
97945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          tNFC_STATUS
98045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
98145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
98245faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFC_STATUS RW_T1tRead8 (UINT8 block)
98345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
98445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tNFC_STATUS status = NFC_STATUS_FAILED;
98545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_T1T_CB  *p_t1t= &rw_cb.tcb.t1t;
98645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
98745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (p_t1t->state != RW_T1T_STATE_IDLE)
98845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
98945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_WARNING1 ("RW_T1tRead8 - Busy - State: %u", p_t1t->state);
99045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return (NFC_STATUS_BUSY);
99145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
99245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
99345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (rw_cb.tcb.t1t.hr[0] != T1T_STATIC_HR0 || rw_cb.tcb.t1t.hr[1] >= RW_T1T_HR1_MIN)
99445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
99545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* send READ8 command */
99645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if ((status = rw_t1t_send_dyn_cmd (T1T_CMD_READ8, block, NULL)) == NFC_STATUS_OK)
99745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
99845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p_t1t->state = RW_T1T_STATE_READ;
99945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
100045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
100145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return status;
100245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
100345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
100445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
100545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
100645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         RW_T1tWriteErase8
100745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
1008e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Description      This function sends a WRITE-E8 command for Reader/Writer mode.
100945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
101045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          tNFC_STATUS
101145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
101245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
101345faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFC_STATUS RW_T1tWriteErase8 (UINT8 block, UINT8 *p_new_dat)
101445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
101545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_T1T_CB  *p_t1t= &rw_cb.tcb.t1t;
101645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tNFC_STATUS status = NFC_STATUS_FAILED;
101745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
101845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (p_t1t->state != RW_T1T_STATE_IDLE)
101945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
102045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_WARNING1 ("RW_T1tWriteErase8 - Busy - State: %u", p_t1t->state);
102145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return (NFC_STATUS_BUSY);
102245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
102345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
102445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (  (p_t1t->tag_attribute == RW_T1_TAG_ATTRB_READ_ONLY)
102545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        &&(block != T1T_CC_BLOCK)  )
102645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
102745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_ERROR0 ("RW_T1tWriteErase8 - Tag is in Read only state");
102845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return (NFC_STATUS_REFUSED);
102945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
103045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
103145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if(  (block == T1T_UID_BLOCK)
103245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu       ||(block == T1T_RES_BLOCK)  )
103345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
103445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_WARNING1 ("RW_T1tWriteErase8 - Cannot write to Locked block: %u", block);
103545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return (NFC_STATUS_REFUSED);
103645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
103745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
103845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (rw_cb.tcb.t1t.hr[0] != T1T_STATIC_HR0 || rw_cb.tcb.t1t.hr[1] >= RW_T1T_HR1_MIN)
103945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
104045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* send WRITE-E8 command */
104145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if ((status = rw_t1t_send_dyn_cmd (T1T_CMD_WRITE_E8, block, p_new_dat)) == NFC_STATUS_OK)
104245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
104345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p_t1t->state = RW_T1T_STATE_WRITE;
104445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if (block < T1T_BLOCKS_PER_SEGMENT)
104545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
104645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                p_t1t->b_update = FALSE;
104745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                p_t1t->b_rseg   = FALSE;
104845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
104945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
105045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
105145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return status;
105245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
105345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
105445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
105545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
105645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         RW_T1tWriteNoErase8
105745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
1058e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu** Description      This function sends a WRITE-NE8 command for Reader/Writer mode.
105945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
106045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          tNFC_STATUS
106145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
106245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
106345faad0ff5deeb0c676356345d99398cc4ab695aEvan ChutNFC_STATUS RW_T1tWriteNoErase8 (UINT8 block, UINT8 *p_new_dat)
106445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
106545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tNFC_STATUS status = NFC_STATUS_FAILED;
106645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    tRW_T1T_CB  *p_t1t= &rw_cb.tcb.t1t;
106745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
106845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (p_t1t->state != RW_T1T_STATE_IDLE)
106945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
107045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_WARNING1 ("RW_T1tWriteNoErase8 - Busy - State: %u", p_t1t->state);
107145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return (NFC_STATUS_BUSY);
107245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
107345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
107445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (  (p_t1t->tag_attribute == RW_T1_TAG_ATTRB_READ_ONLY)
107545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        &&(block != T1T_CC_BLOCK)  )
107645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
107745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_ERROR0 ("RW_T1tWriteNoErase8 - Tag is in Read only state");
107845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return (NFC_STATUS_REFUSED);
107945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
108045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
108145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if(  (block == T1T_UID_BLOCK)
108245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu       ||(block == T1T_RES_BLOCK)  )
108345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
108445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        RW_TRACE_WARNING1 ("RW_T1tWriteNoErase8 - Cannot write to Locked block: %u", block);
108545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return (NFC_STATUS_REFUSED);
108645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
108745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
108845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (rw_cb.tcb.t1t.hr[0] != T1T_STATIC_HR0 || rw_cb.tcb.t1t.hr[1] >= RW_T1T_HR1_MIN)
108945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
109045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        /* send WRITE-NE command */
109145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if ((status = rw_t1t_send_dyn_cmd (T1T_CMD_WRITE_NE8, block, p_new_dat)) == NFC_STATUS_OK)
109245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
109345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            p_t1t->state    = RW_T1T_STATE_WRITE;
109445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if (block < T1T_BLOCKS_PER_SEGMENT)
109545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
109645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                p_t1t->b_update = FALSE;
109745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                p_t1t->b_rseg   = FALSE;
109845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
109945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
110045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
110145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return status;
110245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
110345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
110445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if (BT_TRACE_VERBOSE == TRUE)
110545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
110645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
110745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function         rw_t1t_get_state_name
110845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
110945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description      This function returns the state name.
111045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
111145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** NOTE             conditionally compiled to save memory.
111245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
111345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns          pointer to the name
111445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
111545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
111645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chustatic char *rw_t1t_get_state_name (UINT8 state)
111745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
111845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    switch (state)
111945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
112045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case RW_T1T_STATE_IDLE:
112145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return ("IDLE");
112245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case RW_T1T_STATE_NOT_ACTIVATED:
112345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return ("NOT_ACTIVATED");
112445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case RW_T1T_STATE_READ:
112545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return ("APP_READ");
112645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case RW_T1T_STATE_WRITE:
112745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return ("APP_WRITE");
112845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case RW_T1T_STATE_TLV_DETECT:
112945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return ("TLV_DETECTION");
113045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case RW_T1T_STATE_READ_NDEF:
113145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return ("READING_NDEF");
113245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case RW_T1T_STATE_WRITE_NDEF:
113345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return ("WRITING_NDEF");
113445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case RW_T1T_STATE_SET_TAG_RO:
113545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return ("SET_TAG_RO");
113645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case RW_T1T_STATE_CHECK_PRESENCE:
113745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return ("CHECK_PRESENCE");
113845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case RW_T1T_STATE_FORMAT_TAG:
113945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return ("FORMAT_TAG");
114045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    default:
114145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return ("???? UNKNOWN STATE");
114245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
114345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
114445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
114545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif /* (BT_TRACE_VERBOSE == TRUE) */
114645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
114745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif /* (NFC_INCLUDED == TRUE) */
1148