• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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