1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu *  Copyright (C) 2010-2014 Broadcom Corporation
4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  you may not use this file except in compliance with the License.
7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  You may obtain a copy of the License at:
8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  See the License for the specific language governing permissions and
15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  limitations under the License.
16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  This file contains the implementation for Type 1 tag in Reader/Writer
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  mode.
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h>
26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_target.h"
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "gki.h"
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nci_hmsgs.h"
306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfc_api.h"
316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfc_int.h"
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "rw_api.h"
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "rw_int.h"
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Local Functions */
366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic tRW_EVENT rw_t1t_handle_rid_rsp(NFC_HDR* p_pkt);
376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t1t_data_cback(uint8_t conn_id, tNFC_CONN_EVT event,
386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                              tNFC_CONN* p_data);
396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t1t_process_frame_error(void);
406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t1t_process_error(void);
416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t1t_handle_presence_check_rsp(tNFC_STATUS status);
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic char* rw_t1t_get_state_name(uint8_t state);
446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic char* rw_t1t_get_sub_state_name(uint8_t sub_state);
456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic char* rw_t1t_get_event_name(uint8_t event);
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_data_cback
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This callback function handles data from NFCC.
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t1t_data_cback(uint8_t conn_id, tNFC_CONN_EVT event,
586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                              tNFC_CONN* p_data) {
596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_EVENT rw_event = RW_RAW_FRAME_EVT;
616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  bool b_notify = true;
626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_DATA evt_data;
636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_pkt;
646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tT1T_CMD_RSP_INFO* p_cmd_rsp_info =
666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (tT1T_CMD_RSP_INFO*)rw_cb.tcb.t1t.p_cmd_rsp_info;
675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#if (BT_TRACE_VERBOSE == TRUE)
686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t begin_state = p_t1t->state;
695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#endif
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_pkt = (NFC_HDR*)(p_data->data.p_data);
726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_pkt == NULL) return;
736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Assume the data is just the response byte sequence */
746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_pkt + 1) + p_pkt->offset;
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_DEBUG2("rw_t1t_data_cback (): state:%s (%d)",
786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  rw_t1t_get_state_name(p_t1t->state), p_t1t->state);
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_DEBUG1("rw_t1t_data_cback (): state=%d", p_t1t->state);
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  evt_data.status = NFC_STATUS_OK;
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_t1t->state == RW_T1T_STATE_IDLE) || (!p_cmd_rsp_info)) {
866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* If previous command was retransmitted and if response is pending to
876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * previous command retransmission,
886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * check if lenght and ADD/ADD8/ADDS field matches the expected value of
896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * previous
906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * retransmited command response. However, ignore ADD field if the command
916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * was RALL/RID
926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     */
936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((p_t1t->prev_cmd_rsp_info.pend_retx_rsp) &&
946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (p_t1t->prev_cmd_rsp_info.rsp_len == p_pkt->len) &&
956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        ((p_t1t->prev_cmd_rsp_info.op_code == T1T_CMD_RID) ||
966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         (p_t1t->prev_cmd_rsp_info.op_code == T1T_CMD_RALL) ||
976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         (p_t1t->prev_cmd_rsp_info.addr == *p))) {
986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Response to previous command retransmission */
996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      RW_TRACE_ERROR2(
1006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "T1T Response to previous command in Idle state. command=0x%02x, "
1016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "Remaining max retx rsp:0x%02x ",
1026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_t1t->prev_cmd_rsp_info.op_code,
1036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_t1t->prev_cmd_rsp_info.pend_retx_rsp - 1);
1046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->prev_cmd_rsp_info.pend_retx_rsp--;
1056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      GKI_freebuf(p_pkt);
1066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
1076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Raw frame event */
1086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.data.p_data = p_pkt;
1096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (*rw_cb.p_cback)(RW_T1T_RAW_FRAME_EVT, (tRW_DATA*)&evt_data);
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return;
1126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
114303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE)
1156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Update rx stats */
1166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  rw_main_update_rx_stats(p_pkt->len);
1176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */
1186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_pkt->len != p_cmd_rsp_info->rsp_len) ||
1206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ((p_cmd_rsp_info->opcode != T1T_CMD_RALL) &&
1216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       (p_cmd_rsp_info->opcode != T1T_CMD_RID) && (*p != p_t1t->addr)))
1226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  {
1246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* If previous command was retransmitted and if response is pending to
1256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * previous command retransmission,
1266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * then check if lenght and ADD/ADD8/ADDS field matches the expected value
1276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * of previous
1286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * retransmited command response. However, ignore ADD field if the command
1296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * was RALL/RID
1306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     */
1316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((p_t1t->prev_cmd_rsp_info.pend_retx_rsp) &&
1326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (p_t1t->prev_cmd_rsp_info.rsp_len == p_pkt->len) &&
1336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        ((p_t1t->prev_cmd_rsp_info.op_code == T1T_CMD_RID) ||
1346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         (p_t1t->prev_cmd_rsp_info.op_code == T1T_CMD_RALL) ||
1356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         (p_t1t->prev_cmd_rsp_info.addr == *p))) {
1366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      RW_TRACE_ERROR2(
1376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "T1T Response to previous command. command=0x%02x, Remaining max "
1386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "retx rsp:0x%02x",
1396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_t1t->prev_cmd_rsp_info.op_code,
1406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_t1t->prev_cmd_rsp_info.pend_retx_rsp - 1);
1416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->prev_cmd_rsp_info.pend_retx_rsp--;
1426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
1436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Stop timer as some response to current command is received */
1446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_stop_quick_timer(&p_t1t->timer);
1456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi/* Retrasmit the last sent command if retry-count < max retry */
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
1476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      RW_TRACE_ERROR2("T1T Frame error. state=%s command (opcode) = 0x%02x",
1486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      rw_t1t_get_state_name(p_t1t->state),
1496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      p_cmd_rsp_info->opcode);
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
1516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      RW_TRACE_ERROR2("T1T Frame error. state=0x%02x command = 0x%02x ",
1526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      p_t1t->state, p_cmd_rsp_info->opcode);
153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_t1t_process_frame_error();
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_freebuf(p_pkt);
1576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return;
1586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Stop timer as response to current command is received */
1616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfc_stop_quick_timer(&p_t1t->timer);
162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_EVENT2("RW RECV [%s]:0x%x RSP", t1t_info_to_str(p_cmd_rsp_info),
1646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  p_cmd_rsp_info->opcode);
165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If we did not receive response to all retransmitted previous command,
1676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi   * dont expect that as response have come for the current command itself.
1686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi   */
1696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->prev_cmd_rsp_info.pend_retx_rsp)
1706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    memset(&(p_t1t->prev_cmd_rsp_info), 0, sizeof(tRW_T1T_PREV_CMD_RSP_INFO));
171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.cur_retry) {
1736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* If the current command was retransmitted to get this response, we might
1746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       get
1756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       response later to all or some of the retrasnmission of the current
1766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       command
177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project     */
1786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->prev_cmd_rsp_info.addr = ((p_cmd_rsp_info->opcode != T1T_CMD_RALL) &&
1796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                     (p_cmd_rsp_info->opcode != T1T_CMD_RID))
1806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                        ? p_t1t->addr
1816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                        : 0;
1826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->prev_cmd_rsp_info.rsp_len = p_cmd_rsp_info->rsp_len;
1836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->prev_cmd_rsp_info.op_code = p_cmd_rsp_info->opcode;
1846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->prev_cmd_rsp_info.pend_retx_rsp = (uint8_t)rw_cb.cur_retry;
1856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  rw_cb.cur_retry = 0;
1886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_cmd_rsp_info->opcode == T1T_CMD_RID) {
1906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_event = rw_t1t_handle_rid_rsp(p_pkt);
1916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
1926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_event =
1936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_t1t_handle_rsp(p_cmd_rsp_info, &b_notify, p, &evt_data.status);
1946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (b_notify) {
1976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((p_t1t->state != RW_T1T_STATE_READ) &&
1986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (p_t1t->state != RW_T1T_STATE_WRITE)) {
1996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      GKI_freebuf(p_pkt);
2006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.data.p_data = NULL;
2016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
2026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.data.p_data = p_pkt;
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_t1t_handle_op_complete();
2056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    (*rw_cb.p_cback)(rw_event, (tRW_DATA*)&evt_data);
2066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else
2076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_freebuf(p_pkt);
2085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
2095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#if (BT_TRACE_VERBOSE == TRUE)
2106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (begin_state != p_t1t->state) {
2116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_DEBUG2("RW T1T state changed:<%s> -> <%s>",
2126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    rw_t1t_get_state_name(begin_state),
2136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    rw_t1t_get_state_name(p_t1t->state));
2146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#endif
216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_conn_cback
221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This callback function receives the events/data from NFCC.
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t1t_conn_cback(uint8_t conn_id, tNFC_CONN_EVT event,
2286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                       tNFC_CONN* p_data) {
2296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
2306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_READ_DATA evt_data;
2316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_DEBUG2("rw_t1t_conn_cback: conn_id=%i, evt=0x%x", conn_id, event);
2336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Only handle static conn_id */
2346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (conn_id != NFC_RF_CONN_ID) {
2356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("rw_t1t_conn_cback - Not static connection id: =%i",
2366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      conn_id);
2376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return;
2386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (event) {
241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_CONN_CREATE_CEVT:
242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_CONN_CLOSE_CEVT:
2436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_DEACTIVATE_CEVT:
246303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE)
2476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Display stats */
2486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_main_log_stats();
2496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */
250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Stop t1t timer (if started) */
2526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_stop_quick_timer(&p_t1t->timer);
2536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Free cmd buf for retransmissions */
2556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_t1t->p_cur_cmd_buf) {
2566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_freebuf(p_t1t->p_cur_cmd_buf);
2576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_t1t->p_cur_cmd_buf = NULL;
2586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
2596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->state = RW_T1T_STATE_NOT_ACTIVATED;
2616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NFC_SetStaticRfCback(NULL);
2626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_DATA_CEVT:
2656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_data != NULL) {
2666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (p_data->data.status == NFC_STATUS_OK) {
2676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          rw_t1t_data_cback(conn_id, event, p_data);
2686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          break;
2696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else if (p_data->data.p_data != NULL) {
2706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* Free the response buffer in case of error response */
2716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          GKI_freebuf((NFC_HDR*)(p_data->data.p_data));
2726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_data->data.p_data = NULL;
273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
2756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Data event with error status...fall through to NFC_ERROR_CEVT case */
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_ERROR_CEVT:
2786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((p_t1t->state == RW_T1T_STATE_NOT_ACTIVATED) ||
2796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (p_t1t->state == RW_T1T_STATE_IDLE)) {
280303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE)
2816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_main_update_trans_error_stats();
2826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */
283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (event == NFC_ERROR_CEVT)
2856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          evt_data.status = (tNFC_STATUS)(*(uint8_t*)p_data);
2866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        else if (p_data)
2876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          evt_data.status = p_data->status;
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
2896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          evt_data.status = NFC_STATUS_FAILED;
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        evt_data.p_data = NULL;
2926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (*rw_cb.p_cback)(RW_T1T_INTF_ERROR_EVT, (tRW_DATA*)&evt_data);
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
2956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_stop_quick_timer(&p_t1t->timer);
296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (RW_STATS_INCLUDED == TRUE)
2986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_main_update_trans_error_stats();
2996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */
3006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_t1t->state == RW_T1T_STATE_CHECK_PRESENCE) {
3026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_t1t_handle_presence_check_rsp(NFC_STATUS_FAILED);
3036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
3046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_t1t_process_error();
3056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
3066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
3076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    default:
3096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
3106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_send_static_cmd
316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function composes a Type 1 Tag command for static
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  memory and send through NCI to NFCC.
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if the command is successfuly sent to NCI
321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  otherwise, error status
322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3246fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t1t_send_static_cmd(uint8_t opcode, uint8_t add, uint8_t dat) {
3256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
3266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
3276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  const tT1T_CMD_RSP_INFO* p_cmd_rsp_info = t1t_cmd_to_rsp_info(opcode);
3286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_data;
3296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
3306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_cmd_rsp_info) {
3326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* a valid opcode for RW */
3336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_data = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
3346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_data) {
3356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->p_cmd_rsp_info = (tT1T_CMD_RSP_INFO*)p_cmd_rsp_info;
3366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->addr = add;
3376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_data->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
3386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p = (uint8_t*)(p_data + 1) + p_data->offset;
3396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      UINT8_TO_BE_STREAM(p, opcode);
3406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      UINT8_TO_BE_STREAM(p, add);
3416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      UINT8_TO_BE_STREAM(p, dat);
3426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ARRAY_TO_STREAM(p, p_t1t->mem, T1T_CMD_UID_LEN);
3446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_data->len = p_cmd_rsp_info->cmd_len;
3456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Indicate first attempt to send command, back up cmd buffer in case
3476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       * needed for retransmission */
3486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_cb.cur_retry = 0;
3496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      memcpy(p_t1t->p_cur_cmd_buf, p_data,
3506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             sizeof(NFC_HDR) + p_data->offset + p_data->len);
351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
352303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE)
3536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Update stats */
3546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_main_update_tx_stats(p_data->len, false);
3556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */
3566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      RW_TRACE_EVENT2("RW SENT [%s]:0x%x CMD", t1t_info_to_str(p_cmd_rsp_info),
3586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      p_cmd_rsp_info->opcode);
3590c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi      status = NFC_SendData(NFC_RF_CONN_ID, p_data);
3600c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi      if (status == NFC_STATUS_OK) {
3616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfc_start_quick_timer(
3626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            &p_t1t->timer, NFC_TTYPE_RW_T1T_RESPONSE,
3636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (RW_T1T_TOUT_RESP * QUICK_TIMER_TICKS_PER_SEC) / 1000);
3646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
3656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
3666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      status = NFC_STATUS_NO_BUFFERS;
367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
3686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_send_dyn_cmd
375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
376552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      This function composes a Type 1 Tag command for dynamic
377552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  memory and send through NCI to NFCC.
378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if the command is successfuly sent to NCI
380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  otherwise, error status
381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3836fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t1t_send_dyn_cmd(uint8_t opcode, uint8_t add, uint8_t* p_dat) {
3846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
3856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
3866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  const tT1T_CMD_RSP_INFO* p_cmd_rsp_info = t1t_cmd_to_rsp_info(opcode);
3876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_data;
3886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
3896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_cmd_rsp_info) {
3916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* a valid opcode for RW */
3926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_data = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
3936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_data) {
3946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->p_cmd_rsp_info = (tT1T_CMD_RSP_INFO*)p_cmd_rsp_info;
3956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->addr = add;
3966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_data->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
3976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p = (uint8_t*)(p_data + 1) + p_data->offset;
3986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      UINT8_TO_BE_STREAM(p, opcode);
3996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      UINT8_TO_BE_STREAM(p, add);
4006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_dat) {
4026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        ARRAY_TO_STREAM(p, p_dat, 8);
4036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
4046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        memset(p, 0, 8);
4056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p += 8;
4066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
4076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ARRAY_TO_STREAM(p, p_t1t->mem, T1T_CMD_UID_LEN);
4086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_data->len = p_cmd_rsp_info->cmd_len;
4096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Indicate first attempt to send command, back up cmd buffer in case
4116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       * needed for retransmission */
4126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_cb.cur_retry = 0;
4136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      memcpy(p_t1t->p_cur_cmd_buf, p_data,
4146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             sizeof(NFC_HDR) + p_data->offset + p_data->len);
415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
416303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE)
4176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Update stats */
4186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_main_update_tx_stats(p_data->len, false);
4196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */
4206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      RW_TRACE_EVENT2("RW SENT [%s]:0x%x CMD", t1t_info_to_str(p_cmd_rsp_info),
4226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      p_cmd_rsp_info->opcode);
4236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4240c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi      status = NFC_SendData(NFC_RF_CONN_ID, p_data);
4250c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi      if (status == NFC_STATUS_OK) {
4266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfc_start_quick_timer(
4276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            &p_t1t->timer, NFC_TTYPE_RW_T1T_RESPONSE,
4286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (RW_T1T_TOUT_RESP * QUICK_TIMER_TICKS_PER_SEC) / 1000);
4296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
4306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
4316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      status = NFC_STATUS_NO_BUFFERS;
432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
4336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
4346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_handle_rid_rsp
440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Handles response to RID: Collects HR, UID, notify up the
442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  stack
443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          event to notify application
445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
4476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic tRW_EVENT rw_t1t_handle_rid_rsp(NFC_HDR* p_pkt) {
4486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
4496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_DATA evt_data;
4506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p_rid_rsp;
4516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  evt_data.status = NFC_STATUS_OK;
4536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  evt_data.data.p_data = p_pkt;
4546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Assume the data is just the response byte sequence */
4566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_rid_rsp = (uint8_t*)(p_pkt + 1) + p_pkt->offset;
4576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Response indicates tag is present */
4596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state == RW_T1T_STATE_CHECK_PRESENCE) {
4606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* If checking for the presence of the tag then just notify */
4616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return RW_T1T_PRESENCE_CHECK_EVT;
4626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Extract HR and UID from response */
4656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  STREAM_TO_ARRAY(p_t1t->hr, p_rid_rsp, T1T_HR_LEN);
466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
4686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_DEBUG2("hr0:0x%x, hr1:0x%x", p_t1t->hr[0], p_t1t->hr[1]);
4696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_DEBUG4("rw_t1t_handle_rid_rsp (): UID0-3=%02x%02x%02x%02x",
4706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  p_rid_rsp[0], p_rid_rsp[1], p_rid_rsp[2], p_rid_rsp[3]);
471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
4726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_DEBUG0("rw_t1t_handle_rid_rsp ()");
473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Fetch UID0-3 from RID response message */
4766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  STREAM_TO_ARRAY(p_t1t->mem, p_rid_rsp, T1T_CMD_UID_LEN);
477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Notify RID response Event */
4796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return RW_T1T_RID_EVT;
480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_select
485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function will set the callback function to
487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  receive data from lower layers and also send rid command
488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
4926fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t1t_select(uint8_t hr[T1T_HR_LEN],
4936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                          uint8_t uid[T1T_CMD_UID_LEN]) {
4946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
4956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
4966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_t1t->state = RW_T1T_STATE_NOT_ACTIVATED;
4986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Alloc cmd buf for retransmissions */
5006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->p_cur_cmd_buf == NULL) {
5010c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    p_t1t->p_cur_cmd_buf = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
5020c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    if (p_t1t->p_cur_cmd_buf == NULL) {
5036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      RW_TRACE_ERROR0(
5046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "rw_t1t_select: unable to allocate buffer for retransmission");
5056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return status;
506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
5076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  memcpy(p_t1t->hr, hr, T1T_HR_LEN);
5106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  memcpy(p_t1t->mem, uid, T1T_CMD_UID_LEN);
511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_SetStaticRfCback(rw_t1t_conn_cback);
513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_t1t->state = RW_T1T_STATE_IDLE;
515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return NFC_STATUS_OK;
517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_process_timeout
522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      process timeout event
524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t1t_process_timeout(TIMER_LIST_ENT* p_tle) {
5296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
5326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_ERROR2("T1T timeout. state=%s command (opcode)=0x%02x ",
5336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  rw_t1t_get_state_name(p_t1t->state),
5346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  (rw_cb.tcb.t1t.p_cmd_rsp_info)->opcode);
535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
5366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_ERROR2("T1T timeout. state=0x%02x command=0x%02x ", p_t1t->state,
5376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  (rw_cb.tcb.t1t.p_cmd_rsp_info)->opcode);
538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state == RW_T1T_STATE_CHECK_PRESENCE) {
5416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Tag has moved from range */
5426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_t1t_handle_presence_check_rsp(NFC_STATUS_FAILED);
5436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (p_t1t->state != RW_T1T_STATE_IDLE) {
5446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_t1t_process_error();
5456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_process_frame_error
551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process frame crc error
553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t1t_process_frame_error(void) {
558303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE)
5596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Update stats */
5606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  rw_main_update_crc_error_stats();
5616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */
562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Process the error */
5646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  rw_t1t_process_error();
565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_process_error
570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      process timeout event
572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t1t_process_error(void) {
5776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_READ_DATA evt_data;
5786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_EVENT rw_event;
5796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_cmd_buf;
5806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
5816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tT1T_CMD_RSP_INFO* p_cmd_rsp_info =
5826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (tT1T_CMD_RSP_INFO*)rw_cb.tcb.t1t.p_cmd_rsp_info;
5836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_DETECT_NDEF_DATA ndef_data;
5846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_DEBUG1("rw_t1t_process_error () State: %u", p_t1t->state);
5866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Retry sending command if retry-count < max */
5886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.cur_retry < RW_MAX_RETRIES) {
5896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* retry sending the command */
5906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.cur_retry++;
5916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_DEBUG2("T1T retransmission attempt %i of %i", rw_cb.cur_retry,
5936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    RW_MAX_RETRIES);
5946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* allocate a new buffer for message */
5960c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    p_cmd_buf = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
5970c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    if (p_cmd_buf != NULL) {
5986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      memcpy(p_cmd_buf, p_t1t->p_cur_cmd_buf,
5996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             sizeof(NFC_HDR) + p_t1t->p_cur_cmd_buf->offset +
6006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                 p_t1t->p_cur_cmd_buf->len);
601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
602303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE)
6036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Update stats */
6046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_main_update_tx_stats(p_cmd_buf->len, true);
6056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */
6066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (NFC_SendData(NFC_RF_CONN_ID, p_cmd_buf) == NFC_STATUS_OK) {
6086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* Start timer for waiting for response */
6096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfc_start_quick_timer(
6106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            &p_t1t->timer, NFC_TTYPE_RW_T1T_RESPONSE,
6116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (RW_T1T_TOUT_RESP * QUICK_TIMER_TICKS_PER_SEC) / 1000);
6126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        return;
6146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
6166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* we might get response later to all or some of the retrasnmission
618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project     * of the current command, update previous command response information */
6196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_DEBUG1("T1T maximum retransmission attempts reached (%i)",
6206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    RW_MAX_RETRIES);
6216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->prev_cmd_rsp_info.addr = ((p_cmd_rsp_info->opcode != T1T_CMD_RALL) &&
6226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                     (p_cmd_rsp_info->opcode != T1T_CMD_RID))
6236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                        ? p_t1t->addr
6246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                        : 0;
6256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->prev_cmd_rsp_info.rsp_len = p_cmd_rsp_info->rsp_len;
6266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->prev_cmd_rsp_info.op_code = p_cmd_rsp_info->opcode;
6276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->prev_cmd_rsp_info.pend_retx_rsp = RW_MAX_RETRIES;
6286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
630303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE)
6316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* update failure count */
6326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  rw_main_update_fail_stats();
6336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */
6346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  rw_event = rw_t1t_info_to_event(p_cmd_rsp_info);
6366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state != RW_T1T_STATE_NOT_ACTIVATED) rw_t1t_handle_op_complete();
6376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  evt_data.status = NFC_STATUS_TIMEOUT;
6396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_event == RW_T2T_NDEF_DETECT_EVT) {
6406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ndef_data.status = evt_data.status;
6416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ndef_data.protocol = NFC_PROTOCOL_T1T;
6426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ndef_data.flags = RW_NDEF_FL_UNKNOWN;
6436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ndef_data.max_size = 0;
6446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ndef_data.cur_size = 0;
6456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    (*rw_cb.p_cback)(rw_event, (tRW_DATA*)&ndef_data);
6466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
6476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.p_data = NULL;
6486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    (*rw_cb.p_cback)(rw_event, (tRW_DATA*)&evt_data);
6496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_handle_presence_check_rsp
655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Handle response to presence check
657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          Nothing
659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
6616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t1t_handle_presence_check_rsp(tNFC_STATUS status) {
6626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_READ_DATA evt_data;
663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Notify, Tag is present or not */
6656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  evt_data.status = status;
6666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  rw_t1t_handle_op_complete();
667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  (*(rw_cb.p_cback))(RW_T1T_PRESENCE_CHECK_EVT, (tRW_DATA*)&evt_data);
669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_handle_op_complete
674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Reset to IDLE state
676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          Nothing
678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
6806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t1t_handle_op_complete(void) {
6816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_t1t->state = RW_T1T_STATE_IDLE;
684303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_NDEF_INCLUDED == TRUE)
6856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state != RW_T1T_STATE_READ_NDEF) {
6866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->b_update = false;
6876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->b_rseg = false;
6886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_t1t->substate = RW_T1T_SUBSTATE_NONE;
690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
6916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return;
692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tPresenceCheck
697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description
699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      Check if the tag is still in the field.
700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      The RW_T1T_PRESENCE_CHECK_EVT w/ status is used to indicate presence
702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      or non-presence.
703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns
705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      NFC_STATUS_OK, if raw data frame sent
706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation
707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      NFC_STATUS_FAILED: other error
708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
7106fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T1tPresenceCheck(void) {
7116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS retval = NFC_STATUS_OK;
7126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_DATA evt_data;
7136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_CB* p_rw_cb = &rw_cb;
7146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_API0("RW_T1tPresenceCheck");
7166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If RW_SelectTagType was not called (no conn_callback) return failure */
7186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_rw_cb->p_cback) {
7196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    retval = NFC_STATUS_FAILED;
7206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
7216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If we are not activated, then RW_T1T_PRESENCE_CHECK_EVT status=FAIL */
7226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else if (p_rw_cb->tcb.t1t.state == RW_T1T_STATE_NOT_ACTIVATED) {
7236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.status = NFC_STATUS_FAILED;
7246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    (*p_rw_cb->p_cback)(RW_T1T_PRESENCE_CHECK_EVT, &evt_data);
7256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
7266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If command is pending, assume tag is still present */
7276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else if (p_rw_cb->tcb.t1t.state != RW_T1T_STATE_IDLE) {
7286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.status = NFC_STATUS_OK;
7296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    (*p_rw_cb->p_cback)(RW_T1T_PRESENCE_CHECK_EVT, &evt_data);
7306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
7316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* IDLE state: send a RID command to the tag to see if it responds */
7320c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    retval = rw_t1t_send_static_cmd(T1T_CMD_RID, 0, 0);
7330c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    if (retval == NFC_STATUS_OK) {
7346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_rw_cb->tcb.t1t.state = RW_T1T_STATE_CHECK_PRESENCE;
735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
7366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (retval);
739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tRid
744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description
746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      This function sends a RID command for Reader/Writer mode.
747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns
749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      NFC_STATUS_OK, if raw data frame sent
750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation
751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      NFC_STATUS_FAILED: other error
752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
7546fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T1tRid(void) {
7556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
7566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_API0("RW_T1tRid");
759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state != RW_T1T_STATE_IDLE) {
7616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tRid - Busy - State: %u", p_t1t->state);
7626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_BUSY);
7636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* send a RID command */
7660c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  status = rw_t1t_send_static_cmd(T1T_CMD_RID, 0, 0);
7670c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  if (status == NFC_STATUS_OK) {
7686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->state = RW_T1T_STATE_READ;
7696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (status);
772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tReadAll
777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function sends a RALL command for Reader/Writer mode.
779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
7836fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T1tReadAll(void) {
7846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
7856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_API0("RW_T1tReadAll");
788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state != RW_T1T_STATE_IDLE) {
7906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tReadAll - Busy - State: %u", p_t1t->state);
7916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_BUSY);
7926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* send RALL command */
7950c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  status = rw_t1t_send_static_cmd(T1T_CMD_RALL, 0, 0);
7960c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  if (status == NFC_STATUS_OK) {
7976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->state = RW_T1T_STATE_READ;
7986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tRead
806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function sends a READ command for Reader/Writer mode.
808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
8126fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T1tRead(uint8_t block, uint8_t byte) {
8136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
8146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
8156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t addr;
8166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state != RW_T1T_STATE_IDLE) {
8186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tRead - Busy - State: %u", p_t1t->state);
8196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_BUSY);
8206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* send READ command */
8236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_T1T_BLD_ADD((addr), (block), (byte));
8240c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  status = rw_t1t_send_static_cmd(T1T_CMD_READ, addr, 0);
8250c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  if (status == NFC_STATUS_OK) {
8266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->state = RW_T1T_STATE_READ;
8276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tWriteErase
834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
835552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      This function sends a WRITE-E command for Reader/Writer
836552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  mode.
837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
8416fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T1tWriteErase(uint8_t block, uint8_t byte, uint8_t new_byte) {
8426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
8436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
8446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t addr;
8456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state != RW_T1T_STATE_IDLE) {
8476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tWriteErase - Busy - State: %u", p_t1t->state);
8486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_BUSY);
8496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_t1t->tag_attribute == RW_T1_TAG_ATTRB_READ_ONLY) &&
8516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (block != T1T_CC_BLOCK) && (byte != T1T_CC_RWA_OFFSET)) {
8526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_ERROR0("RW_T1tWriteErase - Tag is in Read only state");
8536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_REFUSED);
8546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((block >= T1T_STATIC_BLOCKS) || (byte >= T1T_BLOCK_SIZE)) {
8566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_ERROR2("RW_T1tWriteErase - Invalid Block/byte: %u / %u", block,
8576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    byte);
8586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_REFUSED);
8596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((block == T1T_UID_BLOCK) || (block == T1T_RES_BLOCK)) {
8616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tWriteErase - Cannot write to Locked block: %u",
8626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      block);
8636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_REFUSED);
8646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* send WRITE-E command */
8666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_T1T_BLD_ADD((addr), (block), (byte));
8670c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  status = rw_t1t_send_static_cmd(T1T_CMD_WRITE_E, addr, new_byte);
8680c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  if (status == NFC_STATUS_OK) {
8696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->state = RW_T1T_STATE_WRITE;
8706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (block < T1T_BLOCKS_PER_SEGMENT) {
8716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->b_update = false;
8726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->b_rseg = false;
873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
8746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tWriteNoErase
881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
882552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      This function sends a WRITE-NE command for Reader/Writer
883552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  mode.
884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
8886fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T1tWriteNoErase(uint8_t block, uint8_t byte, uint8_t new_byte) {
8896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
8906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
8916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t addr;
8926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state != RW_T1T_STATE_IDLE) {
8946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tWriteNoErase - Busy - State: %u", p_t1t->state);
8956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_BUSY);
8966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_t1t->tag_attribute == RW_T1_TAG_ATTRB_READ_ONLY) &&
8986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (block != T1T_CC_BLOCK) && (byte != T1T_CC_RWA_OFFSET)) {
8996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_ERROR0("RW_T1tWriteErase - Tag is in Read only state");
9006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_REFUSED);
9016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((block >= T1T_STATIC_BLOCKS) || (byte >= T1T_BLOCK_SIZE)) {
9036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_ERROR2("RW_T1tWriteErase - Invalid Block/byte: %u / %u", block,
9046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    byte);
9056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_REFUSED);
9066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((block == T1T_UID_BLOCK) || (block == T1T_RES_BLOCK)) {
9086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tWriteNoErase - Cannot write to Locked block: %u",
9096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      block);
9106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_REFUSED);
9116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* send WRITE-NE command */
9136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_T1T_BLD_ADD((addr), (block), (byte));
9140c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  status = rw_t1t_send_static_cmd(T1T_CMD_WRITE_NE, addr, new_byte);
9150c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  if (status == NFC_STATUS_OK) {
9166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->state = RW_T1T_STATE_WRITE;
9176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (block < T1T_BLOCKS_PER_SEGMENT) {
9186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->b_update = false;
9196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->b_rseg = false;
920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
9216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tReadSeg
928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function sends a RSEG command for Reader/Writer mode.
930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
9346fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T1tReadSeg(uint8_t segment) {
9356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
9366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
9376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t adds;
9386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
9396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state != RW_T1T_STATE_IDLE) {
9406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tReadSeg - Busy - State: %u", p_t1t->state);
9416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_BUSY);
9426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (segment >= T1T_MAX_SEGMENTS) {
9446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_ERROR1("RW_T1tReadSeg - Invalid Segment: %u", segment);
9456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_REFUSED);
9466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.t1t.hr[0] != T1T_STATIC_HR0) {
9486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* send RSEG command */
9496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_T1T_BLD_ADDS((adds), (segment));
9500c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    status = rw_t1t_send_dyn_cmd(T1T_CMD_RSEG, adds, NULL);
9510c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    if (status == NFC_STATUS_OK) {
9526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->state = RW_T1T_STATE_READ;
953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
9546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tRead8
961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function sends a READ8 command for Reader/Writer mode.
963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
9676fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T1tRead8(uint8_t block) {
9686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
9696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
9706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
9716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state != RW_T1T_STATE_IDLE) {
9726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tRead8 - Busy - State: %u", p_t1t->state);
9736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_BUSY);
9746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
9766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.t1t.hr[0] != T1T_STATIC_HR0 ||
9776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_cb.tcb.t1t.hr[1] >= RW_T1T_HR1_MIN) {
9786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* send READ8 command */
9790c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    status = rw_t1t_send_dyn_cmd(T1T_CMD_READ8, block, NULL);
9800c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    if (status == NFC_STATUS_OK) {
9816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->state = RW_T1T_STATE_READ;
982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
9836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tWriteErase8
990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
991552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      This function sends a WRITE-E8 command for Reader/Writer
992552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  mode.
993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
9976fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T1tWriteErase8(uint8_t block, uint8_t* p_new_dat) {
9986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
9996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
10006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state != RW_T1T_STATE_IDLE) {
10026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tWriteErase8 - Busy - State: %u", p_t1t->state);
10036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_BUSY);
10046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_t1t->tag_attribute == RW_T1_TAG_ATTRB_READ_ONLY) &&
10076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (block != T1T_CC_BLOCK)) {
10086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_ERROR0("RW_T1tWriteErase8 - Tag is in Read only state");
10096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_REFUSED);
10106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((block == T1T_UID_BLOCK) || (block == T1T_RES_BLOCK)) {
10136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tWriteErase8 - Cannot write to Locked block: %u",
10146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      block);
10156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_REFUSED);
10166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.t1t.hr[0] != T1T_STATIC_HR0 ||
10196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_cb.tcb.t1t.hr[1] >= RW_T1T_HR1_MIN) {
10206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* send WRITE-E8 command */
10210c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    status = rw_t1t_send_dyn_cmd(T1T_CMD_WRITE_E8, block, p_new_dat);
10220c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    if (status == NFC_STATUS_OK) {
10236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->state = RW_T1T_STATE_WRITE;
10246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (block < T1T_BLOCKS_PER_SEGMENT) {
10256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_t1t->b_update = false;
10266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_t1t->b_rseg = false;
10276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
10296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
1031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tWriteNoErase8
1036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1037552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      This function sends a WRITE-NE8 command for Reader/Writer
1038552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  mode.
1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
1041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
10436fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T1tWriteNoErase8(uint8_t block, uint8_t* p_new_dat) {
10446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
10456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
10466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state != RW_T1T_STATE_IDLE) {
10486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tWriteNoErase8 - Busy - State: %u", p_t1t->state);
10496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_BUSY);
10506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_t1t->tag_attribute == RW_T1_TAG_ATTRB_READ_ONLY) &&
10536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (block != T1T_CC_BLOCK)) {
10546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_ERROR0("RW_T1tWriteNoErase8 - Tag is in Read only state");
10556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_REFUSED);
10566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((block == T1T_UID_BLOCK) || (block == T1T_RES_BLOCK)) {
10596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tWriteNoErase8 - Cannot write to Locked block: %u",
10606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      block);
10616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_REFUSED);
10626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.t1t.hr[0] != T1T_STATIC_HR0 ||
10656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_cb.tcb.t1t.hr[1] >= RW_T1T_HR1_MIN) {
10666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* send WRITE-NE command */
10670c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    status = rw_t1t_send_dyn_cmd(T1T_CMD_WRITE_NE8, block, p_new_dat);
10680c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi    if (status == NFC_STATUS_OK) {
10696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->state = RW_T1T_STATE_WRITE;
10706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (block < T1T_BLOCKS_PER_SEGMENT) {
10716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_t1t->b_update = false;
10726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_t1t->b_rseg = false;
10736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
10756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
1080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_get_state_name
1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function returns the state name.
1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NOTE             conditionally compiled to save memory.
1087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to the name
1089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
10916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic char* rw_t1t_get_state_name(uint8_t state) {
10926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (state) {
1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_IDLE:
10946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("IDLE");
1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_NOT_ACTIVATED:
10966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("NOT_ACTIVATED");
1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_READ:
10986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("APP_READ");
1099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_WRITE:
11006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("APP_WRITE");
1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_TLV_DETECT:
11026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("TLV_DETECTION");
1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_READ_NDEF:
11046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("READING_NDEF");
1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_WRITE_NDEF:
11066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("WRITING_NDEF");
1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_SET_TAG_RO:
11086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("SET_TAG_RO");
1109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_CHECK_PRESENCE:
11106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("CHECK_PRESENCE");
1111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_FORMAT_TAG:
11126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("FORMAT_TAG");
1113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
11146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("???? UNKNOWN STATE");
11156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* (BT_TRACE_VERBOSE == TRUE) */
1119