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