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_MULTIPLE_BLKS_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 MULTIPLE BLOCKS COMMAND */
355 command_type = ISO15693_RD_MULTIPLE_BLKS_CMD;
356 e_format_seq = ISO15693_RD_MULTIPLE_BLKS_CHECK;
357
358 /* Prepare data for the command,
359 First add the current block */
360 *a_send_byte = (uint8_t)ps_iso15693_info->current_block;
361 send_index = (uint8_t)(send_index + 1);
362
363 /* Second, add number of blocks to read, here 2 blocks means
364 8 bytes. 1 is decremented because to read multiple block.
365 the first block is read by default, apart from the first block,
366 next block shall be read, that means remaining block to read is 1
367 So, if for eg: 2 blocks needs to be read from block number 0, then 1
368 is number of blocks to read. This will read both block 0 and 1
369 */
370 *(a_send_byte + send_index) = (uint8_t)
371 (ISO15693_RD_2_BLOCKS - 1);
372 send_index = (uint8_t)(send_index + 1);
373
374 send_length = send_index;
375 }
376 else
377 {
378 result = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT,
379 NFCSTATUS_INVALID_RECEIVE_LENGTH);
380 }
381 break;
382 }
383
384 case ISO15693_RD_MULTIPLE_BLKS_CHECK:
385 {
386 /* RESPONSE received for READ MULTIPLE BLOCKS
387 received, 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)
398 ISO15693_CC_VER_RW;
399 send_index = (uint8_t)(send_index + 1);
400
401 /* CC MAX data size, calculated during GET system information */
402 *(a_send_byte + send_index) = (uint8_t)
403 (ps_iso15693_info->max_data_size /
404 ISO15693_CC_MULTIPLE_FACTOR);
405 send_index = (uint8_t)(send_index + 1);
406
407 switch (ps_iso15693_info->max_data_size)
408 {
409 case ISO15693_SLI_X_MAX_SIZE:
410 {
411 /* For SLI tags : Inventory Page read not supported */
412 *(a_send_byte + send_index) = (uint8_t)
413 ISO15693_RDMULBLKS_CMD_MASK;
414 break;
415 }
416
417 case ISO15693_SLI_X_S_MAX_SIZE:
418 {
419 /* For SLI - S tags : Read multiple blocks not supported */
420 *(a_send_byte + send_index) = (uint8_t)
421 ISO15693_INVENTORY_CMD_MASK;
422 break;
423 }
424
425 case ISO15693_SLI_X_L_MAX_SIZE:
426 {
427 /* For SLI - L tags : Read multiple blocks not supported */
428 *(a_send_byte + send_index) = (uint8_t)
429 ISO15693_INVENTORY_CMD_MASK;
430 break;
431 }
432
433 default:
434 {
435 result = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT,
436 NFCSTATUS_INVALID_DEVICE_REQUEST);
437 break;
438 }
439 }
440
441 send_index = (uint8_t)(send_index + 1);
442
443 send_length = sizeof (a_send_byte);
444
445 break;
446 }
447
448 case ISO15693_WRITE_CC_FMT:
449 {
450 /* CC byte write succcessful.
451 Prepare data for NDEF TLV writing */
452 command_type = ISO15693_WR_SINGLE_BLK_CMD;
453 e_format_seq = ISO15693_WRITE_NDEF_TLV;
454
455 ps_iso15693_info->current_block = (uint16_t)
456 (ps_iso15693_info->current_block + 1);
457
458 /* NDEF TLV - Type byte updated to 0x03 */
459 *a_send_byte = (uint8_t)ISO15693_NDEF_TLV_TYPE_ID;
460 send_index = (uint8_t)(send_index + 1);
461
462 /* NDEF TLV - Length byte updated to 0 */
463 *(a_send_byte + send_index) = 0;
464 send_index = (uint8_t)(send_index + 1);
465
466 /* Terminator TLV - value updated to 0xFEU */
467 *(a_send_byte + send_index) = (uint8_t)
468 ISO15693_TERMINATOR_TLV_ID;
469 send_index = (uint8_t)(send_index + 1);
470
471 send_length = sizeof (a_send_byte);
472 break;
473 }
474
475 case ISO15693_WRITE_NDEF_TLV:
476 {
477 /* SUCCESSFUL formatting complete */
478 format_complete = TRUE;
479 break;
480 }
481
482 default:
483 {
484 result = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT,
485 NFCSTATUS_INVALID_DEVICE_REQUEST);
486 break;
487 }
488 }
489
490 if ((!format_complete) && (!result))
491 {
492 result = phFriNfc_ISO15693_H_FmtReadWrite (psNdefSmtCrdFmt,
493 command_type, a_send_byte, send_length);
494 }
495
496 ps_iso15693_info->format_seq = (uint8_t)e_format_seq;
497 return result;
498 }
499
500 /*********************** Static function definitions end ***********************/
501
502 /*********************** External function definitions start ***********************/
503 void
phFriNfc_ISO15693_FmtReset(phFriNfc_sNdefSmtCrdFmt_t * psNdefSmtCrdFmt)504 phFriNfc_ISO15693_FmtReset (
505 phFriNfc_sNdefSmtCrdFmt_t *psNdefSmtCrdFmt)
506 {
507 /* reset to ISO15693 data structure */
508 (void)memset((void *)&(psNdefSmtCrdFmt->AddInfo.s_iso15693_info),
509 0x00, sizeof (phFriNfc_ISO15693_AddInfo_t));
510 psNdefSmtCrdFmt->FmtProcStatus = 0;
511 }
512
513 NFCSTATUS
phFriNfc_ISO15693_Format(phFriNfc_sNdefSmtCrdFmt_t * psNdefSmtCrdFmt)514 phFriNfc_ISO15693_Format (
515 phFriNfc_sNdefSmtCrdFmt_t *psNdefSmtCrdFmt)
516 {
517 NFCSTATUS result = NFCSTATUS_SUCCESS;
518 phHal_sIso15693Info_t *ps_rem_iso_15693_info =
519 &(psNdefSmtCrdFmt->psRemoteDevInfo->RemoteDevInfo.Iso15693_Info);
520
521
522 if ((ISO15693_7TH_BYTE_UID_VALUE ==
523 ps_rem_iso_15693_info->Uid[ISO15693_BYTE_7_INDEX])
524 && (ISO15693_6TH_BYTE_UID_VALUE ==
525 ps_rem_iso_15693_info->Uid[ISO15693_BYTE_6_INDEX]))
526 {
527 /* Check if the card is manufactured by NXP (6th byte
528 index of UID value = 0x04 and the
529 last byte of UID is 0xE0, only then the card detected
530 is NDEF compliant */
531 psNdefSmtCrdFmt->State = ISO15693_FORMAT;
532
533 /* GET system information command to get the card size */
534 result = phFriNfc_ISO15693_H_FmtReadWrite (psNdefSmtCrdFmt,
535 ISO15693_GET_SYSTEM_INFO_CMD, NULL, 0);
536 }
537 else
538 {
539 result = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT,
540 NFCSTATUS_INVALID_DEVICE_REQUEST);
541 }
542
543 return result;
544 }
545
546 void
phFriNfc_ISO15693_FmtProcess(void * pContext,NFCSTATUS Status)547 phFriNfc_ISO15693_FmtProcess (
548 void *pContext,
549 NFCSTATUS Status)
550 {
551 phFriNfc_sNdefSmtCrdFmt_t *psNdefSmtCrdFmt =
552 (phFriNfc_sNdefSmtCrdFmt_t *)pContext;
553 phFriNfc_ISO15693_AddInfo_t *ps_iso15693_info =
554 &(psNdefSmtCrdFmt->AddInfo.s_iso15693_info);
555
556 if((NFCSTATUS_SUCCESS & PHNFCSTBLOWER) == (Status & PHNFCSTBLOWER))
557 {
558 if (ISO15693_FORMAT == psNdefSmtCrdFmt->State)
559 {
560 /* Check for further formatting */
561 Status = phFriNfc_ISO15693_H_ProFormat (psNdefSmtCrdFmt);
562 }
563 else
564 {
565 Status = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT,
566 NFCSTATUS_INVALID_DEVICE_REQUEST);
567 }
568 }
569 else
570 {
571 if (ISO15693_RD_MULTIPLE_BLKS_CHECK ==
572 (phFriNfc_ISO15693_FormatSeq_t)ps_iso15693_info->format_seq)
573 {
574 /* If READ MULTIPLE BLOCKS is not working then
575 do further formatting, disable the READ MULTIPLE BLOCK
576 flag in the CC 4th byte, this says that COMMAND is not
577 supported and dont use this command
578 */
579 Status = phFriNfc_ISO15693_H_ProFormat (psNdefSmtCrdFmt);
580 }
581 }
582
583 /* Handle the all the error cases */
584 if ((NFCSTATUS_PENDING & PHNFCSTBLOWER) != (Status & PHNFCSTBLOWER))
585 {
586 /* call respective CR */
587 phFriNfc_SmtCrdFmt_HCrHandler (psNdefSmtCrdFmt, Status);
588 }
589 }
590 /*********************** External function definitions end ***********************/
591
592
593 #endif /* #ifndef PH_FRINFC_FMT_ISO15693_DISABLED */
594
595