1/******************************************************************************
2 *
3 *  Copyright (C) 2009-2014 Broadcom Corporation
4 *
5 *  Licensed under the Apache License, Version 2.0 (the "License");
6 *  you may not use this file except in compliance with the License.
7 *  You may obtain a copy of the License at:
8 *
9 *  http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 *
17 ******************************************************************************/
18
19
20/******************************************************************************
21 *
22 *  This file contains the Near Field Communication (NFC) Card Emulation
23 *  mode related internal function / definitions.
24 *
25 ******************************************************************************/
26
27#ifndef CE_INT_H_
28#define CE_INT_H_
29
30#include "ce_api.h"
31
32#if (CE_TEST_INCLUDED == FALSE)
33#define CE_MIN_SUP_PROTO    NCI_PROTOCOL_FELICA
34#define CE_MAX_SUP_PROTO    NCI_PROTOCOL_ISO4
35#else
36#define CE_MIN_SUP_PROTO    NCI_PROTOCOL_TYPE1
37#define CE_MAX_SUP_PROTO    NCI_PROTOCOL_MIFARE
38#endif
39
40#define CE_MAX_BYTE_PER_PAGE    7   /* 2^8=256. CB use UINT8 for BytesPerPage, so max is 7 */
41
42/* CE Type 3 Tag structures */
43
44/* Type 3 Tag NDEF card-emulation */
45typedef struct {
46    BOOLEAN         initialized;
47    UINT8           version;        /* Ver: peer version */
48    UINT8           nbr;            /* NBr: number of blocks that can be read using one Check command */
49    UINT8           nbw;            /* Nbw: number of blocks that can be written using one Update command */
50    UINT16          nmaxb;          /* Nmaxb: maximum number of blocks available for NDEF data */
51    UINT8           writef;         /* WriteFlag: 00h if writing data finished; 0Fh if writing data in progress */
52    UINT8           rwflag;         /* RWFlag: 00h NDEF is read-only; 01h if read/write available */
53    UINT32          ln;
54    UINT8           *p_buf;         /* Current contents for READs */
55
56    /* Scratch NDEF buffer (for update NDEF commands) */
57    UINT8           scratch_writef;
58    UINT32          scratch_ln;
59    UINT8           *p_scratch_buf; /* Scratch buffer for WRITE/readback */
60} tCE_T3T_NDEF_INFO;
61
62/* Type 3 Tag current command processing */
63typedef struct {
64    UINT16          service_code_list[T3T_MSG_SERVICE_LIST_MAX];
65    UINT8           *p_block_list_start;
66    UINT8           *p_block_data_start;
67    UINT8           num_services;
68    UINT8           num_blocks;
69} tCE_T3T_CUR_CMD;
70
71/* Type 3 Tag control blcok */
72typedef struct
73{
74    UINT8               state;
75    UINT16              system_code;
76    UINT8               local_nfcid2[NCI_RF_F_UID_LEN];
77    UINT8               local_pmm[NCI_T3T_PMM_LEN];
78    tCE_T3T_NDEF_INFO   ndef_info;
79    tCE_T3T_CUR_CMD     cur_cmd;
80} tCE_T3T_MEM;
81
82/* CE Type 4 Tag control blocks */
83typedef struct
84{
85    UINT8               aid_len;
86    UINT8               aid[NFC_MAX_AID_LEN];
87    tCE_CBACK          *p_cback;
88} tCE_T4T_REG_AID;      /* registered AID table */
89
90typedef struct
91{
92    TIMER_LIST_ENT      timer;              /* timeout for update file              */
93    UINT8               cc_file[T4T_FC_TLV_OFFSET_IN_CC + T4T_FILE_CONTROL_TLV_SIZE];
94    UINT8              *p_ndef_msg;         /* storage of NDEF message              */
95    UINT16              nlen;               /* current size of NDEF message         */
96    UINT16              max_file_size;      /* size of storage + 2 bytes for NLEN   */
97    UINT8              *p_scratch_buf;      /* temp storage of NDEF message for update */
98
99#define CE_T4T_STATUS_T4T_APP_SELECTED      0x01    /* T4T CE App is selected       */
100#define CE_T4T_STATUS_REG_AID_SELECTED      0x02    /* Registered AID is selected   */
101#define CE_T4T_STATUS_CC_FILE_SELECTED      0x04    /* CC file is selected          */
102#define CE_T4T_STATUS_NDEF_SELECTED         0x08    /* NDEF file is selected        */
103#define CE_T4T_STATUS_NDEF_FILE_READ_ONLY   0x10    /* NDEF is read-only            */
104#define CE_T4T_STATUS_NDEF_FILE_UPDATING    0x20    /* NDEF is updating             */
105#define CE_T4T_STATUS_WILDCARD_AID_SELECTED 0x40    /* Wildcard AID selected        */
106
107    UINT8               status;
108
109    tCE_CBACK          *p_wildcard_aid_cback;               /* registered wildcard AID callback */
110    tCE_T4T_REG_AID     reg_aid[CE_T4T_MAX_REG_AID];        /* registered AID table             */
111    UINT8               selected_aid_idx;
112} tCE_T4T_MEM;
113
114
115/* CE memory control blocks */
116typedef struct
117{
118    tCE_T3T_MEM         t3t;
119    tCE_T4T_MEM         t4t;
120} tCE_MEM;
121
122/* CE control blocks */
123typedef struct
124{
125    tCE_MEM             mem;
126    tCE_CBACK           *p_cback;
127    UINT8               *p_ndef;     /* the memory starting from NDEF */
128    UINT16              ndef_max;    /* max size of p_ndef */
129    UINT16              ndef_cur;    /* current size of p_ndef */
130    tNFC_RF_TECH        tech;
131    UINT8               trace_level;
132
133} tCE_CB;
134
135/*
136** CE Type 4 Tag Definition
137*/
138
139/* Max data size using a single ReadBinary. 2 bytes are for status bytes */
140#define CE_T4T_MAX_LE           (NFC_CE_POOL_BUF_SIZE - BT_HDR_SIZE - NCI_MSG_OFFSET_SIZE - NCI_DATA_HDR_SIZE - T4T_RSP_STATUS_WORDS_SIZE)
141
142/* Max data size using a single UpdateBinary. 6 bytes are for CLA, INS, P1, P2, Lc */
143#define CE_T4T_MAX_LC           (NFC_CE_POOL_BUF_SIZE - BT_HDR_SIZE - NCI_DATA_HDR_SIZE - T4T_CMD_MAX_HDR_SIZE)
144
145/*****************************************************************************
146**  EXTERNAL FUNCTION DECLARATIONS
147*****************************************************************************/
148#ifdef __cplusplus
149extern "C" {
150#endif
151
152/* Global NFC data */
153#if NFC_DYNAMIC_MEMORY == FALSE
154NFC_API extern tCE_CB  ce_cb;
155#else
156NFC_API extern tCE_CB *ce_cb_ptr;
157#define ce_cb (*ce_cb_ptr)
158#endif
159
160extern void ce_init (void);
161
162/* ce_t3t internal functions */
163void ce_t3t_init (void);
164tNFC_STATUS ce_select_t3t (UINT16 system_code, UINT8 nfcid2[NCI_RF_F_UID_LEN]);
165
166/* ce_t4t internal functions */
167extern tNFC_STATUS ce_select_t4t (void);
168extern void ce_t4t_process_timeout (TIMER_LIST_ENT *p_tle);
169
170#ifdef __cplusplus
171}
172#endif
173
174#endif /* CE_INT_H_ */
175