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 195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * This file contains the implementation for Type 4 tag in Reader/Writer 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * mode. 24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h> 27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_target.h" 28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "bt_types.h" 29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "trace_api.h" 30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_INCLUDED == TRUE) 32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_api.h" 34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_int.h" 35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "rw_api.h" 36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "rw_int.h" 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "tags_int.h" 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "gki.h" 39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* main state */ 41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_STATE_NOT_ACTIVATED 0x00 /* T4T is not activated */ 42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_STATE_IDLE 0x01 /* waiting for upper layer API */ 43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_STATE_DETECT_NDEF 0x02 /* performing NDEF detection precedure */ 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_STATE_READ_NDEF 0x03 /* performing read NDEF procedure */ 45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_STATE_UPDATE_NDEF 0x04 /* performing update NDEF procedure */ 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_STATE_PRESENCE_CHECK 0x05 /* checking presence of tag */ 475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define RW_T4T_STATE_SET_READ_ONLY 0x06 /* convert tag to read only */ 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* sub state */ 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_SUBSTATE_WAIT_SELECT_APP 0x00 /* waiting for response of selecting AID */ 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_SUBSTATE_WAIT_SELECT_CC 0x01 /* waiting for response of selecting CC */ 52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_SUBSTATE_WAIT_CC_FILE 0x02 /* waiting for response of reading CC */ 53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_SUBSTATE_WAIT_SELECT_NDEF_FILE 0x03 /* waiting for response of selecting NDEF */ 54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_SUBSTATE_WAIT_READ_NLEN 0x04 /* waiting for response of reading NLEN */ 55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_SUBSTATE_WAIT_READ_RESP 0x05 /* waiting for response of reading file */ 56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_SUBSTATE_WAIT_UPDATE_RESP 0x06 /* waiting for response of updating file */ 57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T4T_SUBSTATE_WAIT_UPDATE_NLEN 0x07 /* waiting for response of updating NLEN */ 585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define RW_T4T_SUBSTATE_WAIT_UPDATE_CC 0x08 /* waiting for response of updating CC */ 59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *rw_t4t_get_state_name (UINT8 state); 62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *rw_t4t_get_sub_state_name (UINT8 sub_state); 63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_send_to_lower (BT_HDR *p_c_apdu); 66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_select_file (UINT16 file_id); 67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_read_file (UINT16 offset, UINT16 length, BOOLEAN is_continue); 68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_update_nlen (UINT16 ndef_len); 69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_update_file (void); 705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic BOOLEAN rw_t4t_update_cc_to_readonly (void); 71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_select_application (UINT8 version); 72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_validate_cc_file (void); 73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t4t_handle_error (tNFC_STATUS status, UINT8 sw1, UINT8 sw2); 74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t4t_sm_detect_ndef (BT_HDR *p_r_apdu); 75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t4t_sm_read_ndef (BT_HDR *p_r_apdu); 76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t4t_sm_update_ndef (BT_HDR *p_r_apdu); 775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic void rw_t4t_sm_set_readonly (BT_HDR *p_r_apdu); 78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t4t_data_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data); 79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t4t_send_to_lower 83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send C-APDU to lower layer 85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if success 87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_send_to_lower (BT_HDR *p_c_apdu) 90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE) 92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project DispRWT4Tags (p_c_apdu, FALSE); 93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (NFC_SendData (NFC_RF_CONN_ID, p_c_apdu) != NFC_STATUS_OK) 96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_t4t_send_to_lower (): NFC_SendData () failed"); 98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_start_quick_timer (&rw_cb.tcb.t4t.timer, NFC_TTYPE_RW_T4T_RESPONSE, 102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (RW_T4T_TOUT_RESP * QUICK_TIMER_TICKS_PER_SEC) / 1000); 103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t4t_select_file 110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send Select Command (by File ID) to peer 112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if success 114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_select_file (UINT16 file_id) 117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_c_apdu; 119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("rw_t4t_select_file (): File ID:0x%04X", file_id); 122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_c_apdu = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_c_apdu) 126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_t4t_select_file (): Cannot allocate buffer"); 128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_c_apdu->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_c_apdu + 1) + p_c_apdu->offset; 133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_CMD_CLASS); 135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_CMD_INS_SELECT); 136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_CMD_P1_SELECT_BY_FILE_ID); 137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if current version mapping is V2.0 */ 139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.t4t.version == T4T_VERSION_2_0) 140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_CMD_P2_FIRST_OR_ONLY_0CH); 142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else /* version 1.0 */ 144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_CMD_P2_FIRST_OR_ONLY_00H); 146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_FILE_ID_SIZE); 149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, file_id); 150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_c_apdu->len = T4T_CMD_MAX_HDR_SIZE + T4T_FILE_ID_SIZE; 152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!rw_t4t_send_to_lower (p_c_apdu)) 154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t4t_read_file 164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send ReadBinary Command to peer 166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if success 168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_read_file (UINT16 offset, UINT16 length, BOOLEAN is_continue) 171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T4T_CB *p_t4t = &rw_cb.tcb.t4t; 173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_c_apdu; 174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG3 ("rw_t4t_read_file () offset:%d, length:%d, is_continue:%d, ", 177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset, length, is_continue); 178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_c_apdu = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_c_apdu) 182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_t4t_read_file (): Cannot allocate buffer"); 184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if this is the first reading */ 188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (is_continue == FALSE) 189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* initialise starting offset and total length */ 191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* these will be updated when receiving response */ 192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->rw_offset = offset; 193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->rw_length = length; 194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* adjust reading length if payload is bigger than max size per single command */ 197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (length > p_t4t->max_read_size) 198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length = (UINT8) (p_t4t->max_read_size); 200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_c_apdu->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_c_apdu + 1) + p_c_apdu->offset; 204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 205a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu UINT8_TO_BE_STREAM (p, (T4T_CMD_CLASS | rw_cb.tcb.t4t.channel)); 206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_CMD_INS_READ_BINARY); 207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, offset); 208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, length); /* Le */ 209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_c_apdu->len = T4T_CMD_MIN_HDR_SIZE + 1; /* adding Le */ 211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!rw_t4t_send_to_lower (p_c_apdu)) 213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t4t_update_nlen 223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send UpdateBinary Command to update NLEN to peer 225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if success 227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_update_nlen (UINT16 ndef_len) 230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_c_apdu; 232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("rw_t4t_update_nlen () NLEN:%d", ndef_len); 235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_c_apdu = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_c_apdu) 239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_t4t_update_nlen (): Cannot allocate buffer"); 241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_c_apdu->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_c_apdu + 1) + p_c_apdu->offset; 246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_CMD_CLASS); 248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_CMD_INS_UPDATE_BINARY); 249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, 0x0000); /* offset for NLEN */ 250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_FILE_LENGTH_SIZE); 251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, ndef_len); 252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_c_apdu->len = T4T_CMD_MAX_HDR_SIZE + T4T_FILE_LENGTH_SIZE; 254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!rw_t4t_send_to_lower (p_c_apdu)) 256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t4t_update_file 266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send UpdateBinary Command to peer 268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if success 270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_update_file (void) 273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T4T_CB *p_t4t = &rw_cb.tcb.t4t; 275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_c_apdu; 276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 length; 278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG2 ("rw_t4t_update_file () rw_offset:%d, rw_length:%d", 280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->rw_offset, p_t4t->rw_length); 281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_c_apdu = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_c_apdu) 285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_t4t_write_file (): Cannot allocate buffer"); 287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* try to send all of remaining data */ 291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length = p_t4t->rw_length; 292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* adjust updating length if payload is bigger than max size per single command */ 294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (length > p_t4t->max_update_size) 295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length = (UINT8) (p_t4t->max_update_size); 297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_c_apdu->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_c_apdu + 1) + p_c_apdu->offset; 301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_CMD_CLASS); 303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_CMD_INS_UPDATE_BINARY); 304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, p_t4t->rw_offset); 305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, length); 306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p, p_t4t->p_update_data, length); 308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_c_apdu->len = T4T_CMD_MAX_HDR_SIZE + length; 310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!rw_t4t_send_to_lower (p_c_apdu)) 312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* adjust offset, length and pointer for remaining data */ 317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->rw_offset += length; 318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->rw_length -= length; 319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->p_update_data += length; 320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function rw_t4t_update_cc_to_readonly 3275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 3285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description Send UpdateBinary Command for changing Write access 3295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 3305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns TRUE if success 3315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 3325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/ 3335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic BOOLEAN rw_t4t_update_cc_to_readonly (void) 3345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{ 3355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen BT_HDR *p_c_apdu; 3365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 *p; 3375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_TRACE_DEBUG0 ("rw_t4t_update_cc_to_readonly (): Remove Write access from CC"); 3395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_c_apdu = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 3415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (!p_c_apdu) 3435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 3445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_TRACE_ERROR0 ("rw_t4t_update_cc_to_readonly (): Cannot allocate buffer"); 3455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return FALSE; 3465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 3475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_c_apdu->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 3495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p = (UINT8 *) (p_c_apdu + 1) + p_c_apdu->offset; 3505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Add Command Header */ 3525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8_TO_BE_STREAM (p, T4T_CMD_CLASS); 3535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8_TO_BE_STREAM (p, T4T_CMD_INS_UPDATE_BINARY); 3545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT16_TO_BE_STREAM (p, (T4T_FC_TLV_OFFSET_IN_CC + T4T_FC_WRITE_ACCESS_OFFSET_IN_TLV)); /* Offset for Read Write access byte of CC */ 3555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8_TO_BE_STREAM (p, 1); /* Length of write access field in cc interms of bytes */ 3565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Remove Write access */ 3585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8_TO_BE_STREAM (p, T4T_FC_NO_WRITE_ACCESS); 3595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_c_apdu->len = T4T_CMD_MAX_HDR_SIZE + 1; 3625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (!rw_t4t_send_to_lower (p_c_apdu)) 3645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 3655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return FALSE; 3665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 3675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return TRUE; 3695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 3705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/******************************************************************************* 3725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t4t_select_application 374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Select Application 376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NDEF Tag Application Select - C-APDU 378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** CLA INS P1 P2 Lc Data(AID) Le 380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** V1.0: 00 A4 04 00 07 D2760000850100 - 381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** V2.0: 00 A4 04 00 07 D2760000850101 00 382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if success 384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_select_application (UINT8 version) 387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_c_apdu; 389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("rw_t4t_select_application () version:0x%X", version); 392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_c_apdu = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID); 394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_c_apdu) 396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_t4t_select_application (): Cannot allocate buffer"); 398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_c_apdu->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_c_apdu + 1) + p_c_apdu->offset; 403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_CMD_CLASS); 405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_CMD_INS_SELECT); 406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_CMD_P1_SELECT_BY_NAME); 407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_CMD_P2_FIRST_OR_ONLY_00H); 408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (version == T4T_VERSION_1_0) /* this is for V1.0 */ 410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_V10_NDEF_TAG_AID_LEN); 412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p, t4t_v10_ndef_tag_aid, T4T_V10_NDEF_TAG_AID_LEN); 414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_c_apdu->len = T4T_CMD_MAX_HDR_SIZE + T4T_V10_NDEF_TAG_AID_LEN; 416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (version == T4T_VERSION_2_0) /* this is for V2.0 */ 418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_V20_NDEF_TAG_AID_LEN); 420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p, t4t_v20_ndef_tag_aid, T4T_V20_NDEF_TAG_AID_LEN); 422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p += T4T_V20_NDEF_TAG_AID_LEN; 423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, 0x00); /* Le set to 0x00 */ 425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_c_apdu->len = T4T_CMD_MAX_HDR_SIZE + T4T_V20_NDEF_TAG_AID_LEN + 1; 427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!rw_t4t_send_to_lower (p_c_apdu)) 434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t4t_validate_cc_file 444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Validate CC file and mandatory NDEF TLV 446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if success 448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t4t_validate_cc_file (void) 451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T4T_CB *p_t4t = &rw_cb.tcb.t4t; 453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_t4t_validate_cc_file ()"); 455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t4t->cc_file.cclen < T4T_CC_FILE_MIN_LEN) 457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("rw_t4t_validate_cc_file (): CCLEN (%d) is too short", 459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->cc_file.cclen); 460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (T4T_GET_MAJOR_VERSION (p_t4t->cc_file.version) != T4T_GET_MAJOR_VERSION (p_t4t->version)) 464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR2 ("rw_t4t_validate_cc_file (): Peer version (0x%02X) is matched to ours (0x%02X)", 466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->cc_file.version, p_t4t->version); 467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t4t->cc_file.max_le < 0x000F) 471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("rw_t4t_validate_cc_file (): MaxLe (%d) is too small", 473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->cc_file.max_le); 474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t4t->cc_file.max_lc < 0x0001) 478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("rw_t4t_validate_cc_file (): MaxLc (%d) is too small", 480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->cc_file.max_lc); 481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_t4t->cc_file.ndef_fc.file_id == T4T_CC_FILE_ID) 485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_t4t->cc_file.ndef_fc.file_id == 0xE102) 486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_t4t->cc_file.ndef_fc.file_id == 0xE103) 487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||((p_t4t->cc_file.ndef_fc.file_id == 0x0000) && (p_t4t->cc_file.version == 0x20)) 488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_t4t->cc_file.ndef_fc.file_id == 0x3F00) 489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_t4t->cc_file.ndef_fc.file_id == 0x3FFF) 490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_t4t->cc_file.ndef_fc.file_id == 0xFFFF) ) 491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("rw_t4t_validate_cc_file (): File ID (0x%04X) is invalid", 493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->cc_file.ndef_fc.file_id); 494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_t4t->cc_file.ndef_fc.max_file_size < 0x0005) 498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_t4t->cc_file.ndef_fc.max_file_size == 0xFFFF) ) 499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("rw_t4t_validate_cc_file (): max_file_size (%d) is reserved", 501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->cc_file.ndef_fc.max_file_size); 502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t4t->cc_file.ndef_fc.read_access != T4T_FC_READ_ACCESS) 506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("rw_t4t_validate_cc_file (): Read Access (0x%02X) is invalid", 508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->cc_file.ndef_fc.read_access); 509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_t4t->cc_file.ndef_fc.write_access != T4T_FC_WRITE_ACCESS) 513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_t4t->cc_file.ndef_fc.write_access != T4T_FC_NO_WRITE_ACCESS) ) 514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("rw_t4t_validate_cc_file (): Write Access (0x%02X) is invalid", 516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->cc_file.ndef_fc.write_access); 517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t4t_handle_error 526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description notify error to application and clean up 528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t4t_handle_error (tNFC_STATUS status, UINT8 sw1, UINT8 sw2) 533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T4T_CB *p_t4t = &rw_cb.tcb.t4t; 535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA rw_data; 536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_EVENT event; 537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5387c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu RW_TRACE_DEBUG4 ("rw_t4t_handle_error (): status:0x%02X, sw1:0x%02X, sw2:0x%02X, state:0x%X", 539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status, sw1, sw2, p_t4t->state); 540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_stop_quick_timer (&p_t4t->timer); 542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.p_cback) 544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.status = status; 546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.t4t_sw.sw1 = sw1; 548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.t4t_sw.sw2 = sw2; 549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_t4t->state) 551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_STATE_DETECT_NDEF: 553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.flags = RW_NDEF_FL_UNKNOWN; 554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project event = RW_T4T_NDEF_DETECT_EVT; 555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_STATE_READ_NDEF: 558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project event = RW_T4T_NDEF_READ_FAIL_EVT; 559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_STATE_UPDATE_NDEF: 562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project event = RW_T4T_NDEF_UPDATE_FAIL_EVT; 563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_STATE_PRESENCE_CHECK: 566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project event = RW_T4T_PRESENCE_CHECK_EVT; 567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.status = NFC_STATUS_FAILED; 568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen case RW_T4T_STATE_SET_READ_ONLY: 5715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen event = RW_T4T_SET_TO_RO_EVT; 5725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen break; 5735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project event = RW_T4T_MAX_EVT; 576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->state = RW_T4T_STATE_IDLE; 580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (event != RW_T4T_MAX_EVT) 582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (event, &rw_data); 584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->state = RW_T4T_STATE_IDLE; 589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t4t_sm_detect_ndef 595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description State machine for NDEF detection procedure 597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t4t_sm_detect_ndef (BT_HDR *p_r_apdu) 602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T4T_CB *p_t4t = &rw_cb.tcb.t4t; 604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p, type, length; 605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 status_words, nlen; 606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA rw_data; 607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG2 ("rw_t4t_sm_detect_ndef (): sub_state:%s (%d)", 610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_get_sub_state_name (p_t4t->sub_state), p_t4t->sub_state); 611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else 612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("rw_t4t_sm_detect_ndef (): sub_state=%d", p_t4t->sub_state); 613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* get status words */ 616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_r_apdu + 1) + p_r_apdu->offset; 617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p += (p_r_apdu->len - T4T_RSP_STATUS_WORDS_SIZE); 618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (status_words, p); 619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status_words != T4T_RSP_CMD_CMPLTED) 621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* try V1.0 after failing of V2.0 */ 623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_t4t->sub_state == RW_T4T_SUBSTATE_WAIT_SELECT_APP) 624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_t4t->version == T4T_VERSION_2_0) ) 625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->version = T4T_VERSION_1_0; 627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("rw_t4t_sm_detect_ndef (): retry with version=0x%02X", 629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->version); 630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!rw_t4t_select_application (T4T_VERSION_1_0)) 632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0); 634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->ndef_status &= ~ (RW_T4T_NDEF_STATUS_NDEF_DETECTED); 639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_handle_error (NFC_STATUS_CMD_NOT_CMPLTD, *(p-2), *(p-1)); 640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_t4t->sub_state) 644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_SUBSTATE_WAIT_SELECT_APP: 646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* NDEF Tag application has been selected then select CC file */ 648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!rw_t4t_select_file (T4T_CC_FILE_ID)) 649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0); 651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->sub_state = RW_T4T_SUBSTATE_WAIT_SELECT_CC; 655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_SUBSTATE_WAIT_SELECT_CC: 659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* CC file has been selected then read mandatory part of CC file */ 661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!rw_t4t_read_file (0x00, T4T_CC_FILE_MIN_LEN, FALSE)) 662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0); 664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->sub_state = RW_T4T_SUBSTATE_WAIT_CC_FILE; 668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_SUBSTATE_WAIT_CC_FILE: 672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* CC file has been read then validate and select mandatory NDEF file */ 674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_r_apdu->len >= T4T_CC_FILE_MIN_LEN + T4T_RSP_STATUS_WORDS_SIZE) 675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_r_apdu + 1) + p_r_apdu->offset; 677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (p_t4t->cc_file.cclen, p); 679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT8 (p_t4t->cc_file.version, p); 680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (p_t4t->cc_file.max_le, p); 681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (p_t4t->cc_file.max_lc, p); 682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT8 (type, p); 684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT8 (length, p); 685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (type == T4T_NDEF_FILE_CONTROL_TYPE) 687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(length == T4T_FILE_CONTROL_LENGTH) ) 688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (p_t4t->cc_file.ndef_fc.file_id, p); 690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (p_t4t->cc_file.ndef_fc.max_file_size, p); 691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT8 (p_t4t->cc_file.ndef_fc.read_access, p); 692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT8 (p_t4t->cc_file.ndef_fc.write_access, p); 693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("Capability Container (CC) file"); 696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 (" CCLEN: 0x%04X", p_t4t->cc_file.cclen); 697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 (" Version:0x%02X", p_t4t->cc_file.version); 698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 (" MaxLe: 0x%04X", p_t4t->cc_file.max_le); 699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 (" MaxLc: 0x%04X", p_t4t->cc_file.max_lc); 700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 (" NDEF File Control TLV"); 701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 (" FileID: 0x%04X", p_t4t->cc_file.ndef_fc.file_id); 702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 (" MaxFileSize: 0x%04X", p_t4t->cc_file.ndef_fc.max_file_size); 703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 (" ReadAccess: 0x%02X", p_t4t->cc_file.ndef_fc.read_access); 704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 (" WriteAccess: 0x%02X", p_t4t->cc_file.ndef_fc.write_access); 705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_t4t_validate_cc_file ()) 708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!rw_t4t_select_file (p_t4t->cc_file.ndef_fc.file_id)) 710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0); 712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->sub_state = RW_T4T_SUBSTATE_WAIT_SELECT_NDEF_FILE; 716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* invalid response or CC file */ 723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->ndef_status &= ~ (RW_T4T_NDEF_STATUS_NDEF_DETECTED); 724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_handle_error (NFC_STATUS_BAD_RESP, 0, 0); 725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_SUBSTATE_WAIT_SELECT_NDEF_FILE: 728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* NDEF file has been selected then read the first 2 bytes (NLEN) */ 730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!rw_t4t_read_file (0, T4T_FILE_LENGTH_SIZE, FALSE)) 731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0); 733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->sub_state = RW_T4T_SUBSTATE_WAIT_READ_NLEN; 737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_SUBSTATE_WAIT_READ_NLEN: 741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* NLEN has been read then report upper layer */ 743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_r_apdu->len == T4T_FILE_LENGTH_SIZE + T4T_RSP_STATUS_WORDS_SIZE) 744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* get length of NDEF */ 746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_r_apdu + 1) + p_r_apdu->offset; 747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (nlen, p); 748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nlen <= p_t4t->cc_file.ndef_fc.max_file_size - T4T_FILE_LENGTH_SIZE) 750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->ndef_status = RW_T4T_NDEF_STATUS_NDEF_DETECTED; 752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t4t->cc_file.ndef_fc.write_access != T4T_FC_WRITE_ACCESS) 754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->ndef_status |= RW_T4T_NDEF_STATUS_NDEF_READ_ONLY; 756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Get max bytes to read per command */ 759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t4t->cc_file.max_le >= RW_T4T_MAX_DATA_PER_READ) 760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->max_read_size = RW_T4T_MAX_DATA_PER_READ; 762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->max_read_size = p_t4t->cc_file.max_le; 766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Le: valid range is 0x01 to 0xFF */ 769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t4t->max_read_size >= T4T_MAX_LENGTH_LE) 770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->max_read_size = T4T_MAX_LENGTH_LE; 772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Get max bytes to update per command */ 775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t4t->cc_file.max_lc >= RW_T4T_MAX_DATA_PER_WRITE) 776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->max_update_size = RW_T4T_MAX_DATA_PER_WRITE; 778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->max_update_size = p_t4t->cc_file.max_lc; 782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Lc: valid range is 0x01 to 0xFF */ 785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t4t->max_update_size >= T4T_MAX_LENGTH_LC) 786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->max_update_size = T4T_MAX_LENGTH_LC; 788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->ndef_length = nlen; 791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->state = RW_T4T_STATE_IDLE; 792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.p_cback) 794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.status = NFC_STATUS_OK; 796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.protocol = NFC_PROTOCOL_ISO_DEP; 797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.max_size = (UINT32) (p_t4t->cc_file.ndef_fc.max_file_size - (UINT16) T4T_FILE_LENGTH_SIZE); 798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.cur_size = nlen; 799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.flags = RW_NDEF_FL_SUPPORTED | RW_NDEF_FL_FORMATED; 800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t4t->cc_file.ndef_fc.write_access != T4T_FC_WRITE_ACCESS) 801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.ndef.flags |= RW_NDEF_FL_READ_ONLY; 803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T4T_NDEF_DETECT_EVT, &rw_data); 806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_t4t_sm_detect_ndef (): Sent RW_T4T_NDEF_DETECT_EVT"); 808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* NLEN should be less than max file size */ 813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR2 ("rw_t4t_sm_detect_ndef (): NLEN (%d) + 2 must be <= max file size (%d)", 814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nlen, p_t4t->cc_file.ndef_fc.max_file_size); 815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->ndef_status &= ~ (RW_T4T_NDEF_STATUS_NDEF_DETECTED); 817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_handle_error (NFC_STATUS_BAD_RESP, 0, 0); 818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* response payload size should be T4T_FILE_LENGTH_SIZE */ 823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR2 ("rw_t4t_sm_detect_ndef (): Length (%d) of R-APDU must be %d", 824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_r_apdu->len, T4T_FILE_LENGTH_SIZE + T4T_RSP_STATUS_WORDS_SIZE); 825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->ndef_status &= ~ (RW_T4T_NDEF_STATUS_NDEF_DETECTED); 827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_handle_error (NFC_STATUS_BAD_RESP, 0, 0); 828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("rw_t4t_sm_detect_ndef (): unknown sub_state=%d", p_t4t->sub_state); 833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0); 834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t4t_sm_read_ndef 841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description State machine for NDEF read procedure 843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t4t_sm_read_ndef (BT_HDR *p_r_apdu) 848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T4T_CB *p_t4t = &rw_cb.tcb.t4t; 850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 status_words; 852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA rw_data; 853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG2 ("rw_t4t_sm_read_ndef (): sub_state:%s (%d)", 856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_get_sub_state_name (p_t4t->sub_state), p_t4t->sub_state); 857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else 858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("rw_t4t_sm_read_ndef (): sub_state=%d", p_t4t->sub_state); 859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* get status words */ 862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_r_apdu + 1) + p_r_apdu->offset; 863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p += (p_r_apdu->len - T4T_RSP_STATUS_WORDS_SIZE); 864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (status_words, p); 865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status_words != T4T_RSP_CMD_CMPLTED) 867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_handle_error (NFC_STATUS_CMD_NOT_CMPLTD, *(p-2), *(p-1)); 869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_r_apdu); 870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_t4t->sub_state) 874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_SUBSTATE_WAIT_READ_RESP: 876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Read partial or complete data */ 878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_r_apdu->len -= T4T_RSP_STATUS_WORDS_SIZE; 879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_r_apdu->len > 0) && (p_r_apdu->len <= p_t4t->rw_length)) 881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->rw_length -= p_r_apdu->len; 883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->rw_offset += p_r_apdu->len; 884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.p_cback) 886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.data.status = NFC_STATUS_OK; 888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.data.p_data = p_r_apdu; 889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if need to read more data */ 891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t4t->rw_length > 0) 892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T4T_NDEF_READ_EVT, &rw_data); 894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!rw_t4t_read_file (p_t4t->rw_offset, p_t4t->rw_length, TRUE)) 896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0); 898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->state = RW_T4T_STATE_IDLE; 903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T4T_NDEF_READ_CPLT_EVT, &rw_data); 905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_t4t_sm_read_ndef (): Sent RW_T4T_NDEF_READ_CPLT_EVT"); 907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_r_apdu = NULL; 911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->rw_length = 0; 915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->state = RW_T4T_STATE_IDLE; 916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR2 ("rw_t4t_sm_read_ndef (): invalid payload length (%d), rw_length (%d)", 921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_r_apdu->len, p_t4t->rw_length); 922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_handle_error (NFC_STATUS_BAD_RESP, 0, 0); 923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("rw_t4t_sm_read_ndef (): unknown sub_state = %d", p_t4t->sub_state); 928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0); 929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_r_apdu) 933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_r_apdu); 934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t4t_sm_update_ndef 939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description State machine for NDEF update procedure 941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t4t_sm_update_ndef (BT_HDR *p_r_apdu) 946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T4T_CB *p_t4t = &rw_cb.tcb.t4t; 948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 status_words; 950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA rw_data; 951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG2 ("rw_t4t_sm_update_ndef (): sub_state:%s (%d)", 954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_get_sub_state_name (p_t4t->sub_state), p_t4t->sub_state); 955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else 956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("rw_t4t_sm_update_ndef (): sub_state=%d", p_t4t->sub_state); 957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Get status words */ 960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_r_apdu + 1) + p_r_apdu->offset; 961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p += (p_r_apdu->len - T4T_RSP_STATUS_WORDS_SIZE); 962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (status_words, p); 963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status_words != T4T_RSP_CMD_CMPLTED) 965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_handle_error (NFC_STATUS_CMD_NOT_CMPLTD, *(p-2), *(p-1)); 967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_t4t->sub_state) 971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_SUBSTATE_WAIT_UPDATE_NLEN: 973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* NLEN has been updated */ 975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if need to update data */ 976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t4t->p_update_data) 977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->sub_state = RW_T4T_SUBSTATE_WAIT_UPDATE_RESP; 979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!rw_t4t_update_file ()) 981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0); 983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->p_update_data = NULL; 984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->state = RW_T4T_STATE_IDLE; 989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* just finished last step of updating (updating NLEN) */ 991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.p_cback) 992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.status = NFC_STATUS_OK; 994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T4T_NDEF_UPDATE_CPLT_EVT, &rw_data); 996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_t4t_sm_update_ndef (): Sent RW_T4T_NDEF_UPDATE_CPLT_EVT"); 997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_SUBSTATE_WAIT_UPDATE_RESP: 1002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if updating is not completed */ 1004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t4t->rw_length > 0) 1005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!rw_t4t_update_file ()) 1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0); 1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->p_update_data = NULL; 1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->p_update_data = NULL; 1015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* update NLEN as last step of updating file */ 1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!rw_t4t_update_nlen (p_t4t->ndef_length)) 1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0); 1020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->sub_state = RW_T4T_SUBSTATE_WAIT_UPDATE_NLEN; 1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("rw_t4t_sm_update_ndef (): unknown sub_state = %d", p_t4t->sub_state); 1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0); 1031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 10375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function rw_t4t_sm_set_readonly 10385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 10395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description State machine for CC update procedure 10405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 10415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns none 10425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 10435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/ 10445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic void rw_t4t_sm_set_readonly (BT_HDR *p_r_apdu) 10455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{ 10465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen tRW_T4T_CB *p_t4t = &rw_cb.tcb.t4t; 10475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 *p; 10485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT16 status_words; 10495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen tRW_DATA rw_data; 10505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 10515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#if (BT_TRACE_VERBOSE == TRUE) 10525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_TRACE_DEBUG2 ("rw_t4t_sm_set_readonly (): sub_state:%s (%d)", 10535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen rw_t4t_get_sub_state_name (p_t4t->sub_state), p_t4t->sub_state); 10545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#else 10555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_TRACE_DEBUG1 ("rw_t4t_sm_set_readonly (): sub_state=%d", p_t4t->sub_state); 10565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#endif 10575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 10585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Get status words */ 10595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p = (UINT8 *) (p_r_apdu + 1) + p_r_apdu->offset; 10605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p += (p_r_apdu->len - T4T_RSP_STATUS_WORDS_SIZE); 10615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen BE_STREAM_TO_UINT16 (status_words, p); 10625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 10635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (status_words != T4T_RSP_CMD_CMPLTED) 10645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 10655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen rw_t4t_handle_error (NFC_STATUS_CMD_NOT_CMPLTD, *(p-2), *(p-1)); 10665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return; 10675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 10685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 10695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen switch (p_t4t->sub_state) 10705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 10715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen case RW_T4T_SUBSTATE_WAIT_SELECT_CC: 10725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 10735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* CC file has been selected then update write access to read-only in CC file */ 10745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (!rw_t4t_update_cc_to_readonly ()) 10755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 10765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0); 10775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 10785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else 10795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 10805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_t4t->sub_state = RW_T4T_SUBSTATE_WAIT_UPDATE_CC; 10815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 10825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen break; 10835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 10845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen case RW_T4T_SUBSTATE_WAIT_UPDATE_CC: 10855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* CC Updated, Select NDEF File to allow NDEF operation */ 10865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_t4t->cc_file.ndef_fc.write_access = T4T_FC_NO_WRITE_ACCESS; 10875c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_t4t->ndef_status |= RW_T4T_NDEF_STATUS_NDEF_READ_ONLY; 10885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 10895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (!rw_t4t_select_file (p_t4t->cc_file.ndef_fc.file_id)) 10905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 10915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0); 10925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 10935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else 10945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 10955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_t4t->sub_state = RW_T4T_SUBSTATE_WAIT_SELECT_NDEF_FILE; 10965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 10975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen break; 10985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 10995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen case RW_T4T_SUBSTATE_WAIT_SELECT_NDEF_FILE: 11005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_t4t->state = RW_T4T_STATE_IDLE; 11015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* just finished last step of configuring tag read only (Selecting NDEF file CC) */ 11025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (rw_cb.p_cback) 11035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 11045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen rw_data.status = NFC_STATUS_OK; 11055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 11065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_TRACE_DEBUG0 ("rw_t4t_sm_set_readonly (): Sent RW_T4T_SET_TO_RO_EVT"); 11075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen (*(rw_cb.p_cback)) (RW_T4T_SET_TO_RO_EVT, &rw_data); 11085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 11095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen break; 11105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 11115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen default: 11125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_TRACE_ERROR1 ("rw_t4t_sm_set_readonly (): unknown sub_state = %d", p_t4t->sub_state); 11135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen rw_t4t_handle_error (NFC_STATUS_FAILED, 0, 0); 11145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen break; 11155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 11165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 11175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 11185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/******************************************************************************* 11195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 1120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t4t_process_timeout 1121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description process timeout event 1123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 1125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_t4t_process_timeout (TIMER_LIST_ENT *p_tle) 1128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("rw_t4t_process_timeout () event=%d", p_tle->event); 1130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_tle->event == NFC_TTYPE_RW_T4T_RESPONSE) 1132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_handle_error (NFC_STATUS_TIMEOUT, 0, 0); 1134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("rw_t4t_process_timeout () unknown event=%d", p_tle->event); 1138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t4t_data_cback 1144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This callback function receives the data from NFCC. 1146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t4t_data_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data) 1151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T4T_CB *p_t4t = &rw_cb.tcb.t4t; 11537c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu BT_HDR *p_r_apdu; 1154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA rw_data; 1155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 1157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 begin_state = p_t4t->state; 1158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 1159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("rw_t4t_data_cback () event = 0x%X", event); 1161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_stop_quick_timer (&p_t4t->timer); 1162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (event) 1164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_DEACTIVATE_CEVT: 1166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_SetStaticRfCback (NULL); 1167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->state = RW_T4T_STATE_NOT_ACTIVATED; 1168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 1169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_ERROR_CEVT: 11717c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu rw_data.status = (tNFC_STATUS) (*(UINT8*) p_data); 11727c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu 11737c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu if (p_t4t->state != RW_T4T_STATE_IDLE) 1174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 11757c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu rw_t4t_handle_error (rw_data.status, 0, 0); 1176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T4T_INTF_ERROR_EVT, &rw_data); 1180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 1182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_DATA_CEVT: 11847c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu p_r_apdu = (BT_HDR *) p_data->data.p_data; 1185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 1188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 1189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE) 1192a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if (p_t4t->state != RW_T4T_STATE_IDLE) 1193a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu DispRWT4Tags (p_r_apdu, TRUE); 1194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 1195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 1197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG2 ("RW T4T state: <%s (%d)>", 1198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_get_state_name (p_t4t->state), p_t4t->state); 1199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else 1200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("RW T4T state: %d", p_t4t->state); 1201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 1202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_t4t->state) 1204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_STATE_IDLE: 1206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Unexpected R-APDU, it should be raw frame response */ 1207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* forward to upper layer without parsing */ 1208a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#if (BT_TRACE_VERBOSE == TRUE) 1209a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu RW_TRACE_DEBUG2 ("RW T4T Raw Frame: Len [0x%X] Status [%s]", p_r_apdu->len, NFC_GetStatusName (p_data->data.status)); 1210a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#else 1211a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu RW_TRACE_DEBUG2 ("RW T4T Raw Frame: Len [0x%X] Status [0x%X]", p_r_apdu->len, p_data->data.status); 1212a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#endif 1213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.p_cback) 1214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1215a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu rw_data.raw_frame.status = p_data->data.status; 1216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.raw_frame.p_data = p_r_apdu; 1217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T4T_RAW_FRAME_EVT, &rw_data); 1218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_r_apdu = NULL; 1219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_r_apdu); 1223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_STATE_DETECT_NDEF: 1226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_sm_detect_ndef (p_r_apdu); 1227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_r_apdu); 1228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_STATE_READ_NDEF: 1230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_sm_read_ndef (p_r_apdu); 1231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* p_r_apdu may send upper lyaer */ 1232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_STATE_UPDATE_NDEF: 1234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_sm_update_ndef (p_r_apdu); 1235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_r_apdu); 1236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_STATE_PRESENCE_CHECK: 1238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if any response, send presence check with ok */ 1239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_data.status = NFC_STATUS_OK; 1240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->state = RW_T4T_STATE_IDLE; 1241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T4T_PRESENCE_CHECK_EVT, &rw_data); 1242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_r_apdu); 1243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 12445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen case RW_T4T_STATE_SET_READ_ONLY: 12455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen rw_t4t_sm_set_readonly (p_r_apdu); 12465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen GKI_freebuf (p_r_apdu); 12475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen break; 1248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 1249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("rw_t4t_data_cback (): invalid state=%d", p_t4t->state); 1250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_r_apdu); 1251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 1255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (begin_state != p_t4t->state) 1256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG2 ("RW T4T state changed:<%s> -> <%s>", 1258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_get_state_name (begin_state), 1259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t4t_get_state_name (p_t4t->state)); 1260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 1262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t4t_select 1268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Initialise T4T 1270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 1272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_t4t_select (void) 1275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T4T_CB *p_t4t = &rw_cb.tcb.t4t; 1277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_t4t_select ()"); 1279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_SetStaticRfCback (rw_t4t_data_cback); 1281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->state = RW_T4T_STATE_IDLE; 1283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->version = T4T_MY_VERSION; 1284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* set it min of max R-APDU data size before reading CC file */ 1286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->cc_file.max_le = T4T_MIN_MLE; 1287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* These will be udated during NDEF detection */ 1289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->max_read_size = T4T_MAX_LENGTH_LE; 1290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->max_update_size = T4T_MAX_LENGTH_LC; 1291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 1293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T4tDetectNDef 1298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function performs NDEF detection procedure 1300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_T4T_NDEF_DETECT_EVT will be returned 1302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 1304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED if T4T is busy or other error 1305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T4tDetectNDef (void) 1308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_T4tDetectNDef ()"); 1310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.t4t.state != RW_T4T_STATE_IDLE) 1312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_T4tDetectNDef ():Unable to start command at state (0x%X)", 1314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.t4t.state); 1315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 1316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.t4t.ndef_status & RW_T4T_NDEF_STATUS_NDEF_DETECTED) 1319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* NDEF Tag application has been selected then select CC file */ 1321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!rw_t4t_select_file (T4T_CC_FILE_ID)) 1322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 1324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.t4t.sub_state = RW_T4T_SUBSTATE_WAIT_SELECT_CC; 1326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Select NDEF Tag Application */ 1330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!rw_t4t_select_application (rw_cb.tcb.t4t.version)) 1331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 1333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.t4t.sub_state = RW_T4T_SUBSTATE_WAIT_SELECT_APP; 1335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.t4t.state = RW_T4T_STATE_DETECT_NDEF; 1338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 1340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T4tReadNDef 1345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function performs NDEF read procedure 1347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Note: RW_T4tDetectNDef () must be called before using this 1348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The following event will be returned 1350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_T4T_NDEF_READ_EVT for each segmented NDEF message 1351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_T4T_NDEF_READ_CPLT_EVT for the last segment or complete NDEF 1352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_T4T_NDEF_READ_FAIL_EVT for failure 1353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 1355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED if T4T is busy or other error 1356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T4tReadNDef (void) 1359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_T4tReadNDef ()"); 1361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.t4t.state != RW_T4T_STATE_IDLE) 1363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_T4tReadNDef ():Unable to start command at state (0x%X)", 1365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.t4t.state); 1366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 1367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if NDEF has been detected */ 1370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.t4t.ndef_status & RW_T4T_NDEF_STATUS_NDEF_DETECTED) 1371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* start reading NDEF */ 1373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!rw_t4t_read_file (T4T_FILE_LENGTH_SIZE, rw_cb.tcb.t4t.ndef_length, FALSE)) 1374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 1376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.t4t.state = RW_T4T_STATE_READ_NDEF; 1379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.t4t.sub_state = RW_T4T_SUBSTATE_WAIT_READ_RESP; 1380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 1382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("RW_T4tReadNDef ():No NDEF detected"); 1386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 1387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T4tUpdateNDef 1393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function performs NDEF update procedure 1395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Note: RW_T4tDetectNDef () must be called before using this 1396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Updating data must not be removed until returning event 1397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The following event will be returned 1399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_T4T_NDEF_UPDATE_CPLT_EVT for complete 1400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_T4T_NDEF_UPDATE_FAIL_EVT for failure 1401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 1403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED if T4T is busy or other error 1404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T4tUpdateNDef (UINT16 length, UINT8 *p_data) 1407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API1 ("RW_T4tUpdateNDef () length:%d", length); 1409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.t4t.state != RW_T4T_STATE_IDLE) 1411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_T4tUpdateNDef ():Unable to start command at state (0x%X)", 1413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.t4t.state); 1414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 1415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if NDEF has been detected */ 1418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.t4t.ndef_status & RW_T4T_NDEF_STATUS_NDEF_DETECTED) 1419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if read-only */ 1421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.t4t.ndef_status & RW_T4T_NDEF_STATUS_NDEF_READ_ONLY) 1422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("RW_T4tUpdateNDef ():NDEF is read-only"); 1424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 1425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.t4t.cc_file.ndef_fc.max_file_size < length + T4T_FILE_LENGTH_SIZE) 1428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR2 ("RW_T4tUpdateNDef ():data (%d bytes) plus NLEN is more than max file size (%d)", 1430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length, rw_cb.tcb.t4t.cc_file.ndef_fc.max_file_size); 1431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 1432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* store NDEF length and data */ 1435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.t4t.ndef_length = length; 1436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.t4t.p_update_data = p_data; 1437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.t4t.rw_offset = T4T_FILE_LENGTH_SIZE; 1439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.t4t.rw_length = length; 1440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* set NLEN to 0x0000 for the first step */ 1442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!rw_t4t_update_nlen (0x0000)) 1443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 1445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.t4t.state = RW_T4T_STATE_UPDATE_NDEF; 1448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.t4t.sub_state = RW_T4T_SUBSTATE_WAIT_UPDATE_NLEN; 1449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 1451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("RW_T4tUpdateNDef ():No NDEF detected"); 1455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 1456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T4tPresenceCheck 1462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 1464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Check if the tag is still in the field. 1465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The RW_T4T_PRESENCE_CHECK_EVT w/ status is used to indicate presence 1467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** or non-presence. 1468a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** option is RW_T4T_CHK_EMPTY_I_BLOCK, use empty I block for presence check. 1469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 1471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK, if raw data frame sent 1472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 1473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 1474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 1476a24be4f06674b2707b57904deaa0dff5a95823bdEvan ChutNFC_STATUS RW_T4tPresenceCheck (UINT8 option) 1477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS retval = NFC_STATUS_OK; 1479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA evt_data; 1480a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu BOOLEAN status; 1481a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu BT_HDR *p_data; 1482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1483a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu RW_TRACE_API1 ("RW_T4tPresenceCheck () %d", option); 1484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If RW_SelectTagType was not called (no conn_callback) return failure */ 1486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!rw_cb.p_cback) 1487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project retval = NFC_STATUS_FAILED; 1489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If we are not activated, then RW_T4T_PRESENCE_CHECK_EVT with NFC_STATUS_FAILED */ 1491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (rw_cb.tcb.t4t.state == RW_T4T_STATE_NOT_ACTIVATED) 1492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_FAILED; 1494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*rw_cb.p_cback) (RW_T4T_PRESENCE_CHECK_EVT, &evt_data); 1495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If command is pending, assume tag is still present */ 1497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (rw_cb.tcb.t4t.state != RW_T4T_STATE_IDLE) 1498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_OK; 15005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen (*rw_cb.p_cback) (RW_T4T_PRESENCE_CHECK_EVT, &evt_data); 1501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1504a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu status = FALSE; 1505a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if (option == RW_T4T_CHK_EMPTY_I_BLOCK) 1506a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 1507a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu /* use empty I block for presence check */ 1508a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if ((p_data = (BT_HDR *) GKI_getbuf (NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE)) != NULL) 1509a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 1510a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu p_data->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 1511a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu p_data->len = 0; 1512a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if (NFC_SendData (NFC_RF_CONN_ID, (BT_HDR*) p_data) == NFC_STATUS_OK) 1513a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu status = TRUE; 1514a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 1515a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 1516a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu else 1517a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 1518a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu /* use read binary on the given channel */ 1519a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu rw_cb.tcb.t4t.channel = 0; 1520a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if (option <= RW_T4T_CHK_READ_BINARY_CH3) 1521a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu rw_cb.tcb.t4t.channel = option; 1522a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu status = rw_t4t_read_file (0, 1, FALSE); 1523a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu rw_cb.tcb.t4t.channel = 0; 1524a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 1525a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 1526a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if (status == TRUE) 1527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.tcb.t4t.state = RW_T4T_STATE_PRESENCE_CHECK; 1529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project retval = NFC_STATUS_NO_BUFFERS; 1533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (retval); 1537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 15395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/***************************************************************************** 15405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 15415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function RW_T4tSetNDefReadOnly 15425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 15435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description This function performs NDEF read-only procedure 15445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Note: RW_T4tDetectNDef() must be called before using this 15455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 15465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** The RW_T4T_SET_TO_RO_EVT event will be returned. 15475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 15485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns NFC_STATUS_OK if success 15495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** NFC_STATUS_FAILED if T4T is busy or other error 15505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 15515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*****************************************************************************/ 15525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn CoenentNFC_STATUS RW_T4tSetNDefReadOnly (void) 15535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{ 15545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen tNFC_STATUS retval = NFC_STATUS_OK; 15555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen tRW_DATA evt_data; 15565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 15575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_TRACE_API0 ("RW_T4tSetNDefReadOnly ()"); 15585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 15595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (rw_cb.tcb.t4t.state != RW_T4T_STATE_IDLE) 15605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 15615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_TRACE_ERROR1 ("RW_T4tSetNDefReadOnly ():Unable to start command at state (0x%X)", 15625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen rw_cb.tcb.t4t.state); 15635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return NFC_STATUS_FAILED; 15645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 15655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 15665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* if NDEF has been detected */ 15675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (rw_cb.tcb.t4t.ndef_status & RW_T4T_NDEF_STATUS_NDEF_DETECTED) 15685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 15695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* if read-only */ 15705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (rw_cb.tcb.t4t.ndef_status & RW_T4T_NDEF_STATUS_NDEF_READ_ONLY) 15715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 15727c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu RW_TRACE_API0 ("RW_T4tSetNDefReadOnly (): NDEF is already read-only"); 15737c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu 15745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen evt_data.status = NFC_STATUS_OK; 15755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen (*rw_cb.p_cback) (RW_T4T_SET_TO_RO_EVT, &evt_data); 15765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return (retval); 15775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 15785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 15795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* NDEF Tag application has been selected then select CC file */ 15805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (!rw_t4t_select_file (T4T_CC_FILE_ID)) 15815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 15825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return NFC_STATUS_FAILED; 15835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 15845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 15855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen rw_cb.tcb.t4t.state = RW_T4T_STATE_SET_READ_ONLY; 15865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen rw_cb.tcb.t4t.sub_state = RW_T4T_SUBSTATE_WAIT_SELECT_CC; 15875c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 15885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return NFC_STATUS_OK; 15895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 15905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else 15915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 15925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_TRACE_ERROR0 ("RW_T4tSetNDefReadOnly ():No NDEF detected"); 15935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return NFC_STATUS_FAILED; 15945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 15955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return (retval); 15965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 15975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 1598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 1599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t4t_get_state_name 1602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function returns the state name. 1604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NOTE conditionally compiled to save memory. 1606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns pointer to the name 1608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *rw_t4t_get_state_name (UINT8 state) 1611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (state) 1613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_STATE_NOT_ACTIVATED: 1615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("NOT_ACTIVATED"); 1616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_STATE_IDLE: 1617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("IDLE"); 1618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_STATE_DETECT_NDEF: 1619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("NDEF_DETECTION"); 1620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_STATE_READ_NDEF: 1621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("READ_NDEF"); 1622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_STATE_UPDATE_NDEF: 1623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("UPDATE_NDEF"); 1624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_STATE_PRESENCE_CHECK: 1625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("PRESENCE_CHECK"); 16267c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu case RW_T4T_STATE_SET_READ_ONLY: 16277c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu return ("SET_READ_ONLY"); 16287c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu 1629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 1630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("???? UNKNOWN STATE"); 1631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t4t_get_sub_state_name 1637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function returns the sub_state name. 1639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NOTE conditionally compiled to save memory. 1641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns pointer to the name 1643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *rw_t4t_get_sub_state_name (UINT8 sub_state) 1646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (sub_state) 1648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_SUBSTATE_WAIT_SELECT_APP: 1650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("WAIT_SELECT_APP"); 1651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_SUBSTATE_WAIT_SELECT_CC: 1652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("WAIT_SELECT_CC"); 1653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_SUBSTATE_WAIT_CC_FILE: 1654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("WAIT_CC_FILE"); 1655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_SUBSTATE_WAIT_SELECT_NDEF_FILE: 1656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("WAIT_SELECT_NDEF_FILE"); 1657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_SUBSTATE_WAIT_READ_NLEN: 1658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("WAIT_READ_NLEN"); 1659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_SUBSTATE_WAIT_READ_RESP: 1661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("WAIT_READ_RESP"); 1662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_SUBSTATE_WAIT_UPDATE_RESP: 1663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("WAIT_UPDATE_RESP"); 1664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T4T_SUBSTATE_WAIT_UPDATE_NLEN: 1665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("WAIT_UPDATE_NLEN"); 1666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 1667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("???? UNKNOWN SUBSTATE"); 1668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 1671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* (NFC_INCLUDED == TRUE) */ 1673