1 /* 2 * 3 * Copyright (C) 2010 NXP Semiconductors 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 /*! 19 * \file phFriNfc_ISO15693Format.c 20 * \brief This component encapsulates different format functinalities , 21 * for the ISO-15693 card. 22 * 23 * Project: NFC-FRI 24 * 25 * $Date: $ 26 * $Author: ing02260 $ 27 * $Revision: 1.0 $ 28 * $Aliases: $ 29 * 30 */ 31 32 #ifndef PH_FRINFC_FMT_ISO15693_DISABLED 33 34 #include <phNfcTypes.h> 35 #include <phFriNfc_OvrHal.h> 36 #include <phFriNfc_SmtCrdFmt.h> 37 #include <phFriNfc_ISO15693Format.h> 38 39 40 /****************************** Macro definitions start ********************************/ 41 /* State for the format */ 42 #define ISO15693_FORMAT 0x01U 43 44 /* Bytes per block in the ISO-15693 */ 45 #define ISO15693_BYTES_PER_BLOCK 0x04U 46 47 /* ISO-15693 Commands 48 GET SYSTEM INFORMATION COMMAND 49 */ 50 #define ISO15693_GET_SYSTEM_INFO_CMD 0x2BU 51 /* READ SINGLE BLOCK COMMAND */ 52 #define ISO15693_RD_SINGLE_BLK_CMD 0x20U 53 /* WRITE SINGLE BLOCK COMMAND */ 54 #define ISO15693_WR_SINGLE_BLK_CMD 0x21U 55 /* READ MULTIPLE BLOCK COMMAND */ 56 #define ISO15693_RD_MULTIPLE_BLKS_CMD 0x23U 57 58 /* CC bytes 59 CC BYTE 0 - Magic Number - 0xE1 60 */ 61 #define ISO15693_CC_MAGIC_NUM 0xE1U 62 /* CC BYTE 1 - Mapping version and READ WRITE settings 0x40 63 */ 64 #define ISO15693_CC_VER_RW 0x40U 65 /* CC BYTE 2 - max size is calaculated using the byte 3 multiplied by 8 */ 66 #define ISO15693_CC_MULTIPLE_FACTOR 0x08U 67 68 /* Inventory command support mask for the CC byte 4 */ 69 #define ISO15693_INVENTORY_CMD_MASK 0x02U 70 /* Read MULTIPLE blocks support mask for CC byte 4 */ 71 #define ISO15693_RDMULBLKS_CMD_MASK 0x01U 72 /* Flags for the command */ 73 #define ISO15693_FMT_FLAGS 0x20U 74 75 /* Read two blocks */ 76 #define ISO15693_RD_2_BLOCKS 0x02U 77 78 /* TYPE identifier of the NDEF TLV */ 79 #define ISO15693_NDEF_TLV_TYPE_ID 0x03U 80 /* Terminator TLV identifier */ 81 #define ISO15693_TERMINATOR_TLV_ID 0xFEU 82 83 /* UID 7th byte value shall be 0xE0 */ 84 #define ISO15693_7TH_BYTE_UID_VALUE 0xE0U 85 #define ISO15693_BYTE_7_INDEX 0x07U 86 87 /* UID 6th byte value shall be 0x04 - NXP manufacturer */ 88 #define ISO15693_6TH_BYTE_UID_VALUE 0x04U 89 #define ISO15693_BYTE_6_INDEX 0x06U 90 91 #define ISO15693_EXTRA_RESPONSE_FLAG 0x01U 92 93 #define ISO15693_GET_SYS_INFO_RESP_LEN 0x0EU 94 #define ISO15693_DSFID_MASK 0x01U 95 #define ISO15693_AFI_MASK 0x02U 96 #define ISO15693_MAX_SIZE_MASK 0x04U 97 #define ISO15693_ICREF_MASK 0x08U 98 #define ISO15693_SKIP_DFSID 0x01U 99 #define ISO15693_SKIP_AFI 0x01U 100 #define ISO15693_BLOCK_SIZE_IN_BYTES_MASK 0x1FU 101 102 103 /* MAXimum size of ICODE SLI/X */ 104 #define ISO15693_SLI_X_MAX_SIZE 112U 105 /* MAXimum size of ICODE SLI/X - S */ 106 #define ISO15693_SLI_X_S_MAX_SIZE 160U 107 /* MAXimum size of ICODE SLI/X - L */ 108 #define ISO15693_SLI_X_L_MAX_SIZE 32U 109 /****************************** Macro definitions end ********************************/ 110 111 /****************************** Data structures start ********************************/ 112 typedef enum phFriNfc_ISO15693_FormatSeq 113 { 114 ISO15693_GET_SYS_INFO, 115 ISO15693_RD_SINGLE_BLK_CHECK, 116 ISO15693_WRITE_CC_FMT, 117 ISO15693_WRITE_NDEF_TLV 118 }phFriNfc_ISO15693_FormatSeq_t; 119 /****************************** Data structures end ********************************/ 120 121 /*********************** Static function declarations start ***********************/ 122 static 123 NFCSTATUS 124 phFriNfc_ISO15693_H_ProFormat ( 125 phFriNfc_sNdefSmtCrdFmt_t *psNdefSmtCrdFmt); 126 127 static 128 NFCSTATUS 129 phFriNfc_ISO15693_H_GetMaxDataSize ( 130 phFriNfc_sNdefSmtCrdFmt_t *psNdefSmtCrdFmt, 131 uint8_t *p_recv_buf, 132 uint8_t recv_length); 133 134 static 135 NFCSTATUS 136 phFriNfc_ISO15693_H_FmtReadWrite ( 137 phFriNfc_sNdefSmtCrdFmt_t *psNdefSmtCrdFmt, 138 uint8_t command, 139 uint8_t *p_data, 140 uint8_t data_length); 141 /*********************** Static function declarations end ***********************/ 142 143 /*********************** Static function definitions start ***********************/ 144 145 static 146 NFCSTATUS 147 phFriNfc_ISO15693_H_FmtReadWrite ( 148 phFriNfc_sNdefSmtCrdFmt_t *psNdefSmtCrdFmt, 149 uint8_t command, 150 uint8_t *p_data, 151 uint8_t data_length) 152 { 153 NFCSTATUS result = NFCSTATUS_SUCCESS; 154 uint8_t send_index = 0; 155 156 /* set the data for additional data exchange*/ 157 psNdefSmtCrdFmt->psDepAdditionalInfo.DepFlags.MetaChaining = 0; 158 psNdefSmtCrdFmt->psDepAdditionalInfo.DepFlags.NADPresent = 0; 159 psNdefSmtCrdFmt->psDepAdditionalInfo.NAD = 0; 160 161 psNdefSmtCrdFmt->SmtCrdFmtCompletionInfo.CompletionRoutine = 162 phFriNfc_ISO15693_FmtProcess; 163 psNdefSmtCrdFmt->SmtCrdFmtCompletionInfo.Context = psNdefSmtCrdFmt; 164 165 *psNdefSmtCrdFmt->SendRecvLength = PH_FRINFC_SMTCRDFMT_MAX_SEND_RECV_BUF_SIZE; 166 167 psNdefSmtCrdFmt->Cmd.Iso15693Cmd = phHal_eIso15693_Cmd; 168 169 *(psNdefSmtCrdFmt->SendRecvBuf + send_index) = (uint8_t)ISO15693_FMT_FLAGS; 170 send_index = (uint8_t)(send_index + 1); 171 172 *(psNdefSmtCrdFmt->SendRecvBuf + send_index) = (uint8_t)command; 173 send_index = (uint8_t)(send_index + 1); 174 175 (void)memcpy ((void *)(psNdefSmtCrdFmt->SendRecvBuf + send_index), 176 (void *)psNdefSmtCrdFmt->psRemoteDevInfo->RemoteDevInfo.Iso15693_Info.Uid, 177 psNdefSmtCrdFmt->psRemoteDevInfo->RemoteDevInfo.Iso15693_Info.UidLength); 178 send_index = (uint8_t)(send_index + 179 psNdefSmtCrdFmt->psRemoteDevInfo->RemoteDevInfo.Iso15693_Info.UidLength); 180 181 switch (command) 182 { 183 case ISO15693_WR_SINGLE_BLK_CMD: 184 case ISO15693_RD_MULTIPLE_BLKS_CMD: 185 { 186 *(psNdefSmtCrdFmt->SendRecvBuf + send_index) = (uint8_t) 187 psNdefSmtCrdFmt->AddInfo.s_iso15693_info.current_block; 188 send_index = (uint8_t)(send_index + 1); 189 190 if (data_length) 191 { 192 (void)memcpy ((void *)(psNdefSmtCrdFmt->SendRecvBuf + send_index), 193 (void *)p_data, data_length); 194 send_index = (uint8_t)(send_index + data_length); 195 } 196 else 197 { 198 result = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT, 199 NFCSTATUS_INVALID_DEVICE_REQUEST); 200 } 201 break; 202 } 203 204 case ISO15693_RD_SINGLE_BLK_CMD: 205 { 206 *(psNdefSmtCrdFmt->SendRecvBuf + send_index) = (uint8_t) 207 psNdefSmtCrdFmt->AddInfo.s_iso15693_info.current_block; 208 send_index = (uint8_t)(send_index + 1); 209 break; 210 } 211 212 case ISO15693_GET_SYSTEM_INFO_CMD: 213 { 214 /* Dont do anything */ 215 break; 216 } 217 218 default: 219 { 220 result = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT, 221 NFCSTATUS_INVALID_DEVICE_REQUEST); 222 break; 223 } 224 } 225 226 psNdefSmtCrdFmt->SendLength = send_index; 227 228 if (!result) 229 { 230 result = phFriNfc_OvrHal_Transceive(psNdefSmtCrdFmt->LowerDevice, 231 &psNdefSmtCrdFmt->SmtCrdFmtCompletionInfo, 232 psNdefSmtCrdFmt->psRemoteDevInfo, 233 psNdefSmtCrdFmt->Cmd, 234 &psNdefSmtCrdFmt->psDepAdditionalInfo, 235 psNdefSmtCrdFmt->SendRecvBuf, 236 psNdefSmtCrdFmt->SendLength, 237 psNdefSmtCrdFmt->SendRecvBuf, 238 psNdefSmtCrdFmt->SendRecvLength); 239 } 240 241 return result; 242 } 243 244 static 245 NFCSTATUS 246 phFriNfc_ISO15693_H_GetMaxDataSize ( 247 phFriNfc_sNdefSmtCrdFmt_t *psNdefSmtCrdFmt, 248 uint8_t *p_recv_buf, 249 uint8_t recv_length) 250 { 251 NFCSTATUS result = NFCSTATUS_SUCCESS; 252 phFriNfc_ISO15693_AddInfo_t *ps_iso15693_info = 253 &(psNdefSmtCrdFmt->AddInfo.s_iso15693_info); 254 phHal_sIso15693Info_t *ps_rem_iso_15693_info = 255 &(psNdefSmtCrdFmt->psRemoteDevInfo->RemoteDevInfo.Iso15693_Info); 256 uint8_t recv_index = 0; 257 258 if ((ISO15693_GET_SYS_INFO_RESP_LEN == recv_length) 259 && (ISO15693_MAX_SIZE_MASK == (*p_recv_buf & ISO15693_MAX_SIZE_MASK))) 260 { 261 uint8_t information_flag = *p_recv_buf; 262 /* MAX size is present in the system information and 263 also response length is correct */ 264 recv_index = (uint8_t)(recv_index + 1); 265 266 if (!phOsalNfc_MemCompare ((void *)ps_rem_iso_15693_info->Uid, 267 (void *)(p_recv_buf + recv_index), 268 ps_rem_iso_15693_info->UidLength)) 269 { 270 /* UID comaparision successful */ 271 uint8_t no_of_blocks = 0; 272 uint8_t blk_size_in_bytes = 0; 273 uint8_t ic_reference = 0; 274 275 /* So skip the UID size compared in the received buffer */ 276 recv_index = (uint8_t)(recv_index + 277 ps_rem_iso_15693_info->UidLength); 278 279 if (information_flag & ISO15693_DSFID_MASK) { 280 /* Skip DFSID */ 281 recv_index = (uint8_t)(recv_index + ISO15693_SKIP_DFSID); 282 } 283 if (information_flag & ISO15693_AFI_MASK) { 284 /* Skip AFI */ 285 recv_index = (uint8_t)(recv_index + ISO15693_SKIP_AFI); 286 } 287 288 /* To get the number of blocks in the card */ 289 no_of_blocks = (uint8_t)(*(p_recv_buf + recv_index) + 1); 290 recv_index = (uint8_t)(recv_index + 1); 291 292 /* To get the each block size in bytes */ 293 blk_size_in_bytes = (uint8_t)((*(p_recv_buf + recv_index) 294 & ISO15693_BLOCK_SIZE_IN_BYTES_MASK) + 1); 295 recv_index = (uint8_t)(recv_index + 1); 296 297 if (information_flag & ISO15693_ICREF_MASK) { 298 /* Get the IC reference */ 299 ic_reference = (uint8_t)(*(p_recv_buf + recv_index)); 300 if (ic_reference == 0x03) { 301 no_of_blocks = 8; 302 } 303 } 304 305 /* calculate maximum data size in the card */ 306 ps_iso15693_info->max_data_size = (uint16_t) 307 (no_of_blocks * blk_size_in_bytes); 308 309 } 310 else 311 { 312 result = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT, 313 NFCSTATUS_INVALID_DEVICE_REQUEST); 314 } 315 } 316 else 317 { 318 result = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT, 319 NFCSTATUS_INVALID_DEVICE_REQUEST); 320 } 321 322 323 return result; 324 } 325 326 static 327 NFCSTATUS 328 phFriNfc_ISO15693_H_ProFormat ( 329 phFriNfc_sNdefSmtCrdFmt_t *psNdefSmtCrdFmt) 330 { 331 NFCSTATUS result = NFCSTATUS_SUCCESS; 332 phFriNfc_ISO15693_AddInfo_t *ps_iso15693_info = 333 &(psNdefSmtCrdFmt->AddInfo.s_iso15693_info); 334 phFriNfc_ISO15693_FormatSeq_t e_format_seq = 335 (phFriNfc_ISO15693_FormatSeq_t) 336 ps_iso15693_info->format_seq; 337 uint8_t command_type = 0; 338 uint8_t a_send_byte[ISO15693_BYTES_PER_BLOCK] = {0}; 339 uint8_t send_length = 0; 340 uint8_t send_index = 0; 341 uint8_t format_complete = FALSE; 342 343 switch (e_format_seq) 344 { 345 case ISO15693_GET_SYS_INFO: 346 { 347 /* RESPONSE received for GET SYSTEM INFO */ 348 349 if (!phFriNfc_ISO15693_H_GetMaxDataSize (psNdefSmtCrdFmt, 350 (psNdefSmtCrdFmt->SendRecvBuf + ISO15693_EXTRA_RESPONSE_FLAG), 351 (uint8_t)(*psNdefSmtCrdFmt->SendRecvLength - 352 ISO15693_EXTRA_RESPONSE_FLAG))) 353 { 354 /* Send the READ SINGLE BLOCK COMMAND */ 355 command_type = ISO15693_RD_SINGLE_BLK_CMD; 356 e_format_seq = ISO15693_RD_SINGLE_BLK_CHECK; 357 358 /* Block number 0 to read */ 359 psNdefSmtCrdFmt->AddInfo.s_iso15693_info.current_block = 0x00; 360 } 361 else 362 { 363 result = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT, 364 NFCSTATUS_INVALID_RECEIVE_LENGTH); 365 } 366 break; 367 } 368 369 case ISO15693_RD_SINGLE_BLK_CHECK: 370 { 371 /* RESPONSE received for READ SINGLE BLOCK 372 received*/ 373 374 /* Check if Card is really fresh 375 First 4 bytes must be 0 for fresh card */ 376 377 if ((psNdefSmtCrdFmt->AddInfo.s_iso15693_info.current_block == 0x00) && 378 (psNdefSmtCrdFmt->SendRecvBuf[1] != 0x00 || 379 psNdefSmtCrdFmt->SendRecvBuf[2] != 0x00 || 380 psNdefSmtCrdFmt->SendRecvBuf[3] != 0x00 || 381 psNdefSmtCrdFmt->SendRecvBuf[4] != 0x00)) 382 { 383 result = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT, NFCSTATUS_INVALID_FORMAT); 384 } 385 else 386 { 387 /* prepare data for writing CC bytes */ 388 389 command_type = ISO15693_WR_SINGLE_BLK_CMD; 390 e_format_seq = ISO15693_WRITE_CC_FMT; 391 392 /* CC magic number */ 393 *a_send_byte = (uint8_t)ISO15693_CC_MAGIC_NUM; 394 send_index = (uint8_t)(send_index + 1); 395 396 /* CC Version and read/write access */ 397 *(a_send_byte + send_index) = (uint8_t) ISO15693_CC_VER_RW; 398 send_index = (uint8_t)(send_index + 1); 399 400 /* CC MAX data size, calculated during GET system information */ 401 *(a_send_byte + send_index) = (uint8_t) (ps_iso15693_info->max_data_size / ISO15693_CC_MULTIPLE_FACTOR); 402 send_index = (uint8_t)(send_index + 1); 403 404 switch (ps_iso15693_info->max_data_size) 405 { 406 case ISO15693_SLI_X_MAX_SIZE: 407 { 408 /* For SLI tags : Inventory Page read not supported */ 409 *(a_send_byte + send_index) = (uint8_t) ISO15693_RDMULBLKS_CMD_MASK; 410 break; 411 } 412 413 case ISO15693_SLI_X_S_MAX_SIZE: 414 { 415 /* For SLI - S tags : Read multiple blocks not supported */ 416 *(a_send_byte + send_index) = (uint8_t) ISO15693_INVENTORY_CMD_MASK; 417 break; 418 } 419 420 case ISO15693_SLI_X_L_MAX_SIZE: 421 { 422 /* For SLI - L tags : Read multiple blocks not supported */ 423 *(a_send_byte + send_index) = (uint8_t) ISO15693_INVENTORY_CMD_MASK; 424 break; 425 } 426 427 default: 428 { 429 result = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT, NFCSTATUS_INVALID_DEVICE_REQUEST); 430 break; 431 } 432 } 433 434 send_index = (uint8_t)(send_index + 1); 435 436 send_length = sizeof (a_send_byte); 437 } 438 439 break; 440 } 441 442 case ISO15693_WRITE_CC_FMT: 443 { 444 /* CC byte write succcessful. 445 Prepare data for NDEF TLV writing */ 446 command_type = ISO15693_WR_SINGLE_BLK_CMD; 447 e_format_seq = ISO15693_WRITE_NDEF_TLV; 448 449 ps_iso15693_info->current_block = (uint16_t) 450 (ps_iso15693_info->current_block + 1); 451 452 /* NDEF TLV - Type byte updated to 0x03 */ 453 *a_send_byte = (uint8_t)ISO15693_NDEF_TLV_TYPE_ID; 454 send_index = (uint8_t)(send_index + 1); 455 456 /* NDEF TLV - Length byte updated to 0 */ 457 *(a_send_byte + send_index) = 0; 458 send_index = (uint8_t)(send_index + 1); 459 460 /* Terminator TLV - value updated to 0xFEU */ 461 *(a_send_byte + send_index) = (uint8_t) 462 ISO15693_TERMINATOR_TLV_ID; 463 send_index = (uint8_t)(send_index + 1); 464 465 send_length = sizeof (a_send_byte); 466 break; 467 } 468 469 case ISO15693_WRITE_NDEF_TLV: 470 { 471 /* SUCCESSFUL formatting complete */ 472 format_complete = TRUE; 473 break; 474 } 475 476 default: 477 { 478 result = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT, 479 NFCSTATUS_INVALID_DEVICE_REQUEST); 480 break; 481 } 482 } 483 484 if ((!format_complete) && (!result)) 485 { 486 result = phFriNfc_ISO15693_H_FmtReadWrite (psNdefSmtCrdFmt, 487 command_type, a_send_byte, send_length); 488 } 489 490 ps_iso15693_info->format_seq = (uint8_t)e_format_seq; 491 return result; 492 } 493 494 /*********************** Static function definitions end ***********************/ 495 496 /*********************** External function definitions start ***********************/ 497 void 498 phFriNfc_ISO15693_FmtReset ( 499 phFriNfc_sNdefSmtCrdFmt_t *psNdefSmtCrdFmt) 500 { 501 /* reset to ISO15693 data structure */ 502 (void)memset((void *)&(psNdefSmtCrdFmt->AddInfo.s_iso15693_info), 503 0x00, sizeof (phFriNfc_ISO15693_AddInfo_t)); 504 psNdefSmtCrdFmt->FmtProcStatus = 0; 505 } 506 507 NFCSTATUS 508 phFriNfc_ISO15693_Format ( 509 phFriNfc_sNdefSmtCrdFmt_t *psNdefSmtCrdFmt) 510 { 511 NFCSTATUS result = NFCSTATUS_SUCCESS; 512 phHal_sIso15693Info_t *ps_rem_iso_15693_info = 513 &(psNdefSmtCrdFmt->psRemoteDevInfo->RemoteDevInfo.Iso15693_Info); 514 515 516 if ((ISO15693_7TH_BYTE_UID_VALUE == 517 ps_rem_iso_15693_info->Uid[ISO15693_BYTE_7_INDEX]) 518 && (ISO15693_6TH_BYTE_UID_VALUE == 519 ps_rem_iso_15693_info->Uid[ISO15693_BYTE_6_INDEX])) 520 { 521 /* Check if the card is manufactured by NXP (6th byte 522 index of UID value = 0x04 and the 523 last byte of UID is 0xE0, only then the card detected 524 is NDEF compliant */ 525 psNdefSmtCrdFmt->State = ISO15693_FORMAT; 526 527 /* GET system information command to get the card size */ 528 result = phFriNfc_ISO15693_H_FmtReadWrite (psNdefSmtCrdFmt, 529 ISO15693_GET_SYSTEM_INFO_CMD, NULL, 0); 530 } 531 else 532 { 533 result = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT, 534 NFCSTATUS_INVALID_DEVICE_REQUEST); 535 } 536 537 return result; 538 } 539 540 void 541 phFriNfc_ISO15693_FmtProcess ( 542 void *pContext, 543 NFCSTATUS Status) 544 { 545 phFriNfc_sNdefSmtCrdFmt_t *psNdefSmtCrdFmt = 546 (phFriNfc_sNdefSmtCrdFmt_t *)pContext; 547 phFriNfc_ISO15693_AddInfo_t *ps_iso15693_info = 548 &(psNdefSmtCrdFmt->AddInfo.s_iso15693_info); 549 550 if((NFCSTATUS_SUCCESS & PHNFCSTBLOWER) == (Status & PHNFCSTBLOWER)) 551 { 552 if (ISO15693_FORMAT == psNdefSmtCrdFmt->State) 553 { 554 /* Check for further formatting */ 555 Status = phFriNfc_ISO15693_H_ProFormat (psNdefSmtCrdFmt); 556 } 557 else 558 { 559 Status = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT, 560 NFCSTATUS_INVALID_DEVICE_REQUEST); 561 } 562 } 563 else 564 { 565 Status = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT, 566 NFCSTATUS_FORMAT_ERROR); 567 } 568 569 /* Handle the all the error cases */ 570 if ((NFCSTATUS_PENDING & PHNFCSTBLOWER) != (Status & PHNFCSTBLOWER)) 571 { 572 /* call respective CR */ 573 phFriNfc_SmtCrdFmt_HCrHandler (psNdefSmtCrdFmt, Status); 574 } 575 } 576 /*********************** External function definitions end ***********************/ 577 578 579 #endif /* #ifndef PH_FRINFC_FMT_ISO15693_DISABLED */ 580 581