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 3 tag in Reader/Writer 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * mode. 24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h> 27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_target.h" 28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "bt_types.h" 29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "trace_api.h" 30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_api.h" 32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_int.h" 33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nci_hmsgs.h" 34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "rw_api.h" 35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "rw_int.h" 36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "tags_int.h" 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "gki.h" 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Definitions for constructing t3t command messages */ 40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T3T_FL_PADDING 0x01 /* Padding needed for last NDEF block */ 41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T3T_MAX_NDEF_BLOCKS_PER_UPDATE_1_BYTE_FORMAT (13) /* Maximum number of NDEF blocks updates that can fit into one command (when all block-numbers are < 256) */ 42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T3T_MAX_NDEF_BLOCKS_PER_UPDATE_2_BYTE_FORMAT (12) /* Maximum number of NDEF blocks updates that can fit into one command (when all block-numbers are >= 256) */ 43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Definitions for SENSF_RES */ 45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T3T_SENSF_RES_RD_OFFSET 17 /* Offset of RD in SENSF_RES from NCI_POLL NTF (includes 1 byte SENSF_RES length) */ 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T3T_SENSF_RES_RD_LEN 2 /* Size of RD in SENSF_RES */ 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Timeout definitions for commands */ 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T3T_POLL_CMD_TIMEOUT_TICKS ((RW_T3T_TOUT_RESP*2*QUICK_TIMER_TICKS_PER_SEC) / 1000) 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS ((RW_T3T_TOUT_RESP*QUICK_TIMER_TICKS_PER_SEC) / 1000) 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T3T_RAW_FRAME_CMD_TIMEOUT_TICKS (RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS * 4) 5267fe610c4b6462d96e252fa2c68d67ce63787fcbSherry Smith#define RW_T3T_MIN_TIMEOUT_TICKS 10 53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Macro to extract major version from NDEF version byte */ 55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define T3T_GET_MAJOR_VERSION(ver) (ver>>4) 56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Enumeration of API commands */ 58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectenum 59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_CMD_DETECT_NDEF, 61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_CMD_CHECK_NDEF, 62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_CMD_UPDATE_NDEF, 63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_CMD_CHECK, 64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_CMD_UPDATE, 65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_CMD_SEND_RAW_FRAME, 66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_CMD_GET_SYSTEM_CODES, 67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_CMD_FORMAT, 685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_T3T_CMD_SET_READ_ONLY_SOFT, 695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_T3T_CMD_SET_READ_ONLY_HARD, 70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_CMD_MAX 72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* RW_CBACK events corresponding to API comands */ 75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectconst UINT8 rw_t3t_api_res_evt[RW_T3T_CMD_MAX] = 76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_NDEF_DETECT_EVT, /* RW_T3T_CMD_DETECT_NDEF */ 78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_CHECK_CPLT_EVT, /* RW_T3T_CMD_CHECK_NDEF */ 79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_UPDATE_CPLT_EVT, /* RW_T3T_CMD_UPDATE_NDEF */ 80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_CHECK_CPLT_EVT, /* RW_T3T_CMD_CHECK */ 81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_UPDATE_CPLT_EVT, /* RW_T3T_CMD_UPDATE */ 82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_RAW_FRAME_EVT, /* RW_T3T_CMD_SEND_RAW_FRAME */ 83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_GET_SYSTEM_CODES_EVT, /* RW_T3T_CMD_GET_SYSTEM_CODES */ 845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_T3T_FORMAT_CPLT_EVT, /* RW_T3T_CMD_FORMAT */ 855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_T3T_SET_READ_ONLY_CPLT_EVT /* RW_T3T_CMD_SET_READ_ONLY */ 86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* States */ 89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectenum 90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_STATE_NOT_ACTIVATED, 92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_STATE_IDLE, 93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_STATE_COMMAND_PENDING 94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Sub-states */ 97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectenum 98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Sub states for getting system codes */ 100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_GET_SC_SST_POLL_WILDCARD, /* Waiting for wilcard poll response */ 101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_GET_SC_SST_POLL_NDEF, /* Waiting for NDEF poll response */ 102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_GET_SC_SST_REQUEST_SC, /* Waiting for REQUEST_SYSTEM_CODE response */ 103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Sub states for formatting Felica-Lite */ 105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_FMT_SST_POLL_FELICA_LITE, /* Waiting for POLL Felica-Lite response (for formatting) */ 106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_FMT_SST_CHECK_MC_BLK, /* Waiting for Felica-Lite MC (MemoryControl) block-read to complete */ 107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_FMT_SST_UPDATE_MC_BLK, /* Waiting for Felica-Lite MC (MemoryControl) block-write to complete */ 1085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_T3T_FMT_SST_UPDATE_NDEF_ATTRIB, /* Waiting for NDEF attribute block-write to complete */ 1095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 1105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Sub states for setting Felica-Lite read only */ 1115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_T3T_SRO_SST_POLL_FELICA_LITE, /* Waiting for POLL Felica-Lite response (for setting read only) */ 1125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_T3T_SRO_SST_UPDATE_NDEF_ATTRIB, /* Waiting for NDEF attribute block-write to complete */ 1135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_T3T_SRO_SST_CHECK_MC_BLK, /* Waiting for Felica-Lite MC (MemoryControl) block-read to complete */ 1145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_T3T_SRO_SST_UPDATE_MC_BLK /* Waiting for Felica-Lite MC (MemoryControl) block-write to complete */ 115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *rw_t3t_cmd_str (UINT8 cmd_id); 119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *rw_t3t_state_str (UINT8 state_id); 120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Local static functions */ 124a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chustatic void rw_t3t_update_ndef_flag (UINT8 *p_flag); 125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t3t_unselect (UINT8 peer_nfcid2[]); 126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BT_HDR *rw_t3t_get_cmd_buf (void); 127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t3t_send_to_lower (BT_HDR *p_msg); 128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t3t_handle_get_system_codes_cplt (void); 129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t3t_handle_get_sc_poll_rsp (tRW_T3T_CB *p_cb, UINT8 nci_status, UINT8 num_responses, UINT8 sensf_res_buf_size, UINT8 *p_sensf_res_buf); 130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t3t_handle_ndef_detect_poll_rsp (tRW_T3T_CB *p_cb, UINT8 nci_status, UINT8 num_responses, UINT8 sensf_res_buf_size, UINT8 *p_sensf_res_buf); 131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t3t_handle_fmt_poll_rsp (tRW_T3T_CB *p_cb, UINT8 nci_status, UINT8 num_responses, UINT8 sensf_res_buf_size, UINT8 *p_sensf_res_buf); 1325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic void rw_t3t_handle_sro_poll_rsp (tRW_T3T_CB *p_cb, UINT8 nci_status, UINT8 num_responses, UINT8 sensf_res_buf_size, UINT8 *p_sensf_res_buf); 133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Default NDEF attribute information block (used when formatting Felica-Lite tags) */ 136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T3T_DEFAULT_FELICALITE_NBR 4 /* NBr (max block reads per cmd)*/ 137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T3T_DEFAULT_FELICALITE_NBW 1 /* NBw (max block write per cmd)*/ 1385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define RW_T3T_DEFAULT_FELICALITE_NMAXB (T3T_FELICALITE_NMAXB) 139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define RW_T3T_DEFAULT_FELICALITE_ATTRIB_INFO_CHECKSUM ((T3T_MSG_NDEF_VERSION + \ 140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_DEFAULT_FELICALITE_NBR + \ 141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_DEFAULT_FELICALITE_NBW + \ 142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (RW_T3T_DEFAULT_FELICALITE_NMAXB>>8) + \ 143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (RW_T3T_DEFAULT_FELICALITE_NMAXB&0xFF) +\ 144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project T3T_MSG_NDEF_WRITEF_OFF + \ 145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project T3T_MSG_NDEF_RWFLAG_RW) & 0xFFFF) 146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectconst UINT8 rw_t3t_default_attrib_info[T3T_MSG_BLOCKSIZE] = 148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project T3T_MSG_NDEF_VERSION, /* Ver */ 150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_DEFAULT_FELICALITE_NBR, /* NBr (max block reads per cmd)*/ 151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_T3T_DEFAULT_FELICALITE_NBW, /* NBw (max block write per cmd)*/ 152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (RW_T3T_DEFAULT_FELICALITE_NMAXB>>8), /* Nmaxb (max size in blocks) */ 153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (RW_T3T_DEFAULT_FELICALITE_NMAXB&0xFF), /* Nmaxb (max size in blocks) */ 154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 0, 0, 0, 0, /* Unused */ 155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project T3T_MSG_NDEF_WRITEF_OFF, /* WriteF */ 156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project T3T_MSG_NDEF_RWFLAG_RW, /* RW Flag */ 157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 0, 0, 0, /* Ln (current size in bytes) */ 158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (RW_T3T_DEFAULT_FELICALITE_ATTRIB_INFO_CHECKSUM >> 8), /* checksum (high-byte) */ 160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (RW_T3T_DEFAULT_FELICALITE_ATTRIB_INFO_CHECKSUM & 0xFF) /* checksum (low-byte) */ 161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 164818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith/* This is (T/t3t * 4^E) , E is the index of the array. The unit is .0001 ms */ 165818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smithstatic const UINT32 rw_t3t_mrti_base [] = 166818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith{ 167818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith 302, 168818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith 1208, 169818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith 4832, 170818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith 19328 171818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith}; 172818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith 173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 176818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Function rw_t3t_check_timeout 177818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 178818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Description The timeout value is a + b * number_blocks) 179818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 180818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Returns timeout value in ticks 181818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 182818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith*******************************************************************************/ 183818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smithstatic UINT32 rw_t3t_check_timeout (UINT16 num_blocks) 184818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith{ 185818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 186818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith UINT32 timeout; 18767fe610c4b6462d96e252fa2c68d67ce63787fcbSherry Smith UINT32 extra; 18867fe610c4b6462d96e252fa2c68d67ce63787fcbSherry Smith 189818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith timeout = (p_cb->check_tout_a + num_blocks * p_cb->check_tout_b)*QUICK_TIMER_TICKS_PER_SEC/1000000; 19067fe610c4b6462d96e252fa2c68d67ce63787fcbSherry Smith /* allow some extra time for driver */ 19167fe610c4b6462d96e252fa2c68d67ce63787fcbSherry Smith extra = (timeout / 10) + RW_T3T_MIN_TIMEOUT_TICKS; 19267fe610c4b6462d96e252fa2c68d67ce63787fcbSherry Smith timeout += extra; 19367fe610c4b6462d96e252fa2c68d67ce63787fcbSherry Smith 194818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith return timeout; 195818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith} 196818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith 197818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith/******************************************************************************* 198818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 199818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Function rw_t3t_update_timeout 200818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 201818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Description The timeout value is a + b * number_blocks) 202818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 203818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Returns timeout value in ticks 204818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 205818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith*******************************************************************************/ 206818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smithstatic UINT32 rw_t3t_update_timeout (UINT16 num_blocks) 207818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith{ 208818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 209818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith UINT32 timeout; 21067fe610c4b6462d96e252fa2c68d67ce63787fcbSherry Smith UINT32 extra; 21167fe610c4b6462d96e252fa2c68d67ce63787fcbSherry Smith 212818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith timeout = (p_cb->update_tout_a + num_blocks * p_cb->update_tout_b)*QUICK_TIMER_TICKS_PER_SEC/1000000; 21367fe610c4b6462d96e252fa2c68d67ce63787fcbSherry Smith /* allow some extra time for driver */ 21467fe610c4b6462d96e252fa2c68d67ce63787fcbSherry Smith extra = (timeout / 10) + RW_T3T_MIN_TIMEOUT_TICKS; 21567fe610c4b6462d96e252fa2c68d67ce63787fcbSherry Smith timeout += extra; 21667fe610c4b6462d96e252fa2c68d67ce63787fcbSherry Smith 217818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith return timeout; 218818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith} 219818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith/******************************************************************************* 220818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_process_error 222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process error (timeout or CRC error) 224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_t3t_process_error (tNFC_STATUS status) 229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 evt; 232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA evt_data; 233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd_buf; 234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->rw_state == RW_T3T_STATE_COMMAND_PENDING) 236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->cur_cmd == RW_T3T_CMD_GET_SYSTEM_CODES) 238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* For GetSystemCode: either tag did not respond to requested POLL, or REQUEST_SYSTEM_CODE command */ 240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_handle_get_system_codes_cplt (); 241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Retry sending command if retry-count < max */ 244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (rw_cb.cur_retry < RW_MAX_RETRIES) 245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* retry sending the command */ 247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.cur_retry++; 248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG2 ("T3T retransmission attempt %i of %i", rw_cb.cur_retry, RW_MAX_RETRIES); 250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* allocate a new buffer for message */ 252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_cmd_buf = rw_t3t_get_cmd_buf ()) != NULL) 253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_cmd_buf, p_cb->p_cur_cmd_buf, sizeof (BT_HDR) + p_cb->p_cur_cmd_buf->offset + p_cb->p_cur_cmd_buf->len); 255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rw_t3t_send_to_lower (p_cmd_buf) == NFC_STATUS_OK) 257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Start timer for waiting for response */ 259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_start_quick_timer (&p_cb->timer, NFC_TTYPE_RW_T3T_RESPONSE, p_cb->cur_tout); 260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* failure - could not send buffer */ 265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_cmd_buf); 266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("T3T maximum retransmission attempts reached (%i)", RW_MAX_RETRIES); 272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (defined (RW_STATS_INCLUDED) && (RW_STATS_INCLUDED == TRUE)) 275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* update failure count */ 276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_main_update_fail_stats (); 277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* RW_STATS_INCLUDED */ 278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_IDLE; 280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Notify app of result (if there was a pending command) */ 282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->cur_cmd < RW_T3T_CMD_MAX) 283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If doing presence check, use status=NFC_STATUS_FAILED, otherwise NFC_STATUS_TIMEOUT */ 285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = status; 286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt = rw_t3t_api_res_evt[p_cb->cur_cmd]; 287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Set additional flags for RW_T3T_NDEF_DETECT_EVT */ 289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (evt == RW_T3T_NDEF_DETECT_EVT) 290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.ndef.flags = RW_NDEF_FL_UNKNOWN; 292a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu rw_t3t_update_ndef_flag (&evt_data.ndef.flags); 293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (evt, &evt_data); 296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = status; 301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T3T_INTF_ERROR_EVT, &evt_data); 302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_start_poll_timer 308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Start the timer for T3T POLL Command 310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_t3t_start_poll_timer (tRW_T3T_CB *p_cb) 315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_start_quick_timer (&p_cb->poll_timer, NFC_TTYPE_RW_T3T_RESPONSE, RW_T3T_POLL_CMD_TIMEOUT_TICKS); 317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_handle_nci_poll_ntf 322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle NCI_T3T_POLLING_NTF 324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_t3t_handle_nci_poll_ntf (UINT8 nci_status, UINT8 num_responses, UINT8 sensf_res_buf_size, UINT8 *p_sensf_res_buf) 329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA evt_data; 331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* stop timer for poll response */ 334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_stop_quick_timer (&p_cb->poll_timer); 335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Stop t3t timer (if started) */ 337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->flags & RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP) 338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags &= ~RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP; 340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = nci_status; 341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_IDLE; 342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T3T_PRESENCE_CHECK_EVT, (tRW_DATA *) &evt_data); 343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cb->flags & RW_T3T_FL_W4_GET_SC_POLL_RSP) 345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Handle POLL ntf in response to get system codes */ 347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags &= ~RW_T3T_FL_W4_GET_SC_POLL_RSP; 348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_handle_get_sc_poll_rsp (p_cb, nci_status, num_responses, sensf_res_buf_size, p_sensf_res_buf); 349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cb->flags & RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP) 351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Handle POLL ntf in response to get system codes */ 353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags &= ~RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP; 354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_handle_fmt_poll_rsp (p_cb, nci_status, num_responses, sensf_res_buf_size, p_sensf_res_buf); 355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else if (p_cb->flags & RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP) 3575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 3585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Handle POLL ntf in response to get system codes */ 3595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->flags &= ~RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP; 3605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen rw_t3t_handle_sro_poll_rsp (p_cb, nci_status, num_responses, sensf_res_buf_size, p_sensf_res_buf); 3615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cb->flags & RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP) 363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Handle POLL ntf in response to ndef detection */ 365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags &= ~RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP; 366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_handle_ndef_detect_poll_rsp (p_cb, nci_status, num_responses, sensf_res_buf_size, p_sensf_res_buf); 367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Handle POLL ntf in response to RW_T3tPoll */ 371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((evt_data.t3t_poll.status = nci_status) == NCI_STATUS_OK) 372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.t3t_poll.rc = p_cb->cur_poll_rc; 374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.t3t_poll.response_num = num_responses; 375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.t3t_poll.response_bufsize = sensf_res_buf_size; 376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.t3t_poll.response_buf = p_sensf_res_buf; 377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_IDLE; 380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T3T_POLL_EVT, &evt_data); 381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_handle_get_system_codes_cplt 388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Notify upper layer of system codes 390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_t3t_handle_get_system_codes_cplt (void) 395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA evt_data; 398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 i; 399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.t3t_sc.status = NFC_STATUS_OK; 401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.t3t_sc.num_system_codes = p_cb->num_system_codes; 402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.t3t_sc.p_system_codes = p_cb->system_codes; 403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("rw_t3t_handle_get_system_codes_cplt, number of systems: %i", evt_data.t3t_sc.num_system_codes); 405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (i = 0; i < evt_data.t3t_sc.num_system_codes; i++) 406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG2 (" system %i: %04X", i, evt_data.t3t_sc.p_system_codes[i]); 408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_IDLE; 411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T3T_GET_SYSTEM_CODES_EVT, &evt_data); 412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_format_cplt 419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Notify upper layer of format complete 421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_t3t_format_cplt (tNFC_STATUS status) 426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA evt_data; 429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_IDLE; 431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Update ndef info */ 4335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->ndef_attrib.status = status; 4345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (status == NFC_STATUS_OK) 4355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 4365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->ndef_attrib.version = T3T_MSG_NDEF_VERSION; 4375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->ndef_attrib.nbr = RW_T3T_DEFAULT_FELICALITE_NBR; 4385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->ndef_attrib.nbw = RW_T3T_DEFAULT_FELICALITE_NBW; 4395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->ndef_attrib.nmaxb = RW_T3T_DEFAULT_FELICALITE_NMAXB; 4405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->ndef_attrib.writef = T3T_MSG_NDEF_WRITEF_OFF; 4415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->ndef_attrib.rwflag = T3T_MSG_NDEF_RWFLAG_RW; 4425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->ndef_attrib.ln = 0; 4435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 4445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Notify upper layer of format complete */ 446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = status; 447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T3T_FORMAT_CPLT_EVT, &evt_data); 448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function rw_t3t_set_readonly_cplt 4535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 4545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description Notify upper layer of set read only complete 4555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 4565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns none 4575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 4585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/ 4595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenvoid rw_t3t_set_readonly_cplt (tNFC_STATUS status) 4605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{ 4615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 4625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen tRW_DATA evt_data; 4635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 4645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->rw_state = RW_T3T_STATE_IDLE; 4655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 4665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Notify upper layer of format complete */ 4675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen evt_data.status = status; 4685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen (*(rw_cb.p_cback)) (RW_T3T_SET_READ_ONLY_CPLT_EVT, &evt_data); 4695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 4705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 4715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/******************************************************************************* 4725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_process_timeout 474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process timeout 476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_t3t_process_timeout (TIMER_LIST_ENT *p_tle) 481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA evt_data; 484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check which timer timed out */ 486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_tle == &p_cb->timer) 487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* UPDATE/CHECK response timeout */ 489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR3 ("T3T timeout. state=%s cur_cmd=0x%02X (%s)", rw_t3t_state_str (rw_cb.tcb.t3t.rw_state), rw_cb.tcb.t3t.cur_cmd, rw_t3t_cmd_str (rw_cb.tcb.t3t.cur_cmd)); 491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else 492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR2 ("T3T timeout. state=0x%02X cur_cmd=0x%02X", rw_cb.tcb.t3t.rw_state, rw_cb.tcb.t3t.cur_cmd); 493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_process_error (NFC_STATUS_TIMEOUT); 496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("T3T POLL timeout."); 500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* POLL response timeout */ 502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->flags & RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP) 503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* POLL timeout for presence check */ 505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags &= ~RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP; 506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_FAILED; 507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_IDLE; 508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T3T_PRESENCE_CHECK_EVT, (tRW_DATA *) &evt_data); 509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cb->flags & RW_T3T_FL_W4_GET_SC_POLL_RSP) 511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* POLL timeout for getting system codes */ 513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags &= ~RW_T3T_FL_W4_GET_SC_POLL_RSP; 514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_handle_get_system_codes_cplt (); 515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cb->flags & RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP) 517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* POLL timeout for formatting Felica Lite */ 519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags &= ~RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP; 520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("Felica-Lite tag not detected"); 521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_format_cplt (NFC_STATUS_FAILED); 522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 5235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else if (p_cb->flags & RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP) 5245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 5255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* POLL timeout for configuring Felica Lite read only */ 5265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->flags &= ~RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP; 5275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_TRACE_ERROR0 ("Felica-Lite tag not detected"); 5285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen rw_t3t_set_readonly_cplt (NFC_STATUS_FAILED); 5295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cb->flags & RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP) 531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* POLL timeout for ndef detection */ 533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags &= ~RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP; 534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_handle_ndef_detect_poll_rsp (p_cb, NFC_STATUS_TIMEOUT, 0, 0, NULL); 535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Timeout waiting for response for RW_T3tPoll */ 539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.t3t_poll.status = NFC_STATUS_FAILED; 540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_IDLE; 541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T3T_POLL_EVT, (tRW_DATA *) &evt_data); 542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_process_frame_error 550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process frame crc error 552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_t3t_process_frame_error (void) 557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR3 ("T3T frame error. state=%s cur_cmd=0x%02X (%s)", rw_t3t_state_str (rw_cb.tcb.t3t.rw_state), rw_cb.tcb.t3t.cur_cmd, rw_t3t_cmd_str (rw_cb.tcb.t3t.cur_cmd)); 560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else 561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR2 ("T3T frame error. state=0x%02X cur_cmd=0x%02X", rw_cb.tcb.t3t.rw_state, rw_cb.tcb.t3t.cur_cmd); 562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (defined (RW_STATS_INCLUDED) && (RW_STATS_INCLUDED == TRUE)) 565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Update stats */ 566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_main_update_crc_error_stats (); 567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* RW_STATS_INCLUDED */ 568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Process the error */ 570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_process_error (NFC_STATUS_MSG_CORRUPTED); 571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_to_lower 576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send command to lower layer 578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns status of the send 580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_t3t_send_to_lower (BT_HDR *p_msg) 583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (defined (RW_STATS_INCLUDED) && (RW_STATS_INCLUDED == TRUE)) 587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BOOLEAN is_retry; 588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Update stats */ 589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_main_update_tx_stats (p_msg->len, ((rw_cb.cur_retry==0) ? FALSE : TRUE)); 590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* RW_STATS_INCLUDED */ 591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Set NFC-F SoD field (payload len + 1) */ 593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->offset -= 1; /* Point to SoD field */ 594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_msg+1) + p_msg->offset; 595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, (p_msg->len+1)); 596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->len += 1; /* Increment len to include SoD */ 597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE) 599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project DispT3TagMessage (p_msg, FALSE); 600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_SendData (NFC_RF_CONN_ID, p_msg)); 603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_get_cmd_buf 608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Get a buffer for sending T3T messages 610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns BT_HDR * 612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBT_HDR *rw_t3t_get_cmd_buf (void) 615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd_buf; 617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_cmd_buf = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID)) != NULL) 619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Reserve offset for NCI_DATA_HDR and NFC-F Sod (LEN) field */ 621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd_buf->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE + 1; 622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd_buf->len = 0; 623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (p_cmd_buf); 626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_cmd 631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send command to tag, and start timer for response 633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 637818b56eda129e0370afe6bcb808b0ed55c898d13Sherry SmithtNFC_STATUS rw_t3t_send_cmd (tRW_T3T_CB *p_cb, UINT8 rw_t3t_cmd, BT_HDR *p_cmd_buf, UINT32 timeout_ticks) 638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS retval; 640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Indicate first attempt to send command, back up cmd buffer in case needed for retransmission */ 642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_cb.cur_retry = 0; 643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_cb->p_cur_cmd_buf, p_cmd_buf, sizeof (BT_HDR) + p_cmd_buf->offset + p_cmd_buf->len); 644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->cur_cmd = rw_t3t_cmd; 646818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith p_cb->cur_tout = timeout_ticks; 647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING; 648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((retval = rw_t3t_send_to_lower (p_cmd_buf)) == NFC_STATUS_OK) 650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Start timer for waiting for response */ 652818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith nfc_start_quick_timer (&p_cb->timer, NFC_TTYPE_RW_T3T_RESPONSE, timeout_ticks); 653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Error sending */ 657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_IDLE; 658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 660818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith RW_TRACE_DEBUG3 ("rw_t3t_send_cmd: cur_tout: %d, timeout_ticks: %d ret:%d",p_cb->cur_tout, timeout_ticks, retval); 661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (retval); 662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_update_ndef_attribute_cmd 667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send UPDATE command for Attribute Information 669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_t3t_send_update_ndef_attribute_cmd (tRW_T3T_CB *p_cb, BOOLEAN write_in_progress) 674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS retval = NFC_STATUS_OK; 676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd_buf; 677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_cmd_start, *p; 678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 checksum, i; 679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 write_f; 680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 ln; 681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_ndef_attr_info_start; 682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_cmd_buf = rw_t3t_get_cmd_buf ()) != NULL) 684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Construct T3T message */ 686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = p_cmd_start = (UINT8 *) (p_cmd_buf+1) + p_cmd_buf->offset; 687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add UPDATE opcode to message */ 689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, T3T_MSG_OPC_UPDATE_CMD); 690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add IDm to message */ 692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY_TO_STREAM (p, p_cb->peer_nfcid2, NCI_NFCID2_LEN); 693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add Service code list */ 695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, 1); /* Number of services (only 1 service: NDEF) */ 696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_STREAM (p, T3T_MSG_NDEF_SC_RW); /* Service code (little-endian format) */ 697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add number of blocks in this UPDATE command */ 699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, 1); /* Number of blocks to write in this command */ 700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Block List element: the NDEF attribute information block (block 0) */ 702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT); 703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, 0); 704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add payload (Attribute information block) */ 706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_ndef_attr_info_start = p; /* Save start of a NDEF attribute info block for checksum */ 707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, T3T_MSG_NDEF_VERSION); 708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, p_cb->ndef_attrib.nbr); 709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, p_cb->ndef_attrib.nbw); 710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, p_cb->ndef_attrib.nmaxb); 711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32_TO_STREAM (p, 0); 712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If starting NDEF write: set WriteF=ON, and ln=current ndef length */ 714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (write_in_progress) 715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project write_f = T3T_MSG_NDEF_WRITEF_ON; 717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ln = p_cb->ndef_attrib.ln; 718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If finishing NDEF write: set WriteF=OFF, and ln=new ndef len */ 720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project write_f = T3T_MSG_NDEF_WRITEF_OFF; 723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ln = p_cb->ndef_msg_len; 724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, write_f); 726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, p_cb->ndef_attrib.rwflag); 727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, (ln>>16) & 0xFF); /* High byte (of 3) of Ln */ 728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, (ln>>8) & 0xFF); /* Middle byte (of 3) of Ln */ 729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, (ln) & 0xFF); /* Low byte (of 3) of Ln */ 730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Calculate and append Checksum */ 732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project checksum = 0; 733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (i = 0; i < T3T_MSG_NDEF_ATTR_INFO_SIZE; i++) 734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project checksum+=p_ndef_attr_info_start[i]; 736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, checksum); 738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Calculate length of message */ 741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd_buf->len = (UINT16) (p - p_cmd_start); 742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send the T3T message */ 744818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith retval = rw_t3t_send_cmd (p_cb, RW_T3T_CMD_UPDATE_NDEF, p_cmd_buf, rw_t3t_update_timeout(1)); 745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project retval = NFC_STATUS_NO_BUFFERS; 749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (retval); 752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_next_ndef_update_cmd 757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send next segment of NDEF message to update 759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_t3t_send_next_ndef_update_cmd (tRW_T3T_CB *p_cb) 764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS retval = NFC_STATUS_OK; 766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 block_id; 767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 first_block_to_write; 768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 ndef_blocks_to_write, ndef_blocks_remaining; 769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 ndef_bytes_remaining, ndef_padding = 0; 770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 flags = 0; 771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_cur_ndef_src_offset; 772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd_buf; 773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_cmd_start, *p; 774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 blocks_per_update; 775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 timeout; 776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_cmd_buf = rw_t3t_get_cmd_buf ()) != NULL) 778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Construct T3T message */ 780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = p_cmd_start = (UINT8 *) (p_cmd_buf + 1) + p_cmd_buf->offset; 781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Calculate number of ndef bytes remaining to write */ 783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_bytes_remaining = p_cb->ndef_msg_len - p_cb->ndef_msg_bytes_sent; 784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Calculate number of blocks remaining to write */ 786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_blocks_remaining = (UINT16) ((ndef_bytes_remaining+15) >> 4); /* ndef blocks remaining (rounded upward) */ 787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Calculate first NDEF block ID for this UPDATE command */ 789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project first_block_to_write = (UINT16) ((p_cb->ndef_msg_bytes_sent >> 4) + 1); 790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Calculate max number of blocks per write. */ 792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((first_block_to_write + RW_T3T_MAX_NDEF_BLOCKS_PER_UPDATE_1_BYTE_FORMAT) < 0x100) 793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* All block-numbers are < 0x100 (i.e. can be specified using one-byte format) */ 795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project blocks_per_update = RW_T3T_MAX_NDEF_BLOCKS_PER_UPDATE_1_BYTE_FORMAT; 796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Block-numbers are >= 0x100 (i.e. need to be specified using two-byte format) */ 800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project blocks_per_update = RW_T3T_MAX_NDEF_BLOCKS_PER_UPDATE_2_BYTE_FORMAT; 801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if blocks_per_update is bigger than what peer allows */ 804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (blocks_per_update > p_cb->ndef_attrib.nbw) 805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project blocks_per_update = p_cb->ndef_attrib.nbw; 806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if remaining blocks can fit into one UPDATE command */ 808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ndef_blocks_remaining <= blocks_per_update) 809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* remaining blocks can fit into one UPDATE command */ 811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_blocks_to_write = ndef_blocks_remaining; 812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Remaining blocks cannot fit into one UPDATE command */ 816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_blocks_to_write = blocks_per_update; 817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Write to command header for UPDATE */ 821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add UPDATE opcode to message */ 823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, T3T_MSG_OPC_UPDATE_CMD); 824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add IDm to message */ 826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY_TO_STREAM (p, p_cb->peer_nfcid2, NCI_NFCID2_LEN); 827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add Service code list */ 829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, 1); /* Number of services (only 1 service: NDEF) */ 830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_STREAM (p, T3T_MSG_NDEF_SC_RW); /* Service code (little-endian format) */ 831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add number of blocks in this UPDATE command */ 834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, ndef_blocks_to_write); /* Number of blocks to write in this command */ 835818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith timeout = rw_t3t_update_timeout(ndef_blocks_to_write); 836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (block_id = first_block_to_write; block_id < (first_block_to_write + ndef_blocks_to_write); block_id++) 838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (block_id<256) 840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Block IDs 0-255 can be specified in '2-byte' format: byte0=0, byte1=blocknumber */ 842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT); /* byte0: len=1; access-mode=0; service code list order=0 */ 843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, block_id); /* byte1: block number */ 844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Block IDs 256+ must be specified in '3-byte' format: byte0=80h, followed by blocknumber */ 848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, 0x00); /* byte0: len=0; access-mode=0; service code list order=0 */ 849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_STREAM (p, block_id); /* byte1-2: block number in little-endian format */ 850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add NDEF payload */ 855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If this sending last block of NDEF, check if padding is needed to make payload a multiple of 16 bytes */ 857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ndef_blocks_to_write == ndef_blocks_remaining) 858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_padding = (16 - (ndef_bytes_remaining & 0x0F)) & 0x0F; 860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ndef_padding) 861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project flags |= RW_T3T_FL_PADDING; 863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_blocks_to_write--; /* handle the last block separately if it needs padding */ 864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add NDEF payload to the message */ 868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cur_ndef_src_offset = &p_cb->ndef_msg[p_cb->ndef_msg_bytes_sent]; 869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY_TO_STREAM (p, p_cur_ndef_src_offset, (ndef_blocks_to_write * 16)); 872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_msg_bytes_sent += ((UINT32) ndef_blocks_to_write * 16); 873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (flags & RW_T3T_FL_PADDING) 875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add last of the NDEF message */ 877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cur_ndef_src_offset = &p_cb->ndef_msg[p_cb->ndef_msg_bytes_sent]; 878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY_TO_STREAM (p, p_cur_ndef_src_offset, (int) (16-ndef_padding)); 879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_msg_bytes_sent += (16-ndef_padding); 880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add padding */ 882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memset (p, 0, ndef_padding); 883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p+=ndef_padding; 884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Calculate length of message */ 887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd_buf->len = (UINT16) (p - p_cmd_start); 888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send the T3T message */ 890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project retval = rw_t3t_send_cmd (p_cb, RW_T3T_CMD_UPDATE_NDEF, p_cmd_buf, timeout); 891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project retval = NFC_STATUS_NO_BUFFERS; 895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (retval); 898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_next_ndef_check_cmd 905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send command for reading next segment of NDEF message 907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_t3t_send_next_ndef_check_cmd (tRW_T3T_CB *p_cb) 912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS retval = NFC_STATUS_OK; 914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 block_id; 915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 ndef_blocks_remaining, first_block_to_read, cur_blocks_to_read; 916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 ndef_bytes_remaining; 917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd_buf; 918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_cmd_start, *p; 919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_cmd_buf = rw_t3t_get_cmd_buf ()) != NULL) 921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Construct T3T message */ 923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = p_cmd_start = (UINT8 *) (p_cmd_buf+1) + p_cmd_buf->offset; 924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Calculate number of ndef bytes remaining to read */ 926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_bytes_remaining = p_cb->ndef_attrib.ln - p_cb->ndef_rx_offset; 927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Calculate number of blocks remaining to read */ 929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_blocks_remaining = (UINT16) ((ndef_bytes_remaining+15) >> 4); /* ndef blocks remaining (rounded upward) */ 930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Calculate first NDEF block ID */ 932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project first_block_to_read = (UINT16) ((p_cb->ndef_rx_offset >> 4) + 1); 933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if remaining blocks can fit into one CHECK command */ 935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ndef_blocks_remaining <= p_cb->ndef_attrib.nbr) 936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* remaining blocks can fit into one CHECK command */ 938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project cur_blocks_to_read = ndef_blocks_remaining; 939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_rx_readlen = ndef_bytes_remaining; 940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags |= RW_T3T_FL_IS_FINAL_NDEF_SEGMENT; 941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Remaining blocks cannot fit into one CHECK command */ 945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project cur_blocks_to_read = p_cb->ndef_attrib.nbr; /* Read maximum number of blocks allowed by the peer */ 946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_rx_readlen = ((UINT32) p_cb->ndef_attrib.nbr * 16); 947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG3 ("rw_t3t_send_next_ndef_check_cmd: bytes_remaining: %i, cur_blocks_to_read: %i, is_final: %i", 950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ndef_bytes_remaining, cur_blocks_to_read, (p_cb->flags & RW_T3T_FL_IS_FINAL_NDEF_SEGMENT)); 951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 952818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith /* Add CHECK opcode to message */ 953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, T3T_MSG_OPC_CHECK_CMD); 954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add IDm to message */ 956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY_TO_STREAM (p, p_cb->peer_nfcid2, NCI_NFCID2_LEN); 957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add Service code list */ 959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, 1); /* Number of services (only 1 service: NDEF) */ 960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Service code (little-endian format) . If NDEF is read-only, then use T3T_MSG_NDEF_SC_RO, otherwise use T3T_MSG_NDEF_SC_RW */ 962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->ndef_attrib.rwflag == T3T_MSG_NDEF_RWFLAG_RO) 963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_STREAM (p, T3T_MSG_NDEF_SC_RO); 965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_STREAM (p, T3T_MSG_NDEF_SC_RW); 969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 971818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith /* Add number of blocks in this CHECK command */ 972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, cur_blocks_to_read); /* Number of blocks to check in this command */ 973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (block_id = first_block_to_read; block_id < (first_block_to_read + cur_blocks_to_read); block_id++) 975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (block_id<256) 977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Block IDs 0-255 can be specified in '2-byte' format: byte0=0, byte1=blocknumber */ 979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT); /* byte1: len=0; access-mode=0; service code list order=0 */ 980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, block_id); /* byte1: block number */ 981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Block IDs 256+ must be specified in '3-byte' format: byte0=80h, followed by blocknumber */ 985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, 0x00); /* byte0: len=1; access-mode=0; service code list order=0 */ 986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_STREAM (p, block_id); /* byte1-2: block number in little-endian format */ 987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Calculate length of message */ 992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd_buf->len = (UINT16) (p - p_cmd_start); 993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send the T3T message */ 995818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith retval = rw_t3t_send_cmd (p_cb, RW_T3T_CMD_CHECK_NDEF, p_cmd_buf, rw_t3t_check_timeout (cur_blocks_to_read)); 996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project retval = NFC_STATUS_NO_BUFFERS; 1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return(retval); 1003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_message_set_block_list 1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Add block list to T3T message 1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Number of bytes added to message 1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 1015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_t3t_message_set_block_list (tRW_T3T_CB *p_cb, UINT8 **p, UINT8 num_blocks, tT3T_BLOCK_DESC *p_t3t_blocks) 1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 i, cur_service_code; 1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 service_code_idx, num_services = 0; 1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_msg_num_services; 1020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 service_list[T3T_MSG_SERVICE_LIST_MAX]; 1021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add CHECK or UPDATE opcode to message */ 1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM ((*p), ((p_cb->cur_cmd == RW_T3T_CMD_CHECK) ? T3T_MSG_OPC_CHECK_CMD:T3T_MSG_OPC_UPDATE_CMD)); 1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add IDm to message */ 1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY_TO_STREAM ((*p), p_cb->peer_nfcid2, NCI_NFCID2_LEN); 1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Skip over Number of Services field */ 1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg_num_services = (*p); /* pointer to Number of Services offset */ 1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p)++; 1031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Count number of different services are specified in the list, and add services to Service Code list */ 1033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (i = 0; i < num_blocks; i++) 1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project cur_service_code = p_t3t_blocks[i].service_code; 1036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if current service_code is already in the service_list */ 1038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (service_code_idx=0; service_code_idx<num_services; service_code_idx++) 1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (service_list[service_code_idx] == cur_service_code) 1041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (service_code_idx == num_services) 1045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Service not in the list yet. Add it. */ 1047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project service_list[service_code_idx] = cur_service_code; 1048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_services++; 1049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add service code to T3T message */ 1051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_STREAM ((*p), cur_service_code); 1052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add 'Number of Sservices' to the message */ 1056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_msg_num_services = num_services; 1057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add 'number of blocks' to the message */ 1059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM ((*p), num_blocks); 1060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add block descriptors */ 1062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (i = 0; i < num_blocks; i++) 1063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project cur_service_code = p_t3t_blocks[i].service_code; 1065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if current service_code is already in the service_list */ 1067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (service_code_idx=0; service_code_idx<num_services; service_code_idx++) 1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (service_list[service_code_idx] == cur_service_code) 1070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add decriptor to T3T message */ 1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t3t_blocks[i].block_number > 0xFF) 1075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM ((*p), service_code_idx); 1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_STREAM ((*p), p_t3t_blocks[i].block_number); 1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project service_code_idx |= T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT; 1082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM ((*p), service_code_idx); 1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM ((*p), p_t3t_blocks[i].block_number); 1084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_check_cmd 1091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send CHECK command 1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_t3t_send_check_cmd (tRW_T3T_CB *p_cb, UINT8 num_blocks, tT3T_BLOCK_DESC *p_t3t_blocks) 1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd_buf; 1100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p, *p_cmd_start; 1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS retval = NFC_STATUS_OK; 1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->cur_cmd = RW_T3T_CMD_CHECK; 1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_cmd_buf = rw_t3t_get_cmd_buf ()) != NULL) 1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Construct T3T message */ 1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = p_cmd_start = (UINT8 *) (p_cmd_buf+1) + p_cmd_buf->offset; 1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_message_set_block_list (p_cb, &p, num_blocks, p_t3t_blocks); 1109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Calculate length of message */ 1111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd_buf->len = (UINT16) (p - p_cmd_start); 1112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send the T3T message */ 1114818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith retval = rw_t3t_send_cmd (p_cb, RW_T3T_CMD_CHECK, p_cmd_buf, rw_t3t_check_timeout(num_blocks)); 1115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project retval = NFC_STATUS_NO_BUFFERS; 1119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return(retval); 1122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_update_cmd 1127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send UPDATE command 1129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 1133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_t3t_send_update_cmd (tRW_T3T_CB *p_cb, UINT8 num_blocks, tT3T_BLOCK_DESC *p_t3t_blocks, UINT8 *p_data) 1134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd_buf; 1136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p, *p_cmd_start; 1137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS retval = NFC_STATUS_OK; 1138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->cur_cmd = RW_T3T_CMD_UPDATE; 1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_cmd_buf = rw_t3t_get_cmd_buf ()) != NULL) 1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Construct T3T message */ 1143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = p_cmd_start = (UINT8 *) (p_cmd_buf+1) + p_cmd_buf->offset; 1144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_message_set_block_list (p_cb, &p, num_blocks, p_t3t_blocks); 1145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add data blocks to the message */ 1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY_TO_STREAM (p, p_data, num_blocks*16); 1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Calculate length of message */ 1150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd_buf->len = (UINT16) (p - p_cmd_start); 1151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send the T3T message */ 1153818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith retval = rw_t3t_send_cmd (p_cb, RW_T3T_CMD_UPDATE, p_cmd_buf, rw_t3t_update_timeout(num_blocks)); 1154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project retval = NFC_STATUS_NO_BUFFERS; 1158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return(retval); 1161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 11655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function rw_t3t_check_mc_block 11665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 11675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description Send command to check Memory Configuration Block 11685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 11695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns tNFC_STATUS 11705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 11715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*****************************************************************************/ 11725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn CoenentNFC_STATUS rw_t3t_check_mc_block (tRW_T3T_CB *p_cb) 11735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{ 11745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen BT_HDR *p_cmd_buf; 11755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 *p, *p_cmd_start; 11765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 11775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Read Memory Configuration block */ 11785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if ((p_cmd_buf = rw_t3t_get_cmd_buf ()) != NULL) 11795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 11805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Construct T3T message */ 11815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p = p_cmd_start = (UINT8 *) (p_cmd_buf+1) + p_cmd_buf->offset; 11825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 11835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Add CHECK opcode to message */ 11845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8_TO_STREAM (p, T3T_MSG_OPC_CHECK_CMD); 11855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 11865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Add IDm to message */ 11875c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ARRAY_TO_STREAM (p, p_cb->peer_nfcid2, NCI_NFCID2_LEN); 11885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 11895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Add Service code list */ 11905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8_TO_STREAM (p, 1); /* Number of services (only 1 service: NDEF) */ 11915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT16_TO_STREAM (p, T3T_MSG_NDEF_SC_RO); /* Service code (little-endian format) */ 11925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 11935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Number of blocks */ 11945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8_TO_STREAM (p, 1); /* Number of blocks (only 1 block: Memory Configuration Information ) */ 11955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 11965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Block List element: the Memory Configuration block (block 0x88) */ 11975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8_TO_STREAM (p, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT); 11985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8_TO_STREAM (p, T3T_MSG_FELICALITE_BLOCK_ID_MC); 11995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 12005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Calculate length of message */ 12015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cmd_buf->len = (UINT16) (p - p_cmd_start); 12025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 12035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Send the T3T message */ 1204818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith return rw_t3t_send_cmd (p_cb, p_cb->cur_cmd, p_cmd_buf, rw_t3t_check_timeout(1)); 12055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 12065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else 12075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 12085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_TRACE_ERROR0 ("Unable to allocate buffer to read MC block"); 12095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return (NFC_STATUS_NO_BUFFERS); 12105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 12115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 12125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 12135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/***************************************************************************** 12145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 1215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_raw_frame 1216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send raw frame 1218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 1222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_t3t_send_raw_frame (tRW_T3T_CB *p_cb, UINT16 len, UINT8 *p_data) 1223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd_buf; 1225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 1226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS retval = NFC_STATUS_OK; 1227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_cmd_buf = rw_t3t_get_cmd_buf ()) != NULL) 1229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Construct T3T message */ 1231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_cmd_buf+1) + p_cmd_buf->offset; 1232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add data blocks to the message */ 1234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY_TO_STREAM (p, p_data, len); 1235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Calculate length of message */ 1237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd_buf->len = len; 1238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send the T3T message */ 1240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project retval = rw_t3t_send_cmd (p_cb, RW_T3T_CMD_SEND_RAW_FRAME, p_cmd_buf, RW_T3T_RAW_FRAME_CMD_TIMEOUT_TICKS); 1241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project retval = NFC_STATUS_NO_BUFFERS; 1245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (retval); 1248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** TAG RESPONSE HANDLERS 1253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 1254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_act_handle_ndef_detect_rsp 1259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to NDEF detection 1261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 1265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_t3t_act_handle_ndef_detect_rsp (tRW_T3T_CB *p_cb, BT_HDR *p_msg_rsp) 1266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 1268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 temp; 1269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 i; 1270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 checksum_calc, checksum_rx; 1271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DETECT_NDEF_DATA evt_data; 1272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_t3t_rsp = (UINT8 *) (p_msg_rsp+1) + p_msg_rsp->offset; 1273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_FAILED; 1275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.flags = RW_NDEF_FL_UNKNOWN; 1276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if response code is CHECK resp (for reading NDEF attribute block) */ 1278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) 1279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR2 ("Response error: expecting rsp_code %02X, but got %02X", T3T_MSG_OPC_CHECK_RSP, p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]); 1281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_FAILED; 1282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Validate status code and NFCID2 response from tag */ 1284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ( (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK) /* verify response status code */ 1285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(memcmp (p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM], NCI_NFCID2_LEN) != 0) ) /* verify response IDm */ 1286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_FAILED; 1288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Get checksum from received ndef attribute msg */ 1292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = &p_t3t_rsp[T3T_MSG_RSP_OFFSET_CHECK_DATA+T3T_MSG_NDEF_ATTR_INFO_SIZE]; 1293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (checksum_rx, p); 1294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Calculate checksum - move check for checsum to beginning */ 1296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project checksum_calc = 0; 1297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = &p_t3t_rsp[T3T_MSG_RSP_OFFSET_CHECK_DATA]; 1298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (i = 0; i < T3T_MSG_NDEF_ATTR_INFO_SIZE; i++) 1299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project checksum_calc+=p[i]; 1301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Validate checksum */ 1304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (checksum_calc != checksum_rx) 1305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_attrib.status = NFC_STATUS_FAILED; /* only ok or failed passed to the app. can be boolean*/ 1307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("RW_T3tDetectNDEF checksum failed"); 1309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_attrib.status = NFC_STATUS_OK; 1313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Validate version number */ 1315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project STREAM_TO_UINT8 (p_cb->ndef_attrib.version, p); 1316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (T3T_GET_MAJOR_VERSION (T3T_MSG_NDEF_VERSION) < T3T_GET_MAJOR_VERSION (p_cb->ndef_attrib.version)) 1318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Remote tag's MajorVer is newer than our's. Reject NDEF as per T3TOP RQ_T3T_NDA_024 */ 1320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR2 ("RW_T3tDetectNDEF: incompatible NDEF version. Local=0x%02x, Remote=0x%02x", T3T_MSG_NDEF_VERSION, p_cb->ndef_attrib.version); 1321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_attrib.status = NFC_STATUS_FAILED; 1322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_BAD_RESP; 1323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Remote tag's MajorVer is equal or older than our's. NDEF is compatible with our version. */ 1327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Update NDEF info */ 1329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project STREAM_TO_UINT8 (p_cb->ndef_attrib.nbr, p); /* NBr: number of blocks that can be read using one Check command */ 1330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project STREAM_TO_UINT8 (p_cb->ndef_attrib.nbw, p); /* Nbw: number of blocks that can be written using one Update command */ 1331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (p_cb->ndef_attrib.nmaxb, p); /* Nmaxb: maximum number of blocks available for NDEF data */ 1332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT32 (temp, p); 1333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project STREAM_TO_UINT8 (p_cb->ndef_attrib.writef, p); /* WriteFlag: 00h if writing data finished; 0Fh if writing data in progress */ 1334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project STREAM_TO_UINT8 (p_cb->ndef_attrib.rwflag, p); /* RWFlag: 00h NDEF is read-only; 01h if read/write available */ 1335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Get length (3-byte, big-endian) */ 1337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project STREAM_TO_UINT8 (temp, p); /* Ln: high-byte */ 1338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (p_cb->ndef_attrib.ln, p); /* Ln: lo-word */ 1339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_attrib.ln += (temp << 16); 1340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("Detected NDEF Ver: 0x%02x", p_cb->ndef_attrib.version); 1343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG6 ("Detected NDEF Attributes: Nbr=%i, Nbw=%i, Nmaxb=%i, WriteF=%i, RWFlag=%i, Ln=%i", 1344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_attrib.nbr, 1345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_attrib.nbw, 1346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_attrib.nmaxb, 1347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_attrib.writef, 1348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_attrib.rwflag, 1349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_attrib.ln); 1350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Set data for RW_T3T_NDEF_DETECT_EVT */ 1352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = p_cb->ndef_attrib.status; 1353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.cur_size = p_cb->ndef_attrib.ln; 1354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.max_size = (UINT32) p_cb->ndef_attrib.nmaxb * 16; 1355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.protocol = NFC_PROTOCOL_T3T; 1356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.flags = (RW_NDEF_FL_SUPPORTED | RW_NDEF_FL_FORMATED); 1357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->ndef_attrib.rwflag == T3T_MSG_NDEF_RWFLAG_RO) 1358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.flags |= RW_NDEF_FL_READ_ONLY; 1359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("RW_T3tDetectNDEF response: %i", evt_data.status); 1364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_IDLE; 1366a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu rw_t3t_update_ndef_flag (&evt_data.flags); 1367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Notify app of NDEF detection result */ 1368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T3T_NDEF_DETECT_EVT, (tRW_DATA *) &evt_data); 1369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_msg_rsp); 1371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_act_handle_check_rsp 1377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to CHECK command 1379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 1383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_t3t_act_handle_check_rsp (tRW_T3T_CB *p_cb, BT_HDR *p_msg_rsp) 1384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_t3t_rsp = (UINT8 *) (p_msg_rsp+1) + p_msg_rsp->offset; 1386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_READ_DATA evt_data; 1387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS nfc_status = NFC_STATUS_OK; 1388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Validate response from tag */ 1390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK) /* verify response status code */ 1391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(memcmp (p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM], NCI_NFCID2_LEN) != 0) ) /* verify response IDm */ 1392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_status = NFC_STATUS_FAILED; 1394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_msg_rsp); 1395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) 1397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR2 ("Response error: expecting rsp_code %02X, but got %02X", T3T_MSG_OPC_CHECK_RSP, p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]); 1399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_status = NFC_STATUS_FAILED; 1400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_msg_rsp); 1401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Copy incoming data into buffer */ 1405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg_rsp->offset += T3T_MSG_RSP_OFFSET_CHECK_DATA; /* Skip over t3t header */ 1406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg_rsp->len -= T3T_MSG_RSP_OFFSET_CHECK_DATA; 1407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_OK; 1408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.p_data = p_msg_rsp; 1409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T3T_CHECK_EVT, (tRW_DATA *) &evt_data); 1410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_IDLE; 1414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T3T_CHECK_CPLT_EVT, (tRW_DATA *) &nfc_status); 1416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_act_handle_update_rsp 1421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to UPDATE command 1423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 1427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_t3t_act_handle_update_rsp (tRW_T3T_CB *p_cb, BT_HDR *p_msg_rsp) 1428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_t3t_rsp = (UINT8 *) (p_msg_rsp+1) + p_msg_rsp->offset; 1430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_READ_DATA evt_data; 1431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Validate response from tag */ 1433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK) /* verify response status code */ 1434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(memcmp (p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM], NCI_NFCID2_LEN) != 0) ) /* verify response IDm */ 1435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_FAILED; 1437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) 1439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR2 ("Response error: expecting rsp_code %02X, but got %02X", T3T_MSG_OPC_UPDATE_RSP, p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]); 1441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_FAILED; 1442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Copy incoming data into buffer */ 1446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_OK; 1447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_IDLE; 1450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T3T_UPDATE_CPLT_EVT, (tRW_DATA *)&evt_data); 1452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_msg_rsp); 1454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_act_handle_raw_senddata_rsp 1459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to NDEF detection 1461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 1465a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chuvoid rw_t3t_act_handle_raw_senddata_rsp (tRW_T3T_CB *p_cb, tNFC_DATA_CEVT *p_data) 1466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_READ_DATA evt_data; 1468a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu BT_HDR *p_pkt = p_data->p_data; 1469a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 1470a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#if (BT_TRACE_VERBOSE == TRUE) 1471a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu RW_TRACE_DEBUG2 ("RW T3T Raw Frame: Len [0x%X] Status [%s]", p_pkt->len, NFC_GetStatusName (p_data->status)); 1472a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#else 1473a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu RW_TRACE_DEBUG2 ("RW T3T Raw Frame: Len [0x%X] Status [0x%X]", p_pkt->len, p_data->status); 1474a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#endif 1475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Copy incoming data into buffer */ 1477a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu evt_data.status = p_data->status; 1478a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu evt_data.p_data = p_pkt; 1479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_IDLE; 1481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T3T_RAW_FRAME_EVT, (tRW_DATA *) &evt_data); 1483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_act_handle_check_ndef_rsp 1488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to NDEF read segment 1490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 1494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_t3t_act_handle_check_ndef_rsp (tRW_T3T_CB *p_cb, BT_HDR *p_msg_rsp) 1495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BOOLEAN check_complete = TRUE; 1497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS nfc_status = NFC_STATUS_OK; 1498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_READ_DATA read_data; 1499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA evt_data; 1500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_t3t_rsp = (UINT8 *) (p_msg_rsp+1) + p_msg_rsp->offset; 1501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 rsp_num_bytes_rx; 1502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Validate response from tag */ 1504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK) /* verify response status code */ 1505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(memcmp (p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM], NCI_NFCID2_LEN) != 0) /* verify response IDm */ 1506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_t3t_rsp[T3T_MSG_RSP_OFFSET_NUMBLOCKS] != ((p_cb->ndef_rx_readlen+15) >> 4)) ) /* verify length of response */ 1507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR2 ("Response error: bad status, nfcid2, or invalid len: %i %i", p_t3t_rsp[T3T_MSG_RSP_OFFSET_NUMBLOCKS], ((p_cb->ndef_rx_readlen+15)>>4)); 1509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_status = NFC_STATUS_FAILED; 1510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_msg_rsp); 1511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) 1513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR2 ("Response error: expecting rsp_code %02X, but got %02X", T3T_MSG_OPC_CHECK_RSP, p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]); 1515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_status = NFC_STATUS_FAILED; 1516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_msg_rsp); 1517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Notify app of NDEF segment received */ 1521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rsp_num_bytes_rx = p_t3t_rsp[T3T_MSG_RSP_OFFSET_NUMBLOCKS] * 16; /* Number of bytes received, according to header */ 1522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_rx_offset += p_cb->ndef_rx_readlen; 1523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project read_data.status = NFC_STATUS_OK; 1524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg_rsp->offset += T3T_MSG_RSP_OFFSET_CHECK_DATA; /* Skip over t3t header (point to block data) */ 1525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg_rsp->len -= T3T_MSG_RSP_OFFSET_CHECK_DATA; 1526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Verify that the bytes received is really the amount indicated in the check-response header */ 1528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rsp_num_bytes_rx > p_msg_rsp->len) 1529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR2 ("Response error: CHECK rsp header indicates %i bytes, but only received %i bytes", rsp_num_bytes_rx, p_msg_rsp->len); 1531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_status = NFC_STATUS_FAILED; 1532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_msg_rsp); 1533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If this is the the final block, then set len to reflect only valid bytes (do not include padding to 16-byte boundary) */ 1537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_cb->flags & RW_T3T_FL_IS_FINAL_NDEF_SEGMENT) && (p_cb->ndef_attrib.ln & 0x000F)) 1538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rsp_num_bytes_rx -= (16 - (p_cb->ndef_attrib.ln & 0x000F)); 1540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg_rsp->len = rsp_num_bytes_rx; 1543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project read_data.p_data = p_msg_rsp; 1544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T3T_CHECK_EVT, (tRW_DATA *) &read_data); 1545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send CHECK cmd for next NDEF segment, if needed */ 1547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!(p_cb->flags & RW_T3T_FL_IS_FINAL_NDEF_SEGMENT)) 1548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((nfc_status = rw_t3t_send_next_ndef_check_cmd (p_cb)) == NFC_STATUS_OK) 1550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Still getting more segments. Don't send RW_T3T_CHECK_CPLT_EVT yet */ 1552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project check_complete = FALSE; 1553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Notify app of RW_T3T_CHECK_CPLT_EVT if entire NDEF has been read, or if failure */ 1559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (check_complete) 1560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_IDLE; 1562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = nfc_status; 1563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T3T_CHECK_CPLT_EVT, (tRW_DATA *) &evt_data); 1564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_act_handle_update_ndef_rsp 1571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to NDEF write segment 1573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 1577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_t3t_act_handle_update_ndef_rsp (tRW_T3T_CB *p_cb, BT_HDR *p_msg_rsp) 1578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BOOLEAN update_complete = TRUE; 1580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS nfc_status = NFC_STATUS_OK; 1581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA evt_data; 1582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_t3t_rsp = (UINT8 *) (p_msg_rsp+1) + p_msg_rsp->offset; 1583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check nfcid2 and status of response */ 1585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK) /* verify response status code */ 1586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(memcmp (p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM], NCI_NFCID2_LEN) != 0) ) /* verify response IDm */ 1587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_status = NFC_STATUS_FAILED; 1589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Validate response opcode */ 1591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) 1592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR2 ("Response error: expecting rsp_code %02X, but got %02X", T3T_MSG_OPC_UPDATE_RSP, p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]); 1594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_status = NFC_STATUS_FAILED; 1595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If this is response to final UPDATE, then update NDEF local size */ 1597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cb->flags & RW_T3T_FL_IS_FINAL_NDEF_SEGMENT) 1598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If successful, update current NDEF size */ 1600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_attrib.ln = p_cb->ndef_msg_len; 1601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If any more NDEF bytes to update, then send next UPDATE command */ 1603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cb->ndef_msg_bytes_sent < p_cb->ndef_msg_len) 1604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send UPDATE command for next segment of NDEF */ 1606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((nfc_status = rw_t3t_send_next_ndef_update_cmd (p_cb)) == NFC_STATUS_OK) 1607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Wait for update response */ 1609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project update_complete = FALSE; 1610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Otherwise, no more NDEF bytes. Send final UPDATE for Attribute Information block */ 1613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags |= RW_T3T_FL_IS_FINAL_NDEF_SEGMENT; 1616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((nfc_status = rw_t3t_send_update_ndef_attribute_cmd (p_cb, FALSE)) == NFC_STATUS_OK) 1617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Wait for update response */ 1619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project update_complete = FALSE; 1620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If update is completed, then notify app */ 1624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (update_complete) 1625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_IDLE; 1627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = nfc_status; 1628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T3T_UPDATE_CPLT_EVT, (tRW_DATA *) &evt_data); 1629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_msg_rsp); 1633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 1635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_handle_get_sc_poll_rsp 1641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle POLL response for getting system codes 1643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 1647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t3t_handle_get_sc_poll_rsp (tRW_T3T_CB *p_cb, UINT8 nci_status, UINT8 num_responses, UINT8 sensf_res_buf_size, UINT8 *p_sensf_res_buf) 1648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd_buf; 1650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p, *p_cmd_start; 1651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 sc; 1652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status = NFC_STATUS_FAILED; 1653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If waiting for wildcard POLL */ 1655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->rw_substate == RW_T3T_GET_SC_SST_POLL_WILDCARD) 1656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Get the system code from the response */ 1658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (nci_status == NCI_STATUS_OK) 1659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(num_responses > 0) 1660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(sensf_res_buf_size >= (RW_T3T_SENSF_RES_RD_OFFSET + RW_T3T_SENSF_RES_RD_LEN)) ) 1661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = &p_sensf_res_buf[RW_T3T_SENSF_RES_RD_OFFSET]; 1663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (sc, p); 1664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Handle felica lite */ 1666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (sc == T3T_SYSTEM_CODE_FELICA_LITE) 1667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("FeliCa Lite tag detected (system code %04X)", sc); 1669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Store system code */ 1670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->system_codes[p_cb->num_system_codes++] = sc; 1671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Poll for NDEF system code */ 1673808ebf88b1d5fae4556abe1f50651ab0a8e75114The Android Open Source Project if ((status = (tNFC_STATUS) nci_snd_t3t_polling (T3T_SYSTEM_CODE_NDEF, 0, 0)) == NCI_STATUS_OK) 1674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_substate = RW_T3T_GET_SC_SST_POLL_NDEF; 1676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->cur_poll_rc = 0; 1677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags |= RW_T3T_FL_W4_GET_SC_POLL_RSP; 1678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* start timer for waiting for responses */ 1680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_start_poll_timer (p_cb); 1681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* All other types, send REQUEST_SYSTEM_CODE command */ 1686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_cmd_buf = rw_t3t_get_cmd_buf ()) != NULL) 1687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_substate = RW_T3T_GET_SC_SST_REQUEST_SC; 1689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Construct T3T message */ 1691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd_start = p = (UINT8 *) (p_cmd_buf+1) + p_cmd_buf->offset; 1692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, T3T_MSG_OPC_REQ_SYSTEMCODE_CMD); 1693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY_TO_STREAM (p, p_cb->peer_nfcid2, NCI_NFCID2_LEN); 1694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Fill in length field */ 1696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd_buf->len = (UINT16) (p - p_cmd_start); 1697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send the T3T message */ 1699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = rw_t3t_send_cmd (p_cb, RW_T3T_CMD_GET_SYSTEM_CODES, p_cmd_buf, RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS); 1700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Error proceeding. Notify upper layer of system codes found so far */ 1705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status != NFC_STATUS_OK) 1706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_handle_get_system_codes_cplt (); 1708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If waiting for NDEF POLL */ 1711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cb->rw_substate == RW_T3T_GET_SC_SST_POLL_NDEF) 1712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Validate response for NDEF poll */ 1714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((nci_status == NCI_STATUS_OK) && (num_responses > 0)) 1715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Tag responded for NDEF poll */ 1717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->system_codes[p_cb->num_system_codes++] = T3T_SYSTEM_CODE_NDEF; 1718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_handle_get_system_codes_cplt (); 1720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 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_t3t_handle_ndef_detect_poll_rsp 1726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle POLL response for getting system codes 1728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 1732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t3t_handle_ndef_detect_poll_rsp (tRW_T3T_CB *p_cb, UINT8 nci_status, UINT8 num_responses, UINT8 sensf_res_buf_size, UINT8 *p_sensf_res_buf) 1733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd_buf; 1735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p, *p_cmd_start; 1736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA evt_data; 1737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Validate response for NDEF poll */ 1739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((nci_status == NCI_STATUS_OK) && (num_responses > 0)) 1740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Tag responded for NDEF poll */ 1742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Read NDEF attribute block */ 1744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_cmd_buf = rw_t3t_get_cmd_buf ()) != NULL) 1745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Construct T3T message */ 1747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = p_cmd_start = (UINT8 *) (p_cmd_buf+1) + p_cmd_buf->offset; 1748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add CHECK opcode to message */ 1750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, T3T_MSG_OPC_CHECK_CMD); 1751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add IDm to message */ 1753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY_TO_STREAM (p, p_cb->peer_nfcid2, NCI_NFCID2_LEN); 1754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add Service code list */ 1756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, 1); /* Number of services (only 1 service: NDEF) */ 1757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_STREAM (p, T3T_MSG_NDEF_SC_RO); /* Service code (little-endian format) */ 1758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Number of blocks */ 1760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, 1); /* Number of blocks (only 1 block: NDEF Attribute Information ) */ 1761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Block List element: the NDEF attribute information block (block 0) */ 1763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT); 1764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, 0); 1765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Calculate length of message */ 1767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd_buf->len = (UINT16) (p - p_cmd_start); 1768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send the T3T message */ 1770818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith if ((evt_data.status = rw_t3t_send_cmd (p_cb, RW_T3T_CMD_DETECT_NDEF, p_cmd_buf, rw_t3t_check_timeout(1))) == NFC_STATUS_OK) 1771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* CHECK command sent. Wait for response */ 1773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 1774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nci_status = NFC_STATUS_FAILED; 1777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* NDEF detection failed */ 1780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_IDLE; 1781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.ndef.status = nci_status; 1782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.ndef.flags = RW_NDEF_FL_UNKNOWN; 1783a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu rw_t3t_update_ndef_flag (&evt_data.ndef.flags); 1784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*(rw_cb.p_cback)) (RW_T3T_NDEF_DETECT_EVT, &evt_data); 1785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_act_handle_get_sc_rsp 1791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response for getting system codes 1793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 1797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_t3t_act_handle_get_sc_rsp (tRW_T3T_CB *p_cb, BT_HDR *p_msg_rsp) 1798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_t3t_rsp = (UINT8 *) (p_msg_rsp+1) + p_msg_rsp->offset; 1800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 1801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 sc; 1802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 num_sc, i; 1803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Validate response opcode */ 1805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_REQ_SYSTEMCODE_RSP) 1806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR2 ("Response error: expecting rsp_code %02X, but got %02X", T3T_MSG_OPC_REQ_SYSTEMCODE_RSP, p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]); 1808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Point to number of systems parameter */ 1812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = &p_t3t_rsp[T3T_MSG_RSP_OFFSET_NUMSYS]; 1813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project STREAM_TO_UINT8 (num_sc, p); 1814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Validate maximum */ 1816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (num_sc>T3T_MAX_SYSTEM_CODES) 1817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG2 ("Tag's number of systems (%i) exceeds NFA max (%i)", num_sc, T3T_MAX_SYSTEM_CODES); 1819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_sc = T3T_MAX_SYSTEM_CODES; 1820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (i = 0; i < num_sc; i++) 1823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (sc, p); 1825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->system_codes[p_cb->num_system_codes++] = sc; 1826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_handle_get_system_codes_cplt (); 1829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_msg_rsp); 1831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_update_block 1836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 18375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description Send UPDATE command for single block 18385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** (for formatting/configuring read only) 1839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 1843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_t3t_update_block (tRW_T3T_CB *p_cb, UINT8 block_id, UINT8 *p_block_data) 1844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_dst, *p_cmd_start; 1846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_cmd_buf; 1847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS status; 1848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_cmd_buf = rw_t3t_get_cmd_buf ()) != NULL) 1850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_dst = p_cmd_start = (UINT8 *) (p_cmd_buf+1) + p_cmd_buf->offset; 1852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add UPDATE opcode to message */ 1854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p_dst, T3T_MSG_OPC_UPDATE_CMD); 1855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add IDm to message */ 1857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY_TO_STREAM (p_dst, p_cb->peer_nfcid2, NCI_NFCID2_LEN); 1858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add Service code list */ 1860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p_dst, 1); /* Number of services (only 1 service: NDEF) */ 1861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_STREAM (p_dst, T3T_MSG_NDEF_SC_RW); /* Service code (little-endian format) */ 1862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Number of blocks */ 1864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p_dst, 1); 1865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add Block list element for MC */ 1867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p_dst, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT); 1868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p_dst, block_id); 1869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Copy MC data to UPDATE message */ 1871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY_TO_STREAM (p_dst, p_block_data, T3T_MSG_BLOCKSIZE); 1872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Calculate length of message */ 1874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cmd_buf->len = (UINT16) (p_dst - p_cmd_start); 1875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send the T3T message */ 1877818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith status = rw_t3t_send_cmd (p_cb, p_cb->cur_cmd, p_cmd_buf, rw_t3t_update_timeout(1)); 1878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Unable to send UPDATE command */ 1882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = NFC_STATUS_NO_BUFFERS; 1883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (status); 1886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_handle_fmt_poll_rsp 1891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle POLL response for formatting felica-lite 1893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 1897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void rw_t3t_handle_fmt_poll_rsp (tRW_T3T_CB *p_cb, UINT8 nci_status, UINT8 num_responses, UINT8 sensf_res_buf_size, UINT8 *p_sensf_res_buf) 1898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA evt_data; 1900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_OK; 1902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Validate response for poll response */ 1904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((nci_status == NCI_STATUS_OK) && (num_responses > 0)) 1905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Tag responded for Felica-Lite poll */ 1907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Get MemoryControl block */ 1908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("Felica-Lite tag detected...getting Memory Control block."); 1909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 19105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->rw_substate = RW_T3T_FMT_SST_CHECK_MC_BLK; 1911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 19125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Send command to check Memory Configuration block */ 19135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen evt_data.status = rw_t3t_check_mc_block (p_cb); 1914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("Felica-Lite tag not detected"); 1918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_FAILED; 1919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If error, notify upper layer */ 1922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (evt_data.status != NFC_STATUS_OK) 1923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_format_cplt (evt_data.status); 1925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_act_handle_fmt_rsp 1931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response for formatting codes 1933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 1937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_t3t_act_handle_fmt_rsp (tRW_T3T_CB *p_cb, BT_HDR *p_msg_rsp) 1938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_t3t_rsp = (UINT8 *) (p_msg_rsp+1) + p_msg_rsp->offset; 1940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_mc; 1941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA evt_data; 1942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_OK; 1944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check tags's response for reading MemoryControl block */ 1946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->rw_substate == RW_T3T_FMT_SST_CHECK_MC_BLK) 1947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Validate response opcode */ 1949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) 1950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR2 ("Response error: expecting rsp_code %02X, but got %02X", T3T_MSG_OPC_CHECK_RSP, p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]); 1952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_FAILED; 1953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Validate status code and NFCID2 response from tag */ 1955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ( (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK) /* verify response status code */ 1956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(memcmp (p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM], NCI_NFCID2_LEN) != 0) ) /* verify response IDm */ 1957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_FAILED; 1959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if memory configuration (MC) block to see if SYS_OP=1 (NDEF enabled) */ 1963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_mc = &p_t3t_rsp[T3T_MSG_RSP_OFFSET_CHECK_DATA]; /* Point to MC data of CHECK response */ 1964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_mc[T3T_MSG_FELICALITE_MC_OFFSET_SYS_OP] != 0x01) 1966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Tag is not currently enabled for NDEF. Indicate that we need to update the MC block */ 1968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Set SYS_OP field to 0x01 (enable NDEF) */ 1970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_mc[T3T_MSG_FELICALITE_MC_OFFSET_SYS_OP] = 0x01; 1971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 19725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Set RF_PRM field to 0x07 (procedure of issuance) */ 19735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_mc[T3T_MSG_FELICALITE_MC_OFFSET_RF_PRM] = 0x07; 19745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 1975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Construct and send UPDATE message to write MC block */ 1976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_substate = RW_T3T_FMT_SST_UPDATE_MC_BLK; 1977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = rw_t3t_update_block (p_cb, T3T_MSG_FELICALITE_BLOCK_ID_MC, p_mc); 1978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* SYS_OP=1: ndef already enabled. Just need to update attribute information block */ 1982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_substate = RW_T3T_FMT_SST_UPDATE_NDEF_ATTRIB; 1983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = rw_t3t_update_block (p_cb, 0, (UINT8 *) rw_t3t_default_attrib_info); 1984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If error, notify upper layer */ 1988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (evt_data.status != NFC_STATUS_OK) 1989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_format_cplt (evt_data.status); 1991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cb->rw_substate == RW_T3T_FMT_SST_UPDATE_MC_BLK) 1994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Validate response opcode */ 1996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) 1997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK) ) 1998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR2 ("Response error: rsp_code=%02X, status=%02X", p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE], p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]); 2001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_FAILED; 2002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* SYS_OP=1: ndef already enabled. Just need to update attribute information block */ 2006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_substate = RW_T3T_FMT_SST_UPDATE_NDEF_ATTRIB; 2007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = rw_t3t_update_block (p_cb, 0, (UINT8 *) rw_t3t_default_attrib_info); 2008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If error, notify upper layer */ 2011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (evt_data.status != NFC_STATUS_OK) 2012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_format_cplt (evt_data.status); 2014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cb->rw_substate == RW_T3T_FMT_SST_UPDATE_NDEF_ATTRIB) 2017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Validate response opcode */ 2019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) 2020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK) ) 2021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR2 ("Response error: rsp_code=%02X, status=%02X", p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE], p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]); 2024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_FAILED; 2025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_format_cplt (evt_data.status); 2029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_msg_rsp); 2032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 20345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/***************************************************************************** 20355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 20365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function rw_t3t_handle_sro_poll_rsp 20375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 20385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description Handle POLL response for configuring felica-lite read only 20395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 20405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns Nothing 20415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 20425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*****************************************************************************/ 20435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic void rw_t3t_handle_sro_poll_rsp (tRW_T3T_CB *p_cb, UINT8 nci_status, UINT8 num_responses, UINT8 sensf_res_buf_size, UINT8 *p_sensf_res_buf) 20445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{ 20455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen tRW_DATA evt_data; 20465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 rw_t3t_ndef_attrib_info[T3T_MSG_BLOCKSIZE]; 20475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 *p; 20485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 tempU8; 20495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT16 checksum, i; 20505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT32 tempU32 = 0; 20515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen evt_data.status = NFC_STATUS_OK; 20535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Validate response for poll response */ 20555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if ((nci_status == NCI_STATUS_OK) && (num_responses > 0)) 20565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 20575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Tag responded for Felica-Lite poll */ 20585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (p_cb->ndef_attrib.rwflag != T3T_MSG_NDEF_RWFLAG_RO) 20595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 20605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* First update attribute information block */ 20615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_TRACE_DEBUG0 ("Felica-Lite tag detected...update NDef attribution block."); 20625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->rw_substate = RW_T3T_SRO_SST_UPDATE_NDEF_ATTRIB; 20645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p = rw_t3t_ndef_attrib_info; 20665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8_TO_STREAM (p, p_cb->ndef_attrib.version); 20685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Update NDEF info */ 20705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8_TO_STREAM (p, p_cb->ndef_attrib.nbr); /* NBr: number of blocks that can be read using one Check command */ 20715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8_TO_STREAM (p, p_cb->ndef_attrib.nbw); /* Nbw: number of blocks that can be written using one Update command */ 20725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT16_TO_BE_STREAM (p, p_cb->ndef_attrib.nmaxb); /* Nmaxb: maximum number of blocks available for NDEF data */ 20735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT32_TO_BE_STREAM (p, tempU32); 20745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8_TO_STREAM (p, p_cb->ndef_attrib.writef); /* WriteFlag: 00h if writing data finished; 0Fh if writing data in progress */ 20755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8_TO_STREAM (p, 0x00); /* RWFlag: 00h NDEF is read-only */ 20765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen tempU8 = (UINT8) (p_cb->ndef_attrib.ln >> 16); 20785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Get length (3-byte, big-endian) */ 20795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8_TO_STREAM (p, tempU8); /* Ln: high-byte */ 20805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT16_TO_BE_STREAM (p, p_cb->ndef_attrib.ln); /* Ln: lo-word */ 20815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Calculate and append Checksum */ 20835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen checksum = 0; 20845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen for (i = 0; i < T3T_MSG_NDEF_ATTR_INFO_SIZE; i++) 20855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 20865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen checksum+=rw_t3t_ndef_attrib_info[i]; 20875c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 20885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT16_TO_BE_STREAM (p, checksum); 20895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen evt_data.status = rw_t3t_update_block (p_cb, 0, (UINT8 *) rw_t3t_ndef_attrib_info); 20915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 20925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else if (p_cb->cur_cmd == RW_T3T_CMD_SET_READ_ONLY_HARD) 20935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 20945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* NDEF is already read only, Read and update MemoryControl block */ 20955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_TRACE_DEBUG0 ("Felica-Lite tag detected...getting Memory Control block."); 20965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->rw_substate = RW_T3T_SRO_SST_CHECK_MC_BLK; 20975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Send command to check Memory Configuration block */ 20995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen evt_data.status = rw_t3t_check_mc_block (p_cb); 21005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 21015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 21025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else 21035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 21045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_TRACE_ERROR0 ("Felica-Lite tag not detected"); 21055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen evt_data.status = NFC_STATUS_FAILED; 21065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 21075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 21085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* If error, notify upper layer */ 21095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (evt_data.status != NFC_STATUS_OK) 21105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 21115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen rw_t3t_set_readonly_cplt (evt_data.status); 21125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 21135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 21145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 21155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/***************************************************************************** 21165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 21175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function rw_t3t_act_handle_sro_rsp 21185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 21195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description Handle response for setting read only codes 21205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 21215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns Nothing 21225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 21235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*****************************************************************************/ 21245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenvoid rw_t3t_act_handle_sro_rsp (tRW_T3T_CB *p_cb, BT_HDR *p_msg_rsp) 21255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{ 21265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 *p_t3t_rsp = (UINT8 *) (p_msg_rsp+1) + p_msg_rsp->offset; 21275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 *p_mc; 21285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen tRW_DATA evt_data; 21295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 21305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen evt_data.status = NFC_STATUS_OK; 21315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 21325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (p_cb->rw_substate == RW_T3T_SRO_SST_UPDATE_NDEF_ATTRIB) 21335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 21345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Validate response opcode */ 21355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if ( (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) 21365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ||(p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK) ) 21375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 21385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 21395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_TRACE_ERROR2 ("Response error: rsp_code=%02X, status=%02X", p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE], p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]); 21405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen evt_data.status = NFC_STATUS_FAILED; 21415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 21425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else 21435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 21445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->ndef_attrib.rwflag = T3T_MSG_NDEF_RWFLAG_RO; 21455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (p_cb->cur_cmd == RW_T3T_CMD_SET_READ_ONLY_HARD) 21465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 21475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->rw_substate = RW_T3T_SRO_SST_CHECK_MC_BLK; 21485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 21495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Send command to check Memory Configuration block */ 21505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen evt_data.status = rw_t3t_check_mc_block (p_cb); 21515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 21525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else 21535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 21545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen rw_t3t_set_readonly_cplt (evt_data.status); 21555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 21565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 21575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 21585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else if (p_cb->rw_substate == RW_T3T_SRO_SST_CHECK_MC_BLK) 21595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 21605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Check tags's response for reading MemoryControl block, Validate response opcode */ 21615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) 21625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 21635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_TRACE_ERROR2 ("Response error: expecting rsp_code %02X, but got %02X", T3T_MSG_OPC_CHECK_RSP, p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]); 21645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen evt_data.status = NFC_STATUS_FAILED; 21655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 21665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Validate status code and NFCID2 response from tag */ 21675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else if ( (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK) /* verify response status code */ 21685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ||(memcmp (p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM], NCI_NFCID2_LEN) != 0) ) /* verify response IDm */ 21695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 21705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen evt_data.status = NFC_STATUS_FAILED; 21715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 21725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else 21735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 21745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Check if memory configuration (MC) block to see if SYS_OP=1 (NDEF enabled) */ 21755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_mc = &p_t3t_rsp[T3T_MSG_RSP_OFFSET_CHECK_DATA]; /* Point to MC data of CHECK response */ 21765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 21775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (p_mc[T3T_MSG_FELICALITE_MC_OFFSET_SYS_OP] != 0x01) 21785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 21795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Tag is not currently enabled for NDEF */ 21805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen evt_data.status = NFC_STATUS_FAILED; 21815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 21825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else 21835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 21845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Set MC_SP field with MC[0] = 0x00 & MC[1] = 0xC0 (Hardlock) to change access permission from RW to RO */ 21855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_mc[T3T_MSG_FELICALITE_MC_OFFSET_MC_SP] = 0x00; 21865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Not changing the access permission of Subtraction Register and MC[0:1] */ 21875c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_mc[T3T_MSG_FELICALITE_MC_OFFSET_MC_SP + 1] = 0xC0; 21885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 21895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Set RF_PRM field to 0x07 (procedure of issuance) */ 21905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_mc[T3T_MSG_FELICALITE_MC_OFFSET_RF_PRM] = 0x07; 21915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 21925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Construct and send UPDATE message to write MC block */ 21935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->rw_substate = RW_T3T_SRO_SST_UPDATE_MC_BLK; 21945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen evt_data.status = rw_t3t_update_block (p_cb, T3T_MSG_FELICALITE_BLOCK_ID_MC, p_mc); 21955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 21965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 21975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 21985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else if (p_cb->rw_substate == RW_T3T_SRO_SST_UPDATE_MC_BLK) 21995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 22005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Validate response opcode */ 22015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if ( (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) 22025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ||(p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK) ) 22035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 22045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 22055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_TRACE_ERROR2 ("Response error: rsp_code=%02X, status=%02X", p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE], p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]); 22065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen evt_data.status = NFC_STATUS_FAILED; 22075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 22085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else 22095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 22105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen rw_t3t_set_readonly_cplt (evt_data.status); 22115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 22125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 22135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 22145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* If error, notify upper layer */ 22155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (evt_data.status != NFC_STATUS_OK) 22165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 22175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen rw_t3t_set_readonly_cplt (evt_data.status); 22185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 22195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 22205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen GKI_freebuf (p_msg_rsp); 22215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 22225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 2223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_data_cback 2226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This callback function receives the data from NFCC. 2228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 2230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2232a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chuvoid rw_t3t_data_cback (UINT8 conn_id, tNFC_DATA_CEVT *p_data) 2233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2234a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 2235a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu BT_HDR *p_msg = p_data->p_data; 2236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BOOLEAN free_msg = FALSE; /* if TRUE, free msg buffer before returning */ 2237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p, sod; 2238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Stop rsponse timer */ 2240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_stop_quick_timer (&p_cb->timer); 2241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (defined (RW_STATS_INCLUDED) && (RW_STATS_INCLUDED == TRUE)) 2243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Update rx stats */ 2244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_main_update_rx_stats (p_msg->len); 2245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* RW_STATS_INCLUDED */ 2246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if we are expecting a response */ 2248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->rw_state != RW_T3T_STATE_COMMAND_PENDING) 2249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* 2251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** This must be raw frame response 2252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** send raw frame to app with SoD 2253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project */ 2254a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu rw_t3t_act_handle_raw_senddata_rsp (p_cb, p_data); 2255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Sanity check: verify msg len is big enough to contain t3t header */ 2257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_msg->len < T3T_MSG_RSP_COMMON_HDR_LEN) 2258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("T3T: invalid Type3 Tag Message (invalid len: %i)", p_msg->len); 2260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project free_msg = TRUE; 2261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_process_frame_error (); 2263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check for RF frame error */ 2267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_msg+1) + p_msg->offset; 2268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project sod = p[0]; 2269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p[sod] != NCI_STATUS_OK) 2270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("T3T: rf frame error (crc status=%i)", p[sod]); 2272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_msg); 2273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_process_frame_error (); 2275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 2276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE) 2279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project DispT3TagMessage (p_msg, TRUE); 2280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 2281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Skip over SoD */ 2283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->offset++; 2284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->len--; 2285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Get response code */ 2287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_cb->cur_cmd) 2288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_DETECT_NDEF: 2290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_act_handle_ndef_detect_rsp (p_cb, p_msg); 2291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_CHECK_NDEF: 2294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_act_handle_check_ndef_rsp (p_cb, p_msg); 2295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_UPDATE_NDEF: 2298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_act_handle_update_ndef_rsp (p_cb, p_msg); 2299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_CHECK: 2302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_act_handle_check_rsp (p_cb, p_msg); 2303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_UPDATE: 2306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_act_handle_update_rsp (p_cb, p_msg); 2307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_SEND_RAW_FRAME: 2310a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu rw_t3t_act_handle_raw_senddata_rsp (p_cb, p_data); 2311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_GET_SYSTEM_CODES: 2314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_act_handle_get_sc_rsp (p_cb, p_msg); 2315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_FORMAT: 2318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_act_handle_fmt_rsp (p_cb, p_msg); 2319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 23215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen case RW_T3T_CMD_SET_READ_ONLY_SOFT: 23225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen case RW_T3T_CMD_SET_READ_ONLY_HARD: 23235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen rw_t3t_act_handle_sro_rsp (p_cb, p_msg); 23245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen break; 23255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 2326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 2327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_msg); 2328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (free_msg) 2333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_msg); 2335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_conn_cback 2342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This callback function receives the events/data from NFCC. 2344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 2346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid rw_t3t_conn_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data) 2349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 2351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG2 ("rw_t3t_conn_cback: conn_id=%i, evt=0x%02x", conn_id, event); 2352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Only handle NFC_RF_CONN_ID conn_id */ 2354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (conn_id != NFC_RF_CONN_ID) 2355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 2357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (event) 2360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_DEACTIVATE_CEVT: 2362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_unselect (NULL); 2363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_DATA_CEVT: /* check for status in tNFC_CONN */ 2366a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if ( (p_data->data.status == NFC_STATUS_OK) 2367a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu ||(p_data->data.status == NFC_STATUS_CONTINUE) ) 2368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2369a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu rw_t3t_data_cback (conn_id, &(p_data->data)); 2370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Data event with error status...fall through to NFC_ERROR_CEVT case */ 2373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_ERROR_CEVT: 2376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_stop_quick_timer (&p_cb->timer); 2377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (defined (RW_STATS_INCLUDED) && (RW_STATS_INCLUDED == TRUE)) 2379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_main_update_trans_error_stats (); 2380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* RW_STATS_INCLUDED */ 2381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (event == NFC_ERROR_CEVT) 2383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_process_error (NFC_STATUS_TIMEOUT); 2384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_process_error (p_data->status); 2386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 2389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 2390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2397818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Function rw_t3t_mrti_to_a_b 2398818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 2399818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Description Converts the given MRTI (Maximum Response Time Information) 2400818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** to the base to calculate timeout value. 2401818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** (The timeout value is a + b * number_blocks) 2402818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 2403818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Returns NFC_STATUS_OK 2404818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 2405818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith*******************************************************************************/ 2406818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smithstatic void rw_t3t_mrti_to_a_b (UINT8 mrti, UINT32 *p_a, UINT32 *p_b) 2407818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith{ 2408818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith UINT8 a, b, e; 2409818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith 2410818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith a = (mrti & 0x7) + 1; /* A is bit 0 ~ bit 2 */ 2411818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith mrti >>=3; 2412818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith b = (mrti & 0x7) + 1; /* B is bit 3 ~ bit 5 */ 2413818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith mrti >>=3; 2414818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith e = mrti & 0x3; /* E is bit 6 ~ bit 7 */ 2415818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith *p_a = rw_t3t_mrti_base[e] * a; /* (A+1) * base (i.e T/t3t * 4^E) */ 2416818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith *p_b = rw_t3t_mrti_base[e] * b; /* (B+1) * base (i.e T/t3t * 4^E) */ 2417818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith} 2418818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith 2419818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith 2420818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith/******************************************************************************* 2421818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 2422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_select 2423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Called by NFC manager when a Type3 tag has been activated 2425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK 2427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS rw_t3t_select (UINT8 peer_nfcid2[NCI_RF_F_UID_LEN], UINT8 mrti_check, UINT8 mrti_update) 2430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 2432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("rw_t3t_select"); 2434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_cb->peer_nfcid2, peer_nfcid2, NCI_NFCID2_LEN); /* Store tag's NFCID2 */ 2436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_attrib.status = NFC_STATUS_NOT_INITIALIZED; /* Indicate that NDEF detection has not been performed yet */ 2437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_IDLE; 2438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags = 0; 2439818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith rw_t3t_mrti_to_a_b (mrti_check, &p_cb->check_tout_a, &p_cb->check_tout_b); 2440818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith rw_t3t_mrti_to_a_b (mrti_update, &p_cb->update_tout_a, &p_cb->update_tout_b); 2441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Alloc cmd buf for retransmissions */ 2443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->p_cur_cmd_buf == NULL) 2444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_cb->p_cur_cmd_buf = (BT_HDR *) GKI_getpoolbuf (NFC_RW_POOL_ID)) == NULL) 2446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("rw_t3t_select: unable to allocate buffer for retransmission"); 2448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_NOT_ACTIVATED; 2449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_FAILED); 2450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_SetStaticRfCback (rw_t3t_conn_cback); 2455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 2457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_unselect 2463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Called by NFC manager when a Type3 tag has been de-activated 2465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK 2467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tNFC_STATUS rw_t3t_unselect (UINT8 peer_nfcid2[]) 2470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 2472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (defined (RW_STATS_INCLUDED) && (RW_STATS_INCLUDED == TRUE)) 2474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Display stats */ 2475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_main_log_stats (); 2476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif /* RW_STATS_INCLUDED */ 2477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Stop t3t timer (if started) */ 2479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_stop_quick_timer (&p_cb->timer); 2480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Free cmd buf for retransmissions */ 2482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->p_cur_cmd_buf) 2483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_cb->p_cur_cmd_buf); 2485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->p_cur_cmd_buf = NULL; 2486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_NOT_ACTIVATED; 2489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_SetStaticRfCback (NULL); 2490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NFC_STATUS_OK; 2492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2494a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu/******************************************************************************* 2495a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 2496a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Function rw_t3t_update_ndef_flag 2497a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 2498a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Description set additional NDEF Flags for felica lite tag 2499a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 2500a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Returns updated NDEF Flag value 2501a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 2502a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu*******************************************************************************/ 2503a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chustatic void rw_t3t_update_ndef_flag (UINT8 *p_flag) 2504a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu{ 2505a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 2506a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu UINT8 xx; 2507a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 2508a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu for (xx = 0; xx < p_cb->num_system_codes; xx++) 2509a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 2510a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if (p_cb->system_codes[xx] == T3T_SYSTEM_CODE_FELICA_LITE) 2511a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 2512a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu *p_flag &= ~RW_NDEF_FL_UNKNOWN; 2513a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu *p_flag |= (RW_NDEF_FL_SUPPORTED | RW_NDEF_FL_FORMATABLE); 2514a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu break; 2515a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 2516a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 2517a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu} 2518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 2520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_cmd_str 2523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Converts cmd_id to command string for logging 2525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns command string 2527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *rw_t3t_cmd_str (UINT8 cmd_id) 2530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (cmd_id) 2532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_DETECT_NDEF: 2534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "RW_T3T_CMD_DETECT_NDEF"; 2535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_CHECK_NDEF: 2537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "RW_T3T_CMD_CHECK_NDEF"; 2538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_UPDATE_NDEF: 2540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "RW_T3T_CMD_UPDATE_NDEF"; 2541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_CHECK: 2543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "RW_T3T_CMD_CHECK"; 2544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_UPDATE: 2546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "RW_T3T_CMD_UPDATE"; 2547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_SEND_RAW_FRAME: 2549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "RW_T3T_CMD_SEND_RAW_FRAME"; 2550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_GET_SYSTEM_CODES: 2552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "RW_T3T_CMD_GET_SYSTEM_CODES"; 2553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 2555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "Unknown"; 2556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_state_str 2563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Converts state_id to command string for logging 2565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns command string 2567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *rw_t3t_state_str (UINT8 state_id) 2570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (state_id) 2572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_STATE_NOT_ACTIVATED: 2574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "RW_T3T_STATE_NOT_ACTIVATED"; 2575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_STATE_IDLE: 2577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "RW_T3T_STATE_IDLE"; 2578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_STATE_COMMAND_PENDING: 2580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "RW_T3T_STATE_COMMAND_PENDING"; 2581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 2583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "Unknown"; 2584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 2587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Type3 Tag API Functions 2590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 2591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tDetectNDef 2596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** This function is used to perform NDEF detection on a Type 3 tag, and 2599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** retrieve the tag's NDEF attribute information (block 0). 2600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Before using this API, the application must call RW_SelectTagType to 2602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** indicate that a Type 3 tag has been activated, and to provide the 2603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** tag's Manufacture ID (IDm) . 2604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK: ndef detection procedure started 2607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 2611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T3tDetectNDef (void) 2612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 2614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS retval = NFC_STATUS_OK; 2615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_T3tDetectNDef"); 2617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if we are in valid state to handle this API */ 2619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->rw_state != RW_T3T_STATE_IDLE) 2620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("Error: invalid state to handle API (0x%x)", p_cb->rw_state); 2622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_FAILED); 2623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2625808ebf88b1d5fae4556abe1f50651ab0a8e75114The Android Open Source Project if ((retval = (tNFC_STATUS) nci_snd_t3t_polling (T3T_SYSTEM_CODE_NDEF, 0, 0)) == NCI_STATUS_OK) 2626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->cur_cmd = RW_T3T_CMD_DETECT_NDEF; 2628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->cur_tout = RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS; 2629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->cur_poll_rc = 0; 2630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING; 2631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags |= RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP; 2632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* start timer for waiting for responses */ 2634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_start_poll_timer (p_cb); 2635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (retval); 2638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tCheckNDef 2644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Retrieve NDEF contents from a Type3 tag. 2647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The RW_T3T_CHECK_EVT event is used to notify the application for each 2649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** segment of NDEF data received. The RW_T3T_CHECK_CPLT_EVT event is used to 2650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** notify the application all segments have been received. 2651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Before using this API, the RW_T3tDetectNDef function must be called to 2653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** verify that the tag contains NDEF data, and to retrieve the NDEF 2654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** attributes. 2655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Internally, this command will be separated into multiple Tag 3 Check 2657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** commands (if necessary) - depending on the tag's Nbr (max number of 2658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** blocks per read) attribute. 2659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK: check command started 2662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 2666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T3tCheckNDef (void) 2667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS retval = NFC_STATUS_OK; 2669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 2670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_T3tCheckNDef"); 2672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if we are in valid state to handle this API */ 2674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->rw_state != RW_T3T_STATE_IDLE) 2675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("Error: invalid state to handle API (0x%x)", p_cb->rw_state); 2677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_FAILED); 2678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cb->ndef_attrib.status != NFC_STATUS_OK) /* NDEF detection not performed yet? */ 2680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("Error: NDEF detection not performed yet"); 2682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_NOT_INITIALIZED); 2683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cb->ndef_attrib.ln == 0) 2685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("Type 3 tag contains empty NDEF message"); 2687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_FAILED); 2688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check number of blocks needed for this update */ 2691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags &= ~RW_T3T_FL_IS_FINAL_NDEF_SEGMENT; 2692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_rx_offset = 0; 2693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project retval = rw_t3t_send_next_ndef_check_cmd (p_cb); 2694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (retval); 2696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tUpdateNDef 2701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Write NDEF contents to a Type3 tag. 2704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The RW_T3T_UPDATE_CPLT_EVT callback event will be used to notify the 2706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** application of the response. 2707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Before using this API, the RW_T3tDetectNDef function must be called to 2709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** verify that the tag contains NDEF data, and to retrieve the NDEF 2710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** attributes. 2711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Internally, this command will be separated into multiple Tag 3 Update 2713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** commands (if necessary) - depending on the tag's Nbw (max number of 2714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** blocks per write) attribute. 2715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK: check command started 2718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_REFUSED: tag is read-only 2720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_BUFFER_FULL: len exceeds tag's maximum size 2721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 2724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T3tUpdateNDef (UINT32 len, UINT8 *p_data) 2725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS retval = NFC_STATUS_OK; 2727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 2728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API1 ("RW_T3tUpdateNDef (len=%i)", len); 2730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if we are in valid state to handle this API */ 2732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->rw_state != RW_T3T_STATE_IDLE) 2733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("Error: invalid state to handle API (0x%x)", p_cb->rw_state); 2735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_FAILED); 2736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cb->ndef_attrib.status != NFC_STATUS_OK) /* NDEF detection not performed yet? */ 2738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR0 ("Error: NDEF detection not performed yet"); 2740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_NOT_INITIALIZED); 2741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (len > (((UINT32)p_cb->ndef_attrib.nmaxb) * 16)) /* Len exceed's tag's NDEF memory? */ 2743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_BUFFER_FULL); 2745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cb->ndef_attrib.rwflag == T3T_MSG_NDEF_RWFLAG_RO)/* Tag's NDEF memory is read-only? */ 2747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_REFUSED); 2749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check number of blocks needed for this update */ 2752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags &= ~RW_T3T_FL_IS_FINAL_NDEF_SEGMENT; 2753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_msg_bytes_sent = 0; 2754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_msg_len = len; 2755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->ndef_msg = p_data; 2756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send initial UPDATE command for NDEF Attribute Info */ 2758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project retval = rw_t3t_send_update_ndef_attribute_cmd (p_cb, TRUE); 2759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (retval); 2761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tCheck 2766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Read (non-NDEF) contents from a Type3 tag. 2769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The RW_READ_EVT event is used to notify the application for each 2771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** segment of NDEF data received. The RW_READ_CPLT_EVT event is used to 2772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** notify the application all segments have been received. 2773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Before using this API, the application must call RW_SelectTagType to 2775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** indicate that a Type 3 tag has been activated, and to provide the 2776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** tag's Manufacture ID (IDm) . 2777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK: check command started 2780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 2784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T3tCheck (UINT8 num_blocks, tT3T_BLOCK_DESC *t3t_blocks) 2785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS retval = NFC_STATUS_OK; 2787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 2788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API1 ("RW_T3tCheck (num_blocks = %i)", num_blocks); 2790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if we are in valid state to handle this API */ 2792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->rw_state != RW_T3T_STATE_IDLE) 2793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("Error: invalid state to handle API (0x%x)", p_cb->rw_state); 2795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_FAILED); 2796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send the CHECK command */ 2799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project retval = rw_t3t_send_check_cmd (p_cb, num_blocks, t3t_blocks); 2800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (retval); 2802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tUpdate 2807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Write (non-NDEF) contents to a Type3 tag. 2810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The RW_WRITE_CPLT_EVT event is used to notify the application all 2812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** segments have been received. 2813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Before using this API, the application must call RW_SelectTagType to 2815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** indicate that a Type 3 tag has been activated, and to provide the tag's 2816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Manufacture ID (IDm) . 2817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK: check command started 2820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 2824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T3tUpdate (UINT8 num_blocks, tT3T_BLOCK_DESC *t3t_blocks, UINT8 *p_data) 2825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS retval = NFC_STATUS_OK; 2827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 2828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API1 ("RW_T3tUpdate (num_blocks = %i)", num_blocks); 2830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if we are in valid state to handle this API */ 2832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->rw_state != RW_T3T_STATE_IDLE) 2833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("Error: invalid state to handle API (0x%x)", p_cb->rw_state); 2835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_FAILED); 2836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send the UPDATE command */ 2839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project retval = rw_t3t_send_update_cmd (p_cb, num_blocks, t3t_blocks, p_data); 2840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (retval); 2842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tPresenceCheck 2847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Check if the tag is still in the field. 2850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The RW_T3T_PRESENCE_CHECK_EVT w/ status is used to indicate presence 2852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** or non-presence. 2853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK, if raw data frame sent 2856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 2860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T3tPresenceCheck (void) 2861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS retval = NFC_STATUS_OK; 2863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_DATA evt_data; 2864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_CB *p_rw_cb = &rw_cb; 2865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_T3tPresenceCheck"); 2867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If RW_SelectTagType was not called (no conn_callback) return failure */ 2869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!(p_rw_cb->p_cback)) 2870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project retval = NFC_STATUS_FAILED; 2872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If we are not activated, then RW_T3T_PRESENCE_CHECK_EVT status=FAIL */ 2874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_rw_cb->tcb.t3t.rw_state == RW_T3T_STATE_NOT_ACTIVATED) 2875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_FAILED; 2877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_rw_cb->p_cback) (RW_T3T_PRESENCE_CHECK_EVT, &evt_data); 2878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If command is pending */ 2880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_rw_cb->tcb.t3t.rw_state == RW_T3T_STATE_COMMAND_PENDING) 2881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If already performing presence check, return error */ 2883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_rw_cb->tcb.t3t.flags & RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP) 2884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG0 ("RW_T3tPresenceCheck already in progress"); 2886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project retval = NFC_STATUS_FAILED; 2887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* If busy with any other command, assume that the tag is present */ 2889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_OK; 2892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_rw_cb->p_cback) (RW_T3T_PRESENCE_CHECK_EVT, &evt_data); 2893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* IDLE state: send POLL command */ 2898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((retval = (tNFC_STATUS) nci_snd_t3t_polling (0xFFFF, T3T_POLL_RC_SC, 0)) == NCI_STATUS_OK) 2899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rw_cb->tcb.t3t.flags |= RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP; 2901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rw_cb->tcb.t3t.rw_state = RW_T3T_STATE_COMMAND_PENDING; 2902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_rw_cb->tcb.t3t.cur_poll_rc = 0; 2903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* start timer for waiting for responses */ 2905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_start_poll_timer (&p_rw_cb->tcb.t3t); 2906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 2908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_DEBUG1 ("RW_T3tPresenceCheck error sending NCI_RF_T3T_POLLING cmd (status = 0x%0x)", retval); 2910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (retval); 2914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tPoll 2919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Send POLL command 2922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK, if raw data frame sent 2925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 2929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T3tPoll (UINT16 system_code, tT3T_POLL_RC rc, UINT8 tsn) 2930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS retval = NFC_STATUS_OK; 2932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 2933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_T3tPoll"); 2935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if we are in valid state to handle this API */ 2937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->rw_state != RW_T3T_STATE_IDLE) 2938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("Error: invalid state to handle API (0x%x)", p_cb->rw_state); 2940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_FAILED); 2941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((retval = (tNFC_STATUS) nci_snd_t3t_polling (system_code, (UINT8) rc, tsn)) == NCI_STATUS_OK) 2944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* start timer for waiting for responses */ 2946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->cur_poll_rc = rc; 2947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING; 2948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_start_poll_timer (p_cb); 2949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (retval); 2953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tSendRawFrame 2958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** This function is called to send a raw data frame to the peer device. 2961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** When type 3 tag receives response from peer, the callback function 2962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** will be called with a RW_T3T_RAW_FRAME_EVT [Table 6]. 2963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Before using this API, the application must call RW_SelectTagType to 2965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** indicate that a Type 3 tag has been activated. 2966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The raw frame should be a properly formatted Type 3 tag message. 2968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK, if raw data frame sent 2971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 2975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T3tSendRawFrame (UINT16 len, UINT8 *p_data) 2976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS retval = NFC_STATUS_OK; 2978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 2979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API1 ("RW_T3tSendRawFrame (len = %i)", len); 2981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if we are in valid state to handle this API */ 2983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->rw_state != RW_T3T_STATE_IDLE) 2984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("Error: invalid state to handle API (0x%x)", p_cb->rw_state); 2986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_FAILED); 2987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send the UPDATE command */ 2990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project retval = rw_t3t_send_raw_frame (p_cb, len ,p_data); 2991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (retval); 2993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tGetSystemCodes 2998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 3000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Get systems codes supported by the activated tag: 3001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Poll for wildcard (FFFF): 3002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - If felica-lite code then poll for ndef (12fc) 3003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** - Otherwise send RequestSystmCode command to get 3004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** system codes. 3005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Before using this API, the application must call RW_SelectTagType to 3007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** indicate that a Type 3 tag has been activated. 3008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 3010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK, if raw data frame sent 3011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 3012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 3013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 3015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T3tGetSystemCodes (void) 3016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS retval = NFC_STATUS_OK; 3018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 3019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_T3tGetSystemCodes"); 3021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if we are in valid state to handle this API */ 3023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->rw_state != RW_T3T_STATE_IDLE) 3024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("Error: invalid state to handle API (0x%x)", p_cb->rw_state); 3026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_FAILED); 3027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 3029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((retval = (tNFC_STATUS) nci_snd_t3t_polling (0xFFFF, T3T_POLL_RC_SC, 0)) == NCI_STATUS_OK) 3031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->cur_cmd = RW_T3T_CMD_GET_SYSTEM_CODES; 3033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->cur_tout = RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS; 3034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->cur_poll_rc = T3T_POLL_RC_SC; 3035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING; 3036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_substate = RW_T3T_GET_SC_SST_POLL_WILDCARD; 3037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags |= RW_T3T_FL_W4_GET_SC_POLL_RSP; 3038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->num_system_codes = 0; 3039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* start timer for waiting for responses */ 3041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_start_poll_timer (p_cb); 3042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (retval); 3048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 3049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 3051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tFormatNDef 3053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 3055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Format a type-3 tag for NDEF. 3056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Only Felica-Lite tags are supported by this API. The 3058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_T3T_FORMAT_CPLT_EVT is used to notify the status of the operation. 3059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 3061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK: ndef detection procedure started 3062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 3063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 3064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 3066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_STATUS RW_T3tFormatNDef (void) 3067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_STATUS retval = NFC_STATUS_OK; 3069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 3070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_API0 ("RW_T3tFormatNDef"); 3072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if we are in valid state to handle this API */ 3074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_cb->rw_state != RW_T3T_STATE_IDLE) 3075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project RW_TRACE_ERROR1 ("Error: invalid state to handle API (0x%x)", p_cb->rw_state); 3077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NFC_STATUS_FAILED); 3078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 3080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Poll tag, to see if Felica-Lite system is supported */ 3082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((retval = (tNFC_STATUS) nci_snd_t3t_polling (T3T_SYSTEM_CODE_FELICA_LITE, T3T_POLL_RC_SC, 0)) == NCI_STATUS_OK) 3083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->cur_cmd = RW_T3T_CMD_FORMAT; 3085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->cur_tout = RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS; 3086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->cur_poll_rc = T3T_POLL_RC_SC; 3087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING; 3088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->rw_substate = RW_T3T_FMT_SST_POLL_FELICA_LITE; 3089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cb->flags |= RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP; 3090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* start timer for waiting for responses */ 3092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rw_t3t_start_poll_timer (p_cb); 3093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (retval); 3099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 31005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 31015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/***************************************************************************** 31025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 31035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function RW_T3tSetReadOnly 31045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 31055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description This function performs NDEF read-only procedure 31065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Note: Only Felica-Lite tags are supported by this API. 31075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** RW_T3tDetectNDef() must be called before using this 31085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 31095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** The RW_T3T_SET_READ_ONLY_CPLT_EVT event will be returned. 31105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 31115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns NFC_STATUS_OK if success 31125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** NFC_STATUS_FAILED if T3T is busy or other error 31135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 31145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*****************************************************************************/ 31155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn CoenentNFC_STATUS RW_T3tSetReadOnly (BOOLEAN b_hard_lock) 31165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{ 31175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen tNFC_STATUS retval = NFC_STATUS_OK; 31185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen tRW_T3T_CB *p_cb = &rw_cb.tcb.t3t; 31195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen tRW_DATA evt_data; 31205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 31217c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu RW_TRACE_API1 ("RW_T3tSetReadOnly (): b_hard_lock=%d", b_hard_lock); 31225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 31235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Check if we are in valid state to handle this API */ 31245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (p_cb->rw_state != RW_T3T_STATE_IDLE) 31255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 31265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_TRACE_ERROR1 ("Error: invalid state to handle API (0x%x)", p_cb->rw_state); 31275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return (NFC_STATUS_FAILED); 31285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 31295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 31305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (p_cb->ndef_attrib.status != NFC_STATUS_OK) /* NDEF detection not performed yet? */ 31315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 31325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen RW_TRACE_ERROR0 ("Error: NDEF detection not performed yet"); 31335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return (NFC_STATUS_NOT_INITIALIZED); 31345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 31355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 31365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if ((!b_hard_lock) && (p_cb->ndef_attrib.rwflag == T3T_MSG_NDEF_RWFLAG_RO))/* Tag's NDEF memory is read-only already */ 31375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 31385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen evt_data.status = NFC_STATUS_OK; 31397c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu (*(rw_cb.p_cback)) (RW_T3T_SET_READ_ONLY_CPLT_EVT, &evt_data); 31405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return (retval); 31415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 31425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else 31435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 31445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Poll tag, to see if Felica-Lite system is supported */ 31455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if ((retval = (tNFC_STATUS) nci_snd_t3t_polling (T3T_SYSTEM_CODE_FELICA_LITE, T3T_POLL_RC_SC, 0)) == NCI_STATUS_OK) 31465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 31475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (b_hard_lock) 31485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->cur_cmd = RW_T3T_CMD_SET_READ_ONLY_HARD; 31495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else 31505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->cur_cmd = RW_T3T_CMD_SET_READ_ONLY_SOFT; 31515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->cur_tout = RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS; 31525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->cur_poll_rc = T3T_POLL_RC_SC; 31535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING; 31545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->rw_substate = RW_T3T_SRO_SST_POLL_FELICA_LITE; 31555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_cb->flags |= RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP; 31565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 31575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* start timer for waiting for responses */ 31585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen rw_t3t_start_poll_timer (p_cb); 31595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 31605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 31615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return (retval); 31625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 3163