rw_t3t.c revision 0c515ae1d2edf9202878a7ac7bcbf195333643e5
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) */ 1736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 0, 1746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 0, 1756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 0, 1766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 0, /* Unused */ 1776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_NDEF_WRITEF_OFF, /* WriteF */ 1786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_NDEF_RWFLAG_RW, /* RW Flag */ 1796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 0, 1806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 0, 1816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 0, /* Ln (current size in bytes) */ 1826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (RW_T3T_DEFAULT_FELICALITE_ATTRIB_INFO_CHECKSUM >> 1846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8), /* checksum (high-byte) */ 1856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (RW_T3T_DEFAULT_FELICALITE_ATTRIB_INFO_CHECKSUM & 1866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 0xFF) /* checksum (low-byte) */ 187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 190818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith/* This is (T/t3t * 4^E) , E is the index of the array. The unit is .0001 ms */ 1916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic const uint32_t rw_t3t_mrti_base[] = {302, 1208, 4832, 19328}; 192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 195818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Function rw_t3t_check_timeout 196818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 197818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Description The timeout value is a + b * number_blocks) 198818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 199818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Returns timeout value in ticks 200818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 201818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith*******************************************************************************/ 2026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic uint32_t rw_t3t_check_timeout(uint16_t num_blocks) { 2036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 2046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint32_t timeout; 2056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint32_t extra; 2066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi timeout = (p_cb->check_tout_a + num_blocks * p_cb->check_tout_b) * 2086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi QUICK_TIMER_TICKS_PER_SEC / 1000000; 2096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* allow some extra time for driver */ 2106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi extra = (timeout / 10) + RW_T3T_MIN_TIMEOUT_TICKS; 2116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi timeout += extra; 2126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return timeout; 214818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith} 215818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith 216818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith/******************************************************************************* 217818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 218818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Function rw_t3t_update_timeout 219818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 220818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Description The timeout value is a + b * number_blocks) 221818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 222818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Returns timeout value in ticks 223818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 224818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith*******************************************************************************/ 2256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic uint32_t rw_t3t_update_timeout(uint16_t num_blocks) { 2266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 2276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint32_t timeout; 2286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint32_t extra; 2296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi timeout = (p_cb->update_tout_a + num_blocks * p_cb->update_tout_b) * 2316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi QUICK_TIMER_TICKS_PER_SEC / 1000000; 2326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* allow some extra time for driver */ 2336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi extra = (timeout / 10) + RW_T3T_MIN_TIMEOUT_TICKS; 2346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi timeout += extra; 2356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return timeout; 237818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith} 238818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith/******************************************************************************* 239818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_process_error 241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process error (timeout or CRC error) 243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 2476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_process_error(tNFC_STATUS status) { 2486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 2496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t evt; 2506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 2516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf; 2526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state == RW_T3T_STATE_COMMAND_PENDING) { 2546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->cur_cmd == RW_T3T_CMD_GET_SYSTEM_CODES) { 2556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* For GetSystemCode: tag did not respond to requested POLL */ 2566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_handle_get_system_codes_cplt(); 2576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return; 2586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Retry sending command if retry-count < max */ 2606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (rw_cb.cur_retry < RW_MAX_RETRIES) { 2616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* retry sending the command */ 2626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_cb.cur_retry++; 2636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG2("T3T retransmission attempt %i of %i", rw_cb.cur_retry, 2656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_MAX_RETRIES); 2666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* allocate a new buffer for message */ 2680c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cmd_buf = rw_t3t_get_cmd_buf(); 2690c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cmd_buf != NULL) { 2706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memcpy(p_cmd_buf, p_cb->p_cur_cmd_buf, 2716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sizeof(NFC_HDR) + p_cb->p_cur_cmd_buf->offset + 2726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->p_cur_cmd_buf->len); 2736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (rw_t3t_send_to_lower(p_cmd_buf) == NFC_STATUS_OK) { 2756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Start timer for waiting for response */ 2766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_start_quick_timer(&p_cb->timer, NFC_TTYPE_RW_T3T_RESPONSE, 2776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_tout); 2786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return; 2796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 2806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* failure - could not send buffer */ 2816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_cmd_buf); 2826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 2856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG1("T3T maximum retransmission attempts reached (%i)", 2866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_MAX_RETRIES); 2876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 289303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE) 2906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* update failure count */ 2916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_main_update_fail_stats(); 2926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */ 2936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 2956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify app of result (if there was a pending command) */ 2976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->cur_cmd < RW_T3T_CMD_MAX) { 2986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If doing presence check, use status=NFC_STATUS_FAILED, otherwise 2996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * NFC_STATUS_TIMEOUT */ 3006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = status; 3016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt = rw_t3t_api_res_evt[p_cb->cur_cmd]; 3026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Set additional flags for RW_T3T_NDEF_DETECT_EVT */ 3046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (evt == RW_T3T_NDEF_DETECT_EVT) { 3056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.ndef.flags = RW_NDEF_FL_UNKNOWN; 3066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_update_ndef_flag(&evt_data.ndef.flags); 3076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 3086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(evt, &evt_data); 310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 3116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 3126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = status; 3136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_INTF_ERROR_EVT, &evt_data); 3146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_start_poll_timer 320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Start the timer for T3T POLL Command 322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_start_poll_timer(tRW_T3T_CB* p_cb) { 3276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_start_quick_timer(&p_cb->poll_timer, NFC_TTYPE_RW_T3T_RESPONSE, 3286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_POLL_CMD_TIMEOUT_TICKS); 329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_handle_nci_poll_ntf 334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle NCI_T3T_POLLING_NTF 336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_handle_nci_poll_ntf(uint8_t nci_status, uint8_t num_responses, 3416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t sensf_res_buf_size, 3426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_sensf_res_buf) { 3436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 3446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 3456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* stop timer for poll response */ 3476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_stop_quick_timer(&p_cb->poll_timer); 3486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Stop t3t timer (if started) */ 3506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->flags & RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP) { 3516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP; 3526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = nci_status; 3536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 3546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_PRESENCE_CHECK_EVT, (tRW_DATA*)&evt_data); 3556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->flags & RW_T3T_FL_W4_GET_SC_POLL_RSP) { 3566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Handle POLL ntf in response to get system codes */ 3576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_W4_GET_SC_POLL_RSP; 3586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_handle_get_sc_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_FMT_FELICA_LITE_POLL_RSP) { 3616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Handle POLL ntf in response to get system codes */ 3626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP; 3636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_handle_fmt_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_SRO_FELICA_LITE_POLL_RSP) { 3666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Handle POLL ntf in response to get system codes */ 3676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP; 3686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_handle_sro_poll_rsp(p_cb, nci_status, num_responses, 3696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sensf_res_buf_size, p_sensf_res_buf); 3706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->flags & RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP) { 3716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Handle POLL ntf in response to ndef detection */ 3726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP; 3736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_handle_ndef_detect_poll_rsp(p_cb, nci_status, num_responses, 3746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sensf_res_buf_size, p_sensf_res_buf); 3756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 3766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Handle POLL ntf in response to RW_T3tPoll */ 3770c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi evt_data.t3t_poll.status = nci_status; 3780c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (evt_data.t3t_poll.status == NCI_STATUS_OK) { 3796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.t3t_poll.rc = p_cb->cur_poll_rc; 3806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.t3t_poll.response_num = num_responses; 3816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.t3t_poll.response_bufsize = sensf_res_buf_size; 3826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.t3t_poll.response_buf = p_sensf_res_buf; 383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 3866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_POLL_EVT, &evt_data); 3876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_handle_get_system_codes_cplt 393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Notify upper layer of system codes 395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 3996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_handle_get_system_codes_cplt(void) { 4006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 4016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 4026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t i; 4036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.t3t_sc.status = NFC_STATUS_OK; 4056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.t3t_sc.num_system_codes = p_cb->num_system_codes; 4066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.t3t_sc.p_system_codes = p_cb->system_codes; 4076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG1("rw_t3t_handle_get_system_codes_cplt, number of systems: %i", 4096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.t3t_sc.num_system_codes); 4106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (i = 0; i < evt_data.t3t_sc.num_system_codes; i++) { 4116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG2(" system %i: %04X", i, evt_data.t3t_sc.p_system_codes[i]); 4126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 4156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_GET_SYSTEM_CODES_EVT, &evt_data); 416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_format_cplt 421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Notify upper layer of format complete 423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 4276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_format_cplt(tNFC_STATUS status) { 4286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 4296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 4306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 4326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Update ndef info */ 4346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.status = status; 4356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (status == NFC_STATUS_OK) { 4366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.version = T3T_MSG_NDEF_VERSION; 4376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.nbr = RW_T3T_DEFAULT_FELICALITE_NBR; 4386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.nbw = RW_T3T_DEFAULT_FELICALITE_NBW; 4396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.nmaxb = RW_T3T_DEFAULT_FELICALITE_NMAXB; 4406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.writef = T3T_MSG_NDEF_WRITEF_OFF; 4416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.rwflag = T3T_MSG_NDEF_RWFLAG_RW; 4426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.ln = 0; 4436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify upper layer of format complete */ 4466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = status; 4476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_FORMAT_CPLT_EVT, &evt_data); 448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function rw_t3t_set_readonly_cplt 4535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 4545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description Notify upper layer of set read only complete 4555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 4565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns none 4575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 4585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/ 4596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_set_readonly_cplt(tNFC_STATUS status) { 4606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 4616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 4625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 4636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 4645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 4656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify upper layer of format complete */ 4666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = status; 4676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_SET_READ_ONLY_CPLT_EVT, &evt_data); 4685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 4695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 4705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/******************************************************************************* 4715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_process_timeout 473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process timeout 475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 4796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_process_timeout(TIMER_LIST_ENT* p_tle) { 4806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 4816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check which timer timed out */ 4846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_tle == &p_cb->timer) { 4856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi/* UPDATE/CHECK response timeout */ 486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 4876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR3("T3T timeout. state=%s cur_cmd=0x%02X (%s)", 4886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_state_str(rw_cb.tcb.t3t.rw_state), 4896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_cb.tcb.t3t.cur_cmd, 4906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_cmd_str(rw_cb.tcb.t3t.cur_cmd)); 491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else 4926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("T3T timeout. state=0x%02X cur_cmd=0x%02X", 4936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_cb.tcb.t3t.rw_state, rw_cb.tcb.t3t.cur_cmd); 494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_process_error(NFC_STATUS_TIMEOUT); 4976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 4986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0("T3T POLL timeout."); 4996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* POLL response timeout */ 5016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->flags & RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP) { 5026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* POLL timeout for presence check */ 5036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP; 5046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 5056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 5066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_PRESENCE_CHECK_EVT, (tRW_DATA*)&evt_data); 5076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->flags & RW_T3T_FL_W4_GET_SC_POLL_RSP) { 5086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* POLL timeout for getting system codes */ 5096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_W4_GET_SC_POLL_RSP; 5106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_handle_get_system_codes_cplt(); 5116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->flags & RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP) { 5126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* POLL timeout for formatting Felica Lite */ 5136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP; 5146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0("Felica-Lite tag not detected"); 5156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_format_cplt(NFC_STATUS_FAILED); 5166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->flags & RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP) { 5176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* POLL timeout for configuring Felica Lite read only */ 5186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP; 5196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0("Felica-Lite tag not detected"); 5206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_set_readonly_cplt(NFC_STATUS_FAILED); 5216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->flags & RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP) { 5226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* POLL timeout for ndef detection */ 5236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP; 5246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_handle_ndef_detect_poll_rsp(p_cb, NFC_STATUS_TIMEOUT, 0, 0, NULL); 5256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 5266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Timeout waiting for response for RW_T3tPoll */ 5276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.t3t_poll.status = NFC_STATUS_FAILED; 5286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 5296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_POLL_EVT, (tRW_DATA*)&evt_data); 5306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 5316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_process_frame_error 537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process frame crc error 539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 5436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_process_frame_error(void) { 544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 5456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR3("T3T frame error. state=%s cur_cmd=0x%02X (%s)", 5466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_state_str(rw_cb.tcb.t3t.rw_state), 5476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_cb.tcb.t3t.cur_cmd, rw_t3t_cmd_str(rw_cb.tcb.t3t.cur_cmd)); 548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else 5496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("T3T frame error. state=0x%02X cur_cmd=0x%02X", 5506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_cb.tcb.t3t.rw_state, rw_cb.tcb.t3t.cur_cmd); 551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 553303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE) 5546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Update stats */ 5556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_main_update_crc_error_stats(); 5566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */ 557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Process the error */ 5596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_process_error(NFC_STATUS_MSG_CORRUPTED); 560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_to_lower 565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send command to lower layer 567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns status of the send 569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 5716fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t3t_send_to_lower(NFC_HDR* p_msg) { 5726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p; 573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 574303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE) 5756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool is_retry; 5766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Update stats */ 5776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_main_update_tx_stats(p_msg->len, ((rw_cb.cur_retry == 0) ? false : true)); 5786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */ 5796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Set NFC-F SoD field (payload len + 1) */ 5816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->offset -= 1; /* Point to SoD field */ 5826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = (uint8_t*)(p_msg + 1) + p_msg->offset; 5836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, (p_msg->len + 1)); 5846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->len += 1; /* Increment len to include SoD */ 585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE) 5876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi DispT3TagMessage(p_msg, false); 588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_SendData(NFC_RF_CONN_ID, p_msg)); 591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_get_cmd_buf 596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Get a buffer for sending T3T messages 598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 5990a73688fae255d6c4730747caefaa134bd29b1d6Ruchi Kandoi** Returns NFC_HDR * 600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 6026fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoiNFC_HDR* rw_t3t_get_cmd_buf(void) { 6036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf; 604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 6050c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cmd_buf = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID); 6060c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cmd_buf != NULL) { 6076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Reserve offset for NCI_DATA_HDR and NFC-F Sod (LEN) field */ 6086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_buf->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE + 1; 6096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_buf->len = 0; 6106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 6126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (p_cmd_buf); 613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_cmd 618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send command to tag, and start timer for response 620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 6246fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t3t_send_cmd(tRW_T3T_CB* p_cb, uint8_t rw_t3t_cmd, 6256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf, uint32_t timeout_ticks) { 6266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval; 6276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Indicate first attempt to send command, back up cmd buffer in case needed 6296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * for retransmission */ 6306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_cb.cur_retry = 0; 6316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memcpy(p_cb->p_cur_cmd_buf, p_cmd_buf, 6326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sizeof(NFC_HDR) + p_cmd_buf->offset + p_cmd_buf->len); 6336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_cmd = rw_t3t_cmd; 6356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_tout = timeout_ticks; 6366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING; 6376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6380c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi retval = rw_t3t_send_to_lower(p_cmd_buf); 6390c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (retval == NFC_STATUS_OK) { 6406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Start timer for waiting for response */ 6416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_start_quick_timer(&p_cb->timer, NFC_TTYPE_RW_T3T_RESPONSE, 6426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi timeout_ticks); 6436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 6446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Error sending */ 6456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 6466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 6486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG3("rw_t3t_send_cmd: cur_tout: %d, timeout_ticks: %d ret:%d", 6496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_tout, timeout_ticks, retval); 6506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_update_ndef_attribute_cmd 656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send UPDATE command for Attribute Information 658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 6626fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t3t_send_update_ndef_attribute_cmd(tRW_T3T_CB* p_cb, 6636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool write_in_progress) { 6646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 6656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf; 6666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *p_cmd_start, *p; 6676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t checksum, i; 6686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t write_f; 6696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint32_t ln; 6706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_ndef_attr_info_start; 6716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6720c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cmd_buf = rw_t3t_get_cmd_buf(); 6730c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cmd_buf != NULL) { 6746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Construct T3T message */ 6756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset; 6766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add UPDATE opcode to message */ 6786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, T3T_MSG_OPC_UPDATE_CMD); 679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 6806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add IDm to message */ 6816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM(p, p_cb->peer_nfcid2, NCI_NFCID2_LEN); 6826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add Service code list */ 6846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 1); /* Number of services (only 1 service: NDEF) */ 6856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM( 6866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, T3T_MSG_NDEF_SC_RW); /* Service code (little-endian format) */ 6876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add number of blocks in this UPDATE command */ 6896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 1); /* Number of blocks to write in this command */ 6906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Block List element: the NDEF attribute information block (block 0) */ 6926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT); 6936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 0); 6946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add payload (Attribute information block) */ 6966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ndef_attr_info_start = 6976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p; /* Save start of a NDEF attribute info block for checksum */ 6986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, T3T_MSG_NDEF_VERSION); 6996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, p_cb->ndef_attrib.nbr); 7006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, p_cb->ndef_attrib.nbw); 7016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_BE_STREAM(p, p_cb->ndef_attrib.nmaxb); 7026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT32_TO_STREAM(p, 0); 7036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If starting NDEF write: set WriteF=ON, and ln=current ndef length */ 7056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (write_in_progress) { 7066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi write_f = T3T_MSG_NDEF_WRITEF_ON; 7076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ln = p_cb->ndef_attrib.ln; 7086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 7096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If finishing NDEF write: set WriteF=OFF, and ln=new ndef len */ 7106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else { 7116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi write_f = T3T_MSG_NDEF_WRITEF_OFF; 7126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ln = p_cb->ndef_msg_len; 7136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 7146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, write_f); 7156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, p_cb->ndef_attrib.rwflag); 7166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, (ln >> 16) & 0xFF); /* High byte (of 3) of Ln */ 7176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, (ln >> 8) & 0xFF); /* Middle byte (of 3) of Ln */ 7186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, (ln)&0xFF); /* Low byte (of 3) of Ln */ 7196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate and append Checksum */ 7216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi checksum = 0; 7226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (i = 0; i < T3T_MSG_NDEF_ATTR_INFO_SIZE; i++) { 7236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi checksum += p_ndef_attr_info_start[i]; 7246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 7256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_BE_STREAM(p, checksum); 7266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate length of message */ 7286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_buf->len = (uint16_t)(p - p_cmd_start); 7296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the T3T message */ 7316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = rw_t3t_send_cmd(p_cb, RW_T3T_CMD_UPDATE_NDEF, p_cmd_buf, 7326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_update_timeout(1)); 7336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 7346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = NFC_STATUS_NO_BUFFERS; 7356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 7366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_next_ndef_update_cmd 743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send next segment of NDEF message to update 745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 7496fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t3t_send_next_ndef_update_cmd(tRW_T3T_CB* p_cb) { 7506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 7516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t block_id; 7526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t first_block_to_write; 7536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t ndef_blocks_to_write, ndef_blocks_remaining; 7546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint32_t ndef_bytes_remaining, ndef_padding = 0; 7556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t flags = 0; 7566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_cur_ndef_src_offset; 7576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf; 7586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *p_cmd_start, *p; 7596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t blocks_per_update; 7606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint32_t timeout; 7616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7620c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cmd_buf = rw_t3t_get_cmd_buf(); 7630c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cmd_buf != NULL) { 7646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Construct T3T message */ 7656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset; 7666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate number of ndef bytes remaining to write */ 7686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ndef_bytes_remaining = p_cb->ndef_msg_len - p_cb->ndef_msg_bytes_sent; 7696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate number of blocks remaining to write */ 7716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ndef_blocks_remaining = 7726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (uint16_t)((ndef_bytes_remaining + 15) >> 7736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4); /* ndef blocks remaining (rounded upward) */ 7746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate first NDEF block ID for this UPDATE command */ 7766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi first_block_to_write = (uint16_t)((p_cb->ndef_msg_bytes_sent >> 4) + 1); 7776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate max number of blocks per write. */ 7796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((first_block_to_write + 7806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_MAX_NDEF_BLOCKS_PER_UPDATE_1_BYTE_FORMAT) < 0x100) { 7816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* All block-numbers are < 0x100 (i.e. can be specified using one-byte 7826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * format) */ 7836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi blocks_per_update = RW_T3T_MAX_NDEF_BLOCKS_PER_UPDATE_1_BYTE_FORMAT; 7846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 7856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Block-numbers are >= 0x100 (i.e. need to be specified using two-byte 7866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * format) */ 7876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi blocks_per_update = RW_T3T_MAX_NDEF_BLOCKS_PER_UPDATE_2_BYTE_FORMAT; 7886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 7896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if blocks_per_update is bigger than what peer allows */ 7916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (blocks_per_update > p_cb->ndef_attrib.nbw) 7926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi blocks_per_update = p_cb->ndef_attrib.nbw; 7936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if remaining blocks can fit into one UPDATE command */ 7956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (ndef_blocks_remaining <= blocks_per_update) { 7966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* remaining blocks can fit into one UPDATE command */ 7976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ndef_blocks_to_write = ndef_blocks_remaining; 7986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 7996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Remaining blocks cannot fit into one UPDATE command */ 8006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ndef_blocks_to_write = blocks_per_update; 8016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Write to command header for UPDATE */ 8046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add UPDATE opcode to message */ 8066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, T3T_MSG_OPC_UPDATE_CMD); 807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 8086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add IDm to message */ 8096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM(p, p_cb->peer_nfcid2, NCI_NFCID2_LEN); 8106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add Service code list */ 8126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 1); /* Number of services (only 1 service: NDEF) */ 8136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM( 8146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, T3T_MSG_NDEF_SC_RW); /* Service code (little-endian format) */ 8156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add number of blocks in this UPDATE command */ 8176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM( 8186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, 8196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ndef_blocks_to_write); /* Number of blocks to write in this command */ 8206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi timeout = rw_t3t_update_timeout(ndef_blocks_to_write); 8216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (block_id = first_block_to_write; 8236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi block_id < (first_block_to_write + ndef_blocks_to_write); block_id++) { 8246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (block_id < 256) { 8256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Block IDs 0-255 can be specified in '2-byte' format: byte0=0, 8266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * byte1=blocknumber */ 8276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM( 8286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT); /* byte0: len=1; 8296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi access-mode=0; 8306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi service code list 8316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi order=0 */ 8326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, block_id); /* byte1: block number */ 8336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 8346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Block IDs 256+ must be specified in '3-byte' format: byte0=80h, 8356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * followed by blocknumber */ 8366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM( 8376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, 8386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 0x00); /* byte0: len=0; access-mode=0; service code list order=0 */ 8396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM( 8406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, block_id); /* byte1-2: block number in little-endian format */ 8416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add NDEF payload */ 8456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If this sending last block of NDEF, check if padding is needed to make 8476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * payload a multiple of 16 bytes */ 8486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (ndef_blocks_to_write == ndef_blocks_remaining) { 8496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ndef_padding = (16 - (ndef_bytes_remaining & 0x0F)) & 0x0F; 8506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (ndef_padding) { 8516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi flags |= RW_T3T_FL_PADDING; 8526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ndef_blocks_to_write--; /* handle the last block separately if it needs 8536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi padding */ 8546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add NDEF payload to the message */ 8586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cur_ndef_src_offset = &p_cb->ndef_msg[p_cb->ndef_msg_bytes_sent]; 8596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM(p, p_cur_ndef_src_offset, (ndef_blocks_to_write * 16)); 8616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_msg_bytes_sent += ((uint32_t)ndef_blocks_to_write * 16); 8626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (flags & RW_T3T_FL_PADDING) { 8646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add last of the NDEF message */ 8656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cur_ndef_src_offset = &p_cb->ndef_msg[p_cb->ndef_msg_bytes_sent]; 8666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM(p, p_cur_ndef_src_offset, (int)(16 - ndef_padding)); 8676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_msg_bytes_sent += (16 - ndef_padding); 8686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add padding */ 8706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memset(p, 0, ndef_padding); 8716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p += ndef_padding; 8726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate length of message */ 8756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_buf->len = (uint16_t)(p - p_cmd_start); 8766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the T3T message */ 8786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = rw_t3t_send_cmd(p_cb, RW_T3T_CMD_UPDATE_NDEF, p_cmd_buf, timeout); 8796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 8806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = NFC_STATUS_NO_BUFFERS; 8816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_next_ndef_check_cmd 889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send command for reading next segment of NDEF message 891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 8956fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t3t_send_next_ndef_check_cmd(tRW_T3T_CB* p_cb) { 8966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 8976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t block_id; 8986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t ndef_blocks_remaining, first_block_to_read, cur_blocks_to_read; 8996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint32_t ndef_bytes_remaining; 9006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf; 9016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *p_cmd_start, *p; 9026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9030c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cmd_buf = rw_t3t_get_cmd_buf(); 9040c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cmd_buf != NULL) { 9056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Construct T3T message */ 9066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset; 9076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate number of ndef bytes remaining to read */ 9096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ndef_bytes_remaining = p_cb->ndef_attrib.ln - p_cb->ndef_rx_offset; 9106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate number of blocks remaining to read */ 9126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ndef_blocks_remaining = 9136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (uint16_t)((ndef_bytes_remaining + 15) >> 9146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4); /* ndef blocks remaining (rounded upward) */ 9156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate first NDEF block ID */ 9176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi first_block_to_read = (uint16_t)((p_cb->ndef_rx_offset >> 4) + 1); 9186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if remaining blocks can fit into one CHECK command */ 9206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (ndef_blocks_remaining <= p_cb->ndef_attrib.nbr) { 9216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* remaining blocks can fit into one CHECK command */ 9226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi cur_blocks_to_read = ndef_blocks_remaining; 9236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_rx_readlen = ndef_bytes_remaining; 9246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags |= RW_T3T_FL_IS_FINAL_NDEF_SEGMENT; 9256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 9266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Remaining blocks cannot fit into one CHECK command */ 9276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi cur_blocks_to_read = 9286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib 9296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi .nbr; /* Read maximum number of blocks allowed by the peer */ 9306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_rx_readlen = ((uint32_t)p_cb->ndef_attrib.nbr * 16); 9316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 9326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG3( 9346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "rw_t3t_send_next_ndef_check_cmd: bytes_remaining: %i, " 9356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "cur_blocks_to_read: %i, is_final: %i", 9366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ndef_bytes_remaining, cur_blocks_to_read, 9376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->flags & RW_T3T_FL_IS_FINAL_NDEF_SEGMENT)); 9386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add CHECK opcode to message */ 9406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, T3T_MSG_OPC_CHECK_CMD); 941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 9426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add IDm to message */ 9436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM(p, p_cb->peer_nfcid2, NCI_NFCID2_LEN); 9446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add Service code list */ 9466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 1); /* Number of services (only 1 service: NDEF) */ 9476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Service code (little-endian format) . If NDEF is read-only, then use 9496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * T3T_MSG_NDEF_SC_RO, otherwise use T3T_MSG_NDEF_SC_RW */ 9506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->ndef_attrib.rwflag == T3T_MSG_NDEF_RWFLAG_RO) { 9516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM(p, T3T_MSG_NDEF_SC_RO); 9526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 9536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM(p, T3T_MSG_NDEF_SC_RW); 9546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 9556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add number of blocks in this CHECK command */ 9576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM( 9586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, cur_blocks_to_read); /* Number of blocks to check in this command */ 9596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (block_id = first_block_to_read; 9616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi block_id < (first_block_to_read + cur_blocks_to_read); block_id++) { 9626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (block_id < 256) { 9636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Block IDs 0-255 can be specified in '2-byte' format: byte0=0, 9646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * byte1=blocknumber */ 9656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM( 9666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT); /* byte1: len=0; 9676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi access-mode=0; 9686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi service code list 9696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi order=0 */ 9706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, block_id); /* byte1: block number */ 9716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 9726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Block IDs 256+ must be specified in '3-byte' format: byte0=80h, 9736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * followed by blocknumber */ 9746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM( 9756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, 9766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 0x00); /* byte0: len=1; access-mode=0; service code list order=0 */ 9776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM( 9786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, block_id); /* byte1-2: block number in little-endian format */ 9796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 9806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 9816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate length of message */ 9836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_buf->len = (uint16_t)(p - p_cmd_start); 9846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the T3T message */ 9866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = rw_t3t_send_cmd(p_cb, RW_T3T_CMD_CHECK_NDEF, p_cmd_buf, 9876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_check_timeout(cur_blocks_to_read)); 9886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 9896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = NFC_STATUS_NO_BUFFERS; 9906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 9916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 9926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_message_set_block_list 998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Add block list to T3T message 1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Number of bytes added to message 1002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 10046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_message_set_block_list(tRW_T3T_CB* p_cb, uint8_t** p, 10056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t num_blocks, 10066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tT3T_BLOCK_DESC* p_t3t_blocks) { 10076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t i, cur_service_code; 10086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t service_code_idx, num_services = 0; 10096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_msg_num_services; 10106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t service_list[T3T_MSG_SERVICE_LIST_MAX]; 1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add CHECK or UPDATE opcode to message */ 10136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM( 10146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p), ((p_cb->cur_cmd == RW_T3T_CMD_CHECK) ? T3T_MSG_OPC_CHECK_CMD 10156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi : T3T_MSG_OPC_UPDATE_CMD)); 1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add IDm to message */ 10186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM((*p), p_cb->peer_nfcid2, NCI_NFCID2_LEN); 1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Skip over Number of Services field */ 10216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg_num_services = (*p); /* pointer to Number of Services offset */ 10226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p)++; 1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Count number of different services are specified in the list, and add 10256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * services to Service Code list */ 10266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (i = 0; i < num_blocks; i++) { 10276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi cur_service_code = p_t3t_blocks[i].service_code; 1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if current service_code is already in the service_list */ 10306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (service_code_idx = 0; service_code_idx < num_services; 10316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi service_code_idx++) { 10326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (service_list[service_code_idx] == cur_service_code) break; 10336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (service_code_idx == num_services) { 10366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Service not in the list yet. Add it. */ 10376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi service_list[service_code_idx] = cur_service_code; 10386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi num_services++; 1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add service code to T3T message */ 10416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM((*p), cur_service_code); 1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 10436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add 'Number of Sservices' to the message */ 10466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *p_msg_num_services = num_services; 1047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add 'number of blocks' to the message */ 10496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM((*p), num_blocks); 1050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add block descriptors */ 10526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (i = 0; i < num_blocks; i++) { 10536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi cur_service_code = p_t3t_blocks[i].service_code; 1054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if current service_code is already in the service_list */ 10566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (service_code_idx = 0; service_code_idx < num_services; 10576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi service_code_idx++) { 10586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (service_list[service_code_idx] == cur_service_code) break; 10596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add decriptor to T3T message */ 10626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_t3t_blocks[i].block_number > 0xFF) { 10636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM((*p), service_code_idx); 10646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM((*p), p_t3t_blocks[i].block_number); 10656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 10666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi service_code_idx |= T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT; 10676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM((*p), service_code_idx); 10686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM((*p), p_t3t_blocks[i].block_number); 1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 10706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_check_cmd 1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send CHECK command 1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 10826fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t3t_send_check_cmd(tRW_T3T_CB* p_cb, uint8_t num_blocks, 10836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tT3T_BLOCK_DESC* p_t3t_blocks) { 10846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf; 10856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *p, *p_cmd_start; 10866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 10876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 10886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_cmd = RW_T3T_CMD_CHECK; 10890c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cmd_buf = rw_t3t_get_cmd_buf(); 10900c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cmd_buf != NULL) { 10916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Construct T3T message */ 10926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset; 10936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_message_set_block_list(p_cb, &p, num_blocks, p_t3t_blocks); 10946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 10956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate length of message */ 10966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_buf->len = (uint16_t)(p - p_cmd_start); 10976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 10986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the T3T message */ 10996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = rw_t3t_send_cmd(p_cb, RW_T3T_CMD_CHECK, p_cmd_buf, 11006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_check_timeout(num_blocks)); 11016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 11026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = NFC_STATUS_NO_BUFFERS; 11036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 11046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_update_cmd 1111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send UPDATE command 1113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 11176fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t3t_send_update_cmd(tRW_T3T_CB* p_cb, uint8_t num_blocks, 11186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tT3T_BLOCK_DESC* p_t3t_blocks, 11196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_data) { 11206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf; 11216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *p, *p_cmd_start; 11226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 11236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_cmd = RW_T3T_CMD_UPDATE; 11250c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cmd_buf = rw_t3t_get_cmd_buf(); 11260c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cmd_buf != NULL) { 11276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Construct T3T message */ 11286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset; 11296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_message_set_block_list(p_cb, &p, num_blocks, p_t3t_blocks); 11306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add data blocks to the message */ 11326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM(p, p_data, num_blocks * 16); 11336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate length of message */ 11356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_buf->len = (uint16_t)(p - p_cmd_start); 11366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the T3T message */ 11386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = rw_t3t_send_cmd(p_cb, RW_T3T_CMD_UPDATE, p_cmd_buf, 11396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_update_timeout(num_blocks)); 11406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 11416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = NFC_STATUS_NO_BUFFERS; 11426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 11436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 1145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 11495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function rw_t3t_check_mc_block 11505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 11515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description Send command to check Memory Configuration Block 11525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 11535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns tNFC_STATUS 11545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 11555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*****************************************************************************/ 11566fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t3t_check_mc_block(tRW_T3T_CB* p_cb) { 11576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf; 11586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *p, *p_cmd_start; 11595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 11606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Read Memory Configuration block */ 11610c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cmd_buf = rw_t3t_get_cmd_buf(); 11620c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cmd_buf != NULL) { 11636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Construct T3T message */ 11646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset; 11655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 11666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add CHECK opcode to message */ 11676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, T3T_MSG_OPC_CHECK_CMD); 11685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 11696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add IDm to message */ 11706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM(p, p_cb->peer_nfcid2, NCI_NFCID2_LEN); 11716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add Service code list */ 11736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 1); /* Number of services (only 1 service: NDEF) */ 11746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM( 11756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, T3T_MSG_NDEF_SC_RO); /* Service code (little-endian format) */ 11766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Number of blocks */ 11786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 1); /* Number of blocks (only 1 block: Memory 11796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi Configuration Information ) */ 11806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Block List element: the Memory Configuration block (block 0x88) */ 11826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT); 11836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, T3T_MSG_FELICALITE_BLOCK_ID_MC); 11846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate length of message */ 11866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_buf->len = (uint16_t)(p - p_cmd_start); 11876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 11886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the T3T message */ 11896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return rw_t3t_send_cmd(p_cb, p_cb->cur_cmd, p_cmd_buf, 11906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_check_timeout(1)); 11916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 11926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0("Unable to allocate buffer to read MC block"); 11936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_NO_BUFFERS); 11946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 11955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 11965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 11975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/***************************************************************************** 11985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 1199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_send_raw_frame 1200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send raw frame 1202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 12066fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t3t_send_raw_frame(tRW_T3T_CB* p_cb, uint16_t len, 12076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_data) { 12086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf; 12096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p; 12106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 12116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12120c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cmd_buf = rw_t3t_get_cmd_buf(); 12130c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cmd_buf != NULL) { 12146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Construct T3T message */ 12156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset; 12166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add data blocks to the message */ 12186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM(p, p_data, len); 12196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate length of message */ 12216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_buf->len = len; 12226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the T3T message */ 12246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = rw_t3t_send_cmd(p_cb, RW_T3T_CMD_SEND_RAW_FRAME, p_cmd_buf, 12256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_T3T_RAW_FRAME_CMD_TIMEOUT_TICKS); 12266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 12276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = NFC_STATUS_NO_BUFFERS; 12286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 12296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 1231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** TAG RESPONSE HANDLERS 1235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 1236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_act_handle_ndef_detect_rsp 1240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to NDEF detection 1242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 12466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_act_handle_ndef_detect_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) { 12476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p; 12486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint32_t temp; 12496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t i; 12506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t checksum_calc, checksum_rx; 12516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DETECT_NDEF_DATA evt_data; 12526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset; 12536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 12556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.flags = RW_NDEF_FL_UNKNOWN; 12566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if response code is CHECK resp (for reading NDEF attribute block) */ 12586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) { 12596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: expecting rsp_code %02X, but got %02X", 12606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_OPC_CHECK_RSP, 12616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]); 1262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project evt_data.status = NFC_STATUS_FAILED; 12636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 12646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate status code and NFCID2 response from tag */ 12656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != 12666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_RSP_STATUS_OK) /* verify response status code */ 12676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi || (memcmp(p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM], 12686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_NFCID2_LEN) != 0)) /* verify response IDm */ 12696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 12706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 12716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 12726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Get checksum from received ndef attribute msg */ 12736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = &p_t3t_rsp[T3T_MSG_RSP_OFFSET_CHECK_DATA + T3T_MSG_NDEF_ATTR_INFO_SIZE]; 12746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi BE_STREAM_TO_UINT16(checksum_rx, p); 12756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate checksum - move check for checsum to beginning */ 12776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi checksum_calc = 0; 12786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = &p_t3t_rsp[T3T_MSG_RSP_OFFSET_CHECK_DATA]; 12796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (i = 0; i < T3T_MSG_NDEF_ATTR_INFO_SIZE; i++) { 12806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi checksum_calc += p[i]; 12816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 12826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate checksum */ 12846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (checksum_calc != checksum_rx) { 12856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.status = 12866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_STATUS_FAILED; /* only ok or failed passed to the app. can be 12876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi boolean*/ 12886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0("RW_T3tDetectNDEF checksum failed"); 12906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 12916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.status = NFC_STATUS_OK; 12926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate version number */ 12946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi STREAM_TO_UINT8(p_cb->ndef_attrib.version, p); 12956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 12966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (T3T_GET_MAJOR_VERSION(T3T_MSG_NDEF_VERSION) < 12976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_GET_MAJOR_VERSION(p_cb->ndef_attrib.version)) { 12986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Remote tag's MajorVer is newer than our's. Reject NDEF as per T3TOP 12996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * RQ_T3T_NDA_024 */ 13006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2( 13016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "RW_T3tDetectNDEF: incompatible NDEF version. Local=0x%02x, " 13026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "Remote=0x%02x", 13036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_NDEF_VERSION, p_cb->ndef_attrib.version); 13046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.status = NFC_STATUS_FAILED; 13056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_BAD_RESP; 13066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 13076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Remote tag's MajorVer is equal or older than our's. NDEF is 13086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * compatible with our version. */ 13096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 13106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Update NDEF info */ 13116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi STREAM_TO_UINT8( 13126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.nbr, 13136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p); /* NBr: number of blocks that can be read using one Check 13146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi command */ 13156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi STREAM_TO_UINT8(p_cb->ndef_attrib.nbw, 13166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p); /* Nbw: number of blocks that can be written using 13176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi one Update command */ 13186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi BE_STREAM_TO_UINT16( 13196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.nmaxb, 13206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p); /* Nmaxb: maximum number of blocks available for NDEF data */ 13216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi BE_STREAM_TO_UINT32(temp, p); 13226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi STREAM_TO_UINT8(p_cb->ndef_attrib.writef, 13236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p); /* WriteFlag: 00h if writing data finished; 0Fh if 13246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi writing data in progress */ 13256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi STREAM_TO_UINT8( 13266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.rwflag, 13276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p); /* RWFlag: 00h NDEF is read-only; 01h if read/write available */ 13286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 13296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Get length (3-byte, big-endian) */ 13306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi STREAM_TO_UINT8(temp, p); /* Ln: high-byte */ 13316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi BE_STREAM_TO_UINT16(p_cb->ndef_attrib.ln, p); /* Ln: lo-word */ 13326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.ln += (temp << 16); 13336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 13346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG1("Detected NDEF Ver: 0x%02x", p_cb->ndef_attrib.version); 13356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG6( 13366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "Detected NDEF Attributes: Nbr=%i, Nbw=%i, Nmaxb=%i, WriteF=%i, " 13376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "RWFlag=%i, Ln=%i", 13386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.nbr, p_cb->ndef_attrib.nbw, 13396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.nmaxb, p_cb->ndef_attrib.writef, 13406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.rwflag, p_cb->ndef_attrib.ln); 13416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 13426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Set data for RW_T3T_NDEF_DETECT_EVT */ 13436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = p_cb->ndef_attrib.status; 13446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.cur_size = p_cb->ndef_attrib.ln; 13456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.max_size = (uint32_t)p_cb->ndef_attrib.nmaxb * 16; 13466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.protocol = NFC_PROTOCOL_T3T; 13476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.flags = (RW_NDEF_FL_SUPPORTED | RW_NDEF_FL_FORMATED); 13486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->ndef_attrib.rwflag == T3T_MSG_NDEF_RWFLAG_RO) 13496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.flags |= RW_NDEF_FL_READ_ONLY; 13506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 13526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 13546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG1("RW_T3tDetectNDEF response: %i", evt_data.status); 1355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 13566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 13576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_update_ndef_flag(&evt_data.flags); 13586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify app of NDEF detection result */ 13596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_NDEF_DETECT_EVT, (tRW_DATA*)&evt_data); 1360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 13616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg_rsp); 1362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_act_handle_check_rsp 1367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to CHECK command 1369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 13736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_act_handle_check_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) { 13746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset; 13756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_READ_DATA evt_data; 13766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS nfc_status = NFC_STATUS_OK; 13776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 13786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response from tag */ 13796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != 13806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_RSP_STATUS_OK) /* verify response status code */ 13816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi || (memcmp(p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM], 13826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_NFCID2_LEN) != 0)) /* verify response IDm */ 13836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 13846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_status = NFC_STATUS_FAILED; 13856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg_rsp); 13866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) { 13876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: expecting rsp_code %02X, but got %02X", 13886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_OPC_CHECK_RSP, 13896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]); 13906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_status = NFC_STATUS_FAILED; 13916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg_rsp); 13926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 13936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Copy incoming data into buffer */ 13946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg_rsp->offset += 13956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_RSP_OFFSET_CHECK_DATA; /* Skip over t3t header */ 13966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg_rsp->len -= T3T_MSG_RSP_OFFSET_CHECK_DATA; 13976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_OK; 13986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.p_data = p_msg_rsp; 13996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_CHECK_EVT, (tRW_DATA*)&evt_data); 14006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 14026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 1403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 14046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_CHECK_CPLT_EVT, (tRW_DATA*)&nfc_status); 1405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_act_handle_update_rsp 1410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to UPDATE command 1412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 14166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_act_handle_update_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) { 14176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset; 14186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_READ_DATA evt_data; 14196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 14206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response from tag */ 14216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != 14226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_RSP_STATUS_OK) /* verify response status code */ 14236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi || (memcmp(p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM], 14246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_NFCID2_LEN) != 0)) /* verify response IDm */ 14256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 14266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 14276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) { 14286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: expecting rsp_code %02X, but got %02X", 14296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_OPC_UPDATE_RSP, 14306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]); 14316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 14326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 14336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Copy incoming data into buffer */ 14346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_OK; 14356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 14376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 1438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 14396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_UPDATE_CPLT_EVT, (tRW_DATA*)&evt_data); 1440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 14416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg_rsp); 1442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_act_handle_raw_senddata_rsp 1447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to NDEF detection 1449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 14536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_act_handle_raw_senddata_rsp(tRW_T3T_CB* p_cb, 14546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_DATA_CEVT* p_data) { 14556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_READ_DATA evt_data; 14566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_pkt = p_data->p_data; 1457a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 1458a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#if (BT_TRACE_VERBOSE == TRUE) 14596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG2("RW T3T Raw Frame: Len [0x%X] Status [%s]", p_pkt->len, 14606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_GetStatusName(p_data->status)); 1461a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#else 14626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG2("RW T3T Raw Frame: Len [0x%X] Status [0x%X]", p_pkt->len, 14636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_data->status); 1464a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#endif 1465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 14666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Copy incoming data into buffer */ 14676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = p_data->status; 14686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.p_data = p_pkt; 1469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 14706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 1471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 14726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_RAW_FRAME_EVT, (tRW_DATA*)&evt_data); 1473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_act_handle_check_ndef_rsp 1478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to NDEF read segment 1480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 14846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_act_handle_check_ndef_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) { 14856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool check_complete = true; 14866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS nfc_status = NFC_STATUS_OK; 14876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_READ_DATA read_data; 14886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 14896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset; 14906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t rsp_num_bytes_rx; 14916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 14926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response from tag */ 14936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != 14946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_RSP_STATUS_OK) /* verify response status code */ 14956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi || (memcmp(p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM], 14966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_NFCID2_LEN) != 0) /* verify response IDm */ 14976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi || (p_t3t_rsp[T3T_MSG_RSP_OFFSET_NUMBLOCKS] != 14986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_cb->ndef_rx_readlen + 15) >> 4))) /* verify length of response */ 14996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 15006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: bad status, nfcid2, or invalid len: %i %i", 15016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_NUMBLOCKS], 15026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_cb->ndef_rx_readlen + 15) >> 4)); 15036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_status = NFC_STATUS_FAILED; 15046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg_rsp); 15056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) { 15066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: expecting rsp_code %02X, but got %02X", 15076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_OPC_CHECK_RSP, 15086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]); 15096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_status = NFC_STATUS_FAILED; 15106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg_rsp); 15116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 15126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify app of NDEF segment received */ 15136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rsp_num_bytes_rx = p_t3t_rsp[T3T_MSG_RSP_OFFSET_NUMBLOCKS] * 15146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16; /* Number of bytes received, according to header */ 15156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_rx_offset += p_cb->ndef_rx_readlen; 15166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi read_data.status = NFC_STATUS_OK; 15176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg_rsp->offset += 15186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_RSP_OFFSET_CHECK_DATA; /* Skip over t3t header (point to block 15196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi data) */ 15206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg_rsp->len -= T3T_MSG_RSP_OFFSET_CHECK_DATA; 15216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 15226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Verify that the bytes received is really the amount indicated in the 15236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * check-response header */ 15246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (rsp_num_bytes_rx > p_msg_rsp->len) { 15256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2( 15266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "Response error: CHECK rsp header indicates %i bytes, but only " 15276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "received %i bytes", 15286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rsp_num_bytes_rx, p_msg_rsp->len); 15296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_status = NFC_STATUS_FAILED; 15306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg_rsp); 15316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 15326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If this is the the final block, then set len to reflect only valid 15336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * bytes (do not include padding to 16-byte boundary) */ 15346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_cb->flags & RW_T3T_FL_IS_FINAL_NDEF_SEGMENT) && 15356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->ndef_attrib.ln & 0x000F)) { 15366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rsp_num_bytes_rx -= (16 - (p_cb->ndef_attrib.ln & 0x000F)); 15376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 15386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 15396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg_rsp->len = rsp_num_bytes_rx; 15406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi read_data.p_data = p_msg_rsp; 15416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_CHECK_EVT, (tRW_DATA*)&read_data); 15426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 15436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send CHECK cmd for next NDEF segment, if needed */ 15446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (!(p_cb->flags & RW_T3T_FL_IS_FINAL_NDEF_SEGMENT)) { 15450c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi nfc_status = rw_t3t_send_next_ndef_check_cmd(p_cb); 15460c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (nfc_status == NFC_STATUS_OK) { 15476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Still getting more segments. Don't send RW_T3T_CHECK_CPLT_EVT yet 15486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi */ 15496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi check_complete = false; 15506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 15516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 15526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 15536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 15546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 15556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Notify app of RW_T3T_CHECK_CPLT_EVT if entire NDEF has been read, or if 15566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * failure */ 15576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (check_complete) { 15586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 15596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = nfc_status; 15606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_CHECK_CPLT_EVT, (tRW_DATA*)&evt_data); 15616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_act_handle_update_ndef_rsp 1567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response to NDEF write segment 1569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 15736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_act_handle_update_ndef_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) { 15746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool update_complete = true; 15756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS nfc_status = NFC_STATUS_OK; 15766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 15776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset; 15786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 15796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check nfcid2 and status of response */ 15806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != 15816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_RSP_STATUS_OK) /* verify response status code */ 15826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi || (memcmp(p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM], 15836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_NFCID2_LEN) != 0)) /* verify response IDm */ 15846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 15856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_status = NFC_STATUS_FAILED; 15866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 15876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response opcode */ 15886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) { 15896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: expecting rsp_code %02X, but got %02X", 15906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_OPC_UPDATE_RSP, 15916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]); 15926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_status = NFC_STATUS_FAILED; 15936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 15946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If this is response to final UPDATE, then update NDEF local size */ 15956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (p_cb->flags & RW_T3T_FL_IS_FINAL_NDEF_SEGMENT) { 15966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If successful, update current NDEF size */ 15976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.ln = p_cb->ndef_msg_len; 15986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 15996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If any more NDEF bytes to update, then send next UPDATE command */ 16006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (p_cb->ndef_msg_bytes_sent < p_cb->ndef_msg_len) { 16016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send UPDATE command for next segment of NDEF */ 16020c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi nfc_status = rw_t3t_send_next_ndef_update_cmd(p_cb); 16030c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (nfc_status == NFC_STATUS_OK) { 16046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Wait for update response */ 16056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi update_complete = false; 16066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 16076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 16086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Otherwise, no more NDEF bytes. Send final UPDATE for Attribute Information 16096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi block */ 16106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else { 16116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags |= RW_T3T_FL_IS_FINAL_NDEF_SEGMENT; 16120c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi nfc_status = rw_t3t_send_update_ndef_attribute_cmd(p_cb, false); 16130c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (nfc_status == NFC_STATUS_OK) { 16146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Wait for update response */ 16156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi update_complete = false; 16166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 16176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 16186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If update is completed, then notify app */ 16206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (update_complete) { 16216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 16226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = nfc_status; 16236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_UPDATE_CPLT_EVT, (tRW_DATA*)&evt_data); 16246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 16266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg_rsp); 1627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 16286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return; 1629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_handle_get_sc_poll_rsp 1634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle POLL response for getting system codes 1636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 16406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t3t_handle_get_sc_poll_rsp(tRW_T3T_CB* p_cb, uint8_t nci_status, 16416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t num_responses, 16426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t sensf_res_buf_size, 16436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_sensf_res_buf) { 16446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p; 16456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t sc; 16466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Get the system code from the response */ 16486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nci_status == NCI_STATUS_OK) && (num_responses > 0) && 16496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (sensf_res_buf_size >= 16506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (RW_T3T_SENSF_RES_RD_OFFSET + RW_T3T_SENSF_RES_RD_LEN))) { 16516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = &p_sensf_res_buf[RW_T3T_SENSF_RES_RD_OFFSET]; 16526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi BE_STREAM_TO_UINT16(sc, p); 16536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG1("FeliCa detected (RD, system code %04X)", sc); 16556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->system_codes[p_cb->num_system_codes++] = sc; 16566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 16576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_handle_get_system_codes_cplt(); 1659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_handle_ndef_detect_poll_rsp 1664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle POLL response for getting system codes 16666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi** 16676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi** Returns Nothing 16686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi** 16696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi*****************************************************************************/ 16706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t3t_handle_ndef_detect_poll_rsp(tRW_T3T_CB* p_cb, 16716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t nci_status, 16726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t num_responses, 16736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t sensf_res_buf_size, 16746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_sensf_res_buf) { 16756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf; 16766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *p, *p_cmd_start; 16776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 16786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response for NDEF poll */ 16806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nci_status == NCI_STATUS_OK) && (num_responses > 0)) { 16816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Tag responded for NDEF poll */ 16826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Read NDEF attribute block */ 16840c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cmd_buf = rw_t3t_get_cmd_buf(); 16850c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cmd_buf != NULL) { 16866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Construct T3T message */ 16876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset; 16886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add CHECK opcode to message */ 16906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, T3T_MSG_OPC_CHECK_CMD); 16916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add IDm to message */ 16936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM(p, p_cb->peer_nfcid2, NCI_NFCID2_LEN); 16946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add Service code list */ 16966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 1); /* Number of services (only 1 service: NDEF) */ 16976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM( 16986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, T3T_MSG_NDEF_SC_RO); /* Service code (little-endian format) */ 16996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 17006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Number of blocks */ 17016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM( 17026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, 17036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1); /* Number of blocks (only 1 block: NDEF Attribute Information ) */ 17046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 17056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Block List element: the NDEF attribute information block (block 0) */ 17066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT); 17076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 0); 17086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 17096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate length of message */ 17106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_buf->len = (uint16_t)(p - p_cmd_start); 17116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 17126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the T3T message */ 17130c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi evt_data.status = rw_t3t_send_cmd(p_cb, RW_T3T_CMD_DETECT_NDEF, p_cmd_buf, 17140c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi rw_t3t_check_timeout(1)); 17150c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (evt_data.status == NFC_STATUS_OK) { 17166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* CHECK command sent. Wait for response */ 17176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return; 17186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 17206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nci_status = NFC_STATUS_FAILED; 17216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* NDEF detection failed */ 17246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 17256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.ndef.status = nci_status; 17266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.ndef.flags = RW_NDEF_FL_UNKNOWN; 17276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_update_ndef_flag(&evt_data.ndef.flags); 17286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_NDEF_DETECT_EVT, &evt_data); 1729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_update_block 1734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 17355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description Send UPDATE command for single block 17365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** (for formatting/configuring read only) 1737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tNFC_STATUS 1739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 17416fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t3t_update_block(tRW_T3T_CB* p_cb, uint8_t block_id, 17426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_block_data) { 17436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *p_dst, *p_cmd_start; 17446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_cmd_buf; 17456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS status; 1746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17470c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cmd_buf = rw_t3t_get_cmd_buf(); 17480c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cmd_buf != NULL) { 17496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_dst = p_cmd_start = (uint8_t*)(p_cmd_buf + 1) + p_cmd_buf->offset; 1750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add UPDATE opcode to message */ 17526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p_dst, T3T_MSG_OPC_UPDATE_CMD); 1753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add IDm to message */ 17556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM(p_dst, p_cb->peer_nfcid2, NCI_NFCID2_LEN); 1756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add Service code list */ 17586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p_dst, 1); /* Number of services (only 1 service: NDEF) */ 17596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_STREAM( 17606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_dst, T3T_MSG_NDEF_SC_RW); /* Service code (little-endian format) */ 1761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Number of blocks */ 17636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p_dst, 1); 1764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Add Block list element for MC */ 17666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p_dst, T3T_MSG_MASK_TWO_BYTE_BLOCK_DESC_FORMAT); 17676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p_dst, block_id); 1768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Copy MC data to UPDATE message */ 17706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ARRAY_TO_STREAM(p_dst, p_block_data, T3T_MSG_BLOCKSIZE); 1771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate length of message */ 17736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_buf->len = (uint16_t)(p_dst - p_cmd_start); 1774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the T3T message */ 17766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = rw_t3t_send_cmd(p_cb, p_cb->cur_cmd, p_cmd_buf, 17776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_update_timeout(1)); 17786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 17796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Unable to send UPDATE command */ 17806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = NFC_STATUS_NO_BUFFERS; 17816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 17836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (status); 1784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_handle_fmt_poll_rsp 1789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle POLL response for formatting felica-lite 1791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 17956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t3t_handle_fmt_poll_rsp(tRW_T3T_CB* p_cb, uint8_t nci_status, 17966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t num_responses, 17976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t sensf_res_buf_size, 17986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_sensf_res_buf) { 17996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 18006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 18016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_OK; 18026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 18036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response for poll response */ 18046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nci_status == NCI_STATUS_OK) && (num_responses > 0)) { 18056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Tag responded for Felica-Lite poll */ 18066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Get MemoryControl block */ 18076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG0("Felica-Lite tag detected...getting Memory Control block."); 18086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 18096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_substate = RW_T3T_FMT_SST_CHECK_MC_BLK; 18106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 18116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send command to check Memory Configuration block */ 18126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = rw_t3t_check_mc_block(p_cb); 18136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 18146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0("Felica-Lite tag not detected"); 18156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 18166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 18186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If error, notify upper layer */ 18196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (evt_data.status != NFC_STATUS_OK) { 18206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_format_cplt(evt_data.status); 18216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 1825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_act_handle_fmt_rsp 1827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handle response for formatting codes 1829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns Nothing 1831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 18336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_act_handle_fmt_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) { 18346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset; 18356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_mc; 18366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 1837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 18386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_OK; 1839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 18406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check tags's response for reading MemoryControl block */ 18416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_substate == RW_T3T_FMT_SST_CHECK_MC_BLK) { 18426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response opcode */ 18436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) { 18446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: expecting rsp_code %02X, but got %02X", 18456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_OPC_CHECK_RSP, 18466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]); 18476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 18486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 18496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate status code and NFCID2 response from tag */ 18506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != 18516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_RSP_STATUS_OK) /* verify response status code */ 18526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi || (memcmp(p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM], 18536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_NFCID2_LEN) != 0)) /* verify response IDm */ 18546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 18556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 18566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 18576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if memory configuration (MC) block to see if SYS_OP=1 (NDEF 18586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * enabled) */ 18596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_mc = &p_t3t_rsp[T3T_MSG_RSP_OFFSET_CHECK_DATA]; /* Point to MC data of 18606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi CHECK response */ 18616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 18626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_mc[T3T_MSG_FELICALITE_MC_OFFSET_SYS_OP] != 0x01) { 18636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Tag is not currently enabled for NDEF. Indicate that we need to 18646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * update the MC block */ 18656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 18666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Set SYS_OP field to 0x01 (enable NDEF) */ 18676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_mc[T3T_MSG_FELICALITE_MC_OFFSET_SYS_OP] = 0x01; 18686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 18696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Set RF_PRM field to 0x07 (procedure of issuance) */ 18706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_mc[T3T_MSG_FELICALITE_MC_OFFSET_RF_PRM] = 0x07; 18716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 18726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Construct and send UPDATE message to write MC block */ 18736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_substate = RW_T3T_FMT_SST_UPDATE_MC_BLK; 18746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = 18756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_update_block(p_cb, T3T_MSG_FELICALITE_BLOCK_ID_MC, p_mc); 18766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 18776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* SYS_OP=1: ndef already enabled. Just need to update attribute 18786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * information block */ 18796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_substate = RW_T3T_FMT_SST_UPDATE_NDEF_ATTRIB; 18806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = 18816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_update_block(p_cb, 0, (uint8_t*)rw_t3t_default_attrib_info); 18826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 18856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If error, notify upper layer */ 18866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (evt_data.status != NFC_STATUS_OK) { 18876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_format_cplt(evt_data.status); 1888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 18896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->rw_substate == RW_T3T_FMT_SST_UPDATE_MC_BLK) { 18906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response opcode */ 18916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) || 18926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK)) 1893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 18946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 18956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: rsp_code=%02X, status=%02X", 18966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE], 18976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]); 18986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 18996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 19006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* SYS_OP=1: ndef already enabled. Just need to update attribute 19016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * information block */ 19026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_substate = RW_T3T_FMT_SST_UPDATE_NDEF_ATTRIB; 19036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = 19046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_update_block(p_cb, 0, (uint8_t*)rw_t3t_default_attrib_info); 19056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 19076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If error, notify upper layer */ 19086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (evt_data.status != NFC_STATUS_OK) { 19096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_format_cplt(evt_data.status); 19106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 19116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->rw_substate == RW_T3T_FMT_SST_UPDATE_NDEF_ATTRIB) { 19126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response opcode */ 19136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) || 19146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK)) 1915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 19166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 19176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: rsp_code=%02X, status=%02X", 19186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE], 19196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]); 19206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 1921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 19236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_format_cplt(evt_data.status); 19246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 19256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 19266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg_rsp); 1927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 19295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/***************************************************************************** 19305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 19315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function rw_t3t_handle_sro_poll_rsp 19325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 19335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description Handle POLL response for configuring felica-lite read only 19345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 19355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns Nothing 19365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 19375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*****************************************************************************/ 19386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t3t_handle_sro_poll_rsp(tRW_T3T_CB* p_cb, uint8_t nci_status, 19396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t num_responses, 19406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t sensf_res_buf_size, 19416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_sensf_res_buf) { 19426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 19436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t rw_t3t_ndef_attrib_info[T3T_MSG_BLOCKSIZE]; 19446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p; 19456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t tempU8; 19466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t checksum, i; 19476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint32_t tempU32 = 0; 19486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 19496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_OK; 19506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 19516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response for poll response */ 19526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((nci_status == NCI_STATUS_OK) && (num_responses > 0)) { 19536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Tag responded for Felica-Lite poll */ 19546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->ndef_attrib.rwflag != T3T_MSG_NDEF_RWFLAG_RO) { 19556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* First update attribute information block */ 19566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG0( 19576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "Felica-Lite tag detected...update NDef attribution block."); 19586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 19596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_substate = RW_T3T_SRO_SST_UPDATE_NDEF_ATTRIB; 19606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 19616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = rw_t3t_ndef_attrib_info; 19626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 19636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, p_cb->ndef_attrib.version); 19646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 19656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Update NDEF info */ 19666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM( 19676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, p_cb->ndef_attrib.nbr); /* NBr: number of blocks that can be read 19686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi using one Check command */ 19696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, p_cb->ndef_attrib.nbw); /* Nbw: number of blocks that 19706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi can be written using one 19716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi Update command */ 19726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_BE_STREAM( 19736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p, p_cb->ndef_attrib.nmaxb); /* Nmaxb: maximum number of blocks 19746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi available for NDEF data */ 19756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT32_TO_BE_STREAM(p, tempU32); 19766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 19776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.writef); /* WriteFlag: 00h if writing 19786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi data finished; 0Fh if 19796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi writing data in progress */ 19806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, 0x00); /* RWFlag: 00h NDEF is read-only */ 19816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 19826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tempU8 = (uint8_t)(p_cb->ndef_attrib.ln >> 16); 19836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Get length (3-byte, big-endian) */ 19846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT8_TO_STREAM(p, tempU8); /* Ln: high-byte */ 19856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_BE_STREAM(p, p_cb->ndef_attrib.ln); /* Ln: lo-word */ 19866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 19876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Calculate and append Checksum */ 19886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi checksum = 0; 19896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (i = 0; i < T3T_MSG_NDEF_ATTR_INFO_SIZE; i++) { 19906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi checksum += rw_t3t_ndef_attrib_info[i]; 19916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 19926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UINT16_TO_BE_STREAM(p, checksum); 19936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 19946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = 19956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_update_block(p_cb, 0, (uint8_t*)rw_t3t_ndef_attrib_info); 19966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->cur_cmd == RW_T3T_CMD_SET_READ_ONLY_HARD) { 19976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* NDEF is already read only, Read and update MemoryControl block */ 19986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG0( 19996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "Felica-Lite tag detected...getting Memory Control block."); 20006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_substate = RW_T3T_SRO_SST_CHECK_MC_BLK; 20016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 20026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send command to check Memory Configuration block */ 20036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = rw_t3t_check_mc_block(p_cb); 20046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 20056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 20066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0("Felica-Lite tag not detected"); 20076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 20086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 20095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If error, notify upper layer */ 20116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (evt_data.status != NFC_STATUS_OK) { 20126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_set_readonly_cplt(evt_data.status); 20136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 20145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 20155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/***************************************************************************** 20175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 20185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function rw_t3t_act_handle_sro_rsp 20195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 20205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description Handle response for setting read only codes 20215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 20225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns Nothing 20235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 20245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*****************************************************************************/ 20256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_act_handle_sro_rsp(tRW_T3T_CB* p_cb, NFC_HDR* p_msg_rsp) { 20266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_t3t_rsp = (uint8_t*)(p_msg_rsp + 1) + p_msg_rsp->offset; 20276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_mc; 20286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 20295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_OK; 20315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_substate == RW_T3T_SRO_SST_UPDATE_NDEF_ATTRIB) { 20336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response opcode */ 20346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) || 20356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK)) 20365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 20386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: rsp_code=%02X, status=%02X", 20396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE], 20406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]); 20416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 20426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 20436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.rwflag = T3T_MSG_NDEF_RWFLAG_RO; 20446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->cur_cmd == RW_T3T_CMD_SET_READ_ONLY_HARD) { 20456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_substate = RW_T3T_SRO_SST_CHECK_MC_BLK; 20465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send command to check Memory Configuration block */ 20486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = rw_t3t_check_mc_block(p_cb); 20496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 20506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_set_readonly_cplt(evt_data.status); 20516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 20526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 20536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->rw_substate == RW_T3T_SRO_SST_CHECK_MC_BLK) { 20546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check tags's response for reading MemoryControl block, Validate response 20556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * opcode */ 20566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_CHECK_RSP) { 20576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: expecting rsp_code %02X, but got %02X", 20586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_OPC_CHECK_RSP, 20596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE]); 20606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 20615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 20626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate status code and NFCID2 response from tag */ 20636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != 20646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_RSP_STATUS_OK) /* verify response status code */ 20656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi || (memcmp(p_cb->peer_nfcid2, &p_t3t_rsp[T3T_MSG_RSP_OFFSET_IDM], 20666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_NFCID2_LEN) != 0)) /* verify response IDm */ 20676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 20686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 20696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 20706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if memory configuration (MC) block to see if SYS_OP=1 (NDEF 20716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * enabled) */ 20726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_mc = &p_t3t_rsp[T3T_MSG_RSP_OFFSET_CHECK_DATA]; /* Point to MC data of 20736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi CHECK response */ 20746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 20756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_mc[T3T_MSG_FELICALITE_MC_OFFSET_SYS_OP] != 0x01) { 20766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Tag is not currently enabled for NDEF */ 20776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 20786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 20796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Set MC_SP field with MC[0] = 0x00 & MC[1] = 0xC0 (Hardlock) to change 20806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * access permission from RW to RO */ 20816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_mc[T3T_MSG_FELICALITE_MC_OFFSET_MC_SP] = 0x00; 20826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Not changing the access permission of Subtraction Register and 20836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * MC[0:1] */ 20846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_mc[T3T_MSG_FELICALITE_MC_OFFSET_MC_SP + 1] = 0xC0; 20856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 20866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Set RF_PRM field to 0x07 (procedure of issuance) */ 20876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_mc[T3T_MSG_FELICALITE_MC_OFFSET_RF_PRM] = 0x07; 20886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 20896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Construct and send UPDATE message to write MC block */ 20906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_substate = RW_T3T_SRO_SST_UPDATE_MC_BLK; 20916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = 20926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_update_block(p_cb, T3T_MSG_FELICALITE_BLOCK_ID_MC, p_mc); 20936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 20946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 20956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->rw_substate == RW_T3T_SRO_SST_UPDATE_MC_BLK) { 20966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Validate response opcode */ 20976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE] != T3T_MSG_OPC_UPDATE_RSP) || 20986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1] != T3T_MSG_RSP_STATUS_OK)) 20995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 21005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 21016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR2("Response error: rsp_code=%02X, status=%02X", 21026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_RSPCODE], 21036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_t3t_rsp[T3T_MSG_RSP_OFFSET_STATUS1]); 21046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 21056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 21066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_set_readonly_cplt(evt_data.status); 21075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 21086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 21095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 21106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If error, notify upper layer */ 21116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (evt_data.status != NFC_STATUS_OK) { 21126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_set_readonly_cplt(evt_data.status); 21136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 21146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 21156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg_rsp); 21165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 21175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 2118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_data_cback 2121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This callback function receives the data from NFCC. 2123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 2125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 21276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_data_cback(uint8_t conn_id, tNFC_DATA_CEVT* p_data) { 21286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 21296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_msg = p_data->p_data; 21306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool free_msg = false; /* if TRUE, free msg buffer before returning */ 21316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t *p, sod; 2132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 21336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Stop rsponse timer */ 21346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_stop_quick_timer(&p_cb->timer); 2135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2136303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE) 21376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Update rx stats */ 21386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_main_update_rx_stats(p_msg->len); 21396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */ 21406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 21416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if we are expecting a response */ 21426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state != RW_T3T_STATE_COMMAND_PENDING) { 21436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* 21446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ** This must be raw frame response 21456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ** send raw frame to app with SoD 21466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi */ 21476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_act_handle_raw_senddata_rsp(p_cb, p_data); 21486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 21496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Sanity check: verify msg len is big enough to contain t3t header */ 21506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (p_msg->len < T3T_MSG_RSP_COMMON_HDR_LEN) { 21516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("T3T: invalid Type3 Tag Message (invalid len: %i)", 21526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->len); 21536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi free_msg = true; 21546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 21556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_process_frame_error(); 21566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 21576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check for RF frame error */ 21586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p = (uint8_t*)(p_msg + 1) + p_msg->offset; 21596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi sod = p[0]; 21606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p[sod] != NCI_STATUS_OK) { 21616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("T3T: rf frame error (crc status=%i)", p[sod]); 21626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg); 21636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 21646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_process_frame_error(); 21656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return; 2166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 2167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE) 21696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi DispT3TagMessage(p_msg, true); 2170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 2171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 21726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Skip over SoD */ 21736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->offset++; 21746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_msg->len--; 2175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 21766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Get response code */ 21776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (p_cb->cur_cmd) { 21786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case RW_T3T_CMD_DETECT_NDEF: 21796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_act_handle_ndef_detect_rsp(p_cb, p_msg); 21806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 21816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 21826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case RW_T3T_CMD_CHECK_NDEF: 21836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_act_handle_check_ndef_rsp(p_cb, p_msg); 21846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 21856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 21866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case RW_T3T_CMD_UPDATE_NDEF: 21876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_act_handle_update_ndef_rsp(p_cb, p_msg); 21886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 21896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 21906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case RW_T3T_CMD_CHECK: 21916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_act_handle_check_rsp(p_cb, p_msg); 21926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 21936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 21946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case RW_T3T_CMD_UPDATE: 21956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_act_handle_update_rsp(p_cb, p_msg); 21966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 21976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 21986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case RW_T3T_CMD_SEND_RAW_FRAME: 21996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_act_handle_raw_senddata_rsp(p_cb, p_data); 22006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 22016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 22026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case RW_T3T_CMD_FORMAT: 22036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_act_handle_fmt_rsp(p_cb, p_msg); 22046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 22056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 22066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case RW_T3T_CMD_SET_READ_ONLY_SOFT: 22076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case RW_T3T_CMD_SET_READ_ONLY_HARD: 22086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_act_handle_sro_rsp(p_cb, p_msg); 22096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 22106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 22116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi default: 22126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg); 22136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 22156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 22176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (free_msg) { 22186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_msg); 22196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 22206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi} 2221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_conn_cback 2225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This callback function receives the events/data from NFCC. 2227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 2229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 22316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid rw_t3t_conn_cback(uint8_t conn_id, tNFC_CONN_EVT event, 22326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_CONN* p_data) { 22336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 22346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG2("rw_t3t_conn_cback: conn_id=%i, evt=0x%02x", conn_id, event); 2235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 22366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Only handle NFC_RF_CONN_ID conn_id */ 22376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (conn_id != NFC_RF_CONN_ID) { 22386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return; 22396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 22416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (event) { 2242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_DEACTIVATE_CEVT: 22436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_unselect(NULL); 22446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 22466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case NFC_DATA_CEVT: /* check for status in tNFC_CONN */ 22476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_data != NULL) && ((p_data->data.status == NFC_STATUS_OK) || 22486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_data->data.status == NFC_STATUS_CONTINUE))) { 22496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_data_cback(conn_id, &(p_data->data)); 22506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 22516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_data->data.p_data != NULL) { 22526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Free the response buffer in case of error response */ 22536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf((NFC_HDR*)(p_data->data.p_data)); 22546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_data->data.p_data = NULL; 22556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 22566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Data event with error status...fall through to NFC_ERROR_CEVT case */ 2257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_ERROR_CEVT: 22596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_stop_quick_timer(&p_cb->timer); 2260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2261303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE) 22626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_main_update_trans_error_stats(); 22636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */ 2264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 22656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (event == NFC_ERROR_CEVT) 22666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_process_error(NFC_STATUS_TIMEOUT); 22676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (p_data) 22686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_process_error(p_data->status); 22696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 22726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 22736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2278818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Function rw_t3t_mrti_to_a_b 2279818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 2280818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Description Converts the given MRTI (Maximum Response Time Information) 2281818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** to the base to calculate timeout value. 2282818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** (The timeout value is a + b * number_blocks) 2283818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 2284818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** Returns NFC_STATUS_OK 2285818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 2286818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith*******************************************************************************/ 22876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t3t_mrti_to_a_b(uint8_t mrti, uint32_t* p_a, uint32_t* p_b) { 22886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t a, b, e; 22896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 22906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi a = (mrti & 0x7) + 1; /* A is bit 0 ~ bit 2 */ 22916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi mrti >>= 3; 22926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi b = (mrti & 0x7) + 1; /* B is bit 3 ~ bit 5 */ 22936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi mrti >>= 3; 22946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi e = mrti & 0x3; /* E is bit 6 ~ bit 7 */ 22956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *p_a = rw_t3t_mrti_base[e] * a; /* (A+1) * base (i.e T/t3t * 4^E) */ 22966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *p_b = rw_t3t_mrti_base[e] * b; /* (B+1) * base (i.e T/t3t * 4^E) */ 2297818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith} 2298818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith 2299818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith/******************************************************************************* 2300818b56eda129e0370afe6bcb808b0ed55c898d13Sherry Smith** 2301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_select 2302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Called by NFC manager when a Type3 tag has been activated 2304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK 2306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 23086fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS rw_t3t_select(uint8_t peer_nfcid2[NCI_RF_F_UID_LEN], 23096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t mrti_check, uint8_t mrti_update) { 23106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 23116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 23126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API0("rw_t3t_select"); 23136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 23146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memcpy(p_cb->peer_nfcid2, peer_nfcid2, 23156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NCI_NFCID2_LEN); /* Store tag's NFCID2 */ 23166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_attrib.status = 23176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_STATUS_NOT_INITIALIZED; /* Indicate that NDEF detection has not been 23186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi performed yet */ 23196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_IDLE; 23206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags = 0; 23216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_mrti_to_a_b(mrti_check, &p_cb->check_tout_a, &p_cb->check_tout_b); 23226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_mrti_to_a_b(mrti_update, &p_cb->update_tout_a, &p_cb->update_tout_b); 23236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 23246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Alloc cmd buf for retransmissions */ 23256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->p_cur_cmd_buf == NULL) { 23260c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi p_cb->p_cur_cmd_buf = (NFC_HDR*)GKI_getpoolbuf(NFC_RW_POOL_ID); 23270c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (p_cb->p_cur_cmd_buf == NULL) { 23286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0( 23296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "rw_t3t_select: unable to allocate buffer for retransmission"); 23306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_NOT_ACTIVATED; 23316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 23326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 23336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 23346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 23356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_SetStaticRfCback(rw_t3t_conn_cback); 23366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 23376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return NFC_STATUS_OK; 2338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_unselect 2343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Called by NFC manager when a Type3 tag has been de-activated 2345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns NFC_STATUS_OK 2347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 23496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic tNFC_STATUS rw_t3t_unselect(uint8_t peer_nfcid2[]) { 23506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 2351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2352303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (RW_STATS_INCLUDED == TRUE) 23536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Display stats */ 23546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_main_log_stats(); 23556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif /* RW_STATS_INCLUDED */ 2356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 23576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Stop t3t timer (if started) */ 23586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfc_stop_quick_timer(&p_cb->timer); 2359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 23606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Free cmd buf for retransmissions */ 23616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->p_cur_cmd_buf) { 23626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GKI_freebuf(p_cb->p_cur_cmd_buf); 23636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->p_cur_cmd_buf = NULL; 23646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 23666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_NOT_ACTIVATED; 23676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_SetStaticRfCback(NULL); 2368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 23696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return NFC_STATUS_OK; 2370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2372a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu/******************************************************************************* 2373a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 2374a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Function rw_t3t_update_ndef_flag 2375a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 2376a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Description set additional NDEF Flags for felica lite tag 2377a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 2378a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Returns updated NDEF Flag value 2379a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 2380a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu*******************************************************************************/ 23816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void rw_t3t_update_ndef_flag(uint8_t* p_flag) { 23826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 23836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t xx; 2384a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 23856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi for (xx = 0; xx < p_cb->num_system_codes; xx++) { 23866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->system_codes[xx] == T3T_SYSTEM_CODE_FELICA_LITE) { 23876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *p_flag &= ~RW_NDEF_FL_UNKNOWN; 23886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *p_flag |= (RW_NDEF_FL_SUPPORTED | RW_NDEF_FL_FORMATABLE); 23896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2390a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 23916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2392a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu} 2393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 2395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_cmd_str 2398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Converts cmd_id to command string for logging 2400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns command string 2402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 24046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic char* rw_t3t_cmd_str(uint8_t cmd_id) { 24056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (cmd_id) { 2406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_DETECT_NDEF: 24076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "RW_T3T_CMD_DETECT_NDEF"; 2408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_CHECK_NDEF: 24106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "RW_T3T_CMD_CHECK_NDEF"; 2411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_UPDATE_NDEF: 24136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "RW_T3T_CMD_UPDATE_NDEF"; 2414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_CHECK: 24166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "RW_T3T_CMD_CHECK"; 2417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_UPDATE: 24196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "RW_T3T_CMD_UPDATE"; 2420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_SEND_RAW_FRAME: 24226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "RW_T3T_CMD_SEND_RAW_FRAME"; 2423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_CMD_GET_SYSTEM_CODES: 24256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "RW_T3T_CMD_GET_SYSTEM_CODES"; 2426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 24286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "Unknown"; 24296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 2433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function rw_t3t_state_str 2435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Converts state_id to command string for logging 2437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns command string 2439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 24416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic char* rw_t3t_state_str(uint8_t state_id) { 24426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (state_id) { 2443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_STATE_NOT_ACTIVATED: 24446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "RW_T3T_STATE_NOT_ACTIVATED"; 2445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_STATE_IDLE: 24476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "RW_T3T_STATE_IDLE"; 2448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case RW_T3T_STATE_COMMAND_PENDING: 24506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "RW_T3T_STATE_COMMAND_PENDING"; 2451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 24536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return "Unknown"; 24546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 2457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Type3 Tag API Functions 2460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 2461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tDetectNDef 2465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** This function is used to perform NDEF detection on a Type 3 tag, and 2468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** retrieve the tag's NDEF attribute information (block 0). 2469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Before using this API, the application must call RW_SelectTagType to 2471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** indicate that a Type 3 tag has been activated, and to provide the 2472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** tag's Manufacture ID (IDm) . 2473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK: ndef detection procedure started 2476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 24806fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T3tDetectNDef(void) { 24816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 24826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 24836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 24846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API0("RW_T3tDetectNDef"); 24856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 24866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if we are in valid state to handle this API */ 24876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state != RW_T3T_STATE_IDLE) { 24886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)", 24896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state); 24906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 24916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 24926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 24930c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi retval = (tNFC_STATUS)nci_snd_t3t_polling(T3T_SYSTEM_CODE_NDEF, 0, 0); 24940c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (retval == NCI_STATUS_OK) { 24956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_cmd = RW_T3T_CMD_DETECT_NDEF; 24966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_tout = RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS; 24976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_poll_rc = 0; 24986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING; 24996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags |= RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP; 2500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 25016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* start timer for waiting for responses */ 25026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_start_poll_timer(p_cb); 25036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 25056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 2506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tCheckNDef 2511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Retrieve NDEF contents from a Type3 tag. 2514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The RW_T3T_CHECK_EVT event is used to notify the application for each 2516552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** segment of NDEF data received. The RW_T3T_CHECK_CPLT_EVT event is used 2517552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** to notify the application all segments have been received. 2518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Before using this API, the RW_T3tDetectNDef function must be called to 2520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** verify that the tag contains NDEF data, and to retrieve the NDEF 2521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** attributes. 2522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Internally, this command will be separated into multiple Tag 3 Check 2524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** commands (if necessary) - depending on the tag's Nbr (max number of 2525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** blocks per read) attribute. 2526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK: check command started 2529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 25336fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T3tCheckNDef(void) { 25346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 25356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 25366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 25376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API0("RW_T3tCheckNDef"); 25386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 25396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if we are in valid state to handle this API */ 25406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state != RW_T3T_STATE_IDLE) { 25416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)", 25426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state); 25436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 25446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->ndef_attrib.status != 25456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_STATUS_OK) /* NDEF detection not performed yet? */ 25466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 25476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0("Error: NDEF detection not performed yet"); 25486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_NOT_INITIALIZED); 25496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->ndef_attrib.ln == 0) { 25506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0("Type 3 tag contains empty NDEF message"); 25516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 25526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 25536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 25546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check number of blocks needed for this update */ 25556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_IS_FINAL_NDEF_SEGMENT; 25566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_rx_offset = 0; 25576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = rw_t3t_send_next_ndef_check_cmd(p_cb); 25586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 25596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 2560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tUpdateNDef 2565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Write NDEF contents to a Type3 tag. 2568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The RW_T3T_UPDATE_CPLT_EVT callback event will be used to notify the 2570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** application of the response. 2571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Before using this API, the RW_T3tDetectNDef function must be called to 2573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** verify that the tag contains NDEF data, and to retrieve the NDEF 2574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** attributes. 2575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Internally, this command will be separated into multiple Tag 3 Update 2577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** commands (if necessary) - depending on the tag's Nbw (max number of 2578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** blocks per write) attribute. 2579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK: check command started 2582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_REFUSED: tag is read-only 2584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_BUFFER_FULL: len exceeds tag's maximum size 2585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 25886fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T3tUpdateNDef(uint32_t len, uint8_t* p_data) { 25896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 25906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 25916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 25926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API1("RW_T3tUpdateNDef (len=%i)", len); 25936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 25946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if we are in valid state to handle this API */ 25956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state != RW_T3T_STATE_IDLE) { 25966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)", 25976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state); 25986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 25996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->ndef_attrib.status != 26006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_STATUS_OK) /* NDEF detection not performed yet? */ 26016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 26026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0("Error: NDEF detection not performed yet"); 26036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_NOT_INITIALIZED); 26046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (len > (((uint32_t)p_cb->ndef_attrib.nmaxb) * 26056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 16)) /* Len exceed's tag's NDEF memory? */ 26066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 26076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_BUFFER_FULL); 26086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cb->ndef_attrib.rwflag == 26096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_NDEF_RWFLAG_RO) /* Tag's NDEF memory is read-only? */ 26106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 26116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_REFUSED); 26126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 26136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 26146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check number of blocks needed for this update */ 26156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags &= ~RW_T3T_FL_IS_FINAL_NDEF_SEGMENT; 26166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_msg_bytes_sent = 0; 26176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_msg_len = len; 26186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->ndef_msg = p_data; 26196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 26206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send initial UPDATE command for NDEF Attribute Info */ 26216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = rw_t3t_send_update_ndef_attribute_cmd(p_cb, true); 26226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 26236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 2624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tCheck 2629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Read (non-NDEF) contents from a Type3 tag. 2632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The RW_READ_EVT event is used to notify the application for each 2634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** segment of NDEF data received. The RW_READ_CPLT_EVT event is used to 2635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** notify the application all segments have been received. 2636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Before using this API, the application must call RW_SelectTagType to 2638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** indicate that a Type 3 tag has been activated, and to provide the 2639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** tag's Manufacture ID (IDm) . 2640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK: check command started 2643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 26476fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T3tCheck(uint8_t num_blocks, tT3T_BLOCK_DESC* t3t_blocks) { 26486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 26496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 2650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 26516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API1("RW_T3tCheck (num_blocks = %i)", num_blocks); 2652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 26536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if we are in valid state to handle this API */ 26546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state != RW_T3T_STATE_IDLE) { 26556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)", 26566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state); 26576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 26586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 26606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the CHECK command */ 26616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = rw_t3t_send_check_cmd(p_cb, num_blocks, t3t_blocks); 2662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 26636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 2664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tUpdate 2669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Write (non-NDEF) contents to a Type3 tag. 2672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The RW_WRITE_CPLT_EVT event is used to notify the application all 2674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** segments have been received. 2675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Before using this API, the application must call RW_SelectTagType to 2677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** indicate that a Type 3 tag has been activated, and to provide the tag's 2678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Manufacture ID (IDm) . 2679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK: check command started 2682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 26866fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T3tUpdate(uint8_t num_blocks, tT3T_BLOCK_DESC* t3t_blocks, 26876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_data) { 26886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 26896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 2690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 26916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API1("RW_T3tUpdate (num_blocks = %i)", num_blocks); 2692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 26936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if we are in valid state to handle this API */ 26946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state != RW_T3T_STATE_IDLE) { 26956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)", 26966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state); 26976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 26986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 27006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the UPDATE command */ 27016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = rw_t3t_send_update_cmd(p_cb, num_blocks, t3t_blocks, p_data); 2702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 27036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 2704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tPresenceCheck 2709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Check if the tag is still in the field. 2712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The RW_T3T_PRESENCE_CHECK_EVT w/ status is used to indicate presence 2714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** or non-presence. 2715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK, if raw data frame sent 2718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 27226fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T3tPresenceCheck(void) { 27236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 27246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 27256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_CB* p_rw_cb = &rw_cb; 27266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 27276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API0("RW_T3tPresenceCheck"); 27286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 27296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If RW_SelectTagType was not called (no conn_callback) return failure */ 27306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (!(p_rw_cb->p_cback)) { 27316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = NFC_STATUS_FAILED; 27326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 27336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If we are not activated, then RW_T3T_PRESENCE_CHECK_EVT status=FAIL */ 27346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (p_rw_cb->tcb.t3t.rw_state == RW_T3T_STATE_NOT_ACTIVATED) { 27356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_FAILED; 27366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_rw_cb->p_cback)(RW_T3T_PRESENCE_CHECK_EVT, &evt_data); 27376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 27386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If command is pending */ 27396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (p_rw_cb->tcb.t3t.rw_state == RW_T3T_STATE_COMMAND_PENDING) { 27406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If already performing presence check, return error */ 27416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_rw_cb->tcb.t3t.flags & RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP) { 27426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG0("RW_T3tPresenceCheck already in progress"); 27436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = NFC_STATUS_FAILED; 27446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 27456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* If busy with any other command, assume that the tag is present */ 27466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else { 27476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_OK; 27486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_rw_cb->p_cback)(RW_T3T_PRESENCE_CHECK_EVT, &evt_data); 27496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 27506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 27516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* IDLE state: send POLL command */ 27520c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi retval = (tNFC_STATUS)nci_snd_t3t_polling(0xFFFF, T3T_POLL_RC_SC, 0); 27530c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (retval == NCI_STATUS_OK) { 27546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_rw_cb->tcb.t3t.flags |= RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP; 27556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_rw_cb->tcb.t3t.rw_state = RW_T3T_STATE_COMMAND_PENDING; 27566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_rw_cb->tcb.t3t.cur_poll_rc = 0; 27576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 27586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* start timer for waiting for responses */ 27596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_start_poll_timer(&p_rw_cb->tcb.t3t); 27606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 27616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_DEBUG1( 27626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "RW_T3tPresenceCheck error sending NCI_RF_T3T_POLLING cmd (status = " 27636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "0x%0x)", 27646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval); 27656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 27666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 27676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 27686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 2769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tPoll 2774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Send POLL command 2777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK, if raw data frame sent 2780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 27846fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T3tPoll(uint16_t system_code, tT3T_POLL_RC rc, uint8_t tsn) { 27856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 27866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 27876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 27886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API0("RW_T3tPoll"); 27896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 27906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if we are in valid state to handle this API */ 27916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state != RW_T3T_STATE_IDLE) { 27926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)", 27936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state); 27946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 27956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 27966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 27970c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi retval = (tNFC_STATUS)nci_snd_t3t_polling(system_code, (uint8_t)rc, tsn); 27980c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (retval == NCI_STATUS_OK) { 27996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* start timer for waiting for responses */ 28006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_poll_rc = rc; 28016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING; 28026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_start_poll_timer(p_cb); 28036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 28056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 2806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tSendRawFrame 2811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** This function is called to send a raw data frame to the peer device. 2814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** When type 3 tag receives response from peer, the callback function 2815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** will be called with a RW_T3T_RAW_FRAME_EVT [Table 6]. 2816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Before using this API, the application must call RW_SelectTagType to 2818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** indicate that a Type 3 tag has been activated. 2819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** The raw frame should be a properly formatted Type 3 tag message. 2821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK, if raw data frame sent 2824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 28286fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T3tSendRawFrame(uint16_t len, uint8_t* p_data) { 28296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 28306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 2831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 28326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API1("RW_T3tSendRawFrame (len = %i)", len); 2833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 28346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if we are in valid state to handle this API */ 28356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state != RW_T3T_STATE_IDLE) { 28366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)", 28376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state); 28386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 28396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 28416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send the UPDATE command */ 28426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi retval = rw_t3t_send_raw_frame(p_cb, len, p_data); 2843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 28446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 2845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tGetSystemCodes 2850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Get systems codes supported by the activated tag: 2853721b3ab20e5cfe30ed14fbfac62504749e50df1fYoshinobu Ito** Poll for wildcard (FFFF, RC=1): 2854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Before using this API, the application must call RW_SelectTagType to 2856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** indicate that a Type 3 tag has been activated. 2857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK, if raw data frame sent 2860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 28646fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T3tGetSystemCodes(void) { 28656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 28666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 28676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 28686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API0("RW_T3tGetSystemCodes"); 28696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 28706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if we are in valid state to handle this API */ 28716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state != RW_T3T_STATE_IDLE) { 28726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)", 28736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state); 28746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 28756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 28760c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi retval = (tNFC_STATUS)nci_snd_t3t_polling(0xFFFF, T3T_POLL_RC_SC, 0); 28770c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (retval == NCI_STATUS_OK) { 28786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_cmd = RW_T3T_CMD_GET_SYSTEM_CODES; 28796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_tout = RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS; 28806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_poll_rc = T3T_POLL_RC_SC; 28816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING; 28826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags |= RW_T3T_FL_W4_GET_SC_POLL_RSP; 28836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->num_system_codes = 0; 28846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 28856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* start timer for waiting for responses */ 28866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_start_poll_timer(p_cb); 28876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 28886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 28896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 28906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 2891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 2892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 2894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function RW_T3tFormatNDef 2896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 2898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Format a type-3 tag for NDEF. 2899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Only Felica-Lite tags are supported by this API. The 2901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** RW_T3T_FORMAT_CPLT_EVT is used to notify the status of the operation. 2902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns 2904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_OK: ndef detection procedure started 2905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_NO_BUFFERS: unable to allocate a buffer for this operation 2906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_STATUS_FAILED: other error 2907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 29096fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T3tFormatNDef(void) { 29106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 29116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 29126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 29136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API0("RW_T3tFormatNDef"); 29146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 29156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if we are in valid state to handle this API */ 29166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state != RW_T3T_STATE_IDLE) { 29176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)", 29186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state); 29196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 29206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 29216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Poll tag, to see if Felica-Lite system is supported */ 29220c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi retval = (tNFC_STATUS)nci_snd_t3t_polling(T3T_SYSTEM_CODE_FELICA_LITE, 29230c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi T3T_POLL_RC_SC, 0); 29240c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (retval == NCI_STATUS_OK) { 29256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_cmd = RW_T3T_CMD_FORMAT; 29266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_tout = RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS; 29276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_poll_rc = T3T_POLL_RC_SC; 29286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING; 29296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_substate = RW_T3T_FMT_SST_POLL_FELICA_LITE; 29306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags |= RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP; 29316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 29326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* start timer for waiting for responses */ 29336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_start_poll_timer(p_cb); 29346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 29356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 29366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 29376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 2938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 29395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 29405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/***************************************************************************** 29415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 29425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function RW_T3tSetReadOnly 29435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 29445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description This function performs NDEF read-only procedure 29455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Note: Only Felica-Lite tags are supported by this API. 29465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** RW_T3tDetectNDef() must be called before using this 29475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 29485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** The RW_T3T_SET_READ_ONLY_CPLT_EVT event will be returned. 29495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 29505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns NFC_STATUS_OK if success 29515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** NFC_STATUS_FAILED if T3T is busy or other error 29525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 29535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*****************************************************************************/ 29546fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitNFC_STATUS RW_T3tSetReadOnly(bool b_hard_lock) { 29556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_STATUS retval = NFC_STATUS_OK; 29566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_T3T_CB* p_cb = &rw_cb.tcb.t3t; 29576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tRW_DATA evt_data; 29586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 29596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_API1("RW_T3tSetReadOnly (): b_hard_lock=%d", b_hard_lock); 29606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 29616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Check if we are in valid state to handle this API */ 29626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->rw_state != RW_T3T_STATE_IDLE) { 29636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR1("Error: invalid state to handle API (0x%x)", 29646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state); 29656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_FAILED); 29666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 29676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 29686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cb->ndef_attrib.status != 29696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_STATUS_OK) /* NDEF detection not performed yet? */ 29706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 29716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RW_TRACE_ERROR0("Error: NDEF detection not performed yet"); 29726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (NFC_STATUS_NOT_INITIALIZED); 29736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 29746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 29756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((!b_hard_lock) && 29766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cb->ndef_attrib.rwflag == 29776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi T3T_MSG_NDEF_RWFLAG_RO)) /* Tag's NDEF memory is read-only already */ 29786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 29796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi evt_data.status = NFC_STATUS_OK; 29806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*(rw_cb.p_cback))(RW_T3T_SET_READ_ONLY_CPLT_EVT, &evt_data); 29815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return (retval); 29826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 29836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Poll tag, to see if Felica-Lite system is supported */ 29840c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi retval = (tNFC_STATUS)nci_snd_t3t_polling(T3T_SYSTEM_CODE_FELICA_LITE, 29850c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi T3T_POLL_RC_SC, 0); 29860c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi if (retval == NCI_STATUS_OK) { 29876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (b_hard_lock) 29886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_cmd = RW_T3T_CMD_SET_READ_ONLY_HARD; 29896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else 29906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_cmd = RW_T3T_CMD_SET_READ_ONLY_SOFT; 29916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_tout = RW_T3T_DEFAULT_CMD_TIMEOUT_TICKS; 29926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->cur_poll_rc = T3T_POLL_RC_SC; 29936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_state = RW_T3T_STATE_COMMAND_PENDING; 29946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->rw_substate = RW_T3T_SRO_SST_POLL_FELICA_LITE; 29956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cb->flags |= RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP; 29966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 29976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* start timer for waiting for responses */ 29986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rw_t3t_start_poll_timer(p_cb); 29996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 30006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 30016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return (retval); 30025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 3003