1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu *  Copyright (C) 2010-2014 Broadcom Corporation
4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  you may not use this file except in compliance with the License.
7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  You may obtain a copy of the License at:
8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  See the License for the specific language governing permissions and
15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  limitations under the License.
16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  This file contains the common data types shared by Reader/Writer mode
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  and Card Emulation.
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "bt_types.h"
266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfc_target.h"
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "rw_api.h"
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "rw_int.h"
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define T1T_MAX_NUM_OPCODES 9
326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define T1T_STATIC_OPCODES 5
336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define T1T_MAX_TAG_MODELS 2
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiconst tT1T_CMD_RSP_INFO t1t_cmd_rsp_infos[] = {
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Note: the order of these commands can not be changed.
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project     * If new events are added, add them after T1T_CMD_WRITE_NE8 */
386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /*   opcode         cmd_len,  uid_offset,  rsp_len */
396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    {T1T_CMD_RID, 7, 3, 6},        {T1T_CMD_RALL, 7, 3, 122},
406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    {T1T_CMD_READ, 7, 3, 2},       {T1T_CMD_WRITE_E, 7, 3, 2},
416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    {T1T_CMD_WRITE_NE, 7, 3, 2},   {T1T_CMD_RSEG, 14, 10, 129},
426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    {T1T_CMD_READ8, 14, 10, 9},    {T1T_CMD_WRITE_E8, 14, 10, 9},
436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    {T1T_CMD_WRITE_NE8, 14, 10, 9}};
446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiconst tT1T_INIT_TAG t1t_init_content[] = {
466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /*  Tag Name            CC3,        is dynamic, ltv[0]  ltv[1]  ltv[2]
476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       mtv[0]  mtv[1]  mtv[2]*/
486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    {RW_T1T_IS_TOPAZ96, 0x0E, FALSE, {0, 0, 0}, {0, 0, 0}},
496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    {RW_T1T_IS_TOPAZ512, 0x3F, TRUE, {0xF2, 0x30, 0x33}, {0xF0, 0x02, 0x03}}};
506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define T2T_MAX_NUM_OPCODES 3
526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define T2T_MAX_TAG_MODELS 7
536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiconst tT2T_CMD_RSP_INFO t2t_cmd_rsp_infos[] = {
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Note: the order of these commands can not be changed.
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project     * If new events are added, add them after T2T_CMD_SEC_SEL */
576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /*  opcode            cmd_len,   rsp_len, nack_rsp_len */
586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    {T2T_CMD_READ, 2, 16, 1},
596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    {T2T_CMD_WRITE, 6, 1, 1},
606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    {T2T_CMD_SEC_SEL, 2, 1, 1}};
616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiconst tT2T_INIT_TAG t2t_init_content[] = {
636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /*  Tag Name        is_multi_v  Ver Block                   Ver No
646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       Vbitmask   to_calc_cc CC3      OTP     BLPB */
656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    {TAG_MIFARE_MID, true, T2T_MIFARE_VERSION_BLOCK,
666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     T2T_MIFARE_ULTRALIGHT_VER_NO, 0xFFFF, false, 0x06, false,
676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     T2T_DEFAULT_LOCK_BLPB},
686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    {TAG_MIFARE_MID, true, T2T_MIFARE_VERSION_BLOCK,
696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     T2T_MIFARE_ULTRALIGHT_FAMILY_VER_NO, 0xFFFF, true, 0x00, false,
706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     T2T_DEFAULT_LOCK_BLPB},
716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    {TAG_KOVIO_MID, false, 0x00, 0x00, 0x0000, false, 0x1D, true, 0x04},
726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    {TAG_INFINEON_MID, true, T2T_INFINEON_VERSION_BLOCK,
736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     T2T_INFINEON_MYD_MOVE_LEAN, 0xFFF0, false, 0x06, false,
746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     T2T_DEFAULT_LOCK_BLPB},
756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    {TAG_INFINEON_MID, true, T2T_INFINEON_VERSION_BLOCK, T2T_INFINEON_MYD_MOVE,
766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     0xFFF0, false, 0x10, false, T2T_DEFAULT_LOCK_BLPB},
776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    {TAG_BRCM_MID, true, T2T_BRCM_VERSION_BLOCK, T2T_BRCM_STATIC_MEM, 0xFFFF,
786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     false, 0x06, false, T2T_DEFAULT_LOCK_BLPB},
796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    {TAG_BRCM_MID, true, T2T_BRCM_VERSION_BLOCK, T2T_BRCM_DYNAMIC_MEM, 0xFFFF,
806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     false, 0x3C, false, T2T_DEFAULT_LOCK_BLPB}
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project};
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiconst uint8_t t4t_v10_ndef_tag_aid[T4T_V10_NDEF_TAG_AID_LEN] = {
856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0xD2, 0x76, 0x00, 0x00, 0x85, 0x01, 0x00};
866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiconst uint8_t t4t_v20_ndef_tag_aid[T4T_V20_NDEF_TAG_AID_LEN] = {
876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0xD2, 0x76, 0x00, 0x00, 0x85, 0x01, 0x01};
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiconst char* const t1t_cmd_str[] = {
906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    "T1T_RID",  "T1T_RALL",  "T1T_READ",     "T1T_WRITE_E",  "T1T_WRITE_NE",
916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    "T1T_RSEG", "T1T_READ8", "T1T_WRITE_E8", "T1T_WRITE_NE8"};
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiconst char* const t2t_cmd_str[] = {"T2T_CMD_READ", "T2T_CMD_WRITE",
946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                   "T2T_CMD_SEC_SEL"};
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic unsigned int tags_ones32(register unsigned int x);
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         t1t_cmd_to_rsp_info
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function maps the given opcode to tT1T_CMD_RSP_INFO.
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiconst tT1T_CMD_RSP_INFO* t1t_cmd_to_rsp_info(uint8_t opcode) {
1086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  const tT1T_CMD_RSP_INFO *p_ret = NULL, *p;
1096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int xx;
1106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0, p = &t1t_cmd_rsp_infos[0]; xx < T1T_MAX_NUM_OPCODES; xx++, p++) {
1126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (opcode == p->opcode) {
1136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((xx < T1T_STATIC_OPCODES) || (rw_cb.tcb.t1t.hr[0] != T1T_STATIC_HR0))
1146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_ret = p;
1156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return p_ret;
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         t1t_tag_init_data
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function maps the given opcode to tT1T_INIT_TAG.
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiconst tT1T_INIT_TAG* t1t_tag_init_data(uint8_t tag_model) {
1326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  const tT1T_INIT_TAG *p_ret = NULL, *p;
1336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int xx;
1346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0, p = &t1t_init_content[0]; xx < T1T_MAX_TAG_MODELS; xx++, p++) {
1366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (tag_model == p->tag_model) {
1376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ret = p;
1386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return p_ret;
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         t2t_tag_init_data
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function maps the given manufacturer id and version to
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  tT2T_INIT_TAG.
151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiconst tT2T_INIT_TAG* t2t_tag_init_data(uint8_t manufacturer_id,
1566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                       bool b_valid_ver, uint16_t version_no) {
1576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  const tT2T_INIT_TAG *p_ret = NULL, *p;
1586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int xx;
1596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0, p = &t2t_init_content[0]; xx < T2T_MAX_TAG_MODELS; xx++, p++) {
1616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (manufacturer_id == p->manufacturer_id) {
1626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if ((!p->b_multi_version) || (!b_valid_ver) ||
1636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (p->version_no == (version_no & p->version_bmask))) {
1646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_ret = p;
1656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
1666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return p_ret;
171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         t2t_cmd_to_rsp_info
176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function maps the given opcode to tT2T_CMD_RSP_INFO.
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          tNFC_STATUS
180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiconst tT2T_CMD_RSP_INFO* t2t_cmd_to_rsp_info(uint8_t opcode) {
1836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  const tT2T_CMD_RSP_INFO *p_ret = NULL, *p;
1846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int xx;
1856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (xx = 0, p = &t2t_cmd_rsp_infos[0]; xx < T2T_MAX_NUM_OPCODES; xx++, p++) {
1876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (opcode == p->opcode) {
1886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ret = p;
1896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return p_ret;
194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         t1t_info_to_evt
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
200552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      This function maps the given tT1T_CMD_RSP_INFO to RW/CE
201552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  event code
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          RW/CE event code
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint8_t t1t_info_to_evt(const tT1T_CMD_RSP_INFO* p_info) {
2076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return ((uint8_t)(p_info - t1t_cmd_rsp_infos) + RW_T1T_FIRST_EVT);
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         t2t_info_to_evt
213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
214552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      This function maps the given tT2T_CMD_RSP_INFO to RW/CE
215552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  event code
216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          RW/CE event code
218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint8_t t2t_info_to_evt(const tT2T_CMD_RSP_INFO* p_info) {
2216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return ((uint8_t)(p_info - t2t_cmd_rsp_infos) + RW_T2T_FIRST_EVT);
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         t1t_info_to_str
227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
228552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      This function maps the given tT1T_CMD_RSP_INFO to T1T cmd
229552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  str
230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          T1T cmd str
232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiconst char* t1t_info_to_str(const tT1T_CMD_RSP_INFO* p_info) {
2356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int ind = (int)(p_info - t1t_cmd_rsp_infos);
2366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (ind < T1T_MAX_NUM_OPCODES)
2376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (const char*)t1t_cmd_str[ind];
2386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else
2396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return "";
240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         t2t_info_to_str
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
246552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      This function maps the given tT2T_CMD_RSP_INFO to T2T cmd
247552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  str
248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          T2T cmd str
250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiconst char* t2t_info_to_str(const tT2T_CMD_RSP_INFO* p_info) {
2536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int ind = (int)(p_info - t2t_cmd_rsp_infos);
2546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (ind < T2T_MAX_NUM_OPCODES)
2556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (const char*)t2t_cmd_str[ind];
2566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else
2576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return "";
258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         tags_pow
263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function calculates x(base) power of y.
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          int
267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiint tags_pow(int x, int y) {
2706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int i, ret = 1;
2716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (i = 0; i < y; i++) {
2726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ret *= x;
2736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return ret;
275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         ones32
280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function returns number of bits set in an unsigned
282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  integer variable
283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          int
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic unsigned int tags_ones32(register unsigned int x) {
2886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* 32-bit recursive reduction using SWAR...
2896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     but first step is mapping 2-bit values
2906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     into sum of 2 1-bit values in sneaky way
2916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  */
2926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  x -= ((x >> 1) & 0x55555555);
2936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  x = (((x >> 2) & 0x33333333) + (x & 0x33333333));
2946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  x = (((x >> 4) + x) & 0x0f0f0f0f);
2956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  x += (x >> 8);
2966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  x += (x >> 16);
2976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (x & 0x0000003f);
298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         tags_log2
303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function calculates log to the base  2.
305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          int
307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiunsigned int tags_log2(register unsigned int x) {
3106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  x |= (x >> 1);
3116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  x |= (x >> 2);
3126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  x |= (x >> 4);
3136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  x |= (x >> 8);
3146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  x |= (x >> 16);
3156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (tags_ones32(x) - 1);
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
318