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