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
phFriNfc_ISO15693_H_FmtReadWrite(phFriNfc_sNdefSmtCrdFmt_t * psNdefSmtCrdFmt,uint8_t command,uint8_t * p_data,uint8_t data_length)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
phFriNfc_ISO15693_H_GetMaxDataSize(phFriNfc_sNdefSmtCrdFmt_t * psNdefSmtCrdFmt,uint8_t * p_recv_buf,uint8_t recv_length)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
phFriNfc_ISO15693_H_ProFormat(phFriNfc_sNdefSmtCrdFmt_t * psNdefSmtCrdFmt)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
phFriNfc_ISO15693_FmtReset(phFriNfc_sNdefSmtCrdFmt_t * psNdefSmtCrdFmt)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
phFriNfc_ISO15693_Format(phFriNfc_sNdefSmtCrdFmt_t * psNdefSmtCrdFmt)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
phFriNfc_ISO15693_FmtProcess(void * pContext,NFCSTATUS Status)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