1/******************************************************************************
2 *
3 *  Copyright (C) 2010-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 common data types shared by Reader/Writer mode
23 *  and Card Emulation.
24 *
25 ******************************************************************************/
26#include "nfc_target.h"
27#include "bt_types.h"
28
29#if (NFC_INCLUDED == TRUE)
30#include "nfc_api.h"
31#include "rw_api.h"
32#include "rw_int.h"
33#include "tags_int.h"
34
35#define T1T_MAX_NUM_OPCODES         9
36#define T1T_STATIC_OPCODES          5
37#define T1T_MAX_TAG_MODELS          2
38
39const tT1T_CMD_RSP_INFO t1t_cmd_rsp_infos[] =
40{
41    /* Note: the order of these commands can not be changed.
42     * If new events are added, add them after T1T_CMD_WRITE_NE8 */
43/*   opcode         cmd_len,  uid_offset,  rsp_len */
44    {T1T_CMD_RID,       7,          3,      6},
45    {T1T_CMD_RALL,      7,          3,      122},
46    {T1T_CMD_READ,      7,          3,      2},
47    {T1T_CMD_WRITE_E,   7,          3,      2},
48    {T1T_CMD_WRITE_NE,  7,          3,      2},
49    {T1T_CMD_RSEG,      14,         10,     129},
50    {T1T_CMD_READ8,     14,         10,     9},
51    {T1T_CMD_WRITE_E8,  14,         10,     9},
52    {T1T_CMD_WRITE_NE8, 14,         10,     9}
53};
54
55const tT1T_INIT_TAG t1t_init_content[] =
56{
57/*  Tag Name            CC3,        is dynamic, ltv[0]  ltv[1]  ltv[2]  mtv[0]  mtv[1]  mtv[2]*/
58    {RW_T1T_IS_TOPAZ96, 0x0E,       FALSE,      {0,      0,      0},      {0,      0,      0}},
59    {RW_T1T_IS_TOPAZ512,0x3F,       TRUE,       {0xF2,   0x30,   0x33},   {0xF0,   0x02,   0x03}}
60};
61
62#define T2T_MAX_NUM_OPCODES         3
63#define T2T_MAX_TAG_MODELS          7
64
65const tT2T_CMD_RSP_INFO t2t_cmd_rsp_infos[] =
66{
67    /* Note: the order of these commands can not be changed.
68     * If new events are added, add them after T2T_CMD_SEC_SEL */
69/*  opcode            cmd_len,   rsp_len, nack_rsp_len */
70    {T2T_CMD_READ,      2,          16,     1},
71    {T2T_CMD_WRITE,     6,          1,      1},
72    {T2T_CMD_SEC_SEL,   2,          1,      1}
73};
74
75const tT2T_INIT_TAG t2t_init_content[] =
76{
77/*  Tag Name        is_multi_v  Ver Block                   Ver No                               Vbitmask   to_calc_cc CC3      OTP     BLPB */
78    {TAG_MIFARE_MID,    TRUE,   T2T_MIFARE_VERSION_BLOCK,   T2T_MIFARE_ULTRALIGHT_VER_NO,        0xFFFF,    FALSE,     0x06,    FALSE,  T2T_DEFAULT_LOCK_BLPB},
79    {TAG_MIFARE_MID,    TRUE,   T2T_MIFARE_VERSION_BLOCK,   T2T_MIFARE_ULTRALIGHT_FAMILY_VER_NO, 0xFFFF,    TRUE,      0x00,    FALSE,  T2T_DEFAULT_LOCK_BLPB},
80    {TAG_KOVIO_MID,     FALSE,  0x00,                       0x00,                                0x0000,    FALSE,     0x1D,    TRUE,   0x04},
81    {TAG_INFINEON_MID,  TRUE,   T2T_INFINEON_VERSION_BLOCK, T2T_INFINEON_MYD_MOVE_LEAN,          0xFFF0,    FALSE,     0x06,    FALSE,  T2T_DEFAULT_LOCK_BLPB},
82    {TAG_INFINEON_MID,  TRUE,   T2T_INFINEON_VERSION_BLOCK, T2T_INFINEON_MYD_MOVE,               0xFFF0,    FALSE,     0x10,    FALSE,  T2T_DEFAULT_LOCK_BLPB},
83    {TAG_BRCM_MID,      TRUE,   T2T_BRCM_VERSION_BLOCK,     T2T_BRCM_STATIC_MEM,                 0xFFFF,    FALSE,     0x06,    FALSE,  T2T_DEFAULT_LOCK_BLPB},
84    {TAG_BRCM_MID,      TRUE,   T2T_BRCM_VERSION_BLOCK,     T2T_BRCM_DYNAMIC_MEM,                0xFFFF,    FALSE,     0x3C,    FALSE,  T2T_DEFAULT_LOCK_BLPB}
85
86};
87
88const UINT8 t4t_v10_ndef_tag_aid[T4T_V10_NDEF_TAG_AID_LEN] = {0xD2, 0x76, 0x00, 0x00, 0x85, 0x01, 0x00};
89const UINT8 t4t_v20_ndef_tag_aid[T4T_V20_NDEF_TAG_AID_LEN] = {0xD2, 0x76, 0x00, 0x00, 0x85, 0x01, 0x01};
90
91#if (BT_TRACE_PROTOCOL == TRUE)
92const char * const t1t_cmd_str[] = {
93    "T1T_RID",
94    "T1T_RALL",
95    "T1T_READ",
96    "T1T_WRITE_E",
97    "T1T_WRITE_NE",
98    "T1T_RSEG",
99    "T1T_READ8",
100    "T1T_WRITE_E8",
101    "T1T_WRITE_NE8"
102};
103
104const char * const t2t_cmd_str[] = {
105    "T2T_CMD_READ",
106    "T2T_CMD_WRITE",
107    "T2T_CMD_SEC_SEL"
108};
109#endif
110
111static unsigned int tags_ones32 (register unsigned int x);
112
113/*******************************************************************************
114**
115** Function         t1t_cmd_to_rsp_info
116**
117** Description      This function maps the given opcode to tT1T_CMD_RSP_INFO.
118**
119** Returns          tNFC_STATUS
120**
121*******************************************************************************/
122const tT1T_CMD_RSP_INFO * t1t_cmd_to_rsp_info (UINT8 opcode)
123{
124    const tT1T_CMD_RSP_INFO *p_ret = NULL, *p;
125    int xx;
126
127    for (xx = 0, p=&t1t_cmd_rsp_infos[0]; xx<T1T_MAX_NUM_OPCODES; xx++, p++)
128    {
129        if (opcode == p->opcode)
130        {
131            if ((xx < T1T_STATIC_OPCODES) || (rw_cb.tcb.t1t.hr[0] != T1T_STATIC_HR0))
132                p_ret = p;
133            break;
134        }
135    }
136
137    return p_ret;
138}
139
140
141/*******************************************************************************
142**
143** Function         t1t_tag_init_data
144**
145** Description      This function maps the given opcode to tT1T_INIT_TAG.
146**
147** Returns          tNFC_STATUS
148**
149*******************************************************************************/
150const tT1T_INIT_TAG * t1t_tag_init_data (UINT8 tag_model)
151{
152    const tT1T_INIT_TAG *p_ret = NULL, *p;
153    int xx;
154
155    for (xx = 0, p = &t1t_init_content[0]; xx < T1T_MAX_TAG_MODELS; xx++, p++)
156    {
157        if (tag_model == p->tag_model)
158        {
159            p_ret = p;
160            break;
161        }
162    }
163
164    return p_ret;
165}
166
167/*******************************************************************************
168**
169** Function         t2t_tag_init_data
170**
171** Description      This function maps the given manufacturer id and version to
172**                  tT2T_INIT_TAG.
173**
174** Returns          tNFC_STATUS
175**
176*******************************************************************************/
177const tT2T_INIT_TAG * t2t_tag_init_data (UINT8 manufacturer_id, BOOLEAN b_valid_ver, UINT16 version_no)
178{
179    const tT2T_INIT_TAG *p_ret = NULL, *p;
180    int xx;
181
182    for (xx = 0, p = &t2t_init_content[0]; xx < T2T_MAX_TAG_MODELS; xx++, p++)
183    {
184        if (manufacturer_id == p->manufacturer_id)
185        {
186            if (  (!p->b_multi_version)
187                ||(!b_valid_ver)
188                ||(p->version_no == (version_no & p->version_bmask))  )
189            {
190                p_ret = p;
191                break;
192            }
193        }
194    }
195
196    return p_ret;
197}
198
199/*******************************************************************************
200**
201** Function         t2t_cmd_to_rsp_info
202**
203** Description      This function maps the given opcode to tT2T_CMD_RSP_INFO.
204**
205** Returns          tNFC_STATUS
206**
207*******************************************************************************/
208const tT2T_CMD_RSP_INFO * t2t_cmd_to_rsp_info (UINT8 opcode)
209{
210    const tT2T_CMD_RSP_INFO *p_ret = NULL, *p;
211    int xx;
212
213    for (xx = 0, p = &t2t_cmd_rsp_infos[0]; xx < T2T_MAX_NUM_OPCODES; xx++, p++)
214    {
215        if (opcode == p->opcode)
216        {
217            p_ret = p;
218            break;
219        }
220    }
221
222    return p_ret;
223}
224
225/*******************************************************************************
226**
227** Function         t1t_info_to_evt
228**
229** Description      This function maps the given tT1T_CMD_RSP_INFO to RW/CE event code
230**
231** Returns          RW/CE event code
232**
233*******************************************************************************/
234UINT8 t1t_info_to_evt (const tT1T_CMD_RSP_INFO * p_info)
235{
236    return ((UINT8) (p_info - t1t_cmd_rsp_infos) + RW_T1T_FIRST_EVT);
237}
238
239/*******************************************************************************
240**
241** Function         t2t_info_to_evt
242**
243** Description      This function maps the given tT2T_CMD_RSP_INFO to RW/CE event code
244**
245** Returns          RW/CE event code
246**
247*******************************************************************************/
248UINT8 t2t_info_to_evt (const tT2T_CMD_RSP_INFO * p_info)
249{
250    return ((UINT8) (p_info - t2t_cmd_rsp_infos) + RW_T2T_FIRST_EVT);
251}
252
253#if (BT_TRACE_PROTOCOL == TRUE)
254/*******************************************************************************
255**
256** Function         t1t_info_to_str
257**
258** Description      This function maps the given tT1T_CMD_RSP_INFO to T1T cmd str
259**
260** Returns          T1T cmd str
261**
262*******************************************************************************/
263const char * t1t_info_to_str (const tT1T_CMD_RSP_INFO * p_info)
264{
265    int ind = (int) (p_info - t1t_cmd_rsp_infos);
266    if (ind < T1T_MAX_NUM_OPCODES)
267        return (const char *) t1t_cmd_str[ind];
268    else
269        return "";
270}
271
272/*******************************************************************************
273**
274** Function         t2t_info_to_str
275**
276** Description      This function maps the given tT2T_CMD_RSP_INFO to T2T cmd str
277**
278** Returns          T2T cmd str
279**
280*******************************************************************************/
281const char * t2t_info_to_str (const tT2T_CMD_RSP_INFO * p_info)
282{
283    int ind = (int) (p_info - t2t_cmd_rsp_infos);
284    if (ind < T2T_MAX_NUM_OPCODES)
285        return (const char *) t2t_cmd_str[ind];
286    else
287        return "";
288}
289#endif
290
291/*******************************************************************************
292**
293** Function         tags_pow
294**
295** Description      This function calculates x(base) power of y.
296**
297** Returns          int
298**
299*******************************************************************************/
300int tags_pow (int x, int y)
301{
302    int i, ret = 1;
303    for (i = 0; i < y; i++)
304    {
305        ret *= x;
306    }
307    return ret;
308}
309
310/*******************************************************************************
311**
312** Function         ones32
313**
314** Description      This function returns number of bits set in an unsigned
315**                  integer variable
316**
317** Returns          int
318**
319*******************************************************************************/
320static unsigned int tags_ones32 (register unsigned int x)
321{
322        /* 32-bit recursive reduction using SWAR...
323	   but first step is mapping 2-bit values
324	   into sum of 2 1-bit values in sneaky way
325	*/
326        x -= ((x >> 1) & 0x55555555);
327        x = (((x >> 2) & 0x33333333) + (x & 0x33333333));
328        x = (((x >> 4) + x) & 0x0f0f0f0f);
329        x += (x >> 8);
330        x += (x >> 16);
331        return (x & 0x0000003f);
332}
333
334/*******************************************************************************
335**
336** Function         tags_log2
337**
338** Description      This function calculates log to the base  2.
339**
340** Returns          int
341**
342*******************************************************************************/
343unsigned int tags_log2 (register unsigned int x)
344{
345        x |= (x >> 1);
346        x |= (x >> 2);
347        x |= (x >> 4);
348        x |= (x >> 8);
349        x |= (x >> 16);
350
351        return (tags_ones32 (x) - 1);
352}
353
354#endif /* NFC_INCLUDED == TRUE*/
355