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