1121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/* 2121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Copyright (C) 2012-2014 NXP Semiconductors 3121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * 4121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Licensed under the Apache License, Version 2.0 (the "License"); 5121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * you may not use this file except in compliance with the License. 6121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * You may obtain a copy of the License at 7121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * 8121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * http://www.apache.org/licenses/LICENSE-2.0 9121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * 10121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Unless required by applicable law or agreed to in writing, software 11121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * distributed under the License is distributed on an "AS IS" BASIS, 12121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * See the License for the specific language governing permissions and 14121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * limitations under the License. 15121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao */ 16121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#include <phDal4Nfc_messageQueueLib.h> 17121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#include <phNxpConfig.h> 186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include <phNxpLog.h> 196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include <phNxpNciHal.h> 206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include <phNxpNciHal_Kovio.h> 216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include <phNxpNciHal_NfcDepSWPrio.h> 226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include <phNxpNciHal_ext.h> 236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include <phTmlNfc.h> 24121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 2546e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi/* Timeout value to wait for response from PN548AD */ 2646e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi#define HAL_EXTNS_WRITE_RSP_TIMEOUT (1000) 27121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 28121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#undef P2P_PRIO_LOGIC_HAL_IMP 29121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 30121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/******************* Global variables *****************************************/ 31121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoextern phNxpNciHal_Control_t nxpncihal_ctrl; 32121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoextern phNxpNciProfile_Control_t nxpprofile_ctrl; 33121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 34121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoextern int kovio_detected; 35121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoextern int disable_kovio; 36121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoextern int send_to_upper_kovio; 37121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoextern uint32_t cleanup_timer; 3836d7231ec9344bed2996be1293e97d082fa22294Jizhou Liaouint8_t icode_detected = 0x00; 39121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaouint8_t icode_send_eof = 0x00; 406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (NFC_NXP_CHIP_TYPE == PN548C2) 41ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liaouint8_t nfcdep_detected = 0x00; 4236d7231ec9344bed2996be1293e97d082fa22294Jizhou Liao#endif 43121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaostatic uint8_t ee_disc_done = 0x00; 444a179646f6d5567830a0383050aee7610a0222a6Ruchi Kandoiuint8_t EnableP2P_PrioLogic = false; 45121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaostatic uint32_t RfDiscID = 1; 46121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaostatic uint32_t RfProtocolType = 4; 47121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/* NFCEE Set mode */ 48121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaostatic uint8_t setEEModeDone = 0x00; 496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic uint8_t cmd_nfcee_setmode_enable[] = {0x22, 0x01, 0x02, 0x01, 0x01}; 50121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 51121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/* External global variable to get FW version from NCI response*/ 52121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoextern uint32_t wFwVerRsp; 53121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/* External global variable to get FW version from FW file*/ 54121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoextern uint16_t wFwVer; 55121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 56b98e5975e665aedf5e786133cbf88986d03ac501Jizhou Liaouint16_t fw_maj_ver; 57b98e5975e665aedf5e786133cbf88986d03ac501Jizhou Liaouint16_t rom_version; 58121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/* local buffer to store CORE_INIT response */ 59121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaostatic uint32_t bCoreInitRsp[40]; 60121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaostatic uint32_t iCoreInitRspLen; 61121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 62121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoextern uint32_t timeoutTimerId; 63121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 64121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoextern NFCSTATUS read_retry(); 657b6b94cbca2aaf93afc4bb32094d143e46daf4adJizhou Liao 66121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/************** HAL extension functions ***************************************/ 676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void hal_extns_write_rsp_timeout_cb(uint32_t TimerId, void* pContext); 68121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 69121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/*Proprietary cmd sent to HAL to send reader mode flag 70121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Last byte of 4 byte proprietary cmd data contains ReaderMode flag 71121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * If this flag is enabled, NFC-DEP protocol is modified to T3T protocol 72121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * if FrameRF interface is selected. This needs to be done as the FW 73121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * always sends Ntf for FrameRF with NFC-DEP even though FrameRF with T3T is 74121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * previously selected with DISCOVER_SELECT_CMD 75121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao */ 76121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#define PROPRIETARY_CMD_FELICA_READER_MODE 0xFE 77121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaostatic uint8_t gFelicaReaderMode; 78121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 79121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/******************************************************************************* 80121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** 81121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Function phNxpNciHal_ext_init 82121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** 83121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Description initialize extension function 84121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** 85121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao*******************************************************************************/ 866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid phNxpNciHal_ext_init(void) { 876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi icode_detected = 0x00; 886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi icode_send_eof = 0x00; 896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi setEEModeDone = 0x00; 906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi kovio_detected = 0x00; 916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi disable_kovio = 0x00; 926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi send_to_upper_kovio = 0x01; 936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi EnableP2P_PrioLogic = false; 94121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao} 95121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 96121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/******************************************************************************* 97121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** 98121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Function phNxpNciHal_process_ext_rsp 99121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** 100121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Description Process extension function response 101121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** 102121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Returns NFCSTATUS_SUCCESS if success 103121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** 104121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao*******************************************************************************/ 1056fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoiNFCSTATUS phNxpNciHal_process_ext_rsp(uint8_t* p_ntf, uint16_t* p_len) { 1066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFCSTATUS status = NFCSTATUS_SUCCESS; 1076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t rf_technology_length_param = 0; 1086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x03 && 1106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[5] == 0x05 && nxpprofile_ctrl.profile_type == EMV_CO_PROFILE) { 1116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[4] = 0xFF; 1126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[5] = 0xFF; 1136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[6] = 0xFF; 1146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("Nfc-Dep Detect in EmvCo profile - Restart polling"); 1156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x01 && 1186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[5] == 0x05 && p_ntf[6] == 0x02 && gFelicaReaderMode) { 1196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /*If FelicaReaderMode is enabled,Change Protocol to T3T from NFC-DEP 1206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * when FrameRF interface is selected*/ 1216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[5] = 0x03; 1226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("FelicaReaderMode:Activity 1.1"); 1236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 124121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 125121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#ifdef P2P_PRIO_LOGIC_HAL_IMP 1266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x02 && 1276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[5] == 0x04 && nxpprofile_ctrl.profile_type == NFC_FORUM_PROFILE) { 1286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi EnableP2P_PrioLogic = true; 1296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("Is EnableP2P_PrioLogic: 0x0%X", EnableP2P_PrioLogic); 1326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (phNxpDta_IsEnable() == false) { 1336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((icode_detected != 1) && (kovio_detected != 1) && 1346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (EnableP2P_PrioLogic == true)) { 1356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (phNxpNciHal_NfcDep_comapre_ntf(p_ntf, *p_len) == NFCSTATUS_FAILED) { 1366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = phNxpNciHal_NfcDep_rsp_ext(p_ntf, p_len); 1376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (status != NFCSTATUS_INVALID_PARAMETER) { 1386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return status; 139121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao } 1406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 141121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao } 1426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 143121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#endif 144121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 1456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = NFCSTATUS_SUCCESS; 1466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = phNxpNciHal_kovio_rsp_ext(p_ntf, p_len); 147121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 1486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05) { 1496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (NFC_NXP_CHIP_TYPE == PN548C2) 1506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfcdep_detected) { 1516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfcdep_detected = 0x00; 1526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 15336d7231ec9344bed2996be1293e97d082fa22294Jizhou Liao#endif 154ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao 1556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (p_ntf[4]) { 1566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x00: 1576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: RF Interface = NFCEE Direct RF"); 1586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 1596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x01: 1606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: RF Interface = Frame RF"); 1616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 1626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x02: 1636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: RF Interface = ISO-DEP"); 1646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 1656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x03: 1666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: RF Interface = NFC-DEP"); 1676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (NFC_NXP_CHIP_TYPE == PN548C2) 1686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfcdep_detected = 0x01; 16936d7231ec9344bed2996be1293e97d082fa22294Jizhou Liao#endif 1706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 1716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x80: 1726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: RF Interface = MIFARE"); 1736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 1746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi default: 1756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: RF Interface = Unknown"); 1766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 1776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (p_ntf[5]) { 1806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x01: 1816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Protocol = T1T"); 1826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi phNxpDta_T1TEnable(); 1836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 1846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x02: 1856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Protocol = T2T"); 1866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 1876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x03: 1886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Protocol = T3T"); 1896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 1906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x04: 1916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Protocol = ISO-DEP"); 1926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 1936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x05: 1946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Protocol = NFC-DEP"); 1956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 1966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x06: 1976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Protocol = 15693"); 1986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 1996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x80: 2006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Protocol = MIFARE"); 2016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (NFC_NXP_CHIP_TYPE != PN547C2) 2036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x81: 204121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#else 2056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x8A: 206121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#endif 2076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Protocol = Kovio"); 2086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi default: 2106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Protocol = Unknown"); 2116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi switch (p_ntf[6]) { 2156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x00: 2166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Mode = A Passive Poll"); 2176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x01: 2196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Mode = B Passive Poll"); 2206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x02: 2226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Mode = F Passive Poll"); 2236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x03: 2256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Mode = A Active Poll"); 2266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x05: 2286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Mode = F Active Poll"); 2296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x06: 2316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Mode = 15693 Passive Poll"); 2326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (NFC_NXP_CHIP_TYPE != PN547C2) 2346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x70: 235121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#else 2366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x77: 23736d7231ec9344bed2996be1293e97d082fa22294Jizhou Liao#endif 2386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Mode = Kovio"); 2396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x80: 2416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Mode = A Passive Listen"); 2426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x81: 2446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Mode = B Passive Listen"); 2456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x82: 2476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Mode = F Passive Listen"); 2486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x83: 2506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Mode = A Active Listen"); 2516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x85: 2536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Mode = F Active Listen"); 2546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi case 0x86: 2566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Mode = 15693 Passive Listen"); 2576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi default: 2596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci: Mode = Unknown"); 2606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 2616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[2] == 0x15 && 2656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[4] == 0x01 && p_ntf[5] == 0x06 && p_ntf[6] == 0x06) { 2666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("> Going through workaround - notification of ISO 15693"); 2676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi icode_detected = 0x01; 2686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[21] = 0x01; 2696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[22] = 0x01; 2706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (icode_detected == 1 && icode_send_eof == 2) { 2716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi icode_send_eof = 3; 2726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_ntf[0] == 0x00 && p_ntf[1] == 0x00 && icode_detected == 1) { 2736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (icode_send_eof == 3) { 2746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi icode_send_eof = 0; 2756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_ntf[p_ntf[2] + 2] == 0x00) { 2776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("> Going through workaround - data of ISO 15693"); 2786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[2]--; 2796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (*p_len)--; 2806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 2816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[p_ntf[2] + 2] |= 0x01; 2826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 2836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_ntf[2] == 0x02 && p_ntf[1] == 0x00 && icode_detected == 1) { 2846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("> ICODE EOF response do not send to upper layer"); 2856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_ntf[0] == 0x61 && p_ntf[1] == 0x06 && icode_detected == 1) { 2866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("> Polling Loop Re-Started"); 2876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi icode_detected = 0; 2886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi icode_send_eof = 0; 2896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (*p_len == 4 && p_ntf[0] == 0x40 && p_ntf[1] == 0x02 && 2906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[2] == 0x01 && p_ntf[3] == 0x06) { 2916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("> Deinit workaround for LLCP set_config 0x%x 0x%x 0x%x", 2926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[21], p_ntf[22], p_ntf[23]); 2936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[0] = 0x40; 2946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[1] = 0x02; 2956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[2] = 0x02; 2966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[3] = 0x00; 2976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[4] = 0x00; 2986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *p_len = 5; 2996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if ((p_ntf[0] == 0x40) && (p_ntf[1] == 0x01)) { 3006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int len = p_ntf[2] + 2; /*include 2 byte header*/ 3016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi wFwVerRsp = (((uint32_t)p_ntf[len - 2]) << 16U) | 3026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (((uint32_t)p_ntf[len - 1]) << 8U) | p_ntf[len]; 3036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (wFwVerRsp == 0) status = NFCSTATUS_FAILED; 3046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi iCoreInitRspLen = *p_len; 3056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memcpy(bCoreInitRsp, p_ntf, *p_len); 3066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NxpNci> FW Version: %x.%x.%x", p_ntf[len - 2], 3076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[len - 1], p_ntf[len]); 3086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi fw_maj_ver = p_ntf[len - 1]; 3096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rom_version = p_ntf[len - 2]; 3106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 3116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // 4200 02 00 01 3126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (p_ntf[0] == 0x42 && p_ntf[1] == 0x00 && ee_disc_done == 0x01) { 3136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("Going through workaround - NFCEE_DISCOVER_RSP"); 3146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_ntf[4] == 0x01) { 3156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[4] = 0x00; 3166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ee_disc_done = 0x00; 3186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 3196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("Going through workaround - NFCEE_DISCOVER_RSP - END"); 3206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 3216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_ntf[0] == 0x61 && p_ntf[1] == 0x03 /*&& cleanup_timer!=0*/) { 3226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (cleanup_timer != 0) { 3236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* if RF Notification Type of RF_DISCOVER_NTF is Last Notification */ 3246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (0 == (*(p_ntf + 2 + (*(p_ntf + 2))))) { 3256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi phNxpNciHal_select_RF_Discovery(RfDiscID, RfProtocolType); 326ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao status = NFCSTATUS_FAILED; 327ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao return status; 3286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 3296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RfDiscID = p_ntf[3]; 3306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi RfProtocolType = p_ntf[4]; 3316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 3326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = NFCSTATUS_FAILED; 3336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return status; 3346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 3356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_ntf[0] == 0x41 && p_ntf[1] == 0x04 && cleanup_timer != 0) { 3366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = NFCSTATUS_FAILED; 3376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return status; 3386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_ntf[0] == 0x60 && p_ntf[1] == 0x00) { 3396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_E("CORE_RESET_NTF received!"); 3406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (NFC_NXP_CHIP_TYPE == PN548C2) 3416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nfcdep_detected && 3426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi !(p_ntf[2] == 0x06 && p_ntf[3] == 0xA0 && p_ntf[4] == 0x00 && 3436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_ntf[5] == 0xC9 && p_ntf[6] == 0x95 && p_ntf[7] == 0x00 && 3446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[8] == 0x00) || 3456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_ntf[5] == 0x07 && p_ntf[6] == 0x39 && p_ntf[7] == 0xF2 && 3466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[8] == 0x00)))) { 3476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nfcdep_detected = 0x00; 348121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao } 349121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#endif 3506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi phNxpNciHal_emergency_recovery(); 3516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = NFCSTATUS_FAILED; 352121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao return status; 3536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 3546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (NFC_NXP_CHIP_TYPE == PN547C2) 3556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x02 && 3566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[5] == 0x80 && p_ntf[6] == 0x00) { 3576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D( 3586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "Going through workaround - iso-dep interface mifare protocol with " 3596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "sak value not equal to 0x20"); 3606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi rf_technology_length_param = p_ntf[9]; 3616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_ntf[9 + rf_technology_length_param] & 0x20) != 0x20) { 3626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[4] = 0x80; 3636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 3646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 3656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif 3666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (*p_len == 4 && p_ntf[0] == 0x4F && p_ntf[1] == 0x11 && 3676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[2] == 0x01) { 3686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_ntf[3] == 0x00) { 3696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D( 3706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "> Workaround for ISO-DEP Presence Check, ignore response and wait " 3716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "for notification"); 3726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[0] = 0x60; 3736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[1] = 0x06; 3746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[2] = 0x03; 3756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[3] = 0x01; 3766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[4] = 0x00; 3776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[5] = 0x01; 3786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *p_len = 6; 3796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 3806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D( 3816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "> Workaround for ISO-DEP Presence Check, presence check return " 3826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "failed"); 3836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[0] = 0x60; 3846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[1] = 0x08; 3856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[2] = 0x02; 3866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[3] = 0xB2; 3876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[4] = 0x00; 3886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *p_len = 5; 3896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 3906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (*p_len == 4 && p_ntf[0] == 0x6F && p_ntf[1] == 0x11 && 3916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[2] == 0x01) { 3926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_ntf[3] == 0x01) { 3936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D( 3946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "> Workaround for ISO-DEP Presence Check - Card still in field"); 3956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[0] = 0x00; 3966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[1] = 0x00; 3976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[2] = 0x01; 3986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[3] = 0x7E; 3996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 4006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D( 4016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "> Workaround for ISO-DEP Presence Check - Card not in field"); 4026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[0] = 0x60; 4036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[1] = 0x08; 4046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[2] = 0x02; 4056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[3] = 0xB2; 4066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[4] = 0x00; 4076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *p_len = 5; 4086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* 4116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if(p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x01 && p_ntf[5] 4126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi == 0x00 && p_ntf[6] == 0x01) 4136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 4146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("Picopass type 3-B with undefined protocol is not 4156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi supported, disabling"); 4166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[4] = 0xFF; 4176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[5] = 0xFF; 4186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_ntf[6] = 0xFF; 4196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi }*/ 4206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return status; 422121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao} 423121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 424121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/****************************************************************************** 425121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Function phNxpNciHal_process_ext_cmd_rsp 426121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * 427121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Description This function process the extension command response. It 428121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * also checks the received response to expected response. 429121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * 430121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Returns returns NFCSTATUS_SUCCESS if response is as expected else 431121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * returns failure. 432121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * 433121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao ******************************************************************************/ 4346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic NFCSTATUS phNxpNciHal_process_ext_cmd_rsp(uint16_t cmd_len, 4356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_cmd) { 4366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFCSTATUS status = NFCSTATUS_FAILED; 4376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t data_written = 0; 4386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Create the local semaphore */ 4406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (phNxpNciHal_init_cb_data(&nxpncihal_ctrl.ext_cb_data, NULL) != 4416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFCSTATUS_SUCCESS) { 4426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("Create ext_cb_data failed"); 4436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return NFCSTATUS_FAILED; 4446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nxpncihal_ctrl.ext_cb_data.status = NFCSTATUS_SUCCESS; 4476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Send ext command */ 4496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi data_written = phNxpNciHal_write_unlocked(cmd_len, p_cmd); 4506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (data_written != cmd_len) { 4516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("phNxpNciHal_write failed for hal ext"); 4526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi goto clean_and_return; 4536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Start timer */ 4566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = phOsalNfc_Timer_Start(timeoutTimerId, HAL_EXTNS_WRITE_RSP_TIMEOUT, 4576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi &hal_extns_write_rsp_timeout_cb, NULL); 4586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (NFCSTATUS_SUCCESS == status) { 4596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("Response timer started"); 4606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 4616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_E("Response timer not started!!!"); 4626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = NFCSTATUS_FAILED; 4636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi goto clean_and_return; 4646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Wait for rsp */ 4676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("Waiting after ext cmd sent"); 4686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (SEM_WAIT(nxpncihal_ctrl.ext_cb_data)) { 4696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_E("p_hal_ext->ext_cb_data.sem semaphore error"); 4706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi goto clean_and_return; 4716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* Stop Timer */ 4746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = phOsalNfc_Timer_Stop(timeoutTimerId); 4756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (NFCSTATUS_SUCCESS == status) { 4776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("Response timer stopped"); 4786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 4796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_E("Response timer stop ERROR!!!"); 4806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = NFCSTATUS_FAILED; 4816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi goto clean_and_return; 4826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nxpncihal_ctrl.ext_cb_data.status != NFCSTATUS_SUCCESS) { 4856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_E( 4866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "Callback Status is failed!! Timer Expired!! Couldn't read it! 0x%x", 4876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nxpncihal_ctrl.ext_cb_data.status); 4886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = NFCSTATUS_FAILED; 4896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi goto clean_and_return; 4906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 4916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 4926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("Checking response"); 4936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = NFCSTATUS_SUCCESS; 494121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 495121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoclean_and_return: 4966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi phNxpNciHal_cleanup_cb_data(&nxpncihal_ctrl.ext_cb_data); 497121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 4986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return status; 499121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao} 500121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 501121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/****************************************************************************** 502121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Function phNxpNciHal_write_ext 503121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * 504121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Description This function inform the status of phNxpNciHal_open 505121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * function to libnfc-nci. 506121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * 507121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Returns It return NFCSTATUS_SUCCESS then continue with send else 508121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * sends NFCSTATUS_FAILED direct response is prepared and 509121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * do not send anything to NFCC. 510121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * 511121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao ******************************************************************************/ 512121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 5136fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoiNFCSTATUS phNxpNciHal_write_ext(uint16_t* cmd_len, uint8_t* p_cmd_data, 5146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t* rsp_len, uint8_t* p_rsp_data) { 5156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFCSTATUS status = NFCSTATUS_SUCCESS; 5166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi unsigned long retval = 0; 5186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int isfound = 5196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi GetNxpNumValue(NAME_MIFARE_READER_ENABLE, &retval, sizeof(unsigned long)); 5206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi phNxpNciHal_NfcDep_cmd_ext(p_cmd_data, cmd_len); 5226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (phNxpDta_IsEnable() == true) { 5246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = phNxpNHal_DtaUpdate(cmd_len, p_cmd_data, rsp_len, p_rsp_data); 5256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 5266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cmd_data[0] == PROPRIETARY_CMD_FELICA_READER_MODE && 5286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[1] == PROPRIETARY_CMD_FELICA_READER_MODE && 5296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[2] == PROPRIETARY_CMD_FELICA_READER_MODE) { 5306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("Received proprietary command to set Felica Reader mode:%d", 5316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[3]); 5326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi gFelicaReaderMode = p_cmd_data[3]; 5336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* frame the dummy response */ 5346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *rsp_len = 4; 5356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_rsp_data[0] = 0x00; 5366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_rsp_data[1] = 0x00; 5376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_rsp_data[2] = 0x00; 5386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_rsp_data[3] = 0x00; 5396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = NFCSTATUS_FAILED; 5406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 && 5416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[2] == 0x05 && p_cmd_data[3] == 0x01 && 5426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[4] == 0xA0 && p_cmd_data[5] == 0x44 && 5436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[6] == 0x01 && p_cmd_data[7] == 0x01) { 5446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nxpprofile_ctrl.profile_type = EMV_CO_PROFILE; 5456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("EMV_CO_PROFILE mode - Enabled"); 5466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = NFCSTATUS_SUCCESS; 5476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 && 5486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[2] == 0x05 && p_cmd_data[3] == 0x01 && 5496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[4] == 0xA0 && p_cmd_data[5] == 0x44 && 5506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[6] == 0x01 && p_cmd_data[7] == 0x00) { 5516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("NFC_FORUM_PROFILE mode - Enabled"); 5526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nxpprofile_ctrl.profile_type = NFC_FORUM_PROFILE; 5536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = NFCSTATUS_SUCCESS; 5546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 555121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 5566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (nxpprofile_ctrl.profile_type == EMV_CO_PROFILE) { 5576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x06 && 5586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[2] == 0x01 && p_cmd_data[3] == 0x03) { 559121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#if 0 560121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao //Needs clarification whether to keep it or not 561121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao NXPLOG_NCIHAL_D ("EmvCo Poll mode - RF Deactivate discard"); 562121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len); 563121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *rsp_len = 4; 564121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao p_rsp_data[0] = 0x41; 565121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao p_rsp_data[1] = 0x06; 566121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao p_rsp_data[2] = 0x01; 567121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao p_rsp_data[3] = 0x00; 568121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao phNxpNciHal_print_packet("RECV", p_rsp_data, 4); 569121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao status = NFCSTATUS_FAILED; 570121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#endif 5716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x03) { 5726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("EmvCo Poll mode - Discover map only for A and B"); 5736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[2] = 0x05; 5746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[3] = 0x02; 5756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[4] = 0x00; 5766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[5] = 0x01; 5776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[6] = 0x01; 5786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[7] = 0x01; 5796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *cmd_len = 8; 5806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 5816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 5826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (retval == 0x01 && p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x00) { 5846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("Going through extns - Adding Mifare in RF Discovery"); 5856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[2] += 3; 5866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[3] += 1; 5876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[*cmd_len] = 0x80; 5886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[*cmd_len + 1] = 0x01; 5896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[*cmd_len + 2] = 0x80; 5906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *cmd_len += 3; 5916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = NFCSTATUS_SUCCESS; 5926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D( 5936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "Going through extns - Adding Mifare in RF Discovery - END"); 5946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cmd_data[3] == 0x81 && p_cmd_data[4] == 0x01 && 5956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[5] == 0x03) { 5966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("> Going through workaround - set host list"); 5976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 5986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (NFC_NXP_CHIP_TYPE != PN547C2) 5996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *cmd_len = 8; 6006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[2] = 0x05; 6026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[6] = 0x02; 6036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[7] = 0xC0; 604121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#else 6056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *cmd_len = 7; 606121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 6076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[2] = 0x04; 6086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[6] = 0xC0; 609121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#endif 610121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 6116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("> Going through workaround - set host list - END"); 6126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = NFCSTATUS_SUCCESS; 6136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (icode_detected) { 6146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((p_cmd_data[3] & 0x40) == 0x40 && 6156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cmd_data[4] == 0x21 || p_cmd_data[4] == 0x22 || 6166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[4] == 0x24 || p_cmd_data[4] == 0x27 || 6176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[4] == 0x28 || p_cmd_data[4] == 0x29 || 6186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[4] == 0x2a)) { 6196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("> Send EOF set"); 6206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi icode_send_eof = 1; 6216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 6226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cmd_data[3] == 0x20 || p_cmd_data[3] == 0x24 || 6246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[3] == 0x60) { 6256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("> NFC ISO_15693 Proprietary CMD "); 6266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[3] += 0x02; 6276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 6286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x03) { 6296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("> Polling Loop Started"); 6306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi icode_detected = 0; 6316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi icode_send_eof = 0; 6326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (NFC_NXP_CHIP_TYPE == PN548C2) 6336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // Cache discovery cmd for recovery 6346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi phNxpNciHal_discovery_cmd_ext(p_cmd_data, *cmd_len); 63536d7231ec9344bed2996be1293e97d082fa22294Jizhou Liao#endif 6366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 6376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // 22000100 6386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (p_cmd_data[0] == 0x22 && p_cmd_data[1] == 0x00 && 6396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[2] == 0x01 && p_cmd_data[3] == 0x00) { 6406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // ee_disc_done = 0x01;//Reader Over SWP event getting 6416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *rsp_len = 0x05; 6426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_rsp_data[0] = 0x42; 6436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_rsp_data[1] = 0x00; 6446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_rsp_data[2] = 0x02; 6456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_rsp_data[3] = 0x00; 6466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_rsp_data[4] = 0x00; 6476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi phNxpNciHal_print_packet("RECV", p_rsp_data, 5); 6486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = NFCSTATUS_FAILED; 6496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 6506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // 2002 0904 3000 3100 3200 5000 6516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if ((p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) && 6526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_cmd_data[2] == 0x09 && p_cmd_data[3] == 0x04) /*|| 6536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04)*/ 6546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi )) { 6556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *cmd_len += 0x01; 6566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[2] += 0x01; 6576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[9] = 0x01; 6586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[10] = 0x40; 6596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[11] = 0x50; 6606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[12] = 0x00; 6616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config "); 6636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len); 6646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config - End "); 6656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 6666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // 20020703300031003200 6676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // 2002 0301 3200 6686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if ((p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) && 6696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ((p_cmd_data[2] == 0x07 && p_cmd_data[3] == 0x03) || 6706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cmd_data[2] == 0x03 && p_cmd_data[3] == 0x01 && 6716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[4] == 0x32))) { 6726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config "); 6736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len); 6746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *rsp_len = 5; 6756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_rsp_data[0] = 0x40; 6766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_rsp_data[1] = 0x02; 6776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_rsp_data[2] = 0x02; 6786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_rsp_data[3] = 0x00; 6796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_rsp_data[4] = 0x00; 6806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi phNxpNciHal_print_packet("RECV", p_rsp_data, 5); 6826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = NFCSTATUS_FAILED; 6836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config - End "); 6846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 6856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // 2002 0D04 300104 310100 320100 500100 6876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // 2002 0401 320100 6886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if ((p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) && 6896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ( 6906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /*(p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04)*/ 6916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi (p_cmd_data[2] == 0x04 && p_cmd_data[3] == 0x01 && 6926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[4] == 0x32 && p_cmd_data[5] == 0x00))) { 6936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // p_cmd_data[12] = 0x40; 6946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config "); 6966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len); 6976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[6] = 0x60; 6986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 6996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi phNxpNciHal_print_packet("RECV", p_rsp_data, 5); 7006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // status = NFCSTATUS_FAILED; 7016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config - End "); 7026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x00) { 7036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D( 7046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "> Going through workaround - Add Mifare Classic in Discovery Map"); 7056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[*cmd_len] = 0x80; 7066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[*cmd_len + 1] = 0x01; 7076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[*cmd_len + 2] = 0x80; 7086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[5] = 0x01; 7096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[6] = 0x01; 7106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[2] += 3; 7116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[3] += 1; 7126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *cmd_len += 3; 7136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else if (*cmd_len == 3 && p_cmd_data[0] == 0x00 && p_cmd_data[1] == 0x00 && 7146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[2] == 0x00) { 7156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("> Going through workaround - ISO-DEP Presence Check "); 7166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[0] = 0x2F; 7176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[1] = 0x11; 7186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[2] = 0x00; 7196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = NFCSTATUS_SUCCESS; 7206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D( 7216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi "> Going through workaround - ISO-DEP Presence Check - End"); 7226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 723121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#if 0 724121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao else if ( (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 ) && 725121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao ((p_cmd_data[2] == 0x09 && p_cmd_data[3] == 0x04) || 726121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao (p_cmd_data[2] == 0x0B && p_cmd_data[3] == 0x05) || 727121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao (p_cmd_data[2] == 0x07 && p_cmd_data[3] == 0x02) || 728121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao (p_cmd_data[2] == 0x0A && p_cmd_data[3] == 0x03) || 729121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao (p_cmd_data[2] == 0x0A && p_cmd_data[3] == 0x04) || 730121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao (p_cmd_data[2] == 0x05 && p_cmd_data[3] == 0x02)) 731121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao ) 732121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao { 733121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config "); 734121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len); 735121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *rsp_len = 5; 736121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao p_rsp_data[0] = 0x40; 737121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao p_rsp_data[1] = 0x02; 738121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao p_rsp_data[2] = 0x02; 739121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao p_rsp_data[3] = 0x00; 740121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao p_rsp_data[4] = 0x00; 741121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 742121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao phNxpNciHal_print_packet("RECV", p_rsp_data, 5); 743121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao status = NFCSTATUS_FAILED; 744121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config - End "); 745121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao } 746121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 747121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao else if((p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) && 748121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao ((p_cmd_data[3] == 0x00) || 749121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao ((*cmd_len >= 0x06) && (p_cmd_data[5] == 0x00)))) /*If the length of the first param id is zero don't allow*/ 750121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao { 751121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config "); 752121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len); 753121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *rsp_len = 5; 754121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao p_rsp_data[0] = 0x40; 755121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao p_rsp_data[1] = 0x02; 756121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao p_rsp_data[2] = 0x02; 757121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao p_rsp_data[3] = 0x00; 758121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao p_rsp_data[4] = 0x00; 759121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 760121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao phNxpNciHal_print_packet("RECV", p_rsp_data, 5); 761121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao status = NFCSTATUS_FAILED; 762121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config - End "); 763121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao } 764121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#endif 7656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if ((wFwVerRsp & 0x0000FFFF) == wFwVer) { 7666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* skip CORE_RESET and CORE_INIT from Brcm */ 7676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x00 && 7686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[2] == 0x01 && p_cmd_data[3] == 0x01) { 7696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // *rsp_len = 6; 7706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // 7716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // NXPLOG_NCIHAL_D("> Going - core reset optimization"); 7726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // 7736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // p_rsp_data[0] = 0x40; 7746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // p_rsp_data[1] = 0x00; 7756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // p_rsp_data[2] = 0x03; 7766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // p_rsp_data[3] = 0x00; 7776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // p_rsp_data[4] = 0x10; 7786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // p_rsp_data[5] = 0x01; 7796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // 7806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // status = NFCSTATUS_FAILED; 7816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // NXPLOG_NCIHAL_D("> Going - core reset optimization - END"); 7826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 7836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* CORE_INIT */ 7846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x01 && 7856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_cmd_data[2] == 0x00) { 7866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // NXPLOG_NCIHAL_D("> Going - core init optimization"); 7876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // *rsp_len = iCoreInitRspLen; 7886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // memcpy(p_rsp_data, bCoreInitRsp, iCoreInitRspLen); 7896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // status = NFCSTATUS_FAILED; 7906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi // NXPLOG_NCIHAL_D("> Going - core init optimization - END"); 7916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 7926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 7936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 7946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (NFC_NXP_CHIP_TYPE == PN548C2) 7956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) { 7966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t temp; 7976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p = p_cmd_data + 4; 7986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* end = p_cmd_data + *cmd_len; 7996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi while (p < end) { 8006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (*p == 0x53) // LF_T3T_FLAGS 8016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi { 8026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("> Going through workaround - LF_T3T_FLAGS swap"); 8036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi temp = *(p + 3); 8046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *(p + 3) = *(p + 2); 8056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi *(p + 2) = temp; 8066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_D("> Going through workaround - LF_T3T_FLAGS - End"); 8076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = NFCSTATUS_SUCCESS; 8086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi break; 8096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (*p == 0xA0) { 8116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p += *(p + 2) + 3; 8126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } else { 8136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p += *(p + 1) + 2; 8146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 8166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 81707adce3e1ad4f3c9aa86025b7bbeb16fe5fda8ddJizhou Liao#endif 81807adce3e1ad4f3c9aa86025b7bbeb16fe5fda8ddJizhou Liao 8196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return status; 820121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao} 821121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 822121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/****************************************************************************** 823121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Function phNxpNciHal_send_ext_cmd 824121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * 825121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Description This function send the extension command to NFCC. No 826121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * response is checked by this function but it waits for 827121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * the response to come. 828121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * 829121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Returns Returns NFCSTATUS_SUCCESS if sending cmd is successful and 830121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * response is received. 831121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * 832121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao ******************************************************************************/ 8336fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoiNFCSTATUS phNxpNciHal_send_ext_cmd(uint16_t cmd_len, uint8_t* p_cmd) { 8346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFCSTATUS status = NFCSTATUS_FAILED; 835121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 8366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi HAL_ENABLE_EXT(); 8376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nxpncihal_ctrl.cmd_len = cmd_len; 8386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memcpy(nxpncihal_ctrl.p_cmd_data, p_cmd, cmd_len); 8396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi status = phNxpNciHal_process_ext_cmd_rsp(nxpncihal_ctrl.cmd_len, 8406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nxpncihal_ctrl.p_cmd_data); 8416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi HAL_DISABLE_EXT(); 842121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 8436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return status; 844121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao} 845121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao 846121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/****************************************************************************** 847121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Function hal_extns_write_rsp_timeout_cb 848121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * 849121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Description Timer call back function 850121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * 851121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Returns None 852121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * 853121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao ******************************************************************************/ 8546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void hal_extns_write_rsp_timeout_cb(uint32_t timerId, void* pContext) { 8556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UNUSED(timerId); 8566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi UNUSED(pContext); 8576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NXPLOG_NCIHAL_E("hal_extns_write_rsp_timeout_cb - write timeout!!!"); 8586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi nxpncihal_ctrl.ext_cb_data.status = NFCSTATUS_FAILED; 8596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi usleep(1); 8606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi SEM_POST(&(nxpncihal_ctrl.ext_cb_data)); 8616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 8626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return; 863121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao} 864