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