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