1 /* 2 * Copyright (C) 2012-2014 NXP Semiconductors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 #include <phDal4Nfc_messageQueueLib.h> 17 #include <phNxpConfig.h> 18 #include <phNxpLog.h> 19 #include <phNxpNciHal.h> 20 #include <phNxpNciHal_Kovio.h> 21 #include <phNxpNciHal_NfcDepSWPrio.h> 22 #include <phNxpNciHal_ext.h> 23 #include <phTmlNfc.h> 24 25 /* Timeout value to wait for response from PN548AD */ 26 #define HAL_EXTNS_WRITE_RSP_TIMEOUT (1000) 27 28 #undef P2P_PRIO_LOGIC_HAL_IMP 29 30 /******************* Global variables *****************************************/ 31 extern phNxpNciHal_Control_t nxpncihal_ctrl; 32 extern phNxpNciProfile_Control_t nxpprofile_ctrl; 33 34 extern int kovio_detected; 35 extern int disable_kovio; 36 extern int send_to_upper_kovio; 37 extern uint32_t cleanup_timer; 38 uint8_t icode_detected = 0x00; 39 uint8_t icode_send_eof = 0x00; 40 #if (NFC_NXP_CHIP_TYPE == PN548C2) 41 uint8_t nfcdep_detected = 0x00; 42 #endif 43 static uint8_t ee_disc_done = 0x00; 44 uint8_t EnableP2P_PrioLogic = false; 45 static uint32_t RfDiscID = 1; 46 static uint32_t RfProtocolType = 4; 47 /* NFCEE Set mode */ 48 static uint8_t setEEModeDone = 0x00; 49 static uint8_t cmd_nfcee_setmode_enable[] = {0x22, 0x01, 0x02, 0x01, 0x01}; 50 51 /* External global variable to get FW version from NCI response*/ 52 extern uint32_t wFwVerRsp; 53 /* External global variable to get FW version from FW file*/ 54 extern uint16_t wFwVer; 55 56 uint16_t fw_maj_ver; 57 uint16_t rom_version; 58 /* local buffer to store CORE_INIT response */ 59 static uint32_t bCoreInitRsp[40]; 60 static uint32_t iCoreInitRspLen; 61 62 extern uint32_t timeoutTimerId; 63 64 extern NFCSTATUS read_retry(); 65 66 /************** HAL extension functions ***************************************/ 67 static void hal_extns_write_rsp_timeout_cb(uint32_t TimerId, void* pContext); 68 69 /*Proprietary cmd sent to HAL to send reader mode flag 70 * Last byte of 4 byte proprietary cmd data contains ReaderMode flag 71 * If this flag is enabled, NFC-DEP protocol is modified to T3T protocol 72 * if FrameRF interface is selected. This needs to be done as the FW 73 * always sends Ntf for FrameRF with NFC-DEP even though FrameRF with T3T is 74 * previously selected with DISCOVER_SELECT_CMD 75 */ 76 #define PROPRIETARY_CMD_FELICA_READER_MODE 0xFE 77 static uint8_t gFelicaReaderMode; 78 79 /******************************************************************************* 80 ** 81 ** Function phNxpNciHal_ext_init 82 ** 83 ** Description initialize extension function 84 ** 85 *******************************************************************************/ 86 void phNxpNciHal_ext_init(void) { 87 icode_detected = 0x00; 88 icode_send_eof = 0x00; 89 setEEModeDone = 0x00; 90 kovio_detected = 0x00; 91 disable_kovio = 0x00; 92 send_to_upper_kovio = 0x01; 93 EnableP2P_PrioLogic = false; 94 } 95 96 /******************************************************************************* 97 ** 98 ** Function phNxpNciHal_process_ext_rsp 99 ** 100 ** Description Process extension function response 101 ** 102 ** Returns NFCSTATUS_SUCCESS if success 103 ** 104 *******************************************************************************/ 105 NFCSTATUS phNxpNciHal_process_ext_rsp(uint8_t* p_ntf, uint16_t* p_len) { 106 NFCSTATUS status = NFCSTATUS_SUCCESS; 107 uint16_t rf_technology_length_param = 0; 108 109 if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x03 && 110 p_ntf[5] == 0x05 && nxpprofile_ctrl.profile_type == EMV_CO_PROFILE) { 111 p_ntf[4] = 0xFF; 112 p_ntf[5] = 0xFF; 113 p_ntf[6] = 0xFF; 114 NXPLOG_NCIHAL_D("Nfc-Dep Detect in EmvCo profile - Restart polling"); 115 } 116 117 if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x01 && 118 p_ntf[5] == 0x05 && p_ntf[6] == 0x02 && gFelicaReaderMode) { 119 /*If FelicaReaderMode is enabled,Change Protocol to T3T from NFC-DEP 120 * when FrameRF interface is selected*/ 121 p_ntf[5] = 0x03; 122 NXPLOG_NCIHAL_D("FelicaReaderMode:Activity 1.1"); 123 } 124 125 #ifdef P2P_PRIO_LOGIC_HAL_IMP 126 if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x02 && 127 p_ntf[5] == 0x04 && nxpprofile_ctrl.profile_type == NFC_FORUM_PROFILE) { 128 EnableP2P_PrioLogic = true; 129 } 130 131 NXPLOG_NCIHAL_D("Is EnableP2P_PrioLogic: 0x0%X", EnableP2P_PrioLogic); 132 if (phNxpDta_IsEnable() == false) { 133 if ((icode_detected != 1) && (kovio_detected != 1) && 134 (EnableP2P_PrioLogic == true)) { 135 if (phNxpNciHal_NfcDep_comapre_ntf(p_ntf, *p_len) == NFCSTATUS_FAILED) { 136 status = phNxpNciHal_NfcDep_rsp_ext(p_ntf, p_len); 137 if (status != NFCSTATUS_INVALID_PARAMETER) { 138 return status; 139 } 140 } 141 } 142 } 143 #endif 144 145 status = NFCSTATUS_SUCCESS; 146 status = phNxpNciHal_kovio_rsp_ext(p_ntf, p_len); 147 148 if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05) { 149 #if (NFC_NXP_CHIP_TYPE == PN548C2) 150 if (nfcdep_detected) { 151 nfcdep_detected = 0x00; 152 } 153 #endif 154 155 switch (p_ntf[4]) { 156 case 0x00: 157 NXPLOG_NCIHAL_D("NxpNci: RF Interface = NFCEE Direct RF"); 158 break; 159 case 0x01: 160 NXPLOG_NCIHAL_D("NxpNci: RF Interface = Frame RF"); 161 break; 162 case 0x02: 163 NXPLOG_NCIHAL_D("NxpNci: RF Interface = ISO-DEP"); 164 break; 165 case 0x03: 166 NXPLOG_NCIHAL_D("NxpNci: RF Interface = NFC-DEP"); 167 #if (NFC_NXP_CHIP_TYPE == PN548C2) 168 nfcdep_detected = 0x01; 169 #endif 170 break; 171 case 0x80: 172 NXPLOG_NCIHAL_D("NxpNci: RF Interface = MIFARE"); 173 break; 174 default: 175 NXPLOG_NCIHAL_D("NxpNci: RF Interface = Unknown"); 176 break; 177 } 178 179 switch (p_ntf[5]) { 180 case 0x01: 181 NXPLOG_NCIHAL_D("NxpNci: Protocol = T1T"); 182 phNxpDta_T1TEnable(); 183 break; 184 case 0x02: 185 NXPLOG_NCIHAL_D("NxpNci: Protocol = T2T"); 186 break; 187 case 0x03: 188 NXPLOG_NCIHAL_D("NxpNci: Protocol = T3T"); 189 break; 190 case 0x04: 191 NXPLOG_NCIHAL_D("NxpNci: Protocol = ISO-DEP"); 192 break; 193 case 0x05: 194 NXPLOG_NCIHAL_D("NxpNci: Protocol = NFC-DEP"); 195 break; 196 case 0x06: 197 NXPLOG_NCIHAL_D("NxpNci: Protocol = 15693"); 198 break; 199 case 0x80: 200 NXPLOG_NCIHAL_D("NxpNci: Protocol = MIFARE"); 201 break; 202 #if (NFC_NXP_CHIP_TYPE != PN547C2) 203 case 0x81: 204 #else 205 case 0x8A: 206 #endif 207 NXPLOG_NCIHAL_D("NxpNci: Protocol = Kovio"); 208 break; 209 default: 210 NXPLOG_NCIHAL_D("NxpNci: Protocol = Unknown"); 211 break; 212 } 213 214 switch (p_ntf[6]) { 215 case 0x00: 216 NXPLOG_NCIHAL_D("NxpNci: Mode = A Passive Poll"); 217 break; 218 case 0x01: 219 NXPLOG_NCIHAL_D("NxpNci: Mode = B Passive Poll"); 220 break; 221 case 0x02: 222 NXPLOG_NCIHAL_D("NxpNci: Mode = F Passive Poll"); 223 break; 224 case 0x03: 225 NXPLOG_NCIHAL_D("NxpNci: Mode = A Active Poll"); 226 break; 227 case 0x05: 228 NXPLOG_NCIHAL_D("NxpNci: Mode = F Active Poll"); 229 break; 230 case 0x06: 231 NXPLOG_NCIHAL_D("NxpNci: Mode = 15693 Passive Poll"); 232 break; 233 #if (NFC_NXP_CHIP_TYPE != PN547C2) 234 case 0x70: 235 #else 236 case 0x77: 237 #endif 238 NXPLOG_NCIHAL_D("NxpNci: Mode = Kovio"); 239 break; 240 case 0x80: 241 NXPLOG_NCIHAL_D("NxpNci: Mode = A Passive Listen"); 242 break; 243 case 0x81: 244 NXPLOG_NCIHAL_D("NxpNci: Mode = B Passive Listen"); 245 break; 246 case 0x82: 247 NXPLOG_NCIHAL_D("NxpNci: Mode = F Passive Listen"); 248 break; 249 case 0x83: 250 NXPLOG_NCIHAL_D("NxpNci: Mode = A Active Listen"); 251 break; 252 case 0x85: 253 NXPLOG_NCIHAL_D("NxpNci: Mode = F Active Listen"); 254 break; 255 case 0x86: 256 NXPLOG_NCIHAL_D("NxpNci: Mode = 15693 Passive Listen"); 257 break; 258 default: 259 NXPLOG_NCIHAL_D("NxpNci: Mode = Unknown"); 260 break; 261 } 262 } 263 264 if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[2] == 0x15 && 265 p_ntf[4] == 0x01 && p_ntf[5] == 0x06 && p_ntf[6] == 0x06) { 266 NXPLOG_NCIHAL_D("> Going through workaround - notification of ISO 15693"); 267 icode_detected = 0x01; 268 p_ntf[21] = 0x01; 269 p_ntf[22] = 0x01; 270 } else if (icode_detected == 1 && icode_send_eof == 2) { 271 icode_send_eof = 3; 272 } else if (p_ntf[0] == 0x00 && p_ntf[1] == 0x00 && icode_detected == 1) { 273 if (icode_send_eof == 3) { 274 icode_send_eof = 0; 275 } 276 if (p_ntf[p_ntf[2] + 2] == 0x00) { 277 NXPLOG_NCIHAL_D("> Going through workaround - data of ISO 15693"); 278 p_ntf[2]--; 279 (*p_len)--; 280 } else { 281 p_ntf[p_ntf[2] + 2] |= 0x01; 282 } 283 } else if (p_ntf[2] == 0x02 && p_ntf[1] == 0x00 && icode_detected == 1) { 284 NXPLOG_NCIHAL_D("> ICODE EOF response do not send to upper layer"); 285 } else if (p_ntf[0] == 0x61 && p_ntf[1] == 0x06 && icode_detected == 1) { 286 NXPLOG_NCIHAL_D("> Polling Loop Re-Started"); 287 icode_detected = 0; 288 icode_send_eof = 0; 289 } else if (*p_len == 4 && p_ntf[0] == 0x40 && p_ntf[1] == 0x02 && 290 p_ntf[2] == 0x01 && p_ntf[3] == 0x06) { 291 NXPLOG_NCIHAL_D("> Deinit workaround for LLCP set_config 0x%x 0x%x 0x%x", 292 p_ntf[21], p_ntf[22], p_ntf[23]); 293 p_ntf[0] = 0x40; 294 p_ntf[1] = 0x02; 295 p_ntf[2] = 0x02; 296 p_ntf[3] = 0x00; 297 p_ntf[4] = 0x00; 298 *p_len = 5; 299 } else if ((p_ntf[0] == 0x40) && (p_ntf[1] == 0x01)) { 300 int len = p_ntf[2] + 2; /*include 2 byte header*/ 301 wFwVerRsp = (((uint32_t)p_ntf[len - 2]) << 16U) | 302 (((uint32_t)p_ntf[len - 1]) << 8U) | p_ntf[len]; 303 if (wFwVerRsp == 0) status = NFCSTATUS_FAILED; 304 iCoreInitRspLen = *p_len; 305 memcpy(bCoreInitRsp, p_ntf, *p_len); 306 NXPLOG_NCIHAL_D("NxpNci> FW Version: %x.%x.%x", p_ntf[len - 2], 307 p_ntf[len - 1], p_ntf[len]); 308 fw_maj_ver = p_ntf[len - 1]; 309 rom_version = p_ntf[len - 2]; 310 } 311 // 4200 02 00 01 312 else if (p_ntf[0] == 0x42 && p_ntf[1] == 0x00 && ee_disc_done == 0x01) { 313 NXPLOG_NCIHAL_D("Going through workaround - NFCEE_DISCOVER_RSP"); 314 if (p_ntf[4] == 0x01) { 315 p_ntf[4] = 0x00; 316 317 ee_disc_done = 0x00; 318 } 319 NXPLOG_NCIHAL_D("Going through workaround - NFCEE_DISCOVER_RSP - END"); 320 321 } else if (p_ntf[0] == 0x61 && p_ntf[1] == 0x03 /*&& cleanup_timer!=0*/) { 322 if (cleanup_timer != 0) { 323 /* if RF Notification Type of RF_DISCOVER_NTF is Last Notification */ 324 if (0 == (*(p_ntf + 2 + (*(p_ntf + 2))))) { 325 phNxpNciHal_select_RF_Discovery(RfDiscID, RfProtocolType); 326 status = NFCSTATUS_FAILED; 327 return status; 328 } else { 329 RfDiscID = p_ntf[3]; 330 RfProtocolType = p_ntf[4]; 331 } 332 status = NFCSTATUS_FAILED; 333 return status; 334 } 335 } else if (p_ntf[0] == 0x41 && p_ntf[1] == 0x04 && cleanup_timer != 0) { 336 status = NFCSTATUS_FAILED; 337 return status; 338 } else if (p_ntf[0] == 0x60 && p_ntf[1] == 0x00) { 339 NXPLOG_NCIHAL_E("CORE_RESET_NTF received!"); 340 #if (NFC_NXP_CHIP_TYPE == PN548C2) 341 if (nfcdep_detected && 342 !(p_ntf[2] == 0x06 && p_ntf[3] == 0xA0 && p_ntf[4] == 0x00 && 343 ((p_ntf[5] == 0xC9 && p_ntf[6] == 0x95 && p_ntf[7] == 0x00 && 344 p_ntf[8] == 0x00) || 345 (p_ntf[5] == 0x07 && p_ntf[6] == 0x39 && p_ntf[7] == 0xF2 && 346 p_ntf[8] == 0x00)))) { 347 nfcdep_detected = 0x00; 348 } 349 #endif 350 phNxpNciHal_emergency_recovery(); 351 status = NFCSTATUS_FAILED; 352 return status; 353 } 354 #if (NFC_NXP_CHIP_TYPE == PN547C2) 355 else if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x02 && 356 p_ntf[5] == 0x80 && p_ntf[6] == 0x00) { 357 NXPLOG_NCIHAL_D( 358 "Going through workaround - iso-dep interface mifare protocol with " 359 "sak value not equal to 0x20"); 360 rf_technology_length_param = p_ntf[9]; 361 if ((p_ntf[9 + rf_technology_length_param] & 0x20) != 0x20) { 362 p_ntf[4] = 0x80; 363 } 364 } 365 #endif 366 else if (*p_len == 4 && p_ntf[0] == 0x4F && p_ntf[1] == 0x11 && 367 p_ntf[2] == 0x01) { 368 if (p_ntf[3] == 0x00) { 369 NXPLOG_NCIHAL_D( 370 "> Workaround for ISO-DEP Presence Check, ignore response and wait " 371 "for notification"); 372 p_ntf[0] = 0x60; 373 p_ntf[1] = 0x06; 374 p_ntf[2] = 0x03; 375 p_ntf[3] = 0x01; 376 p_ntf[4] = 0x00; 377 p_ntf[5] = 0x01; 378 *p_len = 6; 379 } else { 380 NXPLOG_NCIHAL_D( 381 "> Workaround for ISO-DEP Presence Check, presence check return " 382 "failed"); 383 p_ntf[0] = 0x60; 384 p_ntf[1] = 0x08; 385 p_ntf[2] = 0x02; 386 p_ntf[3] = 0xB2; 387 p_ntf[4] = 0x00; 388 *p_len = 5; 389 } 390 } else if (*p_len == 4 && p_ntf[0] == 0x6F && p_ntf[1] == 0x11 && 391 p_ntf[2] == 0x01) { 392 if (p_ntf[3] == 0x01) { 393 NXPLOG_NCIHAL_D( 394 "> Workaround for ISO-DEP Presence Check - Card still in field"); 395 p_ntf[0] = 0x00; 396 p_ntf[1] = 0x00; 397 p_ntf[2] = 0x01; 398 p_ntf[3] = 0x7E; 399 } else { 400 NXPLOG_NCIHAL_D( 401 "> Workaround for ISO-DEP Presence Check - Card not in field"); 402 p_ntf[0] = 0x60; 403 p_ntf[1] = 0x08; 404 p_ntf[2] = 0x02; 405 p_ntf[3] = 0xB2; 406 p_ntf[4] = 0x00; 407 *p_len = 5; 408 } 409 } 410 /* 411 else if(p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x01 && p_ntf[5] 412 == 0x00 && p_ntf[6] == 0x01) 413 { 414 NXPLOG_NCIHAL_D("Picopass type 3-B with undefined protocol is not 415 supported, disabling"); 416 p_ntf[4] = 0xFF; 417 p_ntf[5] = 0xFF; 418 p_ntf[6] = 0xFF; 419 }*/ 420 421 return status; 422 } 423 424 /****************************************************************************** 425 * Function phNxpNciHal_process_ext_cmd_rsp 426 * 427 * Description This function process the extension command response. It 428 * also checks the received response to expected response. 429 * 430 * Returns returns NFCSTATUS_SUCCESS if response is as expected else 431 * returns failure. 432 * 433 ******************************************************************************/ 434 static NFCSTATUS phNxpNciHal_process_ext_cmd_rsp(uint16_t cmd_len, 435 uint8_t* p_cmd) { 436 NFCSTATUS status = NFCSTATUS_FAILED; 437 uint16_t data_written = 0; 438 439 /* Create the local semaphore */ 440 if (phNxpNciHal_init_cb_data(&nxpncihal_ctrl.ext_cb_data, NULL) != 441 NFCSTATUS_SUCCESS) { 442 NXPLOG_NCIHAL_D("Create ext_cb_data failed"); 443 return NFCSTATUS_FAILED; 444 } 445 446 nxpncihal_ctrl.ext_cb_data.status = NFCSTATUS_SUCCESS; 447 448 /* Send ext command */ 449 data_written = phNxpNciHal_write_unlocked(cmd_len, p_cmd); 450 if (data_written != cmd_len) { 451 NXPLOG_NCIHAL_D("phNxpNciHal_write failed for hal ext"); 452 goto clean_and_return; 453 } 454 455 /* Start timer */ 456 status = phOsalNfc_Timer_Start(timeoutTimerId, HAL_EXTNS_WRITE_RSP_TIMEOUT, 457 &hal_extns_write_rsp_timeout_cb, NULL); 458 if (NFCSTATUS_SUCCESS == status) { 459 NXPLOG_NCIHAL_D("Response timer started"); 460 } else { 461 NXPLOG_NCIHAL_E("Response timer not started!!!"); 462 status = NFCSTATUS_FAILED; 463 goto clean_and_return; 464 } 465 466 /* Wait for rsp */ 467 NXPLOG_NCIHAL_D("Waiting after ext cmd sent"); 468 if (SEM_WAIT(nxpncihal_ctrl.ext_cb_data)) { 469 NXPLOG_NCIHAL_E("p_hal_ext->ext_cb_data.sem semaphore error"); 470 goto clean_and_return; 471 } 472 473 /* Stop Timer */ 474 status = phOsalNfc_Timer_Stop(timeoutTimerId); 475 476 if (NFCSTATUS_SUCCESS == status) { 477 NXPLOG_NCIHAL_D("Response timer stopped"); 478 } else { 479 NXPLOG_NCIHAL_E("Response timer stop ERROR!!!"); 480 status = NFCSTATUS_FAILED; 481 goto clean_and_return; 482 } 483 484 if (nxpncihal_ctrl.ext_cb_data.status != NFCSTATUS_SUCCESS) { 485 NXPLOG_NCIHAL_E( 486 "Callback Status is failed!! Timer Expired!! Couldn't read it! 0x%x", 487 nxpncihal_ctrl.ext_cb_data.status); 488 status = NFCSTATUS_FAILED; 489 goto clean_and_return; 490 } 491 492 NXPLOG_NCIHAL_D("Checking response"); 493 status = NFCSTATUS_SUCCESS; 494 495 clean_and_return: 496 phNxpNciHal_cleanup_cb_data(&nxpncihal_ctrl.ext_cb_data); 497 498 return status; 499 } 500 501 /****************************************************************************** 502 * Function phNxpNciHal_write_ext 503 * 504 * Description This function inform the status of phNxpNciHal_open 505 * function to libnfc-nci. 506 * 507 * Returns It return NFCSTATUS_SUCCESS then continue with send else 508 * sends NFCSTATUS_FAILED direct response is prepared and 509 * do not send anything to NFCC. 510 * 511 ******************************************************************************/ 512 513 NFCSTATUS phNxpNciHal_write_ext(uint16_t* cmd_len, uint8_t* p_cmd_data, 514 uint16_t* rsp_len, uint8_t* p_rsp_data) { 515 NFCSTATUS status = NFCSTATUS_SUCCESS; 516 517 unsigned long retval = 0; 518 int isfound = 519 GetNxpNumValue(NAME_MIFARE_READER_ENABLE, &retval, sizeof(unsigned long)); 520 521 phNxpNciHal_NfcDep_cmd_ext(p_cmd_data, cmd_len); 522 523 if (phNxpDta_IsEnable() == true) { 524 status = phNxpNHal_DtaUpdate(cmd_len, p_cmd_data, rsp_len, p_rsp_data); 525 } 526 527 if (p_cmd_data[0] == PROPRIETARY_CMD_FELICA_READER_MODE && 528 p_cmd_data[1] == PROPRIETARY_CMD_FELICA_READER_MODE && 529 p_cmd_data[2] == PROPRIETARY_CMD_FELICA_READER_MODE) { 530 NXPLOG_NCIHAL_D("Received proprietary command to set Felica Reader mode:%d", 531 p_cmd_data[3]); 532 gFelicaReaderMode = p_cmd_data[3]; 533 /* frame the dummy response */ 534 *rsp_len = 4; 535 p_rsp_data[0] = 0x00; 536 p_rsp_data[1] = 0x00; 537 p_rsp_data[2] = 0x00; 538 p_rsp_data[3] = 0x00; 539 status = NFCSTATUS_FAILED; 540 } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 && 541 p_cmd_data[2] == 0x05 && p_cmd_data[3] == 0x01 && 542 p_cmd_data[4] == 0xA0 && p_cmd_data[5] == 0x44 && 543 p_cmd_data[6] == 0x01 && p_cmd_data[7] == 0x01) { 544 nxpprofile_ctrl.profile_type = EMV_CO_PROFILE; 545 NXPLOG_NCIHAL_D("EMV_CO_PROFILE mode - Enabled"); 546 status = NFCSTATUS_SUCCESS; 547 } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 && 548 p_cmd_data[2] == 0x05 && p_cmd_data[3] == 0x01 && 549 p_cmd_data[4] == 0xA0 && p_cmd_data[5] == 0x44 && 550 p_cmd_data[6] == 0x01 && p_cmd_data[7] == 0x00) { 551 NXPLOG_NCIHAL_D("NFC_FORUM_PROFILE mode - Enabled"); 552 nxpprofile_ctrl.profile_type = NFC_FORUM_PROFILE; 553 status = NFCSTATUS_SUCCESS; 554 } 555 556 if (nxpprofile_ctrl.profile_type == EMV_CO_PROFILE) { 557 if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x06 && 558 p_cmd_data[2] == 0x01 && p_cmd_data[3] == 0x03) { 559 #if 0 560 //Needs clarification whether to keep it or not 561 NXPLOG_NCIHAL_D ("EmvCo Poll mode - RF Deactivate discard"); 562 phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len); 563 *rsp_len = 4; 564 p_rsp_data[0] = 0x41; 565 p_rsp_data[1] = 0x06; 566 p_rsp_data[2] = 0x01; 567 p_rsp_data[3] = 0x00; 568 phNxpNciHal_print_packet("RECV", p_rsp_data, 4); 569 status = NFCSTATUS_FAILED; 570 #endif 571 } else if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x03) { 572 NXPLOG_NCIHAL_D("EmvCo Poll mode - Discover map only for A and B"); 573 p_cmd_data[2] = 0x05; 574 p_cmd_data[3] = 0x02; 575 p_cmd_data[4] = 0x00; 576 p_cmd_data[5] = 0x01; 577 p_cmd_data[6] = 0x01; 578 p_cmd_data[7] = 0x01; 579 *cmd_len = 8; 580 } 581 } 582 583 if (retval == 0x01 && p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x00) { 584 NXPLOG_NCIHAL_D("Going through extns - Adding Mifare in RF Discovery"); 585 p_cmd_data[2] += 3; 586 p_cmd_data[3] += 1; 587 p_cmd_data[*cmd_len] = 0x80; 588 p_cmd_data[*cmd_len + 1] = 0x01; 589 p_cmd_data[*cmd_len + 2] = 0x80; 590 *cmd_len += 3; 591 status = NFCSTATUS_SUCCESS; 592 NXPLOG_NCIHAL_D( 593 "Going through extns - Adding Mifare in RF Discovery - END"); 594 } else if (p_cmd_data[3] == 0x81 && p_cmd_data[4] == 0x01 && 595 p_cmd_data[5] == 0x03) { 596 NXPLOG_NCIHAL_D("> Going through workaround - set host list"); 597 598 #if (NFC_NXP_CHIP_TYPE != PN547C2) 599 *cmd_len = 8; 600 601 p_cmd_data[2] = 0x05; 602 p_cmd_data[6] = 0x02; 603 p_cmd_data[7] = 0xC0; 604 #else 605 *cmd_len = 7; 606 607 p_cmd_data[2] = 0x04; 608 p_cmd_data[6] = 0xC0; 609 #endif 610 611 NXPLOG_NCIHAL_D("> Going through workaround - set host list - END"); 612 status = NFCSTATUS_SUCCESS; 613 } else if (icode_detected) { 614 if ((p_cmd_data[3] & 0x40) == 0x40 && 615 (p_cmd_data[4] == 0x21 || p_cmd_data[4] == 0x22 || 616 p_cmd_data[4] == 0x24 || p_cmd_data[4] == 0x27 || 617 p_cmd_data[4] == 0x28 || p_cmd_data[4] == 0x29 || 618 p_cmd_data[4] == 0x2a)) { 619 NXPLOG_NCIHAL_D("> Send EOF set"); 620 icode_send_eof = 1; 621 } 622 623 if (p_cmd_data[3] == 0x20 || p_cmd_data[3] == 0x24 || 624 p_cmd_data[3] == 0x60) { 625 NXPLOG_NCIHAL_D("> NFC ISO_15693 Proprietary CMD "); 626 p_cmd_data[3] += 0x02; 627 } 628 } else if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x03) { 629 NXPLOG_NCIHAL_D("> Polling Loop Started"); 630 icode_detected = 0; 631 icode_send_eof = 0; 632 #if (NFC_NXP_CHIP_TYPE == PN548C2) 633 // Cache discovery cmd for recovery 634 phNxpNciHal_discovery_cmd_ext(p_cmd_data, *cmd_len); 635 #endif 636 } 637 // 22000100 638 else if (p_cmd_data[0] == 0x22 && p_cmd_data[1] == 0x00 && 639 p_cmd_data[2] == 0x01 && p_cmd_data[3] == 0x00) { 640 // ee_disc_done = 0x01;//Reader Over SWP event getting 641 *rsp_len = 0x05; 642 p_rsp_data[0] = 0x42; 643 p_rsp_data[1] = 0x00; 644 p_rsp_data[2] = 0x02; 645 p_rsp_data[3] = 0x00; 646 p_rsp_data[4] = 0x00; 647 phNxpNciHal_print_packet("RECV", p_rsp_data, 5); 648 status = NFCSTATUS_FAILED; 649 } 650 // 2002 0904 3000 3100 3200 5000 651 else if ((p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) && 652 ((p_cmd_data[2] == 0x09 && p_cmd_data[3] == 0x04) /*|| 653 (p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04)*/ 654 )) { 655 *cmd_len += 0x01; 656 p_cmd_data[2] += 0x01; 657 p_cmd_data[9] = 0x01; 658 p_cmd_data[10] = 0x40; 659 p_cmd_data[11] = 0x50; 660 p_cmd_data[12] = 0x00; 661 662 NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config "); 663 // phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len); 664 NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config - End "); 665 } 666 // 20020703300031003200 667 // 2002 0301 3200 668 else if ((p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) && 669 ((p_cmd_data[2] == 0x07 && p_cmd_data[3] == 0x03) || 670 (p_cmd_data[2] == 0x03 && p_cmd_data[3] == 0x01 && 671 p_cmd_data[4] == 0x32))) { 672 NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config "); 673 phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len); 674 *rsp_len = 5; 675 p_rsp_data[0] = 0x40; 676 p_rsp_data[1] = 0x02; 677 p_rsp_data[2] = 0x02; 678 p_rsp_data[3] = 0x00; 679 p_rsp_data[4] = 0x00; 680 681 phNxpNciHal_print_packet("RECV", p_rsp_data, 5); 682 status = NFCSTATUS_FAILED; 683 NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config - End "); 684 } 685 686 // 2002 0D04 300104 310100 320100 500100 687 // 2002 0401 320100 688 else if ((p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) && 689 ( 690 /*(p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04)*/ 691 (p_cmd_data[2] == 0x04 && p_cmd_data[3] == 0x01 && 692 p_cmd_data[4] == 0x32 && p_cmd_data[5] == 0x00))) { 693 // p_cmd_data[12] = 0x40; 694 695 NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config "); 696 phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len); 697 p_cmd_data[6] = 0x60; 698 699 phNxpNciHal_print_packet("RECV", p_rsp_data, 5); 700 // status = NFCSTATUS_FAILED; 701 NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config - End "); 702 } else if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x00) { 703 NXPLOG_NCIHAL_D( 704 "> Going through workaround - Add Mifare Classic in Discovery Map"); 705 p_cmd_data[*cmd_len] = 0x80; 706 p_cmd_data[*cmd_len + 1] = 0x01; 707 p_cmd_data[*cmd_len + 2] = 0x80; 708 p_cmd_data[5] = 0x01; 709 p_cmd_data[6] = 0x01; 710 p_cmd_data[2] += 3; 711 p_cmd_data[3] += 1; 712 *cmd_len += 3; 713 } else if (*cmd_len == 3 && p_cmd_data[0] == 0x00 && p_cmd_data[1] == 0x00 && 714 p_cmd_data[2] == 0x00) { 715 NXPLOG_NCIHAL_D("> Going through workaround - ISO-DEP Presence Check "); 716 p_cmd_data[0] = 0x2F; 717 p_cmd_data[1] = 0x11; 718 p_cmd_data[2] = 0x00; 719 status = NFCSTATUS_SUCCESS; 720 NXPLOG_NCIHAL_D( 721 "> Going through workaround - ISO-DEP Presence Check - End"); 722 } 723 #if 0 724 else if ( (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 ) && 725 ((p_cmd_data[2] == 0x09 && p_cmd_data[3] == 0x04) || 726 (p_cmd_data[2] == 0x0B && p_cmd_data[3] == 0x05) || 727 (p_cmd_data[2] == 0x07 && p_cmd_data[3] == 0x02) || 728 (p_cmd_data[2] == 0x0A && p_cmd_data[3] == 0x03) || 729 (p_cmd_data[2] == 0x0A && p_cmd_data[3] == 0x04) || 730 (p_cmd_data[2] == 0x05 && p_cmd_data[3] == 0x02)) 731 ) 732 { 733 NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config "); 734 phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len); 735 *rsp_len = 5; 736 p_rsp_data[0] = 0x40; 737 p_rsp_data[1] = 0x02; 738 p_rsp_data[2] = 0x02; 739 p_rsp_data[3] = 0x00; 740 p_rsp_data[4] = 0x00; 741 742 phNxpNciHal_print_packet("RECV", p_rsp_data, 5); 743 status = NFCSTATUS_FAILED; 744 NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config - End "); 745 } 746 747 else if((p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) && 748 ((p_cmd_data[3] == 0x00) || 749 ((*cmd_len >= 0x06) && (p_cmd_data[5] == 0x00)))) /*If the length of the first param id is zero don't allow*/ 750 { 751 NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config "); 752 phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len); 753 *rsp_len = 5; 754 p_rsp_data[0] = 0x40; 755 p_rsp_data[1] = 0x02; 756 p_rsp_data[2] = 0x02; 757 p_rsp_data[3] = 0x00; 758 p_rsp_data[4] = 0x00; 759 760 phNxpNciHal_print_packet("RECV", p_rsp_data, 5); 761 status = NFCSTATUS_FAILED; 762 NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config - End "); 763 } 764 #endif 765 else if ((wFwVerRsp & 0x0000FFFF) == wFwVer) { 766 /* skip CORE_RESET and CORE_INIT from Brcm */ 767 if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x00 && 768 p_cmd_data[2] == 0x01 && p_cmd_data[3] == 0x01) { 769 // *rsp_len = 6; 770 // 771 // NXPLOG_NCIHAL_D("> Going - core reset optimization"); 772 // 773 // p_rsp_data[0] = 0x40; 774 // p_rsp_data[1] = 0x00; 775 // p_rsp_data[2] = 0x03; 776 // p_rsp_data[3] = 0x00; 777 // p_rsp_data[4] = 0x10; 778 // p_rsp_data[5] = 0x01; 779 // 780 // status = NFCSTATUS_FAILED; 781 // NXPLOG_NCIHAL_D("> Going - core reset optimization - END"); 782 } 783 /* CORE_INIT */ 784 else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x01 && 785 p_cmd_data[2] == 0x00) { 786 // NXPLOG_NCIHAL_D("> Going - core init optimization"); 787 // *rsp_len = iCoreInitRspLen; 788 // memcpy(p_rsp_data, bCoreInitRsp, iCoreInitRspLen); 789 // status = NFCSTATUS_FAILED; 790 // NXPLOG_NCIHAL_D("> Going - core init optimization - END"); 791 } 792 } 793 794 #if (NFC_NXP_CHIP_TYPE == PN548C2) 795 if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) { 796 uint8_t temp; 797 uint8_t* p = p_cmd_data + 4; 798 uint8_t* end = p_cmd_data + *cmd_len; 799 while (p < end) { 800 if (*p == 0x53) // LF_T3T_FLAGS 801 { 802 NXPLOG_NCIHAL_D("> Going through workaround - LF_T3T_FLAGS swap"); 803 temp = *(p + 3); 804 *(p + 3) = *(p + 2); 805 *(p + 2) = temp; 806 NXPLOG_NCIHAL_D("> Going through workaround - LF_T3T_FLAGS - End"); 807 status = NFCSTATUS_SUCCESS; 808 break; 809 } 810 if (*p == 0xA0) { 811 p += *(p + 2) + 3; 812 } else { 813 p += *(p + 1) + 2; 814 } 815 } 816 } 817 #endif 818 819 return status; 820 } 821 822 /****************************************************************************** 823 * Function phNxpNciHal_send_ext_cmd 824 * 825 * Description This function send the extension command to NFCC. No 826 * response is checked by this function but it waits for 827 * the response to come. 828 * 829 * Returns Returns NFCSTATUS_SUCCESS if sending cmd is successful and 830 * response is received. 831 * 832 ******************************************************************************/ 833 NFCSTATUS phNxpNciHal_send_ext_cmd(uint16_t cmd_len, uint8_t* p_cmd) { 834 NFCSTATUS status = NFCSTATUS_FAILED; 835 836 HAL_ENABLE_EXT(); 837 nxpncihal_ctrl.cmd_len = cmd_len; 838 memcpy(nxpncihal_ctrl.p_cmd_data, p_cmd, cmd_len); 839 status = phNxpNciHal_process_ext_cmd_rsp(nxpncihal_ctrl.cmd_len, 840 nxpncihal_ctrl.p_cmd_data); 841 HAL_DISABLE_EXT(); 842 843 return status; 844 } 845 846 /****************************************************************************** 847 * Function hal_extns_write_rsp_timeout_cb 848 * 849 * Description Timer call back function 850 * 851 * Returns None 852 * 853 ******************************************************************************/ 854 static void hal_extns_write_rsp_timeout_cb(uint32_t timerId, void* pContext) { 855 UNUSED(timerId); 856 UNUSED(pContext); 857 NXPLOG_NCIHAL_E("hal_extns_write_rsp_timeout_cb - write timeout!!!"); 858 nxpncihal_ctrl.ext_cb_data.status = NFCSTATUS_FAILED; 859 usleep(1); 860 SEM_POST(&(nxpncihal_ctrl.ext_cb_data)); 861 862 return; 863 } 864