ce_t4t.c revision e9df6ba5a8fcccf306a80b1670b423be8fe7746
1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 3e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Copyright (C) 2010-2012 Broadcom Corporation 4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * you may not use this file except in compliance with the License. 7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * You may obtain a copy of the License at: 8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * See the License for the specific language governing permissions and 15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * limitations under the License. 16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * This file contains the implementation for Type 4 tag in Card Emulation 22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * mode. 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h> 26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_target.h" 27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "bt_types.h" 28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "trace_api.h" 29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_INCLUDED == TRUE) 31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_api.h" 32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_int.h" 33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "ce_api.h" 34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "ce_int.h" 35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "tags_int.h" 36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "gki.h" 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (CE_TEST_INCLUDED == TRUE) /* test only */ 39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN mapping_aid_test_enabled = FALSE; 40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8 ce_test_tag_app_id[T4T_V20_NDEF_TAG_AID_LEN] = {0xD2, 0x76, 0x00, 0x00, 0x85, 0x01, 0x01}; 41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function ce_t4t_send_to_lower 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send packet to lower layer 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if success 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN ce_t4t_send_to_lower (BT_HDR *p_r_apdu) 53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE) 55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project DispCET4Tags (p_r_apdu, FALSE); 56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (NFC_SendData (NFC_RF_CONN_ID, p_r_apdu) != NFC_STATUS_OK) 59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR0 ("ce_t4t_send_to_lower (): NFC_SendData () failed"); 61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function ce_t4t_send_status 69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send status on R-APDU to peer 71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if success 73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN ce_t4t_send_status (UINT16 status) 76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_r_apdu; 78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG1 ("ce_t4t_send_status (): Status:0x%04X", status); 81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_r_apdu = (BT_HDR *) GKI_getpoolbuf (NFC_CE_POOL_ID); 83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_r_apdu) 85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR0 ("ce_t4t_send_status (): Cannot allocate buffer"); 87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_r_apdu->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_r_apdu + 1) + p_r_apdu->offset; 92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, status); 94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_r_apdu->len = T4T_RSP_STATUS_WORDS_SIZE; 96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!ce_t4t_send_to_lower (p_r_apdu)) 98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function ce_t4t_select_file 107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Select a file 109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if success 111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN ce_t4t_select_file (UINT16 file_id) 114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t; 116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG1 ("ce_t4t_select_file (): FileID:0x%04X", file_id); 118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (file_id == T4T_CC_FILE_ID) 120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG0 ("ce_t4t_select_file (): Select CC file"); 122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->status |= CE_T4T_STATUS_CC_FILE_SELECTED; 124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->status &= ~ (CE_T4T_STATUS_NDEF_SELECTED); 125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (file_id == CE_T4T_MANDATORY_NDEF_FILE_ID) 130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG3 ("ce_t4t_select_file (): NLEN:0x%04X, MaxFileSize:0x%04X, WriteAccess:%s", 132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->nlen, 133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->max_file_size, 134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (p_t4t->status & CE_T4T_STATUS_NDEF_FILE_READ_ONLY ? "RW" : "RO")); 135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->status |= CE_T4T_STATUS_NDEF_SELECTED; 137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->status &= ~ (CE_T4T_STATUS_CC_FILE_SELECTED); 138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR1 ("ce_t4t_select_file (): Cannot find file ID (0x%04X)", file_id); 144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->status &= ~ (CE_T4T_STATUS_CC_FILE_SELECTED); 146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->status &= ~ (CE_T4T_STATUS_NDEF_SELECTED); 147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function ce_t4t_read_binary 155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Read data from selected file and send R-APDU to peer 157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if success 159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN ce_t4t_read_binary (UINT16 offset, UINT8 length) 162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t; 164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_src = NULL, *p_dst; 165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_r_apdu; 166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG3 ("ce_t4t_read_binary (): Offset:0x%04X, Length:0x%04X, selected status = 0x%02X", 168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset, length, p_t4t->status); 169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t4t->status & CE_T4T_STATUS_CC_FILE_SELECTED) 171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_src = p_t4t->cc_file; 173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_t4t->status & CE_T4T_STATUS_NDEF_SELECTED) 175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t4t->p_scratch_buf) 177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_src = p_t4t->p_scratch_buf; 178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_src = p_t4t->p_ndef_msg; 180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_src) 183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_r_apdu = (BT_HDR *) GKI_getpoolbuf (NFC_CE_POOL_ID); 185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_r_apdu) 187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR0 ("ce_t4t_read_binary (): Cannot allocate buffer"); 189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_r_apdu->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_dst = (UINT8 *) (p_r_apdu + 1) + p_r_apdu->offset; 194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_r_apdu->len = length; 196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* add NLEN before NDEF message and adjust offset */ 198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if NDEF file is selected and offset < T4T_FILE_LENGTH_SIZE */ 199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_t4t->status & CE_T4T_STATUS_NDEF_SELECTED) && (length > 0)) 200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (offset == 0) 202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p_dst, p_t4t->nlen); 204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (length == 1) 206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length = 0; 208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_dst--; 209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else /* length >= 2 */ 211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length -= T4T_FILE_LENGTH_SIZE; 212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (offset == 1) 214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p_dst, (UINT8) (p_t4t->nlen)); 216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset = 0; 218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length--; 219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset -= T4T_FILE_LENGTH_SIZE; 223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (length > 0) 227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_dst, p_src + offset, length); 229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_dst += length; 230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p_dst, T4T_RSP_CMD_CMPLTED); 233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_r_apdu->len += T4T_RSP_STATUS_WORDS_SIZE; 234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!ce_t4t_send_to_lower (p_r_apdu)) 236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR0 ("ce_t4t_read_binary (): No selected file"); 244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!ce_t4t_send_status (T4T_RSP_CMD_NOT_ALLOWED)) 246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function ce_t4t_update_binary 256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Update file and send R-APDU to peer 258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if success 260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN ce_t4t_update_binary (UINT16 offset, UINT8 length, UINT8 *p_data) 263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t; 265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 file_length[2]; 267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 starting_offset, status_words; 268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tCE_DATA ce_data; 269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG3 ("ce_t4t_update_binary (): Offset:0x%04X, Length:0x%04X, selected status = 0x%02X", 271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset, length, p_t4t->status); 272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project starting_offset = offset; 274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* update file size (NLEN) */ 276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((offset < T4T_FILE_LENGTH_SIZE) && (length > 0)) 277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = file_length; 279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, p_t4t->nlen); 280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while ((offset < T4T_FILE_LENGTH_SIZE) && (length > 0)) 282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *(file_length + offset++) = *(p_data++); 284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length--; 285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = file_length; 288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (p_t4t->nlen, p); 289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (length > 0) 292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_t4t->p_scratch_buf + offset - T4T_FILE_LENGTH_SIZE, p_data, length); 293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status_words = T4T_RSP_CMD_CMPLTED; 295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if this is the last step: writing non-zero length in NLEN */ 297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((starting_offset == 0) && (p_t4t->nlen > 0)) 298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_stop_quick_timer (&p_t4t->timer); 300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ce_cb.p_cback) 302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_data.update_info.status = NFC_STATUS_OK; 304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_data.update_info.length = p_t4t->nlen; 305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_data.update_info.p_data = p_t4t->p_scratch_buf; 306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*ce_cb.p_cback) (CE_T4T_NDEF_UPDATE_CPLT_EVT, &ce_data); 308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG0 ("ce_t4t_update_binary (): Sent CE_T4T_NDEF_UPDATE_CPLT_EVT"); 309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->status &= ~ (CE_T4T_STATUS_NDEF_FILE_UPDATING); 312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (!(p_t4t->status & CE_T4T_STATUS_NDEF_FILE_UPDATING)) 314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* starting of updating */ 316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->status |= CE_T4T_STATUS_NDEF_FILE_UPDATING; 317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_start_quick_timer (&p_t4t->timer, NFC_TTYPE_CE_T4T_UPDATE, 319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (CE_T4T_TOUT_UPDATE * QUICK_TIMER_TICKS_PER_SEC) / 1000); 320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ce_cb.p_cback) 322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*ce_cb.p_cback) (CE_T4T_NDEF_UPDATE_START_EVT, NULL); 323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!ce_t4t_send_status (status_words)) 326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status_words == T4T_RSP_CMD_CMPLTED) 331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function ce_t4t_set_version_in_cc 340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description update version in CC file 342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** If reader selects NDEF Tag Application with V1.0 AID then 343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** set V1.0 into CC file. 344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** If reader selects NDEF Tag Application with V2.0 AID then 345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** set V2.0 into CC file. 346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns None 348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void ce_t4t_set_version_in_cc (UINT8 version) 351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t; 353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG1 ("ce_t4t_set_version_in_cc (): version = 0x%02X", version); 356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = p_t4t->cc_file + T4T_VERSION_OFFSET_IN_CC; 358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, version); 360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function ce_t4t_process_select_file_cmd 365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function processes Select Command by file ID. 367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if success 369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN ce_t4t_process_select_file_cmd (UINT8 *p_cmd) 372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 data_len; 374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 file_id, status_words; 375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG0 ("ce_t4t_process_select_file_cmd ()"); 377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd++; /* skip P2 */ 379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Lc Byte */ 381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT8 (data_len, p_cmd); 382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (data_len == T4T_FILE_ID_SIZE) 384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* File ID */ 386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (file_id, p_cmd); 387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ce_t4t_select_file (file_id)) 389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status_words = T4T_RSP_CMD_CMPLTED; 391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status_words = T4T_RSP_NOT_FOUND; 395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status_words = T4T_RSP_WRONG_LENGTH; 400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!ce_t4t_send_status (status_words)) 403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status_words == T4T_RSP_CMD_CMPLTED) 408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return TRUE; 410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function ce_t4t_process_select_app_cmd 417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function processes Select Command by AID. 419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void ce_t4t_process_select_app_cmd (UINT8 *p_cmd, BT_HDR *p_c_apdu) 424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 data_len; 426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 status_words = 0x0000; /* invalid status words */ 427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tCE_DATA ce_data; 428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 xx; 429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG0 ("ce_t4t_process_select_app_cmd ()"); 431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd++; /* skip P2 */ 433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Lc Byte */ 435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT8 (data_len, p_cmd); 436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (CE_TEST_INCLUDED == TRUE) 438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (mapping_aid_test_enabled) 439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (data_len == T4T_V20_NDEF_TAG_AID_LEN) 441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(!memcmp(p_cmd, ce_test_tag_app_id, data_len)) 442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(ce_cb.mem.t4t.p_ndef_msg) ) 443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_c_apdu); 445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_t4t_send_status ((UINT16) T4T_RSP_CMD_CMPLTED); 446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* 452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Compare AIDs registered by applications 453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** if found, use callback of the application 454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** otherwise, return error and maintain the same status 455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project */ 456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_cb.mem.t4t.selected_aid_idx = CE_T4T_MAX_REG_AID; 457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (xx = 0; xx < CE_T4T_MAX_REG_AID; xx++) 458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (ce_cb.mem.t4t.reg_aid[xx].aid_len > 0) 460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(ce_cb.mem.t4t.reg_aid[xx].aid_len == data_len) 461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(!(memcmp(ce_cb.mem.t4t.reg_aid[xx].aid, p_cmd, data_len))) ) 462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_cb.mem.t4t.selected_aid_idx = xx; 464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if found matched AID */ 469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ce_cb.mem.t4t.selected_aid_idx < CE_T4T_MAX_REG_AID) 470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_CC_FILE_SELECTED); 472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_NDEF_SELECTED); 473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_T4T_APP_SELECTED); 474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_WILDCARD_AID_SELECTED); 475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_cb.mem.t4t.status |= CE_T4T_STATUS_REG_AID_SELECTED; 476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG4 ("ce_t4t_process_select_app_cmd (): Registered AID[%02X%02X%02X%02X...] is selected", 478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_cb.mem.t4t.reg_aid[ce_cb.mem.t4t.selected_aid_idx].aid[0], 479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_cb.mem.t4t.reg_aid[ce_cb.mem.t4t.selected_aid_idx].aid[1], 480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_cb.mem.t4t.reg_aid[ce_cb.mem.t4t.selected_aid_idx].aid[2], 481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_cb.mem.t4t.reg_aid[ce_cb.mem.t4t.selected_aid_idx].aid[3]); 482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_data.raw_frame.status = NFC_STATUS_OK; 484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_data.raw_frame.p_data = p_c_apdu; 485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_data.raw_frame.aid_handle = ce_cb.mem.t4t.selected_aid_idx; 486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_c_apdu = NULL; 488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(ce_cb.mem.t4t.reg_aid[ce_cb.mem.t4t.selected_aid_idx].p_cback)) (CE_T4T_RAW_FRAME_EVT, &ce_data); 490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ( (data_len == T4T_V20_NDEF_TAG_AID_LEN) 492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(!memcmp(p_cmd, t4t_v20_ndef_tag_aid, data_len - 1)) 493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(ce_cb.mem.t4t.p_ndef_msg) ) 494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd += data_len - 1; 496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* adjust version if possible */ 498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((*p_cmd) == 0x00) 499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_t4t_set_version_in_cc (T4T_VERSION_1_0); 501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status_words = T4T_RSP_CMD_CMPLTED; 502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ((*p_cmd) == 0x01) 504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_t4t_set_version_in_cc (T4T_VERSION_2_0); 506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status_words = T4T_RSP_CMD_CMPLTED; 507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG0 ("ce_t4t_process_select_app_cmd (): Not found matched AID"); 511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status_words = T4T_RSP_NOT_FOUND; 512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (ce_cb.mem.t4t.p_wildcard_aid_cback) 515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_CC_FILE_SELECTED); 517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_NDEF_SELECTED); 518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_T4T_APP_SELECTED); 519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_REG_AID_SELECTED); 520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_cb.mem.t4t.status |= CE_T4T_STATUS_WILDCARD_AID_SELECTED; 521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_data.raw_frame.status = NFC_STATUS_OK; 523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_data.raw_frame.p_data = p_c_apdu; 524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_data.raw_frame.aid_handle = CE_T4T_WILDCARD_AID_HANDLE; 525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_c_apdu = NULL; 526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG0 ("CET4T: Forward raw frame (SELECT APP) to wildcard AID handler"); 528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(ce_cb.mem.t4t.p_wildcard_aid_cback)) (CE_T4T_RAW_FRAME_EVT, &ce_data); 529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG0 ("ce_t4t_process_select_app_cmd (): Not found matched AID or not listening T4T NDEF"); 533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status_words = T4T_RSP_NOT_FOUND; 534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status_words) 537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if T4T CE can support */ 539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status_words == T4T_RSP_CMD_CMPLTED) 540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_CC_FILE_SELECTED); 542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_NDEF_SELECTED); 543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_REG_AID_SELECTED); 544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_cb.mem.t4t.status &= ~ (CE_T4T_STATUS_WILDCARD_AID_SELECTED); 545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_cb.mem.t4t.status |= CE_T4T_STATUS_T4T_APP_SELECTED; 546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG0 ("ce_t4t_process_select_app_cmd (): T4T CE App selected"); 548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_t4t_send_status (status_words); 551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_c_apdu); 552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if status_words is not set then upper layer will send R-APDU */ 554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function ce_t4t_process_timeout 561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description process timeout event 563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid ce_t4t_process_timeout (TIMER_LIST_ENT *p_tle) 568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t; 570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tCE_DATA ce_data; 571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG1 ("ce_t4t_process_timeout () event=%d", p_tle->event); 573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_tle->event == NFC_TTYPE_CE_T4T_UPDATE) 575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t4t->status & CE_T4T_STATUS_NDEF_FILE_UPDATING) 577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_data.status = NFC_STATUS_TIMEOUT; 579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ce_cb.p_cback) 581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*ce_cb.p_cback) (CE_T4T_NDEF_UPDATE_ABORT_EVT, &ce_data); 582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->status &= ~ (CE_T4T_STATUS_NDEF_FILE_UPDATING); 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 CE_TRACE_ERROR1 ("ce_t4t_process_timeout () unknown event=%d", p_tle->event); 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 ce_t4t_data_cback 595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This callback function receives the data from NFCC. 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 ce_t4t_data_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data) 602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_c_apdu = (BT_HDR *) p_data->data.p_data; 604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_cmd; 605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 cla, instruct, select_type = 0, length; 606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 offset, max_file_size; 607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tCE_DATA ce_data; 608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (event == NFC_DEACTIVATE_CEVT) 610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_SetStaticRfCback (NULL); 612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (event != NFC_DATA_CEVT) 615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE) 620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project DispCET4Tags (p_c_apdu, TRUE); 621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG1 ("ce_t4t_data_cback (): conn_id = 0x%02X", conn_id); 624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd = (UINT8 *) (p_c_apdu + 1) + p_c_apdu->offset; 626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Class Byte */ 628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT8 (cla, p_cmd); 629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Don't check class if registered AID has been selected */ 631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (cla != T4T_CMD_CLASS) 632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&((ce_cb.mem.t4t.status & CE_T4T_STATUS_REG_AID_SELECTED) == 0) ) 633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR1 ("CET4T: Unsupported Class byte (0x%02X)", cla); 635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_c_apdu); 636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_t4t_send_status (T4T_RSP_CLASS_NOT_SUPPORTED); 637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Instruction Byte */ 641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT8 (instruct, p_cmd); 642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((cla == T4T_CMD_CLASS) && (instruct == T4T_CMD_INS_SELECT)) 644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* P1 Byte */ 646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT8 (select_type, p_cmd); 647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (select_type == T4T_CMD_P1_SELECT_BY_NAME) 649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_t4t_process_select_app_cmd (p_cmd, p_c_apdu); 651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if registered AID is selected */ 656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ce_cb.mem.t4t.status & CE_T4T_STATUS_REG_AID_SELECTED) 657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG0 ("CET4T: Forward raw frame to registered AID"); 659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* forward raw frame to upper layer */ 661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ce_cb.mem.t4t.selected_aid_idx < NFC_MAX_AID_LEN) 662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_data.raw_frame.status = NFC_STATUS_OK; 664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_data.raw_frame.p_data = p_c_apdu; 665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_data.raw_frame.aid_handle = ce_cb.mem.t4t.selected_aid_idx; 666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_c_apdu = NULL; 667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(ce_cb.mem.t4t.reg_aid[ce_cb.mem.t4t.selected_aid_idx].p_cback)) (CE_T4T_RAW_FRAME_EVT, &ce_data); 669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_c_apdu); 673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_t4t_send_status (T4T_RSP_NOT_FOUND); 674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (ce_cb.mem.t4t.status & CE_T4T_STATUS_WILDCARD_AID_SELECTED) 677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG0 ("CET4T: Forward raw frame to wildcard AID handler"); 679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* forward raw frame to upper layer */ 681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_data.raw_frame.status = NFC_STATUS_OK; 682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_data.raw_frame.p_data = p_c_apdu; 683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_data.raw_frame.aid_handle = CE_T4T_WILDCARD_AID_HANDLE; 684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_c_apdu = NULL; 685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(ce_cb.mem.t4t.p_wildcard_aid_cback)) (CE_T4T_RAW_FRAME_EVT, &ce_data); 687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (ce_cb.mem.t4t.status & CE_T4T_STATUS_T4T_APP_SELECTED) 689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (instruct == T4T_CMD_INS_SELECT) 691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* P1 Byte is already parsed */ 693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (select_type == T4T_CMD_P1_SELECT_BY_FILE_ID) 694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_t4t_process_select_file_cmd (p_cmd); 696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR1 ("CET4T: Bad P1 byte (0x%02X)", select_type); 700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_t4t_send_status (T4T_RSP_WRONG_PARAMS); 701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (instruct == T4T_CMD_INS_READ_BINARY) 704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (ce_cb.mem.t4t.status & CE_T4T_STATUS_CC_FILE_SELECTED) 706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(ce_cb.mem.t4t.status & CE_T4T_STATUS_NDEF_SELECTED) ) 707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ce_cb.mem.t4t.status & CE_T4T_STATUS_CC_FILE_SELECTED) 709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project max_file_size = T4T_FC_TLV_OFFSET_IN_CC + T4T_FILE_CONTROL_TLV_SIZE; 711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project max_file_size = ce_cb.mem.t4t.max_file_size; 715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (offset, p_cmd); /* Offset */ 718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT8 (length, p_cmd); /* Le */ 719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* check if valid parameters */ 721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (length <= CE_T4T_MAX_LE) 722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* CE allows to read more than current file size but not max file size */ 724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (length + offset > max_file_size) 725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (offset < max_file_size) 727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length = (UINT8) (max_file_size - offset); 729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG2 ("CET4T: length is reduced to %d by max_file_size (%d)", 731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length, max_file_size); 732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR2 ("CET4T: offset (%d) must be less than max_file_size (%d)", 736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset, max_file_size); 737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length = 0; 738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR2 ("CET4T: length (%d) must be less than MLe (%d)", 744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length, CE_T4T_MAX_LE); 745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length = 0; 746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (length > 0) 749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_t4t_read_binary (offset, length); 750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_t4t_send_status (T4T_RSP_WRONG_PARAMS); 752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR0 ("CET4T: File has not been selected"); 756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_t4t_send_status (T4T_RSP_CMD_NOT_ALLOWED); 757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (instruct == T4T_CMD_INS_UPDATE_BINARY) 760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ce_cb.mem.t4t.status & CE_T4T_STATUS_NDEF_FILE_READ_ONLY) 762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR0 ("CET4T: No access right"); 764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_t4t_send_status (T4T_RSP_CMD_NOT_ALLOWED); 765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (ce_cb.mem.t4t.status & CE_T4T_STATUS_NDEF_SELECTED) 767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (offset, p_cmd); /* Offset */ 769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT8 (length, p_cmd); /* Lc */ 770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* check if valid parameters */ 772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (length <= CE_T4T_MAX_LC) 773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (length + offset > ce_cb.mem.t4t.max_file_size) 775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR3 ("CET4T: length (%d) + offset (%d) must be less than max_file_size (%d)", 777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length, offset, ce_cb.mem.t4t.max_file_size); 778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length = 0; 779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR2 ("CET4T: length (%d) must be less than MLc (%d)", 784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length, CE_T4T_MAX_LC); 785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length = 0; 786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (length > 0) 789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_t4t_update_binary (offset, length, p_cmd); 790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_t4t_send_status (T4T_RSP_WRONG_PARAMS); 792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR0 ("CET4T: NDEF File has not been selected"); 796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_t4t_send_status (T4T_RSP_CMD_NOT_ALLOWED); 797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR1 ("CET4T: Unsupported Instruction byte (0x%02X)", instruct); 802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_t4t_send_status (T4T_RSP_INSTR_NOT_SUPPORTED); 803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR0 ("CET4T: Application has not been selected"); 808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_t4t_send_status (T4T_RSP_CMD_NOT_ALLOWED); 809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_c_apdu) 812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_c_apdu); 813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function ce_select_t4t 818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Select Type 4 Tag 820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS ce_select_t4t (void) 825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t; 827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG0 ("ce_select_t4t ()"); 829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_stop_quick_timer (&p_t4t->timer); 831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* clear other than read-only flag */ 833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->status &= CE_T4T_STATUS_NDEF_FILE_READ_ONLY; 834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_SetStaticRfCback (ce_t4t_data_cback); 836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function CE_T4tSetLocalNDEFMsg 843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Initialise CE Type 4 Tag with mandatory NDEF message 845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The following event may be returned 847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** CE_T4T_UPDATE_START_EVT for starting update 848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** CE_T4T_UPDATE_CPLT_EVT for complete update 849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** CE_T4T_UPDATE_ABORT_EVT for failure of update 850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** CE_T4T_RAW_FRAME_EVT for raw frame 851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** read_only: TRUE if read only 853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** ndef_msg_max: Max NDEF message size 854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** ndef_msg_len: NDEF message size 855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** p_ndef_msg: NDEF message (excluding NLEN) 856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** p_scratch_buf: temp storage for update 857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS CE_T4tSetLocalNDEFMsg (BOOLEAN read_only, 862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 ndef_msg_max, 863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 ndef_msg_len, 864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_ndef_msg, 865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_scratch_buf) 866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t; 868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_API3 ("CE_T4tSetLocalNDEFMsg () read_only=%d, ndef_msg_max=%d, ndef_msg_len=%d", 871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project read_only, ndef_msg_max, ndef_msg_len); 872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_ndef_msg) 874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->p_ndef_msg = NULL; 876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG0 ("CE_T4tSetLocalNDEFMsg (): T4T is disabled"); 878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((!read_only) && (!p_scratch_buf)) 882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR0 ("CE_T4tSetLocalNDEFMsg (): p_scratch_buf cannot be NULL if not read-only"); 884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (CE_TEST_INCLUDED == TRUE) 888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project mapping_aid_test_enabled = FALSE; 889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Initialise CC file */ 892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = p_t4t->cc_file; 893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, T4T_CC_FILE_MIN_LEN); 895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_MY_VERSION); 896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, CE_T4T_MAX_LE); 897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, CE_T4T_MAX_LC); 898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Mandatory NDEF File Control TLV */ 900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_NDEF_FILE_CONTROL_TYPE); /* type */ 901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_FILE_CONTROL_LENGTH); /* length */ 902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, CE_T4T_MANDATORY_NDEF_FILE_ID); /* file ID */ 903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, ndef_msg_max + T4T_FILE_LENGTH_SIZE); /* max NDEF file size */ 904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_FC_READ_ACCESS); /* read access */ 905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (read_only) 907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_FC_NO_WRITE_ACCESS); /* read only */ 909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->status |= CE_T4T_STATUS_NDEF_FILE_READ_ONLY; 910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T4T_FC_WRITE_ACCESS); /* write access */ 914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->status &= ~ (CE_T4T_STATUS_NDEF_FILE_READ_ONLY); 915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* set mandatory NDEF file */ 918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->p_ndef_msg = p_ndef_msg; 919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->nlen = ndef_msg_len; 920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->max_file_size = ndef_msg_max + T4T_FILE_LENGTH_SIZE; 921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Initialize scratch buffer */ 923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->p_scratch_buf = p_scratch_buf; 924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_scratch_buf) 926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_scratch_buf, p_ndef_msg, ndef_msg_len); 928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function CE_T4tRegisterAID 936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Register AID in CE T4T 938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** aid_len: length of AID (up to NFC_MAX_AID_LEN) 940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** p_aid: AID 941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** p_cback: Raw frame will be forwarded with CE_RAW_FRAME_EVT 942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tCE_T4T_AID_HANDLE if successful, 944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** CE_T4T_AID_HANDLE_INVALID otherwisse 945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttCE_T4T_AID_HANDLE CE_T4tRegisterAID (UINT8 aid_len, UINT8 *p_aid, tCE_CBACK *p_cback) 948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t; 950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 xx; 951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Handle registering callback for wildcard AID (all AIDs) */ 953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (aid_len == 0) 954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_API0 ("CE_T4tRegisterAID (): registering callback for wildcard AID "); 956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if a wildcard callback is already registered (only one is allowed) */ 958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t4t->p_wildcard_aid_cback != NULL) 959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR0 ("CE_T4tRegisterAID (): only one wildcard AID can be registered at time."); 961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return CE_T4T_AID_HANDLE_INVALID; 962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG1 ("CE_T4tRegisterAID (): handle 0x%02x registered (for wildcard AID)", CE_T4T_WILDCARD_AID_HANDLE); 965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->p_wildcard_aid_cback = p_cback; 966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return CE_T4T_WILDCARD_AID_HANDLE; 967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_API5 ("CE_T4tRegisterAID () AID [%02X%02X%02X%02X...], %d bytes", 971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_aid, *(p_aid+1), *(p_aid+2), *(p_aid+3), aid_len); 972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (aid_len > NFC_MAX_AID_LEN) 974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR1 ("CE_T4tRegisterAID (): AID is up to %d bytes", NFC_MAX_AID_LEN); 976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return CE_T4T_AID_HANDLE_INVALID; 977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cback == NULL) 980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR0 ("CE_T4tRegisterAID (): callback must be provided"); 982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return CE_T4T_AID_HANDLE_INVALID; 983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (xx = 0; xx < CE_T4T_MAX_REG_AID; xx++) 986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_t4t->reg_aid[xx].aid_len == aid_len) 988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(!(memcmp(p_t4t->reg_aid[xx].aid, p_aid, aid_len))) ) 989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR0 ("CE_T4tRegisterAID (): already registered"); 991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return CE_T4T_AID_HANDLE_INVALID; 992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (xx = 0; xx < CE_T4T_MAX_REG_AID; xx++) 996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t4t->reg_aid[xx].aid_len == 0) 998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->reg_aid[xx].aid_len = aid_len; 1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->reg_aid[xx].p_cback = p_cback; 1001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_t4t->reg_aid[xx].aid, p_aid, aid_len); 1002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (xx >= CE_T4T_MAX_REG_AID) 1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR0 ("CE_T4tRegisterAID (): No resource"); 1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return CE_T4T_AID_HANDLE_INVALID; 1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG1 ("CE_T4tRegisterAID (): handle 0x%02x registered", xx); 1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (xx); 1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function CE_T4tDeregisterAID 1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Deregister AID in CE T4T 1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectNFC_API extern void CE_T4tDeregisterAID (tCE_T4T_AID_HANDLE aid_handle) 1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t; 1031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_API1 ("CE_T4tDeregisterAID () handle 0x%02x", aid_handle); 1033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if deregistering wildcard AID */ 1035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (aid_handle == CE_T4T_WILDCARD_AID_HANDLE) 1036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t4t->p_wildcard_aid_cback != NULL) 1038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->p_wildcard_aid_cback = NULL; 1040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR0 ("CE_T4tDeregisterAID (): Invalid handle"); 1044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 1046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Deregister AID */ 1049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((aid_handle >= CE_T4T_MAX_REG_AID) || (p_t4t->reg_aid[aid_handle].aid_len==0)) 1050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_ERROR0 ("CE_T4tDeregisterAID (): Invalid handle"); 1052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->reg_aid[aid_handle].aid_len = 0; 1056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t4t->reg_aid[aid_handle].p_cback = NULL; 1057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function CE_T4TTestSetCC 1063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Set fields in Capability Container File for testing 1065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 1067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS CE_T4TTestSetCC (UINT16 cc_len, 1070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 version, 1071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 max_le, 1072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 max_lc) 1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (CE_TEST_INCLUDED == TRUE) 1075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t; 1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG4 ("CE_T4TTestSetCC (): CCLen:0x%04X, Ver:0x%02X, MaxLe:0x%04X, MaxLc:0x%04X", 1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project cc_len, version, max_le, max_lc); 1080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* CC file */ 1082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = p_t4t->cc_file; 1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (cc_len != 0xFFFF) 1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, cc_len); 1087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p += 2; 1090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (version != 0xFF) 1092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project mapping_aid_test_enabled = TRUE; 1094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (version == T4T_VERSION_1_0) 1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_test_tag_app_id[T4T_V20_NDEF_TAG_AID_LEN - 1] = 0x00; 1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (version == T4T_VERSION_2_0) 1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_test_tag_app_id[T4T_V20_NDEF_TAG_AID_LEN - 1] = 0x01; 1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else /* Undefined version */ 1099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ce_test_tag_app_id[T4T_V20_NDEF_TAG_AID_LEN - 1] = 0xFF; 1100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, version); 1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project mapping_aid_test_enabled = FALSE; 1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p += 1; 1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (max_le != 0xFFFF) 1110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, max_le); 1112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p += 2; 1115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (max_lc != 0xFFFF) 1117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, max_lc); 1119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p += 2; 1122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 1124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else 1125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 1126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 1127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function CE_T4TTestSetNDEFCtrlTLV 1132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Set fields in NDEF File Control TLV for testing 1134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK if success 1136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS CE_T4TTestSetNDEFCtrlTLV (UINT8 type, 1139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 length, 1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 file_id, 1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 max_file_size, 1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 read_access, 1143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 write_access) 1144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (CE_TEST_INCLUDED == TRUE) 1146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tCE_T4T_MEM *p_t4t = &ce_cb.mem.t4t; 1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project CE_TRACE_DEBUG6 ("CE_T4TTestSetNDEFCtrlTLV (): type:0x%02X, len:0x%02X, FileID:0x%04X, MaxFile:0x%04X, RdAcc:0x%02X, WrAcc:0x%02X", 1150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project type, length, file_id, max_file_size, read_access, write_access); 1151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* NDEF File control TLV */ 1153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = p_t4t->cc_file + T4T_FC_TLV_OFFSET_IN_CC; 1154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (type != 0xFF) 1156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, type); 1158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p += 1; 1161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (length != 0xFF) 1163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, length); 1165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p += 1; 1168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (file_id != 0xFFFF) 1170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, file_id); 1172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p += 2; 1175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (max_file_size != 0xFFFF) 1177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, max_file_size); 1179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p += 2; 1182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (read_access != 0xFF) 1184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, read_access); 1186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p += 1; 1189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (write_access != 0xFF) 1191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, write_access); 1193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p += 1; 1196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 1198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else 1199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 1200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 1201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* NFC_INCLUDED == TRUE */ 1203