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