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