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