1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu * Copyright (C) 2010-2014 Broadcom Corporation 4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * you may not use this file except in compliance with the License. 7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * You may obtain a copy of the License at: 8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * See the License for the specific language governing permissions and 15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * limitations under the License. 16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * This file contains the implementation for Type 1 tag NDEF operation in 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Reader/Writer 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 29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_INCLUDED == TRUE) 30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_api.h" 31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nci_hmsgs.h" 32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "rw_api.h" 33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "rw_int.h" 34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_int.h" 35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "gki.h" 36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (defined (RW_NDEF_INCLUDED) && (RW_NDEF_INCLUDED == TRUE)) 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Local Functions */ 40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_rall_rsp (BOOLEAN *p_notify,UINT8 *p_data); 41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_dyn_read_rsp (BOOLEAN *p_notify, UINT8 *p_data); 42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_write_rsp (BOOLEAN *p_notify, UINT8 *p_data); 43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_read_rsp (BOOLEAN *p_callback, UINT8 *p_data); 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_tlv_detect_rsp (UINT8 *p_data); 45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_ndef_read_rsp (UINT8 *p_data); 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_ndef_write_rsp (UINT8 *p_data); 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_ndef_rall_rsp (void); 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_ndef_write_first_block (void); 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_next_ndef_write_block (void); 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_send_ndef_byte (UINT8 data, UINT8 block, UINT8 index, UINT8 msg_len); 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_send_ndef_block (UINT8 *p_data, UINT8 block); 52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 rw_t1t_prepare_ndef_bytes (UINT8 *p_data, UINT8 *p_length_field, UINT8 *p_index, BOOLEAN b_one_byte, UINT8 block, UINT8 lengthfield_len); 53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 rw_t1t_get_ndef_flags (void); 54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT16 rw_t1t_get_ndef_max_size (void); 55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t1t_is_lock_reserved_otp_byte (UINT16 index); 56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t1t_is_read_only_byte (UINT16 index); 57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 rw_t1t_get_lock_bits_for_segment (UINT8 segment,UINT8 *p_start_byte, UINT8 *p_start_bit,UINT8 *p_end_byte); 58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t1t_update_attributes (void); 59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t1t_update_lock_attributes (void); 60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t1t_extract_lock_bytes (UINT8 *p_data); 61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t1t_update_tag_state (void); 62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectconst UINT8 rw_t1t_mask_bits[8] = 64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; 65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_handle_rsp 69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function handles the response received for all commands 71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** sent to tag 72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns event to be sent to application 74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttRW_EVENT rw_t1t_handle_rsp (const tT1T_CMD_RSP_INFO * p_info, BOOLEAN *p_notify, UINT8 *p_data, tNFC_STATUS *p_status) 77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_EVENT rw_event; 79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 adds; 81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if( (p_t1t->state == RW_T1T_STATE_READ) 83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_t1t->state == RW_T1T_STATE_WRITE) ) 84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return t1t_info_to_evt (p_info); 86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_event = rw_t1t_info_to_event (p_info); 89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_info->opcode == T1T_CMD_RALL) 91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_status = rw_t1t_handle_rall_rsp (p_notify,p_data); 93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_info->opcode == T1T_CMD_RSEG) 95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project adds = *p_data; 97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (adds == 0) 98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->b_rseg = TRUE; 100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_update_tag_state (); 101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_update_attributes (); 102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_update_lock_attributes (); 1035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen memcpy (p_t1t->mem, (UINT8 *) (p_data + T1T_ADD_LEN), T1T_SEGMENT_SIZE); 104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_status = rw_t1t_handle_dyn_read_rsp (p_notify,p_data); 106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_info->opcode == T1T_CMD_READ8) 108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_status = rw_t1t_handle_dyn_read_rsp (p_notify,p_data); 110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_status = rw_t1t_handle_write_rsp (p_notify,p_data); 114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return rw_event; 116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_info_to_event 121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function returns RW event code based on the current state 123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns RW event code 125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttRW_EVENT rw_t1t_info_to_event (const tT1T_CMD_RSP_INFO * p_info) 128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_EVENT rw_event; 130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_t1t->state) 133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_STATE_TLV_DETECT: 135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->tlv_detect == TAG_NDEF_TLV) 136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_event = RW_T1T_NDEF_DETECT_EVT; 137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_event = RW_T1T_TLV_DETECT_EVT; 139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_STATE_READ_NDEF: 142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_event = RW_T1T_NDEF_READ_EVT; 143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_STATE_WRITE_NDEF: 146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_event = RW_T1T_NDEF_WRITE_EVT; 147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_STATE_SET_TAG_RO: 150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_event = RW_T1T_SET_TAG_RO_EVT; 151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_STATE_CHECK_PRESENCE: 154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_event = RW_T1T_PRESENCE_CHECK_EVT; 155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_STATE_FORMAT_TAG: 158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_event = RW_T1T_FORMAT_CPLT_EVT; 159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_event = t1t_info_to_evt (p_info); 163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return rw_event; 166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_extract_lock_bytes 171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function will extract lock bytes if any present in the 173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** response data 174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Parameters p_data: Data bytes in the response of RSEG/READ8/RALL command 1765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns None 178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_t1t_extract_lock_bytes (UINT8 *p_data) 181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 end; 183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 start; 184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 num_locks; 185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 lock_offset = 0; 186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 offset; 187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tT1T_CMD_RSP_INFO *p_cmd_rsp_info = (tT1T_CMD_RSP_INFO *) rw_cb.tcb.t1t.p_cmd_rsp_info; 189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_locks = 0; 191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Based on the Command used to read Tag, calculate the offset of the tag read */ 192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cmd_rsp_info->opcode == T1T_CMD_RSEG) 193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project start = p_t1t->segment * T1T_SEGMENT_SIZE; 1955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen end = start + T1T_SEGMENT_SIZE; 196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cmd_rsp_info->opcode == T1T_CMD_READ8) 198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen start = p_t1t->block_read * T1T_BLOCK_SIZE; 2005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen end = start + T1T_BLOCK_SIZE; 201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cmd_rsp_info->opcode == T1T_CMD_RALL) 203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project start = 0; 205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project end = T1T_STATIC_SIZE; 206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Collect lock bytes that are present in the part of the data read from Tag */ 211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (num_locks < p_t1t->num_lockbytes) 212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->lockbyte[num_locks].b_lock_read == FALSE) 214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Get the exact offset of the dynamic lock byte in the tag */ 216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset = p_t1t->lock_tlv[p_t1t->lockbyte[num_locks].tlv_index].offset + p_t1t->lockbyte[num_locks].byte_index; 217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (offset < end) 218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(offset >= start) ) 219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* This dynamic lock byte is in the response */ 222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cmd_rsp_info->opcode == T1T_CMD_RSEG) 223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen lock_offset = (offset % T1T_SEGMENT_SIZE); 225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cmd_rsp_info->opcode == T1T_CMD_READ8) 227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen lock_offset = (offset % T1T_BLOCK_SIZE); 229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cmd_rsp_info->opcode == T1T_CMD_RALL) 231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project lock_offset = offset; 233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lockbyte[num_locks].lock_byte = p_data[lock_offset]; 236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lockbyte[num_locks].b_lock_read = TRUE; 237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_locks++; 242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_update_tag_attributes 248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function will update tag attributes based on cc, ndef 250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** message length 251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns None 253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_t1t_update_tag_state (void) 256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Set Tag state based on CC value and NDEF Message length */ 260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( ((p_t1t->mem[T1T_CC_NMN_BYTE] == T1T_CC_NMN) || (p_t1t->mem[T1T_CC_NMN_BYTE] == 0)) 261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&((p_t1t->mem[T1T_CC_VNO_BYTE] == T1T_CC_VNO) || (p_t1t->mem[T1T_CC_VNO_BYTE] == T1T_CC_LEGACY_VNO)) 2625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen &&((p_t1t->mem[T1T_CC_RWA_BYTE] == T1T_CC_RWA_RW) || (p_t1t->mem[T1T_CC_RWA_BYTE] == T1T_CC_RWA_RO)) ) 263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Valid CC value, so Tag is initialized */ 265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->ndef_msg_len > 0) 266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->mem[T1T_CC_RWA_BYTE] == T1T_CC_RWA_RO) 268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* NDEF Message presence, CC indication sets Tag as READ ONLY */ 270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->tag_attribute = RW_T1_TAG_ATTRB_READ_ONLY; 271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_t1t->mem[T1T_CC_RWA_BYTE] == T1T_CC_RWA_RW) 273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* NDEF Message presence, CC indication sets Tag as READ WRITE */ 275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->tag_attribute = RW_T1_TAG_ATTRB_READ_WRITE; 276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If NDEF is not yet detected then Tag remains in Initialized state 281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * after NDEF Detection the Tag state may be updated */ 282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->tag_attribute = RW_T1_TAG_ATTRB_INITIALIZED; 283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->tag_attribute = RW_T1_TAG_ATTRB_UNKNOWN; 288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_read_locks 294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function will send command to read next unread locks 296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK, if all locks are read successfully 298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED, if reading locks failed 299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_CONTINUE, if reading locks is in progress 300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_t1t_read_locks (void) 303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 num_locks = 0; 305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status = NFC_STATUS_CONTINUE; 307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 offset; 308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (num_locks < p_t1t->num_lockbytes) 310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->lockbyte[num_locks].b_lock_read == FALSE) 312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset = p_t1t->lock_tlv[p_t1t->lockbyte[num_locks].tlv_index].offset + p_t1t->lockbyte[num_locks].byte_index; 314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (offset < T1T_STATIC_SIZE) 315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lockbyte[num_locks].lock_byte = p_t1t->mem[offset]; 317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lockbyte[num_locks].b_lock_read = TRUE; 318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (offset < (p_t1t->mem[T1T_CC_TMS_BYTE] + 1) * T1T_BLOCK_SIZE) 320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* send READ8 command */ 3225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_t1t->block_read = (UINT8) (offset/T1T_BLOCK_SIZE); 3235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if ((status = rw_t1t_send_dyn_cmd (T1T_CMD_READ8, p_t1t->block_read, NULL)) == NFC_STATUS_OK) 324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Reading Locks */ 326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = NFC_STATUS_CONTINUE; 327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->substate = RW_T1T_SUBSTATE_WAIT_READ_LOCKS; 328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Read locks failed */ 334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = NFC_STATUS_FAILED; 335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_locks++; 339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (num_locks == p_t1t->num_lockbytes) 341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* All locks are read */ 343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = NFC_STATUS_OK; 344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_handle_write_rsp 352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function handles response received for WRITE_E8, 354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** WRITE_NE8, WRITE_E, WRITE_NE commands 355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns status of the current NDEF/TLV Operation 357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_write_rsp (BOOLEAN *p_notify, UINT8 *p_data) 360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status = NFC_STATUS_OK; 363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 num_locks; 364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 lock_count; 365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 value; 366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 addr; 367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 write_block[T1T_BLOCK_SIZE]; 368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 offset; 369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 next_offset; 370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 num_bits; 371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 next_num_bits; 372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_notify = FALSE; 374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_t1t->state) 376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_STATE_WRITE: 378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_notify = TRUE; 379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_STATE_FORMAT_TAG: 382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->substate == RW_T1T_SUBSTATE_WAIT_SET_NULL_NDEF) 383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.t1t.hr[0] != T1T_STATIC_HR0 || rw_cb.tcb.t1t.hr[1] >= RW_T1T_HR1_MIN) 385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_notify = TRUE; 386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->work_offset < (T1T_BLOCK_SIZE - 1)) 389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->work_offset++; 391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* send WRITE-E command */ 392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T1T_BLD_ADD ((addr), 1, (UINT8) p_t1t->work_offset); 393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((status = rw_t1t_send_static_cmd (T1T_CMD_WRITE_E, addr, p_t1t->ndef_first_block[(UINT8) p_t1t->work_offset])) != NFC_STATUS_OK) 395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_notify = TRUE; 396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_notify = TRUE; 399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* send WRITE-E8 command */ 405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((status = rw_t1t_send_dyn_cmd (T1T_CMD_WRITE_E8, 2, p_t1t->ndef_final_block)) != NFC_STATUS_OK) 406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_notify = TRUE; 407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->substate = RW_T1T_SUBSTATE_WAIT_SET_NULL_NDEF; 409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_STATE_SET_TAG_RO: 413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_t1t->substate) 414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_SET_CC_RWA_RO: 416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_t1t->b_hard_lock) 418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = NFC_STATUS_OK; 420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_notify = TRUE; 421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_t1t->hr[0] & 0x0F) != 1) 425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memset (write_block,0,T1T_BLOCK_SIZE); 427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project write_block[0] = 0xFF; 428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project write_block[1] = 0xFF; 429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* send WRITE-NE8 command */ 431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((status = rw_t1t_send_dyn_cmd (T1T_CMD_WRITE_NE8, T1T_LOCK_BLOCK, write_block)) != NFC_STATUS_OK) 432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_notify = TRUE; 433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->substate = RW_T1T_SUBSTATE_WAIT_SET_DYN_LOCK_BITS; 435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* send WRITE-NE command */ 439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T1T_BLD_ADD ((addr), (T1T_LOCK_BLOCK), (0)); 440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((status = rw_t1t_send_static_cmd (T1T_CMD_WRITE_NE, addr, 0xFF)) != NFC_STATUS_OK) 441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_notify = TRUE; 442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->substate = RW_T1T_SUBSTATE_WAIT_SET_ST_LOCK_BITS; 444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_SET_ST_LOCK_BITS: 448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* send WRITE-NE command */ 450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T1T_BLD_ADD ((addr), (T1T_LOCK_BLOCK), (1)); 451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((status = rw_t1t_send_static_cmd (T1T_CMD_WRITE_NE, addr, 0xFF)) != NFC_STATUS_OK) 452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_notify = TRUE; 453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->substate = RW_T1T_SUBSTATE_WAIT_SET_DYN_LOCK_BITS; 455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_SET_DYN_LOCK_BITS: 459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_locks = 0; 460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (num_locks < p_t1t->num_lockbytes) 461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->lockbyte[num_locks].lock_status == RW_T1T_LOCK_UPDATE_INITIATED) 463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lockbyte[num_locks].lock_status = RW_T1T_LOCK_UPDATED; 465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_locks++; 467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_locks = 0; 470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (num_locks < p_t1t->num_lockbytes) 471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->lockbyte[num_locks].lock_status == RW_T1T_LOCK_NOT_UPDATED) 473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset = p_t1t->lock_tlv[p_t1t->lockbyte[num_locks].tlv_index].offset + p_t1t->lockbyte[num_locks].byte_index; 475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_bits = ((p_t1t->lockbyte[num_locks].byte_index + 1)* 8 <= p_t1t->lock_tlv[p_t1t->lockbyte[num_locks].tlv_index].num_bits) ? 8 : p_t1t->lock_tlv[p_t1t->lockbyte[num_locks].tlv_index].num_bits % 8; 476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_t1t->hr[0] & 0x0F) != 1) 478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memset (write_block,0,T1T_BLOCK_SIZE); 480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project write_block[(UINT8) (offset%T1T_BLOCK_SIZE)] |= tags_pow (2,num_bits) - 1; 482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project lock_count = num_locks + 1; 483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (lock_count < p_t1t->num_lockbytes) 484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project next_offset = p_t1t->lock_tlv[p_t1t->lockbyte[lock_count].tlv_index].offset + p_t1t->lockbyte[lock_count].byte_index; 486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project next_num_bits = ((p_t1t->lockbyte[lock_count].byte_index + 1)* 8 <= p_t1t->lock_tlv[p_t1t->lockbyte[lock_count].tlv_index].num_bits) ? 8 : p_t1t->lock_tlv[p_t1t->lockbyte[lock_count].tlv_index].num_bits % 8; 487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (next_offset/T1T_BLOCK_SIZE == offset/T1T_BLOCK_SIZE) 489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project write_block[(UINT8) (next_offset%T1T_BLOCK_SIZE)] |= tags_pow (2,next_num_bits) - 1; 491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project lock_count ++; 495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* send WRITE-NE8 command */ 498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((status = rw_t1t_send_dyn_cmd (T1T_CMD_WRITE_NE8, (UINT8) (offset/T1T_BLOCK_SIZE), write_block)) == NFC_STATUS_OK) 499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->substate = RW_T1T_SUBSTATE_WAIT_SET_DYN_LOCK_BITS; 501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (lock_count > num_locks) 502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lockbyte[lock_count - 1].lock_status = RW_T1T_LOCK_UPDATE_INITIATED; 504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project lock_count --; 505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_notify = TRUE; 509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* send WRITE-NE command */ 513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T1T_BLD_ADD ((addr), ((UINT8) (offset/T1T_BLOCK_SIZE)), ((UINT8) (offset%T1T_BLOCK_SIZE))); 514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project value = (UINT8) (tags_pow (2,num_bits) - 1); 515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((status = rw_t1t_send_static_cmd (T1T_CMD_WRITE_NE, addr, value)) == NFC_STATUS_OK) 516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->substate = RW_T1T_SUBSTATE_WAIT_SET_DYN_LOCK_BITS; 518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lockbyte[num_locks].lock_status = RW_T1T_LOCK_UPDATE_INITIATED; 519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_notify = TRUE; 522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_locks++; 526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (num_locks == p_t1t->num_lockbytes) 528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_update_lock_attributes (); 530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = NFC_STATUS_OK; 531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_notify = TRUE; 532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_STATE_WRITE_NDEF: 538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_t1t->substate) 539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_VALIDATE_NDEF: 541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->ndef_msg_len = p_t1t->new_ndef_msg_len; 542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->tag_attribute = RW_T1_TAG_ATTRB_READ_WRITE; 543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_notify = TRUE; 544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_NDEF_UPDATED: 547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_t1t_handle_ndef_write_rsp (p_data); 548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->substate = RW_T1T_SUBSTATE_WAIT_VALIDATE_NDEF; 551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (status == NFC_STATUS_FAILED) 553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send Negative response to upper layer */ 555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_notify = TRUE; 556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_NDEF_WRITE: 560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_t1t_handle_ndef_write_rsp (p_data); 561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_FAILED) 563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send Negative response to upper layer */ 565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_notify = TRUE; 566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (status == NFC_STATUS_OK) 568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->substate = RW_T1T_SUBSTATE_WAIT_NDEF_UPDATED; 570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_INVALIDATE_NDEF: 574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_t1t_handle_ndef_write_rsp (p_data); 575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_FAILED) 576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send Negative response to upper layer */ 578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_notify = TRUE; 579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (status == NFC_STATUS_CONTINUE) 581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->substate = RW_T1T_SUBSTATE_WAIT_NDEF_WRITE; 583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->substate = RW_T1T_SUBSTATE_WAIT_NDEF_UPDATED; 587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_handle_read_rsp 598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 5995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description This function handle the data bytes excluding ADD(S)/ADD8 field 6005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** received as part of RSEG, RALL, READ8 command response 601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns status of the current NDEF/TLV Operation 603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 6055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn CoenentNFC_STATUS rw_t1t_handle_read_rsp (BOOLEAN *p_notify, UINT8 *p_data) 606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status = NFC_STATUS_OK; 609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DETECT_NDEF_DATA ndef_data; 610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DETECT_TLV_DATA tlv_data; 611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 count; 612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_READ_DATA evt_data; 613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_notify = FALSE; 615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Handle the response based on the current state */ 616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_t1t->state) 617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_STATE_READ: 619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_notify = TRUE; 620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_STATE_READ_NDEF: 623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_t1t_handle_ndef_rall_rsp (); 624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status != NFC_STATUS_CONTINUE) 625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = status; 627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.p_data = NULL; 628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_handle_op_complete (); 629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*rw_cb.p_cback) (RW_T1T_NDEF_READ_EVT, (tRW_DATA *) &evt_data); 630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_STATE_TLV_DETECT: 634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_t1t->substate) 635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_READ_LOCKS: 637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_t1t_read_locks (); 638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status != NFC_STATUS_CONTINUE) 639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_update_lock_attributes (); 641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send positive response to upper layer */ 642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->tlv_detect == TAG_LOCK_CTRL_TLV) 643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_data.protocol = NFC_PROTOCOL_T1T; 645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_data.num_bytes = p_t1t->num_lockbytes; 646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_data.status = status; 647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_handle_op_complete (); 648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*rw_cb.p_cback) (RW_T1T_TLV_DETECT_EVT, (tRW_DATA *) &tlv_data); 649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_t1t->tlv_detect == TAG_NDEF_TLV) 651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.protocol = NFC_PROTOCOL_T1T; 653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.flags = rw_t1t_get_ndef_flags (); 654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.flags |= RW_NDEF_FL_FORMATED; 655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.max_size = (UINT32) rw_t1t_get_ndef_max_size (); 656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.cur_size = p_t1t->ndef_msg_len; 657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ndef_data.max_size < ndef_data.cur_size) 659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.flags |= RW_NDEF_FL_READ_ONLY; 661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.max_size = ndef_data.cur_size; 662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!(ndef_data.flags & RW_NDEF_FL_READ_ONLY)) 665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.flags |= RW_NDEF_FL_SOFT_LOCKABLE; 667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.flags |= RW_NDEF_FL_HARD_LOCKABLE; 669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.status = status; 671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_handle_op_complete (); 672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*rw_cb.p_cback) (RW_T1T_NDEF_DETECT_EVT, (tRW_DATA *)&ndef_data); 673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_NONE: 678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->tlv_detect == TAG_MEM_CTRL_TLV) 679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_data.status = rw_t1t_handle_tlv_detect_rsp (p_t1t->mem); 681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_data.protocol = NFC_PROTOCOL_T1T; 682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_data.num_bytes = 0; 683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project count = 0; 684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (count < p_t1t->num_mem_tlvs) 685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_data.num_bytes += p_t1t->mem_tlv[p_t1t->num_mem_tlvs].num_bytes; 687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project count++; 688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_handle_op_complete (); 690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send response to upper layer */ 691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*rw_cb.p_cback) (RW_T1T_TLV_DETECT_EVT, (tRW_DATA *) &tlv_data); 692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_t1t->tlv_detect == TAG_LOCK_CTRL_TLV) 694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_data.status = rw_t1t_handle_tlv_detect_rsp (p_t1t->mem); 696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_data.protocol = NFC_PROTOCOL_T1T; 697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_data.num_bytes = p_t1t->num_lockbytes; 698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (tlv_data.status == NFC_STATUS_FAILED) 700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_handle_op_complete (); 702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send Negative response to upper layer */ 704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*rw_cb.p_cback) (RW_T1T_TLV_DETECT_EVT, (tRW_DATA *)&tlv_data); 705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_extract_lock_bytes (p_data); 709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_t1t_read_locks (); 710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status != NFC_STATUS_CONTINUE) 711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send positive response to upper layer */ 713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_data.status = status; 714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_handle_op_complete (); 715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*rw_cb.p_cback) (RW_T1T_TLV_DETECT_EVT, (tRW_DATA *) &tlv_data); 717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_t1t->tlv_detect == TAG_NDEF_TLV) 721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.protocol = NFC_PROTOCOL_T1T; 723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.flags = rw_t1t_get_ndef_flags (); 724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->mem[T1T_CC_NMN_BYTE] == T1T_CC_NMN) 726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.status = rw_t1t_handle_tlv_detect_rsp (p_t1t->mem); 728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.cur_size = p_t1t->ndef_msg_len; 730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ndef_data.status == NFC_STATUS_FAILED) 731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.max_size = (UINT32) rw_t1t_get_ndef_max_size (); 733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ndef_data.max_size < ndef_data.cur_size) 734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.flags |= RW_NDEF_FL_READ_ONLY; 736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.max_size = ndef_data.cur_size; 737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!(ndef_data.flags & RW_NDEF_FL_READ_ONLY)) 739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.flags |= RW_NDEF_FL_SOFT_LOCKABLE; 741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send Negative response to upper layer */ 743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_handle_op_complete (); 744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*rw_cb.p_cback) (RW_T1T_NDEF_DETECT_EVT, (tRW_DATA *) &ndef_data); 746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.flags |= RW_NDEF_FL_FORMATED; 750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_extract_lock_bytes (p_data); 751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_t1t_read_locks (); 752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status != NFC_STATUS_CONTINUE) 753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.max_size = (UINT32) rw_t1t_get_ndef_max_size (); 755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ndef_data.max_size < ndef_data.cur_size) 756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.flags |= RW_NDEF_FL_READ_ONLY; 758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.max_size = ndef_data.cur_size; 759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!(ndef_data.flags & RW_NDEF_FL_READ_ONLY)) 762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.flags |= RW_NDEF_FL_SOFT_LOCKABLE; 764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.flags |= RW_NDEF_FL_HARD_LOCKABLE; 766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send positive response to upper layer */ 768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.status = status; 769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_handle_op_complete (); 770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*rw_cb.p_cback) (RW_T1T_NDEF_DETECT_EVT, (tRW_DATA *)&ndef_data); 772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send Negative response to upper layer */ 778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.status = NFC_STATUS_FAILED; 779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.max_size = (UINT32) rw_t1t_get_ndef_max_size (); 780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.cur_size = p_t1t->ndef_msg_len; 781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ndef_data.max_size < ndef_data.cur_size) 782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.flags |= RW_NDEF_FL_READ_ONLY; 784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.max_size = ndef_data.cur_size; 785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!(ndef_data.flags & RW_NDEF_FL_READ_ONLY)) 787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.flags |= RW_NDEF_FL_SOFT_LOCKABLE; 789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_data.flags |= RW_NDEF_FL_SOFT_LOCKABLE; 790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_handle_op_complete (); 792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*rw_cb.p_cback) (RW_T1T_NDEF_DETECT_EVT, (tRW_DATA *) &ndef_data); 794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_handle_dyn_read_rsp 806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function handles response received for READ8, RSEG 808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** commands based on the current state 809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns status of the current NDEF/TLV Operation 811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_dyn_read_rsp (BOOLEAN *p_notify, UINT8 *p_data) 814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status = NFC_STATUS_OK; 816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_notify = FALSE; 819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 8205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_data += T1T_ADD_LEN; 8215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_extract_lock_bytes (p_data); 823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->state == RW_T1T_STATE_READ_NDEF) 825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_t1t_handle_ndef_read_rsp (p_data); 827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (status == NFC_STATUS_FAILED) 828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(status == NFC_STATUS_OK) ) 829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send response to upper layer */ 831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_notify = TRUE; 832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_t1t->state == RW_T1T_STATE_WRITE_NDEF) 835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_t1t_handle_ndef_write_rsp (p_data); 837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_FAILED) 838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send response to upper layer */ 840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_notify = TRUE; 841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (status == NFC_STATUS_CONTINUE) 843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->substate = RW_T1T_SUBSTATE_WAIT_INVALIDATE_NDEF; 845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 8495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen status = rw_t1t_handle_read_rsp (p_notify, p_data); 850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_handle_rall_rsp 857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to RALL - Collect CC, set Tag state 859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns None 861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_rall_rsp (BOOLEAN *p_notify,UINT8 *p_data) 864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_data += T1T_HR_LEN; /* skip HR */ 868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_t1t->mem, (UINT8 *) p_data, T1T_STATIC_SIZE); 869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->segment = 0; 870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_extract_lock_bytes (p_data); 871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_data += T1T_UID_LEN + T1T_RES_BYTE_LEN; /* skip Block 0, UID and Reserved byte */ 873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("rw_t1t_handle_rall_rsp ()"); 875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_update_tag_state (); 877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_update_attributes (); 878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_update_lock_attributes (); 879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->b_update = TRUE; 880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (rw_t1t_handle_read_rsp (p_notify, p_t1t->mem)); 881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_handle_tlv_detect_rsp 886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to the last command sent while 888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** detecting tlv 889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK, if tlv detect is complete & success 891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED,if tlv detect failed 892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_tlv_detect_rsp (UINT8 *p_data) 895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 offset; 897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 len; 898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 xx; 899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_readbytes; 900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 index; 901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 tlv_detect_state = RW_T1T_SUBSTATE_WAIT_TLV_DETECT; 902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 found_tlv = TAG_NULL_TLV; 903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BOOLEAN failed = FALSE; 905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BOOLEAN found = FALSE; 906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 count = 0; 907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status = NFC_STATUS_FAILED; 908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 start_offset = T1T_UID_LEN + T1T_CC_LEN + T1T_RES_BYTE_LEN; 909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 end_offset = T1T_STATIC_SIZE - (2*T1T_BLOCK_SIZE); 910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 bytes_read = T1T_STATIC_SIZE; 911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 tlv_value[T1T_DEFAULT_TLV_LEN]; 912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 bytes_count = 0; 913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_readbytes = p_data; 915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (offset = start_offset; offset < end_offset && !failed && !found;) 917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_t1t_is_lock_reserved_otp_byte ((UINT16) (offset)) == TRUE) 919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset++; 921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project continue; 922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (tlv_detect_state) 924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_TLV_DETECT: 926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Search for the tag */ 927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project found_tlv = p_readbytes[offset++]; 928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (found_tlv) 929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case TAG_NULL_TLV: /* May be used for padding. SHALL ignore this */ 931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case TAG_NDEF_TLV: 934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->tlv_detect == TAG_NDEF_TLV) 935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project index = (offset % T1T_BLOCK_SIZE); 937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Backup ndef first block */ 938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (&p_t1t->ndef_first_block[0],&p_readbytes[offset-index],index); 939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (&p_t1t->ndef_first_block[index],&p_readbytes[offset],T1T_BLOCK_SIZE - index); 940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_detect_state = RW_T1T_SUBSTATE_WAIT_FIND_LEN_FIELD_LEN; 941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_t1t->tlv_detect == TAG_PROPRIETARY_TLV) 943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_detect_state = RW_T1T_SUBSTATE_WAIT_FIND_LEN_FIELD_LEN; 945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ( ((p_t1t->tlv_detect == TAG_LOCK_CTRL_TLV) && (p_t1t->num_lockbytes > 0)) 947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||((p_t1t->tlv_detect == TAG_MEM_CTRL_TLV) && (p_t1t->num_mem_tlvs > 0)) ) 948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project found = TRUE; 950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project failed = TRUE; 954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case TAG_LOCK_CTRL_TLV: 958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case TAG_MEM_CTRL_TLV: 959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_detect_state = RW_T1T_SUBSTATE_WAIT_READ_TLV_LEN0; 960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case TAG_PROPRIETARY_TLV: 963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->tlv_detect == TAG_PROPRIETARY_TLV) 964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project index = (offset % T1T_BLOCK_SIZE); 966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Backup ndef first block */ 967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_detect_state = RW_T1T_SUBSTATE_WAIT_FIND_LEN_FIELD_LEN; 968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 971c11a054fc2855196292b062a843321121b591cc0Evan Chu /* NDEF/LOCK/MEM TLV can exist after Proprietary Tlv so we continue searching, skiping proprietary tlv */ 972c11a054fc2855196292b062a843321121b591cc0Evan Chu tlv_detect_state = RW_T1T_SUBSTATE_WAIT_FIND_LEN_FIELD_LEN; 973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case TAG_TERMINATOR_TLV: /* Last TLV block in the data area. Must be no NDEF nessage */ 977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( ((p_t1t->tlv_detect == TAG_LOCK_CTRL_TLV) && (p_t1t->num_lockbytes > 0)) 978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||((p_t1t->tlv_detect == TAG_MEM_CTRL_TLV) && (p_t1t->num_mem_tlvs > 0)) ) 979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project found = TRUE; 981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project failed = TRUE; 985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project failed = TRUE; 989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_FIND_LEN_FIELD_LEN: 993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project len = p_readbytes[offset]; 994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (found_tlv) 995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case TAG_NDEF_TLV: 997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->ndef_header_offset = offset + p_t1t->work_offset; 998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (len == T1T_LONG_NDEF_LEN_FIELD_BYTE0) 999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* The next two bytes constitute length bytes */ 1001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_detect_state = RW_T1T_SUBSTATE_WAIT_READ_TLV_LEN0; 1002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* one byte length field */ 1006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->ndef_msg_len = len; 1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bytes_count = p_t1t->ndef_msg_len; 1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_detect_state = RW_T1T_SUBSTATE_WAIT_READ_TLV_VALUE; 1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case TAG_PROPRIETARY_TLV: 1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (len == 0xFF) 1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* The next two bytes constitute length bytes */ 1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_detect_state = RW_T1T_SUBSTATE_WAIT_READ_TLV_LEN0; 1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* one byte length field */ 1021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bytes_count = len; 1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_detect_state = RW_T1T_SUBSTATE_WAIT_READ_TLV_VALUE; 1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset++; 1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_READ_TLV_LEN0: 1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (found_tlv) 1031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case TAG_LOCK_CTRL_TLV: 1033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case TAG_MEM_CTRL_TLV: 1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project len = p_readbytes[offset]; 1036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (len == T1T_DEFAULT_TLV_LEN) 1037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Valid Lock control TLV */ 1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_detect_state = RW_T1T_SUBSTATE_WAIT_READ_TLV_VALUE; 1040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bytes_count = T1T_DEFAULT_TLV_LEN; 1041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ( ((p_t1t->tlv_detect == TAG_LOCK_CTRL_TLV) && (p_t1t->num_lockbytes > 0)) 1043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||((p_t1t->tlv_detect == TAG_MEM_CTRL_TLV) && (p_t1t->num_mem_tlvs > 0)) ) 1044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project found = TRUE; 1046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project failed = TRUE; 1050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case TAG_NDEF_TLV: 1054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case TAG_PROPRIETARY_TLV: 1055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* The first length byte */ 1056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bytes_count = (UINT8) p_readbytes[offset]; 1057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_detect_state = RW_T1T_SUBSTATE_WAIT_READ_TLV_LEN1; 1058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset++; 1061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_READ_TLV_LEN1: 1064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bytes_count = (bytes_count << 8) + p_readbytes[offset]; 1065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (found_tlv == TAG_NDEF_TLV) 1066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->ndef_msg_len = bytes_count; 1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_detect_state = RW_T1T_SUBSTATE_WAIT_READ_TLV_VALUE; 1070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset++; 1071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_READ_TLV_VALUE: 1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (found_tlv) 1075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case TAG_NDEF_TLV: 1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((bytes_count == p_t1t->ndef_msg_len) && (p_t1t->tlv_detect == TAG_NDEF_TLV)) 1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* The first byte offset after length field */ 1080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->ndef_msg_offset = offset + p_t1t->work_offset; 1081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (bytes_count > 0) 1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bytes_count--; 1084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->tlv_detect == TAG_NDEF_TLV) 1086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->ndef_msg_len > 0) 1088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_update_tag_state (); 1090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->tag_attribute = RW_T1_TAG_ATTRB_INITIALIZED_NDEF; 1094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project found = TRUE; 1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (bytes_count == 0) 1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_detect_state = RW_T1T_SUBSTATE_WAIT_TLV_DETECT; 1100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case TAG_LOCK_CTRL_TLV: 1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bytes_count--; 1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_t1t->tlv_detect == TAG_LOCK_CTRL_TLV) 1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_t1t->tlv_detect == TAG_NDEF_TLV) ) 1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_value[2 - bytes_count] = p_readbytes[offset]; 1109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (bytes_count == 0) 1110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->num_lock_tlvs < RW_T1T_MAX_LOCK_TLVS) 1112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lock_tlv[p_t1t->num_lock_tlvs].offset = (tlv_value[0] >> 4) & 0x0F; 1114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lock_tlv[p_t1t->num_lock_tlvs].offset *= (UINT8) tags_pow (2, tlv_value[2] & 0x0F); 1115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lock_tlv[p_t1t->num_lock_tlvs].offset += tlv_value[0] & 0x0F; 1116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lock_tlv[p_t1t->num_lock_tlvs].bytes_locked_per_bit = (UINT8) tags_pow (2, ((tlv_value[2] & 0xF0) >> 4)); 1117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lock_tlv[p_t1t->num_lock_tlvs].num_bits = tlv_value[1]; 1118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project count = tlv_value[1] / 8 + ((tlv_value[1] % 8 != 0)? 1:0); 1119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project xx = 0; 1120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (xx < count) 1121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->num_lockbytes < RW_T1T_MAX_LOCK_BYTES) 1123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lockbyte[p_t1t->num_lockbytes].tlv_index = p_t1t->num_lock_tlvs; 1125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lockbyte[p_t1t->num_lockbytes].byte_index = xx; 1126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lockbyte[p_t1t->num_lockbytes].b_lock_read = FALSE; 1127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->num_lockbytes++; 1128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("T1T Buffer overflow error. Max supported lock bytes=0x%02X", RW_T1T_MAX_LOCK_BYTES); 1131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project xx++; 1132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->num_lock_tlvs++; 1134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_update_attributes (); 1135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("T1T Buffer overflow error. Max supported lock tlvs=0x%02X", RW_T1T_MAX_LOCK_TLVS); 1138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_detect_state = RW_T1T_SUBSTATE_WAIT_TLV_DETECT; 1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (bytes_count == 0) 1145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_detect_state = RW_T1T_SUBSTATE_WAIT_TLV_DETECT; 1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case TAG_MEM_CTRL_TLV: 1152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bytes_count--; 1153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_t1t->tlv_detect == TAG_MEM_CTRL_TLV) 1154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_t1t->tlv_detect == TAG_NDEF_TLV) ) 1155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_value[2 - bytes_count] = p_readbytes[offset]; 1157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (bytes_count == 0) 1158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->num_mem_tlvs >= RW_T1T_MAX_MEM_TLVS) 1160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_t1t_handle_tlv_detect_rsp - Maximum buffer allocated for Memory tlv has reached"); 1162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project failed = TRUE; 1163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Extract dynamic reserved bytes */ 1167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->mem_tlv[p_t1t->num_mem_tlvs].offset = (tlv_value[0] >> 4) & 0x0F; 1168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->mem_tlv[p_t1t->num_mem_tlvs].offset *= (UINT8) tags_pow (2, tlv_value[2] & 0x0F); 1169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->mem_tlv[p_t1t->num_mem_tlvs].offset += tlv_value[0] & 0x0F; 1170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->mem_tlv[p_t1t->num_mem_tlvs].num_bytes = tlv_value[1]; 1171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->num_mem_tlvs++; 1172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_update_attributes (); 1173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_detect_state = RW_T1T_SUBSTATE_WAIT_TLV_DETECT; 1174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (bytes_count == 0) 1180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_detect_state = RW_T1T_SUBSTATE_WAIT_TLV_DETECT; 1182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case TAG_PROPRIETARY_TLV: 1187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bytes_count--; 1188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->tlv_detect == TAG_PROPRIETARY_TLV) 1189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project found = TRUE; 1190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (bytes_count == 0) 1193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tlv_detect_state = RW_T1T_SUBSTATE_WAIT_TLV_DETECT; 1195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset++; 1200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->work_offset += bytes_read; 1205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 12065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* NDEF/Lock/Mem TLV to be found in segment 0, if not assume detection failed */ 1207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!found && !failed) 1208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( ((p_t1t->tlv_detect == TAG_LOCK_CTRL_TLV) && (p_t1t->num_lockbytes > 0)) 1210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||((p_t1t->tlv_detect == TAG_MEM_CTRL_TLV) && (p_t1t->num_mem_tlvs > 0)) ) 1211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project found = TRUE; 1213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->tlv_detect == TAG_NDEF_TLV) 1217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->tag_attribute = RW_T1_TAG_ATTRB_INITIALIZED; 1219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project failed = TRUE; 1221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = failed ? NFC_STATUS_FAILED : NFC_STATUS_OK; 1226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 1227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_handle_ndef_rall_rsp 1232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to RALL command sent while reading an 1234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NDEF message 1235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_CONTINUE, if NDEF read operation is not complete 1237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK, if NDEF read is successfull 1238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED,if NDEF read failed 1239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_ndef_rall_rsp (void) 1242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 1244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status = NFC_STATUS_CONTINUE; 1245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 count; 1246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 adds; 1247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project count = (UINT8) p_t1t->ndef_msg_offset; 1249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->work_offset = 0; 1250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->segment = 0; 1251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (count < T1T_STATIC_SIZE && p_t1t->work_offset < p_t1t->ndef_msg_len) 1253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_t1t_is_lock_reserved_otp_byte (count) == FALSE) 1255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->p_ndef_buffer[p_t1t->work_offset] = p_t1t->mem[count]; 1257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->work_offset++; 1258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project count++; 1260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->work_offset != p_t1t->ndef_msg_len) 1262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_t1t->hr[0] & 0x0F) != 1) 1264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->work_offset == 0) 1266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_FAILED; 1267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->block_read = T1T_STATIC_BLOCKS + 1; 1271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->segment++; 1272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->ndef_msg_len - p_t1t->work_offset <= 8) 1274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((status = rw_t1t_send_dyn_cmd (T1T_CMD_READ8, p_t1t->block_read, NULL)) == NFC_STATUS_OK) 1276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->tlv_detect = TAG_NDEF_TLV; 1278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->state = RW_T1T_STATE_READ_NDEF; 1279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = NFC_STATUS_CONTINUE; 1280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* send RSEG command */ 1285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T1T_BLD_ADDS ((adds), (p_t1t->segment)); 1286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((status = rw_t1t_send_dyn_cmd (T1T_CMD_RSEG, adds, NULL)) == NFC_STATUS_OK) 1287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->state = RW_T1T_STATE_READ_NDEF; 1289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = NFC_STATUS_CONTINUE; 1290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_T1tReadNDef - Invalid NDEF len: %u or NDEF corrupted", p_t1t->ndef_msg_len); 1296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = NFC_STATUS_FAILED; 1297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = NFC_STATUS_OK; 1302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 1304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_handle_ndef_read_rsp 1309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to commands sent while reading an 1311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NDEF message 1312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_CONTINUE, if tlv read is not yet complete 1314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK, if tlv read is complete & success 1315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED,if tlv read failed 1316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_ndef_read_rsp (UINT8 *p_data) 1319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS ndef_status = NFC_STATUS_CONTINUE; 1321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 1322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 index; 1323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 adds; 1324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tT1T_CMD_RSP_INFO *p_cmd_rsp_info = (tT1T_CMD_RSP_INFO *) rw_cb.tcb.t1t.p_cmd_rsp_info; 1325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* The Response received could be for Read8 or Read Segment command */ 1327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch(p_cmd_rsp_info->opcode) 1328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case T1T_CMD_READ8: 1330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->work_offset == 0) 1331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project index = p_t1t->ndef_msg_offset % T1T_BLOCK_SIZE; 1333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project index = 0; 1337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->segment = (p_t1t->block_read * T1T_BLOCK_SIZE)/T1T_SEGMENT_SIZE; 1339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (index < T1T_BLOCK_SIZE && p_t1t->work_offset < p_t1t->ndef_msg_len) 1340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_t1t_is_lock_reserved_otp_byte ((UINT16) ((p_t1t->block_read * T1T_BLOCK_SIZE) + index)) == FALSE) 1342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 13435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_t1t->p_ndef_buffer[p_t1t->work_offset] = p_data[index]; 1344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->work_offset++; 1345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project index++; 1347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case T1T_CMD_RSEG: 1351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->work_offset == 0) 1352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project index = p_t1t->ndef_msg_offset % T1T_SEGMENT_SIZE; 1354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project index = 0; 1358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->block_read = ((p_t1t->segment + 1) * T1T_BLOCKS_PER_SEGMENT) - 1; 1360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (index < T1T_SEGMENT_SIZE && p_t1t->work_offset < p_t1t->ndef_msg_len) 1362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_t1t_is_lock_reserved_otp_byte ((UINT16) (index)) == FALSE) 1364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 13655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_t1t->p_ndef_buffer[p_t1t->work_offset] = p_data[index]; 1366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->work_offset++; 1367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project index++; 1369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 1373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->work_offset < p_t1t->ndef_msg_len) 1376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_t1t->hr[0] & 0x0F) != 1) 1378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_t1t->ndef_msg_len - p_t1t->work_offset) <= T1T_BLOCK_SIZE) 1380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->block_read++; 1382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((ndef_status = rw_t1t_send_dyn_cmd (T1T_CMD_READ8, (UINT8) (p_t1t->block_read), NULL)) == NFC_STATUS_OK) 1383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = NFC_STATUS_CONTINUE; 1385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->segment++; 1390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* send RSEG command */ 1391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T1T_BLD_ADDS ((adds), (p_t1t->segment)); 1392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((ndef_status = rw_t1t_send_dyn_cmd (T1T_CMD_RSEG, adds, NULL)) == NFC_STATUS_OK) 1393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = NFC_STATUS_CONTINUE; 1395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = NFC_STATUS_OK; 1402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ndef_status; 1404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_next_ndef_write_block 1409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function prepare and writes ndef blocks 1411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_CONTINUE, if tlv write is not yet complete 1413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK, if tlv write is complete & success 1414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED,if tlv write failed 1415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_next_ndef_write_block (void) 1418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BOOLEAN b_block_write_cmd = FALSE; 1420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 1421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS ndef_status = NFC_STATUS_CONTINUE; 1422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 write_block[8]; 1423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 block; 1424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 index; 1425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 new_lengthfield_len; 1426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 length_field[3]; 1427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 initial_offset; 1428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 count; 1429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Write NDEF Message */ 1430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project new_lengthfield_len = p_t1t->new_ndef_msg_len > 254 ? 3:1; 1431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Identify the command to use for NDEF write operation */ 1433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_t1t->hr[0] & 0x0F) != 1) 1434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Dynamic memory structure */ 1436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project b_block_write_cmd = FALSE; 1437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project block = p_t1t->ndef_block_written + 1; 1438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->segment = (block * T1T_BLOCK_SIZE) /T1T_SEGMENT_SIZE; 1439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project count = 0; 1441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (block <= p_t1t->mem[T1T_CC_TMS_BYTE]) 1442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project index = 0; 1444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (block == p_t1t->num_ndef_finalblock) 1445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* T1T_CMD_WRITE_E8 Command */ 1447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project b_block_write_cmd = TRUE; 1448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (index < T1T_BLOCK_SIZE && p_t1t->work_offset < (p_t1t->new_ndef_msg_len + new_lengthfield_len)) 1451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_t1t_is_lock_reserved_otp_byte ((UINT16) ((block * T1T_BLOCK_SIZE) + index)) == FALSE) 1453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project count++; 1455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project index++; 1457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (count == T1T_BLOCK_SIZE) 1459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* T1T_CMD_WRITE_E8 Command */ 1461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project b_block_write_cmd = TRUE; 1462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (count == 0) 1465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project index = 0; 1467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project block++; 1468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->segment != (block * T1T_BLOCK_SIZE) /T1T_SEGMENT_SIZE) 1469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->segment = (block * T1T_BLOCK_SIZE) /T1T_SEGMENT_SIZE; 1471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* T1T_CMD_WRITE_E Command */ 1476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project b_block_write_cmd = FALSE; 1477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Static memory structure */ 1484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project block = p_t1t->ndef_block_written; 1485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project b_block_write_cmd = FALSE; 1486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project new_lengthfield_len = p_t1t->new_ndef_msg_len > 254 ? 3:1; 1489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (new_lengthfield_len == 3) 1490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length_field[0] = T1T_LONG_NDEF_LEN_FIELD_BYTE0; 1492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length_field[1] = (UINT8) (p_t1t->new_ndef_msg_len >> 8); 1493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length_field[2] = (UINT8) (p_t1t->new_ndef_msg_len); 1494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length_field[0] = (UINT8) (p_t1t->new_ndef_msg_len); 1498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (b_block_write_cmd) 1501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Dynamic memory structure */ 1503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project index = 0; 1504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->segment = (block * T1T_BLOCK_SIZE) /T1T_SEGMENT_SIZE; 1505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project initial_offset = p_t1t->work_offset; 1507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project block = rw_t1t_prepare_ndef_bytes (write_block, length_field, &index, FALSE, block, new_lengthfield_len); 1508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->work_offset == initial_offset) 1509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = NFC_STATUS_FAILED; 1511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send WRITE_E8 command */ 1515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = rw_t1t_send_ndef_block (write_block, block); 1516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Static memory structure */ 1521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->write_byte + 1 >= T1T_BLOCK_SIZE) 1522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project index = 0; 1524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project block++; 1525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project index = p_t1t->write_byte + 1; 1529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project initial_offset = p_t1t->work_offset; 1531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project block = rw_t1t_prepare_ndef_bytes (write_block, length_field, &index, TRUE, block, new_lengthfield_len); 1532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->work_offset == initial_offset) 1533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = NFC_STATUS_FAILED; 1535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* send WRITE-E command */ 1539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = rw_t1t_send_ndef_byte (write_block[index], block, index, new_lengthfield_len); 1540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ndef_status; 1543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_ndef_write_first_block 1549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function writes ndef first block 1551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_CONTINUE, if tlv write is not yet complete 1553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK, if tlv write is complete & success 1554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED,if tlv write failed 1555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_ndef_write_first_block (void) 1558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS ndef_status = NFC_STATUS_CONTINUE; 1560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 1561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 block; 1562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 index; 1563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 new_lengthfield_len; 1564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 length_field[3]; 1565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 write_block[8]; 1566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* handle positive response to invalidating existing NDEF Message */ 1568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->work_offset = 0; 1569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project new_lengthfield_len = p_t1t->new_ndef_msg_len > 254 ? 3:1; 1570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (new_lengthfield_len == 3) 1571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length_field[0] = T1T_LONG_NDEF_LEN_FIELD_BYTE0; 1573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length_field[1] = (UINT8) (p_t1t->new_ndef_msg_len >> 8); 1574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length_field[2] = (UINT8) (p_t1t->new_ndef_msg_len); 1575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project length_field[0] = (UINT8) (p_t1t->new_ndef_msg_len); 1579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* updating ndef_first_block with new ndef message */ 1581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy(write_block,p_t1t->ndef_first_block,T1T_BLOCK_SIZE); 1582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project index = p_t1t->ndef_header_offset % T1T_BLOCK_SIZE; 1583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project block = (UINT8) (p_t1t->ndef_header_offset / T1T_BLOCK_SIZE); 1584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->segment = (UINT8) (p_t1t->ndef_header_offset/T1T_SEGMENT_SIZE); 1585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_t1t->hr[0] & 0x0F) != 1) 1587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Dynamic Memory structure */ 1589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project block = rw_t1t_prepare_ndef_bytes (write_block, length_field, &index, FALSE, block, new_lengthfield_len); 1590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->work_offset == 0) 1592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = NFC_STATUS_FAILED; 1594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send WRITE-E8 command based on the prepared write_block */ 1598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = rw_t1t_send_ndef_block (write_block, block); 1599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Static Memory structure */ 1604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project block = rw_t1t_prepare_ndef_bytes (write_block, length_field, &index, TRUE, block, new_lengthfield_len); 1605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->work_offset == 0) 1606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = NFC_STATUS_FAILED; 1608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* send WRITE-E command */ 1612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = rw_t1t_send_ndef_byte (write_block[index], block, index, new_lengthfield_len); 1613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ndef_status; 1617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_send_ndef_byte 1622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Sends ndef message or length field byte and update 1624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** status 1625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_CONTINUE, if tlv write is not yet complete 1627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK, if tlv write is complete & success 1628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED,if tlv write failed 1629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_send_ndef_byte (UINT8 data, UINT8 block, UINT8 index, UINT8 msg_len) 1632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS ndef_status = NFC_STATUS_CONTINUE; 1634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 1635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 addr; 1636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* send WRITE-E command */ 1638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T1T_BLD_ADD ((addr), (block), (index)); 1639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (NFC_STATUS_OK == rw_t1t_send_static_cmd (T1T_CMD_WRITE_E, addr, data)) 1640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->write_byte = index; 1642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->ndef_block_written = block; 1643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->work_offset == p_t1t->new_ndef_msg_len + msg_len) 1644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = NFC_STATUS_OK; 1646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = NFC_STATUS_CONTINUE; 1650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = NFC_STATUS_FAILED; 1655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ndef_status; 1657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_prepare_ndef_bytes 1662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description prepares ndef block to write 1664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns block number where to write 1666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 rw_t1t_prepare_ndef_bytes (UINT8 *p_data, UINT8 *p_length_field, UINT8 *p_index, BOOLEAN b_one_byte, UINT8 block, UINT8 lengthfield_len) 1669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 1671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 first_block = (UINT8) (p_t1t->ndef_header_offset / T1T_BLOCK_SIZE); 1672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 initial_offset = p_t1t->work_offset; 1673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (p_t1t->work_offset == initial_offset && block <= p_t1t->mem[T1T_CC_TMS_BYTE]) 1675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (block == p_t1t->num_ndef_finalblock) 1677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(block != first_block) ) 1678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_data,p_t1t->ndef_final_block,T1T_BLOCK_SIZE); 1680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Update length field */ 1682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while ( (*p_index < T1T_BLOCK_SIZE) 1683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_t1t->work_offset < lengthfield_len) ) 1684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_t1t_is_lock_reserved_otp_byte ((UINT16) ((block * T1T_BLOCK_SIZE) + *p_index)) == FALSE) 1686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_data[*p_index] = p_length_field[p_t1t->work_offset]; 1688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->work_offset++; 1689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (b_one_byte) 1690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return block; 1691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_index)++; 1693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->work_offset == lengthfield_len) 1694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Update ndef message field */ 1699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (*p_index < T1T_BLOCK_SIZE && p_t1t->work_offset < (p_t1t->new_ndef_msg_len + lengthfield_len)) 1700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_t1t_is_lock_reserved_otp_byte ((UINT16) ((block * T1T_BLOCK_SIZE) + *p_index)) == FALSE) 1702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_data[*p_index] = p_t1t->p_ndef_buffer[p_t1t->work_offset - lengthfield_len]; 1704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->work_offset++; 1705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (b_one_byte) 1706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return block; 1707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_index)++; 1709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->work_offset == initial_offset) 1711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_index = 0; 1713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project block++; 1714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->segment != (block * T1T_BLOCK_SIZE) /T1T_SEGMENT_SIZE) 1715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->segment = (block * T1T_BLOCK_SIZE) /T1T_SEGMENT_SIZE; 1717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return block; 1721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_send_ndef_block 1726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Sends ndef block and update status 1728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_CONTINUE, if tlv write is not yet complete 1730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK, if tlv write is complete & success 1731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED,if tlv write failed 1732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_send_ndef_block (UINT8 *p_data, UINT8 block) 1735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 1737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS ndef_status = NFC_STATUS_CONTINUE; 1738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (NFC_STATUS_OK == rw_t1t_send_dyn_cmd (T1T_CMD_WRITE_E8, block, p_data)) 1740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->ndef_block_written = block; 1742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->ndef_block_written == p_t1t->num_ndef_finalblock) 1743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = NFC_STATUS_OK; 1745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = NFC_STATUS_CONTINUE; 1749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = NFC_STATUS_FAILED; 1754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ndef_status; 1756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_get_ndef_flags 1761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Prepare NDEF Flags 1763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NDEF Flag value 1765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 rw_t1t_get_ndef_flags (void) 1768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 flags = 0; 1770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 1771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_t1t->hr[0] & 0xF0) == T1T_NDEF_SUPPORTED) 1773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project flags |= RW_NDEF_FL_SUPPORTED; 1774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (t1t_tag_init_data (p_t1t->hr[0]) != NULL) 1776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project flags |= RW_NDEF_FL_FORMATABLE; 1777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_t1t->mem[T1T_CC_RWA_BYTE] & 0x0F) == T1T_CC_RWA_RO) 1779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project flags |=RW_NDEF_FL_READ_ONLY; 1780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return flags; 1782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_get_ndef_max_size 1787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Calculate maximum size of NDEF message that can be written 1789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** on to the tag 1790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Maximum size of NDEF Message 1792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT16 rw_t1t_get_ndef_max_size (void) 1795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 offset; 1797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 1798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 tag_size = (p_t1t->mem[T1T_CC_TMS_BYTE] +1)* T1T_BLOCK_SIZE; 1799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project const tT1T_INIT_TAG *p_ret; 1800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 init_segment = p_t1t->segment; 1801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->max_ndef_msg_len = 0; 1803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset = p_t1t->ndef_msg_offset; 1804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->segment = (UINT8) (p_t1t->ndef_msg_offset/T1T_SEGMENT_SIZE); 1805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (tag_size < T1T_STATIC_SIZE) 1807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(tag_size > (T1T_SEGMENT_SIZE * T1T_MAX_SEGMENTS)) 1808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||((p_t1t->mem[T1T_CC_NMN_BYTE] != T1T_CC_NMN) && (p_t1t->mem[T1T_CC_NMN_BYTE] != 0)) ) 1809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Tag not formated, determine maximum NDEF size from HR */ 1811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( ((p_t1t->hr[0] & 0xF0) == T1T_NDEF_SUPPORTED) 1812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&((p_ret = t1t_tag_init_data (p_t1t->hr[0])) != NULL) ) 1813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->max_ndef_msg_len = ((p_ret->tms +1)* T1T_BLOCK_SIZE) - T1T_OTP_LOCK_RES_BYTES - T1T_UID_LEN - T1T_ADD_LEN - T1T_CC_LEN - T1T_TLV_TYPE_LEN - T1T_SHORT_NDEF_LEN_FIELD_LEN; 1815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_ret->b_dynamic) 1816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->max_ndef_msg_len -= (T1T_TLV_TYPE_LEN + T1T_DEFAULT_TLV_LEN_FIELD_LEN + T1T_DEFAULT_TLV_LEN + T1T_TLV_TYPE_LEN + T1T_DEFAULT_TLV_LEN_FIELD_LEN + T1T_DEFAULT_TLV_LEN); 1818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->max_ndef_msg_len -= T1T_DYNAMIC_LOCK_BYTES; 1819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset = tag_size; 1821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->segment = init_segment; 1825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return p_t1t->max_ndef_msg_len; 1826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Starting from NDEF Message offset find the first locked data byte */ 1830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (offset < tag_size) 1831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_t1t_is_lock_reserved_otp_byte ((UINT16) (offset)) == FALSE) 1833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_t1t_is_read_only_byte ((UINT16) offset) == TRUE) 1835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->max_ndef_msg_len++; 1837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset++; 1839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (offset % T1T_SEGMENT_SIZE == 0) 1840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->segment = (UINT8) (offset / T1T_SEGMENT_SIZE); 1842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* NDEF Length field length changes based on NDEF size */ 1845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_t1t->max_ndef_msg_len >= T1T_LONG_NDEF_LEN_FIELD_BYTE0) 1846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&((p_t1t->ndef_msg_offset - p_t1t->ndef_header_offset) == T1T_SHORT_NDEF_LEN_FIELD_LEN) ) 1847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->max_ndef_msg_len -= (p_t1t->max_ndef_msg_len == T1T_LONG_NDEF_LEN_FIELD_BYTE0)? 1 : (T1T_LONG_NDEF_LEN_FIELD_LEN - T1T_SHORT_NDEF_LEN_FIELD_LEN); 1849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->segment = init_segment; 1852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return p_t1t->max_ndef_msg_len; 1853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_handle_ndef_write_rsp 1858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to commands sent while writing an 1860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NDEF message 1861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_CONTINUE, if tlv write is not yet complete 1863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK, if tlv write is complete & success 1864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED,if tlv write failed 1865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t1t_handle_ndef_write_rsp (UINT8 *p_data) 1868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 1870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS ndef_status = NFC_STATUS_CONTINUE; 1871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 addr; 1872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_t1t->substate) 1874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_READ_NDEF_BLOCK: 1876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Backup ndef_final_block */ 18775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen memcpy (p_t1t->ndef_final_block, p_data, T1T_BLOCK_SIZE); 1878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Invalidate existing NDEF Message */ 1879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T1T_BLD_ADD ((addr), (T1T_CC_BLOCK), (T1T_CC_NMN_OFFSET)); 1880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (NFC_STATUS_OK == rw_t1t_send_static_cmd (T1T_CMD_WRITE_E, addr, 0)) 1881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = NFC_STATUS_CONTINUE; 1883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->state = RW_T1T_STATE_WRITE_NDEF; 1884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->substate = RW_T1T_SUBSTATE_WAIT_INVALIDATE_NDEF; 1885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = NFC_STATUS_FAILED; 1889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_INVALIDATE_NDEF: 1893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = rw_t1t_ndef_write_first_block (); 1894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_NDEF_WRITE: 1897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = rw_t1t_next_ndef_write_block (); 1898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_NDEF_UPDATED: 1901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Validate new NDEF Message */ 1902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T1T_BLD_ADD ((addr), (T1T_CC_BLOCK), (T1T_CC_NMN_OFFSET)); 1903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (NFC_STATUS_OK == rw_t1t_send_static_cmd (T1T_CMD_WRITE_E, addr, T1T_CC_NMN)) 1904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = NFC_STATUS_OK; 1906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_status = NFC_STATUS_FAILED; 1910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 1913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ndef_status; 1917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_update_attributes 1922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function will prepare attributes for the current 1924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** segment. Every bit in the attribute refers to one byte of 1925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** tag content.The bit corresponding to a tag byte will be set 1926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** to '1' when the Tag byte is read only,otherwise will be set 1927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** to '0' 1928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns None 1930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t1t_update_attributes (void) 1933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 count = 0; 1935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 1936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 lower_offset; 1937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 upper_offset; 1938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 num_bytes; 1939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 offset; 1940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 bits_per_byte = 8; 1941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project count = 0; 1943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (count < T1T_BLOCKS_PER_SEGMENT) 1944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->attr[count] = 0x00; 1946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project count++; 1947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project lower_offset = p_t1t->segment * T1T_SEGMENT_SIZE; 1950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project upper_offset = (p_t1t->segment + 1)* T1T_SEGMENT_SIZE; 1951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->segment == 0) 1953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* UID/Lock/Reserved/OTP bytes */ 1955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->attr[0x00] = 0xFF; /* Uid bytes */ 1956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->attr[0x0D] = 0xFF; /* Reserved bytes */ 1957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->attr[0x0E] = 0xFF; /* lock/otp bytes */ 1958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->attr[0x0F] = 0xFF; /* lock/otp bytes */ 1959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* update attr based on lock control and mem control tlvs */ 1962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project count = 0; 1963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (count < p_t1t->num_lockbytes) 1964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset = p_t1t->lock_tlv[p_t1t->lockbyte[count].tlv_index].offset + p_t1t->lockbyte[count].byte_index; 1966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (offset >= lower_offset && offset < upper_offset) 1967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Set the corresponding bit in attr to indicate - lock byte */ 1969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->attr[(offset % T1T_SEGMENT_SIZE) / bits_per_byte] |= rw_t1t_mask_bits[(offset % T1T_SEGMENT_SIZE) % bits_per_byte]; 1970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project count++; 1972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project count = 0; 1974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (count < p_t1t->num_mem_tlvs) 1975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_bytes = 0; 1977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (num_bytes < p_t1t->mem_tlv[count].num_bytes) 1978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset = p_t1t->mem_tlv[count].offset + num_bytes; 1980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (offset >= lower_offset && offset < upper_offset) 1981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Set the corresponding bit in attr to indicate - reserved byte */ 1983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->attr[(offset % T1T_SEGMENT_SIZE) / bits_per_byte] |= rw_t1t_mask_bits[(offset % T1T_SEGMENT_SIZE) % bits_per_byte]; 1984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_bytes++; 1986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project count++; 1988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_get_lock_bits_for_segment 1994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function will identify the index of the dynamic lock 1996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** byte that covers the current segment 1997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters: segment, segment number 1999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** p_start_byte, pointer to hold the first lock byte index 2000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** p_start_bit, pointer to hold the first lock bit index 2001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** p_end_byte, pointer to hold the last lock byte index 2002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Total lock bits that covers the specified segment 2004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 rw_t1t_get_lock_bits_for_segment (UINT8 segment,UINT8 *p_start_byte, UINT8 *p_start_bit,UINT8 *p_end_byte) 2007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 2009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 byte_count = T1T_SEGMENT_SIZE; 2010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 total_bits = 0; 2011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 num_dynamic_locks = 0; 2012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 bit_count = 0; 2013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 tag_size = (p_t1t->mem[T1T_CC_TMS_BYTE] +1) * T1T_BLOCK_SIZE; 2014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 lower_offset; 2015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 upper_offset; 2016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BOOLEAN b_all_bits_are_locks = TRUE; 2017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 bytes_locked_per_bit; 2018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 num_bits; 2019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project upper_offset = (segment + 1) * T1T_SEGMENT_SIZE; 2021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (upper_offset > tag_size) 2023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project upper_offset = tag_size; 2024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project lower_offset = segment * T1T_SEGMENT_SIZE; 2026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_start_byte = num_dynamic_locks; 2027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_start_bit = 0; 2028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while ( (byte_count <= lower_offset) 2030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(num_dynamic_locks < p_t1t->num_lockbytes) ) 2031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bytes_locked_per_bit = p_t1t->lock_tlv[p_t1t->lockbyte[num_dynamic_locks].tlv_index].bytes_locked_per_bit; 2033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Number of bits in the current lock byte */ 2034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project b_all_bits_are_locks = ((p_t1t->lockbyte[num_dynamic_locks].byte_index + 1) * TAG_BITS_PER_BYTE <= p_t1t->lock_tlv[p_t1t->lockbyte[num_dynamic_locks].tlv_index].num_bits); 2035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_bits = b_all_bits_are_locks ? TAG_BITS_PER_BYTE : p_t1t->lock_tlv[p_t1t->lockbyte[num_dynamic_locks].tlv_index].num_bits % TAG_BITS_PER_BYTE; 2036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Skip lock bits that covers all previous segments */ 2038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (bytes_locked_per_bit * num_bits + byte_count <= lower_offset) 2039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project byte_count += bytes_locked_per_bit * num_bits; 2041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_dynamic_locks++; 2042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* The first lock bit that covers this segment is present in this segment */ 2046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bit_count = 0; 2047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (bit_count < num_bits) 2048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project byte_count += bytes_locked_per_bit; 2050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (byte_count > lower_offset) 2051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_start_byte = num_dynamic_locks; 2053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_end_byte = num_dynamic_locks; 2054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_start_bit = bit_count; 2055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bit_count++; 2056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project total_bits = 1; 2057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bit_count++; 2060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (num_dynamic_locks == p_t1t->num_lockbytes) 2064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return 0; 2066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while ( (byte_count < upper_offset) 2068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(num_dynamic_locks < p_t1t->num_lockbytes) ) 2069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bytes_locked_per_bit = p_t1t->lock_tlv[p_t1t->lockbyte[num_dynamic_locks].tlv_index].bytes_locked_per_bit; 2071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Number of bits in the current lock byte */ 2073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project b_all_bits_are_locks = ((p_t1t->lockbyte[num_dynamic_locks].byte_index + 1) * TAG_BITS_PER_BYTE <= p_t1t->lock_tlv[p_t1t->lockbyte[num_dynamic_locks].tlv_index].num_bits); 2074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_bits = b_all_bits_are_locks ? TAG_BITS_PER_BYTE : p_t1t->lock_tlv[p_t1t->lockbyte[num_dynamic_locks].tlv_index].num_bits % TAG_BITS_PER_BYTE; 2075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Collect all lock bits that covers the current segment */ 2077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((bytes_locked_per_bit * (num_bits - bit_count)) + byte_count < upper_offset) 2078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project byte_count += bytes_locked_per_bit * (num_bits - bit_count); 2080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project total_bits += num_bits - bit_count; 2081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bit_count = 0; 2082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_end_byte = num_dynamic_locks; 2083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_dynamic_locks++; 2084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* The last lock byte that covers the current segment */ 2088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bit_count = 0; 2089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (bit_count < num_bits) 2090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project byte_count += bytes_locked_per_bit; 2092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (byte_count >= upper_offset) 2093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_end_byte = num_dynamic_locks; 2095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project total_bits += (bit_count + 1); 2096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bit_count++; 2099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return total_bits; 2103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_update_lock_attributes 2108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function will check if the tag index passed as 2110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** argument is a locked byte and return 2111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** TRUE or FALSE 2112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters: index, the index of the byte in the tag 2114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE, if the specified index in the tag is a locked or 2117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** reserved or otp byte 2118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** FALSE, otherwise 2119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t1t_update_lock_attributes (void) 2122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 xx = 0; 2124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 bytes_locked_per_lock_bit; 2125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 num_static_lock_bytes = 0; 2126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 num_dynamic_lock_bytes = 0; 2127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 bits_covered = 0; 2128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 bytes_covered = 0; 2129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 block_count = 0; 2130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 2131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 start_lock_byte; 2132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 start_lock_bit; 2133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 end_lock_byte; 2134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 num_lock_bits; 2135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 total_bits; 2136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project block_count = 0; 2139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (block_count < T1T_BLOCKS_PER_SEGMENT) 2140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lock_attr[block_count] = 0x00; 2142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project block_count++; 2143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* update lock_attr based on static lock bytes */ 2146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->segment == 0) 2147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project xx = 0; 2149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_static_lock_bytes = 0; 2150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project block_count = 0; 2151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_lock_bits = 8; 2152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (num_static_lock_bytes < T1T_NUM_STATIC_LOCK_BYTES) 2154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Update lock attribute based on 2 static locks */ 2156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (xx < num_lock_bits) 2157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lock_attr[block_count] = 0x00; 2159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->mem[T1T_LOCK_0_OFFSET + num_static_lock_bytes] & rw_t1t_mask_bits[xx++]) 2161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If the bit is set then 1 block is locked */ 2163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lock_attr[block_count] = 0xFF; 2164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project block_count++; 2167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_static_lock_bytes++; 2169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project xx = 0; 2170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Locked bytes */ 2172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lock_attr[0x00] = 0xFF; 2173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lock_attr[0x0D] = 0xFF; 2174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* update lock_attr based on segment and using dynamic lock bytes */ 2178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((total_bits = rw_t1t_get_lock_bits_for_segment (p_t1t->segment,&start_lock_byte, &start_lock_bit,&end_lock_byte)) != 0) 2179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project xx = start_lock_bit; 2181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_dynamic_lock_bytes = start_lock_byte; 2182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bits_covered = 0; 2183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bytes_covered = 0; 2184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project block_count = 0; 2185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_lock_bits = 8; 2186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lock_attr[block_count] = 0; 2188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (num_dynamic_lock_bytes <= end_lock_byte) 2190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bytes_locked_per_lock_bit = p_t1t->lock_tlv[p_t1t->lockbyte[num_dynamic_lock_bytes].tlv_index].bytes_locked_per_bit; 2192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (num_dynamic_lock_bytes == end_lock_byte) 2193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_lock_bits = (total_bits % 8 == 0)? 8:total_bits % 8; 2195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (xx < num_lock_bits) 2197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bytes_covered = 0; 2199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (bytes_covered < bytes_locked_per_lock_bit) 2200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Set/clear lock_attr byte bits based on whether a particular lock bit is set or not 2202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * each bit in lock_attr represents one byte in Tag read only attribute */ 2203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->lockbyte[num_dynamic_lock_bytes].lock_byte & rw_t1t_mask_bits[xx]) 2204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lock_attr[block_count] |= 0x01 << bits_covered; 2206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bytes_covered++; 2208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bits_covered++; 2209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (bits_covered == 8) 2210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project bits_covered = 0; 2212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project block_count++; 2213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (block_count < T1T_BLOCKS_PER_SEGMENT) 2214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lock_attr[block_count] = 0; 2215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project xx++; 2218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_dynamic_lock_bytes++; 2220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project xx = 0; 2221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_is_lock_reserved_otp_byte 2229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function will check if the tag index passed as 2231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** argument is a lock or reserved or otp byte 2232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters: index, the index of the byte in the tag's current segment 2234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE, if the specified index in the tag is a locked or 2237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** reserved or otp byte 2238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** FALSE, otherwise 2239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t1t_is_lock_reserved_otp_byte (UINT16 index) 2242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 2244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->attr_seg != p_t1t->segment) 2246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Update p_t1t->attr to reflect the current segment */ 2248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_update_attributes (); 2249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->attr_seg = p_t1t->segment; 2250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project index = index % T1T_SEGMENT_SIZE; 2252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Every bit in p_t1t->attr indicates one specific byte of the tag is either a lock/reserved/otp byte or not 2254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * So, each array element in p_t1t->attr covers one block in the tag as T1 block size and array element size is 8 2255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Find the block and offset for the index (passed as argument) and Check if the offset bit in the 2256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * p_t1t->attr[block] is set or not. If the bit is set then it is a lock/reserved/otp byte, otherwise not */ 2257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ((p_t1t->attr[index /8] & rw_t1t_mask_bits[index % 8]) == 0) ? FALSE:TRUE; 2259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_is_read_only_byte 2264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function will check if the tag index passed as 2266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** argument is a read only byte 2267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters: index, the index of the byte in the tag's current segment 2269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE, if the specified index in the tag is a locked or 2272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** reserved or otp byte 2273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** FALSE, otherwise 2274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN rw_t1t_is_read_only_byte (UINT16 index) 2277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 2279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->lock_attr_seg != p_t1t->segment) 2281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Update p_t1t->lock_attr to reflect the current segment */ 2283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_update_lock_attributes (); 2284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lock_attr_seg = p_t1t->segment; 2285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project index = index % T1T_SEGMENT_SIZE; 2288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Every bit in p_t1t->lock_attr indicates one specific byte of the tag is a read only byte or read write byte 2289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * So, each array element in p_t1t->lock_attr covers one block in the tag as T1 block size and array element size is 8 2290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Find the block and offset for the index (passed as argument) and Check if the offset bit in the 2291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * p_t1t->lock_attr[block] is set or not. If the bit is set then it is a read only byte, otherwise read write byte */ 2292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ((p_t1t->lock_attr[index /8] & rw_t1t_mask_bits[index % 8]) == 0) ? FALSE:TRUE; 2294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T1tFormatNDef 2299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Format Tag content 2302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK, Command sent to format Tag 2305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_REJECTED: Invalid HR0 and cannot format the tag 2306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 2309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T1tFormatNDef (void) 2310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 2312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status = NFC_STATUS_FAILED; 2313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project const tT1T_INIT_TAG *p_ret; 2314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 addr; 2315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 2316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->state != RW_T1T_STATE_IDLE) 2318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_WARNING1 ("RW_T1tFormatNDef - Tag not initialized/ Busy! State: %u", p_t1t->state); 2320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_FAILED); 2321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_t1t->hr[0] & 0xF0) != T1T_NDEF_SUPPORTED) 2324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_WARNING1 ("RW_T1tFormatNDef - Cannot format tag as NDEF not supported. HR0: %u", p_t1t->hr[0]); 2326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_REJECTED); 2327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_ret = t1t_tag_init_data (p_t1t->hr[0])) == NULL) 2330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_WARNING2 ("RW_T1tFormatNDef - Invalid HR - HR0: %u, HR1: %u", p_t1t->hr[0], p_t1t->hr[1]); 2332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_REJECTED); 2333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memset (p_t1t->ndef_first_block, 0, T1T_BLOCK_SIZE); 2336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memset (p_t1t->ndef_final_block, 0, T1T_BLOCK_SIZE); 2337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = p_t1t->ndef_first_block; 2338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Prepare Capability Container */ 2340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T1T_CC_NMN); 2341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T1T_CC_VNO); 2342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, p_ret->tms); 2343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T1T_CC_RWA_RW); 2344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_ret->b_dynamic) 2345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Prepare Lock and Memory TLV */ 2347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, TAG_LOCK_CTRL_TLV); 2348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T1T_DEFAULT_TLV_LEN); 2349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, p_ret->lock_tlv[0]); 2350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, p_ret->lock_tlv[1]); 2351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = p_t1t->ndef_final_block; 2352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, p_ret->lock_tlv[2]); 2353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, TAG_MEM_CTRL_TLV); 2354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, T1T_DEFAULT_TLV_LEN); 2355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, p_ret->mem_tlv[0]); 2356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, p_ret->mem_tlv[1]); 2357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, p_ret->mem_tlv[2]); 2358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Prepare NULL NDEF TLV */ 2360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, TAG_NDEF_TLV); 2361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_BE_STREAM (p, 0); 2362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_cb.tcb.t1t.hr[0] != T1T_STATIC_HR0 || rw_cb.tcb.t1t.hr[1] >= RW_T1T_HR1_MIN) 2364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* send WRITE-E8 command */ 2366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((status = rw_t1t_send_dyn_cmd (T1T_CMD_WRITE_E8, 1, p_t1t->ndef_first_block)) == NFC_STATUS_OK) 2367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->state = RW_T1T_STATE_FORMAT_TAG; 2369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->b_update = FALSE; 2370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->b_rseg = FALSE; 2371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_ret->b_dynamic) 2372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->substate = RW_T1T_SUBSTATE_WAIT_SET_CC; 2373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->substate = RW_T1T_SUBSTATE_WAIT_SET_NULL_NDEF; 2375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* send WRITE-E command */ 2380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T1T_BLD_ADD ((addr), 1, 0); 2381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((status = rw_t1t_send_static_cmd (T1T_CMD_WRITE_E, addr, p_t1t->ndef_first_block[0])) == NFC_STATUS_OK) 2383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->work_offset = 0; 2385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->state = RW_T1T_STATE_FORMAT_TAG; 2386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->substate = RW_T1T_SUBSTATE_WAIT_SET_NULL_NDEF; 2387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->b_update = FALSE; 2388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->b_rseg = FALSE; 2389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 2393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T1tLocateTlv 2398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called to find the start of the given TLV 2400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters: tlv_type, Type of TLV to find 2402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NCI_STATUS_OK, if detection was started. Otherwise, error status. 2404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T1tLocateTlv (UINT8 tlv_type) 2407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status = NFC_STATUS_FAILED; 2409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t= &rw_cb.tcb.t1t; 2410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 adds; 2411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->state != RW_T1T_STATE_IDLE) 2413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_WARNING1 ("RW_T1tLocateTlv - Busy - State: %u", p_t1t->state); 2415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_FAILED); 2416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->tlv_detect = tlv_type; 2418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if( (p_t1t->tlv_detect == TAG_NDEF_TLV) 2420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(((p_t1t->hr[0]) & 0xF0) != T1T_NDEF_SUPPORTED) ) 2421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("RW_T1tLocateTlv - Error: NDEF not supported by the tag"); 2423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_REFUSED); 2424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_t1t->tlv_detect == TAG_MEM_CTRL_TLV) 2427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_t1t->tlv_detect == TAG_NDEF_TLV) ) 2428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->num_mem_tlvs = 0; 2430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_t1t->tlv_detect == TAG_LOCK_CTRL_TLV) 2433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_t1t->tlv_detect == TAG_NDEF_TLV) ) 2434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->num_lockbytes = 0; 2436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->num_lock_tlvs = 0; 2437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 24395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Start reading memory, looking for the TLV */ 24405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_t1t->segment = 0; 24415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if ((p_t1t->hr[0] & 0x0F) != 1) 2442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 24435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* send RSEG command */ 24445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_T1T_BLD_ADDS ((adds), (p_t1t->segment)); 24455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen status = rw_t1t_send_dyn_cmd (T1T_CMD_RSEG, adds, NULL); 2446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 24475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else 24485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 24495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen status = rw_t1t_send_static_cmd (T1T_CMD_RALL, 0, 0); 24505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 24515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (status == NFC_STATUS_OK) 2452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->tlv_detect = tlv_type; 2454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->work_offset = 0; 2455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->state = RW_T1T_STATE_TLV_DETECT; 2456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->substate = RW_T1T_SUBSTATE_NONE; 2457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 2460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T1tDetectNDef 2465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** This function is used to perform NDEF detection on a Type 1 tag, and 2468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** retrieve the tag's NDEF attribute information (block 0). 2469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Before using this API, the application must call RW_SelectTagType to 2471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** indicate that a Type 1 tag has been activated. 2472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK: ndef detection procedure started 2475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_WRONG_PROTOCOL: type 1 tag not activated 2476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_BUSY: another command is already in progress 2477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 2480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T1tDetectNDef (void) 2481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return RW_T1tLocateTlv (TAG_NDEF_TLV); 2483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T1tReadNDef 2488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function can be called to read the NDEF message on the tag. 2490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters: p_buffer: The buffer into which to read the NDEF message 2492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** buf_len: The length of the buffer 2493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NCI_STATUS_OK, if read was started. Otherwise, error status. 2495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T1tReadNDef (UINT8 *p_buffer, UINT16 buf_len) 2498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status = NFC_STATUS_FAILED; 2500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 2501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BOOLEAN b_notify; 2502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 adds; 2503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project const tT1T_CMD_RSP_INFO *p_cmd_rsp_info_rall = t1t_cmd_to_rsp_info (T1T_CMD_RALL); 2504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project const tT1T_CMD_RSP_INFO *p_cmd_rsp_info_rseg = t1t_cmd_to_rsp_info (T1T_CMD_RSEG); 2505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->state != RW_T1T_STATE_IDLE) 2509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_WARNING1 ("RW_T1tReadNDef - Busy - State: %u", p_t1t->state); 2511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_FAILED); 2512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check HR0 if NDEF supported by the tag */ 2515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (((p_t1t->hr[0]) & 0xF0) != T1T_NDEF_SUPPORTED) 2516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("RW_T1tReadNDef - Error: NDEF not supported by the tag"); 2518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_REFUSED); 2519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->tag_attribute == RW_T1_TAG_ATTRB_INITIALIZED_NDEF) 2522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_WARNING1 ("RW_T1tReadNDef - NDEF Message length is zero, NDEF Length : %u ", p_t1t->ndef_msg_len); 2524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_NOT_INITIALIZED); 2525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_t1t->tag_attribute != RW_T1_TAG_ATTRB_READ_WRITE) 2528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_t1t->tag_attribute != RW_T1_TAG_ATTRB_READ_ONLY) ) 2529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("RW_T1tReadNDef - Error: NDEF detection not performed yet/ Tag is in Initialized state"); 2531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_FAILED); 2532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (buf_len < p_t1t->ndef_msg_len) 2535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_WARNING2 ("RW_T1tReadNDef - buffer size: %u less than NDEF msg sise: %u", buf_len, p_t1t->ndef_msg_len); 2537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_FAILED); 2538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->p_ndef_buffer = p_buffer; 2540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->b_rseg == TRUE) 2542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If already got response to RSEG 0 */ 2544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->state = RW_T1T_STATE_READ_NDEF; 2545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->p_cmd_rsp_info = (tT1T_CMD_RSP_INFO *)p_cmd_rsp_info_rseg; 2546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_handle_read_rsp (&b_notify,p_t1t->mem); 2548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = NFC_STATUS_OK; 2549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_t1t->b_update == TRUE) 2551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If already got response to RALL */ 2553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->state = RW_T1T_STATE_READ_NDEF; 2554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->p_cmd_rsp_info = (tT1T_CMD_RSP_INFO *) p_cmd_rsp_info_rall; 2555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t1t_handle_read_rsp (&b_notify,p_t1t->mem); 2557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = NFC_STATUS_OK; 2558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->segment = 0; 2563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->work_offset = 0; 2564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_t1t->hr[0] & 0x0F) != 1) 2565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* send RSEG command */ 2567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T1T_BLD_ADDS ((adds), (p_t1t->segment)); 2568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_t1t_send_dyn_cmd (T1T_CMD_RSEG, adds, NULL); 2569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_t1t_send_static_cmd (T1T_CMD_RALL, 0, 0); 2573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == NFC_STATUS_OK) 2575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->state = RW_T1T_STATE_READ_NDEF; 2576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 2580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T1tWriteNDef 2585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function can be called to write an NDEF message to the tag. 2587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters: msg_len: The length of the buffer 2589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** p_msg: The NDEF message to write 2590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NCI_STATUS_OK, if write was started. Otherwise, error status. 2592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T1tWriteNDef (UINT16 msg_len, UINT8 *p_msg) 2595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status = NFC_STATUS_FAILED; 2597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 2598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 num_ndef_bytes; 2599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 offset; 2600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 addr; 2601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 init_lengthfield_len; 2602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 new_lengthfield_len; 2603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 init_ndef_msg_offset; 2604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->state != RW_T1T_STATE_IDLE) 2606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_WARNING1 ("RW_T1tWriteNDef - Busy - State: %u", p_t1t->state); 2608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_FAILED); 2609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check HR0 if NDEF supported by the tag */ 2612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (((p_t1t->hr[0]) & 0xF0) != T1T_NDEF_SUPPORTED) 2613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("RW_T1tWriteNDef - Error: NDEF not supported by the tag"); 2615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_REFUSED); 2616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_t1t->tag_attribute != RW_T1_TAG_ATTRB_READ_WRITE) 2619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_t1t->tag_attribute != RW_T1_TAG_ATTRB_INITIALIZED_NDEF) ) 2620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("RW_T1tWriteNDef - Tag cannot update NDEF"); 2622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_REFUSED); 2623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (msg_len > p_t1t->max_ndef_msg_len) 2626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("RW_T1tWriteNDef - Cannot write NDEF of size greater than %u bytes", p_t1t->max_ndef_msg_len); 2628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_REFUSED); 2629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->p_ndef_buffer = p_msg; 2632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->new_ndef_msg_len = msg_len; 2633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project new_lengthfield_len = p_t1t->new_ndef_msg_len > 254 ? 3:1; 2634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project init_lengthfield_len = (UINT8) (p_t1t->ndef_msg_offset - p_t1t->ndef_header_offset); 2635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project init_ndef_msg_offset = p_t1t->ndef_msg_offset; 2636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* ndef_msg_offset should reflect the new ndef message offset */ 2638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (init_lengthfield_len > new_lengthfield_len) 2639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->ndef_msg_offset = init_ndef_msg_offset - (T1T_LONG_NDEF_LEN_FIELD_LEN - T1T_SHORT_NDEF_LEN_FIELD_LEN); 2641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (init_lengthfield_len < new_lengthfield_len) 2643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->ndef_msg_offset = init_ndef_msg_offset + (T1T_LONG_NDEF_LEN_FIELD_LEN - T1T_SHORT_NDEF_LEN_FIELD_LEN); 2645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_ndef_bytes = 0; 2648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset = p_t1t->ndef_msg_offset; 2649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->segment = (UINT8) (p_t1t->ndef_msg_offset/T1T_SEGMENT_SIZE); 2650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Locate NDEF final block based on the size of new NDEF Message */ 2652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (num_ndef_bytes < p_t1t->new_ndef_msg_len) 2653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_t1t_is_lock_reserved_otp_byte ((UINT16) offset) == FALSE) 2655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_ndef_bytes++; 2656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project offset++; 2658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (offset % T1T_SEGMENT_SIZE == 0) 2659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->segment = (UINT8) (offset / T1T_SEGMENT_SIZE); 2661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->b_update = FALSE; 2665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->b_rseg = FALSE; 2666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_t1t->hr[0] & 0x0F) != 1) 2668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Dynamic data structure */ 26705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_t1t->block_read = (UINT8) ((offset - 1)/T1T_BLOCK_SIZE); 2671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Read NDEF final block before updating */ 26725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if ((status = rw_t1t_send_dyn_cmd (T1T_CMD_READ8, p_t1t->block_read, NULL)) == NFC_STATUS_OK) 2673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 26745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_t1t->num_ndef_finalblock = p_t1t->block_read; 2675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->state = RW_T1T_STATE_WRITE_NDEF; 2676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->substate = RW_T1T_SUBSTATE_WAIT_READ_NDEF_BLOCK; 2677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* NDEF detected and Static memory structure so send WRITE-E command */ 2682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T1T_BLD_ADD ((addr), (T1T_CC_BLOCK), (T1T_CC_NMN_OFFSET)); 2683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((status = rw_t1t_send_static_cmd (T1T_CMD_WRITE_E, addr, 0)) == NFC_STATUS_OK) 2684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->state = RW_T1T_STATE_WRITE_NDEF; 2686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->substate = RW_T1T_SUBSTATE_WAIT_INVALIDATE_NDEF; 2687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status != NFC_STATUS_OK) 2692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if status failed, reset ndef_msg_offset to initial message */ 2694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->ndef_msg_offset = init_ndef_msg_offset; 2695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 2697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T1tSetTagReadOnly 2702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function can be called to set t1 tag as read only. 2704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters: None 2706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NCI_STATUS_OK, if setting tag as read only was started. 2708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Otherwise, error status. 2709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T1tSetTagReadOnly (BOOLEAN b_hard_lock) 2712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status = NFC_STATUS_FAILED; 2714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T1T_CB *p_t1t = &rw_cb.tcb.t1t; 2715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 addr; 2716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 num_locks; 2717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->state != RW_T1T_STATE_IDLE) 2719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_WARNING1 ("RW_T1tSetTagReadOnly - Busy - State: %u", p_t1t->state); 2721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_BUSY); 2722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->b_hard_lock = b_hard_lock; 2725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_t1t->tag_attribute == RW_T1_TAG_ATTRB_READ_WRITE) 2727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_t1t->tag_attribute == RW_T1_TAG_ATTRB_INITIALIZED) 2728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_t1t->tag_attribute == RW_T1_TAG_ATTRB_INITIALIZED_NDEF) ) 2729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* send WRITE-NE command */ 2731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T1T_BLD_ADD ((addr), (T1T_CC_BLOCK), (T1T_CC_RWA_OFFSET)); 2732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((status = rw_t1t_send_static_cmd (T1T_CMD_WRITE_NE, addr, 0x0F)) == NFC_STATUS_OK) 2733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->b_update = FALSE; 2735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->b_rseg = FALSE; 2736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t1t->b_hard_lock) 2738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_locks = 0; 2740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (num_locks < p_t1t->num_lockbytes) 2741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->lockbyte[num_locks].lock_status = RW_T1T_LOCK_NOT_UPDATED; 2743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_locks++; 2744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->state = RW_T1T_STATE_SET_TAG_RO; 2747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_t1t->substate = RW_T1T_SUBSTATE_WAIT_SET_CC_RWA_RO; 2748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 2752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 2755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t1t_get_sub_state_name 2758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function returns the sub_state name. 2760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NOTE conditionally compiled to save memory. 2762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns pointer to the name 2764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *rw_t1t_get_sub_state_name (UINT8 sub_state) 2767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (sub_state) 2769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_NONE: 2771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("NONE"); 2772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_READ_TLV_VALUE: 2773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("EXTRACT_TLV_VALUE"); 2774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_READ_LOCKS: 2775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("READING_LOCKS"); 2776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_READ_NDEF_BLOCK: 2777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("READ_NDEF_FINAL_BLOCK"); 2778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_INVALIDATE_NDEF: 2779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("INVALIDATING_NDEF"); 2780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_NDEF_WRITE: 2781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("WRITE_NDEF_TLV_MESSAGE"); 2782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_NDEF_UPDATED: 2783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("WAITING_RSP_FOR_LAST_NDEF_WRITE"); 2784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_VALIDATE_NDEF: 2785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("VALIDATING_NDEF"); 2786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_SET_CC_RWA_RO: 2787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("SET_RWA_RO"); 2788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_SET_ST_LOCK_BITS: 2789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("SET_STATIC_LOCK_BITS"); 2790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T1T_SUBSTATE_WAIT_SET_DYN_LOCK_BITS: 2791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("SET_DYNAMIC_LOCK_BITS"); 2792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 2794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return ("???? UNKNOWN SUBSTATE"); 2795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* (BT_TRACE_VERBOSE == TRUE) */ 2798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* (defined ((RW_NDEF_INCLUDED) && (RW_NDEF_INCLUDED == TRUE)) */ 2800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* (NFC_INCLUDED == TRUE) */ 2802