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