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 19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * This file contains the implementation for Type 3 tag in Reader/Writer 22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * mode. 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h> 26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "bt_types.h" 276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfc_target.h" 28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "trace_api.h" 29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "gki.h" 316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nci_hmsgs.h" 32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_api.h" 33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_int.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 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Definitions for constructing t3t command messages */ 396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define RW_T3T_FL_PADDING 0x01 /* Padding needed for last NDEF block */ 406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi/* Maximum number of NDEF blocks updates that can fit into one command (when all 416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * block-numbers are < 256) */ 4246e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi#define RW_T3T_MAX_NDEF_BLOCKS_PER_UPDATE_1_BYTE_FORMAT (13) 436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi/* Maximum number of NDEF blocks updates that can fit into one command (when all 446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * block-numbers are >= 256) */ 4546e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi#define RW_T3T_MAX_NDEF_BLOCKS_PER_UPDATE_2_BYTE_FORMAT (12) 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Definitions for SENSF_RES */ 486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi/* Offset of RD in SENSF_RES from NCI_POLL NTF (includes 1 byte SENSF_RES 496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * length) */ 5046e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi#define RW_T3T_SENSF_RES_RD_OFFSET 17 516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define RW_T3T_SENSF_RES_RD_LEN 2 /* Size of RD in SENSF_RES */ 52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Timeout definitions for commands */ 546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define RW_T3T_POLL_CMD_TIMEOUT_TICKS \ 556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((RW_T3T_TOUT_RESP * 2 * QUICK_TIMER_TICKS_PER_SEC) / 1000) 566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS \ 576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((RW_T3T_TOUT_RESP * QUICK_TIMER_TICKS_PER_SEC) / 1000) 586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define RW_T3T_RAW_FRAME_CMD_TIMEOUT_TICKS \ 596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS * 4) 606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define RW_T3T_MIN_TIMEOUT_TICKS 10 61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Macro to extract major version from NDEF version byte */ 636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define T3T_GET_MAJOR_VERSION(ver) (ver >> 4) 64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Enumeration of API commands */ 666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoienum { 676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_CMD_DETECT_NDEF, 686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_CMD_CHECK_NDEF, 696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_CMD_UPDATE_NDEF, 706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_CMD_CHECK, 716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_CMD_UPDATE, 726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_CMD_SEND_RAW_FRAME, 736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_CMD_GET_SYSTEM_CODES, 746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_CMD_FORMAT, 756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_CMD_SET_READ_ONLY_SOFT, 766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_CMD_SET_READ_ONLY_HARD, 776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_CMD_MAX 79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* RW_CBACK events corresponding to API comands */ 826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiconst uint8_t rw_t3t_api_res_evt[RW_T3T_CMD_MAX] = { 836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_NDEF_DETECT_EVT, /* RW_T3T_CMD_DETECT_NDEF */ 846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_CHECK_CPLT_EVT, /* RW_T3T_CMD_CHECK_NDEF */ 856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_UPDATE_CPLT_EVT, /* RW_T3T_CMD_UPDATE_NDEF */ 866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_CHECK_CPLT_EVT, /* RW_T3T_CMD_CHECK */ 876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_UPDATE_CPLT_EVT, /* RW_T3T_CMD_UPDATE */ 886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_RAW_FRAME_EVT, /* RW_T3T_CMD_SEND_RAW_FRAME */ 896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_GET_SYSTEM_CODES_EVT, /* RW_T3T_CMD_GET_SYSTEM_CODES */ 906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_FORMAT_CPLT_EVT, /* RW_T3T_CMD_FORMAT */ 916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_SET_READ_ONLY_CPLT_EVT /* RW_T3T_CMD_SET_READ_ONLY */ 92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* States */ 956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoienum { 966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_STATE_NOT_ACTIVATED, 976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_STATE_IDLE, 986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_STATE_COMMAND_PENDING 99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Sub-states */ 1026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoienum { 1036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Sub states for formatting Felica-Lite */ 1046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_FMT_SST_POLL_FELICA_LITE, /* Waiting for POLL Felica-Lite response (for 1056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi formatting) */ 1066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_FMT_SST_CHECK_MC_BLK, /* Waiting for Felica-Lite MC (MemoryControl) 1076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi block-read to complete */ 1086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_FMT_SST_UPDATE_MC_BLK, /* Waiting for Felica-Lite MC (MemoryControl) 1096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi block-write to complete */ 1106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_FMT_SST_UPDATE_NDEF_ATTRIB, /* Waiting for NDEF attribute block-write 1116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi to complete */ 1126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Sub states for setting Felica-Lite read only */ 1146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_SRO_SST_POLL_FELICA_LITE, /* Waiting for POLL Felica-Lite response (for 1156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi setting read only) */ 1166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_SRO_SST_UPDATE_NDEF_ATTRIB, /* Waiting for NDEF attribute block-write 1176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi to complete */ 1186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_SRO_SST_CHECK_MC_BLK, /* Waiting for Felica-Lite MC (MemoryControl) 1196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi block-read to complete */ 1206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_SRO_SST_UPDATE_MC_BLK /* Waiting for Felica-Lite MC (MemoryControl) 1216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi block-write to complete */ 122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 1256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic char* rw_t3t_cmd_str(uint8_t cmd_id); 1266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic char* rw_t3t_state_str(uint8_t state_id); 127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Local static functions */ 1306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t3t_update_ndef_flag(uint8_t* p_flag); 1316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic tNFC_STATUS rw_t3t_unselect(uint8_t peer_nfcid2[]); 1326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic NFC_HDR* rw_t3t_get_cmd_buf(void); 1336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic tNFC_STATUS rw_t3t_send_to_lower(NFC_HDR* p_msg); 1346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t3t_handle_get_system_codes_cplt(void); 1356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t3t_handle_get_sc_poll_rsp(tRW_T3T_CB* p_cb, uint8_t nci_status, 1366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t num_responses, 1376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t sensf_res_buf_size, 1386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_sensf_res_buf); 1396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t3t_handle_ndef_detect_poll_rsp(tRW_T3T_CB* p_cb, 1406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t nci_status, 1416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t num_responses, 1426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t sensf_res_buf_size, 1436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_sensf_res_buf); 1446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t3t_handle_fmt_poll_rsp(tRW_T3T_CB* p_cb, uint8_t nci_status, 1456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t num_responses, 1466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t sensf_res_buf_size, 1476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_sensf_res_buf); 1486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t3t_handle_sro_poll_rsp(tRW_T3T_CB* p_cb, uint8_t nci_status, 1496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t num_responses, 1506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t sensf_res_buf_size, 1516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_sensf_res_buf); 1526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi/* Default NDEF attribute information block (used when formatting Felica-Lite 1546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * tags) */ 15546e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi/* NBr (max block reads per cmd)*/ 15646e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi#define RW_T3T_DEFAULT_FELICALITE_NBR 4 15746e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi/* NBw (max block write per cmd)*/ 15846e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi#define RW_T3T_DEFAULT_FELICALITE_NBW 1 1596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define RW_T3T_DEFAULT_FELICALITE_NMAXB (T3T_FELICALITE_NMAXB) 1606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define RW_T3T_DEFAULT_FELICALITE_ATTRIB_INFO_CHECKSUM \ 1616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((T3T_MSG_NDEF_VERSION + RW_T3T_DEFAULT_FELICALITE_NBR + \ 1626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_DEFAULT_FELICALITE_NBW + (RW_T3T_DEFAULT_FELICALITE_NMAXB >> 8) + \ 1636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (RW_T3T_DEFAULT_FELICALITE_NMAXB & 0xFF) + T3T_MSG_NDEF_WRITEF_OFF + \ 1646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_NDEF_RWFLAG_RW) & \ 1656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 0xFFFF) 1666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiconst uint8_t rw_t3t_default_attrib_info[T3T_MSG_BLOCKSIZE] = { 1686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_NDEF_VERSION, /* Ver */ 1696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_DEFAULT_FELICALITE_NBR, /* NBr (max block reads per cmd)*/ 1706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_DEFAULT_FELICALITE_NBW, /* NBw (max block write per cmd)*/ 1716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (RW_T3T_DEFAULT_FELICALITE_NMAXB >> 8), /* Nmaxb (max size in blocks) */ 1726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (RW_T3T_DEFAULT_FELICALITE_NMAXB & 0xFF), /* Nmaxb (max size in blocks) */ 173c76c21dd27b7bb9296f4bdef8c6e19ec9d19eef3Love Khanna 0, 0, 0, 0, /* Unused */ 174c76c21dd27b7bb9296f4bdef8c6e19ec9d19eef3Love Khanna T3T_MSG_NDEF_WRITEF_OFF, /* WriteF */ 175c76c21dd27b7bb9296f4bdef8c6e19ec9d19eef3Love Khanna T3T_MSG_NDEF_RWFLAG_RW, /* RW Flag */ 176c76c21dd27b7bb9296f4bdef8c6e19ec9d19eef3Love Khanna 0, 0, 0, /* Ln (current size in bytes) */ 1776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (RW_T3T_DEFAULT_FELICALITE_ATTRIB_INFO_CHECKSUM >> 1796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8), /* checksum (high-byte) */ 1806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (RW_T3T_DEFAULT_FELICALITE_ATTRIB_INFO_CHECKSUM & 1816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 0xFF) /* checksum (low-byte) */ 182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 185818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith/* This is (T/t3t * 4^E) , E is the index of the array. The unit is .0001 ms */ 1866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic const uint32_t rw_t3t_mrti_base[] = {302, 1208, 4832, 19328}; 187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 190818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Function rw_t3t_check_timeout 191818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 192818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Description The timeout value is a + b * number_blocks) 193818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 194818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Returns timeout value in ticks 195818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 196818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith*******************************************************************************/ 1976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic uint32_t rw_t3t_check_timeout(uint16_t num_blocks) { 1986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 1996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint32_t timeout; 2006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint32_t extra; 2016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi timeout = (p_cb->check_tout_a + num_blocks * p_cb->check_tout_b) * 2036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi QUICK_TIMER_TICKS_PER_SEC / 1000000; 2046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* allow some extra time for driver */ 2056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi extra = (timeout / 10) + RW_T3T_MIN_TIMEOUT_TICKS; 2066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi timeout += extra; 2076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return timeout; 209818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith} 210818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith 211818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith/******************************************************************************* 212818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 213818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Function rw_t3t_update_timeout 214818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 215818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Description The timeout value is a + b * number_blocks) 216818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 217818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Returns timeout value in ticks 218818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 219818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith*******************************************************************************/ 2206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic uint32_t rw_t3t_update_timeout(uint16_t num_blocks) { 2216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 2226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint32_t timeout; 2236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint32_t extra; 2246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi timeout = (p_cb->update_tout_a + num_blocks * p_cb->update_tout_b) * 2266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi QUICK_TIMER_TICKS_PER_SEC / 1000000; 2276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* allow some extra time for driver */ 2286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi extra = (timeout / 10) + RW_T3T_MIN_TIMEOUT_TICKS; 2296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi timeout += extra; 2306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return timeout; 232818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith} 233818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith/******************************************************************************* 234818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_process_error 236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process error (timeout or CRC error) 238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_process_error(tNFC_STATUS status) { 2436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 2446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t evt; 2456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 2466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf; 2476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state == RW_T3T_STATE_COMMAND_PENDING) { 2496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->cur_cmd == RW_T3T_CMD_GET_SYSTEM_CODES) { 2506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* For GetSystemCode: tag did not respond to requested POLL */ 2516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_handle_get_system_codes_cplt(); 2526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return; 2536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Retry sending command if retry-count < max */ 2556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (rw_cb.cur_retry < RW_MAX_RETRIES) { 2566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* retry sending the command */ 2576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_cb.cur_retry++; 2586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG2("T3T retransmission attempt %i of %i", rw_cb.cur_retry, 2606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_MAX_RETRIES); 2616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* allocate a new buffer for message */ 2630c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cmd_buf = rw_t3t_get_cmd_buf(); 2640c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cmd_buf != NULL) { 2656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memcpy(p_cmd_buf, p_cb->p_cur_cmd_buf, 2666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sizeof(NFC_HDR) + p_cb->p_cur_cmd_buf->offset + 2676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->p_cur_cmd_buf->len); 2686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (rw_t3t_send_to_lower(p_cmd_buf) == NFC_STATUS_OK) { 2706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Start timer for waiting for response */ 2716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_start_quick_timer(&p_cb->timer, NFC_TTYPE_RW_T3T_RESPONSE, 2726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_tout); 2736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return; 2746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 2756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* failure - could not send buffer */ 2766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_cmd_buf); 2776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 2806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG1("T3T maximum retransmission attempts reached (%i)", 2816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_MAX_RETRIES); 2826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 284303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE) 2856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* update failure count */ 2866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_main_update_fail_stats(); 2876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */ 2886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 2906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify app of result (if there was a pending command) */ 2926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->cur_cmd < RW_T3T_CMD_MAX) { 2936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If doing presence check, use status=NFC_STATUS_FAILED, otherwise 2946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * NFC_STATUS_TIMEOUT */ 2956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = status; 2966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt = rw_t3t_api_res_evt[p_cb->cur_cmd]; 2976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Set additional flags for RW_T3T_NDEF_DETECT_EVT */ 2996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (evt == RW_T3T_NDEF_DETECT_EVT) { 3006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.ndef.flags = RW_NDEF_FL_UNKNOWN; 3016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_update_ndef_flag(&evt_data.ndef.flags); 3026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 3036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(evt, &evt_data); 305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 3076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = status; 3086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_INTF_ERROR_EVT, &evt_data); 3096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_start_poll_timer 315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Start the timer for T3T POLL Command 317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_start_poll_timer(tRW_T3T_CB* p_cb) { 3226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_start_quick_timer(&p_cb->poll_timer, NFC_TTYPE_RW_T3T_RESPONSE, 3236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_POLL_CMD_TIMEOUT_TICKS); 324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_handle_nci_poll_ntf 329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle NCI_T3T_POLLING_NTF 331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_handle_nci_poll_ntf(uint8_t nci_status, uint8_t num_responses, 3366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t sensf_res_buf_size, 3376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_sensf_res_buf) { 3386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 3396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 3406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* stop timer for poll response */ 3426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_stop_quick_timer(&p_cb->poll_timer); 3436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Stop t3t timer (if started) */ 3456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->flags & RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP) { 3466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP; 3476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = nci_status; 3486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 3496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_PRESENCE_CHECK_EVT, (tRW_DATA*)&evt_data); 3506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->flags & RW_T3T_FL_W4_GET_SC_POLL_RSP) { 3516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Handle POLL ntf in response to get system codes */ 3526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_W4_GET_SC_POLL_RSP; 3536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_handle_get_sc_poll_rsp(p_cb, nci_status, num_responses, 3546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sensf_res_buf_size, p_sensf_res_buf); 3556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->flags & RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP) { 3566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Handle POLL ntf in response to get system codes */ 3576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP; 3586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_handle_fmt_poll_rsp(p_cb, nci_status, num_responses, 3596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sensf_res_buf_size, p_sensf_res_buf); 3606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->flags & RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP) { 3616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Handle POLL ntf in response to get system codes */ 3626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP; 3636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_handle_sro_poll_rsp(p_cb, nci_status, num_responses, 3646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sensf_res_buf_size, p_sensf_res_buf); 3656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->flags & RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP) { 3666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Handle POLL ntf in response to ndef detection */ 3676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP; 3686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_handle_ndef_detect_poll_rsp(p_cb, nci_status, num_responses, 3696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sensf_res_buf_size, p_sensf_res_buf); 3706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 3716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Handle POLL ntf in response to RW_T3tPoll */ 3720c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi evt_data.t3t_poll.status = nci_status; 3730c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (evt_data.t3t_poll.status == NCI_STATUS_OK) { 3746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.t3t_poll.rc = p_cb->cur_poll_rc; 3756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.t3t_poll.response_num = num_responses; 3766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.t3t_poll.response_bufsize = sensf_res_buf_size; 3776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.t3t_poll.response_buf = p_sensf_res_buf; 378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 3816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_POLL_EVT, &evt_data); 3826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 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*******************************************************************************/ 3946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_handle_get_system_codes_cplt(void) { 3956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 3966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 3976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t i; 3986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.t3t_sc.status = NFC_STATUS_OK; 4006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.t3t_sc.num_system_codes = p_cb->num_system_codes; 4016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.t3t_sc.p_system_codes = p_cb->system_codes; 4026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG1("rw_t3t_handle_get_system_codes_cplt, number of systems: %i", 4046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.t3t_sc.num_system_codes); 4056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (i = 0; i < evt_data.t3t_sc.num_system_codes; i++) { 4066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG2(" system %i: %04X", i, evt_data.t3t_sc.p_system_codes[i]); 4076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 4106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_GET_SYSTEM_CODES_EVT, &evt_data); 411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_format_cplt 416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Notify upper layer of format complete 418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 4226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_format_cplt(tNFC_STATUS status) { 4236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 4246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 4256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 4276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Update ndef info */ 4296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.status = status; 4306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (status == NFC_STATUS_OK) { 4316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.version = T3T_MSG_NDEF_VERSION; 4326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.nbr = RW_T3T_DEFAULT_FELICALITE_NBR; 4336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.nbw = RW_T3T_DEFAULT_FELICALITE_NBW; 4346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.nmaxb = RW_T3T_DEFAULT_FELICALITE_NMAXB; 4356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.writef = T3T_MSG_NDEF_WRITEF_OFF; 4366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.rwflag = T3T_MSG_NDEF_RWFLAG_RW; 4376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.ln = 0; 4386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify upper layer of format complete */ 4416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = status; 4426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_FORMAT_CPLT_EVT, &evt_data); 443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function rw_t3t_set_readonly_cplt 4485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 4495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description Notify upper layer of set read only complete 4505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 4515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns none 4525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 4535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/ 4546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_set_readonly_cplt(tNFC_STATUS status) { 4556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 4566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 4575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 4586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 4595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 4606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify upper layer of format complete */ 4616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = status; 4626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_SET_READ_ONLY_CPLT_EVT, &evt_data); 4635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 4645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 4655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/******************************************************************************* 4665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_process_timeout 468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process timeout 470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 4746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_process_timeout(TIMER_LIST_ENT* p_tle) { 4756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 4766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check which timer timed out */ 4796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_tle == &p_cb->timer) { 4806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi/* UPDATE/CHECK response timeout */ 481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 4826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR3("T3T timeout. state=%s cur_cmd=0x%02X (%s)", 4836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_state_str(rw_cb.tcb.t3t.rw_state), 4846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_cb.tcb.t3t.cur_cmd, 4856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_cmd_str(rw_cb.tcb.t3t.cur_cmd)); 486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else 4876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("T3T timeout. state=0x%02X cur_cmd=0x%02X", 4886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_cb.tcb.t3t.rw_state, rw_cb.tcb.t3t.cur_cmd); 489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_process_error(NFC_STATUS_TIMEOUT); 4926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 4936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0("T3T POLL timeout."); 4946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* POLL response timeout */ 4966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->flags & RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP) { 4976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* POLL timeout for presence check */ 4986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP; 4996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 5006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 5016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_PRESENCE_CHECK_EVT, (tRW_DATA*)&evt_data); 5026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->flags & RW_T3T_FL_W4_GET_SC_POLL_RSP) { 5036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* POLL timeout for getting system codes */ 5046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_W4_GET_SC_POLL_RSP; 5056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_handle_get_system_codes_cplt(); 5066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->flags & RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP) { 5076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* POLL timeout for formatting Felica Lite */ 5086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP; 5096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0("Felica-Lite tag not detected"); 5106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_format_cplt(NFC_STATUS_FAILED); 5116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->flags & RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP) { 5126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* POLL timeout for configuring Felica Lite read only */ 5136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP; 5146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0("Felica-Lite tag not detected"); 5156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_set_readonly_cplt(NFC_STATUS_FAILED); 5166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->flags & RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP) { 5176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* POLL timeout for ndef detection */ 5186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP; 5196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_handle_ndef_detect_poll_rsp(p_cb, NFC_STATUS_TIMEOUT, 0, 0, NULL); 5206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 5216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Timeout waiting for response for RW_T3tPoll */ 5226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.t3t_poll.status = NFC_STATUS_FAILED; 5236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 5246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_POLL_EVT, (tRW_DATA*)&evt_data); 5256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 5266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_process_frame_error 532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process frame crc error 534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 5386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_process_frame_error(void) { 539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 5406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR3("T3T frame error. state=%s cur_cmd=0x%02X (%s)", 5416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_state_str(rw_cb.tcb.t3t.rw_state), 5426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_cb.tcb.t3t.cur_cmd, rw_t3t_cmd_str(rw_cb.tcb.t3t.cur_cmd)); 543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else 5446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("T3T frame error. state=0x%02X cur_cmd=0x%02X", 5456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_cb.tcb.t3t.rw_state, rw_cb.tcb.t3t.cur_cmd); 546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 548303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE) 5496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Update stats */ 5506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_main_update_crc_error_stats(); 5516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */ 552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Process the error */ 5546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_process_error(NFC_STATUS_MSG_CORRUPTED); 555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_to_lower 560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send command to lower layer 562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns status of the send 564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 5666fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t3t_send_to_lower(NFC_HDR* p_msg) { 5676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p; 568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 569303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE) 5706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool is_retry; 5716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Update stats */ 5726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_main_update_tx_stats(p_msg->len, ((rw_cb.cur_retry == 0) ? false : true)); 5736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */ 5746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Set NFC-F SoD field (payload len + 1) */ 5766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->offset -= 1; /* Point to SoD field */ 5776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = (uint8_t*)(p_msg + 1) + p_msg->offset; 5786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, (p_msg->len + 1)); 5796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->len += 1; /* Increment len to include SoD */ 580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE) 5826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi DispT3TagMessage(p_msg, false); 583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_SendData(NFC_RF_CONN_ID, p_msg)); 586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_get_cmd_buf 591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Get a buffer for sending T3T messages 593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 5940a73688fae255d6c4730747caefaa134bd29b1d6Ruchi Kandoi** Returns NFC_HDR * 595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 5976fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoiNFC_HDR* rw_t3t_get_cmd_buf(void) { 5986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf; 599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 6000c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cmd_buf = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID); 6010c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cmd_buf != NULL) { 6026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Reserve offset for NCI_DATA_HDR and NFC-F Sod (LEN) field */ 6036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_buf->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE + 1; 6046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_buf->len = 0; 6056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 6076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (p_cmd_buf); 608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_cmd 613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send command to tag, and start timer for response 615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 6196fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t3t_send_cmd(tRW_T3T_CB* p_cb, uint8_t rw_t3t_cmd, 6206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf, uint32_t timeout_ticks) { 6216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval; 6226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Indicate first attempt to send command, back up cmd buffer in case needed 6246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * for retransmission */ 6256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_cb.cur_retry = 0; 6266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memcpy(p_cb->p_cur_cmd_buf, p_cmd_buf, 6276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sizeof(NFC_HDR) + p_cmd_buf->offset + p_cmd_buf->len); 6286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_cmd = rw_t3t_cmd; 6306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_tout = timeout_ticks; 6316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING; 6326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6330c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi retval = rw_t3t_send_to_lower(p_cmd_buf); 6340c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (retval == NFC_STATUS_OK) { 6356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Start timer for waiting for response */ 6366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_start_quick_timer(&p_cb->timer, NFC_TTYPE_RW_T3T_RESPONSE, 6376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi timeout_ticks); 6386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 6396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Error sending */ 6406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 6416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 6436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG3("rw_t3t_send_cmd: cur_tout: %d, timeout_ticks: %d ret:%d", 6446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_tout, timeout_ticks, retval); 6456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_update_ndef_attribute_cmd 651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send UPDATE command for Attribute Information 653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 6576fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t3t_send_update_ndef_attribute_cmd(tRW_T3T_CB* p_cb, 6586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool write_in_progress) { 6596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 6606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf; 6616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *p_cmd_start, *p; 6626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t checksum, i; 6636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t write_f; 6646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint32_t ln; 6656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_ndef_attr_info_start; 6666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6670c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cmd_buf = rw_t3t_get_cmd_buf(); 6680c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cmd_buf != NULL) { 6696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Construct T3T message */ 6706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset; 6716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add UPDATE opcode to message */ 6736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, T3T_MSG_OPC_UPDATE_CMD); 674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 6756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add IDm to message */ 6766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM(p, p_cb->peer_nfcid2, NCI_NFCID2_LEN); 6776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add Service code list */ 6796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 1); /* Number of services (only 1 service: NDEF) */ 6806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM( 6816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, T3T_MSG_NDEF_SC_RW); /* Service code (little-endian format) */ 6826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add number of blocks in this UPDATE command */ 6846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 1); /* Number of blocks to write in this command */ 6856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Block List element: the NDEF attribute information block (block 0) */ 6876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT); 6886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 0); 6896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add payload (Attribute information block) */ 6916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ndef_attr_info_start = 6926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p; /* Save start of a NDEF attribute info block for checksum */ 6936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, T3T_MSG_NDEF_VERSION); 6946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, p_cb->ndef_attrib.nbr); 6956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, p_cb->ndef_attrib.nbw); 6966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_BE_STREAM(p, p_cb->ndef_attrib.nmaxb); 6976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT32_TO_STREAM(p, 0); 6986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If starting NDEF write: set WriteF=ON, and ln=current ndef length */ 7006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (write_in_progress) { 7016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi write_f = T3T_MSG_NDEF_WRITEF_ON; 7026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ln = p_cb->ndef_attrib.ln; 7036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 7046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If finishing NDEF write: set WriteF=OFF, and ln=new ndef len */ 7056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else { 7066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi write_f = T3T_MSG_NDEF_WRITEF_OFF; 7076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ln = p_cb->ndef_msg_len; 7086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 7096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, write_f); 7106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, p_cb->ndef_attrib.rwflag); 7116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, (ln >> 16) & 0xFF); /* High byte (of 3) of Ln */ 7126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, (ln >> 8) & 0xFF); /* Middle byte (of 3) of Ln */ 7136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, (ln)&0xFF); /* Low byte (of 3) of Ln */ 7146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate and append Checksum */ 7166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi checksum = 0; 7176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (i = 0; i < T3T_MSG_NDEF_ATTR_INFO_SIZE; i++) { 7186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi checksum += p_ndef_attr_info_start[i]; 7196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 7206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_BE_STREAM(p, checksum); 7216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate length of message */ 7236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_buf->len = (uint16_t)(p - p_cmd_start); 7246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the T3T message */ 7266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = rw_t3t_send_cmd(p_cb, RW_T3T_CMD_UPDATE_NDEF, p_cmd_buf, 7276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_update_timeout(1)); 7286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 7296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = NFC_STATUS_NO_BUFFERS; 7306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 7316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_next_ndef_update_cmd 738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send next segment of NDEF message to update 740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 7446fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t3t_send_next_ndef_update_cmd(tRW_T3T_CB* p_cb) { 7456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 7466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t block_id; 7476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t first_block_to_write; 7486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t ndef_blocks_to_write, ndef_blocks_remaining; 7496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint32_t ndef_bytes_remaining, ndef_padding = 0; 7506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t flags = 0; 7516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_cur_ndef_src_offset; 7526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf; 7536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *p_cmd_start, *p; 7546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t blocks_per_update; 7556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint32_t timeout; 7566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7570c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cmd_buf = rw_t3t_get_cmd_buf(); 7580c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cmd_buf != NULL) { 7596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Construct T3T message */ 7606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset; 7616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate number of ndef bytes remaining to write */ 7636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ndef_bytes_remaining = p_cb->ndef_msg_len - p_cb->ndef_msg_bytes_sent; 7646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate number of blocks remaining to write */ 7666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ndef_blocks_remaining = 7676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (uint16_t)((ndef_bytes_remaining + 15) >> 7686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4); /* ndef blocks remaining (rounded upward) */ 7696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate first NDEF block ID for this UPDATE command */ 7716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi first_block_to_write = (uint16_t)((p_cb->ndef_msg_bytes_sent >> 4) + 1); 7726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate max number of blocks per write. */ 7746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((first_block_to_write + 7756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_MAX_NDEF_BLOCKS_PER_UPDATE_1_BYTE_FORMAT) < 0x100) { 7766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* All block-numbers are < 0x100 (i.e. can be specified using one-byte 7776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * format) */ 7786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi blocks_per_update = RW_T3T_MAX_NDEF_BLOCKS_PER_UPDATE_1_BYTE_FORMAT; 7796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 7806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Block-numbers are >= 0x100 (i.e. need to be specified using two-byte 7816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * format) */ 7826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi blocks_per_update = RW_T3T_MAX_NDEF_BLOCKS_PER_UPDATE_2_BYTE_FORMAT; 7836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 7846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if blocks_per_update is bigger than what peer allows */ 7866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (blocks_per_update > p_cb->ndef_attrib.nbw) 7876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi blocks_per_update = p_cb->ndef_attrib.nbw; 7886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if remaining blocks can fit into one UPDATE command */ 7906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (ndef_blocks_remaining <= blocks_per_update) { 7916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* remaining blocks can fit into one UPDATE command */ 7926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ndef_blocks_to_write = ndef_blocks_remaining; 7936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 7946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Remaining blocks cannot fit into one UPDATE command */ 7956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ndef_blocks_to_write = blocks_per_update; 7966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 7976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Write to command header for UPDATE */ 7996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add UPDATE opcode to message */ 8016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, T3T_MSG_OPC_UPDATE_CMD); 802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 8036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add IDm to message */ 8046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM(p, p_cb->peer_nfcid2, NCI_NFCID2_LEN); 8056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add Service code list */ 8076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 1); /* Number of services (only 1 service: NDEF) */ 8086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM( 8096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, T3T_MSG_NDEF_SC_RW); /* Service code (little-endian format) */ 8106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add number of blocks in this UPDATE command */ 8126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM( 8136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, 8146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ndef_blocks_to_write); /* Number of blocks to write in this command */ 8156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi timeout = rw_t3t_update_timeout(ndef_blocks_to_write); 8166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (block_id = first_block_to_write; 8186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi block_id < (first_block_to_write + ndef_blocks_to_write); block_id++) { 8196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (block_id < 256) { 8206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Block IDs 0-255 can be specified in '2-byte' format: byte0=0, 8216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * byte1=blocknumber */ 8226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM( 8236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT); /* byte0: len=1; 8246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi access-mode=0; 8256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi service code list 8266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi order=0 */ 8276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, block_id); /* byte1: block number */ 8286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 8296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Block IDs 256+ must be specified in '3-byte' format: byte0=80h, 8306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * followed by blocknumber */ 8316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM( 8326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, 8336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 0x00); /* byte0: len=0; access-mode=0; service code list order=0 */ 8346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM( 8356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, block_id); /* byte1-2: block number in little-endian format */ 8366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add NDEF payload */ 8406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If this sending last block of NDEF, check if padding is needed to make 8426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * payload a multiple of 16 bytes */ 8436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (ndef_blocks_to_write == ndef_blocks_remaining) { 8446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ndef_padding = (16 - (ndef_bytes_remaining & 0x0F)) & 0x0F; 8456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (ndef_padding) { 8466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi flags |= RW_T3T_FL_PADDING; 8476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ndef_blocks_to_write--; /* handle the last block separately if it needs 8486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi padding */ 8496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add NDEF payload to the message */ 8536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cur_ndef_src_offset = &p_cb->ndef_msg[p_cb->ndef_msg_bytes_sent]; 8546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM(p, p_cur_ndef_src_offset, (ndef_blocks_to_write * 16)); 8566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_msg_bytes_sent += ((uint32_t)ndef_blocks_to_write * 16); 8576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (flags & RW_T3T_FL_PADDING) { 8596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add last of the NDEF message */ 8606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cur_ndef_src_offset = &p_cb->ndef_msg[p_cb->ndef_msg_bytes_sent]; 8616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM(p, p_cur_ndef_src_offset, (int)(16 - ndef_padding)); 8626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_msg_bytes_sent += (16 - ndef_padding); 8636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add padding */ 8656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memset(p, 0, ndef_padding); 8666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p += ndef_padding; 8676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate length of message */ 8706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_buf->len = (uint16_t)(p - p_cmd_start); 8716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the T3T message */ 8736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = rw_t3t_send_cmd(p_cb, RW_T3T_CMD_UPDATE_NDEF, p_cmd_buf, timeout); 8746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 8756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = NFC_STATUS_NO_BUFFERS; 8766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_next_ndef_check_cmd 884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send command for reading next segment of NDEF message 886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 8906fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t3t_send_next_ndef_check_cmd(tRW_T3T_CB* p_cb) { 8916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 8926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t block_id; 8936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t ndef_blocks_remaining, first_block_to_read, cur_blocks_to_read; 8946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint32_t ndef_bytes_remaining; 8956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf; 8966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *p_cmd_start, *p; 8976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8980c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cmd_buf = rw_t3t_get_cmd_buf(); 8990c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cmd_buf != NULL) { 9006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Construct T3T message */ 9016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset; 9026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate number of ndef bytes remaining to read */ 9046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ndef_bytes_remaining = p_cb->ndef_attrib.ln - p_cb->ndef_rx_offset; 9056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate number of blocks remaining to read */ 9076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ndef_blocks_remaining = 9086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (uint16_t)((ndef_bytes_remaining + 15) >> 9096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4); /* ndef blocks remaining (rounded upward) */ 9106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate first NDEF block ID */ 9126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi first_block_to_read = (uint16_t)((p_cb->ndef_rx_offset >> 4) + 1); 9136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if remaining blocks can fit into one CHECK command */ 9156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (ndef_blocks_remaining <= p_cb->ndef_attrib.nbr) { 9166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* remaining blocks can fit into one CHECK command */ 9176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi cur_blocks_to_read = ndef_blocks_remaining; 9186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_rx_readlen = ndef_bytes_remaining; 9196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags |= RW_T3T_FL_IS_FINAL_NDEF_SEGMENT; 9206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 9216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Remaining blocks cannot fit into one CHECK command */ 9226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi cur_blocks_to_read = 9236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib 9246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi .nbr; /* Read maximum number of blocks allowed by the peer */ 9256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_rx_readlen = ((uint32_t)p_cb->ndef_attrib.nbr * 16); 9266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 9276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG3( 9296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "rw_t3t_send_next_ndef_check_cmd: bytes_remaining: %i, " 9306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "cur_blocks_to_read: %i, is_final: %i", 9316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ndef_bytes_remaining, cur_blocks_to_read, 9326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->flags & RW_T3T_FL_IS_FINAL_NDEF_SEGMENT)); 9336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add CHECK opcode to message */ 9356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, T3T_MSG_OPC_CHECK_CMD); 936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 9376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add IDm to message */ 9386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM(p, p_cb->peer_nfcid2, NCI_NFCID2_LEN); 9396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add Service code list */ 9416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 1); /* Number of services (only 1 service: NDEF) */ 9426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Service code (little-endian format) . If NDEF is read-only, then use 9446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * T3T_MSG_NDEF_SC_RO, otherwise use T3T_MSG_NDEF_SC_RW */ 9456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->ndef_attrib.rwflag == T3T_MSG_NDEF_RWFLAG_RO) { 9466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM(p, T3T_MSG_NDEF_SC_RO); 9476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 9486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM(p, T3T_MSG_NDEF_SC_RW); 9496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 9506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add number of blocks in this CHECK command */ 9526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM( 9536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, cur_blocks_to_read); /* Number of blocks to check in this command */ 9546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (block_id = first_block_to_read; 9566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi block_id < (first_block_to_read + cur_blocks_to_read); block_id++) { 9576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (block_id < 256) { 9586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Block IDs 0-255 can be specified in '2-byte' format: byte0=0, 9596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * byte1=blocknumber */ 9606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM( 9616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT); /* byte1: len=0; 9626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi access-mode=0; 9636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi service code list 9646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi order=0 */ 9656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, block_id); /* byte1: block number */ 9666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 9676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Block IDs 256+ must be specified in '3-byte' format: byte0=80h, 9686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * followed by blocknumber */ 9696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM( 9706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, 9716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 0x00); /* byte0: len=1; access-mode=0; service code list order=0 */ 9726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM( 9736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, block_id); /* byte1-2: block number in little-endian format */ 9746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 9756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 9766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate length of message */ 9786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_buf->len = (uint16_t)(p - p_cmd_start); 9796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the T3T message */ 9816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = rw_t3t_send_cmd(p_cb, RW_T3T_CMD_CHECK_NDEF, p_cmd_buf, 9826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_check_timeout(cur_blocks_to_read)); 9836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 9846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = NFC_STATUS_NO_BUFFERS; 9856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 9866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_message_set_block_list 993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Add block list to T3T message 995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Number of bytes added to message 997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 9996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_message_set_block_list(tRW_T3T_CB* p_cb, uint8_t** p, 10006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t num_blocks, 10016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tT3T_BLOCK_DESC* p_t3t_blocks) { 10026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t i, cur_service_code; 10036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t service_code_idx, num_services = 0; 10046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_msg_num_services; 10056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t service_list[T3T_MSG_SERVICE_LIST_MAX]; 1006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add CHECK or UPDATE opcode to message */ 10086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM( 10096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p), ((p_cb->cur_cmd == RW_T3T_CMD_CHECK) ? T3T_MSG_OPC_CHECK_CMD 10106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi : T3T_MSG_OPC_UPDATE_CMD)); 1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add IDm to message */ 10136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM((*p), p_cb->peer_nfcid2, NCI_NFCID2_LEN); 1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Skip over Number of Services field */ 10166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg_num_services = (*p); /* pointer to Number of Services offset */ 10176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p)++; 1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Count number of different services are specified in the list, and add 10206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * services to Service Code list */ 10216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (i = 0; i < num_blocks; i++) { 10226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi cur_service_code = p_t3t_blocks[i].service_code; 1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if current service_code is already in the service_list */ 10256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (service_code_idx = 0; service_code_idx < num_services; 10266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi service_code_idx++) { 10276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (service_list[service_code_idx] == cur_service_code) break; 10286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (service_code_idx == num_services) { 10316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Service not in the list yet. Add it. */ 10326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi service_list[service_code_idx] = cur_service_code; 10336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi num_services++; 1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add service code to T3T message */ 10366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM((*p), cur_service_code); 1037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 10386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add 'Number of Sservices' to the message */ 10416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *p_msg_num_services = num_services; 1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add 'number of blocks' to the message */ 10446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM((*p), num_blocks); 1045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add block descriptors */ 10476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (i = 0; i < num_blocks; i++) { 10486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi cur_service_code = p_t3t_blocks[i].service_code; 1049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if current service_code is already in the service_list */ 10516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (service_code_idx = 0; service_code_idx < num_services; 10526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi service_code_idx++) { 10536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (service_list[service_code_idx] == cur_service_code) break; 10546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add decriptor to T3T message */ 10576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_t3t_blocks[i].block_number > 0xFF) { 10586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM((*p), service_code_idx); 10596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM((*p), p_t3t_blocks[i].block_number); 10606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 10616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi service_code_idx |= T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT; 10626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM((*p), service_code_idx); 10636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM((*p), p_t3t_blocks[i].block_number); 1064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 10656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_check_cmd 1071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send CHECK command 1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 10776fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t3t_send_check_cmd(tRW_T3T_CB* p_cb, uint8_t num_blocks, 10786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tT3T_BLOCK_DESC* p_t3t_blocks) { 10796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf; 10806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *p, *p_cmd_start; 10816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 10826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 10836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_cmd = RW_T3T_CMD_CHECK; 10840c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cmd_buf = rw_t3t_get_cmd_buf(); 10850c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cmd_buf != NULL) { 10866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Construct T3T message */ 10876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset; 10886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_message_set_block_list(p_cb, &p, num_blocks, p_t3t_blocks); 10896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 10906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate length of message */ 10916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_buf->len = (uint16_t)(p - p_cmd_start); 10926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 10936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the T3T message */ 10946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = rw_t3t_send_cmd(p_cb, RW_T3T_CMD_CHECK, p_cmd_buf, 10956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_check_timeout(num_blocks)); 10966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 10976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = NFC_STATUS_NO_BUFFERS; 10986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 10996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_update_cmd 1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send UPDATE command 1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 11126fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t3t_send_update_cmd(tRW_T3T_CB* p_cb, uint8_t num_blocks, 11136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tT3T_BLOCK_DESC* p_t3t_blocks, 11146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_data) { 11156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf; 11166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *p, *p_cmd_start; 11176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 11186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_cmd = RW_T3T_CMD_UPDATE; 11200c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cmd_buf = rw_t3t_get_cmd_buf(); 11210c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cmd_buf != NULL) { 11226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Construct T3T message */ 11236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset; 11246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_message_set_block_list(p_cb, &p, num_blocks, p_t3t_blocks); 11256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add data blocks to the message */ 11276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM(p, p_data, num_blocks * 16); 11286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate length of message */ 11306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_buf->len = (uint16_t)(p - p_cmd_start); 11316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the T3T message */ 11336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = rw_t3t_send_cmd(p_cb, RW_T3T_CMD_UPDATE, p_cmd_buf, 11346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_update_timeout(num_blocks)); 11356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 11366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = NFC_STATUS_NO_BUFFERS; 11376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 11386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 11445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function rw_t3t_check_mc_block 11455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 11465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description Send command to check Memory Configuration Block 11475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 11485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns tNFC_STATUS 11495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 11505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*****************************************************************************/ 11516fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t3t_check_mc_block(tRW_T3T_CB* p_cb) { 11526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf; 11536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *p, *p_cmd_start; 11545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 11556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Read Memory Configuration block */ 11560c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cmd_buf = rw_t3t_get_cmd_buf(); 11570c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cmd_buf != NULL) { 11586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Construct T3T message */ 11596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset; 11605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 11616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add CHECK opcode to message */ 11626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, T3T_MSG_OPC_CHECK_CMD); 11635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 11646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add IDm to message */ 11656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM(p, p_cb->peer_nfcid2, NCI_NFCID2_LEN); 11666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add Service code list */ 11686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 1); /* Number of services (only 1 service: NDEF) */ 11696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM( 11706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, T3T_MSG_NDEF_SC_RO); /* Service code (little-endian format) */ 11716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Number of blocks */ 11736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 1); /* Number of blocks (only 1 block: Memory 11746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi Configuration Information ) */ 11756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Block List element: the Memory Configuration block (block 0x88) */ 11776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT); 11786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, T3T_MSG_FELICALITE_BLOCK_ID_MC); 11796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate length of message */ 11816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_buf->len = (uint16_t)(p - p_cmd_start); 11826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the T3T message */ 11846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return rw_t3t_send_cmd(p_cb, p_cb->cur_cmd, p_cmd_buf, 11856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_check_timeout(1)); 11866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 11876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0("Unable to allocate buffer to read MC block"); 11886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_NO_BUFFERS); 11896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 11905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 11915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 11925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/***************************************************************************** 11935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 1194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_raw_frame 1195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send raw frame 1197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 12016fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t3t_send_raw_frame(tRW_T3T_CB* p_cb, uint16_t len, 12026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_data) { 12036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf; 12046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p; 12056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 12066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12070c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cmd_buf = rw_t3t_get_cmd_buf(); 12080c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cmd_buf != NULL) { 12096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Construct T3T message */ 12106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset; 12116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add data blocks to the message */ 12136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM(p, p_data, len); 12146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate length of message */ 12166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_buf->len = len; 12176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the T3T message */ 12196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = rw_t3t_send_cmd(p_cb, RW_T3T_CMD_SEND_RAW_FRAME, p_cmd_buf, 12206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_RAW_FRAME_CMD_TIMEOUT_TICKS); 12216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 12226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = NFC_STATUS_NO_BUFFERS; 12236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 12246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 1226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** TAG RESPONSE HANDLERS 1230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 1231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_act_handle_ndef_detect_rsp 1235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to NDEF detection 1237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 12416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_act_handle_ndef_detect_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) { 12426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p; 12436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint32_t temp; 12446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t i; 12456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t checksum_calc, checksum_rx; 12466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DETECT_NDEF_DATA evt_data; 12476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset; 12486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 12506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.flags = RW_NDEF_FL_UNKNOWN; 12516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if response code is CHECK resp (for reading NDEF attribute block) */ 12536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) { 12546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: expecting rsp_code %02X, but got %02X", 12556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_OPC_CHECK_RSP, 12566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]); 1257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_FAILED; 12586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 12596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate status code and NFCID2 response from tag */ 12606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != 12616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_RSP_STATUS_OK) /* verify response status code */ 12626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi || (memcmp(p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM], 12636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_NFCID2_LEN) != 0)) /* verify response IDm */ 12646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 12656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 12666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 12676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Get checksum from received ndef attribute msg */ 12686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = &p_t3t_rsp[T3T_MSG_RSP_OFFSET_CHECK_DATA + T3T_MSG_NDEF_ATTR_INFO_SIZE]; 12696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi BE_STREAM_TO_UINT16(checksum_rx, p); 12706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate checksum - move check for checsum to beginning */ 12726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi checksum_calc = 0; 12736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = &p_t3t_rsp[T3T_MSG_RSP_OFFSET_CHECK_DATA]; 12746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (i = 0; i < T3T_MSG_NDEF_ATTR_INFO_SIZE; i++) { 12756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi checksum_calc += p[i]; 12766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 12776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate checksum */ 12796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (checksum_calc != checksum_rx) { 12806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.status = 12816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_STATUS_FAILED; /* only ok or failed passed to the app. can be 12826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi boolean*/ 12836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0("RW_T3tDetectNDEF checksum failed"); 12856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 12866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.status = NFC_STATUS_OK; 12876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate version number */ 12896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi STREAM_TO_UINT8(p_cb->ndef_attrib.version, p); 12906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (T3T_GET_MAJOR_VERSION(T3T_MSG_NDEF_VERSION) < 12926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_GET_MAJOR_VERSION(p_cb->ndef_attrib.version)) { 12936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Remote tag's MajorVer is newer than our's. Reject NDEF as per T3TOP 12946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * RQ_T3T_NDA_024 */ 12956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2( 12966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "RW_T3tDetectNDEF: incompatible NDEF version. Local=0x%02x, " 12976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "Remote=0x%02x", 12986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_NDEF_VERSION, p_cb->ndef_attrib.version); 12996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.status = NFC_STATUS_FAILED; 13006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_BAD_RESP; 13016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 13026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Remote tag's MajorVer is equal or older than our's. NDEF is 13036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * compatible with our version. */ 13046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 13056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Update NDEF info */ 13066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi STREAM_TO_UINT8( 13076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.nbr, 13086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p); /* NBr: number of blocks that can be read using one Check 13096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi command */ 13106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi STREAM_TO_UINT8(p_cb->ndef_attrib.nbw, 13116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p); /* Nbw: number of blocks that can be written using 13126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi one Update command */ 13136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi BE_STREAM_TO_UINT16( 13146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.nmaxb, 13156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p); /* Nmaxb: maximum number of blocks available for NDEF data */ 13166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi BE_STREAM_TO_UINT32(temp, p); 13176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi STREAM_TO_UINT8(p_cb->ndef_attrib.writef, 13186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p); /* WriteFlag: 00h if writing data finished; 0Fh if 13196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi writing data in progress */ 13206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi STREAM_TO_UINT8( 13216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.rwflag, 13226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p); /* RWFlag: 00h NDEF is read-only; 01h if read/write available */ 13236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 13246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Get length (3-byte, big-endian) */ 13256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi STREAM_TO_UINT8(temp, p); /* Ln: high-byte */ 13266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi BE_STREAM_TO_UINT16(p_cb->ndef_attrib.ln, p); /* Ln: lo-word */ 13276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.ln += (temp << 16); 13286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 13296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG1("Detected NDEF Ver: 0x%02x", p_cb->ndef_attrib.version); 13306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG6( 13316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "Detected NDEF Attributes: Nbr=%i, Nbw=%i, Nmaxb=%i, WriteF=%i, " 13326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "RWFlag=%i, Ln=%i", 13336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.nbr, p_cb->ndef_attrib.nbw, 13346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.nmaxb, p_cb->ndef_attrib.writef, 13356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.rwflag, p_cb->ndef_attrib.ln); 13366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 13376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Set data for RW_T3T_NDEF_DETECT_EVT */ 13386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = p_cb->ndef_attrib.status; 13396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.cur_size = p_cb->ndef_attrib.ln; 13406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.max_size = (uint32_t)p_cb->ndef_attrib.nmaxb * 16; 13416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.protocol = NFC_PROTOCOL_T3T; 13426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.flags = (RW_NDEF_FL_SUPPORTED | RW_NDEF_FL_FORMATED); 13436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->ndef_attrib.rwflag == T3T_MSG_NDEF_RWFLAG_RO) 13446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.flags |= RW_NDEF_FL_READ_ONLY; 13456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 13476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 13496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG1("RW_T3tDetectNDEF response: %i", evt_data.status); 1350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 13516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 13526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_update_ndef_flag(&evt_data.flags); 13536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify app of NDEF detection result */ 13546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_NDEF_DETECT_EVT, (tRW_DATA*)&evt_data); 1355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 13566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg_rsp); 1357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_act_handle_check_rsp 1362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to CHECK command 1364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 13686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_act_handle_check_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) { 13696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset; 13706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_READ_DATA evt_data; 13716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS nfc_status = NFC_STATUS_OK; 13726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 13736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response from tag */ 13746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != 13756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_RSP_STATUS_OK) /* verify response status code */ 13766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi || (memcmp(p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM], 13776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_NFCID2_LEN) != 0)) /* verify response IDm */ 13786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 13796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_status = NFC_STATUS_FAILED; 13806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg_rsp); 13816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) { 13826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: expecting rsp_code %02X, but got %02X", 13836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_OPC_CHECK_RSP, 13846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]); 13856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_status = NFC_STATUS_FAILED; 13866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg_rsp); 13876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 13886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Copy incoming data into buffer */ 13896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg_rsp->offset += 13906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_RSP_OFFSET_CHECK_DATA; /* Skip over t3t header */ 13916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg_rsp->len -= T3T_MSG_RSP_OFFSET_CHECK_DATA; 13926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_OK; 13936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.p_data = p_msg_rsp; 13946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_CHECK_EVT, (tRW_DATA*)&evt_data); 13956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 13976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 1398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 13996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_CHECK_CPLT_EVT, (tRW_DATA*)&nfc_status); 1400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_act_handle_update_rsp 1405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to UPDATE command 1407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 14116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_act_handle_update_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) { 14126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset; 14136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_READ_DATA evt_data; 14146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 14156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response from tag */ 14166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != 14176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_RSP_STATUS_OK) /* verify response status code */ 14186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi || (memcmp(p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM], 14196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_NFCID2_LEN) != 0)) /* verify response IDm */ 14206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 14216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 14226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) { 14236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: expecting rsp_code %02X, but got %02X", 14246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_OPC_UPDATE_RSP, 14256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]); 14266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 14276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 14286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Copy incoming data into buffer */ 14296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_OK; 14306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 14326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 1433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 14346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_UPDATE_CPLT_EVT, (tRW_DATA*)&evt_data); 1435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 14366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg_rsp); 1437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_act_handle_raw_senddata_rsp 1442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to NDEF detection 1444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 14486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_act_handle_raw_senddata_rsp(tRW_T3T_CB* p_cb, 14496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_DATA_CEVT* p_data) { 14506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_READ_DATA evt_data; 14516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_pkt = p_data->p_data; 1452a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 1453a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#if (BT_TRACE_VERBOSE == TRUE) 14546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG2("RW T3T Raw Frame: Len [0x%X] Status [%s]", p_pkt->len, 14556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_GetStatusName(p_data->status)); 1456a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#else 14576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG2("RW T3T Raw Frame: Len [0x%X] Status [0x%X]", p_pkt->len, 14586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_data->status); 1459a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#endif 1460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 14616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Copy incoming data into buffer */ 14626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = p_data->status; 14636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.p_data = p_pkt; 1464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 14656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 1466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 14676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_RAW_FRAME_EVT, (tRW_DATA*)&evt_data); 1468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_act_handle_check_ndef_rsp 1473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to NDEF read segment 1475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 14796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_act_handle_check_ndef_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) { 14806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool check_complete = true; 14816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS nfc_status = NFC_STATUS_OK; 14826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_READ_DATA read_data; 14836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 14846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset; 14856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t rsp_num_bytes_rx; 14866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 14876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response from tag */ 14886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != 14896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_RSP_STATUS_OK) /* verify response status code */ 14906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi || (memcmp(p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM], 14916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_NFCID2_LEN) != 0) /* verify response IDm */ 14926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi || (p_t3t_rsp[T3T_MSG_RSP_OFFSET_NUMBLOCKS] != 14936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_cb->ndef_rx_readlen + 15) >> 4))) /* verify length of response */ 14946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 14956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: bad status, nfcid2, or invalid len: %i %i", 14966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_NUMBLOCKS], 14976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_cb->ndef_rx_readlen + 15) >> 4)); 14986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_status = NFC_STATUS_FAILED; 14996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg_rsp); 15006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) { 15016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: expecting rsp_code %02X, but got %02X", 15026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_OPC_CHECK_RSP, 15036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]); 15046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_status = NFC_STATUS_FAILED; 15056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg_rsp); 15066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 15076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify app of NDEF segment received */ 15086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rsp_num_bytes_rx = p_t3t_rsp[T3T_MSG_RSP_OFFSET_NUMBLOCKS] * 15096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16; /* Number of bytes received, according to header */ 15106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_rx_offset += p_cb->ndef_rx_readlen; 15116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi read_data.status = NFC_STATUS_OK; 15126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg_rsp->offset += 15136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_RSP_OFFSET_CHECK_DATA; /* Skip over t3t header (point to block 15146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi data) */ 15156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg_rsp->len -= T3T_MSG_RSP_OFFSET_CHECK_DATA; 15166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 15176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Verify that the bytes received is really the amount indicated in the 15186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * check-response header */ 15196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (rsp_num_bytes_rx > p_msg_rsp->len) { 15206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2( 15216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "Response error: CHECK rsp header indicates %i bytes, but only " 15226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "received %i bytes", 15236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rsp_num_bytes_rx, p_msg_rsp->len); 15246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_status = NFC_STATUS_FAILED; 15256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg_rsp); 15266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 15276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If this is the the final block, then set len to reflect only valid 15286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * bytes (do not include padding to 16-byte boundary) */ 15296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_cb->flags & RW_T3T_FL_IS_FINAL_NDEF_SEGMENT) && 15306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->ndef_attrib.ln & 0x000F)) { 15316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rsp_num_bytes_rx -= (16 - (p_cb->ndef_attrib.ln & 0x000F)); 15326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 15336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 15346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg_rsp->len = rsp_num_bytes_rx; 15356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi read_data.p_data = p_msg_rsp; 15366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_CHECK_EVT, (tRW_DATA*)&read_data); 15376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 15386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send CHECK cmd for next NDEF segment, if needed */ 15396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (!(p_cb->flags & RW_T3T_FL_IS_FINAL_NDEF_SEGMENT)) { 15400c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi nfc_status = rw_t3t_send_next_ndef_check_cmd(p_cb); 15410c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (nfc_status == NFC_STATUS_OK) { 15426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Still getting more segments. Don't send RW_T3T_CHECK_CPLT_EVT yet 15436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi */ 15446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi check_complete = false; 15456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 15466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 15476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 15486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 15496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 15506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify app of RW_T3T_CHECK_CPLT_EVT if entire NDEF has been read, or if 15516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * failure */ 15526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (check_complete) { 15536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 15546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = nfc_status; 15556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_CHECK_CPLT_EVT, (tRW_DATA*)&evt_data); 15566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_act_handle_update_ndef_rsp 1562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to NDEF write segment 1564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 15686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_act_handle_update_ndef_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) { 15696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool update_complete = true; 15706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS nfc_status = NFC_STATUS_OK; 15716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 15726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset; 15736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 15746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check nfcid2 and status of response */ 15756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != 15766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_RSP_STATUS_OK) /* verify response status code */ 15776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi || (memcmp(p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM], 15786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_NFCID2_LEN) != 0)) /* verify response IDm */ 15796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 15806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_status = NFC_STATUS_FAILED; 15816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 15826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response opcode */ 15836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) { 15846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: expecting rsp_code %02X, but got %02X", 15856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_OPC_UPDATE_RSP, 15866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]); 15876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_status = NFC_STATUS_FAILED; 15886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 15896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If this is response to final UPDATE, then update NDEF local size */ 15906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (p_cb->flags & RW_T3T_FL_IS_FINAL_NDEF_SEGMENT) { 15916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If successful, update current NDEF size */ 15926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.ln = p_cb->ndef_msg_len; 15936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 15946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If any more NDEF bytes to update, then send next UPDATE command */ 15956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (p_cb->ndef_msg_bytes_sent < p_cb->ndef_msg_len) { 15966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send UPDATE command for next segment of NDEF */ 15970c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi nfc_status = rw_t3t_send_next_ndef_update_cmd(p_cb); 15980c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (nfc_status == NFC_STATUS_OK) { 15996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Wait for update response */ 16006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi update_complete = false; 16016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 16026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 16036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Otherwise, no more NDEF bytes. Send final UPDATE for Attribute Information 16046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi block */ 16056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else { 16066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags |= RW_T3T_FL_IS_FINAL_NDEF_SEGMENT; 16070c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi nfc_status = rw_t3t_send_update_ndef_attribute_cmd(p_cb, false); 16080c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (nfc_status == NFC_STATUS_OK) { 16096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Wait for update response */ 16106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi update_complete = false; 16116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 16126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 16136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If update is completed, then notify app */ 16156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (update_complete) { 16166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 16176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = nfc_status; 16186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_UPDATE_CPLT_EVT, (tRW_DATA*)&evt_data); 16196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 16216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg_rsp); 1622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 16236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return; 1624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_handle_get_sc_poll_rsp 1629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle POLL response for getting system codes 1631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 16356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t3t_handle_get_sc_poll_rsp(tRW_T3T_CB* p_cb, uint8_t nci_status, 16366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t num_responses, 16376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t sensf_res_buf_size, 16386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_sensf_res_buf) { 16396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p; 16406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t sc; 16416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Get the system code from the response */ 16436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nci_status == NCI_STATUS_OK) && (num_responses > 0) && 16446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (sensf_res_buf_size >= 16456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (RW_T3T_SENSF_RES_RD_OFFSET + RW_T3T_SENSF_RES_RD_LEN))) { 16466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = &p_sensf_res_buf[RW_T3T_SENSF_RES_RD_OFFSET]; 16476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi BE_STREAM_TO_UINT16(sc, p); 16486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG1("FeliCa detected (RD, system code %04X)", sc); 16506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->system_codes[p_cb->num_system_codes++] = sc; 16516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 16526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_handle_get_system_codes_cplt(); 1654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_handle_ndef_detect_poll_rsp 1659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle POLL response for getting system codes 16616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi** 16626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi** Returns Nothing 16636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi** 16646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi*****************************************************************************/ 16656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t3t_handle_ndef_detect_poll_rsp(tRW_T3T_CB* p_cb, 16666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t nci_status, 16676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t num_responses, 16686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t sensf_res_buf_size, 16696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_sensf_res_buf) { 16706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf; 16716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *p, *p_cmd_start; 16726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 16736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response for NDEF poll */ 16756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nci_status == NCI_STATUS_OK) && (num_responses > 0)) { 16766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Tag responded for NDEF poll */ 16776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Read NDEF attribute block */ 16790c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cmd_buf = rw_t3t_get_cmd_buf(); 16800c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cmd_buf != NULL) { 16816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Construct T3T message */ 16826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset; 16836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add CHECK opcode to message */ 16856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, T3T_MSG_OPC_CHECK_CMD); 16866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add IDm to message */ 16886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM(p, p_cb->peer_nfcid2, NCI_NFCID2_LEN); 16896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add Service code list */ 16916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 1); /* Number of services (only 1 service: NDEF) */ 16926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM( 16936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, T3T_MSG_NDEF_SC_RO); /* Service code (little-endian format) */ 16946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Number of blocks */ 16966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM( 16976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, 16986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1); /* Number of blocks (only 1 block: NDEF Attribute Information ) */ 16996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 17006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Block List element: the NDEF attribute information block (block 0) */ 17016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT); 17026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 0); 17036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 17046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate length of message */ 17056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_buf->len = (uint16_t)(p - p_cmd_start); 17066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 17076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the T3T message */ 17080c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi evt_data.status = rw_t3t_send_cmd(p_cb, RW_T3T_CMD_DETECT_NDEF, p_cmd_buf, 17090c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi rw_t3t_check_timeout(1)); 17100c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (evt_data.status == NFC_STATUS_OK) { 17116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* CHECK command sent. Wait for response */ 17126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return; 17136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 17156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nci_status = NFC_STATUS_FAILED; 17166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* NDEF detection failed */ 17196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 17206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.ndef.status = nci_status; 17216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.ndef.flags = RW_NDEF_FL_UNKNOWN; 17226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_update_ndef_flag(&evt_data.ndef.flags); 17236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_NDEF_DETECT_EVT, &evt_data); 1724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_update_block 1729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 17305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description Send UPDATE command for single block 17315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** (for formatting/configuring read only) 1732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 17366fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t3t_update_block(tRW_T3T_CB* p_cb, uint8_t block_id, 17376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_block_data) { 17386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *p_dst, *p_cmd_start; 17396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf; 17406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS status; 1741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17420c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cmd_buf = rw_t3t_get_cmd_buf(); 17430c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cmd_buf != NULL) { 17446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_dst = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset; 1745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add UPDATE opcode to message */ 17476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p_dst, T3T_MSG_OPC_UPDATE_CMD); 1748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add IDm to message */ 17506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM(p_dst, p_cb->peer_nfcid2, NCI_NFCID2_LEN); 1751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add Service code list */ 17536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p_dst, 1); /* Number of services (only 1 service: NDEF) */ 17546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM( 17556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_dst, T3T_MSG_NDEF_SC_RW); /* Service code (little-endian format) */ 1756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Number of blocks */ 17586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p_dst, 1); 1759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add Block list element for MC */ 17616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p_dst, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT); 17626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p_dst, block_id); 1763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Copy MC data to UPDATE message */ 17656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM(p_dst, p_block_data, T3T_MSG_BLOCKSIZE); 1766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate length of message */ 17686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_buf->len = (uint16_t)(p_dst - p_cmd_start); 1769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the T3T message */ 17716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = rw_t3t_send_cmd(p_cb, p_cb->cur_cmd, p_cmd_buf, 17726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_update_timeout(1)); 17736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 17746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Unable to send UPDATE command */ 17756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = NFC_STATUS_NO_BUFFERS; 17766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (status); 1779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_handle_fmt_poll_rsp 1784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle POLL response for formatting felica-lite 1786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 17906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t3t_handle_fmt_poll_rsp(tRW_T3T_CB* p_cb, uint8_t nci_status, 17916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t num_responses, 17926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t sensf_res_buf_size, 17936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_sensf_res_buf) { 17946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 17956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 17966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_OK; 17976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 17986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response for poll response */ 17996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nci_status == NCI_STATUS_OK) && (num_responses > 0)) { 18006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Tag responded for Felica-Lite poll */ 18016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Get MemoryControl block */ 18026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG0("Felica-Lite tag detected...getting Memory Control block."); 18036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 18046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_substate = RW_T3T_FMT_SST_CHECK_MC_BLK; 18056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 18066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send command to check Memory Configuration block */ 18076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = rw_t3t_check_mc_block(p_cb); 18086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 18096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0("Felica-Lite tag not detected"); 18106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 18116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 18136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If error, notify upper layer */ 18146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (evt_data.status != NFC_STATUS_OK) { 18156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_format_cplt(evt_data.status); 18166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_act_handle_fmt_rsp 1822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response for formatting codes 1824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 18286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_act_handle_fmt_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) { 18296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset; 18306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_mc; 18316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 1832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 18336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_OK; 1834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 18356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check tags's response for reading MemoryControl block */ 18366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_substate == RW_T3T_FMT_SST_CHECK_MC_BLK) { 18376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response opcode */ 18386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) { 18396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: expecting rsp_code %02X, but got %02X", 18406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_OPC_CHECK_RSP, 18416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]); 18426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 18436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 18446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate status code and NFCID2 response from tag */ 18456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != 18466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_RSP_STATUS_OK) /* verify response status code */ 18476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi || (memcmp(p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM], 18486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_NFCID2_LEN) != 0)) /* verify response IDm */ 18496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 18506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 18516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 18526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if memory configuration (MC) block to see if SYS_OP=1 (NDEF 18536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * enabled) */ 18546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_mc = &p_t3t_rsp[T3T_MSG_RSP_OFFSET_CHECK_DATA]; /* Point to MC data of 18556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi CHECK response */ 18566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 18576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_mc[T3T_MSG_FELICALITE_MC_OFFSET_SYS_OP] != 0x01) { 18586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Tag is not currently enabled for NDEF. Indicate that we need to 18596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * update the MC block */ 18606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 18616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Set SYS_OP field to 0x01 (enable NDEF) */ 18626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_mc[T3T_MSG_FELICALITE_MC_OFFSET_SYS_OP] = 0x01; 18636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 18646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Set RF_PRM field to 0x07 (procedure of issuance) */ 18656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_mc[T3T_MSG_FELICALITE_MC_OFFSET_RF_PRM] = 0x07; 18666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 18676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Construct and send UPDATE message to write MC block */ 18686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_substate = RW_T3T_FMT_SST_UPDATE_MC_BLK; 18696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = 18706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_update_block(p_cb, T3T_MSG_FELICALITE_BLOCK_ID_MC, p_mc); 18716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 18726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* SYS_OP=1: ndef already enabled. Just need to update attribute 18736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * information block */ 18746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_substate = RW_T3T_FMT_SST_UPDATE_NDEF_ATTRIB; 18756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = 18766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_update_block(p_cb, 0, (uint8_t*)rw_t3t_default_attrib_info); 18776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 18806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If error, notify upper layer */ 18816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (evt_data.status != NFC_STATUS_OK) { 18826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_format_cplt(evt_data.status); 1883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 18846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->rw_substate == RW_T3T_FMT_SST_UPDATE_MC_BLK) { 18856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response opcode */ 18866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) || 18876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK)) 1888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 18896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 18906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: rsp_code=%02X, status=%02X", 18916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE], 18926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]); 18936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 18946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 18956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* SYS_OP=1: ndef already enabled. Just need to update attribute 18966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * information block */ 18976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_substate = RW_T3T_FMT_SST_UPDATE_NDEF_ATTRIB; 18986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = 18996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_update_block(p_cb, 0, (uint8_t*)rw_t3t_default_attrib_info); 19006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 19026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If error, notify upper layer */ 19036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (evt_data.status != NFC_STATUS_OK) { 19046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_format_cplt(evt_data.status); 19056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 19066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->rw_substate == RW_T3T_FMT_SST_UPDATE_NDEF_ATTRIB) { 19076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response opcode */ 19086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) || 19096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK)) 1910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 19116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 19126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: rsp_code=%02X, status=%02X", 19136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE], 19146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]); 19156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 1916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 19186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_format_cplt(evt_data.status); 19196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 19206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 19216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg_rsp); 1922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 19245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/***************************************************************************** 19255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 19265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function rw_t3t_handle_sro_poll_rsp 19275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 19285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description Handle POLL response for configuring felica-lite read only 19295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 19305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns Nothing 19315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 19325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*****************************************************************************/ 19336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t3t_handle_sro_poll_rsp(tRW_T3T_CB* p_cb, uint8_t nci_status, 19346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t num_responses, 19356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t sensf_res_buf_size, 19366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_sensf_res_buf) { 19376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 19386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t rw_t3t_ndef_attrib_info[T3T_MSG_BLOCKSIZE]; 19396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p; 19406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t tempU8; 19416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t checksum, i; 19426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint32_t tempU32 = 0; 19436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 19446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_OK; 19456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 19466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response for poll response */ 19476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nci_status == NCI_STATUS_OK) && (num_responses > 0)) { 19486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Tag responded for Felica-Lite poll */ 19496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->ndef_attrib.rwflag != T3T_MSG_NDEF_RWFLAG_RO) { 19506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* First update attribute information block */ 19516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG0( 19526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "Felica-Lite tag detected...update NDef attribution block."); 19536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 19546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_substate = RW_T3T_SRO_SST_UPDATE_NDEF_ATTRIB; 19556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 19566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = rw_t3t_ndef_attrib_info; 19576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 19586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, p_cb->ndef_attrib.version); 19596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 19606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Update NDEF info */ 19616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM( 19626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, p_cb->ndef_attrib.nbr); /* NBr: number of blocks that can be read 19636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi using one Check command */ 19646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, p_cb->ndef_attrib.nbw); /* Nbw: number of blocks that 19656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi can be written using one 19666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi Update command */ 19676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_BE_STREAM( 19686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, p_cb->ndef_attrib.nmaxb); /* Nmaxb: maximum number of blocks 19696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi available for NDEF data */ 19706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT32_TO_BE_STREAM(p, tempU32); 19716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 19726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.writef); /* WriteFlag: 00h if writing 19736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi data finished; 0Fh if 19746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi writing data in progress */ 19756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 0x00); /* RWFlag: 00h NDEF is read-only */ 19766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 19776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tempU8 = (uint8_t)(p_cb->ndef_attrib.ln >> 16); 19786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Get length (3-byte, big-endian) */ 19796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, tempU8); /* Ln: high-byte */ 19806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_BE_STREAM(p, p_cb->ndef_attrib.ln); /* Ln: lo-word */ 19816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 19826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate and append Checksum */ 19836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi checksum = 0; 19846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (i = 0; i < T3T_MSG_NDEF_ATTR_INFO_SIZE; i++) { 19856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi checksum += rw_t3t_ndef_attrib_info[i]; 19866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 19876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_BE_STREAM(p, checksum); 19886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 19896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = 19906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_update_block(p_cb, 0, (uint8_t*)rw_t3t_ndef_attrib_info); 19916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->cur_cmd == RW_T3T_CMD_SET_READ_ONLY_HARD) { 19926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* NDEF is already read only, Read and update MemoryControl block */ 19936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG0( 19946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "Felica-Lite tag detected...getting Memory Control block."); 19956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_substate = RW_T3T_SRO_SST_CHECK_MC_BLK; 19966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 19976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send command to check Memory Configuration block */ 19986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = rw_t3t_check_mc_block(p_cb); 19996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 20006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 20016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0("Felica-Lite tag not detected"); 20026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 20036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 20045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If error, notify upper layer */ 20066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (evt_data.status != NFC_STATUS_OK) { 20076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_set_readonly_cplt(evt_data.status); 20086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 20095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 20105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/***************************************************************************** 20125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 20135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function rw_t3t_act_handle_sro_rsp 20145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 20155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description Handle response for setting read only codes 20165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 20175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns Nothing 20185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 20195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*****************************************************************************/ 20206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_act_handle_sro_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) { 20216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset; 20226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_mc; 20236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 20245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_OK; 20265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_substate == RW_T3T_SRO_SST_UPDATE_NDEF_ATTRIB) { 20286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response opcode */ 20296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) || 20306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK)) 20315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 20336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: rsp_code=%02X, status=%02X", 20346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE], 20356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]); 20366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 20376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 20386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.rwflag = T3T_MSG_NDEF_RWFLAG_RO; 20396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->cur_cmd == RW_T3T_CMD_SET_READ_ONLY_HARD) { 20406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_substate = RW_T3T_SRO_SST_CHECK_MC_BLK; 20415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send command to check Memory Configuration block */ 20436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = rw_t3t_check_mc_block(p_cb); 20446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 20456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_set_readonly_cplt(evt_data.status); 20466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 20476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 20486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->rw_substate == RW_T3T_SRO_SST_CHECK_MC_BLK) { 20496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check tags's response for reading MemoryControl block, Validate response 20506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * opcode */ 20516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) { 20526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: expecting rsp_code %02X, but got %02X", 20536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_OPC_CHECK_RSP, 20546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]); 20556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 20565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 20576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate status code and NFCID2 response from tag */ 20586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != 20596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_RSP_STATUS_OK) /* verify response status code */ 20606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi || (memcmp(p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM], 20616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_NFCID2_LEN) != 0)) /* verify response IDm */ 20626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 20636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 20646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 20656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if memory configuration (MC) block to see if SYS_OP=1 (NDEF 20666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * enabled) */ 20676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_mc = &p_t3t_rsp[T3T_MSG_RSP_OFFSET_CHECK_DATA]; /* Point to MC data of 20686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi CHECK response */ 20696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 20706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_mc[T3T_MSG_FELICALITE_MC_OFFSET_SYS_OP] != 0x01) { 20716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Tag is not currently enabled for NDEF */ 20726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 20736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 20746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Set MC_SP field with MC[0] = 0x00 & MC[1] = 0xC0 (Hardlock) to change 20756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * access permission from RW to RO */ 20766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_mc[T3T_MSG_FELICALITE_MC_OFFSET_MC_SP] = 0x00; 20776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Not changing the access permission of Subtraction Register and 20786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * MC[0:1] */ 20796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_mc[T3T_MSG_FELICALITE_MC_OFFSET_MC_SP + 1] = 0xC0; 20806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 20816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Set RF_PRM field to 0x07 (procedure of issuance) */ 20826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_mc[T3T_MSG_FELICALITE_MC_OFFSET_RF_PRM] = 0x07; 20836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 20846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Construct and send UPDATE message to write MC block */ 20856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_substate = RW_T3T_SRO_SST_UPDATE_MC_BLK; 20866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = 20876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_update_block(p_cb, T3T_MSG_FELICALITE_BLOCK_ID_MC, p_mc); 20886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 20896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 20906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->rw_substate == RW_T3T_SRO_SST_UPDATE_MC_BLK) { 20916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response opcode */ 20926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) || 20936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK)) 20945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 20966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: rsp_code=%02X, status=%02X", 20976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE], 20986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]); 20996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 21006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 21016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_set_readonly_cplt(evt_data.status); 21025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 21036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 21045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 21056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If error, notify upper layer */ 21066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (evt_data.status != NFC_STATUS_OK) { 21076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_set_readonly_cplt(evt_data.status); 21086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 21096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 21106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg_rsp); 21115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 21125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 2113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_data_cback 2116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This callback function receives the data from NFCC. 2118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 2120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 21226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_data_cback(uint8_t conn_id, tNFC_DATA_CEVT* p_data) { 21236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 21246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_msg = p_data->p_data; 21256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool free_msg = false; /* if TRUE, free msg buffer before returning */ 21266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *p, sod; 2127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 21286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Stop rsponse timer */ 21296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_stop_quick_timer(&p_cb->timer); 2130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2131303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE) 21326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Update rx stats */ 21336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_main_update_rx_stats(p_msg->len); 21346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */ 21356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 21366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if we are expecting a response */ 21376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state != RW_T3T_STATE_COMMAND_PENDING) { 21386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* 21396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ** This must be raw frame response 21406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ** send raw frame to app with SoD 21416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi */ 21426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_act_handle_raw_senddata_rsp(p_cb, p_data); 21436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 21446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Sanity check: verify msg len is big enough to contain t3t header */ 21456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (p_msg->len < T3T_MSG_RSP_COMMON_HDR_LEN) { 21466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("T3T: invalid Type3 Tag Message (invalid len: %i)", 21476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->len); 21486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi free_msg = true; 21496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 21506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_process_frame_error(); 21516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 21526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check for RF frame error */ 21536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = (uint8_t*)(p_msg + 1) + p_msg->offset; 21546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sod = p[0]; 21556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p[sod] != NCI_STATUS_OK) { 21566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("T3T: rf frame error (crc status=%i)", p[sod]); 21576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg); 21586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 21596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_process_frame_error(); 21606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return; 2161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE) 21646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi DispT3TagMessage(p_msg, true); 2165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 2166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 21676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Skip over SoD */ 21686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->offset++; 21696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->len--; 2170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 21716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Get response code */ 21726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (p_cb->cur_cmd) { 21736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case RW_T3T_CMD_DETECT_NDEF: 21746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_act_handle_ndef_detect_rsp(p_cb, p_msg); 21756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 21766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 21776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case RW_T3T_CMD_CHECK_NDEF: 21786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_act_handle_check_ndef_rsp(p_cb, p_msg); 21796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 21806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 21816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case RW_T3T_CMD_UPDATE_NDEF: 21826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_act_handle_update_ndef_rsp(p_cb, p_msg); 21836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 21846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 21856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case RW_T3T_CMD_CHECK: 21866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_act_handle_check_rsp(p_cb, p_msg); 21876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 21886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 21896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case RW_T3T_CMD_UPDATE: 21906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_act_handle_update_rsp(p_cb, p_msg); 21916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 21926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 21936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case RW_T3T_CMD_SEND_RAW_FRAME: 21946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_act_handle_raw_senddata_rsp(p_cb, p_data); 21956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 21966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 21976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case RW_T3T_CMD_FORMAT: 21986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_act_handle_fmt_rsp(p_cb, p_msg); 21996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 22006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 22016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case RW_T3T_CMD_SET_READ_ONLY_SOFT: 22026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case RW_T3T_CMD_SET_READ_ONLY_HARD: 22036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_act_handle_sro_rsp(p_cb, p_msg); 22046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 22056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 22066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi default: 22076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg); 22086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 22106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 22126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (free_msg) { 22136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg); 22146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 22156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi} 2216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_conn_cback 2220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This callback function receives the events/data from NFCC. 2222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 2224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 22266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_conn_cback(uint8_t conn_id, tNFC_CONN_EVT event, 22276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_CONN* p_data) { 22286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 22296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG2("rw_t3t_conn_cback: conn_id=%i, evt=0x%02x", conn_id, event); 2230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 22316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Only handle NFC_RF_CONN_ID conn_id */ 22326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (conn_id != NFC_RF_CONN_ID) { 22336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return; 22346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 22366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (event) { 2237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_DEACTIVATE_CEVT: 22386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_unselect(NULL); 22396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 22416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case NFC_DATA_CEVT: /* check for status in tNFC_CONN */ 22426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_data != NULL) && ((p_data->data.status == NFC_STATUS_OK) || 22436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_data->data.status == NFC_STATUS_CONTINUE))) { 22446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_data_cback(conn_id, &(p_data->data)); 22456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 22466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_data->data.p_data != NULL) { 22476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Free the response buffer in case of error response */ 22486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf((NFC_HDR*)(p_data->data.p_data)); 22496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_data->data.p_data = NULL; 22506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 22516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Data event with error status...fall through to NFC_ERROR_CEVT case */ 2252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_ERROR_CEVT: 22546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_stop_quick_timer(&p_cb->timer); 2255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2256303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE) 22576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_main_update_trans_error_stats(); 22586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */ 2259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 22606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (event == NFC_ERROR_CEVT) 22616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_process_error(NFC_STATUS_TIMEOUT); 22626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (p_data) 22636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_process_error(p_data->status); 22646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 22676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 22686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2273818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Function rw_t3t_mrti_to_a_b 2274818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 2275818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Description Converts the given MRTI (Maximum Response Time Information) 2276818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** to the base to calculate timeout value. 2277818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** (The timeout value is a + b * number_blocks) 2278818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 2279818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Returns NFC_STATUS_OK 2280818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 2281818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith*******************************************************************************/ 22826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t3t_mrti_to_a_b(uint8_t mrti, uint32_t* p_a, uint32_t* p_b) { 22836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t a, b, e; 22846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 22856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi a = (mrti & 0x7) + 1; /* A is bit 0 ~ bit 2 */ 22866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi mrti >>= 3; 22876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi b = (mrti & 0x7) + 1; /* B is bit 3 ~ bit 5 */ 22886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi mrti >>= 3; 22896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi e = mrti & 0x3; /* E is bit 6 ~ bit 7 */ 22906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *p_a = rw_t3t_mrti_base[e] * a; /* (A+1) * base (i.e T/t3t * 4^E) */ 22916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *p_b = rw_t3t_mrti_base[e] * b; /* (B+1) * base (i.e T/t3t * 4^E) */ 2292818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith} 2293818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith 2294818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith/******************************************************************************* 2295818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 2296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_select 2297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Called by NFC manager when a Type3 tag has been activated 2299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK 2301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 23036fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t3t_select(uint8_t peer_nfcid2[NCI_RF_F_UID_LEN], 23046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t mrti_check, uint8_t mrti_update) { 23056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 23066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 23076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API0("rw_t3t_select"); 23086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 23096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memcpy(p_cb->peer_nfcid2, peer_nfcid2, 23106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_NFCID2_LEN); /* Store tag's NFCID2 */ 23116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.status = 23126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_STATUS_NOT_INITIALIZED; /* Indicate that NDEF detection has not been 23136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi performed yet */ 23146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 23156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags = 0; 23166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_mrti_to_a_b(mrti_check, &p_cb->check_tout_a, &p_cb->check_tout_b); 23176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_mrti_to_a_b(mrti_update, &p_cb->update_tout_a, &p_cb->update_tout_b); 23186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 23196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Alloc cmd buf for retransmissions */ 23206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->p_cur_cmd_buf == NULL) { 23210c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cb->p_cur_cmd_buf = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID); 23220c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cb->p_cur_cmd_buf == NULL) { 23236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0( 23246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "rw_t3t_select: unable to allocate buffer for retransmission"); 23256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_NOT_ACTIVATED; 23266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 23276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 23286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 23296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 23306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_SetStaticRfCback(rw_t3t_conn_cback); 23316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 23326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return NFC_STATUS_OK; 2333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_unselect 2338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Called by NFC manager when a Type3 tag has been de-activated 2340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK 2342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 23446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic tNFC_STATUS rw_t3t_unselect(uint8_t peer_nfcid2[]) { 23456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 2346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2347303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE) 23486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Display stats */ 23496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_main_log_stats(); 23506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */ 2351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 23526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Stop t3t timer (if started) */ 23536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_stop_quick_timer(&p_cb->timer); 2354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 23556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Free cmd buf for retransmissions */ 23566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->p_cur_cmd_buf) { 23576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_cb->p_cur_cmd_buf); 23586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->p_cur_cmd_buf = NULL; 23596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 23616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_NOT_ACTIVATED; 23626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_SetStaticRfCback(NULL); 2363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 23646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return NFC_STATUS_OK; 2365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2367a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu/******************************************************************************* 2368a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 2369a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Function rw_t3t_update_ndef_flag 2370a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 2371a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Description set additional NDEF Flags for felica lite tag 2372a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 2373a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Returns updated NDEF Flag value 2374a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 2375a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu*******************************************************************************/ 23766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t3t_update_ndef_flag(uint8_t* p_flag) { 23776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 23786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t xx; 2379a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 23806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (xx = 0; xx < p_cb->num_system_codes; xx++) { 23816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->system_codes[xx] == T3T_SYSTEM_CODE_FELICA_LITE) { 23826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *p_flag &= ~RW_NDEF_FL_UNKNOWN; 23836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *p_flag |= (RW_NDEF_FL_SUPPORTED | RW_NDEF_FL_FORMATABLE); 23846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2385a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 23866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2387a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu} 2388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 2390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_cmd_str 2393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Converts cmd_id to command string for logging 2395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns command string 2397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 23996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic char* rw_t3t_cmd_str(uint8_t cmd_id) { 24006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (cmd_id) { 2401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_DETECT_NDEF: 24026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "RW_T3T_CMD_DETECT_NDEF"; 2403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_CHECK_NDEF: 24056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "RW_T3T_CMD_CHECK_NDEF"; 2406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_UPDATE_NDEF: 24086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "RW_T3T_CMD_UPDATE_NDEF"; 2409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_CHECK: 24116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "RW_T3T_CMD_CHECK"; 2412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_UPDATE: 24146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "RW_T3T_CMD_UPDATE"; 2415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_SEND_RAW_FRAME: 24176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "RW_T3T_CMD_SEND_RAW_FRAME"; 2418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_GET_SYSTEM_CODES: 24206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "RW_T3T_CMD_GET_SYSTEM_CODES"; 2421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 24236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "Unknown"; 24246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_state_str 2430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Converts state_id to command string for logging 2432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns command string 2434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 24366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic char* rw_t3t_state_str(uint8_t state_id) { 24376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (state_id) { 2438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_STATE_NOT_ACTIVATED: 24396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "RW_T3T_STATE_NOT_ACTIVATED"; 2440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_STATE_IDLE: 24426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "RW_T3T_STATE_IDLE"; 2443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_STATE_COMMAND_PENDING: 24456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "RW_T3T_STATE_COMMAND_PENDING"; 2446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 24486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "Unknown"; 24496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 2452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Type3 Tag API Functions 2455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 2456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tDetectNDef 2460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** This function is used to perform NDEF detection on a Type 3 tag, and 2463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** retrieve the tag's NDEF attribute information (block 0). 2464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Before using this API, the application must call RW_SelectTagType to 2466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** indicate that a Type 3 tag has been activated, and to provide the 2467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** tag's Manufacture ID (IDm) . 2468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK: ndef detection procedure started 2471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 24756fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T3tDetectNDef(void) { 24766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 24776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 24786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 24796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API0("RW_T3tDetectNDef"); 24806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 24816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if we are in valid state to handle this API */ 24826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state != RW_T3T_STATE_IDLE) { 24836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)", 24846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state); 24856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 24866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 24876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 24880c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi retval = (tNFC_STATUS)nci_snd_t3t_polling(T3T_SYSTEM_CODE_NDEF, 0, 0); 24890c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (retval == NCI_STATUS_OK) { 24906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_cmd = RW_T3T_CMD_DETECT_NDEF; 24916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_tout = RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS; 24926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_poll_rc = 0; 24936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING; 24946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags |= RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP; 2495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 24966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* start timer for waiting for responses */ 24976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_start_poll_timer(p_cb); 24986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 25006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 2501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tCheckNDef 2506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Retrieve NDEF contents from a Type3 tag. 2509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The RW_T3T_CHECK_EVT event is used to notify the application for each 2511552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** segment of NDEF data received. The RW_T3T_CHECK_CPLT_EVT event is used 2512552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** to notify the application all segments have been received. 2513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Before using this API, the RW_T3tDetectNDef function must be called to 2515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** verify that the tag contains NDEF data, and to retrieve the NDEF 2516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** attributes. 2517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Internally, this command will be separated into multiple Tag 3 Check 2519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** commands (if necessary) - depending on the tag's Nbr (max number of 2520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** blocks per read) attribute. 2521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK: check command started 2524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 25286fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T3tCheckNDef(void) { 25296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 25306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 25316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 25326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API0("RW_T3tCheckNDef"); 25336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 25346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if we are in valid state to handle this API */ 25356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state != RW_T3T_STATE_IDLE) { 25366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)", 25376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state); 25386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 25396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->ndef_attrib.status != 25406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_STATUS_OK) /* NDEF detection not performed yet? */ 25416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 25426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0("Error: NDEF detection not performed yet"); 25436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_NOT_INITIALIZED); 25446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->ndef_attrib.ln == 0) { 25456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0("Type 3 tag contains empty NDEF message"); 25466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 25476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 25486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 25496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check number of blocks needed for this update */ 25506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_IS_FINAL_NDEF_SEGMENT; 25516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_rx_offset = 0; 25526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = rw_t3t_send_next_ndef_check_cmd(p_cb); 25536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 25546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 2555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tUpdateNDef 2560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Write NDEF contents to a Type3 tag. 2563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The RW_T3T_UPDATE_CPLT_EVT callback event will be used to notify the 2565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** application of the response. 2566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Before using this API, the RW_T3tDetectNDef function must be called to 2568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** verify that the tag contains NDEF data, and to retrieve the NDEF 2569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** attributes. 2570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Internally, this command will be separated into multiple Tag 3 Update 2572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** commands (if necessary) - depending on the tag's Nbw (max number of 2573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** blocks per write) attribute. 2574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK: check command started 2577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_REFUSED: tag is read-only 2579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_BUFFER_FULL: len exceeds tag's maximum size 2580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 25836fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T3tUpdateNDef(uint32_t len, uint8_t* p_data) { 25846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 25856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 25866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 25876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API1("RW_T3tUpdateNDef (len=%i)", len); 25886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 25896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if we are in valid state to handle this API */ 25906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state != RW_T3T_STATE_IDLE) { 25916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)", 25926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state); 25936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 25946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->ndef_attrib.status != 25956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_STATUS_OK) /* NDEF detection not performed yet? */ 25966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 25976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0("Error: NDEF detection not performed yet"); 25986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_NOT_INITIALIZED); 25996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (len > (((uint32_t)p_cb->ndef_attrib.nmaxb) * 26006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16)) /* Len exceed's tag's NDEF memory? */ 26016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 26026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_BUFFER_FULL); 26036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->ndef_attrib.rwflag == 26046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_NDEF_RWFLAG_RO) /* Tag's NDEF memory is read-only? */ 26056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 26066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_REFUSED); 26076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 26086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 26096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check number of blocks needed for this update */ 26106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_IS_FINAL_NDEF_SEGMENT; 26116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_msg_bytes_sent = 0; 26126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_msg_len = len; 26136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_msg = p_data; 26146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 26156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send initial UPDATE command for NDEF Attribute Info */ 26166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = rw_t3t_send_update_ndef_attribute_cmd(p_cb, true); 26176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 26186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 2619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tCheck 2624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Read (non-NDEF) contents from a Type3 tag. 2627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The RW_READ_EVT event is used to notify the application for each 2629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** segment of NDEF data received. The RW_READ_CPLT_EVT event is used to 2630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** notify the application all segments have been received. 2631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Before using this API, the application must call RW_SelectTagType to 2633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** indicate that a Type 3 tag has been activated, and to provide the 2634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** tag's Manufacture ID (IDm) . 2635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK: check command started 2638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 26426fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T3tCheck(uint8_t num_blocks, tT3T_BLOCK_DESC* t3t_blocks) { 26436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 26446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 2645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 26466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API1("RW_T3tCheck (num_blocks = %i)", num_blocks); 2647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 26486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if we are in valid state to handle this API */ 26496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state != RW_T3T_STATE_IDLE) { 26506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)", 26516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state); 26526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 26536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 26556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the CHECK command */ 26566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = rw_t3t_send_check_cmd(p_cb, num_blocks, t3t_blocks); 2657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 26586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 2659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tUpdate 2664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Write (non-NDEF) contents to a Type3 tag. 2667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The RW_WRITE_CPLT_EVT event is used to notify the application all 2669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** segments have been received. 2670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Before using this API, the application must call RW_SelectTagType to 2672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** indicate that a Type 3 tag has been activated, and to provide the tag's 2673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Manufacture ID (IDm) . 2674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK: check command started 2677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 26816fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T3tUpdate(uint8_t num_blocks, tT3T_BLOCK_DESC* t3t_blocks, 26826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_data) { 26836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 26846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 2685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 26866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API1("RW_T3tUpdate (num_blocks = %i)", num_blocks); 2687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 26886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if we are in valid state to handle this API */ 26896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state != RW_T3T_STATE_IDLE) { 26906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)", 26916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state); 26926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 26936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 26956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the UPDATE command */ 26966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = rw_t3t_send_update_cmd(p_cb, num_blocks, t3t_blocks, p_data); 2697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 26986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 2699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tPresenceCheck 2704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Check if the tag is still in the field. 2707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The RW_T3T_PRESENCE_CHECK_EVT w/ status is used to indicate presence 2709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** or non-presence. 2710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK, if raw data frame sent 2713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 27176fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T3tPresenceCheck(void) { 27186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 27196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 27206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_CB* p_rw_cb = &rw_cb; 27216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 27226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API0("RW_T3tPresenceCheck"); 27236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 27246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If RW_SelectTagType was not called (no conn_callback) return failure */ 27256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (!(p_rw_cb->p_cback)) { 27266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = NFC_STATUS_FAILED; 27276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 27286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If we are not activated, then RW_T3T_PRESENCE_CHECK_EVT status=FAIL */ 27296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (p_rw_cb->tcb.t3t.rw_state == RW_T3T_STATE_NOT_ACTIVATED) { 27306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 27316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_rw_cb->p_cback)(RW_T3T_PRESENCE_CHECK_EVT, &evt_data); 27326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 27336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If command is pending */ 27346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (p_rw_cb->tcb.t3t.rw_state == RW_T3T_STATE_COMMAND_PENDING) { 27356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If already performing presence check, return error */ 27366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_rw_cb->tcb.t3t.flags & RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP) { 27376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG0("RW_T3tPresenceCheck already in progress"); 27386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = NFC_STATUS_FAILED; 27396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 27406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If busy with any other command, assume that the tag is present */ 27416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else { 27426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_OK; 27436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_rw_cb->p_cback)(RW_T3T_PRESENCE_CHECK_EVT, &evt_data); 27446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 27456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 27466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* IDLE state: send POLL command */ 27470c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi retval = (tNFC_STATUS)nci_snd_t3t_polling(0xFFFF, T3T_POLL_RC_SC, 0); 27480c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (retval == NCI_STATUS_OK) { 27496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_rw_cb->tcb.t3t.flags |= RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP; 27506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_rw_cb->tcb.t3t.rw_state = RW_T3T_STATE_COMMAND_PENDING; 27516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_rw_cb->tcb.t3t.cur_poll_rc = 0; 27526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 27536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* start timer for waiting for responses */ 27546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_start_poll_timer(&p_rw_cb->tcb.t3t); 27556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 27566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG1( 27576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "RW_T3tPresenceCheck error sending NCI_RF_T3T_POLLING cmd (status = " 27586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "0x%0x)", 27596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval); 27606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 27616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 27626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 27636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 2764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tPoll 2769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Send POLL command 2772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK, if raw data frame sent 2775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 27796fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T3tPoll(uint16_t system_code, tT3T_POLL_RC rc, uint8_t tsn) { 27806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 27816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 27826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 27836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API0("RW_T3tPoll"); 27846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 27856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if we are in valid state to handle this API */ 27866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state != RW_T3T_STATE_IDLE) { 27876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)", 27886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state); 27896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 27906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 27916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 27920c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi retval = (tNFC_STATUS)nci_snd_t3t_polling(system_code, (uint8_t)rc, tsn); 27930c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (retval == NCI_STATUS_OK) { 27946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* start timer for waiting for responses */ 27956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_poll_rc = rc; 27966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING; 27976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_start_poll_timer(p_cb); 27986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 28006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 2801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tSendRawFrame 2806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** This function is called to send a raw data frame to the peer device. 2809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** When type 3 tag receives response from peer, the callback function 2810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** will be called with a RW_T3T_RAW_FRAME_EVT [Table 6]. 2811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Before using this API, the application must call RW_SelectTagType to 2813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** indicate that a Type 3 tag has been activated. 2814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The raw frame should be a properly formatted Type 3 tag message. 2816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK, if raw data frame sent 2819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 28236fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T3tSendRawFrame(uint16_t len, uint8_t* p_data) { 28246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 28256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 2826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 28276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API1("RW_T3tSendRawFrame (len = %i)", len); 2828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 28296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if we are in valid state to handle this API */ 28306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state != RW_T3T_STATE_IDLE) { 28316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)", 28326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state); 28336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 28346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 28366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the UPDATE command */ 28376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = rw_t3t_send_raw_frame(p_cb, len, p_data); 2838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 28396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 2840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tGetSystemCodes 2845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Get systems codes supported by the activated tag: 2848721b3ab20e5cfe30ed14fbfac62504749e50df1fYoshinobu Ito** Poll for wildcard (FFFF, RC=1): 2849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Before using this API, the application must call RW_SelectTagType to 2851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** indicate that a Type 3 tag has been activated. 2852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK, if raw data frame sent 2855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 28596fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T3tGetSystemCodes(void) { 28606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 28616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 28626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 28636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API0("RW_T3tGetSystemCodes"); 28646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 28656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if we are in valid state to handle this API */ 28666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state != RW_T3T_STATE_IDLE) { 28676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)", 28686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state); 28696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 28706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 28710c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi retval = (tNFC_STATUS)nci_snd_t3t_polling(0xFFFF, T3T_POLL_RC_SC, 0); 28720c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (retval == NCI_STATUS_OK) { 28736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_cmd = RW_T3T_CMD_GET_SYSTEM_CODES; 28746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_tout = RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS; 28756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_poll_rc = T3T_POLL_RC_SC; 28766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING; 28776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags |= RW_T3T_FL_W4_GET_SC_POLL_RSP; 28786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->num_system_codes = 0; 28796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 28806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* start timer for waiting for responses */ 28816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_start_poll_timer(p_cb); 28826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 28836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 28846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 28856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 2886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tFormatNDef 2891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Format a type-3 tag for NDEF. 2894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Only Felica-Lite tags are supported by this API. The 2896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_T3T_FORMAT_CPLT_EVT is used to notify the status of the operation. 2897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK: ndef detection procedure started 2900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 29046fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T3tFormatNDef(void) { 29056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 29066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 29076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 29086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API0("RW_T3tFormatNDef"); 29096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 29106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if we are in valid state to handle this API */ 29116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state != RW_T3T_STATE_IDLE) { 29126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)", 29136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state); 29146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 29156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 29166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Poll tag, to see if Felica-Lite system is supported */ 29170c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi retval = (tNFC_STATUS)nci_snd_t3t_polling(T3T_SYSTEM_CODE_FELICA_LITE, 29180c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi T3T_POLL_RC_SC, 0); 29190c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (retval == NCI_STATUS_OK) { 29206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_cmd = RW_T3T_CMD_FORMAT; 29216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_tout = RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS; 29226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_poll_rc = T3T_POLL_RC_SC; 29236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING; 29246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_substate = RW_T3T_FMT_SST_POLL_FELICA_LITE; 29256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags |= RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP; 29266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 29276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* start timer for waiting for responses */ 29286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_start_poll_timer(p_cb); 29296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 29306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 29316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 29326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 2933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 29345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 29355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/***************************************************************************** 29365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 29375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function RW_T3tSetReadOnly 29385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 29395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description This function performs NDEF read-only procedure 29405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Note: Only Felica-Lite tags are supported by this API. 29415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** RW_T3tDetectNDef() must be called before using this 29425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 29435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** The RW_T3T_SET_READ_ONLY_CPLT_EVT event will be returned. 29445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 29455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns NFC_STATUS_OK if success 29465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** NFC_STATUS_FAILED if T3T is busy or other error 29475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 29485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*****************************************************************************/ 29496fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T3tSetReadOnly(bool b_hard_lock) { 29506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 29516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 29526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 29536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 29546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API1("RW_T3tSetReadOnly (): b_hard_lock=%d", b_hard_lock); 29556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 29566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if we are in valid state to handle this API */ 29576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state != RW_T3T_STATE_IDLE) { 29586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)", 29596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state); 29606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 29616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 29626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 29636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->ndef_attrib.status != 29646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_STATUS_OK) /* NDEF detection not performed yet? */ 29656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 29666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0("Error: NDEF detection not performed yet"); 29676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_NOT_INITIALIZED); 29686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 29696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 29706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((!b_hard_lock) && 29716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->ndef_attrib.rwflag == 29726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_NDEF_RWFLAG_RO)) /* Tag's NDEF memory is read-only already */ 29736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 29746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_OK; 29756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_SET_READ_ONLY_CPLT_EVT, &evt_data); 29765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return (retval); 29776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 29786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Poll tag, to see if Felica-Lite system is supported */ 29790c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi retval = (tNFC_STATUS)nci_snd_t3t_polling(T3T_SYSTEM_CODE_FELICA_LITE, 29800c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi T3T_POLL_RC_SC, 0); 29810c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (retval == NCI_STATUS_OK) { 29826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (b_hard_lock) 29836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_cmd = RW_T3T_CMD_SET_READ_ONLY_HARD; 29846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else 29856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_cmd = RW_T3T_CMD_SET_READ_ONLY_SOFT; 29866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_tout = RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS; 29876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_poll_rc = T3T_POLL_RC_SC; 29886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING; 29896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_substate = RW_T3T_SRO_SST_POLL_FELICA_LITE; 29906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags |= RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP; 29916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 29926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* start timer for waiting for responses */ 29936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_start_poll_timer(p_cb); 29946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 29956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 29966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 29975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 2998