rw_t1t.c revision 6fca02d5010de7bd31d83b853c32138021da5f29
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
28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_INCLUDED == TRUE)
296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "gki.h"
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nci_hmsgs.h"
316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfc_api.h"
326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfc_int.h"
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "rw_api.h"
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "rw_int.h"
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Local Functions */
376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic tRW_EVENT rw_t1t_handle_rid_rsp(NFC_HDR* p_pkt);
386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t1t_data_cback(uint8_t conn_id, tNFC_CONN_EVT event,
396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                              tNFC_CONN* p_data);
406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t1t_process_frame_error(void);
416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t1t_process_error(void);
426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t1t_handle_presence_check_rsp(tNFC_STATUS status);
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic char* rw_t1t_get_state_name(uint8_t state);
456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic char* rw_t1t_get_sub_state_name(uint8_t sub_state);
466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic char* rw_t1t_get_event_name(uint8_t event);
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_data_cback
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This callback function handles data from NFCC.
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t1t_data_cback(uint8_t conn_id, tNFC_CONN_EVT event,
596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                              tNFC_CONN* p_data) {
606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_EVENT rw_event = RW_RAW_FRAME_EVT;
626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  bool b_notify = true;
636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_DATA evt_data;
646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_pkt;
656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tT1T_CMD_RSP_INFO* p_cmd_rsp_info =
676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (tT1T_CMD_RSP_INFO*)rw_cb.tcb.t1t.p_cmd_rsp_info;
685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#if (BT_TRACE_VERBOSE == TRUE)
696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t begin_state = p_t1t->state;
705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#endif
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_pkt = (NFC_HDR*)(p_data->data.p_data);
736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_pkt == NULL) return;
746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Assume the data is just the response byte sequence */
756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p = (uint8_t*)(p_pkt + 1) + p_pkt->offset;
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_DEBUG2("rw_t1t_data_cback (): state:%s (%d)",
796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  rw_t1t_get_state_name(p_t1t->state), p_t1t->state);
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_DEBUG1("rw_t1t_data_cback (): state=%d", p_t1t->state);
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  evt_data.status = NFC_STATUS_OK;
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_t1t->state == RW_T1T_STATE_IDLE) || (!p_cmd_rsp_info)) {
876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* If previous command was retransmitted and if response is pending to
886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * previous command retransmission,
896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * check if lenght and ADD/ADD8/ADDS field matches the expected value of
906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * previous
916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * retransmited command response. However, ignore ADD field if the command
926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * was RALL/RID
936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     */
946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((p_t1t->prev_cmd_rsp_info.pend_retx_rsp) &&
956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (p_t1t->prev_cmd_rsp_info.rsp_len == p_pkt->len) &&
966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        ((p_t1t->prev_cmd_rsp_info.op_code == T1T_CMD_RID) ||
976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         (p_t1t->prev_cmd_rsp_info.op_code == T1T_CMD_RALL) ||
986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         (p_t1t->prev_cmd_rsp_info.addr == *p))) {
996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Response to previous command retransmission */
1006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      RW_TRACE_ERROR2(
1016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "T1T Response to previous command in Idle state. command=0x%02x, "
1026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "Remaining max retx rsp:0x%02x ",
1036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_t1t->prev_cmd_rsp_info.op_code,
1046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_t1t->prev_cmd_rsp_info.pend_retx_rsp - 1);
1056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->prev_cmd_rsp_info.pend_retx_rsp--;
1066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      GKI_freebuf(p_pkt);
1076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
1086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Raw frame event */
1096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.data.p_data = p_pkt;
1106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (*rw_cb.p_cback)(RW_T1T_RAW_FRAME_EVT, (tRW_DATA*)&evt_data);
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return;
1136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
115303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE)
1166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Update rx stats */
1176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  rw_main_update_rx_stats(p_pkt->len);
1186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */
1196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_pkt->len != p_cmd_rsp_info->rsp_len) ||
1216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ((p_cmd_rsp_info->opcode != T1T_CMD_RALL) &&
1226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       (p_cmd_rsp_info->opcode != T1T_CMD_RID) && (*p != p_t1t->addr)))
1236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  {
1256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* If previous command was retransmitted and if response is pending to
1266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * previous command retransmission,
1276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * then check if lenght and ADD/ADD8/ADDS field matches the expected value
1286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * of previous
1296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * retransmited command response. However, ignore ADD field if the command
1306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * was RALL/RID
1316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     */
1326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((p_t1t->prev_cmd_rsp_info.pend_retx_rsp) &&
1336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (p_t1t->prev_cmd_rsp_info.rsp_len == p_pkt->len) &&
1346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        ((p_t1t->prev_cmd_rsp_info.op_code == T1T_CMD_RID) ||
1356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         (p_t1t->prev_cmd_rsp_info.op_code == T1T_CMD_RALL) ||
1366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         (p_t1t->prev_cmd_rsp_info.addr == *p))) {
1376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      RW_TRACE_ERROR2(
1386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "T1T Response to previous command. command=0x%02x, Remaining max "
1396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "retx rsp:0x%02x",
1406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_t1t->prev_cmd_rsp_info.op_code,
1416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_t1t->prev_cmd_rsp_info.pend_retx_rsp - 1);
1426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->prev_cmd_rsp_info.pend_retx_rsp--;
1436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
1446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Stop timer as some response to current command is received */
1456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_stop_quick_timer(&p_t1t->timer);
1466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi/* Retrasmit the last sent command if retry-count < max retry */
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
1486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      RW_TRACE_ERROR2("T1T Frame error. state=%s command (opcode) = 0x%02x",
1496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      rw_t1t_get_state_name(p_t1t->state),
1506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      p_cmd_rsp_info->opcode);
151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
1526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      RW_TRACE_ERROR2("T1T Frame error. state=0x%02x command = 0x%02x ",
1536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      p_t1t->state, p_cmd_rsp_info->opcode);
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
1556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_t1t_process_frame_error();
156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_freebuf(p_pkt);
1586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return;
1596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Stop timer as response to current command is received */
1626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfc_stop_quick_timer(&p_t1t->timer);
163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_EVENT2("RW RECV [%s]:0x%x RSP", t1t_info_to_str(p_cmd_rsp_info),
1656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  p_cmd_rsp_info->opcode);
166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If we did not receive response to all retransmitted previous command,
1686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi   * dont expect that as response have come for the current command itself.
1696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi   */
1706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->prev_cmd_rsp_info.pend_retx_rsp)
1716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    memset(&(p_t1t->prev_cmd_rsp_info), 0, sizeof(tRW_T1T_PREV_CMD_RSP_INFO));
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.cur_retry) {
1746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* If the current command was retransmitted to get this response, we might
1756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       get
1766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       response later to all or some of the retrasnmission of the current
1776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       command
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project     */
1796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->prev_cmd_rsp_info.addr = ((p_cmd_rsp_info->opcode != T1T_CMD_RALL) &&
1806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                     (p_cmd_rsp_info->opcode != T1T_CMD_RID))
1816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                        ? p_t1t->addr
1826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                        : 0;
1836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->prev_cmd_rsp_info.rsp_len = p_cmd_rsp_info->rsp_len;
1846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->prev_cmd_rsp_info.op_code = p_cmd_rsp_info->opcode;
1856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->prev_cmd_rsp_info.pend_retx_rsp = (uint8_t)rw_cb.cur_retry;
1866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  rw_cb.cur_retry = 0;
1896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_cmd_rsp_info->opcode == T1T_CMD_RID) {
1916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_event = rw_t1t_handle_rid_rsp(p_pkt);
1926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
1936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_event =
1946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_t1t_handle_rsp(p_cmd_rsp_info, &b_notify, p, &evt_data.status);
1956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (b_notify) {
1986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((p_t1t->state != RW_T1T_STATE_READ) &&
1996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (p_t1t->state != RW_T1T_STATE_WRITE)) {
2006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      GKI_freebuf(p_pkt);
2016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.data.p_data = NULL;
2026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
2036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      evt_data.data.p_data = p_pkt;
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_t1t_handle_op_complete();
2066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    (*rw_cb.p_cback)(rw_event, (tRW_DATA*)&evt_data);
2076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else
2086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_freebuf(p_pkt);
2095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
2105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#if (BT_TRACE_VERBOSE == TRUE)
2116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (begin_state != p_t1t->state) {
2126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_DEBUG2("RW T1T state changed:<%s> -> <%s>",
2136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    rw_t1t_get_state_name(begin_state),
2146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    rw_t1t_get_state_name(p_t1t->state));
2156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#endif
217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_conn_cback
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This callback function receives the events/data from NFCC.
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t1t_conn_cback(uint8_t conn_id, tNFC_CONN_EVT event,
2296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                       tNFC_CONN* p_data) {
2306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
2316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_READ_DATA evt_data;
2326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_DEBUG2("rw_t1t_conn_cback: conn_id=%i, evt=0x%x", conn_id, event);
2346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Only handle static conn_id */
2356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (conn_id != NFC_RF_CONN_ID) {
2366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("rw_t1t_conn_cback - Not static connection id: =%i",
2376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      conn_id);
2386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return;
2396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (event) {
242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_CONN_CREATE_CEVT:
243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_CONN_CLOSE_CEVT:
2446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_DEACTIVATE_CEVT:
247303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE)
2486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Display stats */
2496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_main_log_stats();
2506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */
251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Stop t1t timer (if started) */
2536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_stop_quick_timer(&p_t1t->timer);
2546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Free cmd buf for retransmissions */
2566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_t1t->p_cur_cmd_buf) {
2576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_freebuf(p_t1t->p_cur_cmd_buf);
2586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_t1t->p_cur_cmd_buf = NULL;
2596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
2606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->state = RW_T1T_STATE_NOT_ACTIVATED;
2626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NFC_SetStaticRfCback(NULL);
2636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_DATA_CEVT:
2666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_data != NULL) {
2676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (p_data->data.status == NFC_STATUS_OK) {
2686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          rw_t1t_data_cback(conn_id, event, p_data);
2696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          break;
2706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        } else if (p_data->data.p_data != NULL) {
2716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* Free the response buffer in case of error response */
2726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          GKI_freebuf((NFC_HDR*)(p_data->data.p_data));
2736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_data->data.p_data = NULL;
274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
2756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
2766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Data event with error status...fall through to NFC_ERROR_CEVT case */
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_ERROR_CEVT:
2796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((p_t1t->state == RW_T1T_STATE_NOT_ACTIVATED) ||
2806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (p_t1t->state == RW_T1T_STATE_IDLE)) {
281303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE)
2826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_main_update_trans_error_stats();
2836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (event == NFC_ERROR_CEVT)
2866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          evt_data.status = (tNFC_STATUS)(*(uint8_t*)p_data);
2876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        else if (p_data)
2886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          evt_data.status = p_data->status;
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
2906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          evt_data.status = NFC_STATUS_FAILED;
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        evt_data.p_data = NULL;
2936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (*rw_cb.p_cback)(RW_T1T_INTF_ERROR_EVT, (tRW_DATA*)&evt_data);
294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
2956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
2966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_stop_quick_timer(&p_t1t->timer);
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (RW_STATS_INCLUDED == TRUE)
2996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_main_update_trans_error_stats();
3006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */
3016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_t1t->state == RW_T1T_STATE_CHECK_PRESENCE) {
3036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_t1t_handle_presence_check_rsp(NFC_STATUS_FAILED);
3046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
3056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        rw_t1t_process_error();
3066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
3076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
3086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    default:
3106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
3116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_send_static_cmd
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function composes a Type 1 Tag command for static
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  memory and send through NCI to NFCC.
320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          NFC_STATUS_OK if the command is successfuly sent to NCI
322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  otherwise, error status
323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3256fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t1t_send_static_cmd(uint8_t opcode, uint8_t add, uint8_t dat) {
3266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
3276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
3286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  const tT1T_CMD_RSP_INFO* p_cmd_rsp_info = t1t_cmd_to_rsp_info(opcode);
3296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_data;
3306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
3316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_cmd_rsp_info) {
3336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* a valid opcode for RW */
3346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_data = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID);
3356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_data) {
3366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->p_cmd_rsp_info = (tT1T_CMD_RSP_INFO*)p_cmd_rsp_info;
3376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->addr = add;
3386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_data->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
3396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p = (uint8_t*)(p_data + 1) + p_data->offset;
3406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      UINT8_TO_BE_STREAM(p, opcode);
3416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      UINT8_TO_BE_STREAM(p, add);
3426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      UINT8_TO_BE_STREAM(p, dat);
3436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ARRAY_TO_STREAM(p, p_t1t->mem, T1T_CMD_UID_LEN);
3456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_data->len = p_cmd_rsp_info->cmd_len;
3466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Indicate first attempt to send command, back up cmd buffer in case
3486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       * needed for retransmission */
3496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_cb.cur_retry = 0;
3506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      memcpy(p_t1t->p_cur_cmd_buf, p_data,
3516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             sizeof(NFC_HDR) + p_data->offset + p_data->len);
352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
353303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE)
3546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Update stats */
3556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_main_update_tx_stats(p_data->len, false);
3566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */
3576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      RW_TRACE_EVENT2("RW SENT [%s]:0x%x CMD", t1t_info_to_str(p_cmd_rsp_info),
3596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      p_cmd_rsp_info->opcode);
3606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((status = NFC_SendData(NFC_RF_CONN_ID, p_data)) == 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
4246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((status = NFC_SendData(NFC_RF_CONN_ID, p_data)) == NFC_STATUS_OK) {
4256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfc_start_quick_timer(
4266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            &p_t1t->timer, NFC_TTYPE_RW_T1T_RESPONSE,
4276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (RW_T1T_TOUT_RESP * QUICK_TIMER_TICKS_PER_SEC) / 1000);
4286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
4296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
4306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      status = NFC_STATUS_NO_BUFFERS;
431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
4326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
4336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_handle_rid_rsp
439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Handles response to RID: Collects HR, UID, notify up the
441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  stack
442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          event to notify application
444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
4466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic tRW_EVENT rw_t1t_handle_rid_rsp(NFC_HDR* p_pkt) {
4476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
4486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_DATA evt_data;
4496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p_rid_rsp;
4506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  evt_data.status = NFC_STATUS_OK;
4526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  evt_data.data.p_data = p_pkt;
4536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Assume the data is just the response byte sequence */
4556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_rid_rsp = (uint8_t*)(p_pkt + 1) + p_pkt->offset;
4566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Response indicates tag is present */
4586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state == RW_T1T_STATE_CHECK_PRESENCE) {
4596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* If checking for the presence of the tag then just notify */
4606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return RW_T1T_PRESENCE_CHECK_EVT;
4616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Extract HR and UID from response */
4646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  STREAM_TO_ARRAY(p_t1t->hr, p_rid_rsp, T1T_HR_LEN);
465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
4676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_DEBUG2("hr0:0x%x, hr1:0x%x", p_t1t->hr[0], p_t1t->hr[1]);
4686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_DEBUG4("rw_t1t_handle_rid_rsp (): UID0-3=%02x%02x%02x%02x",
4696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  p_rid_rsp[0], p_rid_rsp[1], p_rid_rsp[2], p_rid_rsp[3]);
470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
4716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_DEBUG0("rw_t1t_handle_rid_rsp ()");
472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Fetch UID0-3 from RID response message */
4756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  STREAM_TO_ARRAY(p_t1t->mem, p_rid_rsp, T1T_CMD_UID_LEN);
476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Notify RID response Event */
4786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return RW_T1T_RID_EVT;
479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_select
484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function will set the callback function to
486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  receive data from lower layers and also send rid command
487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
4916fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t1t_select(uint8_t hr[T1T_HR_LEN],
4926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                          uint8_t uid[T1T_CMD_UID_LEN]) {
4936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
4946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
4956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_t1t->state = RW_T1T_STATE_NOT_ACTIVATED;
4976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Alloc cmd buf for retransmissions */
4996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->p_cur_cmd_buf == NULL) {
5006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((p_t1t->p_cur_cmd_buf = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID)) ==
5016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NULL) {
5026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      RW_TRACE_ERROR0(
5036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "rw_t1t_select: unable to allocate buffer for retransmission");
5046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return status;
505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
5066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  memcpy(p_t1t->hr, hr, T1T_HR_LEN);
5096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  memcpy(p_t1t->mem, uid, T1T_CMD_UID_LEN);
510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_SetStaticRfCback(rw_t1t_conn_cback);
512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_t1t->state = RW_T1T_STATE_IDLE;
514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return NFC_STATUS_OK;
516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_process_timeout
521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      process timeout event
523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t1t_process_timeout(TIMER_LIST_ENT* p_tle) {
5286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
5316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_ERROR2("T1T timeout. state=%s command (opcode)=0x%02x ",
5326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  rw_t1t_get_state_name(p_t1t->state),
5336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  (rw_cb.tcb.t1t.p_cmd_rsp_info)->opcode);
534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
5356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_ERROR2("T1T timeout. state=0x%02x command=0x%02x ", p_t1t->state,
5366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  (rw_cb.tcb.t1t.p_cmd_rsp_info)->opcode);
537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state == RW_T1T_STATE_CHECK_PRESENCE) {
5406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Tag has moved from range */
5416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_t1t_handle_presence_check_rsp(NFC_STATUS_FAILED);
5426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (p_t1t->state != RW_T1T_STATE_IDLE) {
5436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_t1t_process_error();
5446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_process_frame_error
550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process frame crc error
552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t1t_process_frame_error(void) {
557303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE)
5586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Update stats */
5596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  rw_main_update_crc_error_stats();
5606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */
561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Process the error */
5636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  rw_t1t_process_error();
564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_process_error
569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      process timeout event
571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          none
573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t1t_process_error(void) {
5766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_READ_DATA evt_data;
5776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_EVENT rw_event;
5786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_cmd_buf;
5796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
5806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tT1T_CMD_RSP_INFO* p_cmd_rsp_info =
5816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (tT1T_CMD_RSP_INFO*)rw_cb.tcb.t1t.p_cmd_rsp_info;
5826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_DETECT_NDEF_DATA ndef_data;
5836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_DEBUG1("rw_t1t_process_error () State: %u", p_t1t->state);
5856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Retry sending command if retry-count < max */
5876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.cur_retry < RW_MAX_RETRIES) {
5886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* retry sending the command */
5896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rw_cb.cur_retry++;
5906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_DEBUG2("T1T retransmission attempt %i of %i", rw_cb.cur_retry,
5926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    RW_MAX_RETRIES);
5936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* allocate a new buffer for message */
5956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((p_cmd_buf = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID)) != NULL) {
5966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      memcpy(p_cmd_buf, p_t1t->p_cur_cmd_buf,
5976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             sizeof(NFC_HDR) + p_t1t->p_cur_cmd_buf->offset +
5986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                 p_t1t->p_cur_cmd_buf->len);
599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
600303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE)
6016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Update stats */
6026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_main_update_tx_stats(p_cmd_buf->len, true);
6036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */
6046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (NFC_SendData(NFC_RF_CONN_ID, p_cmd_buf) == NFC_STATUS_OK) {
6066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* Start timer for waiting for response */
6076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfc_start_quick_timer(
6086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            &p_t1t->timer, NFC_TTYPE_RW_T1T_RESPONSE,
6096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (RW_T1T_TOUT_RESP * QUICK_TIMER_TICKS_PER_SEC) / 1000);
6106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        return;
6126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
6146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* we might get response later to all or some of the retrasnmission
616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project     * of the current command, update previous command response information */
6176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_DEBUG1("T1T maximum retransmission attempts reached (%i)",
6186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    RW_MAX_RETRIES);
6196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->prev_cmd_rsp_info.addr = ((p_cmd_rsp_info->opcode != T1T_CMD_RALL) &&
6206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                     (p_cmd_rsp_info->opcode != T1T_CMD_RID))
6216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                        ? p_t1t->addr
6226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                        : 0;
6236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->prev_cmd_rsp_info.rsp_len = p_cmd_rsp_info->rsp_len;
6246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->prev_cmd_rsp_info.op_code = p_cmd_rsp_info->opcode;
6256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->prev_cmd_rsp_info.pend_retx_rsp = RW_MAX_RETRIES;
6266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
628303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE)
6296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* update failure count */
6306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  rw_main_update_fail_stats();
6316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */
6326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  rw_event = rw_t1t_info_to_event(p_cmd_rsp_info);
6346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state != RW_T1T_STATE_NOT_ACTIVATED) rw_t1t_handle_op_complete();
6356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  evt_data.status = NFC_STATUS_TIMEOUT;
6376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_event == RW_T2T_NDEF_DETECT_EVT) {
6386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ndef_data.status = evt_data.status;
6396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ndef_data.protocol = NFC_PROTOCOL_T1T;
6406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ndef_data.flags = RW_NDEF_FL_UNKNOWN;
6416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ndef_data.max_size = 0;
6426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ndef_data.cur_size = 0;
6436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    (*rw_cb.p_cback)(rw_event, (tRW_DATA*)&ndef_data);
6446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
6456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.p_data = NULL;
6466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    (*rw_cb.p_cback)(rw_event, (tRW_DATA*)&evt_data);
6476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_handle_presence_check_rsp
653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Handle response to presence check
655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          Nothing
657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
6596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t1t_handle_presence_check_rsp(tNFC_STATUS status) {
6606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_READ_DATA evt_data;
661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Notify, Tag is present or not */
6636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  evt_data.status = status;
6646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  rw_t1t_handle_op_complete();
665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  (*(rw_cb.p_cback))(RW_T1T_PRESENCE_CHECK_EVT, (tRW_DATA*)&evt_data);
667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_handle_op_complete
672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Reset to IDLE state
674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          Nothing
676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
6786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t1t_handle_op_complete(void) {
6796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_t1t->state = RW_T1T_STATE_IDLE;
682303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_NDEF_INCLUDED == TRUE)
6836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state != RW_T1T_STATE_READ_NDEF) {
6846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->b_update = false;
6856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->b_rseg = false;
6866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_t1t->substate = RW_T1T_SUBSTATE_NONE;
688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
6896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return;
690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tPresenceCheck
695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description
697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      Check if the tag is still in the field.
698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      The RW_T1T_PRESENCE_CHECK_EVT w/ status is used to indicate presence
700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      or non-presence.
701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns
703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      NFC_STATUS_OK, if raw data frame sent
704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation
705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      NFC_STATUS_FAILED: other error
706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
7086fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T1tPresenceCheck(void) {
7096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS retval = NFC_STATUS_OK;
7106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_DATA evt_data;
7116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_CB* p_rw_cb = &rw_cb;
7126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_API0("RW_T1tPresenceCheck");
7146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If RW_SelectTagType was not called (no conn_callback) return failure */
7166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_rw_cb->p_cback) {
7176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    retval = NFC_STATUS_FAILED;
7186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
7196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If we are not activated, then RW_T1T_PRESENCE_CHECK_EVT status=FAIL */
7206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else if (p_rw_cb->tcb.t1t.state == RW_T1T_STATE_NOT_ACTIVATED) {
7216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.status = NFC_STATUS_FAILED;
7226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    (*p_rw_cb->p_cback)(RW_T1T_PRESENCE_CHECK_EVT, &evt_data);
7236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
7246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* If command is pending, assume tag is still present */
7256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else if (p_rw_cb->tcb.t1t.state != RW_T1T_STATE_IDLE) {
7266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    evt_data.status = NFC_STATUS_OK;
7276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    (*p_rw_cb->p_cback)(RW_T1T_PRESENCE_CHECK_EVT, &evt_data);
7286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
7296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* IDLE state: send a RID command to the tag to see if it responds */
7306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((retval = rw_t1t_send_static_cmd(T1T_CMD_RID, 0, 0)) == NFC_STATUS_OK) {
7316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_rw_cb->tcb.t1t.state = RW_T1T_STATE_CHECK_PRESENCE;
732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
7336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (retval);
736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*****************************************************************************
739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tRid
741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description
743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      This function sends a RID command for Reader/Writer mode.
744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns
746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      NFC_STATUS_OK, if raw data frame sent
747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation
748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**      NFC_STATUS_FAILED: other error
749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/
7516fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T1tRid(void) {
7526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
7536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_API0("RW_T1tRid");
756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state != RW_T1T_STATE_IDLE) {
7586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tRid - Busy - State: %u", p_t1t->state);
7596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_BUSY);
7606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* send a RID command */
7636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((status = rw_t1t_send_static_cmd(T1T_CMD_RID, 0, 0)) == NFC_STATUS_OK) {
7646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->state = RW_T1T_STATE_READ;
7656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (status);
768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tReadAll
773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function sends a RALL command for Reader/Writer mode.
775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
7796fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T1tReadAll(void) {
7806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
7816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_TRACE_API0("RW_T1tReadAll");
784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state != RW_T1T_STATE_IDLE) {
7866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tReadAll - Busy - State: %u", p_t1t->state);
7876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_BUSY);
7886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* send RALL command */
7916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((status = rw_t1t_send_static_cmd(T1T_CMD_RALL, 0, 0)) == NFC_STATUS_OK) {
7926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->state = RW_T1T_STATE_READ;
7936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tRead
801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function sends a READ command for Reader/Writer mode.
803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
8076fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T1tRead(uint8_t block, uint8_t byte) {
8086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
8096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
8106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t addr;
8116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state != RW_T1T_STATE_IDLE) {
8136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tRead - Busy - State: %u", p_t1t->state);
8146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_BUSY);
8156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* send READ command */
8186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_T1T_BLD_ADD((addr), (block), (byte));
8196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((status = rw_t1t_send_static_cmd(T1T_CMD_READ, addr, 0)) ==
8206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NFC_STATUS_OK) {
8216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->state = RW_T1T_STATE_READ;
8226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tWriteErase
829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
830552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      This function sends a WRITE-E command for Reader/Writer
831552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  mode.
832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
8366fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T1tWriteErase(uint8_t block, uint8_t byte, uint8_t new_byte) {
8376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
8386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
8396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t addr;
8406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state != RW_T1T_STATE_IDLE) {
8426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tWriteErase - Busy - State: %u", p_t1t->state);
8436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_BUSY);
8446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_t1t->tag_attribute == RW_T1_TAG_ATTRB_READ_ONLY) &&
8466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (block != T1T_CC_BLOCK) && (byte != T1T_CC_RWA_OFFSET)) {
8476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_ERROR0("RW_T1tWriteErase - Tag is in Read only state");
8486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_REFUSED);
8496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((block >= T1T_STATIC_BLOCKS) || (byte >= T1T_BLOCK_SIZE)) {
8516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_ERROR2("RW_T1tWriteErase - Invalid Block/byte: %u / %u", block,
8526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    byte);
8536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_REFUSED);
8546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((block == T1T_UID_BLOCK) || (block == T1T_RES_BLOCK)) {
8566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tWriteErase - Cannot write to Locked block: %u",
8576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      block);
8586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_REFUSED);
8596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* send WRITE-E command */
8616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_T1T_BLD_ADD((addr), (block), (byte));
8626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((status = rw_t1t_send_static_cmd(T1T_CMD_WRITE_E, addr, new_byte)) ==
8636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NFC_STATUS_OK) {
8646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->state = RW_T1T_STATE_WRITE;
8656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (block < T1T_BLOCKS_PER_SEGMENT) {
8666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->b_update = false;
8676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->b_rseg = false;
868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
8696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tWriteNoErase
876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
877552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      This function sends a WRITE-NE command for Reader/Writer
878552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  mode.
879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
8836fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T1tWriteNoErase(uint8_t block, uint8_t byte, uint8_t new_byte) {
8846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
8856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
8866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t addr;
8876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state != RW_T1T_STATE_IDLE) {
8896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tWriteNoErase - Busy - State: %u", p_t1t->state);
8906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_BUSY);
8916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_t1t->tag_attribute == RW_T1_TAG_ATTRB_READ_ONLY) &&
8936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (block != T1T_CC_BLOCK) && (byte != T1T_CC_RWA_OFFSET)) {
8946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_ERROR0("RW_T1tWriteErase - Tag is in Read only state");
8956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_REFUSED);
8966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((block >= T1T_STATIC_BLOCKS) || (byte >= T1T_BLOCK_SIZE)) {
8986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_ERROR2("RW_T1tWriteErase - Invalid Block/byte: %u / %u", block,
8996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    byte);
9006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_REFUSED);
9016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((block == T1T_UID_BLOCK) || (block == T1T_RES_BLOCK)) {
9036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tWriteNoErase - Cannot write to Locked block: %u",
9046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      block);
9056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_REFUSED);
9066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* send WRITE-NE command */
9086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  RW_T1T_BLD_ADD((addr), (block), (byte));
9096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((status = rw_t1t_send_static_cmd(T1T_CMD_WRITE_NE, addr, new_byte)) ==
9106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NFC_STATUS_OK) {
9116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_t1t->state = RW_T1T_STATE_WRITE;
9126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (block < T1T_BLOCKS_PER_SEGMENT) {
9136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->b_update = false;
9146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->b_rseg = false;
915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
9166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tReadSeg
923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function sends a RSEG command for Reader/Writer mode.
925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
9296fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T1tReadSeg(uint8_t segment) {
9306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
9316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
9326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t adds;
9336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
9346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state != RW_T1T_STATE_IDLE) {
9356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tReadSeg - Busy - State: %u", p_t1t->state);
9366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_BUSY);
9376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (segment >= T1T_MAX_SEGMENTS) {
9396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_ERROR1("RW_T1tReadSeg - Invalid Segment: %u", segment);
9406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_REFUSED);
9416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.t1t.hr[0] != T1T_STATIC_HR0) {
9436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* send RSEG command */
9446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_T1T_BLD_ADDS((adds), (segment));
9456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((status = rw_t1t_send_dyn_cmd(T1T_CMD_RSEG, adds, NULL)) ==
9466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NFC_STATUS_OK) {
9476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->state = RW_T1T_STATE_READ;
948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
9496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tRead8
956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function sends a READ8 command for Reader/Writer mode.
958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
9626fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T1tRead8(uint8_t block) {
9636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
9646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
9656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
9666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state != RW_T1T_STATE_IDLE) {
9676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tRead8 - Busy - State: %u", p_t1t->state);
9686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_BUSY);
9696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
9716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.t1t.hr[0] != T1T_STATIC_HR0 ||
9726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_cb.tcb.t1t.hr[1] >= RW_T1T_HR1_MIN) {
9736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* send READ8 command */
9746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((status = rw_t1t_send_dyn_cmd(T1T_CMD_READ8, block, NULL)) ==
9756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NFC_STATUS_OK) {
9766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->state = RW_T1T_STATE_READ;
977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
9786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tWriteErase8
985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
986552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      This function sends a WRITE-E8 command for Reader/Writer
987552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  mode.
988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
9926fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T1tWriteErase8(uint8_t block, uint8_t* p_new_dat) {
9936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
9946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
9956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
9966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state != RW_T1T_STATE_IDLE) {
9976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tWriteErase8 - Busy - State: %u", p_t1t->state);
9986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_BUSY);
9996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_t1t->tag_attribute == RW_T1_TAG_ATTRB_READ_ONLY) &&
10026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (block != T1T_CC_BLOCK)) {
10036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_ERROR0("RW_T1tWriteErase8 - Tag is in Read only state");
10046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_REFUSED);
10056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((block == T1T_UID_BLOCK) || (block == T1T_RES_BLOCK)) {
10086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tWriteErase8 - Cannot write to Locked block: %u",
10096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      block);
10106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_REFUSED);
10116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.t1t.hr[0] != T1T_STATIC_HR0 ||
10146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_cb.tcb.t1t.hr[1] >= RW_T1T_HR1_MIN) {
10156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* send WRITE-E8 command */
10166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((status = rw_t1t_send_dyn_cmd(T1T_CMD_WRITE_E8, block, p_new_dat)) ==
10176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NFC_STATUS_OK) {
10186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->state = RW_T1T_STATE_WRITE;
10196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (block < T1T_BLOCKS_PER_SEGMENT) {
10206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_t1t->b_update = false;
10216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_t1t->b_rseg = false;
10226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
10246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         RW_T1tWriteNoErase8
1031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1032552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      This function sends a WRITE-NE8 command for Reader/Writer
1033552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  mode.
1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
1036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
10386fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T1tWriteNoErase8(uint8_t block, uint8_t* p_new_dat) {
10396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tNFC_STATUS status = NFC_STATUS_FAILED;
10406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tRW_T1T_CB* p_t1t = &rw_cb.tcb.t1t;
10416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_t1t->state != RW_T1T_STATE_IDLE) {
10436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tWriteNoErase8 - Busy - State: %u", p_t1t->state);
10446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_BUSY);
10456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_t1t->tag_attribute == RW_T1_TAG_ATTRB_READ_ONLY) &&
10486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (block != T1T_CC_BLOCK)) {
10496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_ERROR0("RW_T1tWriteNoErase8 - Tag is in Read only state");
10506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_REFUSED);
10516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((block == T1T_UID_BLOCK) || (block == T1T_RES_BLOCK)) {
10546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    RW_TRACE_WARNING1("RW_T1tWriteNoErase8 - Cannot write to Locked block: %u",
10556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      block);
10566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (NFC_STATUS_REFUSED);
10576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (rw_cb.tcb.t1t.hr[0] != T1T_STATIC_HR0 ||
10606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      rw_cb.tcb.t1t.hr[1] >= RW_T1T_HR1_MIN) {
10616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* send WRITE-NE command */
10626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((status = rw_t1t_send_dyn_cmd(T1T_CMD_WRITE_NE8, block, p_new_dat)) ==
10636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NFC_STATUS_OK) {
10646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_t1t->state = RW_T1T_STATE_WRITE;
10656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (block < T1T_BLOCKS_PER_SEGMENT) {
10666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_t1t->b_update = false;
10676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_t1t->b_rseg = false;
10686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
10706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
1072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
1075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         rw_t1t_get_state_name
1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function returns the state name.
1080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NOTE             conditionally compiled to save memory.
1082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          pointer to the name
1084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
10866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic char* rw_t1t_get_state_name(uint8_t state) {
10876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (state) {
1088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_IDLE:
10896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("IDLE");
1090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_NOT_ACTIVATED:
10916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("NOT_ACTIVATED");
1092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_READ:
10936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("APP_READ");
1094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_WRITE:
10956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("APP_WRITE");
1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_TLV_DETECT:
10976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("TLV_DETECTION");
1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_READ_NDEF:
10996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("READING_NDEF");
1100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_WRITE_NDEF:
11016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("WRITING_NDEF");
1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_SET_TAG_RO:
11036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("SET_TAG_RO");
1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_CHECK_PRESENCE:
11056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("CHECK_PRESENCE");
1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case RW_T1T_STATE_FORMAT_TAG:
11076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("FORMAT_TAG");
1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
11096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return ("???? UNKNOWN STATE");
11106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* (BT_TRACE_VERBOSE == TRUE) */
1114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* (NFC_INCLUDED == TRUE) */
1116