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