Initialize Tizen 2.3
[adaptation/devices/nfc-plugin-nxp.git] / src / phFriNfc_MifareStdMap.c
1 /*
2  * Copyright (C) 2010 NXP Semiconductors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /*!
18  * \file  phFriNfc_MifareStdMap.c
19  * \brief NFC Ndef Mapping For Remote Devices.
20  *
21  * Project: NFC-FRI
22  *
23  * $Date: Thu May  6 10:01:55 2010 $
24  * $Author: ing02260 $
25  * $Revision: 1.22 $
26  * $Aliases: NFC_FRI1.1_WK1017_R34_4,NFC_FRI1.1_WK1023_R35_1 $
27  *
28  */
29
30 #ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED
31
32 #include <phFriNfc_MifareStdMap.h>
33 #include <phFriNfc_OvrHal.h>
34
35 #ifndef PH_HAL4_ENABLE
36 #include <phFriNfc_OvrHalCmd.h>
37 #endif
38
39 #include <phFriNfc_MapTools.h>
40
41 /*! \ingroup grp_file_attributes
42  *  \name NDEF Mapping
43  *
44  * File: \ref phFriNfcNdefMap.c
45  *
46  */
47 /*@{*/
48 #define PHFRINFCMIFARESTDMAP_FILEREVISION "$Revision: 1.22 $"
49 #define PHFRINFCMIFARESTDMAP_FILEALIASES  "$Aliases: NFC_FRI1.1_WK1017_R34_4,NFC_FRI1.1_WK1023_R35_1 $"
50 /*@}*/
51 /*@}*/
52
53 /*!
54  * \name Mifare Standard Mapping - Helper Functions
55  *
56  */
57 /*@{*/
58
59 /*!
60  * \brief \copydoc page_ovr Helper function for Mifare Std. This function Reads  
61  *  a block from the card.
62  */
63 static NFCSTATUS phFriNfc_MifStd_H_RdABlock(phFriNfc_NdefMap_t *NdefMap);
64
65 /*!
66  * \brief \copydoc page_ovr Helper function for Mifare Std. This function writes  
67  *  into a block of the card.
68  */
69 static NFCSTATUS phFriNfc_MifStd_H_WrABlock(phFriNfc_NdefMap_t *NdefMap);
70
71 /*!
72  * \brief \copydoc page_ovr Helper function for Mifare Std. This function authenticates  
73  *  one sector at a time.
74  */
75 static NFCSTATUS phFriNfc_MifStd_H_AuthSector(phFriNfc_NdefMap_t *NdefMap);
76
77 /*!
78  * \brief \copydoc page_ovr Helper function for Mifare 4k Check Ndef to 
79  *  get the next AID blocks
80  */
81 static NFCSTATUS phFriNfc_MifStd4k_H_CheckNdef(phFriNfc_NdefMap_t *NdefMap);
82
83 /*!
84  * \brief \copydoc page_ovr Helper function for Check Ndef to store the AIDs
85  */
86 static void phFriNfc_MifStd_H_fillAIDarray(phFriNfc_NdefMap_t *NdefMap);
87
88 /*!
89  * \brief \copydoc page_ovr Helper function to get the Sector from the current block
90  */
91 static uint8_t phFriNfc_MifStd_H_GetSect(uint8_t  BlockNumber);
92
93 /*!
94  * \brief \copydoc page_ovr Helper function to check the Ndef compliance of the  
95  *  current block, if the block is not Ndef Compliant, increment the block till 
96  *  the next Ndef compliant block using the Get Sector Helper function
97  */
98 static NFCSTATUS phFriNfc_MifStd_H_BlkChk(phFriNfc_NdefMap_t *NdefMap);
99
100 /*!
101  * \brief \copydoc page_ovr Helper function to read the access bits of each sector
102  */
103 static NFCSTATUS phFriNfc_MifStd_H_RdAcsBit(phFriNfc_NdefMap_t *NdefMap);
104
105 /*!
106  * \brief \copydoc page_ovr Helper function to check the access bits of each sector
107  */
108 static NFCSTATUS phFriNfc_MifStd_H_ChkAcsBit(phFriNfc_NdefMap_t *NdefMap);
109
110 /*!
111  * \brief \copydoc page_ovr Helper function for read access bits, depending 
112  * on the read/write/check ndef function called
113  */
114 static NFCSTATUS phFriNfc_MifStd_H_ChkRdWr(phFriNfc_NdefMap_t *NdefMap);
115
116 /*!
117  * \brief \copydoc page_ovr Helper function for check ndef to check the 
118  * ndef compliant sectors
119  */
120 static void phFriNfc_MifStd_H_ChkNdefCmpltSects(phFriNfc_NdefMap_t *NdefMap);
121
122 #if 0
123 /*!
124  * \brief \copydoc page_ovr Helper function for read ndef to check the 
125  * the length L of the ndef TLV
126  */
127 static uint8_t phFriNfc_MifStd_H_ChkNdefLen(phFriNfc_NdefMap_t *NdefMap,
128                                         uint8_t             NDEFlength,
129                                         uint8_t             *CRFlag);
130
131 /*!
132  * \brief \copydoc page_ovr Helper function for read ndef to copy the 
133  * card data to the user buffer
134  */
135 static NFCSTATUS phFriNfc_MifStd_H_RdNdefTLV(phFriNfc_NdefMap_t *NdefMap,
136                                          uint8_t            *Temp16Bytes);
137
138 #endif
139
140 /*!
141  * \brief \copydoc page_ovr Helper function for read ndef to process the  
142  * remaining bytes of length (L) in the TLV
143  */
144 static NFCSTATUS phFriNfc_MifStd_H_RemainTLV(phFriNfc_NdefMap_t *NdefMap,
145                                          uint8_t            *Flag,
146                                          uint8_t            *Temp16Bytes);
147
148 /*!
149  * \brief \copydoc page_ovr Helper function for read ndef to process the  
150  * internal bytes
151  */
152 static NFCSTATUS phFriNfc_MifStd_H_ChkIntLen(phFriNfc_NdefMap_t *NdefMap);
153
154 /*!
155  * \brief \copydoc page_ovr Helper function for read ndef to check the  
156  * internal bytes without ndef tlv flag 
157  */
158 static NFCSTATUS phFriNfc_MifStd_H_IntLenWioutNdef(phFriNfc_NdefMap_t  *NdefMap,
159                                             uint8_t             *Flag,
160                                             uint8_t             *TempintBytes);
161 #if 0
162 /*!
163  * \brief \copydoc page_ovr Helper function for read ndef to check the  
164  * internal bytes without ndef tlv flag 
165  */
166 static NFCSTATUS phFriNfc_MifStd_H_IntLenWithNdef(phFriNfc_NdefMap_t *NdefMap,
167                                             uint8_t             *TempintBytes);
168 #endif
169 /*!
170  * \brief \copydoc page_ovr Helper function for write ndef to add the TLV  
171  * structure 
172  */
173 static uint8_t phFriNfc_MifStd_H_UpdateTLV(phFriNfc_NdefMap_t *NdefMap);
174
175 /*!
176  * \brief \copydoc page_ovr Helper function for write ndef to write the Length TLV 
177  *
178  */
179 static NFCSTATUS phFriNfc_MifStd_H_WriteNdefLen(phFriNfc_NdefMap_t *NdefMap);
180 #if 0
181 /*!
182  * \brief \copydoc page_ovr Helper function for check ndef to check the ndef 
183  * compliant blocks is 0
184  */
185 static NFCSTATUS phFriNfc_MifStd_H_ChkNdefCmpltBlocks(phFriNfc_NdefMap_t   *NdefMap);
186 #endif
187 /*!
188  * \brief \copydoc page_ovr Helper function to set the authentication flag 
189  * for the ndef TLV block
190  */
191 static void phFriNfc_MifStd_H_SetNdefBlkAuth(phFriNfc_NdefMap_t   *NdefMap);
192
193 /*!
194  * \brief \copydoc page_ovr Helper function to reset ndef TLV values. This is
195  * used when the offset is BEGIN
196  */
197 static void phFriNfc_MifStd_H_RdWrReset(phFriNfc_NdefMap_t   *NdefMap);
198
199 /*!
200  * \brief \copydoc page_ovr Helper function to read the first ndef compliant block to 
201  * change the length
202  */
203 static NFCSTATUS phFriNfc_MifStd_H_RdtoWrNdefLen(phFriNfc_NdefMap_t *NdefMap);
204
205 /*!
206  * \brief \copydoc page_ovr Helper function to get the actual length of card
207  *
208  */
209 static NFCSTATUS phFriNfc_MifStd_H_GetActCardLen(phFriNfc_NdefMap_t *NdefMap);
210
211 /*!
212  * \brief \copydoc page_ovr Helper function to check all the TLVs 
213  *
214  */
215 static NFCSTATUS phFriNfc_MifStd_H_ChkTLVs(phFriNfc_NdefMap_t *NdefMap,
216                                            uint8_t            *CRFlag);
217
218 /*!
219  * \brief \copydoc page_ovr Helper function to get the next TLV
220  *
221  */
222 static NFCSTATUS phFriNfc_MifStd_H_GetNxtTLV(phFriNfc_NdefMap_t *NdefMap,
223                                        uint16_t             *TempLength,
224                                        uint8_t              *TL4bytesFlag);
225
226 /*!
227  * \brief \copydoc page_ovr Helper function to know whether the read 
228  *  16 bytes are parsed completely
229  */
230 static NFCSTATUS phFriNfc_MifStd_H_Chk16Bytes(phFriNfc_NdefMap_t   *NdefMap,
231                                        uint16_t             TempLength);
232
233 /*!
234  * \brief \copydoc page_ovr Helper function to know whether the read 
235  *  16 bytes are parsed completely
236  */
237 static NFCSTATUS phFriNfc_MifStd_H_ChkRemainTLVs(phFriNfc_NdefMap_t *NdefMap, 
238                                           uint8_t            *CRFlag,
239                                           uint8_t            *NDEFFlag);
240
241 /*!
242  * \brief \copydoc page_ovr Helper function to call the Completion Routine
243  *
244  */
245 static void phFriNfc_MifStd_H_Complete(phFriNfc_NdefMap_t  *NdefMap,
246                                  NFCSTATUS            Result);
247
248 /*!
249  * \brief \copydoc page_ovr Helper function to get the Mifare 1k Sector Trailer
250  *
251  */
252 static void phFriNfc_MifStd_H_Get1kStTrail(phFriNfc_NdefMap_t  *NdefMap);
253
254 /*!
255  * \brief \copydoc page_ovr Helper function to get the Mifare 4k Sector Trailer
256  *
257  */
258 static void phFriNfc_MifStd_H_Get4kStTrail(phFriNfc_NdefMap_t  *NdefMap);
259
260 /*!
261  * \brief \copydoc page_ovr Helper function to process the check ndef call
262  *
263  */
264 static NFCSTATUS phFriNfc_MifStd_H_ProChkNdef(phFriNfc_NdefMap_t        *NdefMap);
265
266 /*!
267  * \brief \copydoc page_ovr Helper function to process the authentication of a sector
268  *
269  */
270 static NFCSTATUS phFriNfc_MifStd_H_ProAuth(phFriNfc_NdefMap_t       *NdefMap);
271
272 /*!
273  * \brief \copydoc page_ovr Helper function to read 16 bytes from a specifed block no.
274  *
275  */
276 static NFCSTATUS phFriNfc_MifStd_H_Rd16Bytes(phFriNfc_NdefMap_t     *NdefMap,
277                                               uint8_t               BlockNo);
278
279 /*!
280  * \brief \copydoc page_ovr Helper function to process access bits of the 
281  * sector trailer
282  */
283 static NFCSTATUS phFriNfc_MifStd_H_ProAcsBits(phFriNfc_NdefMap_t    *NdefMap);
284
285 /*!
286  * \brief \copydoc page_ovr Helper function to check the GPB bytes
287  */
288 static NFCSTATUS phFriNfc_MifStd_H_GPBChk(phFriNfc_NdefMap_t        *NdefMap);
289
290 /*!
291  * \brief \copydoc page_ovr Helper function to check for the different 
292  * status value in the process because of proprietary forum sector
293  */
294 static NFCSTATUS phFriNfc_MifStd_H_ProStatNotValid(phFriNfc_NdefMap_t    *NdefMap,
295                                                    NFCSTATUS             status);
296
297 /*!
298  * \brief \copydoc page_ovr Helper function to read the NDEF TLV block
299  */
300 static NFCSTATUS phFriNfc_MifStd_H_RdBeforeWr(phFriNfc_NdefMap_t        *NdefMap);
301
302 /*!
303  * \brief \copydoc page_ovr Helper function to process the NDEF TLV block 
304  *  read bytes to start write from the NDEF TLV
305  */
306 static NFCSTATUS phFriNfc_MifStd_H_ProBytesToWr(phFriNfc_NdefMap_t        *NdefMap);
307
308 /*!
309  * \brief \copydoc page_ovr Helper function to fill the send buffer to write
310  */
311 static NFCSTATUS phFriNfc_MifStd_H_fillSendBuf(phFriNfc_NdefMap_t        *NdefMap,
312                                                uint8_t                   Length);
313
314 /*!
315  * \brief \copydoc page_ovr Helper function to write 16 bytes in a block
316  */
317 static NFCSTATUS phFriNfc_MifStd_H_WrTLV(phFriNfc_NdefMap_t        *NdefMap);
318
319 /*!
320  * \brief \copydoc page_ovr Helper function to process the write TLV bytes in a block
321  */
322 static NFCSTATUS phFriNfc_MifStd_H_ProWrTLV(phFriNfc_NdefMap_t        *NdefMap);
323
324 /*!
325  * \brief \copydoc page_ovr Helper function to update the remaining TLV
326  */
327 static uint8_t phFriNfc_MifStd_H_UpdRemTLV(phFriNfc_NdefMap_t        *NdefMap);
328
329 /*!
330  * \brief \copydoc page_ovr Helper function to update the length field if more than one
331  * NULL TLVs exists before of the NDEF TLV
332  */
333 static void phFriNfc_MifStd_H_fillTLV1(phFriNfc_NdefMap_t        *NdefMap);
334
335 /*!
336  * \brief \copydoc page_ovr Helper function to update the length field if more than one 
337  * NULL TLVs does not exists before the TLV
338  */
339 static void phFriNfc_MifStd_H_fillTLV2(phFriNfc_NdefMap_t        *NdefMap);
340
341 /*!
342  * \brief \copydoc page_ovr Helper function to increment/decrement the ndef tlv block    
343  * and read the block
344  */
345 static NFCSTATUS phFriNfc_MifStd_H_CallWrNdefLen(phFriNfc_NdefMap_t        *NdefMap);
346
347 /*!
348  * \brief \copydoc page_ovr Helper function to check the current block is valid or not 
349  * if not valid decrement the current block till the valid block
350  */
351 static NFCSTATUS phFriNfc_MifStd_H_BlkChk_1(phFriNfc_NdefMap_t        *NdefMap);
352
353 /*!
354  * \brief \copydoc page_ovr Helper function update the length of the TLV if NULL TLVs
355  * greater than or equal to 2
356  */
357 static void phFriNfc_MifStd_H_fillTLV1_1(phFriNfc_NdefMap_t        *NdefMap);
358
359 /*!
360  * \brief \copydoc page_ovr Helper function update the length of the TLV if NULL TLVs
361  * less than 2
362  */
363 static void phFriNfc_MifStd_H_fillTLV2_1(phFriNfc_NdefMap_t        *NdefMap);
364
365 /*!
366  * \brief \copydoc page_ovr Helper function to read the TLV block
367  */
368 static NFCSTATUS phFriNfc_MifStd_H_RdTLV(phFriNfc_NdefMap_t        *NdefMap);
369
370 /*!
371  * \brief \copydoc page_ovr Helper function to process the read TLV block
372  */
373 static NFCSTATUS phFriNfc_MifStd_H_ProRdTLV(phFriNfc_NdefMap_t        *NdefMap);
374
375 /*!
376  * \brief \copydoc page_ovr Helper function to write the terminator TLV
377  */
378 static NFCSTATUS phFriNfc_MifStd_H_WrTermTLV(phFriNfc_NdefMap_t   *NdefMap);
379
380 /*!
381  * \brief \copydoc page_ovr Helper function to process the write a block function
382  */
383 static NFCSTATUS phFriNfc_MifStd_H_ProWrABlock(phFriNfc_NdefMap_t   *NdefMap);
384
385 #ifndef PH_HAL4_ENABLE
386 /*!
387  * \brief \copydoc page_ovr Helper function to call poll function after the 
388  * authentication has failed
389  */
390 static NFCSTATUS phFriNfc_MifStd_H_CallPoll(phFriNfc_NdefMap_t   *NdefMap);
391 #endif
392
393 /*!
394  * \brief \copydoc page_ovr Helper function to call connect function after the 
395  * authentication has failed
396  */
397 static NFCSTATUS phFriNfc_MifStd_H_CallConnect(phFriNfc_NdefMap_t   *NdefMap);
398
399 /*!
400  * \brief \copydoc page_ovr Helper function to call disconnect function after the 
401  * authentication has failed
402  */
403 static NFCSTATUS phFriNfc_MifStd_H_CallDisCon(phFriNfc_NdefMap_t   *NdefMap);
404
405 /*!
406  * \brief \copydoc page_ovr Helper function to call know the ndef compliant block using 
407  */
408 static void phFriNfc_MifStd1k_H_BlkChk(phFriNfc_NdefMap_t   *NdefMap,
409                                     uint8_t              SectorID,
410                                     uint8_t              *callbreak);
411
412 /*@}*/
413 /**
414  * \name Mifare Standard Mapping - Constants.        
415  *
416  */
417 /*@{*/
418 /* As per the spec, the value of this macro 
419    PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT1 shall be 0xA0 */
420 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT1        0xA0 /**< \internal Authenticate Command for MAD Sector */
421
422 /* As per the spec, the value of this macro 
423    PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT2 shall be 0xA1 */
424 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT2        0xA1 /**< \internal Authenticate Command for MAD Sector */
425
426 /* As per the spec, the value of this macro 
427    PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT3 shall be 0xA2 */
428 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT3        0xA2 /**< \internal Authenticate Command for MAD Sector */
429
430 /* As per the spec, the value of this macro 
431    PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT4 shall be 0xA3 */
432 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT4        0xA3 /**< \internal Authenticate Command for MAD Sector */
433
434 /* As per the spec, the value of this macro 
435    PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT5 shall be 0xA4 */
436 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT5        0xA4 /**< \internal Authenticate Command for MAD Sector */
437
438 /* As per the spec, the value of this macro 
439    PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT6 shall be 0xA5 */
440 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT6        0xA5 /**< \internal Authenticate Command for MAD Sector */
441
442 /* As per the spec, the value of this macro 
443    PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1 shall be 0xD3 */
444 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1       0xD3 /**< \internal Authenticate Command for NDEF Sectors 1 */
445
446 /* As per the spec, the value of this macro 
447    PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2 shall be 0xF7 */
448 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2       0xF7 /**< \internal Authenticate Command for NDEF Sectors 2 */
449 #define PH_FRINFC_NDEFMAP_MIFARESTD_NDEF_COMPVAL2         0x03 /**< \internal Ndef Compliant command 1 */
450 #define PH_FRINFC_NDEFMAP_MIFARESTD_NDEF_COMPVAL1         0xE1 /**< \internal Ndef Compliant command 2 */
451
452 /* Enable access bits check for the MAD sector 
453 #define ENABLE_ACS_BIT_CHK_FOR_MAD */
454 /*@}*/
455
456 NFCSTATUS phFriNfc_MifareStdMap_H_Reset(phFriNfc_NdefMap_t        *NdefMap)
457 {
458     NFCSTATUS   status = NFCSTATUS_SUCCESS;
459     uint8_t     index = PH_FRINFC_MIFARESTD_VAL0;
460     if ( NdefMap == NULL)
461     {
462         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
463     }
464     else
465     {   
466         /* Current Block stores the present block accessed in the card */
467         NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_VAL0;
468
469         for(index = PH_FRINFC_MIFARESTD_VAL0; index < 
470             PH_FRINFC_NDEFMAP_MIFARESTD_ST15_BYTES; index++)
471         {
472             /* internal buffer to store the odd bytes of length < 15 */
473             NdefMap->StdMifareContainer.internalBuf[index] = PH_FRINFC_MIFARESTD_VAL0;
474         }
475         /* odd bytes length stored in the internal buffer */
476         NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
477
478         NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INITIALIZED;
479
480         /* Flag to get that last few bytes are taken from the user buffer */
481         NdefMap->StdMifareContainer.RemainingBufFlag = PH_FRINFC_MIFARESTD_FLAG0;
482
483         /* Flag to find that the read/write operation has reached the end of the card. 
484             Further reading/writing is not possible */
485         NdefMap->StdMifareContainer.ReadWriteCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
486
487         /* Flag to get that last few bytes are taken from the internal buffer */
488         NdefMap->StdMifareContainer.internalBufFlag = PH_FRINFC_MIFARESTD_FLAG0;
489
490         /* Authentication Flag for every sector */
491         NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
492
493         /* Used in Check Ndef for storing the sector ID */
494         NdefMap->StdMifareContainer.SectorIndex = PH_FRINFC_MIFARESTD_VAL0;
495
496         NdefMap->StdMifareContainer.NdefBlocks = PH_FRINFC_MIFARESTD_VAL0;
497
498         NdefMap->StdMifareContainer.NoOfNdefCompBlocks = PH_FRINFC_MIFARESTD_VAL0;
499
500         NdefMap->StdMifareContainer.ReadAcsBitFlag = PH_FRINFC_MIFARESTD_FLAG0;
501
502         NdefMap->StdMifareContainer.remSizeUpdFlag = PH_FRINFC_MIFARESTD_FLAG0;
503
504         NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_MIFARESTD_VAL0;
505
506         NdefMap->TLVStruct.prevLenByteValue = PH_FRINFC_MIFARESTD_VAL0;
507
508         NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
509
510         NdefMap->TLVStruct.NdefTLVBlock = PH_FRINFC_MIFARESTD_VAL0;
511
512         NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL0;
513
514         NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
515
516         NdefMap->StdMifareContainer.remainingSize = PH_FRINFC_MIFARESTD_VAL0;
517         
518         NdefMap->StdMifareContainer.ReadNdefFlag = PH_FRINFC_MIFARESTD_FLAG0;
519
520         NdefMap->StdMifareContainer.WrNdefFlag = PH_FRINFC_MIFARESTD_FLAG0;
521
522         NdefMap->StdMifareContainer.ChkNdefFlag = PH_FRINFC_MIFARESTD_FLAG0;
523
524         NdefMap->StdMifareContainer.aidCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
525
526         NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
527
528         NdefMap->StdMifareContainer.ProprforumSectFlag = PH_FRINFC_MIFARESTD_PROP_1ST_CONFIG;
529
530         NdefMap->StdMifareContainer.ReadCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
531
532         NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG0;
533
534         NdefMap->StdMifareContainer.WrLength = PH_FRINFC_MIFARESTD_VAL1;
535
536         NdefMap->StdMifareContainer.ChkNdefCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
537     }
538
539     return status;
540 }
541
542 /*!
543  * \brief Check whether a particular Remote Device is NDEF compliant.
544  *
545  * The function checks whether the peer device is NDEF compliant.
546  *
547  * \param[in] NdefMap Pointer to a valid instance of the \ref phFriNfc_NdefMap_t 
548  *                    structure describing the component context.
549  *
550  * \retval  NFCSTATUS_PENDING   The action has been successfully triggered.
551  * \retval  Others              An error has occurred.
552  *
553  */
554
555 NFCSTATUS phFriNfc_MifareStdMap_ChkNdef( phFriNfc_NdefMap_t     *NdefMap)
556 {
557     NFCSTATUS                   status =    NFCSTATUS_PENDING;
558     uint8_t                     atq,
559                                 sak;
560                                     
561     if ( NdefMap == NULL)
562     {
563         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
564     }
565     else
566     {
567         /* set the data for additional data exchange*/
568         NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
569         NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
570         NdefMap->psDepAdditionalInfo.NAD = 0;
571         NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_CHECK_OPE;
572         NdefMap->StdMifareContainer.CRIndex = PH_FRINFC_NDEFMAP_CR_CHK_NDEF;
573
574         /* Get the Select Response and Sense Response to get 
575             the exact Card Type either Mifare 1k or 4k */
576 #ifndef PH_HAL4_ENABLE
577         sak = NdefMap->psRemoteDevInfo->RemoteDevInfo.CardInfo106.
578                         Startup106.SelRes;
579         atq = NdefMap->psRemoteDevInfo->RemoteDevInfo.CardInfo106.
580                         Startup106.SensRes[0];        
581 #else
582         sak = NdefMap->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.Sak;
583         atq = NdefMap->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.AtqA[0];
584         PHNFC_UNUSED_VARIABLE(atq);
585 #endif      
586
587         if (0x08 == (sak & 0x18))
588         {
589             /* Total Number of Blocks in Mifare 1k Card */
590             NdefMap->StdMifareContainer.NoOfNdefCompBlocks = 
591                                         PH_FRINFC_NDEFMAP_MIFARESTD_1KNDEF_COMPBLOCK;
592             NdefMap->StdMifareContainer.remainingSize = 
593                                                 ((NdefMap->CardType == PH_FRINFC_MIFARESTD_VAL0)?
594                                                 (PH_FRINFC_NDEFMAP_MIFARESTD_1KNDEF_COMPBLOCK * 
595                                                 PH_FRINFC_MIFARESTD_BLOCK_BYTES):
596                                                 NdefMap->StdMifareContainer.remainingSize);
597             NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD;
598         }
599         else
600         {
601              /* Total Number of Blocks in Mifare 4k Card */
602             NdefMap->StdMifareContainer.NoOfNdefCompBlocks = 
603                                         PH_FRINFC_NDEFMAP_MIFARESTD_4KNDEF_COMPBLOCK;
604             NdefMap->StdMifareContainer.remainingSize = 
605                                             ((NdefMap->CardType == PH_FRINFC_MIFARESTD_VAL0)?
606                                             (PH_FRINFC_NDEFMAP_MIFARESTD_4KNDEF_COMPBLOCK * 
607                                             PH_FRINFC_MIFARESTD_BLOCK_BYTES): 
608                                             NdefMap->StdMifareContainer.remainingSize);
609             NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD;           
610         }
611
612
613         /*  phFriNfc_MifareStdMap_ChkNdef should be called only
614             when currentBlock is 0 OR 64,65 and 66 (for Mifare 4k).
615             Otherwise return error */
616         /* and also Check the Authentication Flag */
617         if((NdefMap->StdMifareContainer.currentBlock != 0) && 
618             (NdefMap->StdMifareContainer.currentBlock != 1) &&
619             (NdefMap->StdMifareContainer.currentBlock != 2) &&
620             (NdefMap->StdMifareContainer.currentBlock != 64) && 
621             (NdefMap->StdMifareContainer.currentBlock != 65) && 
622             (NdefMap->StdMifareContainer.currentBlock != 66) )
623         {
624             status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
625         }
626         else if( NdefMap->StdMifareContainer.AuthDone == 0)
627         {
628             /*  Block 0 contains Manufacturer information and 
629                 also other informaton. So go for block 1 which
630                 contains AIDs. Authenticating any of the block 
631                 in a sector, Authenticates the whole sector */
632             if(NdefMap->StdMifareContainer.currentBlock == 0)
633             {
634                 NdefMap->StdMifareContainer.currentBlock = 1;
635             }
636             
637             status = phFriNfc_MifStd_H_AuthSector(NdefMap);
638         }
639         else
640         {            
641             /*  Mifare 1k, sak = 0x08 atq = 0x04
642                 Mifare 4k, sak = 0x38 atq = 0x02 */
643             if ((NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD) ||
644                 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD))
645             {                           
646                 /* Change the state to Check Ndef Compliant */
647                 NdefMap->State = PH_FRINFC_NDEFMAP_STATE_CHK_NDEF_COMP;
648                 NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_CHECK_OPE;
649                 NdefMap->StdMifareContainer.ChkNdefFlag = PH_FRINFC_MIFARESTD_FLAG1;
650
651                 NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
652                 NdefMap->MapCompletionInfo.Context = NdefMap;    
653
654 #ifndef PH_HAL4_ENABLE
655                 NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareRead;
656 #else
657                 NdefMap->Cmd.MfCmd = phHal_eMifareRead;
658 #endif
659                 *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
660                 NdefMap->SendRecvBuf[0] = NdefMap->StdMifareContainer.currentBlock;
661                 NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_READ;    
662             
663                 /* Call the Overlapped HAL Transceive function */ 
664                 status = phFriNfc_OvrHal_Transceive(    NdefMap->LowerDevice,
665                                                         &NdefMap->MapCompletionInfo,
666                                                         NdefMap->psRemoteDevInfo,
667                                                         NdefMap->Cmd,
668                                                         &NdefMap->psDepAdditionalInfo,
669                                                         NdefMap->SendRecvBuf,
670                                                         NdefMap->SendLength,
671                                                         NdefMap->SendRecvBuf,
672                                                         NdefMap->SendRecvLength);    
673             }
674             else
675             {
676                 /* Since we have decided temporarily not to go
677                     for any new error codes we are using 
678                     NFCSTATUS_INVALID_PARAMETER even though it is not 
679                     the relevant error code here TBD */
680                 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
681             }
682         }
683     }
684     return status;    
685 }
686
687
688 /*!
689  * \brief Initiates Reading of NDEF information from the Remote Device.
690  *
691  * The function initiates the reading of NDEF information from a Remote Device.
692  * It performs a reset of the state and starts the action (state machine).
693  * A periodic call of the \ref phFriNfcNdefMap_Process has to be done once the action
694  * has been triggered.
695  */
696 NFCSTATUS phFriNfc_MifareStdMap_RdNdef( phFriNfc_NdefMap_t                  *NdefMap,
697                                         uint8_t                             *PacketData,
698                                         uint32_t                            *PacketDataLength,
699                                         uint8_t                             Offset)
700 {
701     NFCSTATUS               status =    NFCSTATUS_PENDING;
702
703     NdefMap->ApduBufferSize = *PacketDataLength;
704     NdefMap->NumOfBytesRead = PacketDataLength;
705     *NdefMap->NumOfBytesRead = 0;
706     NdefMap->ApduBuffIndex = 0;
707     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE;
708     NdefMap->StdMifareContainer.CRIndex = PH_FRINFC_NDEFMAP_CR_RD_NDEF;
709             
710     if((NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID) 
711         || (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INITIALIZED))
712     {
713         /* Card state  is not correct */
714         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
715                             NFCSTATUS_INVALID_PARAMETER); 
716     }
717     else
718     {
719         if( (Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN) || ( NdefMap->PrevOperation == 
720             PH_FRINFC_NDEFMAP_WRITE_OPE))
721         {
722             phFriNfc_MifStd_H_RdWrReset(NdefMap);
723             NdefMap->StdMifareContainer.ReadNdefFlag = PH_FRINFC_MIFARESTD_FLAG1;
724             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
725         }
726         /* Offset = Current, but the read has reached the End of Card */
727         if( (Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) &&
728             (NdefMap->StdMifareContainer.ReadWriteCompleteFlag == 
729             PH_FRINFC_MIFARESTD_FLAG1))
730         {
731             status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_EOF_NDEF_CONTAINER_REACHED); 
732         }
733         else
734         {
735             NdefMap->Offset = (((Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN) && 
736                                 ( NdefMap->PrevOperation == 
737                                 PH_FRINFC_NDEFMAP_WRITE_OPE))?
738                                 PH_FRINFC_NDEFMAP_SEEK_BEGIN:
739                                 Offset);
740             status = phFriNfc_MifStd_H_BlkChk(NdefMap);
741             if(status == NFCSTATUS_SUCCESS)
742             {
743                 NdefMap->ApduBuffer = PacketData;
744                 
745                 /* Read Operation in Progress */
746                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
747                 
748                 /* Check Authentication Flag */
749                 status = 
750                 ((NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)?
751                     phFriNfc_MifStd_H_RdABlock(NdefMap):
752                     phFriNfc_MifStd_H_AuthSector(NdefMap));
753             }
754         }
755     }
756     return status;
757 }
758
759 /*!
760  * \brief Initiates Writing of NDEF information to the Remote Device.
761  *
762  * The function initiates the writing of NDEF information to a Remote Device.
763  * It performs a reset of the state and starts the action (state machine).
764  * A periodic call of the \ref phFriNfcNdefMap_Process has to be done once the action
765  * has been triggered.
766  */
767 NFCSTATUS phFriNfc_MifareStdMap_WrNdef( phFriNfc_NdefMap_t     *NdefMap,
768                                         uint8_t                 *PacketData,
769                                         uint32_t                *PacketDataLength,
770                                         uint8_t                 Offset)
771 {
772     NFCSTATUS                   status =    NFCSTATUS_PENDING;
773
774     NdefMap->ApduBuffer = PacketData;
775     NdefMap->ApduBufferSize = *PacketDataLength;
776     NdefMap->ApduBuffIndex = PH_FRINFC_MIFARESTD_VAL0;
777     NdefMap->WrNdefPacketLength = PacketDataLength;
778     *NdefMap->WrNdefPacketLength = PH_FRINFC_MIFARESTD_VAL0;
779     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
780     NdefMap->StdMifareContainer.CRIndex = PH_FRINFC_NDEFMAP_CR_WR_NDEF;
781     
782     if((NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID) 
783         || (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY))
784     {
785         /* Card state  is not correct */
786         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
787                             NFCSTATUS_INVALID_PARAMETER); 
788     }
789     else
790     {
791         if( (Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN) || 
792         (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_READ_OPE))
793         {
794             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
795             NdefMap->StdMifareContainer.RdBeforeWrFlag = PH_FRINFC_MIFARESTD_FLAG1;
796             NdefMap->StdMifareContainer.WrNdefFlag = PH_FRINFC_MIFARESTD_FLAG1;
797             NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
798             NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
799             NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
800             NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
801             NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL0;
802             NdefMap->TLVStruct.NdefTLVAuthFlag = PH_FRINFC_MIFARESTD_FLAG0;
803             NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG0;
804             NdefMap->StdMifareContainer.remainingSize = 
805                         (NdefMap->StdMifareContainer.NoOfNdefCompBlocks * 
806                         PH_FRINFC_MIFARESTD_BLOCK_BYTES);
807             NdefMap->StdMifareContainer.currentBlock = 
808                                             PH_FRINFC_MIFARESTD_BLK4;
809             NdefMap->StdMifareContainer.NdefBlocks = PH_FRINFC_MIFARESTD_VAL1;
810             NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
811             /* This macro is added, to be compliant with the previous HAL 2.0 
812                 For HAL 2.0, polling is done before writing data to the mifare 
813                 std (if the offset is BEGIN), because if an error is reported 
814                 during read or write and again write is called, the PN531 state is 
815                 unchanged (so write will fail), to bring the PN531 to the correct 
816                 state, polling is done.  
817                 Changed on 13th Jan 2009
818             */
819 #ifdef PH_HAL4_ENABLE
820             NdefMap->StdMifareContainer.PollFlag = PH_FRINFC_MIFARESTD_FLAG0;
821 #else
822             NdefMap->StdMifareContainer.PollFlag = PH_FRINFC_MIFARESTD_FLAG1;
823 #endif /* #ifdef PH_HAL4_ENABLE */
824             NdefMap->StdMifareContainer.WrLength = PH_FRINFC_MIFARESTD_VAL0;
825             NdefMap->StdMifareContainer.FirstWriteFlag = PH_FRINFC_MIFARESTD_FLAG1;
826         }
827
828         if(((Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) &&
829             (NdefMap->StdMifareContainer.ReadWriteCompleteFlag == 
830             PH_FRINFC_MIFARESTD_FLAG1)) || ((NdefMap->StdMifareContainer.PollFlag == 
831             PH_FRINFC_MIFARESTD_FLAG1) && (Offset == PH_FRINFC_NDEFMAP_SEEK_CUR)))
832         {
833             /* Offset = Current, but the read has reached the End of Card */
834             status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
835                                 NFCSTATUS_EOF_NDEF_CONTAINER_REACHED); 
836         }
837         else
838         {
839             NdefMap->Offset = (((Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN) && 
840                             ( NdefMap->PrevOperation == 
841                             PH_FRINFC_NDEFMAP_READ_OPE))?
842                             PH_FRINFC_NDEFMAP_SEEK_BEGIN:
843                             Offset);
844             NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
845             status = phFriNfc_MifStd_H_BlkChk(NdefMap);
846             NdefMap->StdMifareContainer.ReadWriteCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
847             if(status == NFCSTATUS_SUCCESS)
848             {
849                 if(NdefMap->StdMifareContainer.PollFlag == 
850                     PH_FRINFC_MIFARESTD_FLAG1)
851                 {
852                     /* if poll flag is set then call disconnect because the authentication 
853                         has failed so reactivation of card is required */
854                     status = phFriNfc_MifStd_H_CallDisCon(NdefMap);
855                 }
856                 /* Check Authentication Flag */ 
857                 else if(NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)
858                 {
859                     status =  ((NdefMap->Offset == 
860                                 PH_FRINFC_NDEFMAP_SEEK_BEGIN)?
861                                 phFriNfc_MifStd_H_RdBeforeWr(NdefMap):
862                                 phFriNfc_MifStd_H_WrABlock(NdefMap));
863                 }
864                 else
865                 {
866                     status = phFriNfc_MifStd_H_AuthSector(NdefMap);
867                 }
868             }
869         }
870     }
871     return status;
872 }
873
874
875 /*!
876  * \brief Completion Routine, Processing function, needed to avoid long blocking.
877  * \note The lower (Overlapped HAL) layer must register a pointer to this function as a Completion
878  *       Routine in order to be able to notify the component that an I/O has finished and data are
879  *       ready to be processed.
880  *
881  */
882
883 void phFriNfc_MifareStdMap_Process( void       *Context,
884                                     NFCSTATUS   Status)
885 {
886
887     phFriNfc_NdefMap_t      *NdefMap; 
888     
889     uint8_t                 NDEFFlag = 0,
890                             CRFlag = 0,
891                             Temp16Bytes = 0,
892                             i = 0;
893
894
895     NdefMap = (phFriNfc_NdefMap_t *)Context;
896
897     
898     if((Status & PHNFCSTBLOWER) == (NFCSTATUS_SUCCESS & PHNFCSTBLOWER))
899     {
900         switch(NdefMap->State)
901         {
902             case PH_FRINFC_NDEFMAP_STATE_CHK_NDEF_COMP:
903                 Status = phFriNfc_MifStd_H_ProChkNdef(NdefMap);
904                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
905                             PH_FRINFC_MIFARESTD_FLAG1:
906                             PH_FRINFC_MIFARESTD_FLAG0);
907                 break;
908
909             case PH_FRINFC_NDEFMAP_STATE_READ:
910                 
911                 /* Receive Length for read shall always be equal to 16 */
912                 if((*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ) && 
913                     (NdefMap->ApduBuffIndex < (uint16_t)NdefMap->ApduBufferSize))
914                 {
915                     Temp16Bytes = PH_FRINFC_MIFARESTD_VAL0;
916                     NDEFFlag = (uint8_t)PH_FRINFC_MIFARESTD_FLAG1;
917                     if(NdefMap->TLVStruct.BytesRemainLinTLV != 0)
918                     {
919                         NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
920                         CRFlag = PH_FRINFC_MIFARESTD_FLAG0;
921                         /* To read the remaining length (L) in TLV */
922                         Status = phFriNfc_MifStd_H_RemainTLV(NdefMap, &NDEFFlag, &Temp16Bytes);
923                         CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
924                                             PH_FRINFC_MIFARESTD_FLAG1:
925                                             PH_FRINFC_MIFARESTD_FLAG0); 
926                     }
927
928                     /* check the NDEFFlag is set. if this is not set, then 
929                         in the above RemainTLV function all the 16 bytes has been 
930                         read */
931 #if 0
932                     if((NDEFFlag == PH_FRINFC_MIFARESTD_FLAG1) && 
933                         (NdefMap->TLVStruct.NdefTLVFoundFlag == 
934                         PH_FRINFC_MIFARESTD_FLAG1))
935                     {
936                         /* if the block is NDEF TLV then get data from here */
937                         Status = phFriNfc_MifStd_H_RdNdefTLV(NdefMap, &Temp16Bytes);
938                     }
939 #endif
940                 }
941                 else
942                 {
943                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_RECEIVE_LENGTH);
944                     CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
945                 }
946                 break;
947
948             case PH_FRINFC_NDEFMAP_STATE_WRITE:
949                 Status = phFriNfc_MifStd_H_ProWrABlock(NdefMap);
950                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
951                                     PH_FRINFC_MIFARESTD_FLAG1:
952                                     PH_FRINFC_MIFARESTD_FLAG0);
953                 
954                 /* Call Completion Routine if CR Flag is Set to 1 */
955                 if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
956                 {
957                     *NdefMap->WrNdefPacketLength = NdefMap->ApduBuffIndex;
958                 }
959                 break;
960
961             case PH_FRINFC_NDEFMAP_STATE_AUTH:
962                 NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG0;
963                 Status = phFriNfc_MifStd_H_ProAuth(NdefMap);
964                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
965                                     PH_FRINFC_MIFARESTD_FLAG1:
966                                     PH_FRINFC_MIFARESTD_FLAG0);
967                 break;
968
969             case PH_FRINFC_NDEFMAP_STATE_RD_ACS_BIT:
970                 Status = phFriNfc_MifStd_H_ProAcsBits(NdefMap);
971                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
972                                     PH_FRINFC_MIFARESTD_FLAG1:
973                                     PH_FRINFC_MIFARESTD_FLAG0);                
974                 break;
975
976             case PH_FRINFC_NDEFMAP_STATE_WR_NDEF_LEN:
977                 if(NdefMap->StdMifareContainer.RdAfterWrFlag == 
978                     PH_FRINFC_MIFARESTD_FLAG1)
979                 {
980                     Status = phFriNfc_MifStd_H_CallWrNdefLen(NdefMap);
981                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
982                                 PH_FRINFC_MIFARESTD_FLAG1:
983                                 PH_FRINFC_MIFARESTD_FLAG0);
984                 }
985                 else
986                 {
987                     /* Check this */
988                     if(NdefMap->StdMifareContainer.TempBlockNo == 
989                         NdefMap->StdMifareContainer.currentBlock)
990                     {
991                        (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
992                                 NdefMap->StdMifareContainer.Buffer,
993                                 NdefMap->StdMifareContainer.internalLength);
994                     }
995                     *NdefMap->WrNdefPacketLength = NdefMap->ApduBuffIndex;
996                     NdefMap->StdMifareContainer.currentBlock = 
997                                     NdefMap->StdMifareContainer.TempBlockNo;
998                     NdefMap->CardState = (uint8_t)((NdefMap->CardState == 
999                                         PH_NDEFMAP_CARD_STATE_INITIALIZED)?
1000                                         PH_NDEFMAP_CARD_STATE_READ_WRITE:
1001                                         NdefMap->CardState);
1002                     CRFlag = (uint8_t)PH_FRINFC_MIFARESTD_FLAG1;
1003                 }
1004                 /*NdefMap->StdMifareContainer.remainingSize -= 
1005                 (((NdefMap->ApduBufferSize) > (PH_FRINFC_MIFARESTD_NDEFTLV_L - 
1006                                             PH_FRINFC_MIFARESTD_VAL1))?
1007                                             ((uint16_t)(*NdefMap->WrNdefPacketLength + 
1008                                             PH_FRINFC_MIFARESTD_VAL4)):
1009                                             ((uint16_t)(*NdefMap->WrNdefPacketLength + 
1010                                             PH_FRINFC_MIFARESTD_VAL2)));*/
1011                 break;
1012
1013             case PH_FRINFC_NDEFMAP_STATE_RD_TO_WR_NDEF_LEN:
1014                 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
1015                 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1016                                     NFCSTATUS_INVALID_DEVICE_REQUEST);
1017                 if(*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ)
1018                 {
1019                     /* Size of NdefMap->SendRecvBuf is set by phLibNfc_Gen_NdefMapReset to PH_LIBNFC_GEN_MAX_BUFFER */
1020                     /* We don't have to check memory here */
1021                     for (i = PH_FRINFC_MIFARESTD_BYTES_READ; i > 0; i--)
1022                     {
1023                         NdefMap->SendRecvBuf[i] = NdefMap->SendRecvBuf[i-1];
1024                     }                     
1025                     NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
1026                                 NdefMap->StdMifareContainer.currentBlock;
1027                     Status = phFriNfc_MifStd_H_WriteNdefLen(NdefMap);
1028                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1029                                 PH_FRINFC_MIFARESTD_FLAG1:
1030                                 PH_FRINFC_MIFARESTD_FLAG0);
1031                 }
1032                 break;
1033
1034             case PH_FRINFC_NDEFMAP_STATE_GET_ACT_CARDSIZE:
1035                 NDEFFlag = PH_FRINFC_MIFARESTD_FLAG1;
1036                 if(NdefMap->TLVStruct.NoLbytesinTLV > PH_FRINFC_MIFARESTD_VAL0)
1037                 {
1038                     NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
1039                     Status = phFriNfc_MifStd_H_ChkRemainTLVs(NdefMap, &CRFlag, &NDEFFlag);
1040                     NdefMap->TLVStruct.NoLbytesinTLV = 
1041                                     PH_FRINFC_MIFARESTD_VAL0;
1042                 }
1043                 if((NDEFFlag == PH_FRINFC_MIFARESTD_FLAG1) && 
1044                     (CRFlag != PH_FRINFC_MIFARESTD_FLAG1))
1045                 {
1046                     Status = phFriNfc_MifStd_H_ChkTLVs(NdefMap, &CRFlag);
1047                 }
1048                 if(((NdefMap->StdMifareContainer.ReadNdefFlag == 
1049                     PH_FRINFC_MIFARESTD_FLAG1) || 
1050                     (NdefMap->StdMifareContainer.WrNdefFlag == 
1051                     PH_FRINFC_MIFARESTD_FLAG1))&& 
1052                     (Status != NFCSTATUS_PENDING))
1053                 {
1054                     NdefMap->StdMifareContainer.NFCforumSectFlag = 
1055                                             PH_FRINFC_MIFARESTD_FLAG1;
1056                     CRFlag = PH_FRINFC_MIFARESTD_FLAG0;
1057                     /* if the card state has changed to initialised and 
1058                      read ndef is called then error is returned */
1059                     if(((NdefMap->StdMifareContainer.WrNdefFlag == 
1060                         PH_FRINFC_MIFARESTD_FLAG1) && 
1061                         (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY)) || 
1062                         ((NdefMap->StdMifareContainer.ReadNdefFlag == 
1063                             PH_FRINFC_MIFARESTD_FLAG1) && 
1064                         (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INITIALIZED)))
1065                     {
1066                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
1067                                             NFCSTATUS_NO_NDEF_SUPPORT);
1068                     }
1069                     if(NdefMap->StdMifareContainer.AuthDone == 
1070                         PH_FRINFC_MIFARESTD_FLAG0)
1071                     {                       
1072                         Status = phFriNfc_MifStd_H_AuthSector(NdefMap);
1073                     }
1074                     else
1075                     {
1076                         Status = ((NdefMap->StdMifareContainer.ReadNdefFlag == 
1077                                     PH_FRINFC_MIFARESTD_FLAG1)?
1078                                     phFriNfc_MifStd_H_RdTLV(NdefMap):
1079                                     phFriNfc_MifStd_H_RdBeforeWr(NdefMap));
1080                     }
1081                     NdefMap->StdMifareContainer.ReadNdefFlag = 
1082                                             PH_FRINFC_MIFARESTD_FLAG0;
1083                     NdefMap->StdMifareContainer.WrNdefFlag = 
1084                                             PH_FRINFC_MIFARESTD_FLAG0;
1085                         
1086                 }
1087                 if(NdefMap->StdMifareContainer.ChkNdefFlag == 
1088                     PH_FRINFC_MIFARESTD_FLAG1)
1089                 {
1090                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1091                             PH_FRINFC_MIFARESTD_FLAG1:
1092                             PH_FRINFC_MIFARESTD_FLAG0);
1093                 }
1094                 break;
1095
1096             case PH_FRINFC_NDEFMAP_STATE_RD_BEF_WR:
1097                 /* Read flag says that already part of TLV has been written */
1098                 Status = phFriNfc_MifStd_H_ProBytesToWr(NdefMap);
1099                  CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1100                                     PH_FRINFC_MIFARESTD_FLAG1:
1101                                     PH_FRINFC_MIFARESTD_FLAG0);
1102                 break;
1103
1104             case PH_FRINFC_NDEFMAP_STATE_WR_TLV:
1105                 Status = phFriNfc_MifStd_H_ProWrTLV(NdefMap);
1106                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1107                                     PH_FRINFC_MIFARESTD_FLAG1:
1108                                     PH_FRINFC_MIFARESTD_FLAG0);
1109                 break;
1110
1111             case PH_FRINFC_NDEFMAP_STATE_RD_TLV:
1112                 Status = phFriNfc_MifStd_H_ProRdTLV(NdefMap);
1113                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1114                                     PH_FRINFC_MIFARESTD_FLAG1:
1115                                     PH_FRINFC_MIFARESTD_FLAG0);
1116                 break;
1117
1118             case PH_FRINFC_NDEFMAP_STATE_TERM_TLV:
1119                 phFriNfc_MifStd_H_SetNdefBlkAuth(NdefMap);
1120                 NdefMap->StdMifareContainer.currentBlock = 
1121                                 NdefMap->TLVStruct.NdefTLVBlock;
1122                 Status = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
1123                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1124                                     PH_FRINFC_MIFARESTD_FLAG1:
1125                                     PH_FRINFC_MIFARESTD_FLAG0);
1126                 break;
1127
1128             case PH_FRINFC_NDEFMAP_STATE_DISCONNECT:
1129                 NdefMap->StdMifareContainer.PollFlag = PH_FRINFC_MIFARESTD_FLAG0;
1130
1131 #ifndef PH_HAL4_ENABLE
1132                 Status = phFriNfc_MifStd_H_CallPoll(NdefMap);
1133                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1134                                     PH_FRINFC_MIFARESTD_FLAG1:
1135                                     PH_FRINFC_MIFARESTD_FLAG0);
1136                 break;
1137
1138             case PH_FRINFC_NDEFMAP_STATE_POLL:
1139 #endif              
1140                 Status = phFriNfc_MifStd_H_CallConnect(NdefMap);
1141                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1142                                     PH_FRINFC_MIFARESTD_FLAG1:
1143                                     PH_FRINFC_MIFARESTD_FLAG0);
1144                 break;
1145
1146             case PH_FRINFC_NDEFMAP_STATE_CONNECT:
1147                 if(NdefMap->StdMifareContainer.FirstReadFlag == PH_FRINFC_MIFARESTD_FLAG1)
1148                 {
1149                     NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG0;
1150                     Status = phFriNfc_MifStd_H_AuthSector(NdefMap);
1151                 }
1152                 else
1153                 {
1154                     Status = ((((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) && 
1155                         (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_WRITE_OPE)) || 
1156                         (NdefMap->StdMifareContainer.WrLength > 
1157                         PH_FRINFC_MIFARESTD_VAL0))?
1158                         phFriNfc_MifStd_H_ProStatNotValid(NdefMap, Status):
1159                         phFriNfc_MifStd_H_AuthSector(NdefMap));
1160                 }
1161                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1162                                     PH_FRINFC_MIFARESTD_FLAG1:
1163                                     PH_FRINFC_MIFARESTD_FLAG0);
1164                 break;
1165
1166             default:
1167                 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1168                                     NFCSTATUS_INVALID_DEVICE_REQUEST);
1169                 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
1170                 break;
1171         }
1172     }
1173     else if(NdefMap->State == PH_FRINFC_NDEFMAP_STATE_AUTH)
1174     {
1175         NdefMap->StdMifareContainer.PollFlag = PH_FRINFC_MIFARESTD_FLAG1;
1176         if(NdefMap->StdMifareContainer.FirstWriteFlag == 
1177             PH_FRINFC_MIFARESTD_FLAG1)
1178         {
1179             NdefMap->StdMifareContainer.FirstWriteFlag = 
1180                                             PH_FRINFC_MIFARESTD_FLAG0;
1181             NdefMap->StdMifareContainer.WrLength = 
1182                 ((NdefMap->StdMifareContainer.NFCforumSectFlag == 
1183                 PH_FRINFC_MIFARESTD_FLAG0)?
1184                 PH_FRINFC_MIFARESTD_VAL1:
1185                 NdefMap->StdMifareContainer.WrLength);
1186         }
1187         /*if(NdefMap->StdMifareContainer.WrLength != PH_FRINFC_MIFARESTD_VAL0)
1188         {
1189             Status = NFCSTATUS_SUCCESS;
1190             NdefMap->StdMifareContainer.ReadCompleteFlag = 
1191                                     PH_FRINFC_MIFARESTD_FLAG1;
1192             *NdefMap->WrNdefPacketLength = NdefMap->ApduBuffIndex;
1193             CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
1194         }
1195         else*/ if(NdefMap->StdMifareContainer.WrLength == PH_FRINFC_MIFARESTD_VAL0)
1196         {
1197             Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
1198                                 NFCSTATUS_EOF_NDEF_CONTAINER_REACHED);
1199             CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
1200         }
1201         else
1202         {
1203             /* Authentication has failed */
1204             Status = phFriNfc_MifStd_H_CallDisCon(NdefMap);
1205             CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1206                         PH_FRINFC_MIFARESTD_FLAG1:
1207                         PH_FRINFC_MIFARESTD_FLAG0);
1208         }
1209     }
1210     else
1211     {
1212         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1213                             NFCSTATUS_INVALID_DEVICE_REQUEST);
1214         CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
1215     }
1216      /* Call Completion Routine if CR Flag is Set to 1 */
1217     if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
1218     {
1219         phFriNfc_MifStd_H_Complete(NdefMap, Status);
1220     }
1221 }
1222
1223 static NFCSTATUS phFriNfc_MifStd_H_RdABlock(phFriNfc_NdefMap_t *NdefMap)
1224 {
1225     NFCSTATUS               status =    NFCSTATUS_PENDING;
1226
1227     /* set the data for additional data exchange*/
1228     NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
1229     NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
1230     NdefMap->psDepAdditionalInfo.NAD = 0;
1231
1232     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_READ;
1233     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE;
1234     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
1235     NdefMap->MapCompletionInfo.Context = NdefMap;
1236     
1237     if( NdefMap->ApduBuffIndex < 
1238         (uint16_t)NdefMap->ApduBufferSize)
1239     {
1240                 
1241         if(NdefMap->StdMifareContainer.internalLength > PH_FRINFC_MIFARESTD_VAL0)
1242         {
1243             status = phFriNfc_MifStd_H_ChkIntLen(NdefMap);
1244         }/* internal Length Check */
1245         else
1246         {
1247             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
1248                         NdefMap->StdMifareContainer.currentBlock;
1249             NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_READ;
1250             *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
1251
1252 #ifndef PH_HAL4_ENABLE
1253             NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareRead;
1254 #else
1255             NdefMap->Cmd.MfCmd = phHal_eMifareRead;
1256 #endif
1257             /* Call the Overlapped HAL Transceive function */ 
1258             status = phFriNfc_OvrHal_Transceive(    NdefMap->LowerDevice,
1259                                                     &NdefMap->MapCompletionInfo,
1260                                                     NdefMap->psRemoteDevInfo,
1261                                                     NdefMap->Cmd,
1262                                                     &NdefMap->psDepAdditionalInfo,
1263                                                     NdefMap->SendRecvBuf,
1264                                                     NdefMap->SendLength,
1265                                                     NdefMap->SendRecvBuf,
1266                                                     NdefMap->SendRecvLength);
1267         }        
1268     }
1269     else
1270     {
1271         /* Check for the Card Size */
1272         if((((NdefMap->StdMifareContainer.NoOfNdefCompBlocks - 
1273             NdefMap->StdMifareContainer.NdefBlocks) * 
1274             PH_FRINFC_MIFARESTD_BYTES_READ) == 0) ||  
1275             (NdefMap->ApduBufferSize == NdefMap->ApduBuffIndex))
1276         {
1277             NdefMap->StdMifareContainer.ReadWriteCompleteFlag = 
1278                 (uint8_t)((((NdefMap->StdMifareContainer.NoOfNdefCompBlocks - 
1279                 NdefMap->StdMifareContainer.NdefBlocks) * 
1280                 PH_FRINFC_MIFARESTD_BYTES_READ) == 0)?
1281                 PH_FRINFC_MIFARESTD_FLAG1:
1282                 PH_FRINFC_MIFARESTD_FLAG0);
1283             *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
1284             status = PHNFCSTVAL(CID_NFC_NONE, 
1285                                 NFCSTATUS_SUCCESS);
1286         }
1287         else
1288         {
1289             /*Error: The control should not ideally come here.
1290                 Return Error.*/
1291 #ifndef PH_HAL4_ENABLE
1292             status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_CMD_ABORTED);
1293 #else
1294             status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_FAILED);    
1295 #endif
1296         }
1297     }
1298     return status;
1299 }
1300
1301
1302 static NFCSTATUS phFriNfc_MifStd_H_WrABlock(phFriNfc_NdefMap_t *NdefMap)
1303 {
1304     NFCSTATUS               status =    NFCSTATUS_PENDING;
1305     
1306     uint16_t                    RemainingBytes = 0,
1307                                 BytesRemained = 0,
1308                                 index = 0;
1309
1310     uint8_t                     Temp16Bytes = 0;
1311
1312     /* set the data for additional data exchange*/
1313     NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
1314     NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
1315     NdefMap->psDepAdditionalInfo.NAD = 0;
1316     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
1317     NdefMap->MapCompletionInfo.Context = NdefMap;
1318     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
1319     
1320     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WRITE;
1321    
1322     /* User Buffer Check */
1323     if( NdefMap->ApduBuffIndex < 
1324         (uint16_t)NdefMap->ApduBufferSize)
1325     {
1326         RemainingBytes = (((uint16_t)(NdefMap->ApduBufferSize -
1327                          NdefMap->ApduBuffIndex) < 
1328                         NdefMap->StdMifareContainer.remainingSize )?
1329                         (uint16_t)(NdefMap->ApduBufferSize -
1330                         NdefMap->ApduBuffIndex):
1331                         NdefMap->StdMifareContainer.remainingSize);
1332
1333         NdefMap->SendRecvBuf[0] = NdefMap->StdMifareContainer.currentBlock;
1334         Temp16Bytes += PH_FRINFC_MIFARESTD_INC_1;
1335         /* Check for internal bytes */
1336         
1337         if(NdefMap->StdMifareContainer.internalLength > 0)
1338         {
1339             /* copy the bytes previously written in the internal Buffer */
1340             (void)memcpy(&( NdefMap->SendRecvBuf[Temp16Bytes]),
1341                     NdefMap->StdMifareContainer.internalBuf,
1342                     NdefMap->StdMifareContainer.internalLength);
1343
1344             Temp16Bytes += (uint8_t)(NdefMap->StdMifareContainer.internalLength);
1345             if(RemainingBytes >= (  MIFARE_MAX_SEND_BUF_TO_WRITE - 
1346                                     Temp16Bytes))
1347             {
1348                 /* Copy the Remaining bytes from the user buffer to make the send
1349                     data and length = 16 */
1350                 (void)memcpy(&(NdefMap->SendRecvBuf[Temp16Bytes]),
1351                         NdefMap->ApduBuffer,
1352                         (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes));
1353
1354                 NdefMap->NumOfBytesWritten = 
1355                     (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
1356                 Temp16Bytes += (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
1357                 *NdefMap->DataCount = (Temp16Bytes - PH_FRINFC_MIFARESTD_VAL1);
1358             }
1359             else
1360             {
1361                 (void)memcpy(&(NdefMap->SendRecvBuf[Temp16Bytes]),
1362                         NdefMap->ApduBuffer,
1363                         RemainingBytes);
1364
1365                 NdefMap->StdMifareContainer.internalBufFlag = PH_FRINFC_MIFARESTD_FLAG1;
1366                 NdefMap->NumOfBytesWritten = RemainingBytes;
1367                 Temp16Bytes += (uint8_t)(RemainingBytes);
1368                 *NdefMap->DataCount = (Temp16Bytes - PH_FRINFC_MIFARESTD_VAL1);
1369
1370                 BytesRemained = (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
1371                 /* Pad empty bytes with Zeroes to complete 16 bytes*/
1372                 for(index = 0; index < BytesRemained; index++)
1373                 {
1374                     NdefMap->SendRecvBuf[(Temp16Bytes + index)] = 
1375                                 (uint8_t)((index == PH_FRINFC_MIFARESTD_VAL0)?
1376                                     PH_FRINFC_MIFARESTD_TERMTLV_T:
1377                                     PH_FRINFC_MIFARESTD_NULLTLV_T);
1378                     NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
1379                 }
1380                 Temp16Bytes += (uint8_t)(BytesRemained);
1381             }
1382         }
1383         else
1384         {
1385             if(RemainingBytes >= (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes))
1386             {
1387                 /* Bytes left to write < 16 
1388                     copy remaining bytes */
1389                 (void)memcpy( &(NdefMap->SendRecvBuf[ 
1390                         Temp16Bytes]),
1391                         &(NdefMap->ApduBuffer[ 
1392                         NdefMap->ApduBuffIndex]),
1393                         (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes));
1394
1395                 NdefMap->NumOfBytesWritten = (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
1396                 Temp16Bytes += (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
1397                 *NdefMap->DataCount = (Temp16Bytes - PH_FRINFC_MIFARESTD_VAL1);
1398             }
1399             else
1400             {
1401                 /* Bytes left to write < 16 
1402                     copy remaining bytes */
1403                 (void)memcpy(&(NdefMap->SendRecvBuf[
1404                         Temp16Bytes]),
1405                         &(NdefMap->ApduBuffer[ 
1406                         NdefMap->ApduBuffIndex]),
1407                         RemainingBytes);
1408
1409                 NdefMap->StdMifareContainer.RemainingBufFlag = PH_FRINFC_MIFARESTD_FLAG1;
1410                 NdefMap->NumOfBytesWritten = RemainingBytes;
1411                 Temp16Bytes += (uint8_t)(RemainingBytes);
1412                 *NdefMap->DataCount = (Temp16Bytes - PH_FRINFC_MIFARESTD_VAL1);
1413                 
1414
1415                 /* Pad empty bytes with Zeroes to complete 16 bytes*/
1416                 for(index = Temp16Bytes; index < MIFARE_MAX_SEND_BUF_TO_WRITE; index++)
1417                 {
1418                     NdefMap->SendRecvBuf[index] = (uint8_t)((index == 
1419                                     Temp16Bytes)?
1420                                     PH_FRINFC_MIFARESTD_TERMTLV_T:
1421                                     PH_FRINFC_MIFARESTD_NULLTLV_T);
1422
1423                     NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
1424                 }
1425             }
1426         }
1427         /* Buffer to store 16 bytes which is writing to the present block */
1428         (void)memcpy( NdefMap->StdMifareContainer.Buffer,
1429                 &(NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_INC_1]),
1430                 PH_FRINFC_MIFARESTD_BLOCK_BYTES);
1431
1432         /* Write from here */
1433         NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_WRITE;
1434 #ifndef PH_HAL4_ENABLE
1435         NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareWrite16;
1436 #else
1437         NdefMap->Cmd.MfCmd = phHal_eMifareWrite16;
1438 #endif
1439         *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
1440         /* Call the Overlapped HAL Transceive function */ 
1441         status = phFriNfc_OvrHal_Transceive(    NdefMap->LowerDevice,
1442                                                 &NdefMap->MapCompletionInfo,
1443                                                 NdefMap->psRemoteDevInfo,
1444                                                 NdefMap->Cmd,
1445                                                 &NdefMap->psDepAdditionalInfo,
1446                                                 NdefMap->SendRecvBuf,
1447                                                 NdefMap->SendLength,
1448                                                 NdefMap->SendRecvBuf,
1449                                                 NdefMap->SendRecvLength);       
1450     }
1451     else/* Check User Buffer */
1452     {
1453         if(NdefMap->StdMifareContainer.NdefBlocks >
1454              NdefMap->StdMifareContainer.NoOfNdefCompBlocks)
1455         {
1456             NdefMap->StdMifareContainer.ReadWriteCompleteFlag = 
1457                 PH_FRINFC_MIFARESTD_FLAG1;
1458             status = PHNFCSTVAL(CID_NFC_NONE, 
1459                                 NFCSTATUS_SUCCESS);
1460         }
1461         else if( NdefMap->ApduBuffIndex ==
1462             (uint16_t)NdefMap->ApduBufferSize)          
1463         {
1464             status = PHNFCSTVAL(CID_NFC_NONE, 
1465                                 NFCSTATUS_SUCCESS);
1466         }
1467         else
1468         {
1469             /*Error: The control should not ideally come here.
1470               Return Error.*/
1471 #ifndef PH_HAL4_ENABLE
1472             status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_CMD_ABORTED);
1473 #else
1474             status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_FAILED);    
1475 #endif
1476         }
1477     }
1478     return status;
1479 }
1480
1481 static NFCSTATUS phFriNfc_MifStd_H_AuthSector(phFriNfc_NdefMap_t *NdefMap)
1482 {
1483     NFCSTATUS                   status = NFCSTATUS_PENDING;
1484     
1485     /* set the data for additional data exchange*/
1486     NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
1487     NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
1488     NdefMap->psDepAdditionalInfo.NAD = 0;
1489     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
1490     NdefMap->MapCompletionInfo.Context = NdefMap;
1491     
1492     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
1493     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_AUTH;
1494
1495     /* Authenticate */ 
1496 #ifndef PH_HAL4_ENABLE
1497     NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareAuthentA;
1498 #else
1499     NdefMap->Cmd.MfCmd = phHal_eMifareAuthentA;
1500 #endif
1501     NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
1502                             ((NdefMap->TLVStruct.NdefTLVAuthFlag == 
1503                                 PH_FRINFC_MIFARESTD_FLAG1)?
1504                                 NdefMap->TLVStruct.NdefTLVBlock:
1505                                 NdefMap->StdMifareContainer.currentBlock);
1506
1507     /* if MAD blocks then authentication key is 
1508         0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 else
1509         0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7 */
1510     if(( (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK0) && 
1511         (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK1) &&
1512         (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK2) &&
1513         (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK64) && 
1514         (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK65) && 
1515         (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK66)) || 
1516         (NdefMap->TLVStruct.NdefTLVAuthFlag == 
1517                                 (uint8_t)PH_FRINFC_MIFARESTD_FLAG1))
1518     {   
1519         NdefMap->SendRecvBuf[1] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
1520         NdefMap->SendRecvBuf[2] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
1521         NdefMap->SendRecvBuf[3] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
1522         NdefMap->SendRecvBuf[4] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
1523         NdefMap->SendRecvBuf[5] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
1524         NdefMap->SendRecvBuf[6] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
1525     }
1526     else
1527     {       
1528         NdefMap->SendRecvBuf[1] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT1; /* 0xA0 */
1529         NdefMap->SendRecvBuf[2] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT2; /* 0xA1 */
1530         NdefMap->SendRecvBuf[3] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT3; /* 0xA2 */
1531         NdefMap->SendRecvBuf[4] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT4; /* 0xA3 */
1532         NdefMap->SendRecvBuf[5] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT5; /* 0xA4 */
1533         NdefMap->SendRecvBuf[6] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT6; /* 0xA5 */
1534     }
1535     
1536     NdefMap->SendLength = MIFARE_AUTHENTICATE_CMD_LENGTH;
1537     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
1538     /* Call the Overlapped HAL Transceive function */ 
1539     status = phFriNfc_OvrHal_Transceive(    NdefMap->LowerDevice,
1540                                             &NdefMap->MapCompletionInfo,
1541                                             NdefMap->psRemoteDevInfo,
1542                                             NdefMap->Cmd,
1543                                             &NdefMap->psDepAdditionalInfo,
1544                                             NdefMap->SendRecvBuf,
1545                                             NdefMap->SendLength,
1546                                             NdefMap->SendRecvBuf,
1547                                             NdefMap->SendRecvLength);
1548     
1549     return status;
1550 }
1551
1552 static void phFriNfc_MifStd_H_Complete(phFriNfc_NdefMap_t  *NdefMap,
1553                                         NFCSTATUS            Result)
1554 {
1555     /* set the state back to the Reset_Init state*/
1556     NdefMap->State =  PH_FRINFC_NDEFMAP_STATE_RESET_INIT;
1557
1558     /* set the completion routine*/
1559     NdefMap->CompletionRoutine[NdefMap->StdMifareContainer.CRIndex].
1560         CompletionRoutine(NdefMap->CompletionRoutine->Context, Result);
1561 }
1562
1563 static NFCSTATUS phFriNfc_MifStd4k_H_CheckNdef(phFriNfc_NdefMap_t *NdefMap)
1564 {
1565     NFCSTATUS Result = NFCSTATUS_SUCCESS;
1566
1567     /* Get the AID Block */
1568     if(NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK2)
1569     {
1570         NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_MAD_BLK64;
1571         NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
1572     }
1573     else if(NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK64)
1574     {
1575         NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_MAD_BLK65;
1576     }
1577     else
1578     {
1579         NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_MAD_BLK66;
1580     }
1581                     
1582     Result = phFriNfc_MifareStdMap_ChkNdef(NdefMap);
1583
1584     return Result;
1585     
1586 }
1587
1588 static void phFriNfc_MifStd_H_fillAIDarray(phFriNfc_NdefMap_t *NdefMap)
1589 {  
1590     uint8_t     byteindex = 0;
1591     
1592     if( (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK1) || 
1593         (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK64))
1594     {
1595         /* The First Two Bytes in Receive Buffer
1596             are CRC bytes so it is not copied
1597             instead, 0 is copied in AID[0] & AID[1] */
1598         NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.SectorIndex] = 
1599                                     PH_FRINFC_MIFARESTD_NDEF_COMP; 
1600         NdefMap->StdMifareContainer.SectorIndex++;
1601         byteindex = 2;
1602     }
1603     
1604     while(byteindex < PH_FRINFC_MIFARESTD_BYTES_READ)
1605     {
1606         if((NdefMap->SendRecvBuf[byteindex] == PH_FRINFC_NDEFMAP_MIFARESTD_NDEF_COMPVAL2) &&
1607             (NdefMap->SendRecvBuf[(byteindex + 1)] == PH_FRINFC_NDEFMAP_MIFARESTD_NDEF_COMPVAL1))
1608         {
1609             /* This flag is set when a NFC forum sector is found in a 
1610                 MAD block for the first time*/
1611             NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG1;
1612             NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.SectorIndex] = 
1613                                         PH_FRINFC_MIFARESTD_NDEF_COMP;
1614             NdefMap->StdMifareContainer.SectorIndex++;
1615         }
1616         else
1617         {
1618             NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.SectorIndex] = 
1619                                     PH_FRINFC_MIFARESTD_NON_NDEF_COMP;
1620             NdefMap->StdMifareContainer.SectorIndex++;
1621             /* AID complete flag is set when a non NFC forum sector is found in a 
1622                 MAD block after the NFC forum sector. After setting this, all other 
1623                 values are ignored and are NOT NDEF compliant */
1624             NdefMap->StdMifareContainer.aidCompleteFlag = 
1625                 ((NdefMap->StdMifareContainer.NFCforumSectFlag == 
1626                     PH_FRINFC_MIFARESTD_FLAG1)?
1627                     PH_FRINFC_MIFARESTD_FLAG1:
1628                     PH_FRINFC_MIFARESTD_FLAG0);
1629
1630             NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
1631             if(NdefMap->StdMifareContainer.aidCompleteFlag == PH_FRINFC_MIFARESTD_FLAG1)
1632             {
1633                 break;
1634             }
1635         }
1636         byteindex += 2;
1637     }
1638
1639     /* If "aidCompleteFlag" is set then the remaining sectors are made NOT 
1640         NDEF compliant */
1641     if((NdefMap->StdMifareContainer.aidCompleteFlag == PH_FRINFC_MIFARESTD_FLAG1) && 
1642         (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD))
1643     {
1644         /* for Mifare 1k there are 16 sectors, till this number all sectors 
1645             are made NOT NDEF compliant */
1646         for(byteindex = NdefMap->StdMifareContainer.SectorIndex; 
1647             byteindex < PH_FRINFC_MIFARESTD1K_TOTAL_SECTOR;
1648             byteindex++)
1649         {
1650              NdefMap->StdMifareContainer.aid[byteindex] = 
1651                                     PH_FRINFC_MIFARESTD_NON_NDEF_COMP;
1652         }
1653     }
1654     else
1655     {
1656         /* for Mifare 4k there are 40 sectors, till this number all sectors 
1657             are made NOT NDEF compliant */
1658         if((NdefMap->StdMifareContainer.aidCompleteFlag == PH_FRINFC_MIFARESTD_FLAG1) && 
1659             (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD))
1660         {
1661             for(byteindex = NdefMap->StdMifareContainer.SectorIndex; 
1662                 byteindex < PH_FRINFC_MIFARESTD4K_TOTAL_SECTOR;
1663                 byteindex++)
1664             {
1665                 NdefMap->StdMifareContainer.aid[byteindex] = 
1666                                         PH_FRINFC_MIFARESTD_NON_NDEF_COMP;
1667             }
1668         }
1669     }
1670 }
1671
1672 static NFCSTATUS phFriNfc_MifStd_H_BlkChk(phFriNfc_NdefMap_t *NdefMap)
1673 {
1674     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
1675     uint8_t     SectorID = 0, callbreak = 0;
1676
1677     for(;;)
1678     {
1679         /* Get a Sector ID for the Current Block */
1680         SectorID = phFriNfc_MifStd_H_GetSect(NdefMap->StdMifareContainer.currentBlock);
1681         /* Check the card Type 1k or 4k */
1682         /* enter if Mifare 1k card. For Mifare 4k go to else */
1683         if(NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD)
1684         {
1685             /* if Sector Id > 15 No Sectors to write */
1686             if(SectorID > 15)
1687             {
1688                 SectorID = phFriNfc_MifStd_H_GetSect(NdefMap->StdMifareContainer.currentBlock);
1689                 /*Error: No Ndef Compliant Sectors present.*/
1690                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
1691                                     NFCSTATUS_INVALID_PARAMETER);
1692                 callbreak = 1;
1693             }
1694             else
1695             {
1696                 phFriNfc_MifStd1k_H_BlkChk(NdefMap, SectorID, &callbreak);
1697             }
1698         } /* End of if */ /* End of Mifare 1k check */
1699         else /* Mifare 4k check starts here */
1700         {
1701             /* Sector > 39 no ndef compliant sectors found*/
1702             if(SectorID > PH_FRINFC_MIFARESTD_SECTOR_NO39)
1703             {
1704                 /*Error: No Ndef Compliant Sectors present.*/
1705                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
1706                                     NFCSTATUS_INVALID_PARAMETER);
1707                 callbreak = 1;
1708             }
1709             else if(NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK64)
1710             {
1711                 NdefMap->StdMifareContainer.currentBlock += PH_FRINFC_MIFARESTD_BLK4;
1712             }  
1713             else if(SectorID < PH_FRINFC_MIFARESTD_SECTOR_NO32) /* sector < 32 contains 4 blocks in each sector */
1714             {
1715                 /* If the block checked is 63, the 3 blocks after this 
1716                     are AID(MAD) blocks so its need to be skipped */
1717                 if(NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK63)
1718                 {
1719                     NdefMap->StdMifareContainer.currentBlock += PH_FRINFC_MIFARESTD_BLK4;
1720                 }               
1721                 else
1722                 {
1723                     phFriNfc_MifStd1k_H_BlkChk(NdefMap, SectorID, &callbreak);
1724                 }
1725             }
1726             else
1727             {
1728                 /* every last block of a sector needs to be skipped */
1729                 if(((NdefMap->StdMifareContainer.currentBlock + 1) % 
1730                     PH_FRINFC_MIFARESTD_BLOCK_BYTES) == 0)
1731                 {
1732                     NdefMap->StdMifareContainer.currentBlock++;                 
1733                 }
1734                 else
1735                 {
1736                     if(NdefMap->StdMifareContainer.aid[SectorID] == 
1737                             PH_FRINFC_MIFARESTD_NDEF_COMP)
1738                     {
1739                         /* Check whether the block is first block of a (next)new sector and 
1740                             also check if it is first block then internal length is zero 
1741                             or not. Because once Authentication is done for the sector again 
1742                             we should not authenticate it again */
1743                         /* In this case 32 sectors contains 4 blocks and next remaining 8 sectors
1744                             contains 16 blocks that is why (32 * 4) + (sectorID - 32) *16*/
1745                         if((NdefMap->StdMifareContainer.currentBlock == 
1746                             ((PH_FRINFC_MIFARESTD_SECTOR_NO32 * PH_FRINFC_MIFARESTD_BLK4) + 
1747                             ((SectorID - PH_FRINFC_MIFARESTD_SECTOR_NO32) * PH_FRINFC_MIFARESTD_BLOCK_BYTES))) &&
1748                             (NdefMap->StdMifareContainer.internalLength == 0))
1749                         {
1750                             NdefMap->StdMifareContainer.AuthDone = 0;
1751                         }   
1752                         callbreak = 1;
1753                     }
1754                     else
1755                     {
1756                         NdefMap->StdMifareContainer.currentBlock += 16;
1757                     }
1758                 }
1759             }
1760         }
1761         if(callbreak == 1)
1762         {
1763             break;
1764         }
1765     }
1766
1767     return Result;
1768 }
1769
1770 static uint8_t phFriNfc_MifStd_H_GetSect(uint8_t  BlockNumber)
1771 {
1772     uint8_t SectorID = 0;
1773
1774     if(BlockNumber >= PH_FRINFC_MIFARESTD4K_BLK128)
1775     {
1776         SectorID = (uint8_t)(PH_FRINFC_MIFARESTD_SECTOR_NO32 + 
1777                     ((BlockNumber - PH_FRINFC_MIFARESTD4K_BLK128)/
1778                     PH_FRINFC_MIFARESTD_BLOCK_BYTES));
1779     }
1780     else
1781     {
1782         SectorID = (BlockNumber/PH_FRINFC_MIFARESTD_BLK4);
1783     }
1784     return SectorID;
1785 }
1786
1787 static NFCSTATUS phFriNfc_MifStd_H_RdAcsBit(phFriNfc_NdefMap_t *NdefMap)
1788 {
1789     NFCSTATUS Result = NFCSTATUS_SUCCESS;
1790     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_ACS_BIT;
1791
1792     if(NdefMap->StdMifareContainer.ReadAcsBitFlag == PH_FRINFC_MIFARESTD_FLAG1)
1793     {
1794         /* Get the sector trailer */
1795         ((NdefMap->StdMifareContainer.currentBlock > 127)?
1796             phFriNfc_MifStd_H_Get4kStTrail(NdefMap):
1797             phFriNfc_MifStd_H_Get1kStTrail(NdefMap));
1798     }
1799     else
1800     {
1801         /* Give the current block to read */
1802         NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
1803                         NdefMap->StdMifareContainer.currentBlock;
1804     }
1805     
1806     Result = phFriNfc_MifStd_H_Rd16Bytes(NdefMap, 
1807                         NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0]);
1808     
1809     return Result;
1810 }
1811
1812 static NFCSTATUS phFriNfc_MifStd_H_ChkAcsBit(phFriNfc_NdefMap_t *NdefMap)
1813 {
1814     NFCSTATUS Result = NFCSTATUS_SUCCESS;
1815
1816     /* Blocks from 0 to 3 and from 64 to 67(MAD blocks) */
1817     if((NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK0) || 
1818         (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK1) || 
1819         (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK2) || 
1820         (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK3) || 
1821         (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK64) ||  
1822         (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK65) || 
1823         (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK66) )
1824     {
1825         /* Access bits check removed for the MAD blocks */
1826 #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD
1827
1828         if(((NdefMap->SendRecvBuf[ 
1829             PH_FRINFC_MIFARESTD_VAL6] & 
1830             PH_FRINFC_MIFARESTD_MASK_FF) == 
1831             PH_FRINFC_MIFARESTD_MADSECT_ACS_BYTE6) && 
1832             ((NdefMap->SendRecvBuf[ 
1833             PH_FRINFC_MIFARESTD_VAL7] & 
1834             PH_FRINFC_MIFARESTD_MASK_FF) == 
1835             PH_FRINFC_MIFARESTD_MADSECT_ACS_BYTE7) && 
1836             ((NdefMap->SendRecvBuf[ 
1837             PH_FRINFC_MIFARESTD_VAL8] & 
1838             PH_FRINFC_MIFARESTD_MASK_FF) == 
1839             PH_FRINFC_MIFARESTD_ACS_BYTE8))
1840         {               
1841             NdefMap->StdMifareContainer.WriteFlag = 
1842                 PH_FRINFC_MIFARESTD_FLAG0;
1843             NdefMap->StdMifareContainer.ReadFlag = 
1844                 PH_FRINFC_MIFARESTD_FLAG1;
1845         }
1846         else
1847         {
1848             NdefMap->StdMifareContainer.WriteFlag = 
1849                 PH_FRINFC_MIFARESTD_FLAG0;
1850             NdefMap->StdMifareContainer.ReadFlag = 
1851                 PH_FRINFC_MIFARESTD_FLAG0;
1852         }
1853
1854 #else /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
1855     
1856         NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INITIALIZED;
1857
1858 #endif /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
1859     }
1860     else
1861     {
1862         /* Check for Access bytes 6, 7 and 8 value = 
1863             0x7F, 0x07, 0x88 NFC forum sectors*/
1864         if(((NdefMap->SendRecvBuf[ 
1865             PH_FRINFC_MIFARESTD_VAL6] & 
1866             PH_FRINFC_MIFARESTD_MASK_FF) == 
1867             PH_FRINFC_MIFARESTD_NFCSECT_ACS_BYTE6) && 
1868             ((NdefMap->SendRecvBuf[ 
1869             PH_FRINFC_MIFARESTD_VAL7] & 
1870             PH_FRINFC_MIFARESTD_MASK_FF) == 
1871             PH_FRINFC_MIFARESTD_NFCSECT_ACS_BYTE7) && 
1872             ((NdefMap->SendRecvBuf[ 
1873             PH_FRINFC_MIFARESTD_VAL8] & 
1874             PH_FRINFC_MIFARESTD_MASK_FF) == 
1875             PH_FRINFC_MIFARESTD_ACS_BYTE8))
1876         {               
1877             NdefMap->StdMifareContainer.WriteFlag = 
1878                 PH_FRINFC_MIFARESTD_FLAG1;
1879             NdefMap->StdMifareContainer.ReadFlag = 
1880                 PH_FRINFC_MIFARESTD_FLAG1;
1881         }
1882         else if(((NdefMap->SendRecvBuf[ 
1883             PH_FRINFC_MIFARESTD_VAL6] & 
1884             PH_FRINFC_MIFARESTD_MASK_FF) == 
1885             PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE6) && 
1886             ((NdefMap->SendRecvBuf[
1887             PH_FRINFC_MIFARESTD_VAL7] & 
1888             PH_FRINFC_MIFARESTD_MASK_FF) == 
1889             PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE7) && 
1890             ((NdefMap->SendRecvBuf[ 
1891             PH_FRINFC_MIFARESTD_VAL8] & 
1892             PH_FRINFC_MIFARESTD_MASK_FF) == 
1893             PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE8))
1894         {
1895             /* Read Only state */
1896             /* Check for Access bytes 6, 7 and 8 value = 
1897                 0x55, 0xAD, 0x2A NFC forum Sectors*/
1898             NdefMap->StdMifareContainer.WriteFlag = 
1899                 PH_FRINFC_MIFARESTD_FLAG0;
1900             NdefMap->StdMifareContainer.ReadFlag = 
1901                 PH_FRINFC_MIFARESTD_FLAG1;
1902         }
1903         else
1904         {
1905             NdefMap->StdMifareContainer.WriteFlag = 
1906                 PH_FRINFC_MIFARESTD_FLAG0;
1907             NdefMap->StdMifareContainer.ReadFlag = 
1908                 PH_FRINFC_MIFARESTD_FLAG0;
1909         }
1910
1911 #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD
1912     
1913         /* Do nothing */
1914
1915 #else /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
1916
1917         Result = phFriNfc_MifStd_H_GPBChk(NdefMap);
1918
1919 #endif /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
1920
1921     }
1922
1923 #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD
1924
1925     Result = phFriNfc_MifStd_H_GPBChk(NdefMap);
1926
1927 #endif /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
1928
1929     return Result;
1930 }
1931
1932 static NFCSTATUS phFriNfc_MifStd_H_ChkRdWr(phFriNfc_NdefMap_t *NdefMap)
1933 {
1934     NFCSTATUS Result = NFCSTATUS_SUCCESS;
1935     switch(NdefMap->PrevOperation)
1936     {
1937         case PH_FRINFC_NDEFMAP_CHECK_OPE:
1938             if(NdefMap->CardState == 
1939                 PH_NDEFMAP_CARD_STATE_INVALID)
1940             {
1941                     /* No permission to read */
1942                 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP, 
1943                                     NFCSTATUS_READ_FAILED);
1944             }
1945             else if((NdefMap->StdMifareContainer.currentBlock > 3) &&
1946                 (NdefMap->StdMifareContainer.ChkNdefCompleteFlag ==
1947                                     PH_FRINFC_MIFARESTD_FLAG1) &&
1948                 (NdefMap->StdMifareContainer.currentBlock != 
1949                             PH_FRINFC_MIFARESTD_MAD_BLK65) &&
1950                 (NdefMap->StdMifareContainer.currentBlock != 
1951                             PH_FRINFC_MIFARESTD_MAD_BLK66))
1952             {
1953                /* NdefMap->StdMifareContainer.currentBlock =
1954                     ((NdefMap->StdMifareContainer.ReadCompleteFlag == 
1955                         PH_FRINFC_MIFARESTD_FLAG1)?
1956                         NdefMap->StdMifareContainer.currentBlock:
1957                         (NdefMap->StdMifareContainer.currentBlock + 
1958                         PH_FRINFC_MIFARESTD_VAL4));
1959                 NdefMap->StdMifareContainer.currentBlock = 
1960                     ((NdefMap->StdMifareContainer.currentBlock == 
1961                         PH_FRINFC_MIFARESTD_MAD_BLK64)?
1962                     (NdefMap->StdMifareContainer.currentBlock + 
1963                     PH_FRINFC_MIFARESTD_VAL4):
1964                     NdefMap->StdMifareContainer.currentBlock);*/
1965
1966                     Result = ((NdefMap->StdMifareContainer.ReadAcsBitFlag == 
1967                                 PH_FRINFC_MIFARESTD_FLAG0)?
1968                                 phFriNfc_MifStd_H_RdAcsBit(NdefMap):
1969                                 phFriNfc_MifStd_H_AuthSector(NdefMap));             
1970             }
1971             else
1972             {
1973                 Result = phFriNfc_MifareStdMap_ChkNdef(NdefMap);
1974             }
1975             break;
1976
1977         case PH_FRINFC_NDEFMAP_READ_OPE:
1978             if(NdefMap->CardState == 
1979                 PH_NDEFMAP_CARD_STATE_INVALID)
1980             {
1981                 /* No permission to Read */
1982                 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP, 
1983                                     NFCSTATUS_READ_FAILED);
1984             }
1985             else if(NdefMap->StdMifareContainer.ReadNdefFlag == 
1986                     PH_FRINFC_MIFARESTD_FLAG1)
1987             {
1988                 Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
1989             }
1990             else
1991             {
1992                 Result = phFriNfc_MifStd_H_RdABlock(NdefMap);
1993             }
1994             break;
1995
1996         case PH_FRINFC_NDEFMAP_WRITE_OPE:
1997             if((NdefMap->CardState == 
1998                 PH_NDEFMAP_CARD_STATE_INVALID) || 
1999                 (NdefMap->CardState == 
2000                 PH_NDEFMAP_CARD_STATE_READ_ONLY))
2001             {
2002                 /* No permission to Read */
2003                 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP, 
2004                                     NFCSTATUS_WRITE_FAILED);
2005             }
2006             else if(NdefMap->StdMifareContainer.WrNdefFlag == 
2007                     PH_FRINFC_MIFARESTD_FLAG1)
2008             {
2009                 Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
2010             }
2011             else if(NdefMap->StdMifareContainer.RdBeforeWrFlag == 
2012                     PH_FRINFC_MIFARESTD_FLAG1)
2013             {
2014                 /*NdefMap->StdMifareContainer.ReadFlag = 
2015                                 PH_FRINFC_MIFARESTD_FLAG0;*/
2016                 Result = phFriNfc_MifStd_H_RdBeforeWr(NdefMap);
2017             }
2018             else if(NdefMap->StdMifareContainer.RdAfterWrFlag == 
2019                     PH_FRINFC_MIFARESTD_FLAG1)
2020             {
2021                 Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
2022             }
2023             else
2024             {
2025                 Result = (((NdefMap->TLVStruct.NdefTLVBlock == 
2026                             NdefMap->StdMifareContainer.currentBlock) && 
2027                             (NdefMap->Offset == 
2028                             PH_FRINFC_NDEFMAP_SEEK_BEGIN))?
2029                             phFriNfc_MifStd_H_RdBeforeWr(NdefMap):
2030                             phFriNfc_MifStd_H_WrABlock(NdefMap));
2031             }
2032             break;
2033
2034         case PH_FRINFC_NDEFMAP_GET_ACTSIZE_OPE:
2035             Result = ((NdefMap->StdMifareContainer.ReadFlag == 
2036                         PH_FRINFC_MIFARESTD_FLAG0)?
2037                         (PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP, 
2038                         NFCSTATUS_READ_FAILED)):
2039                         phFriNfc_MifStd_H_GetActCardLen(NdefMap));
2040             break;
2041
2042         default:
2043             /* Operation is not correct */
2044             Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP, 
2045                                 NFCSTATUS_INVALID_PARAMETER);
2046             
2047             break;
2048     }
2049     return Result;
2050 }
2051
2052 static void phFriNfc_MifStd_H_ChkNdefCmpltSects(phFriNfc_NdefMap_t *NdefMap)
2053 {
2054     uint8_t index = 0;
2055     if(NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD)
2056     {
2057         for(index = 0; index < PH_FRINFC_MIFARESTD4K_TOTAL_SECTOR; index++)
2058         {
2059             /* For Mifare 4k, Block 0 to 31 contains 4 blocks */
2060             /* sector 0 and 15 are aid blocks */
2061             if(index != PH_FRINFC_MIFARESTD_SECTOR_NO16)
2062             {
2063                 if(( (index < 32) && (index != PH_FRINFC_MIFARESTD_SECTOR_NO0)) 
2064                 && (NdefMap->StdMifareContainer.aid[index] == 
2065                             PH_FRINFC_MIFARESTD_NON_NDEF_COMP))
2066                 {
2067                     /* Only 3 blocks can be read/written till sector 31 */
2068                     NdefMap->StdMifareContainer.NoOfNdefCompBlocks -= 
2069                                                 PH_FRINFC_MIFARESTD_MAD_BLK3;
2070                     
2071                 }
2072                 else
2073                 {
2074                     /* For Mifare 4k, Block 32 to 39 contains 16 blocks */
2075                     if(NdefMap->StdMifareContainer.aid[index] == 
2076                         PH_FRINFC_MIFARESTD_NON_NDEF_COMP) 
2077                     {
2078                         /* Only 15 blocks can be read/written from sector 31 */
2079                         NdefMap->StdMifareContainer.NoOfNdefCompBlocks -= 
2080                                                 PH_FRINFC_MIFARESTD_BLK15;
2081                     }
2082                 }
2083             }
2084         } /* For index > 40 */
2085     }
2086     else
2087     {
2088         for(index = PH_FRINFC_MIFARESTD_SECTOR_NO1; 
2089             index < PH_FRINFC_MIFARESTD_SECTOR_NO16; index++)
2090         {
2091             if(NdefMap->StdMifareContainer.aid[index] == 
2092                 PH_FRINFC_MIFARESTD_NON_NDEF_COMP) 
2093             {
2094                 /*  Only three blocks can be read/written in 
2095                     a sector. So if a sector is non-ndef 
2096                     compliant, decrement 3 */
2097                 NdefMap->StdMifareContainer.NoOfNdefCompBlocks -= 
2098                                         PH_FRINFC_MIFARESTD_MAD_BLK3;
2099             }
2100         }
2101     }
2102 }
2103
2104 #if 0
2105 static uint8_t phFriNfc_MifStd_H_ChkNdefLen(phFriNfc_NdefMap_t *NdefMap,
2106                                         uint8_t             NDEFlength,
2107                                         uint8_t             *CRFlag)
2108 {
2109     uint8_t     NoLengthBytesinTLV = 0,
2110                 TempBuffer[16] = {0};
2111     uint16_t    TempLength = 0;
2112
2113     TempLength = ((NdefMap->StdMifareContainer.internalLength > 0)?
2114                 NdefMap->StdMifareContainer.internalLength : 
2115                 PH_FRINFC_MIFARESTD_BYTES_READ);
2116
2117     if(NdefMap->StdMifareContainer.internalLength > 0)
2118     {
2119         (void)memcpy( TempBuffer,
2120                 NdefMap->StdMifareContainer.internalBuf,
2121                 TempLength);
2122     }
2123     else
2124     {
2125         (void)memcpy( TempBuffer,
2126                 NdefMap->SendRecvBuf,
2127                 TempLength);
2128     }
2129     
2130     /* if number of bytes for length (L) in TLV is greater than 0*/
2131     if(NdefMap->TLVStruct.NoLbytesinTLV != PH_FRINFC_MIFARESTD_VAL0)
2132     {
2133         switch(NdefMap->TLVStruct.NoLbytesinTLV)
2134         {
2135             /* there are two bytes remaining in the length (L) of TLV */
2136             case PH_FRINFC_MIFARESTD_VAL2:
2137                 NoLengthBytesinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES2;
2138                 /* Get the value of the length (L) of the TLV */
2139                 NdefMap->TLVStruct.BytesRemainLinTLV = *TempBuffer;
2140                 NdefMap->TLVStruct.BytesRemainLinTLV = 
2141                         ((NdefMap->TLVStruct.BytesRemainLinTLV 
2142                         << PH_FRINFC_MIFARESTD_LEFTSHIFT8) + (TempBuffer[ 
2143                         PH_FRINFC_MIFARESTD_INC_1]));
2144
2145                 *CRFlag = (uint8_t)((NdefMap->TLVStruct.BytesRemainLinTLV < 
2146                             PH_FRINFC_MIFARESTD_NDEFTLV_L)?
2147                             PH_FRINFC_MIFARESTD_FLAG1 : 
2148                             PH_FRINFC_MIFARESTD_FLAG0);
2149                 NdefMap->TLVStruct.BytesRemainLinTLV = ((*CRFlag == 
2150                                     PH_FRINFC_MIFARESTD_FLAG1)?
2151                                     PH_FRINFC_MIFARESTD_VAL0:
2152                                     NdefMap->TLVStruct.BytesRemainLinTLV);
2153                 break;
2154
2155             /* there is only one byte remaining in the length (L) of TLV */
2156             case PH_FRINFC_MIFARESTD_VAL1:
2157                 NoLengthBytesinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES1;
2158                 /* Get the value of the length (L) of the TLV */
2159                 NdefMap->TLVStruct.BytesRemainLinTLV = 
2160                             NdefMap->TLVStruct.prevLenByteValue;
2161
2162                 NdefMap->TLVStruct.BytesRemainLinTLV = 
2163                         ((NdefMap->TLVStruct.BytesRemainLinTLV 
2164                         << PH_FRINFC_MIFARESTD_LEFTSHIFT8) + (*TempBuffer));
2165                 *CRFlag = (uint8_t)((NdefMap->TLVStruct.BytesRemainLinTLV < 
2166                             PH_FRINFC_MIFARESTD_NDEFTLV_L)?
2167                             PH_FRINFC_MIFARESTD_FLAG1 : 
2168                             PH_FRINFC_MIFARESTD_FLAG0); 
2169
2170                 NdefMap->TLVStruct.BytesRemainLinTLV = ((*CRFlag == 
2171                                     PH_FRINFC_MIFARESTD_FLAG1)?
2172                                     PH_FRINFC_MIFARESTD_VAL0:
2173                                     NdefMap->TLVStruct.BytesRemainLinTLV);
2174                 break;
2175
2176             default:
2177                 break;
2178         }
2179         NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
2180         NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2181         NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2182     }
2183     else if(TempBuffer[NDEFlength] < 
2184                 PH_FRINFC_MIFARESTD_NDEFTLV_L)
2185     {
2186         NoLengthBytesinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES1;
2187         /* Get the value of the length (L) of the TLV */
2188         NdefMap->TLVStruct.BytesRemainLinTLV = 
2189                                 TempBuffer[NDEFlength];
2190                 
2191         /* if NDEFLength has reached 16 bytes, then the next coming byte is not of type in TLV  */
2192         NdefMap->TLVStruct.TcheckedinTLVFlag = (((NDEFlength + PH_FRINFC_MIFARESTD_INC_1) 
2193                                                     == PH_FRINFC_MIFARESTD_BYTES_READ)?
2194                                                     PH_FRINFC_MIFARESTD_FLAG1 : 
2195                                                     PH_FRINFC_MIFARESTD_FLAG0);
2196         /* if NDEFLength has reached 16 bytes, then the next coming byte is not of length in TLV */
2197         NdefMap->TLVStruct.LcheckedinTLVFlag = (((NDEFlength + PH_FRINFC_MIFARESTD_INC_1) 
2198                                                         == PH_FRINFC_MIFARESTD_BYTES_READ)?
2199                                                         PH_FRINFC_MIFARESTD_FLAG1 : 
2200                                                         PH_FRINFC_MIFARESTD_FLAG0);
2201     }
2202     else
2203     {
2204         if((NDEFlength + PH_FRINFC_MIFARESTD_INC_1) 
2205             == PH_FRINFC_MIFARESTD_BYTES_READ)
2206         {
2207             NoLengthBytesinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES1;
2208             /* Number of bytes left for length (L) field in TLV */ 
2209             NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_MIFARESTD_VAL2;
2210             /* if NDEFLength has reached 16 bytes, then the next coming byte is not of type in TLV  */
2211             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
2212             NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2213         }
2214         else if((NDEFlength + PH_FRINFC_MIFARESTD_INC_2) 
2215                 == PH_FRINFC_MIFARESTD_BYTES_READ)
2216         {
2217             NoLengthBytesinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES2;
2218             /* Number of bytes left for length (L) field in TLV */ 
2219             NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_MIFARESTD_VAL1;
2220             /* if NDEFLength has reached 16 bytes, then the next byte is not of type in TLV  */
2221             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
2222             NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2223             /* copy the value of the length field */
2224             NdefMap->TLVStruct.prevLenByteValue = 
2225                 NdefMap->SendRecvBuf[(NDEFlength + PH_FRINFC_MIFARESTD_INC_1)];
2226         }
2227         else
2228         {
2229             /* if NDEFLength has reached 16 bytes, then the next byte is not of type in TLV  */
2230             NdefMap->TLVStruct.TcheckedinTLVFlag = (((NDEFlength + PH_FRINFC_MIFARESTD_INC_3) 
2231                                                         == PH_FRINFC_MIFARESTD_BYTES_READ)?
2232                                                         PH_FRINFC_MIFARESTD_FLAG1 : 
2233                                                         PH_FRINFC_MIFARESTD_FLAG0);
2234
2235             /* if NDEFLength has reached 16 bytes, then the next byte is not of length in TLV */
2236             NdefMap->TLVStruct.LcheckedinTLVFlag = (((NDEFlength + PH_FRINFC_MIFARESTD_INC_1) 
2237                                                             == PH_FRINFC_MIFARESTD_BYTES_READ)?
2238                                                             PH_FRINFC_MIFARESTD_FLAG1 : 
2239                                                             PH_FRINFC_MIFARESTD_FLAG0);
2240
2241             /* Number of bytes left for length (L) field in TLV */ 
2242             NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_MIFARESTD_VAL0;
2243
2244             NoLengthBytesinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES3;
2245             /* Get the value of the length (L) of the TLV */
2246             NdefMap->TLVStruct.BytesRemainLinTLV = 
2247                                             TempBuffer[(NDEFlength +
2248                                             PH_FRINFC_MIFARESTD_INC_1)];
2249
2250             NdefMap->TLVStruct.BytesRemainLinTLV = 
2251                     ((NdefMap->TLVStruct.BytesRemainLinTLV 
2252                     << PH_FRINFC_MIFARESTD_LEFTSHIFT8) + TempBuffer[ 
2253                     (NDEFlength +PH_FRINFC_MIFARESTD_INC_2)]);
2254             
2255             *CRFlag = (uint8_t)((NdefMap->TLVStruct.BytesRemainLinTLV < 
2256                             PH_FRINFC_MIFARESTD_NDEFTLV_L)?
2257                             PH_FRINFC_MIFARESTD_FLAG1 : 
2258                             PH_FRINFC_MIFARESTD_FLAG0);
2259         }
2260     }
2261     return NoLengthBytesinTLV;
2262 }
2263 #endif
2264 #if 0
2265 static NFCSTATUS phFriNfc_MifStd_H_RdNdefTLV(phFriNfc_NdefMap_t *NdefMap,
2266                                          uint8_t            *Temp16Bytes)
2267 {
2268     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
2269     uint8_t     NDEFlength = 0,
2270                 RdFlag = 0,
2271                 CRFlag = 0;
2272     uint16_t    RemainingBytes = 0;
2273
2274     while(PH_FRINFC_MIFARESTD_FLAG1 == NdefMap->TLVStruct.NdefTLVFoundFlag)
2275     {
2276         RemainingBytes = ((uint16_t)NdefMap->ApduBufferSize - 
2277                             NdefMap->ApduBuffIndex);
2278         if((((  NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
2279             NdefMap->StdMifareContainer.NdefBlocks) * 
2280             PH_FRINFC_MIFARESTD_BLOCK_BYTES) + 
2281             PH_FRINFC_MIFARESTD_BLOCK_BYTES) < 
2282             RemainingBytes)
2283         {
2284             /* If the user Buffer is greater than the Card Size
2285                 set LastBlockFlag = 1. This Flag is used to read bytes
2286                 till the end of the card only */
2287             RemainingBytes = ((( NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
2288                                 NdefMap->StdMifareContainer.NdefBlocks) * 16) + 
2289                                 NdefMap->StdMifareContainer.internalLength);
2290            
2291         }
2292         /* Ndef TLV flag to 0 */
2293         NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
2294         
2295         if((NdefMap->TLVStruct.TcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1) && 
2296             (NdefMap->TLVStruct.LcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1) && 
2297             (NdefMap->TLVStruct.NoLbytesinTLV != PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0))
2298         {
2299             CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2300             break;
2301         }
2302
2303         /* if type (T) of TLV flag is not set then only the below check is valid 
2304             because, for eg. assume, type (T) of TLV flag is set then this means 
2305             that it is already checked from the previous 16 bytes data (T is the 
2306             last byte of 16 bytes */
2307         if(NdefMap->TLVStruct.TcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1)
2308         {
2309             CRFlag = ((NdefMap->SendRecvBuf[(*Temp16Bytes)]!= 
2310                         PH_FRINFC_MIFARESTD_NDEFTLV_T)?
2311                         PH_FRINFC_MIFARESTD_FLAG1:
2312                         PH_FRINFC_MIFARESTD_FLAG0);
2313
2314             if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
2315             {
2316                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = 
2317                                     PH_FRINFC_MIFARESTD_FLAG1;
2318                 RdFlag = PH_FRINFC_MIFARESTD_FLAG1;
2319                 break;
2320             }
2321             /* skip Type T of the TLV */
2322             *Temp16Bytes += PH_FRINFC_MIFARESTD_INC_1;
2323         }
2324         else
2325         {
2326             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2327         }
2328         
2329         if((*Temp16Bytes + PH_FRINFC_MIFARESTD_VAL1) == PH_FRINFC_MIFARESTD_BYTES_READ)
2330         {
2331             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
2332             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
2333             /* 16 bytes completed */
2334             NdefMap->StdMifareContainer.currentBlock++;
2335             NdefMap->StdMifareContainer.NdefBlocks++;
2336             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
2337             if(Result == NFCSTATUS_SUCCESS)
2338             {
2339                 if(NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)
2340                 {
2341                     Result = phFriNfc_MifStd_H_RdABlock(NdefMap);
2342                 }
2343                 else
2344                 {
2345                     Result = phFriNfc_MifStd_H_AuthSector(NdefMap);
2346                 }
2347             }               
2348             break;
2349         }
2350         /* skip number of bytes taken by L in TLV, if L is already read */
2351         if(NdefMap->TLVStruct.LcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1)
2352         {
2353             /*CRFlag = (((*(NdefMap->SendRecvBuf + *Temp16Bytes) == 
2354                         PH_FRINFC_MIFARESTD_NDEFTLV_L0) && 
2355                         (NdefMap->TLVStruct.NoLbytesinTLV == 
2356                         PH_FRINFC_MIFARESTD_VAL0))?
2357                         PH_FRINFC_MIFARESTD_FLAG1:
2358                         PH_FRINFC_MIFARESTD_FLAG0);*/
2359
2360             NDEFlength = *Temp16Bytes;
2361             *Temp16Bytes += phFriNfc_MifStd_H_ChkNdefLen(NdefMap,
2362                                                             NDEFlength,
2363                                                             &CRFlag);
2364             if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
2365             {
2366                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = 
2367                                     PH_FRINFC_MIFARESTD_FLAG1;
2368                 break;
2369             }
2370
2371         }
2372         else
2373         {
2374             NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2375         }
2376
2377         if(*Temp16Bytes == PH_FRINFC_MIFARESTD_BYTES_READ)
2378         {
2379             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
2380             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
2381             /* 16 bytes completed */
2382             NdefMap->StdMifareContainer.currentBlock++;
2383             NdefMap->StdMifareContainer.NdefBlocks++;
2384             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
2385             if(Result == NFCSTATUS_SUCCESS)
2386             {
2387                 if(NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)
2388                 {
2389                     Result = phFriNfc_MifStd_H_RdABlock(NdefMap);
2390                 }
2391                 else
2392                 {
2393                     Result = phFriNfc_MifStd_H_AuthSector(NdefMap);
2394                 }
2395             }               
2396             break;
2397         }
2398
2399         if((NdefMap->TLVStruct.BytesRemainLinTLV <=  
2400             (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes)) && 
2401             (RemainingBytes <= 
2402                 NdefMap->TLVStruct.BytesRemainLinTLV))
2403         {
2404             /* Copy data to user buffer */
2405             (void)memcpy(&(NdefMap->ApduBuffer[
2406                     NdefMap->ApduBuffIndex]),
2407                     &(NdefMap->SendRecvBuf[ 
2408                     (*Temp16Bytes)]),
2409                     RemainingBytes);
2410             NdefMap->ApduBuffIndex += RemainingBytes;
2411             *Temp16Bytes += ((uint8_t)RemainingBytes);
2412             NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
2413             
2414             if(NdefMap->TLVStruct.BytesRemainLinTLV == 0)
2415             {
2416                 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
2417                 NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2418                 NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2419             }
2420             else
2421             {
2422                 /* copy the bytes to internal buffer that are read, 
2423                     but not used for the user buffer */
2424                 (void)memcpy(NdefMap->StdMifareContainer.internalBuf,
2425                     &(NdefMap->SendRecvBuf[(*Temp16Bytes)]),
2426                     (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes));
2427                 
2428                 /* TempLength of the internal buffer */
2429                 NdefMap->StdMifareContainer.internalLength = 
2430                             (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes);
2431             }
2432             CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2433             break;
2434         }
2435         else if((NdefMap->TLVStruct.BytesRemainLinTLV <=  
2436             (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes)) && 
2437             (RemainingBytes > 
2438                 NdefMap->TLVStruct.BytesRemainLinTLV))
2439         {
2440             /* Copy data to user buffer */
2441             (void)memcpy(&(NdefMap->ApduBuffer[ 
2442                     NdefMap->ApduBuffIndex]),
2443                     &(NdefMap->SendRecvBuf[ 
2444                     (*Temp16Bytes)]),
2445                     NdefMap->TLVStruct.BytesRemainLinTLV);
2446             /* increment the user buffer index */
2447             NdefMap->ApduBuffIndex += NdefMap->TLVStruct.BytesRemainLinTLV;
2448             *Temp16Bytes += ((uint8_t)NdefMap->TLVStruct.BytesRemainLinTLV);
2449             NdefMap->TLVStruct.BytesRemainLinTLV = 0;
2450             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
2451             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2452             NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2453
2454             /* check for 16 bytes of data been used */
2455             if(*Temp16Bytes == PH_FRINFC_MIFARESTD_BYTES_READ)
2456             {
2457                 /* 16 bytes completed */
2458                 NdefMap->StdMifareContainer.currentBlock++;
2459                 NdefMap->StdMifareContainer.NdefBlocks++;
2460                 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
2461                 if(Result == NFCSTATUS_SUCCESS)
2462                 {
2463                     if(NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)
2464                     {
2465                         Result = phFriNfc_MifStd_H_RdABlock(NdefMap);
2466                     }
2467                     else
2468                     {
2469                         Result = phFriNfc_MifStd_H_AuthSector(NdefMap);
2470                     }
2471                 }
2472                 break;
2473             }
2474         }
2475         else if((NdefMap->TLVStruct.BytesRemainLinTLV >  
2476             (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes)) && 
2477             (RemainingBytes <= 
2478                 (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes)))
2479         {
2480             /* Copy data to user buffer */
2481             (void)memcpy(&(NdefMap->ApduBuffer[
2482                     NdefMap->ApduBuffIndex]),
2483                     &(NdefMap->SendRecvBuf[ 
2484                     (*Temp16Bytes)]),
2485                     RemainingBytes);
2486             NdefMap->ApduBuffIndex += RemainingBytes;
2487             NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
2488             if(RemainingBytes == (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes))
2489             {
2490                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
2491                     (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) || 
2492                     (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
2493                     PH_FRINFC_MIFARESTD_FLAG1:
2494                     PH_FRINFC_MIFARESTD_FLAG0);
2495                 
2496                 /* 16 bytes completed */
2497                 NdefMap->StdMifareContainer.currentBlock++;
2498                 NdefMap->StdMifareContainer.NdefBlocks++;
2499             }
2500             else
2501             {
2502                 /* copy the bytes to internal buffer, that are read, 
2503                     but not used for the user buffer */
2504                 (void)memcpy(NdefMap->StdMifareContainer.internalBuf,
2505                     &(NdefMap->SendRecvBuf[((*Temp16Bytes) + RemainingBytes)]),
2506                     (PH_FRINFC_MIFARESTD_BYTES_READ - 
2507                     (*Temp16Bytes + RemainingBytes)));
2508                 
2509                 /* Length of the internal buffer */
2510                 NdefMap->StdMifareContainer.internalLength = 
2511                             (PH_FRINFC_MIFARESTD_BYTES_READ - 
2512                             (*Temp16Bytes + RemainingBytes));
2513             }
2514             *Temp16Bytes += ((uint8_t)RemainingBytes);
2515             CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2516             break;
2517         }
2518         else 
2519         {
2520             if((NdefMap->TLVStruct.BytesRemainLinTLV >  
2521             (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes)) && 
2522             (RemainingBytes > 
2523                 (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes)))
2524             {
2525                 /* Copy data to user buffer */
2526                 (void)memcpy(&(NdefMap->ApduBuffer[ 
2527                         NdefMap->ApduBuffIndex]),
2528                         &(NdefMap->SendRecvBuf[ 
2529                         (*Temp16Bytes)]),
2530                         (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes));
2531                 NdefMap->ApduBuffIndex += (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes);
2532                 NdefMap->TLVStruct.BytesRemainLinTLV -= 
2533                             (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes);
2534                 *Temp16Bytes = PH_FRINFC_MIFARESTD_BYTES_READ;
2535                 
2536                 
2537                 /* 16 bytes completed */
2538                 NdefMap->StdMifareContainer.currentBlock++;
2539                 NdefMap->StdMifareContainer.NdefBlocks++;
2540                 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
2541                 if(Result == NFCSTATUS_SUCCESS)
2542                 {
2543                     Result = ((NdefMap->StdMifareContainer.AuthDone == 
2544                                 PH_FRINFC_MIFARESTD_FLAG1)?
2545                                 phFriNfc_MifStd_H_RdABlock(NdefMap):
2546                                 phFriNfc_MifStd_H_AuthSector(NdefMap));
2547                 }
2548                 break;
2549             }
2550         }
2551     }
2552
2553     if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
2554     {
2555         Result = (((RdFlag == PH_FRINFC_MIFARESTD_FLAG1) && 
2556                     (NdefMap->ApduBuffIndex == PH_FRINFC_MIFARESTD_VAL0))?
2557                     (PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP, 
2558                                 NFCSTATUS_EOF_CARD_REACHED)):
2559                     Result);
2560         *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
2561         phFriNfc_MifStd_H_Complete(NdefMap, Result);
2562     }
2563     return Result;
2564 }
2565 #endif
2566
2567 static NFCSTATUS phFriNfc_MifStd_H_RemainTLV(phFriNfc_NdefMap_t *NdefMap,
2568                                          uint8_t            *Flag,
2569                                          uint8_t            *Temp16Bytes)
2570 {
2571     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
2572     uint8_t     CRFlag = 0;
2573     uint16_t    RemainingBytes = 0;
2574
2575     RemainingBytes = ((uint16_t)NdefMap->ApduBufferSize - 
2576                             NdefMap->ApduBuffIndex);
2577
2578     if(NdefMap->StdMifareContainer.remainingSize < 
2579         RemainingBytes)
2580     {
2581         /* If the user Buffer is greater than the Card Size
2582             set LastBlockFlag = 1. This Flag is used to read bytes
2583             till the end of the card only */
2584         RemainingBytes = NdefMap->StdMifareContainer.remainingSize;
2585     }
2586
2587     /* Remaining Bytes of length (L) in TLV <=  16 */
2588     if((NdefMap->TLVStruct.BytesRemainLinTLV <= 
2589         (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))) && 
2590         (RemainingBytes <= NdefMap->TLVStruct.BytesRemainLinTLV))
2591     {
2592         /* Copy data to user buffer */
2593         (void)memcpy(&(NdefMap->ApduBuffer[ 
2594                 NdefMap->ApduBuffIndex]),
2595                 &(NdefMap->SendRecvBuf[
2596                 (*Temp16Bytes)]),
2597                 RemainingBytes);
2598         NdefMap->ApduBuffIndex += RemainingBytes;
2599         NdefMap->StdMifareContainer.remainingSize -= RemainingBytes;
2600         
2601         /* copy the bytes to internal buffer, that are read, 
2602                         but not used for the user buffer */
2603         if(RemainingBytes != NdefMap->TLVStruct.BytesRemainLinTLV)
2604         {
2605             (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
2606 #ifdef PH_HAL4_ENABLE
2607                     &(NdefMap->SendRecvBuf[((*Temp16Bytes) + RemainingBytes)]),
2608 #else
2609                     &(NdefMap->SendRecvBuf[RemainingBytes]),
2610 #endif /* #ifdef PH_HAL4_ENABLE */                    
2611                     ((PH_FRINFC_MIFARESTD_BYTES_READ - 
2612                     (*Temp16Bytes)) - RemainingBytes));     
2613
2614             /* internal buffer length */
2615             NdefMap->StdMifareContainer.internalLength = 
2616                     ((PH_FRINFC_MIFARESTD_BYTES_READ - 
2617                     (*Temp16Bytes)) - RemainingBytes);
2618         }
2619         *Temp16Bytes += ((uint8_t)RemainingBytes);
2620         /* Remaining Bytes of length value in TLV */
2621         NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
2622
2623         if(NdefMap->StdMifareContainer.internalLength == PH_FRINFC_MIFARESTD_VAL0)
2624         {
2625             NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
2626             (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) || 
2627             (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
2628             PH_FRINFC_MIFARESTD_FLAG1:
2629             PH_FRINFC_MIFARESTD_FLAG0);
2630         
2631             /* internal length bytes completed */
2632             NdefMap->StdMifareContainer.currentBlock++;
2633             NdefMap->StdMifareContainer.NdefBlocks++;
2634         }
2635         
2636         if(NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0)
2637         {
2638             /* Remaining Bytes of length (L) in TLV is Zero means that the next 
2639              coming bytes are containing type (T), length (L) in TLV */
2640             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
2641             NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2642             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2643         }
2644         /* call completion routine */
2645         CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2646         *Flag = PH_FRINFC_MIFARESTD_FLAG0;
2647     }
2648     else if((NdefMap->TLVStruct.BytesRemainLinTLV <= 
2649             (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))) && 
2650             (RemainingBytes > NdefMap->TLVStruct.BytesRemainLinTLV))
2651     {
2652         /* Copy data to user buffer */
2653         (void)memcpy(&(NdefMap->ApduBuffer[
2654                 NdefMap->ApduBuffIndex]),
2655                 &(NdefMap->SendRecvBuf[ 
2656                 (*Temp16Bytes)]),
2657                 NdefMap->TLVStruct.BytesRemainLinTLV);
2658         NdefMap->ApduBuffIndex += NdefMap->TLVStruct.BytesRemainLinTLV;
2659         NdefMap->StdMifareContainer.remainingSize -= 
2660                                 NdefMap->TLVStruct.BytesRemainLinTLV;
2661         NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
2662         *Temp16Bytes += ((uint8_t)NdefMap->TLVStruct.BytesRemainLinTLV);
2663         NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
2664
2665         *Flag = PH_FRINFC_MIFARESTD_FLAG1;
2666         
2667         NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2668         NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2669         /* 16 bytes completed */
2670         if(NdefMap->TLVStruct.BytesRemainLinTLV == 
2671             PH_FRINFC_MIFARESTD_BYTES_READ)
2672         {
2673             *Flag = PH_FRINFC_MIFARESTD_FLAG0;
2674             NdefMap->TLVStruct.BytesRemainLinTLV = 
2675                             PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
2676             NdefMap->StdMifareContainer.currentBlock++;
2677             NdefMap->StdMifareContainer.NdefBlocks++;
2678             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
2679             if(Result == NFCSTATUS_SUCCESS)
2680             {
2681                 if(NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)
2682                 {
2683                     Result = phFriNfc_MifStd_H_RdABlock(NdefMap);
2684                 }
2685                 else
2686                 {
2687                     Result = phFriNfc_MifStd_H_AuthSector(NdefMap);
2688                 }
2689             }
2690         }
2691         else
2692         {
2693             NdefMap->TLVStruct.BytesRemainLinTLV = 
2694                             PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
2695             /* The read operation has finished. so, completion routine
2696             can be called. set the Completion routine(CR) flag */
2697             CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2698         }
2699     }
2700     else if((NdefMap->TLVStruct.BytesRemainLinTLV > 
2701             (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))) && 
2702             (RemainingBytes <= (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))))
2703     {
2704         /* Copy data to user buffer */
2705         (void)memcpy(&(NdefMap->ApduBuffer[ 
2706                 NdefMap->ApduBuffIndex]),
2707                 &(NdefMap->SendRecvBuf[
2708                 (*Temp16Bytes)]),
2709                 RemainingBytes);
2710         NdefMap->ApduBuffIndex += RemainingBytes;
2711         NdefMap->StdMifareContainer.remainingSize -= RemainingBytes;
2712         
2713         /* Remaining Bytes of length (L) in TLV */
2714         NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
2715         /* 
2716             The below macro PH_HAL4_ENABLE is added because, 
2717             there is an error with the following sequence
2718             Read begin (for ex : with 10 bytes)
2719             Read current (for ex : with 10 bytes). Here error buffer 
2720             is returned
2721             Reason : During first read, internal buffer is updated 
2722                     with the wrong buffer values
2723             Actually, if we read the first block (means TLV block), it 
2724             contains even the TLV structure. so to copy the actual buffer, 
2725             the TLV shall be excluded
2726         */
2727 #ifdef PH_HAL4_ENABLE
2728         /* copy the bytes to internal buffer, that are read, 
2729                         but not used for the user buffer */
2730         (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
2731                 &(NdefMap->SendRecvBuf[(RemainingBytes + (*Temp16Bytes))]),
2732                 ((PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))
2733                 - RemainingBytes));
2734
2735         /* internal buffer length */
2736         NdefMap->StdMifareContainer.internalLength = 
2737                 ((PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes)) - RemainingBytes);        
2738 #else
2739         /* copy the bytes to internal buffer, that are read, 
2740                         but not used for the user buffer */
2741         (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
2742                 &(NdefMap->SendRecvBuf[RemainingBytes]),
2743                 ((PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))
2744                 - RemainingBytes));
2745
2746         /* internal buffer length */
2747         NdefMap->StdMifareContainer.internalLength = 
2748                 ((PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes)) - RemainingBytes);
2749 #endif /* #ifdef PH_HAL4_ENABLE */
2750         
2751         if(RemainingBytes == (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes)))
2752         {
2753             NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
2754                 (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) || 
2755                 (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
2756                 PH_FRINFC_MIFARESTD_FLAG1:
2757                 PH_FRINFC_MIFARESTD_FLAG0);
2758         
2759             /* internal length bytes completed */
2760             NdefMap->StdMifareContainer.currentBlock++;
2761             NdefMap->StdMifareContainer.NdefBlocks++;
2762         }
2763         *Temp16Bytes += ((uint8_t)RemainingBytes);
2764         NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
2765         CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2766         *Flag = PH_FRINFC_MIFARESTD_FLAG0;
2767     }
2768     else
2769     {
2770         if((NdefMap->TLVStruct.BytesRemainLinTLV > 
2771             (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))) && 
2772             (RemainingBytes > (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))))
2773         {
2774             *Flag = PH_FRINFC_MIFARESTD_FLAG0;
2775             /* Copy data to user buffer */
2776             (void)memcpy(&(NdefMap->ApduBuffer 
2777                     [NdefMap->ApduBuffIndex]),
2778                     &(NdefMap->SendRecvBuf[ 
2779                     (*Temp16Bytes)]),
2780                     (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes)));
2781             NdefMap->ApduBuffIndex += (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes));
2782             NdefMap->StdMifareContainer.remainingSize -= 
2783                                     (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes));
2784             NdefMap->TLVStruct.BytesRemainLinTLV -= (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes));
2785             *Temp16Bytes += (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes));
2786             if(NdefMap->TLVStruct.BytesRemainLinTLV != PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0)
2787             {
2788                 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
2789             }
2790             /* 16 bytes completed */
2791             NdefMap->StdMifareContainer.currentBlock++;
2792             NdefMap->StdMifareContainer.NdefBlocks++;
2793             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
2794             if(Result == NFCSTATUS_SUCCESS)
2795             {
2796                 Result = ((NdefMap->StdMifareContainer.AuthDone == 
2797                         PH_FRINFC_MIFARESTD_FLAG1)?
2798                         phFriNfc_MifStd_H_RdABlock(NdefMap):
2799                         phFriNfc_MifStd_H_AuthSector(NdefMap));
2800             }
2801         }
2802     }
2803
2804     if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
2805     {
2806         *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
2807         NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
2808             (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) || 
2809             (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
2810             PH_FRINFC_MIFARESTD_FLAG1:
2811             PH_FRINFC_MIFARESTD_FLAG0);
2812     }
2813
2814     return Result;
2815 }
2816
2817 static NFCSTATUS phFriNfc_MifStd_H_ChkIntLen(phFriNfc_NdefMap_t *NdefMap)
2818 {
2819     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
2820     uint8_t     NDEFFlag = PH_FRINFC_MIFARESTD_FLAG1;
2821     uint8_t     TempintBytes = 0;
2822
2823     if(NdefMap->TLVStruct.BytesRemainLinTLV != 0)
2824     {
2825         NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
2826         /* To read the remaining length (L) in TLV */
2827         Result = phFriNfc_MifStd_H_IntLenWioutNdef(NdefMap, &NDEFFlag, &TempintBytes);
2828     }
2829     NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
2830     /* check the NDEFFlag is set. if this is not set, then 
2831         in the above RemainTLV function all the 16 bytes has been 
2832         read */
2833 #if 0
2834     if((NDEFFlag == PH_FRINFC_MIFARESTD_FLAG1) && 
2835         (NdefMap->TLVStruct.NdefTLVFoundFlag == 
2836         PH_FRINFC_MIFARESTD_FLAG1))
2837     {
2838         /* if the block is NDEF TLV then get data from here */
2839         Result = phFriNfc_MifStd_H_IntLenWithNdef(NdefMap, &TempintBytes);
2840     }
2841 #endif
2842     return Result;
2843 }
2844
2845 static NFCSTATUS phFriNfc_MifStd_H_IntLenWioutNdef(phFriNfc_NdefMap_t *NdefMap,
2846                                             uint8_t            *Flag,
2847                                             uint8_t            *TempintBytes)
2848 {
2849     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
2850     uint8_t     CRFlag = 0;
2851     uint16_t    RemainingBytes = 0;
2852
2853     RemainingBytes = ((uint16_t)NdefMap->ApduBufferSize - 
2854                             NdefMap->ApduBuffIndex);
2855
2856     if(NdefMap->StdMifareContainer.remainingSize < 
2857         RemainingBytes)
2858     {
2859         /* If the user Buffer is greater than the Card Size
2860             set LastBlockFlag = 1. This Flag is used to read bytes
2861             till the end of the card only */
2862         RemainingBytes = NdefMap->StdMifareContainer.remainingSize;        
2863     }
2864
2865     /* Remaining Bytes of length (L) in TLV <=  internal length */
2866     if((NdefMap->TLVStruct.BytesRemainLinTLV <= 
2867         NdefMap->StdMifareContainer.internalLength) && 
2868         (RemainingBytes <= NdefMap->TLVStruct.BytesRemainLinTLV))
2869     {
2870         (void)memcpy(&(NdefMap->ApduBuffer[
2871                 NdefMap->ApduBuffIndex]),
2872                 &(NdefMap->StdMifareContainer.internalBuf[ 
2873                 (*TempintBytes)]),
2874                 RemainingBytes);
2875         NdefMap->ApduBuffIndex += RemainingBytes;
2876         NdefMap->StdMifareContainer.remainingSize -= RemainingBytes;
2877         *TempintBytes += ((uint8_t)RemainingBytes);
2878
2879         /* copy the bytes to internal buffer, that are read, 
2880                         but not used for the user buffer */
2881         (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
2882                 &(NdefMap->StdMifareContainer.internalBuf[RemainingBytes]),
2883                 (NdefMap->StdMifareContainer.internalLength - RemainingBytes));
2884
2885         /* internal buffer length */
2886         NdefMap->StdMifareContainer.internalLength -= RemainingBytes;
2887
2888         NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
2889         if(NdefMap->StdMifareContainer.internalLength == PH_FRINFC_MIFARESTD_VAL0)
2890         {
2891            NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
2892             (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) || 
2893             (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
2894             PH_FRINFC_MIFARESTD_FLAG1:
2895             PH_FRINFC_MIFARESTD_FLAG0);
2896         
2897             /* internal length bytes completed */
2898             NdefMap->StdMifareContainer.currentBlock++;
2899             NdefMap->StdMifareContainer.NdefBlocks++;
2900         }
2901         
2902         /* Remaining Bytes of length value in TLV */
2903         if(NdefMap->TLVStruct.BytesRemainLinTLV == 0)
2904         {
2905             /* Remaining Bytes of length (L) in TLV is Zero means that the next 
2906              coming bytes are containing type (T), length (L) in TLV */
2907             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
2908             NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2909             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2910         }
2911         /* call completion routine */
2912         CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2913         *Flag = PH_FRINFC_MIFARESTD_FLAG0;
2914     }
2915     else if((NdefMap->TLVStruct.BytesRemainLinTLV <= 
2916             NdefMap->StdMifareContainer.internalLength) && 
2917             (RemainingBytes > NdefMap->TLVStruct.BytesRemainLinTLV))
2918     {
2919         (void)memcpy(&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex]),
2920                 &(NdefMap->StdMifareContainer.internalBuf[(*TempintBytes)]),
2921                 NdefMap->TLVStruct.BytesRemainLinTLV);
2922
2923         NdefMap->ApduBuffIndex += NdefMap->TLVStruct.BytesRemainLinTLV;
2924         NdefMap->StdMifareContainer.remainingSize -= 
2925                     NdefMap->TLVStruct.BytesRemainLinTLV;
2926         NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
2927
2928         *TempintBytes += ((uint8_t)NdefMap->TLVStruct.BytesRemainLinTLV);
2929         *Flag = PH_FRINFC_MIFARESTD_FLAG1;
2930
2931         NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2932         NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2933
2934         NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
2935         NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
2936         (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) || 
2937             (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
2938             PH_FRINFC_MIFARESTD_FLAG1:
2939             PH_FRINFC_MIFARESTD_FLAG0);
2940 #ifdef PH_HAL4_ENABLE
2941
2942         if (PH_FRINFC_MIFARESTD_FLAG1 == 
2943             NdefMap->StdMifareContainer.ReadWriteCompleteFlag)
2944         {
2945             CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2946         }
2947
2948 #endif /* #ifdef PH_HAL4_ENABLE */
2949
2950         if( NdefMap->TLVStruct.BytesRemainLinTLV == 
2951             NdefMap->StdMifareContainer.internalLength)
2952         {
2953             /* Remaining Bytes in Length (L) field of TLV is 0 */
2954             NdefMap->TLVStruct.BytesRemainLinTLV = 
2955                             PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
2956             NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
2957             *Flag = PH_FRINFC_MIFARESTD_FLAG0;
2958             /* internal length bytes completed */
2959             NdefMap->StdMifareContainer.currentBlock++;
2960             NdefMap->StdMifareContainer.NdefBlocks++;
2961             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
2962             if(Result == NFCSTATUS_SUCCESS)
2963             {
2964                 Result = 
2965                 ((NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)?
2966                 phFriNfc_MifStd_H_RdABlock(NdefMap):
2967                 phFriNfc_MifStd_H_AuthSector(NdefMap));
2968             }
2969         }
2970         else
2971         {
2972             /* Remaining Bytes in Length (L) field of TLV is 0 */
2973             NdefMap->TLVStruct.BytesRemainLinTLV = 
2974                             PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
2975             *Flag = PH_FRINFC_MIFARESTD_FLAG1;
2976         }
2977     }
2978     else if((NdefMap->TLVStruct.BytesRemainLinTLV > 
2979             NdefMap->StdMifareContainer.internalLength) && 
2980             (RemainingBytes <= NdefMap->StdMifareContainer.internalLength))
2981     {
2982         (void)memcpy(&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex]),
2983                 &(NdefMap->StdMifareContainer.internalBuf[(*TempintBytes)]),
2984                 RemainingBytes);
2985
2986         NdefMap->ApduBuffIndex += RemainingBytes;
2987         NdefMap->StdMifareContainer.remainingSize -= 
2988                             RemainingBytes;
2989         *TempintBytes += ((uint8_t)RemainingBytes);
2990         /* Remaining Bytes of length (L) in TLV */
2991         NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
2992
2993         /* copy the bytes to internal buffer, that are read, 
2994                         but not used for the user buffer */
2995         (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
2996                 &(NdefMap->StdMifareContainer.internalBuf[RemainingBytes]),
2997                 (NdefMap->StdMifareContainer.internalLength - RemainingBytes));
2998
2999         /* internal buffer length */
3000         NdefMap->StdMifareContainer.internalLength -= RemainingBytes;
3001         if(NdefMap->StdMifareContainer.internalLength == PH_FRINFC_MIFARESTD_VAL0)
3002         {
3003             NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
3004             (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) || 
3005             (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
3006             PH_FRINFC_MIFARESTD_FLAG1:
3007             PH_FRINFC_MIFARESTD_FLAG0);
3008         
3009             /* internal length bytes completed */
3010             NdefMap->StdMifareContainer.currentBlock++;
3011             NdefMap->StdMifareContainer.NdefBlocks++;
3012         }
3013         
3014         NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
3015         CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3016         *Flag = PH_FRINFC_MIFARESTD_FLAG0;
3017     }
3018     else
3019     {
3020         if((NdefMap->TLVStruct.BytesRemainLinTLV > 
3021             NdefMap->StdMifareContainer.internalLength) && 
3022             (RemainingBytes > NdefMap->StdMifareContainer.internalLength))
3023         {
3024             (void)memcpy(&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex]),
3025                     &(NdefMap->StdMifareContainer.internalBuf[(*TempintBytes)]),
3026                     NdefMap->StdMifareContainer.internalLength);
3027             *Flag = PH_FRINFC_MIFARESTD_FLAG0;
3028             NdefMap->ApduBuffIndex += NdefMap->StdMifareContainer.internalLength;
3029             NdefMap->StdMifareContainer.remainingSize -= 
3030                                 NdefMap->StdMifareContainer.internalLength;
3031             NdefMap->TLVStruct.BytesRemainLinTLV -= NdefMap->StdMifareContainer.internalLength;
3032             
3033             if(NdefMap->TLVStruct.BytesRemainLinTLV != PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0)
3034             {
3035                 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
3036             }
3037
3038             NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
3039             /* internal length bytes completed */
3040             NdefMap->StdMifareContainer.currentBlock++;
3041             NdefMap->StdMifareContainer.NdefBlocks++;
3042             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3043             if(Result == NFCSTATUS_SUCCESS)
3044             {
3045                 Result = ((NdefMap->StdMifareContainer.AuthDone == 
3046                             PH_FRINFC_MIFARESTD_FLAG1)?
3047                             phFriNfc_MifStd_H_RdABlock(NdefMap):
3048                             phFriNfc_MifStd_H_AuthSector(NdefMap));
3049             }
3050         }
3051     }
3052
3053     if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
3054     {
3055         NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
3056         (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) || 
3057             (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
3058             PH_FRINFC_MIFARESTD_FLAG1:
3059             PH_FRINFC_MIFARESTD_FLAG0);
3060         *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
3061     }
3062     return Result;
3063 }
3064 #if 0
3065 static NFCSTATUS phFriNfc_MifStd_H_IntLenWithNdef(phFriNfc_NdefMap_t *NdefMap,
3066                                             uint8_t             *TempintBytes)
3067 {
3068     NFCSTATUS       Result = NFCSTATUS_SUCCESS;
3069     uint16_t        RemainingBytes = 0;
3070     uint8_t         CRFlag =  PH_FRINFC_MIFARESTD_FLAG0,
3071                     RdFlag = PH_FRINFC_MIFARESTD_FLAG0,
3072                     NDEFlength = 0;
3073
3074     RemainingBytes = (uint16_t)(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex);
3075     while(PH_FRINFC_MIFARESTD_FLAG1 == NdefMap->TLVStruct.NdefTLVFoundFlag)
3076     {
3077         NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
3078         RemainingBytes = ((uint16_t)NdefMap->ApduBufferSize - 
3079                         NdefMap->ApduBuffIndex);
3080         if((((  NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
3081             NdefMap->StdMifareContainer.NdefBlocks) * 
3082             PH_FRINFC_MIFARESTD_BLOCK_BYTES) + 
3083             (NdefMap->StdMifareContainer.internalLength - 
3084             *TempintBytes)) < 
3085             RemainingBytes)
3086         {
3087             /* If the user Buffer is greater than the Card Size
3088                 set LastBlockFlag = 1. This Flag is used to read bytes
3089                 till the end of the card only */
3090             RemainingBytes = ((( NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
3091                                 NdefMap->StdMifareContainer.NdefBlocks) * 16) + 
3092                                 (NdefMap->StdMifareContainer.internalLength - 
3093                                 *TempintBytes));
3094             
3095         }
3096
3097         if((NdefMap->TLVStruct.TcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1) && 
3098             (NdefMap->TLVStruct.LcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1) && 
3099             (NdefMap->TLVStruct.NoLbytesinTLV != PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0))
3100         {
3101             CRFlag = 1;
3102             break;
3103         }
3104
3105         /* if type (T) of TLV flag is not set then only the below check is valid 
3106             because, for eg. assume, type (T) of TLV flag is set then this means 
3107             that it is already checked from the previous internal bytes data (T is the 
3108             last byte of internal bytes */
3109         if(NdefMap->TLVStruct.TcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1)
3110         {
3111             CRFlag =(uint8_t) ((NdefMap->StdMifareContainer.internalBuf[(*TempintBytes)]!= 
3112                     PH_FRINFC_MIFARESTD_NDEFTLV_T)?
3113                     PH_FRINFC_MIFARESTD_FLAG1:
3114                     PH_FRINFC_MIFARESTD_FLAG0);
3115
3116             if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
3117             {
3118                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = 
3119                                     PH_FRINFC_MIFARESTD_FLAG1;
3120                 RdFlag = PH_FRINFC_MIFARESTD_FLAG1;
3121                 break;
3122             }
3123             /* skip Type T of the TLV */
3124             *TempintBytes += PH_FRINFC_MIFARESTD_INC_1;
3125         }
3126         else
3127         {
3128             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
3129         }
3130         
3131         if(*TempintBytes == NdefMap->StdMifareContainer.internalLength)
3132         {
3133             NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
3134             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
3135             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
3136             /* 16 bytes completed */
3137             NdefMap->StdMifareContainer.currentBlock++;
3138             NdefMap->StdMifareContainer.NdefBlocks++;
3139             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3140             if(Result == NFCSTATUS_SUCCESS)
3141             {
3142                 Result = 
3143                     ((NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)?
3144                     phFriNfc_MifStd_H_RdABlock(NdefMap):
3145                     phFriNfc_MifStd_H_AuthSector(NdefMap));
3146             }
3147             break;
3148         }
3149         
3150         /* skip number of bytes taken by L in TLV, if L is already read */
3151         if(NdefMap->TLVStruct.LcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1)
3152         {
3153             CRFlag = (uint8_t)((NdefMap->StdMifareContainer.internalBuf[(*TempintBytes)]== 
3154                     PH_FRINFC_MIFARESTD_NDEFTLV_L0)?
3155                     PH_FRINFC_MIFARESTD_FLAG1:
3156                     PH_FRINFC_MIFARESTD_FLAG0);
3157
3158             if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
3159             {
3160                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = 
3161                                     PH_FRINFC_MIFARESTD_FLAG1;
3162                 RdFlag = PH_FRINFC_MIFARESTD_FLAG1;
3163                 break;
3164             }
3165             NDEFlength = *TempintBytes;
3166             *TempintBytes += phFriNfc_MifStd_H_ChkNdefLen(NdefMap,
3167                                                             NDEFlength,
3168                                                             &CRFlag);
3169             if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
3170             {
3171                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = 
3172                                     PH_FRINFC_MIFARESTD_FLAG1;
3173                 RdFlag = PH_FRINFC_MIFARESTD_FLAG1;
3174                 break;
3175             }
3176         }
3177         else
3178         {
3179             NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
3180         }
3181
3182         if(*TempintBytes == NdefMap->StdMifareContainer.internalLength)
3183         {
3184             NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
3185             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
3186             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
3187             /* 16 bytes completed */
3188             NdefMap->StdMifareContainer.currentBlock++;
3189             NdefMap->StdMifareContainer.NdefBlocks++;
3190             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3191             if(Result == NFCSTATUS_SUCCESS)
3192             {
3193                 Result = ((NdefMap->StdMifareContainer.AuthDone == 
3194                         PH_FRINFC_MIFARESTD_FLAG1)?
3195                         phFriNfc_MifStd_H_RdABlock(NdefMap):
3196                         phFriNfc_MifStd_H_AuthSector(NdefMap));
3197             }               
3198             break;
3199         }
3200         
3201         if( (NdefMap->TLVStruct.BytesRemainLinTLV <= 
3202             (NdefMap->StdMifareContainer.internalLength - *TempintBytes)) && 
3203             (RemainingBytes <= NdefMap->TLVStruct.BytesRemainLinTLV))
3204         {
3205             /* Copy the internal bytes to the user buffer */
3206             (void)memcpy(&(NdefMap->ApduBuffer[
3207                     NdefMap->ApduBuffIndex]),
3208                     &(NdefMap->StdMifareContainer.internalBuf[ 
3209                     (*TempintBytes)]),
3210                     RemainingBytes);
3211             
3212             NdefMap->ApduBuffIndex += RemainingBytes;
3213             *TempintBytes += ((uint8_t)RemainingBytes);
3214             NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
3215             if(NdefMap->TLVStruct.BytesRemainLinTLV == 0)
3216             {
3217                 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;                    
3218             }
3219             /* Update the internal length */
3220             (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
3221                     &(NdefMap->StdMifareContainer.internalBuf[ 
3222                     (*TempintBytes)]),
3223                     RemainingBytes);
3224             NdefMap->StdMifareContainer.internalLength -= (*TempintBytes +
3225                                                         RemainingBytes);
3226         
3227             CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3228             break;
3229         }
3230         else if((NdefMap->TLVStruct.BytesRemainLinTLV <= 
3231                 (NdefMap->StdMifareContainer.internalLength - *TempintBytes)) && 
3232                 (RemainingBytes > NdefMap->TLVStruct.BytesRemainLinTLV))
3233         {
3234             /* Copy data to user buffer */
3235             (void)memcpy(&(NdefMap->ApduBuffer[ 
3236                     NdefMap->ApduBuffIndex]),
3237                     &(NdefMap->StdMifareContainer.internalBuf[ 
3238                     (*TempintBytes)]),
3239                     NdefMap->TLVStruct.BytesRemainLinTLV);
3240
3241             /* increment the user buffer index */
3242             NdefMap->ApduBuffIndex += NdefMap->TLVStruct.BytesRemainLinTLV;
3243             *TempintBytes += ((uint8_t)NdefMap->TLVStruct.BytesRemainLinTLV);
3244             NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
3245             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
3246
3247             /* check for internal length bytes of data been used */
3248             if(*TempintBytes == NdefMap->StdMifareContainer.internalLength)
3249             {
3250                 /* 16 bytes completed */
3251                 NdefMap->StdMifareContainer.currentBlock++;
3252                 NdefMap->StdMifareContainer.NdefBlocks++;
3253                 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3254                 if(Result == NFCSTATUS_SUCCESS)
3255                 {
3256                     Result = ((NdefMap->StdMifareContainer.AuthDone == 
3257                             PH_FRINFC_MIFARESTD_FLAG1)?
3258                             phFriNfc_MifStd_H_RdABlock(NdefMap):
3259                             phFriNfc_MifStd_H_AuthSector(NdefMap));
3260                 }
3261                 break;
3262             }
3263         }
3264         else if((NdefMap->TLVStruct.BytesRemainLinTLV > 
3265                 (NdefMap->StdMifareContainer.internalLength - *TempintBytes)) && 
3266                 (RemainingBytes <= (NdefMap->StdMifareContainer.internalLength - 
3267                 *TempintBytes)))
3268         {
3269             /* Copy data to user buffer */
3270             (void)memcpy(&(NdefMap->ApduBuffer[ 
3271                     NdefMap->ApduBuffIndex]),
3272                     &(NdefMap->StdMifareContainer.internalBuf[ 
3273                     (*TempintBytes)]),
3274                     RemainingBytes);
3275             NdefMap->ApduBuffIndex += RemainingBytes;
3276             *TempintBytes += ((uint8_t)RemainingBytes);
3277             NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
3278
3279             /* copy the bytes to internal buffer, that are read, 
3280                 but not used for the user buffer */
3281             (void)memcpy(NdefMap->StdMifareContainer.internalBuf,
3282                 &(NdefMap->StdMifareContainer.internalBuf[(*TempintBytes)]),
3283                 (NdefMap->StdMifareContainer.internalLength - *TempintBytes));
3284             
3285             /* Length of the internal buffer */
3286             NdefMap->StdMifareContainer.internalLength -= *TempintBytes;
3287             CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3288             break;
3289         }
3290         else
3291         {
3292             if((NdefMap->TLVStruct.BytesRemainLinTLV > 
3293                 (NdefMap->StdMifareContainer.internalLength - *TempintBytes)) && 
3294                 (RemainingBytes > (NdefMap->StdMifareContainer.internalLength - 
3295                 *TempintBytes)))
3296             {
3297                 /* Copy data to user buffer */
3298                 (void)memcpy(&(NdefMap->ApduBuffer[
3299                         NdefMap->ApduBuffIndex]),
3300                         &(NdefMap->StdMifareContainer.internalBuf[
3301                         (*TempintBytes)]),
3302                         (NdefMap->StdMifareContainer.internalLength - 
3303                         *TempintBytes));
3304                 NdefMap->ApduBuffIndex += (NdefMap->StdMifareContainer.internalLength - 
3305                                             *TempintBytes);
3306                 NdefMap->TLVStruct.BytesRemainLinTLV -= 
3307                             (NdefMap->StdMifareContainer.internalLength - *TempintBytes);
3308                 *TempintBytes += (uint8_t)(NdefMap->StdMifareContainer.internalLength - 
3309                                             *TempintBytes);
3310                 
3311                 NdefMap->StdMifareContainer.internalLength -= *TempintBytes;
3312                 
3313                 /* 16 bytes completed */
3314                 NdefMap->StdMifareContainer.currentBlock++;
3315                 NdefMap->StdMifareContainer.NdefBlocks++;
3316                 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3317                 if(Result == NFCSTATUS_SUCCESS)
3318                 {
3319                     Result = ((NdefMap->StdMifareContainer.AuthDone == 
3320                                 PH_FRINFC_MIFARESTD_FLAG1)?
3321                                 phFriNfc_MifStd_H_RdABlock(NdefMap):
3322                                 phFriNfc_MifStd_H_AuthSector(NdefMap));
3323                 }
3324                 break;
3325             }
3326         }
3327     }
3328
3329     if((((  NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
3330         NdefMap->StdMifareContainer.NdefBlocks) * 
3331         PH_FRINFC_MIFARESTD_BLOCK_BYTES) + 
3332         NdefMap->StdMifareContainer.internalLength) ==
3333         PH_FRINFC_MIFARESTD_VAL0)
3334     {
3335         NdefMap->StdMifareContainer.ReadWriteCompleteFlag = 
3336                         PH_FRINFC_MIFARESTD_FLAG1;
3337     }
3338
3339     if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
3340     {
3341         Result = (((RdFlag == PH_FRINFC_MIFARESTD_FLAG1) && 
3342                     (NdefMap->ApduBuffIndex == PH_FRINFC_MIFARESTD_VAL0))?
3343                     (PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP, 
3344                                 NFCSTATUS_EOF_NDEF_CONTAINER_REACHED)):
3345                     Result);
3346                     
3347         *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
3348     }
3349     
3350     return Result;
3351 }
3352 #endif
3353
3354 static NFCSTATUS phFriNfc_MifStd_H_WriteNdefLen(phFriNfc_NdefMap_t *NdefMap)
3355 {
3356     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
3357     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WR_NDEF_LEN;
3358
3359     /* If Current block = Ndef TLV block then the starting point 
3360         is writing from type of TLV 
3361         Else */
3362
3363     if(NdefMap->StdMifareContainer.currentBlock == 
3364                                 NdefMap->TLVStruct.NdefTLVBlock)
3365     {
3366
3367         if(NdefMap->TLVStruct.NULLTLVCount >= 
3368             PH_FRINFC_MIFARESTD_VAL2)
3369         {
3370             phFriNfc_MifStd_H_fillTLV1(NdefMap);
3371         }
3372         else
3373         {
3374             phFriNfc_MifStd_H_fillTLV2(NdefMap);
3375         }
3376     }
3377     else
3378     {
3379         if(NdefMap->TLVStruct.NULLTLVCount >= 
3380             PH_FRINFC_MIFARESTD_VAL2)
3381         {        
3382             phFriNfc_MifStd_H_fillTLV1_1(NdefMap);
3383         }
3384         else
3385         {
3386             phFriNfc_MifStd_H_fillTLV2_1(NdefMap);
3387         }
3388     }
3389
3390     (void)memcpy( NdefMap->StdMifareContainer.Buffer,
3391             &(NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL1]),
3392             PH_FRINFC_MIFARESTD_BYTES_READ);
3393
3394
3395     /* Write from here */
3396     NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_WRITE;
3397
3398 #ifndef PH_HAL4_ENABLE
3399     NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareWrite16;
3400 #else
3401     NdefMap->Cmd.MfCmd = phHal_eMifareWrite16;
3402 #endif
3403
3404     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
3405     /* Call the Overlapped HAL Transceive function */ 
3406     Result = phFriNfc_OvrHal_Transceive(    NdefMap->LowerDevice,
3407                                             &NdefMap->MapCompletionInfo,
3408                                             NdefMap->psRemoteDevInfo,
3409                                             NdefMap->Cmd,
3410                                             &NdefMap->psDepAdditionalInfo,
3411                                             NdefMap->SendRecvBuf,
3412                                             NdefMap->SendLength,
3413                                             NdefMap->SendRecvBuf,
3414                                             NdefMap->SendRecvLength);
3415     
3416     return Result;
3417 }
3418 #if 0
3419 static NFCSTATUS phFriNfc_MifStd_H_ChkNdefCmpltBlocks(phFriNfc_NdefMap_t   *NdefMap)
3420 {
3421     NFCSTATUS   Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
3422                                     NFCSTATUS_INVALID_PARAMETER);
3423     /*  If NoOfNdefCompBlocks is found to be zero, 
3424         should we warn the user */
3425     if((NdefMap->StdMifareContainer.NoOfNdefCompBlocks != 
3426         PH_FRINFC_MIFARESTD_VAL0) && 
3427         (NdefMap->StdMifareContainer.NoOfNdefCompBlocks <= 
3428         PH_FRINFC_MIFARESTD4K_MAX_BLOCKS))
3429     {
3430         /* Reading/writing to the card can start only 
3431         from the block 4 */                            
3432         NdefMap->StdMifareContainer.currentBlock = 4;
3433         NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
3434         Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3435         if((Result == NFCSTATUS_SUCCESS) && 
3436             (NdefMap->StdMifareContainer.AuthDone == 
3437             PH_FRINFC_MIFARESTD_FLAG1))
3438         {
3439             NdefMap->StdMifareContainer.ReadAcsBitFlag = 0;
3440             Result = phFriNfc_MifStd_H_RdAcsBit(NdefMap);
3441         }   
3442         else
3443         {
3444             Result = phFriNfc_MifStd_H_AuthSector(NdefMap);
3445         }       
3446     }
3447     return Result;
3448 }
3449 #endif
3450
3451 static void phFriNfc_MifStd_H_RdWrReset(phFriNfc_NdefMap_t   *NdefMap)
3452 {
3453     NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_BLK4;
3454     NdefMap->StdMifareContainer.NdefBlocks = PH_FRINFC_MIFARESTD_VAL1;
3455     NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
3456     NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
3457     NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
3458     NdefMap->TLVStruct.NdefTLVAuthFlag = PH_FRINFC_MIFARESTD_FLAG0;
3459     NdefMap->TLVStruct.NdefTLVBlock = PH_FRINFC_MIFARESTD_MAD_BLK0;
3460     NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL0;
3461     NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_MIFARESTD_VAL0;
3462     NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
3463     NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
3464     NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
3465     NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
3466     NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG1;
3467     NdefMap->StdMifareContainer.ReadWriteCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
3468     NdefMap->StdMifareContainer.remainingSize = (uint16_t)
3469                         (NdefMap->StdMifareContainer.NoOfNdefCompBlocks * 
3470                             PH_FRINFC_MIFARESTD_BLOCK_BYTES);
3471     NdefMap->StdMifareContainer.WrLength = PH_FRINFC_MIFARESTD_VAL1;
3472
3473 }
3474
3475 static NFCSTATUS phFriNfc_MifStd_H_RdtoWrNdefLen(phFriNfc_NdefMap_t *NdefMap)
3476 {
3477     NFCSTATUS Result = NFCSTATUS_SUCCESS;
3478     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_TO_WR_NDEF_LEN;
3479     
3480     if(NdefMap->TLVStruct.NdefTLVAuthFlag == PH_FRINFC_MIFARESTD_FLAG1)
3481     {
3482         NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
3483         Result = phFriNfc_MifStd_H_AuthSector(NdefMap);
3484     }
3485     else
3486     {
3487         NdefMap->SendRecvBuf[0] = NdefMap->StdMifareContainer.currentBlock;
3488         NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_READ;
3489         *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
3490
3491 #ifndef PH_HAL4_ENABLE
3492         NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareRead;
3493 #else
3494         NdefMap->Cmd.MfCmd = phHal_eMifareRead;
3495 #endif
3496         /* Call the Overlapped HAL Transceive function */ 
3497         Result = phFriNfc_OvrHal_Transceive(    NdefMap->LowerDevice,
3498                                                 &NdefMap->MapCompletionInfo,
3499                                                 NdefMap->psRemoteDevInfo,
3500                                                 NdefMap->Cmd,
3501                                                 &NdefMap->psDepAdditionalInfo,
3502                                                 NdefMap->SendRecvBuf,
3503                                                 NdefMap->SendLength,
3504                                                 NdefMap->SendRecvBuf,
3505                                                 NdefMap->SendRecvLength);
3506     }
3507
3508     return Result;
3509 }
3510
3511 static void phFriNfc_MifStd_H_SetNdefBlkAuth(phFriNfc_NdefMap_t   *NdefMap)
3512 {
3513     NdefMap->TLVStruct.NdefTLVAuthFlag = 
3514             ((phFriNfc_MifStd_H_GetSect(NdefMap->TLVStruct.NdefTLVBlock)
3515             == phFriNfc_MifStd_H_GetSect(NdefMap->StdMifareContainer.currentBlock))?
3516             PH_FRINFC_MIFARESTD_FLAG0:
3517             PH_FRINFC_MIFARESTD_FLAG1);
3518 }
3519
3520 static NFCSTATUS phFriNfc_MifStd_H_GetActCardLen(phFriNfc_NdefMap_t *NdefMap)
3521 {
3522     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
3523     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_GET_ACT_CARDSIZE;
3524     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_GET_ACTSIZE_OPE;
3525
3526     Result = ((NdefMap->StdMifareContainer.AuthDone == 
3527             PH_FRINFC_MIFARESTD_FLAG0)?
3528             phFriNfc_MifStd_H_AuthSector(NdefMap):
3529             phFriNfc_MifStd_H_Rd16Bytes(NdefMap, 
3530                 NdefMap->StdMifareContainer.currentBlock));
3531
3532     return Result;
3533 }
3534
3535 static NFCSTATUS phFriNfc_MifStd_H_ChkTLVs(phFriNfc_NdefMap_t *NdefMap,
3536                                            uint8_t            *CRFlag)
3537 {
3538     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
3539     uint16_t        TempLength = PH_FRINFC_MIFARESTD_VAL0,
3540                     ShiftLength = PH_FRINFC_MIFARESTD_VAL0;
3541     uint8_t         TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
3542     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_GET_ACTSIZE_OPE;
3543     TempLength = NdefMap->TLVStruct.NdefTLVByte;
3544     for(;;)
3545     {
3546 #ifdef PH_HAL4_ENABLE
3547         if((NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_TERMTLV_T) && 
3548             (NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_NULLTLV_T) && 
3549             (NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_NDEFTLV_T) && 
3550             (FALSE == NdefMap->TLVStruct.NdefTLVFoundFlag))
3551         {
3552             Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
3553                                 NFCSTATUS_NO_NDEF_SUPPORT);
3554             NdefMap->TLVStruct.BytesRemainLinTLV = 0;
3555             NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
3556             *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3557             break;
3558
3559         }
3560         else 
3561 #endif /* #ifdef PH_HAL4_ENABLE */
3562         if((NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_TERMTLV_T) && 
3563             (NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_NULLTLV_T))
3564         {
3565             if(NdefMap->SendRecvBuf[TempLength] == PH_FRINFC_MIFARESTD_NDEFTLV_T)
3566             {
3567                 NdefMap->TLVStruct.NdefTLVBlock = 
3568                             NdefMap->StdMifareContainer.currentBlock;
3569                 NdefMap->TLVStruct.NdefTLVByte = (uint8_t)TempLength;
3570                 NdefMap->TLVStruct.NdefTLVFoundFlag = 
3571                             ((NdefMap->SendRecvBuf[TempLength] == 
3572                                 PH_FRINFC_MIFARESTD_NDEFTLV_T)?
3573                                 PH_FRINFC_MIFARESTD_FLAG1:
3574                                 PH_FRINFC_MIFARESTD_FLAG0);
3575
3576                 NdefMap->TLVStruct.NULLTLVCount = ((NdefMap->TLVStruct.NULLTLVCount 
3577                                             == PH_FRINFC_MIFARESTD_VAL1)?
3578                                             PH_FRINFC_MIFARESTD_VAL0:
3579                                             NdefMap->TLVStruct.NULLTLVCount);
3580             }
3581             else
3582             {
3583                 NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
3584             }
3585
3586             TempLength++;
3587             if(TempLength == PH_FRINFC_MIFARESTD_BYTES_READ)
3588             {
3589                 NdefMap->TLVStruct.TcheckedinTLVFlag = 
3590                                         PH_FRINFC_MIFARESTD_FLAG1;
3591                 NdefMap->TLVStruct.NoLbytesinTLV = 
3592                                     PH_FRINFC_MIFARESTD_VAL3;
3593             }
3594             Result = phFriNfc_MifStd_H_Chk16Bytes(  NdefMap,
3595                                                     TempLength);
3596             if(Result != NFCSTATUS_SUCCESS)
3597             {
3598                 *CRFlag = (uint8_t)((Result == NFCSTATUS_PENDING)?
3599                             PH_FRINFC_MIFARESTD_FLAG0:
3600                             PH_FRINFC_MIFARESTD_FLAG1);
3601                 break;
3602             }
3603             
3604             if(((((  NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
3605                         NdefMap->StdMifareContainer.NdefBlocks) * 
3606                         PH_FRINFC_MIFARESTD_BLOCK_BYTES) + 
3607                         (PH_FRINFC_MIFARESTD_BLOCK_BYTES - 
3608                         TempLength)) <
3609                         NdefMap->SendRecvBuf[TempLength]) && 
3610                         ((NdefMap->SendRecvBuf[TempLength] < 
3611                         PH_FRINFC_MIFARESTD_NDEFTLV_L) && 
3612                         (NdefMap->TLVStruct.NdefTLVFoundFlag != 
3613                         PH_FRINFC_MIFARESTD_VAL1)))
3614             {
3615                 /* Result = Error */
3616                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
3617                                 NFCSTATUS_INVALID_PARAMETER);
3618                 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3619                 break;
3620             }
3621
3622             if(((((  NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
3623                         NdefMap->StdMifareContainer.NdefBlocks) * 
3624                         PH_FRINFC_MIFARESTD_BLOCK_BYTES) + 
3625                         (PH_FRINFC_MIFARESTD_BLOCK_BYTES - 
3626                         TempLength)) <
3627                         NdefMap->SendRecvBuf[TempLength]) && 
3628                         ((NdefMap->SendRecvBuf[TempLength] == 
3629                         PH_FRINFC_MIFARESTD_VAL0) && 
3630                         (NdefMap->TLVStruct.NdefTLVFoundFlag == 
3631                         PH_FRINFC_MIFARESTD_VAL1)))
3632             {
3633                 /* Result = Error */
3634                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
3635                                 NFCSTATUS_INVALID_PARAMETER);
3636                 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3637                 break;
3638             }
3639
3640             if((NdefMap->TLVStruct.NdefTLVFoundFlag == 
3641                 PH_FRINFC_MIFARESTD_FLAG1) && 
3642                 (NdefMap->SendRecvBuf[TempLength] < 
3643                  PH_FRINFC_MIFARESTD_NDEFTLV_L))
3644             {
3645                 Result = phFriNfc_MapTool_SetCardState(NdefMap, 
3646                                     NdefMap->SendRecvBuf[TempLength]);
3647                 NdefMap->TLVStruct.BytesRemainLinTLV = 
3648                                     NdefMap->SendRecvBuf[TempLength];
3649                 NdefMap->StdMifareContainer.remainingSize -= 
3650                                             PH_FRINFC_MIFARESTD_VAL2;
3651                 /* This flag is set */
3652                 NdefMap->StdMifareContainer.remSizeUpdFlag = 
3653                     (uint8_t)((NdefMap->TLVStruct.NULLTLVCount >= 
3654                     PH_FRINFC_MIFARESTD_VAL2)?
3655                     PH_FRINFC_MIFARESTD_FLAG0:
3656                     PH_FRINFC_MIFARESTD_FLAG1);
3657
3658                 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3659                 break;
3660             }
3661             
3662             NdefMap->StdMifareContainer.remainingSize -= 
3663                     ((  NdefMap->SendRecvBuf[TempLength] < 
3664                             PH_FRINFC_MIFARESTD_NDEFTLV_L)?
3665                             (NdefMap->SendRecvBuf[TempLength] 
3666                             + PH_FRINFC_MIFARESTD_VAL2):
3667                             PH_FRINFC_MIFARESTD_VAL0);
3668
3669             if(( NdefMap->SendRecvBuf[TempLength] == 
3670                         PH_FRINFC_MIFARESTD_VAL0))
3671             {
3672                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
3673                             NFCSTATUS_INVALID_PARAMETER);
3674                 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3675                 break;
3676             }
3677
3678             TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
3679             /* get the next TLV after the proprietary TLV */
3680             Result = 
3681                 ((NdefMap->SendRecvBuf[TempLength] < 
3682                     PH_FRINFC_MIFARESTD_NDEFTLV_L)?
3683                     phFriNfc_MifStd_H_GetNxtTLV(NdefMap, &TempLength, &TL4bytesFlag):
3684                     NFCSTATUS_PENDING);
3685
3686             if((TempLength >= PH_FRINFC_MIFARESTD_BYTES_READ) && 
3687                 (Result == NFCSTATUS_SUCCESS))
3688             {
3689                 NdefMap->TLVStruct.TcheckedinTLVFlag = 
3690                                         PH_FRINFC_MIFARESTD_FLAG0;
3691                 NdefMap->TLVStruct.NoLbytesinTLV = 
3692                                     PH_FRINFC_MIFARESTD_VAL0;
3693                 
3694                 Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
3695                 *CRFlag = (uint8_t)((Result != NFCSTATUS_PENDING)?
3696                             PH_FRINFC_MIFARESTD_FLAG1:
3697                             PH_FRINFC_MIFARESTD_FLAG0);
3698                 break;
3699             }
3700             else
3701             {
3702                 if(Result == NFCSTATUS_PENDING)
3703                 {
3704                     TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG1;
3705                     Result = ((NdefMap->SendRecvBuf[TempLength] == 
3706                             PH_FRINFC_MIFARESTD_NDEFTLV_L) ?
3707                             NFCSTATUS_SUCCESS:
3708                             (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
3709                                 NFCSTATUS_INVALID_PARAMETER)));
3710                     
3711                     if(Result != NFCSTATUS_SUCCESS)
3712                     {
3713                         *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3714                         break;
3715                     }
3716                     NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
3717                     TempLength++;
3718                     /* Check 0xFF */
3719                     if(TempLength == PH_FRINFC_MIFARESTD_BYTES_READ)
3720                     {
3721                         NdefMap->TLVStruct.TcheckedinTLVFlag = 
3722                                                 PH_FRINFC_MIFARESTD_FLAG1;
3723                         NdefMap->TLVStruct.NoLbytesinTLV = 
3724                                             PH_FRINFC_MIFARESTD_VAL2;
3725                     }
3726                     Result = phFriNfc_MifStd_H_Chk16Bytes(  NdefMap,
3727                                                             TempLength);
3728                     if(Result != NFCSTATUS_SUCCESS)
3729                     {
3730                         break;
3731                     }
3732
3733                     ShiftLength = NdefMap->SendRecvBuf[TempLength];
3734                     TempLength++;
3735                     if(TempLength == PH_FRINFC_MIFARESTD_BYTES_READ)
3736                     {
3737                         NdefMap->TLVStruct.TcheckedinTLVFlag = 
3738                                                 PH_FRINFC_MIFARESTD_FLAG1;
3739                         NdefMap->TLVStruct.NoLbytesinTLV = 
3740                                             PH_FRINFC_MIFARESTD_VAL1;
3741                         NdefMap->TLVStruct.prevLenByteValue = 
3742                                     NdefMap->SendRecvBuf[(TempLength - 
3743                                                 PH_FRINFC_MIFARESTD_VAL1)];
3744                     }
3745                     Result = phFriNfc_MifStd_H_Chk16Bytes(  NdefMap,
3746                                                             TempLength);
3747                     if(Result != NFCSTATUS_SUCCESS)
3748                     {
3749                         break;
3750                     }
3751                     
3752                     
3753                     if((((  NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
3754                         NdefMap->StdMifareContainer.NdefBlocks) * 
3755                         PH_FRINFC_MIFARESTD_BLOCK_BYTES) + 
3756                         (PH_FRINFC_MIFARESTD_BLOCK_BYTES - 
3757                         TempLength)) <
3758                         (( ShiftLength
3759                         << 8) + NdefMap->SendRecvBuf[TempLength]))
3760                     {
3761                         Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
3762                                 NFCSTATUS_INVALID_REMOTE_DEVICE);
3763                         
3764                         break;
3765                     }
3766                     
3767                     if(NdefMap->TLVStruct.NdefTLVFoundFlag == 
3768                         PH_FRINFC_MIFARESTD_FLAG1)
3769                     {
3770                         ShiftLength = (( ShiftLength<< 8) + 
3771                                     NdefMap->SendRecvBuf[TempLength]);
3772                         NdefMap->TLVStruct.BytesRemainLinTLV = ShiftLength;
3773                         Result = phFriNfc_MapTool_SetCardState(NdefMap, 
3774                                                                 ShiftLength);
3775                         NdefMap->StdMifareContainer.remainingSize -= 
3776                                             PH_FRINFC_MIFARESTD_VAL4;
3777                         *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3778                         break;
3779                     }
3780                     
3781                     NdefMap->StdMifareContainer.remainingSize -= 
3782                                 ((ShiftLength<< 8) + 
3783                                 NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)]);
3784                     TempLength++;
3785
3786                     /* get the next TLV after the proprietary TLV */
3787                     Result = phFriNfc_MifStd_H_GetNxtTLV(NdefMap, &TempLength, &TL4bytesFlag);
3788
3789                     if((TempLength >= PH_FRINFC_MIFARESTD_BYTES_READ) && 
3790                         (Result == NFCSTATUS_SUCCESS))
3791                     {
3792                         NdefMap->TLVStruct.TcheckedinTLVFlag = 
3793                                                 PH_FRINFC_MIFARESTD_FLAG0;
3794                         NdefMap->TLVStruct.NoLbytesinTLV = 
3795                                             PH_FRINFC_MIFARESTD_VAL0;
3796                         Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
3797
3798                         break;
3799                     }
3800                     break;
3801                 }
3802             }
3803         }
3804         else if((NdefMap->SendRecvBuf[TempLength] == PH_FRINFC_MIFARESTD_TERMTLV_T) && 
3805                 (NdefMap->TLVStruct.NdefTLVFoundFlag == PH_FRINFC_MIFARESTD_FLAG0))
3806         {
3807             Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
3808                                 NFCSTATUS_INVALID_PARAMETER);
3809             NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
3810                                         PH_FRINFC_MIFARESTD_FLAG1;
3811             break;
3812
3813         }
3814         else if(NdefMap->SendRecvBuf[TempLength] == PH_FRINFC_MIFARESTD_NULLTLV_T)
3815         {
3816             TempLength++;
3817             NdefMap->TLVStruct.NULLTLVCount += PH_FRINFC_MIFARESTD_VAL1;
3818             ShiftLength = NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL1)];
3819             NdefMap->StdMifareContainer.remainingSize -= PH_FRINFC_MIFARESTD_VAL1;
3820             if(NdefMap->StdMifareContainer.remainingSize <
3821                     (( ShiftLength << 8) + NdefMap->SendRecvBuf[TempLength]))
3822             {
3823                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
3824                                 NFCSTATUS_INVALID_REMOTE_DEVICE);
3825                 break;
3826             }
3827             Result = phFriNfc_MifStd_H_Chk16Bytes(  NdefMap,
3828                                                     TempLength);
3829             if(Result != NFCSTATUS_SUCCESS)
3830             {
3831                 NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL0;
3832                 break;
3833             }
3834         }
3835         else
3836         {
3837             if((NdefMap->SendRecvBuf[TempLength] == PH_FRINFC_MIFARESTD_TERMTLV_T) && 
3838                 (NdefMap->TLVStruct.NdefTLVFoundFlag == PH_FRINFC_MIFARESTD_FLAG1))
3839             {
3840                 TempLength++;
3841                 Result = NFCSTATUS_SUCCESS;
3842                 NdefMap->StdMifareContainer.remainingSize -= 
3843                                                 PH_FRINFC_MIFARESTD_VAL1;
3844             }
3845         }
3846     }
3847
3848     if(NdefMap->TLVStruct.BytesRemainLinTLV > 
3849         NdefMap->StdMifareContainer.remainingSize)
3850     {
3851         Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
3852                                 NFCSTATUS_INVALID_FORMAT);
3853     }
3854     else
3855     {
3856         if(NdefMap->StdMifareContainer.remainingSize ==
3857                 PH_FRINFC_MIFARESTD_VAL0)
3858         {
3859             Result = ((NdefMap->TLVStruct.NdefTLVFoundFlag == 
3860                         PH_FRINFC_MIFARESTD_FLAG1)?
3861                         NFCSTATUS_SUCCESS:
3862                         (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
3863                                     NFCSTATUS_INVALID_PARAMETER)));
3864         }
3865     }
3866     return Result;
3867 }
3868
3869 static NFCSTATUS phFriNfc_MifStd_H_GetNxtTLV(phFriNfc_NdefMap_t    *NdefMap,
3870                                       uint16_t              *TempLength,
3871                                        uint8_t              *TL4bytesFlag)
3872 {
3873     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
3874     uint16_t    LengthRemaining = PH_FRINFC_MIFARESTD_VAL0,
3875                 TempLen = PH_FRINFC_MIFARESTD_VAL0,
3876                 ShiftLength = PH_FRINFC_MIFARESTD_VAL0;
3877     
3878     TempLen = (*TempLength);
3879     LengthRemaining = (PH_FRINFC_MIFARESTD_BYTES_READ - 
3880                         (TempLen + PH_FRINFC_MIFARESTD_VAL1));
3881     
3882     if(*TL4bytesFlag == PH_FRINFC_MIFARESTD_FLAG0)
3883     {
3884         (*TempLength) += (NdefMap->SendRecvBuf[TempLen] + 
3885                             PH_FRINFC_MIFARESTD_VAL1);
3886
3887         if(NdefMap->TLVStruct.NdefTLVFoundFlag == PH_FRINFC_MIFARESTD_FLAG0)
3888         {
3889             LengthRemaining = 
3890                 (((*TempLength) < PH_FRINFC_MIFARESTD_BYTES_READ)?
3891                 PH_FRINFC_MIFARESTD_VAL0:
3892                 (NdefMap->SendRecvBuf[TempLen] - 
3893                 LengthRemaining));
3894         }
3895         else
3896         {
3897             LengthRemaining = 
3898                 (((*TempLength) < PH_FRINFC_MIFARESTD_BYTES_READ)?
3899                 PH_FRINFC_MIFARESTD_VAL0:
3900                 (NdefMap->SendRecvBuf[TempLen] - 
3901                 LengthRemaining));
3902         }
3903     }
3904     else
3905     {
3906         *TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
3907         if(NdefMap->TLVStruct.NoLbytesinTLV == 
3908             PH_FRINFC_MIFARESTD_VAL1)
3909         {
3910             ShiftLength = NdefMap->TLVStruct.prevLenByteValue;
3911             (*TempLength) += ((ShiftLength 
3912                                 << 8) + NdefMap->SendRecvBuf[TempLen] + 
3913                             PH_FRINFC_MIFARESTD_VAL1);
3914
3915             LengthRemaining = 
3916                 (((ShiftLength 
3917                 << 8) + NdefMap->SendRecvBuf[TempLen]) - 
3918                 LengthRemaining);
3919         }
3920         else
3921         {
3922             ShiftLength = NdefMap->SendRecvBuf[(TempLen - PH_FRINFC_MIFARESTD_VAL1)];
3923             (*TempLength) += ((ShiftLength 
3924                                 << 8) + NdefMap->SendRecvBuf[TempLen] + 
3925                             PH_FRINFC_MIFARESTD_VAL1);
3926
3927             LengthRemaining = 
3928                 (((ShiftLength 
3929                     << 8) + NdefMap->SendRecvBuf[TempLen]) - 
3930                     LengthRemaining);
3931         }
3932     }
3933     
3934     NdefMap->TLVStruct.NdefTLVByte = 
3935         (uint8_t)(((*TempLength) < PH_FRINFC_MIFARESTD_BYTES_READ)?
3936         (*TempLength):
3937         (LengthRemaining % PH_FRINFC_MIFARESTD_BYTES_READ));
3938
3939     while(LengthRemaining != PH_FRINFC_MIFARESTD_VAL0)
3940     {
3941         NdefMap->StdMifareContainer.currentBlock++;
3942         NdefMap->StdMifareContainer.NdefBlocks++;
3943         Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3944         LengthRemaining -= 
3945             ((LengthRemaining <= PH_FRINFC_MIFARESTD_BYTES_READ)?
3946             LengthRemaining:
3947             PH_FRINFC_MIFARESTD_BYTES_READ);
3948     }
3949     
3950     if(NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL0)
3951     {
3952         NdefMap->StdMifareContainer.currentBlock++;
3953         NdefMap->StdMifareContainer.NdefBlocks++;
3954         Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3955     }
3956     
3957     return Result;
3958 }
3959
3960 static NFCSTATUS phFriNfc_MifStd_H_Chk16Bytes(phFriNfc_NdefMap_t   *NdefMap,
3961                                        uint16_t             TempLength)
3962 {
3963     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
3964     if(TempLength == PH_FRINFC_MIFARESTD_BYTES_READ)
3965     {
3966         NdefMap->StdMifareContainer.currentBlock++;
3967         NdefMap->StdMifareContainer.NdefBlocks++;
3968         Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3969                     
3970         Result = 
3971             ((NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)?
3972             phFriNfc_MifStd_H_GetActCardLen(NdefMap):
3973             phFriNfc_MifStd_H_AuthSector(NdefMap));      
3974     }
3975     return Result;
3976 }
3977
3978 static NFCSTATUS phFriNfc_MifStd_H_ChkRemainTLVs(phFriNfc_NdefMap_t *NdefMap, 
3979                                           uint8_t            *CRFlag,
3980                                           uint8_t            *NDEFFlag)
3981 {
3982     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
3983     uint16_t    TempLength = PH_FRINFC_MIFARESTD_VAL0,
3984                 ShiftLength = PH_FRINFC_MIFARESTD_VAL0;
3985     uint8_t     TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
3986
3987     switch(NdefMap->TLVStruct.NoLbytesinTLV)
3988     {
3989         case PH_FRINFC_MIFARESTD_VAL3:
3990             /* if TLV is found then set card state */
3991             Result = ((NdefMap->TLVStruct.NdefTLVFoundFlag == 
3992                         PH_FRINFC_MIFARESTD_FLAG1)?
3993                         phFriNfc_MapTool_SetCardState(NdefMap, 
3994                         NdefMap->SendRecvBuf[TempLength]):
3995                         Result);
3996
3997             /* Check the length field is less than or  
3998                 equal to 0xFF if yes enter below statement 
3999                 else enter else if*/
4000             if((NdefMap->SendRecvBuf[TempLength] < 
4001                 PH_FRINFC_MIFARESTD_NDEFTLV_L) && 
4002                 (Result == NFCSTATUS_SUCCESS))
4003             {
4004                 NdefMap->StdMifareContainer.remainingSize -= 
4005                                 PH_FRINFC_MIFARESTD_VAL2;
4006                 
4007                 Result = ((NdefMap->SendRecvBuf[TempLength] > 
4008                             NdefMap->StdMifareContainer.remainingSize)?
4009                             (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
4010                             NFCSTATUS_INVALID_FORMAT)):
4011                             Result);
4012                 TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
4013                 if((NdefMap->TLVStruct.NdefTLVFoundFlag == 
4014                     PH_FRINFC_MIFARESTD_FLAG1) && 
4015                     (Result == NFCSTATUS_SUCCESS))
4016                 {
4017                     NdefMap->TLVStruct.BytesRemainLinTLV = 
4018                     NdefMap->SendRecvBuf[TempLength];
4019                     *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
4020                     
4021                 }
4022                 else if(Result == NFCSTATUS_SUCCESS)
4023                 {
4024                     TempLength++;
4025                     Result = phFriNfc_MifStd_H_GetNxtTLV(NdefMap, 
4026                                     &TempLength, &TL4bytesFlag);
4027
4028                     NdefMap->StdMifareContainer.remainingSize -= 
4029                                     NdefMap->SendRecvBuf[TempLength];
4030                     if((TempLength >= PH_FRINFC_MIFARESTD_BYTES_READ) && 
4031                         (*CRFlag == PH_FRINFC_MIFARESTD_FLAG0))
4032                     {
4033                         *NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
4034                         Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
4035                     }
4036                 }
4037                 
4038                 else
4039                 {
4040                     /* do nothing */
4041                 }
4042             }
4043             else if((NdefMap->SendRecvBuf[TempLength] == 
4044                     PH_FRINFC_MIFARESTD_NDEFTLV_L) && 
4045                     (Result == NFCSTATUS_SUCCESS))
4046             {
4047                 TempLength++;
4048                 NdefMap->StdMifareContainer.remainingSize -= 
4049                                 PH_FRINFC_MIFARESTD_VAL4;
4050                 TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
4051                 Result = (((((uint16_t)NdefMap->SendRecvBuf[TempLength] << 8) + 
4052                                 NdefMap->SendRecvBuf[(TempLength + 
4053                                 PH_FRINFC_MIFARESTD_VAL1)]) > 
4054                                 NdefMap->StdMifareContainer.remainingSize)?
4055                                 (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
4056                                 NFCSTATUS_INVALID_FORMAT)):
4057                                 Result);
4058                 if((NdefMap->TLVStruct.NdefTLVFoundFlag == 
4059                     PH_FRINFC_MIFARESTD_FLAG1) && 
4060                     (Result == NFCSTATUS_SUCCESS))
4061                 {
4062                     NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
4063                     NdefMap->TLVStruct.BytesRemainLinTLV = 
4064                                 (((uint16_t)NdefMap->SendRecvBuf[TempLength] << 8) + 
4065                                 NdefMap->SendRecvBuf[(TempLength + 
4066                                 PH_FRINFC_MIFARESTD_VAL1)]);
4067                     *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
4068                 }
4069                 else if(Result == NFCSTATUS_SUCCESS)
4070                 {
4071                     TempLength++;
4072                     
4073                     Result = phFriNfc_MifStd_H_GetNxtTLV(NdefMap, 
4074                                 &TempLength, &TL4bytesFlag);
4075                     NdefMap->StdMifareContainer.remainingSize -= 
4076                                 (((uint16_t)NdefMap->SendRecvBuf[TempLength] << 8) + 
4077                                 NdefMap->SendRecvBuf[(TempLength + 
4078                                 PH_FRINFC_MIFARESTD_VAL1)]);
4079
4080                     *NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
4081                     Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
4082                 }
4083                 else
4084                 {
4085                     /* do nothing */
4086                     *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
4087                 }
4088             }
4089             else
4090             {
4091                 /* Result = Error */
4092                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
4093                                 NFCSTATUS_INVALID_FORMAT);
4094                 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
4095             }
4096             break;
4097
4098         case PH_FRINFC_MIFARESTD_VAL2:
4099         case PH_FRINFC_MIFARESTD_VAL1:
4100             ShiftLength = ((NdefMap->TLVStruct.NoLbytesinTLV == 
4101                             PH_FRINFC_MIFARESTD_VAL1)?
4102                             ((NdefMap->TLVStruct.prevLenByteValue << 8) + 
4103                             NdefMap->SendRecvBuf[TempLength]):
4104                             (((uint16_t)NdefMap->SendRecvBuf[TempLength] << 8) + 
4105                             NdefMap->SendRecvBuf[(TempLength + 
4106                             PH_FRINFC_MIFARESTD_VAL1)]));
4107             if((((  NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
4108                     NdefMap->StdMifareContainer.NdefBlocks) * 
4109                     PH_FRINFC_MIFARESTD_BLOCK_BYTES) + 
4110                     (PH_FRINFC_MIFARESTD_BLOCK_BYTES - 
4111                     TempLength)) <
4112                     ShiftLength)
4113             {
4114                 /* Result = Error */
4115                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
4116                                 NFCSTATUS_INVALID_PARAMETER);
4117                 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;                    
4118             }
4119             else
4120             {
4121                 NdefMap->StdMifareContainer.remainingSize -= 
4122                                     PH_FRINFC_MIFARESTD_VAL2;
4123                 if(NdefMap->TLVStruct.NdefTLVFoundFlag == 
4124                         PH_FRINFC_MIFARESTD_FLAG1)
4125                 {
4126                     NdefMap->TLVStruct.BytesRemainLinTLV = ShiftLength;
4127                     if(NdefMap->TLVStruct.BytesRemainLinTLV > 
4128                         NdefMap->StdMifareContainer.remainingSize)
4129                     {
4130                         Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
4131                                                 NFCSTATUS_INVALID_FORMAT);
4132                     }
4133                     *CRFlag = PH_FRINFC_MIFARESTD_FLAG1; 
4134                     *NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
4135                 }
4136                 else
4137                 {
4138                     NdefMap->StdMifareContainer.remainingSize -= 
4139                                         ShiftLength;
4140                     *CRFlag = PH_FRINFC_MIFARESTD_FLAG0; 
4141                     TempLength += PH_FRINFC_MIFARESTD_VAL2;
4142                     TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG1;
4143                     Result = ((NdefMap->TLVStruct.NdefTLVFoundFlag == PH_FRINFC_MIFARESTD_FLAG1)?
4144                                 NFCSTATUS_SUCCESS:
4145                                 phFriNfc_MifStd_H_GetNxtTLV(NdefMap, &TempLength, &TL4bytesFlag));
4146
4147                     *NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
4148                     Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
4149                 }
4150             }
4151             break;
4152
4153         default:
4154             break;
4155     }
4156     return Result;
4157 }
4158
4159 static void phFriNfc_MifStd_H_Get1kStTrail(phFriNfc_NdefMap_t  *NdefMap)
4160 {
4161     switch((NdefMap->StdMifareContainer.currentBlock % 4))
4162     {
4163         case PH_FRINFC_MIFARESTD_VAL0:
4164             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
4165                             (NdefMap->StdMifareContainer.currentBlock + 
4166                                         PH_FRINFC_MIFARESTD_MAD_BLK3);
4167             break;
4168
4169         case PH_FRINFC_MIFARESTD_VAL1:
4170             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
4171                         (NdefMap->StdMifareContainer.currentBlock + 
4172                                         PH_FRINFC_MIFARESTD_MAD_BLK2);
4173             break;
4174
4175         case PH_FRINFC_MIFARESTD_VAL2:
4176             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
4177                         (NdefMap->StdMifareContainer.currentBlock + 
4178                                         PH_FRINFC_MIFARESTD_MAD_BLK1);
4179             break;
4180
4181         default:
4182             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
4183                         NdefMap->StdMifareContainer.currentBlock;
4184             break;
4185     }
4186 }
4187
4188 static void phFriNfc_MifStd_H_Get4kStTrail(phFriNfc_NdefMap_t  *NdefMap)
4189 {
4190     switch((NdefMap->StdMifareContainer.currentBlock % 16))
4191     {
4192         case PH_FRINFC_MIFARESTD_MAD_BLK0:
4193             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
4194                             (NdefMap->StdMifareContainer.currentBlock + 
4195                                         PH_FRINFC_MIFARESTD_BLK15);
4196             break;
4197
4198         case PH_FRINFC_MIFARESTD_MAD_BLK1:
4199             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
4200                         (NdefMap->StdMifareContainer.currentBlock + 
4201                                         PH_FRINFC_MIFARESTD_BLK14);
4202             break;
4203
4204         case PH_FRINFC_MIFARESTD_MAD_BLK2:
4205             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
4206                         (NdefMap->StdMifareContainer.currentBlock + 
4207                                         PH_FRINFC_MIFARESTD_BLK13);
4208             break;
4209
4210         case PH_FRINFC_MIFARESTD_MAD_BLK3:
4211             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
4212                         (NdefMap->StdMifareContainer.currentBlock + 
4213                                         PH_FRINFC_MIFARESTD_BLK12);
4214             break;
4215
4216         case PH_FRINFC_MIFARESTD_BLK4:
4217             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
4218                         (NdefMap->StdMifareContainer.currentBlock + 
4219                                         PH_FRINFC_MIFARESTD_BLK11);
4220             break;
4221         
4222         case PH_FRINFC_MIFARESTD_BLK5:
4223             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
4224                         (NdefMap->StdMifareContainer.currentBlock + 
4225                                         PH_FRINFC_MIFARESTD_BLK10);
4226             break;
4227         
4228         case PH_FRINFC_MIFARESTD_BLK6:
4229             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
4230                         (NdefMap->StdMifareContainer.currentBlock + 
4231                                         PH_FRINFC_MIFARESTD_BLK9);
4232             break;
4233
4234         case PH_FRINFC_MIFARESTD_BLK7:
4235             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
4236                         (NdefMap->StdMifareContainer.currentBlock + 
4237                                         PH_FRINFC_MIFARESTD_BLK8);
4238             break;
4239
4240         case PH_FRINFC_MIFARESTD_BLK8:
4241             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
4242                         (NdefMap->StdMifareContainer.currentBlock + 
4243                                         PH_FRINFC_MIFARESTD_BLK7);
4244             break;
4245
4246         case PH_FRINFC_MIFARESTD_BLK9:
4247             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
4248                         (NdefMap->StdMifareContainer.currentBlock + 
4249                                         PH_FRINFC_MIFARESTD_BLK6);
4250             break;
4251
4252         case PH_FRINFC_MIFARESTD_BLK10:
4253             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
4254                         (NdefMap->StdMifareContainer.currentBlock + 
4255                                         PH_FRINFC_MIFARESTD_BLK5);
4256             break;
4257
4258         case PH_FRINFC_MIFARESTD_BLK11:
4259             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
4260                         (NdefMap->StdMifareContainer.currentBlock + 
4261                                         PH_FRINFC_MIFARESTD_BLK4);
4262             break;
4263
4264         case PH_FRINFC_MIFARESTD_BLK12:
4265             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
4266                         (NdefMap->StdMifareContainer.currentBlock + 
4267                                         PH_FRINFC_MIFARESTD_MAD_BLK3);
4268             break;
4269
4270         case PH_FRINFC_MIFARESTD_BLK13:
4271             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
4272                         (NdefMap->StdMifareContainer.currentBlock + 
4273                                         PH_FRINFC_MIFARESTD_MAD_BLK2);
4274             break;
4275
4276         case PH_FRINFC_MIFARESTD_BLK14:
4277             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
4278                         (NdefMap->StdMifareContainer.currentBlock + 
4279                                         PH_FRINFC_MIFARESTD_MAD_BLK1);
4280             break;
4281
4282         default:
4283             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
4284                         NdefMap->StdMifareContainer.currentBlock;
4285             break;
4286     }
4287 }
4288
4289 static NFCSTATUS phFriNfc_MifStd_H_ProChkNdef(phFriNfc_NdefMap_t        *NdefMap)
4290 {
4291     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
4292     /* Copy remaining bytes into the AID array
4293         from Receive Buffer till array number 7 in aid */
4294     if(NdefMap->StdMifareContainer.currentBlock == 
4295         PH_FRINFC_MIFARESTD_VAL1)
4296     {
4297         /* Helper Function to Store AID Information */
4298         phFriNfc_MifStd_H_fillAIDarray(NdefMap);
4299         
4300         NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_VAL2;
4301         /* read remaining AIDs from block number 2 */
4302         Result = ((NdefMap->StdMifareContainer.aidCompleteFlag == 
4303                 PH_FRINFC_MIFARESTD_FLAG1)?
4304                 Result:
4305                 phFriNfc_MifareStdMap_ChkNdef( NdefMap));
4306     }
4307     else if(((NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD) &&
4308             (NdefMap->StdMifareContainer.currentBlock == 
4309             PH_FRINFC_MIFARESTD_MAD_BLK2)) || (
4310             (NdefMap->StdMifareContainer.currentBlock == 
4311             PH_FRINFC_MIFARESTD_MAD_BLK66) && 
4312             (NdefMap->CardType == 
4313             PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD)))
4314     {
4315         /* Helper Function to Store AID Information */
4316         phFriNfc_MifStd_H_fillAIDarray(NdefMap);
4317                                     
4318         NdefMap->StdMifareContainer.aidCompleteFlag = 
4319                         PH_FRINFC_MIFARESTD_FLAG1;
4320     }/* Mifare 1k and Mifare 4k end Check */
4321     else if((NdefMap->StdMifareContainer.currentBlock > 
4322             PH_FRINFC_MIFARESTD_VAL1) && 
4323             (NdefMap->CardType == 
4324             PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD))
4325     {   
4326         phFriNfc_MifStd_H_fillAIDarray(NdefMap);
4327         /* read remaining AIDs from block number 2 */
4328         /* Mifare 4k Helper Function */  
4329         Result = ((NdefMap->StdMifareContainer.aidCompleteFlag == 
4330                     PH_FRINFC_MIFARESTD_FLAG1)?
4331                     Result:
4332                     phFriNfc_MifStd4k_H_CheckNdef(NdefMap));
4333     } /* Card Type 4k Check */
4334     else
4335     {
4336         /* Since we have decided temporarily not to go
4337             for any new error codes we are using 
4338             NFCSTATUS_INVALID_PARAMETER even though it is not 
4339             the relevant error code here TBD */
4340         Result = PHNFCSTVAL(    CID_FRI_NFC_NDEF_MAP, 
4341                                 NFCSTATUS_INVALID_PARAMETER); 
4342     }
4343
4344     if(NdefMap->StdMifareContainer.aidCompleteFlag == 
4345                         PH_FRINFC_MIFARESTD_FLAG1)
4346     {
4347         NdefMap->StdMifareContainer.ChkNdefCompleteFlag = 
4348                         PH_FRINFC_MIFARESTD_FLAG1;
4349         /*  The check for NDEF compliant information is now over for
4350             the Mifare 1K card.
4351             Update(decrement) the NoOfNdefCompBlocks as much required,
4352             depending on the NDEF compliant information found */
4353         /* Check the Sectors are Ndef Compliant */
4354         phFriNfc_MifStd_H_ChkNdefCmpltSects(NdefMap);
4355         if((NdefMap->StdMifareContainer.NoOfNdefCompBlocks == 0) || 
4356             (NdefMap->StdMifareContainer.NoOfNdefCompBlocks > 255))
4357         {
4358             Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP, 
4359                                 NFCSTATUS_NO_NDEF_SUPPORT);
4360         }
4361         else
4362         {
4363             NdefMap->StdMifareContainer.aidCompleteFlag = 
4364                             PH_FRINFC_MIFARESTD_FLAG0;
4365             NdefMap->StdMifareContainer.NFCforumSectFlag = 
4366                                     PH_FRINFC_MIFARESTD_FLAG0;
4367             NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_BLK4;
4368             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
4369             Result = ((Result != NFCSTATUS_SUCCESS)?
4370                         Result:phFriNfc_MifStd_H_AuthSector(NdefMap));
4371         }
4372         
4373     }
4374     return Result;
4375 }
4376
4377 static NFCSTATUS phFriNfc_MifStd_H_ProAuth(phFriNfc_NdefMap_t       *NdefMap)
4378 {
4379     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
4380     if(NdefMap->TLVStruct.NdefTLVAuthFlag == 
4381        PH_FRINFC_MIFARESTD_FLAG1)
4382     {
4383         NdefMap->TLVStruct.NdefTLVAuthFlag = 
4384                                     PH_FRINFC_MIFARESTD_FLAG0;
4385         NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG1;
4386         Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);                   
4387     }
4388     else
4389     {
4390         NdefMap->StdMifareContainer.AuthDone = 1;
4391         NdefMap->StdMifareContainer.ReadAcsBitFlag = 1;
4392         Result = phFriNfc_MifStd_H_RdAcsBit(NdefMap);
4393     }
4394     return Result;
4395 }
4396
4397 static NFCSTATUS phFriNfc_MifStd_H_Rd16Bytes(phFriNfc_NdefMap_t     *NdefMap,
4398                                               uint8_t               BlockNo)
4399 {
4400     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
4401     NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = BlockNo;
4402     NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_READ;
4403     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
4404 #ifndef PH_HAL4_ENABLE
4405     NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareRead;
4406 #else
4407     NdefMap->Cmd.MfCmd = phHal_eMifareRead;
4408 #endif
4409     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
4410     NdefMap->MapCompletionInfo.Context = NdefMap; 
4411     /* Call the Overlapped HAL Transceive function */ 
4412     Result = phFriNfc_OvrHal_Transceive(    NdefMap->LowerDevice,
4413                                             &NdefMap->MapCompletionInfo,
4414                                             NdefMap->psRemoteDevInfo,
4415                                             NdefMap->Cmd,
4416                                             &NdefMap->psDepAdditionalInfo,
4417                                             NdefMap->SendRecvBuf,
4418                                             NdefMap->SendLength,
4419                                             NdefMap->SendRecvBuf,
4420                                             NdefMap->SendRecvLength);
4421     return Result;
4422 }
4423
4424 static NFCSTATUS phFriNfc_MifStd_H_ProAcsBits(phFriNfc_NdefMap_t        *NdefMap)
4425 {
4426     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
4427     uint8_t     CRFlag = PH_FRINFC_MIFARESTD_FLAG0;
4428     if(*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ)
4429     {
4430         if(NdefMap->StdMifareContainer.ReadAcsBitFlag == 
4431             PH_FRINFC_MIFARESTD_FLAG1)
4432         {
4433             /* check for the correct access bits */
4434             Result = phFriNfc_MifStd_H_ChkAcsBit(NdefMap);
4435          
4436             if((NdefMap->StdMifareContainer.ChkNdefFlag == 
4437                 PH_FRINFC_MIFARESTD_FLAG1) && 
4438                 (Result == NFCSTATUS_SUCCESS))
4439             {
4440                 if(NdefMap->CardState == 
4441                     PH_NDEFMAP_CARD_STATE_INVALID)
4442                 {
4443                     NdefMap->StdMifareContainer.NoOfNdefCompBlocks = 
4444                     ((NdefMap->StdMifareContainer.currentBlock >= 
4445                     PH_FRINFC_MIFARESTD4K_BLK128)? 
4446                     (NdefMap->StdMifareContainer.NoOfNdefCompBlocks - 
4447                                     PH_FRINFC_MIFARESTD_BLK15):
4448                     (NdefMap->StdMifareContainer.NoOfNdefCompBlocks - 
4449                                     PH_FRINFC_MIFARESTD_MAD_BLK3));
4450
4451                     NdefMap->StdMifareContainer.ProprforumSectFlag = 
4452                         ((NdefMap->StdMifareContainer.NFCforumSectFlag == 
4453                         PH_FRINFC_MIFARESTD_FLAG1)?
4454                         PH_FRINFC_MIFARESTD_PROP_2ND_CONFIG:
4455                         PH_FRINFC_MIFARESTD_PROP_3RD_CONFIG);
4456
4457                     Result = phFriNfc_MifStd_H_ProStatNotValid(NdefMap, Result);
4458                 }
4459                 else
4460                 {
4461                     NdefMap->StdMifareContainer.NFCforumSectFlag = 
4462                         (((NdefMap->StdMifareContainer.currentBlock == 64) && 
4463                         (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD))?
4464                         NdefMap->StdMifareContainer.NFCforumSectFlag:
4465                                             PH_FRINFC_MIFARESTD_FLAG1);
4466                 }
4467
4468                 if(NdefMap->StdMifareContainer.ProprforumSectFlag != 
4469                     PH_FRINFC_MIFARESTD_PROP_2ND_CONFIG)
4470                 {
4471                     NdefMap->StdMifareContainer.ReadAcsBitFlag = PH_FRINFC_MIFARESTD_FLAG0;
4472                                 /* ((NdefMap->StdMifareContainer.ReadCompleteFlag == 
4473                                         PH_FRINFC_MIFARESTD_FLAG1)?
4474                                         PH_FRINFC_MIFARESTD_FLAG0:
4475                                         PH_FRINFC_MIFARESTD_FLAG1);*/
4476
4477                     NdefMap->StdMifareContainer.ReadCompleteFlag = 
4478                     (uint8_t)((((((NdefMap->StdMifareContainer.currentBlock + 
4479                         PH_FRINFC_MIFARESTD_VAL4) >= 
4480                         PH_FRINFC_MIFARESTD1K_MAX_BLK) && 
4481                         (NdefMap->CardType == 
4482                         PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD)) && 
4483                         (NdefMap->StdMifareContainer.ReadCompleteFlag == 
4484                         PH_FRINFC_MIFARESTD_FLAG0)) || 
4485                         (NdefMap->StdMifareContainer.ReadCompleteFlag == 
4486                         PH_FRINFC_MIFARESTD_FLAG1))?
4487                         PH_FRINFC_MIFARESTD_FLAG1:
4488                         PH_FRINFC_MIFARESTD_FLAG0);
4489
4490                     NdefMap->StdMifareContainer.ReadCompleteFlag = 
4491                     (uint8_t)((((((uint16_t)(NdefMap->StdMifareContainer.currentBlock + 
4492                         PH_FRINFC_MIFARESTD_VAL4) >= 
4493                         PH_FRINFC_MIFARESTD4K_MAX_BLK) && 
4494                         (NdefMap->CardType == 
4495                         PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD)) && 
4496                         (NdefMap->StdMifareContainer.ReadCompleteFlag == 
4497                         PH_FRINFC_MIFARESTD_FLAG0)) || 
4498                         (NdefMap->StdMifareContainer.ReadCompleteFlag == 
4499                         PH_FRINFC_MIFARESTD_FLAG1))?
4500                         PH_FRINFC_MIFARESTD_FLAG1:
4501                         PH_FRINFC_MIFARESTD_FLAG0);
4502
4503                     NdefMap->StdMifareContainer.currentBlock = 
4504                         ((NdefMap->StdMifareContainer.ReadCompleteFlag == 
4505                             PH_FRINFC_MIFARESTD_FLAG1)?
4506                             PH_FRINFC_MIFARESTD_BLK4:
4507                             NdefMap->StdMifareContainer.currentBlock);
4508
4509                     Result = 
4510                     ((NdefMap->StdMifareContainer.ReadCompleteFlag == 
4511                             PH_FRINFC_MIFARESTD_FLAG1)?
4512                             phFriNfc_MifStd_H_BlkChk(NdefMap):
4513                             Result);
4514                 }
4515             }
4516             
4517             Result = ((Result != NFCSTATUS_SUCCESS)?
4518                         Result:
4519                         phFriNfc_MifStd_H_ChkRdWr(NdefMap));
4520         }
4521         else
4522         {
4523             NdefMap->StdMifareContainer.ChkNdefFlag = 
4524                 PH_FRINFC_MIFARESTD_FLAG0;
4525             /* Here its required to read the entire card to know the */
4526             /* Get exact ndef size of the card */
4527             Result = phFriNfc_MifStd_H_ChkTLVs(NdefMap, &CRFlag);
4528         }
4529     }
4530     else
4531     {
4532         /* Since we have decided temporarily not to go
4533             for any new error codes we are using 
4534             NFCSTATUS_INVALID_PARAMETER even though it is not 
4535             the relevant error code here TBD */
4536         Result = PHNFCSTVAL(    CID_FRI_NFC_NDEF_MAP, 
4537                                 NFCSTATUS_INVALID_PARAMETER);
4538     }
4539     
4540     return Result;
4541 }
4542
4543 static NFCSTATUS phFriNfc_MifStd_H_GPBChk(phFriNfc_NdefMap_t        *NdefMap)
4544 {
4545     NFCSTATUS Result = NFCSTATUS_SUCCESS;
4546
4547     /* Spec version needs to be checked every time */
4548     Result = phFriNfc_MapTool_ChkSpcVer(NdefMap, PH_FRINFC_MIFARESTD_VAL9);
4549     
4550     /* Check rhe read and write access field 
4551         in GPB is 00b 
4552         bit 0 and 1 for write access check 
4553         bit 2 and 3 for read access check */
4554     if(Result == NFCSTATUS_SUCCESS)
4555     {
4556         if(((NdefMap->SendRecvBuf[ 
4557             PH_FRINFC_MIFARESTD_VAL9] & 
4558             PH_FRINFC_MIFARESTD_MASK_GPB_WR) == 
4559             PH_FRINFC_MIFARESTD_GPB_RD_WR_VAL) &&
4560             ((NdefMap->SendRecvBuf[ 
4561             PH_FRINFC_MIFARESTD_VAL9] & 
4562             PH_FRINFC_MIFARESTD_MASK_GPB_RD) == 
4563             PH_FRINFC_MIFARESTD_GPB_RD_WR_VAL))
4564         {
4565             NdefMap->CardState = (((NdefMap->StdMifareContainer.ChkNdefFlag == 
4566                                     PH_FRINFC_MIFARESTD_FLAG1) || 
4567                                     (NdefMap->StdMifareContainer.ReadNdefFlag == 
4568                                     PH_FRINFC_MIFARESTD_FLAG1) || 
4569                                     (NdefMap->StdMifareContainer.WrNdefFlag == 
4570                                     PH_FRINFC_MIFARESTD_FLAG1))?
4571                                     PH_NDEFMAP_CARD_STATE_INITIALIZED:
4572                                     PH_NDEFMAP_CARD_STATE_READ_WRITE);
4573         }
4574         else if(((NdefMap->SendRecvBuf[ 
4575             PH_FRINFC_MIFARESTD_VAL9] & 
4576             PH_FRINFC_MIFARESTD_MASK_GPB_WR) != 
4577             PH_FRINFC_MIFARESTD_GPB_RD_WR_VAL) &&
4578             ((NdefMap->SendRecvBuf[ 
4579             PH_FRINFC_MIFARESTD_VAL9] & 
4580             PH_FRINFC_MIFARESTD_MASK_GPB_RD) == 
4581             PH_FRINFC_MIFARESTD_GPB_RD_WR_VAL))
4582         {
4583             /* write access not given
4584             only read access check */
4585             NdefMap->CardState = PH_NDEFMAP_CARD_STATE_READ_ONLY;
4586         }
4587         else
4588         {
4589             NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
4590         }
4591     }
4592     return Result;
4593 }
4594
4595 static NFCSTATUS phFriNfc_MifStd_H_ProStatNotValid(phFriNfc_NdefMap_t        *NdefMap,
4596                                                    NFCSTATUS                 status)
4597 {
4598     NFCSTATUS Result = status;
4599     /* if NFC forum sector is not found before the proprietary one then 
4600         authenticate the next sector 
4601         Else it is a error*/
4602     if(NdefMap->StdMifareContainer.NFCforumSectFlag == 
4603         PH_FRINFC_MIFARESTD_FLAG0)
4604     {
4605         NdefMap->StdMifareContainer.ProprforumSectFlag = 
4606                         PH_FRINFC_MIFARESTD_PROP_3RD_CONFIG;
4607         if(NdefMap->StdMifareContainer.currentBlock < 
4608             PH_FRINFC_MIFARESTD4K_BLK128)
4609         {
4610 #ifdef PH_HAL4_ENABLE
4611             /* Fix for the disovery problem, 
4612                 if 1st sector is invalid then ignore the remaining sectors and 
4613                 send an error if the card is mifare 1k, 
4614                 if the card is mifare 4k, then update the block number to 67 and 
4615                 continue. 
4616                 Even if the authentication of that block fails then send error */
4617             if(((NdefMap->StdMifareContainer.currentBlock < 
4618                 PH_FRINFC_MIFARESTD_BLK4) && 
4619                 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD)) || 
4620                 ((NdefMap->StdMifareContainer.currentBlock <= 
4621                 PH_FRINFC_MIFARESTD_MAD_BLK67) && 
4622                 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD)))
4623             {
4624                 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP, 
4625                                     NFCSTATUS_NO_NDEF_SUPPORT);
4626             }
4627             else if((NdefMap->StdMifareContainer.currentBlock < 
4628                 PH_FRINFC_MIFARESTD_BLK4) && 
4629                 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD))
4630             {
4631                 Result = NFCSTATUS_SUCCESS;
4632                 NdefMap->StdMifareContainer.currentBlock = 
4633                             PH_FRINFC_MIFARESTD_MAD_BLK67;
4634             }
4635             else
4636 #endif /* #ifdef PH_HAL4_ENABLE */
4637             if(((NdefMap->StdMifareContainer.currentBlock + 
4638                 PH_FRINFC_MIFARESTD_BLK4) > 
4639                 PH_FRINFC_MIFARESTD1K_MAX_BLK) && 
4640                 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD))
4641             {
4642                 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP, 
4643                             NFCSTATUS_NO_NDEF_SUPPORT);
4644             }
4645             else
4646             {
4647                 NdefMap->StdMifareContainer.remainingSize -= 
4648                         (PH_FRINFC_MIFARESTD_MAD_BLK3 * PH_FRINFC_MIFARESTD_BLOCK_BYTES);
4649                 NdefMap->StdMifareContainer.currentBlock += 
4650                                 PH_FRINFC_MIFARESTD_BLK4;
4651                 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
4652             }
4653         }
4654         else if((NdefMap->StdMifareContainer.currentBlock + 
4655                 PH_FRINFC_MIFARESTD_BLK15) >  
4656                 PH_FRINFC_MIFARESTD4K_MAX_BLK)
4657         {
4658             Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP, 
4659                         NFCSTATUS_NO_NDEF_SUPPORT);
4660         }
4661         else
4662         {
4663             NdefMap->StdMifareContainer.remainingSize -= 
4664                         (PH_FRINFC_MIFARESTD_BLK15 * PH_FRINFC_MIFARESTD_BLOCK_BYTES);
4665             NdefMap->StdMifareContainer.currentBlock += 
4666                                     PH_FRINFC_MIFARESTD_BLOCK_BYTES;
4667             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
4668         }
4669         Result = ((Result != NFCSTATUS_SUCCESS)?
4670                 (PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP, 
4671                         NFCSTATUS_NO_NDEF_SUPPORT)):
4672                 phFriNfc_MifStd_H_AuthSector(NdefMap));
4673     }
4674     else if((NdefMap->StdMifareContainer.ProprforumSectFlag ==  
4675             PH_FRINFC_MIFARESTD_PROP_3RD_CONFIG) && 
4676             (NdefMap->StdMifareContainer.NFCforumSectFlag == 
4677             PH_FRINFC_MIFARESTD_FLAG1))
4678     {
4679         /*  if the proprietary forum sector are found before 
4680             NFC forum sector then again a proprietary 
4681             forum sector are found after the NFC forum 
4682             sector */
4683         Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP, 
4684                             NFCSTATUS_NO_NDEF_SUPPORT);
4685     }
4686     else
4687     {
4688         NdefMap->StdMifareContainer.ProprforumSectFlag = 
4689                         PH_FRINFC_MIFARESTD_PROP_2ND_CONFIG;
4690         switch(NdefMap->PrevOperation)
4691         {
4692         case PH_FRINFC_NDEFMAP_CHECK_OPE:
4693         case PH_FRINFC_NDEFMAP_GET_ACTSIZE_OPE:
4694             Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP, 
4695                         NFCSTATUS_NO_NDEF_SUPPORT);
4696             break;
4697
4698         case PH_FRINFC_NDEFMAP_READ_OPE:
4699             if((NdefMap->TLVStruct.NdefTLVFoundFlag == 
4700                 PH_FRINFC_MIFARESTD_FLAG1) && 
4701                 (NdefMap->TLVStruct.NoLbytesinTLV ==  
4702                 PH_FRINFC_MIFARESTD_VAL0))
4703             {
4704                 *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
4705                 Result = NFCSTATUS_SUCCESS;
4706             }
4707             else
4708             {
4709                 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP, 
4710                         NFCSTATUS_NO_NDEF_SUPPORT);
4711             }
4712             break;
4713
4714         case PH_FRINFC_NDEFMAP_WRITE_OPE:
4715         default:
4716             /* This means the further write is not possible, 
4717                 EOF_NDEF_CONTAINER_REACHED */
4718             NdefMap->StdMifareContainer.ReadWriteCompleteFlag = 
4719                                 PH_FRINFC_MIFARESTD_FLAG1;
4720             /* Write the length to the L field in the TLV */
4721             NdefMap->StdMifareContainer.TempBlockNo = 
4722                         NdefMap->StdMifareContainer.currentBlock;
4723             phFriNfc_MifStd_H_SetNdefBlkAuth(NdefMap);
4724             NdefMap->StdMifareContainer.currentBlock = 
4725                             NdefMap->TLVStruct.NdefTLVBlock;
4726             Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
4727             break;
4728         }
4729     }
4730     return Result;
4731 }
4732
4733 static NFCSTATUS phFriNfc_MifStd_H_RdBeforeWr(phFriNfc_NdefMap_t        *NdefMap)
4734 {
4735     NFCSTATUS Result = NFCSTATUS_SUCCESS;
4736     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_BEF_WR;
4737     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
4738
4739     Result = phFriNfc_MifStd_H_Rd16Bytes(NdefMap, 
4740                     NdefMap->StdMifareContainer.currentBlock);
4741     return Result;
4742 }
4743
4744 static NFCSTATUS phFriNfc_MifStd_H_ProBytesToWr(phFriNfc_NdefMap_t        *NdefMap)
4745 {
4746     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
4747     uint8_t     TempLength = PH_FRINFC_MIFARESTD_VAL0;
4748     
4749     if(*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ)
4750     {
4751         (void)memcpy(&NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL1],
4752                     NdefMap->SendRecvBuf,
4753                     PH_FRINFC_MIFARESTD_BLOCK_BYTES);
4754
4755         /* Write to Ndef TLV Block */
4756         NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
4757                             NdefMap->StdMifareContainer.currentBlock;
4758
4759         TempLength = ((NdefMap->StdMifareContainer.currentBlock == 
4760                         NdefMap->TLVStruct.NdefTLVBlock)?
4761                         phFriNfc_MifStd_H_UpdateTLV(NdefMap):
4762                         phFriNfc_MifStd_H_UpdRemTLV(NdefMap));
4763
4764         NdefMap->StdMifareContainer.remainingSize -= 
4765             ((NdefMap->StdMifareContainer.remSizeUpdFlag == 
4766             PH_FRINFC_MIFARESTD_FLAG1)?
4767             PH_FRINFC_MIFARESTD_VAL2:
4768             PH_FRINFC_MIFARESTD_VAL0);
4769
4770         NdefMap->StdMifareContainer.remSizeUpdFlag = PH_FRINFC_MIFARESTD_FLAG0;
4771         NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WR_TLV;
4772         Result = ((TempLength == PH_FRINFC_MIFARESTD_BLOCK_BYTES)?
4773                     phFriNfc_MifStd_H_WrTLV(NdefMap):
4774                     phFriNfc_MifStd_H_fillSendBuf(NdefMap, TempLength));
4775     }
4776     else
4777     {
4778         Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP, 
4779                                 NFCSTATUS_READ_FAILED);
4780     }
4781
4782     return Result;
4783 }
4784
4785 static uint8_t phFriNfc_MifStd_H_UpdateTLV(phFriNfc_NdefMap_t *NdefMap)
4786 {
4787     uint8_t     TempLength = PH_FRINFC_MIFARESTD_VAL0;
4788     TempLength = (uint8_t)(NdefMap->TLVStruct.NdefTLVByte + PH_FRINFC_MIFARESTD_VAL1);
4789     /* Creating TLV */
4790     if(NdefMap->TLVStruct.NULLTLVCount >= 2)
4791     {
4792         if((PH_FRINFC_MIFARESTD_BYTES_READ - TempLength) == 
4793             PH_FRINFC_MIFARESTD_VAL0)
4794         {       
4795             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4796         }
4797         else
4798         {
4799             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4800             TempLength++;
4801             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
4802         }
4803     }
4804     else
4805     {
4806         switch((PH_FRINFC_MIFARESTD_BYTES_READ - 
4807                 TempLength))
4808         {
4809         case PH_FRINFC_MIFARESTD_VAL0:
4810             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4811         break;
4812
4813         case PH_FRINFC_MIFARESTD_VAL1:
4814             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4815             TempLength++;
4816             NdefMap->TLVStruct.prevLenByteValue = 
4817                                     (uint16_t)((NdefMap->SendRecvBuf[TempLength] >= 
4818                                     PH_FRINFC_MIFARESTD_NDEFTLV_L)?
4819                                     PH_FRINFC_MIFARESTD_VAL0:
4820                                     NdefMap->SendRecvBuf[TempLength]);
4821             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4822         break;
4823
4824         case PH_FRINFC_MIFARESTD_VAL2:
4825             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4826             TempLength++;
4827             NdefMap->TLVStruct.prevLenByteValue = 
4828                                     (uint16_t)((NdefMap->SendRecvBuf[TempLength] >= 
4829                                     PH_FRINFC_MIFARESTD_NDEFTLV_L)?
4830                                     NdefMap->SendRecvBuf[(TempLength + 
4831                                                 PH_FRINFC_MIFARESTD_VAL1)]:
4832                                     NdefMap->SendRecvBuf[TempLength]);
4833             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4834             TempLength++;
4835             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4836         break;
4837
4838         default:
4839             NdefMap->TLVStruct.prevLenByteValue = 
4840                             NdefMap->SendRecvBuf[TempLength];
4841             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4842             TempLength++;
4843             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4844             TempLength++;
4845             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4846             TempLength++;
4847             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
4848         break;
4849         }
4850     }
4851
4852     return TempLength;
4853 }
4854
4855 static NFCSTATUS phFriNfc_MifStd_H_fillSendBuf(phFriNfc_NdefMap_t        *NdefMap,
4856                                                uint8_t                   Length)
4857 {
4858     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
4859     uint16_t    RemainingBytes = PH_FRINFC_MIFARESTD_VAL0,
4860                 BytesToWrite = PH_FRINFC_MIFARESTD_VAL0;
4861     uint8_t     index = PH_FRINFC_MIFARESTD_VAL0;
4862
4863     Length = (Length + PH_FRINFC_MIFARESTD_VAL1);
4864
4865     RemainingBytes = (uint16_t)((NdefMap->StdMifareContainer.remainingSize 
4866                         < (uint16_t)(NdefMap->ApduBufferSize - 
4867                         NdefMap->ApduBuffIndex))?
4868                         NdefMap->StdMifareContainer.remainingSize:
4869                         (NdefMap->ApduBufferSize - 
4870                         NdefMap->ApduBuffIndex));
4871
4872     NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = 
4873                             NdefMap->StdMifareContainer.currentBlock;
4874         /* Get the number of bytes that can be written after copying 
4875         the internal buffer */
4876     BytesToWrite = ((RemainingBytes < 
4877                     ((PH_FRINFC_MIFARESTD_WR_A_BLK - Length) - 
4878                     NdefMap->StdMifareContainer.internalLength))? 
4879                     RemainingBytes:
4880                     ((PH_FRINFC_MIFARESTD_WR_A_BLK - Length) - 
4881                     NdefMap->StdMifareContainer.internalLength));
4882
4883     if(NdefMap->StdMifareContainer.internalLength > 
4884         PH_FRINFC_MIFARESTD_VAL0)
4885     {
4886         /* copy the internal buffer to the send buffer */
4887         (void)memcpy(&(NdefMap->SendRecvBuf[ 
4888                     Length]),
4889                     NdefMap->StdMifareContainer.internalBuf,
4890                     NdefMap->StdMifareContainer.internalLength);
4891     }
4892
4893     /* Copy Bytes to write in the send buffer */
4894     (void)memcpy(&(NdefMap->SendRecvBuf[ 
4895                 (Length + 
4896                 NdefMap->StdMifareContainer.internalLength)]),
4897                 &(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex]),
4898                 BytesToWrite);
4899
4900     /* update number of bytes written from the user buffer */
4901     NdefMap->NumOfBytesWritten = BytesToWrite;
4902     
4903     /* check the exact number of bytes written to a block including the 
4904         internal length */
4905     *NdefMap->DataCount = 
4906             ((BytesToWrite + NdefMap->StdMifareContainer.internalLength
4907             + Length) - PH_FRINFC_MIFARESTD_VAL1);
4908
4909     /* if total bytes to write in the card is less than 4 bytes then 
4910     pad zeroes till 4 bytes */
4911     if((BytesToWrite + NdefMap->StdMifareContainer.internalLength + 
4912         Length) < PH_FRINFC_MIFARESTD_WR_A_BLK)
4913     {
4914         for(index = (uint8_t)(BytesToWrite + 
4915                     NdefMap->StdMifareContainer.internalLength + 
4916                     Length); 
4917             index < PH_FRINFC_MIFARESTD_WR_A_BLK; 
4918             index++)
4919             {
4920                 NdefMap->SendRecvBuf[index] = (uint8_t)((index == 
4921                                     (BytesToWrite + Length + 
4922                                     NdefMap->StdMifareContainer.internalLength))?
4923                                     PH_FRINFC_MIFARESTD_TERMTLV_T:
4924                                     PH_FRINFC_MIFARESTD_NULLTLV_T);
4925
4926                 NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
4927             }
4928     }
4929 #ifdef PH_HAL4_ENABLE
4930
4931     NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
4932
4933 #endif /* #ifdef PH_HAL4_ENABLE */
4934
4935     /* A temporary buffer to hold four bytes of data that is 
4936         written to the card */
4937     (void)memcpy(NdefMap->StdMifareContainer.Buffer,
4938                 &(NdefMap->SendRecvBuf[ 
4939                 PH_FRINFC_MIFARESTD_VAL1]),
4940                 PH_FRINFC_MIFARESTD_BLOCK_BYTES);
4941
4942     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WR_TLV;
4943     Result = phFriNfc_MifStd_H_WrTLV(NdefMap);
4944     return Result;
4945 }
4946
4947 static NFCSTATUS phFriNfc_MifStd_H_WrTLV(phFriNfc_NdefMap_t        *NdefMap)
4948 {
4949     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
4950
4951     /* set the data for additional data exchange*/
4952     NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
4953     NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
4954     NdefMap->psDepAdditionalInfo.NAD = 0;
4955     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
4956     NdefMap->MapCompletionInfo.Context = NdefMap;
4957     /* Write from here */
4958     NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_WRITE;
4959
4960 #ifndef PH_HAL4_ENABLE
4961     NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareWrite16;
4962 #else
4963     NdefMap->Cmd.MfCmd = phHal_eMifareWrite16;
4964 #endif
4965
4966     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
4967     /* Call the Overlapped HAL Transceive function */ 
4968     Result = phFriNfc_OvrHal_Transceive(    NdefMap->LowerDevice,
4969                                             &NdefMap->MapCompletionInfo,
4970                                             NdefMap->psRemoteDevInfo,
4971                                             NdefMap->Cmd,
4972                                             &NdefMap->psDepAdditionalInfo,
4973                                             NdefMap->SendRecvBuf,
4974                                             NdefMap->SendLength,
4975                                             NdefMap->SendRecvBuf,
4976                                             NdefMap->SendRecvLength);
4977
4978
4979     return Result;
4980 }
4981
4982 static NFCSTATUS phFriNfc_MifStd_H_ProWrTLV(phFriNfc_NdefMap_t        *NdefMap)
4983 {
4984     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
4985     /* Check that if complete TLV has been written in the 
4986         card if yes enter the below check or go to else*/
4987     if(((((PH_FRINFC_MIFARESTD_BLOCK_BYTES - 
4988             NdefMap->TLVStruct.NdefTLVByte) ==  
4989             PH_FRINFC_MIFARESTD_VAL1) && 
4990             (NdefMap->TLVStruct.NULLTLVCount >= 
4991             PH_FRINFC_MIFARESTD_VAL2)) || 
4992             (((PH_FRINFC_MIFARESTD_BLOCK_BYTES - 
4993             NdefMap->TLVStruct.NdefTLVByte) <= 
4994             PH_FRINFC_MIFARESTD_VAL3) && 
4995             (NdefMap->TLVStruct.NULLTLVCount == 
4996             PH_FRINFC_MIFARESTD_VAL0))) && 
4997             (NdefMap->StdMifareContainer.currentBlock == 
4998             NdefMap->TLVStruct.NdefTLVBlock))
4999     {
5000         /* increment the block and chekc the block is in the same sector
5001             using the block check function */
5002         NdefMap->StdMifareContainer.RdBeforeWrFlag = PH_FRINFC_MIFARESTD_FLAG1;
5003         NdefMap->StdMifareContainer.currentBlock++;
5004         NdefMap->StdMifareContainer.NdefBlocks++;
5005         Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
5006         if(Result == NFCSTATUS_SUCCESS)
5007         {
5008             Result = ((NdefMap->StdMifareContainer.AuthDone == 
5009                         PH_FRINFC_MIFARESTD_FLAG0)?
5010                         phFriNfc_MifStd_H_AuthSector(NdefMap):
5011                         phFriNfc_MifStd_H_RdBeforeWr(NdefMap));
5012         }
5013     }
5014     else
5015     {
5016         NdefMap->StdMifareContainer.RdBeforeWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
5017         if(NdefMap->ApduBuffIndex < 
5018                     (uint16_t)NdefMap->ApduBufferSize)
5019         {
5020             if(*NdefMap->DataCount < PH_FRINFC_MIFARESTD_BLOCK_BYTES)
5021             {
5022                 /* Write complete, so next byte shall be */
5023                 NdefMap->StdMifareContainer.internalLength =
5024                     *NdefMap->DataCount;
5025             
5026                 /* Copy bytes less than 16 to internal buffer
5027                     for the next write this can be used */
5028                 (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
5029                         NdefMap->StdMifareContainer.Buffer,
5030                         NdefMap->StdMifareContainer.internalLength);
5031             }
5032
5033             /* Increment the Send Buffer index */
5034              NdefMap->ApduBuffIndex += NdefMap->NumOfBytesWritten;
5035
5036              NdefMap->StdMifareContainer.remainingSize -= 
5037                                         NdefMap->NumOfBytesWritten;
5038
5039              /* Check for the End of Card */
5040             if((NdefMap->StdMifareContainer.remainingSize  == 
5041                 PH_FRINFC_MIFARESTD_VAL0) || 
5042                 (NdefMap->ApduBuffIndex == NdefMap->ApduBufferSize))
5043             {
5044                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = 
5045                 (uint8_t)((NdefMap->StdMifareContainer.remainingSize  == 0)?
5046                     PH_FRINFC_MIFARESTD_FLAG1:PH_FRINFC_MIFARESTD_FLAG0);
5047
5048                 if(NdefMap->StdMifareContainer.internalLength == 
5049                     PH_FRINFC_MIFARESTD_VAL0)
5050                 {
5051                     NdefMap->StdMifareContainer.currentBlock++;
5052                     /* Mifare 4k Card, After 128th Block
5053                     each sector = 16 blocks in Mifare 4k */
5054                     Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
5055                     NdefMap->StdMifareContainer.NdefBlocks++;
5056                 }
5057
5058                 NdefMap->TLVStruct.SetTermTLVFlag = 
5059                     (uint8_t)(((NdefMap->StdMifareContainer.remainingSize == 
5060                             PH_FRINFC_MIFARESTD_VAL0) || 
5061                             (NdefMap->TLVStruct.SetTermTLVFlag == 
5062                             PH_FRINFC_MIFARESTD_FLAG1))?
5063                             PH_FRINFC_MIFARESTD_FLAG1:
5064                             PH_FRINFC_MIFARESTD_FLAG0);
5065                 
5066             }
5067             else
5068             {
5069                 NdefMap->StdMifareContainer.currentBlock++;
5070                 /* Mifare 4k Card, After 128th Block
5071                 each sector = 16 blocks in Mifare 4k */
5072                 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
5073                 if(Result == NFCSTATUS_SUCCESS)
5074                 {
5075                     NdefMap->StdMifareContainer.NdefBlocks++;
5076                     Result = ((NdefMap->StdMifareContainer.AuthDone == 
5077                                 PH_FRINFC_MIFARESTD_FLAG1)?
5078                                 phFriNfc_MifStd_H_WrABlock(NdefMap):
5079                                 phFriNfc_MifStd_H_AuthSector(NdefMap));
5080                 }
5081             }
5082         }
5083     }
5084
5085     if((Result == NFCSTATUS_SUCCESS) && 
5086         (NdefMap->TLVStruct.SetTermTLVFlag != 
5087         PH_FRINFC_MIFARESTD_FLAG1) && 
5088         (NdefMap->StdMifareContainer.remainingSize > 
5089         PH_FRINFC_MIFARESTD_VAL0))
5090     {
5091         Result = phFriNfc_MifStd_H_WrTermTLV(NdefMap);
5092     }
5093     else 
5094     {
5095         if((Result == NFCSTATUS_SUCCESS) && 
5096             (NdefMap->TLVStruct.SetTermTLVFlag == 
5097             PH_FRINFC_MIFARESTD_FLAG1))
5098         {
5099             /* Write the length to the L field in the TLV */
5100             NdefMap->StdMifareContainer.TempBlockNo = 
5101                         NdefMap->StdMifareContainer.currentBlock;
5102             phFriNfc_MifStd_H_SetNdefBlkAuth(NdefMap);
5103             NdefMap->StdMifareContainer.currentBlock = 
5104                             NdefMap->TLVStruct.NdefTLVBlock;
5105             Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
5106         }
5107     }
5108     return Result;
5109 }
5110
5111 static uint8_t phFriNfc_MifStd_H_UpdRemTLV(phFriNfc_NdefMap_t        *NdefMap)
5112 {
5113     uint8_t     TempLength = PH_FRINFC_MIFARESTD_VAL1;
5114     if(NdefMap->TLVStruct.NULLTLVCount >= 
5115         PH_FRINFC_MIFARESTD_VAL2)
5116     {
5117         NdefMap->TLVStruct.prevLenByteValue = NdefMap->SendRecvBuf[TempLength];
5118         NdefMap->SendRecvBuf[TempLength] = 
5119                         PH_FRINFC_MIFARESTD_NDEFTLV_L0;
5120     }
5121     else
5122     {
5123         switch((PH_FRINFC_MIFARESTD_BLOCK_BYTES - 
5124             NdefMap->TLVStruct.NdefTLVByte))
5125         {
5126         case PH_FRINFC_MIFARESTD_VAL1:
5127             NdefMap->TLVStruct.prevLenByteValue = 
5128                     (((NdefMap->SendRecvBuf[TempLength] == 
5129                     PH_FRINFC_MIFARESTD_NDEFTLV_L))?
5130                     (((uint16_t)NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)]
5131                     << PH_FRINFC_MIFARESTD_LEFTSHIFT8) + 
5132                     NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL2)]):
5133                     NdefMap->SendRecvBuf[TempLength]);
5134             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
5135             TempLength++;
5136             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
5137             TempLength++;
5138             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
5139             break;
5140
5141         case PH_FRINFC_MIFARESTD_VAL2:
5142             NdefMap->TLVStruct.prevLenByteValue = 
5143                     (((NdefMap->SendRecvBuf[TempLength] == 
5144                         PH_FRINFC_MIFARESTD_NDEFTLV_L))?
5145                     (((uint16_t)NdefMap->SendRecvBuf[TempLength] << 
5146                     PH_FRINFC_MIFARESTD_LEFTSHIFT8) + 
5147                     NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)]):
5148                     NdefMap->SendRecvBuf[TempLength]);
5149             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
5150             TempLength++;
5151             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
5152             break;
5153
5154         case PH_FRINFC_MIFARESTD_VAL3:
5155         default:
5156             NdefMap->TLVStruct.prevLenByteValue = 
5157                                             ((NdefMap->TLVStruct.prevLenByteValue << 
5158                                             PH_FRINFC_MIFARESTD_LEFTSHIFT8) 
5159                                             + NdefMap->SendRecvBuf[TempLength]);
5160             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
5161             break;
5162         }
5163     }
5164     return TempLength;
5165 }
5166
5167 static void phFriNfc_MifStd_H_fillTLV1(phFriNfc_NdefMap_t        *NdefMap)
5168 {
5169     uint8_t     TempLength = (uint8_t)(NdefMap->TLVStruct.NdefTLVByte + 
5170                             PH_FRINFC_MIFARESTD_VAL1);
5171     
5172     NdefMap->TLVStruct.prevLenByteValue = 
5173                     ((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_CUR)?
5174                     (NdefMap->TLVStruct.prevLenByteValue + 
5175                     NdefMap->ApduBuffIndex):
5176                     NdefMap->ApduBuffIndex);
5177
5178     NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG1;
5179     switch(NdefMap->TLVStruct.NdefTLVByte)
5180     {
5181     case PH_FRINFC_MIFARESTD_VAL0:
5182         if(NdefMap->TLVStruct.prevLenByteValue >=  
5183             PH_FRINFC_MIFARESTD_NDEFTLV_L)
5184         {
5185             NdefMap->SendRecvBuf[TempLength] = 
5186                             (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >> 
5187                             PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
5188             NdefMap->SendRecvBuf[(TempLength + 
5189                                 PH_FRINFC_MIFARESTD_VAL1)] = 
5190                             (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5191         }
5192         else
5193         {
5194             NdefMap->SendRecvBuf[TempLength] = 
5195                             PH_FRINFC_MIFARESTD_NDEFTLV_T;
5196             NdefMap->SendRecvBuf[(TempLength + 
5197                                 PH_FRINFC_MIFARESTD_VAL1)] = 
5198                             (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5199
5200             NdefMap->StdMifareContainer.RdAfterWrFlag = 
5201                                 PH_FRINFC_MIFARESTD_FLAG0;
5202         }
5203         break;
5204
5205     case PH_FRINFC_MIFARESTD_VAL1:
5206         if(NdefMap->TLVStruct.prevLenByteValue >=  
5207             PH_FRINFC_MIFARESTD_NDEFTLV_L)
5208         {
5209             NdefMap->SendRecvBuf[TempLength - PH_FRINFC_MIFARESTD_VAL1] = 
5210                             PH_FRINFC_MIFARESTD_NDEFTLV_L;
5211             NdefMap->SendRecvBuf[TempLength] = 
5212                             (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >> 
5213                             PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
5214             NdefMap->SendRecvBuf[(TempLength + 
5215                                 PH_FRINFC_MIFARESTD_VAL1)] = 
5216                             (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5217         }
5218         else
5219         {
5220             NdefMap->SendRecvBuf[TempLength] = 
5221                             PH_FRINFC_MIFARESTD_NDEFTLV_T;
5222             NdefMap->SendRecvBuf[(TempLength + 
5223                                 PH_FRINFC_MIFARESTD_VAL1)] = 
5224                             (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5225             NdefMap->StdMifareContainer.RdAfterWrFlag = 
5226                                 PH_FRINFC_MIFARESTD_FLAG0;
5227         }           
5228         break;
5229
5230     case PH_FRINFC_MIFARESTD_VAL15:
5231         /* if "Type" of TLV present at byte 15 */
5232         if(NdefMap->TLVStruct.prevLenByteValue >=  
5233             PH_FRINFC_MIFARESTD_NDEFTLV_L)
5234         {
5235             /* Update the null TLV, ndef TLV block and ndef TLV byte */
5236             NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
5237             NdefMap->TLVStruct.NdefTLVBlock = 
5238                                 NdefMap->StdMifareContainer.currentBlock;
5239             NdefMap->TLVStruct.NdefTLVByte = 
5240                                 (TempLength - PH_FRINFC_MIFARESTD_VAL3);
5241             
5242             NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL2)] = 
5243                             PH_FRINFC_MIFARESTD_NDEFTLV_T;
5244             NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL1)] = 
5245                             PH_FRINFC_MIFARESTD_NDEFTLV_L;
5246             NdefMap->SendRecvBuf[TempLength] = 
5247                             (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >> 
5248                             PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
5249         }
5250         else
5251         {
5252             NdefMap->SendRecvBuf[TempLength] = 
5253                             PH_FRINFC_MIFARESTD_NDEFTLV_T;
5254         }           
5255         break;
5256
5257     default:
5258         /* Already the TLV is present so just append the length field */
5259         if(NdefMap->TLVStruct.prevLenByteValue >= 
5260             PH_FRINFC_MIFARESTD_NDEFTLV_L)
5261         {
5262             /* Update the null TLV, ndef TLV block and ndef TLV byte */
5263             NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
5264             NdefMap->TLVStruct.NdefTLVBlock = 
5265                                 NdefMap->StdMifareContainer.currentBlock;
5266             NdefMap->TLVStruct.NdefTLVByte = 
5267                                 (TempLength - PH_FRINFC_MIFARESTD_VAL3);
5268
5269             NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL2)] = 
5270                                 (uint8_t)PH_FRINFC_MIFARESTD_NDEFTLV_T;
5271             NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL1)] = 
5272                                 (uint8_t)PH_FRINFC_MIFARESTD_NDEFTLV_L;
5273             NdefMap->SendRecvBuf[TempLength] = 
5274                                 (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >> 
5275                                 PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
5276             NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)] = 
5277                                 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5278         }
5279         else
5280         {
5281             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
5282             NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)] = 
5283                                 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5284         }
5285         NdefMap->StdMifareContainer.RdAfterWrFlag = 
5286                                 PH_FRINFC_MIFARESTD_FLAG0;
5287         break;
5288     }
5289 }
5290
5291 static void phFriNfc_MifStd_H_fillTLV2(phFriNfc_NdefMap_t        *NdefMap)
5292 {
5293     uint8_t     TempLength = (uint8_t)(NdefMap->TLVStruct.NdefTLVByte + 
5294                                 PH_FRINFC_MIFARESTD_VAL1);
5295     
5296     NdefMap->TLVStruct.prevLenByteValue = ((NdefMap->Offset == 
5297                                     PH_FRINFC_NDEFMAP_SEEK_CUR)?
5298                                     (NdefMap->TLVStruct.prevLenByteValue + 
5299                                     NdefMap->ApduBuffIndex):
5300                                     NdefMap->ApduBuffIndex);
5301     NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG1;
5302     switch(NdefMap->TLVStruct.NdefTLVByte)
5303     {
5304     case PH_FRINFC_MIFARESTD_VAL13:
5305         if(NdefMap->TLVStruct.prevLenByteValue >= 
5306             PH_FRINFC_MIFARESTD_NDEFTLV_L)
5307         {
5308             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
5309             TempLength++;
5310             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L;
5311             TempLength++;
5312             NdefMap->SendRecvBuf[TempLength] = (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >> 
5313                                                 PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
5314         }
5315         else
5316         {
5317             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
5318             TempLength++;
5319             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
5320             TempLength++;
5321
5322             /* Update the null TLV, ndef TLV block and ndef TLV byte */
5323             NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL2;
5324             NdefMap->TLVStruct.NdefTLVBlock = 
5325                                 NdefMap->StdMifareContainer.currentBlock;
5326             NdefMap->TLVStruct.NdefTLVByte = 
5327                                 (TempLength - PH_FRINFC_MIFARESTD_VAL1);
5328
5329             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
5330         }
5331         break;
5332
5333     case PH_FRINFC_MIFARESTD_VAL14:
5334         if(NdefMap->TLVStruct.prevLenByteValue >= 
5335             PH_FRINFC_MIFARESTD_NDEFTLV_L)
5336         {
5337             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
5338             TempLength++;
5339             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L;
5340         }
5341         else
5342         {
5343             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
5344             TempLength++;
5345             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
5346         }
5347         break;
5348
5349     case PH_FRINFC_MIFARESTD_VAL15:
5350         if(NdefMap->TLVStruct.prevLenByteValue >= 
5351             PH_FRINFC_MIFARESTD_NDEFTLV_L)
5352         {
5353             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
5354         }
5355         else
5356         {
5357             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
5358         }
5359         break;
5360
5361     default:
5362         if(NdefMap->TLVStruct.prevLenByteValue >= 
5363             PH_FRINFC_MIFARESTD_NDEFTLV_L)
5364         {
5365             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
5366             TempLength++;
5367             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L;
5368             TempLength++;
5369             NdefMap->SendRecvBuf[TempLength] = (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >> 
5370                                                 PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
5371             TempLength++;
5372             NdefMap->SendRecvBuf[TempLength] = 
5373                                 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5374         }
5375         else
5376         {
5377             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
5378             TempLength++;
5379             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
5380             TempLength++;
5381
5382             /* Update the null TLV, ndef TLV block and ndef TLV byte */
5383             NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL2;
5384             NdefMap->TLVStruct.NdefTLVBlock = 
5385                                 NdefMap->StdMifareContainer.currentBlock;
5386             NdefMap->TLVStruct.NdefTLVByte = 
5387                                 (TempLength - PH_FRINFC_MIFARESTD_VAL1);
5388             
5389             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
5390             TempLength++;
5391             NdefMap->SendRecvBuf[TempLength] = 
5392                                 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5393         }
5394         NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
5395         break;
5396     }
5397 }
5398
5399 static NFCSTATUS phFriNfc_MifStd_H_CallWrNdefLen(phFriNfc_NdefMap_t        *NdefMap)
5400 {
5401     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
5402     if(NdefMap->TLVStruct.NULLTLVCount >= PH_FRINFC_MIFARESTD_VAL2)
5403     {
5404         if((NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL0) || 
5405             (NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL1) ) 
5406         {       
5407             /* In this case, current block is decremented because the 
5408                 NULL TLVs are in the previous block */
5409             NdefMap->StdMifareContainer.currentBlock--;
5410             Result = phFriNfc_MifStd_H_BlkChk_1(NdefMap);
5411         }
5412         else
5413         {         
5414             /* case NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL15: 
5415               Current block is incremented to update the remaining TLV 
5416                 structure */
5417             NdefMap->StdMifareContainer.currentBlock++;
5418             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
5419         }
5420     }
5421     else
5422     {
5423         if((NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL13) || 
5424             (NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL14) || 
5425             (NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL15))
5426         {
5427             /* Current block is incremented to update the remaining TLV 
5428                 structure */
5429             NdefMap->StdMifareContainer.currentBlock++;
5430             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
5431         }
5432     }
5433
5434     Result = ((Result == NFCSTATUS_SUCCESS)?
5435             phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap):
5436             Result);
5437     return Result;
5438 }
5439
5440 static NFCSTATUS phFriNfc_MifStd_H_BlkChk_1(phFriNfc_NdefMap_t        *NdefMap)
5441 {
5442     /* This function is to check the current block is in the authenticated sector and 
5443         also check the block does not match with the sector trailer block. If there is a 
5444         match then decrement the block and say the caller that the authentication 
5445         is required */
5446     NFCSTATUS   Result  = NFCSTATUS_SUCCESS;
5447     uint8_t     SectorID = PH_FRINFC_MIFARESTD_VAL0;
5448     
5449     /* Get a Sector ID for the Current Block */
5450     SectorID = phFriNfc_MifStd_H_GetSect(NdefMap->StdMifareContainer.currentBlock);
5451
5452     /* Check the sector id is valid or not and if valid then check the 
5453         current block is greater than 128 */
5454     if((NdefMap->StdMifareContainer.aid[SectorID] == 
5455         PH_FRINFC_MIFARESTD_NDEF_COMP) && 
5456         (((SectorID <= PH_FRINFC_MIFARESTD_VAL15) && 
5457         (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD)) || 
5458         ((SectorID <= PH_FRINFC_MIFARESTD_SECTOR_NO39) && 
5459         (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD))))
5460     {
5461         if(NdefMap->StdMifareContainer.currentBlock > 128)
5462         {
5463             NdefMap->TLVStruct.NdefTLVAuthFlag = 
5464             ((((NdefMap->StdMifareContainer.currentBlock + 
5465                 PH_FRINFC_MIFARESTD_VAL1) % 
5466                 PH_FRINFC_MIFARESTD_MAD_BLK16) == 
5467                 PH_FRINFC_MIFARESTD_VAL0)?
5468                 PH_FRINFC_MIFARESTD_FLAG1:
5469                 PH_FRINFC_MIFARESTD_FLAG0);
5470
5471                 NdefMap->StdMifareContainer.currentBlock -= 
5472             ((((NdefMap->StdMifareContainer.currentBlock + 
5473                 PH_FRINFC_MIFARESTD_VAL1) % 
5474                 PH_FRINFC_MIFARESTD_MAD_BLK16) == 
5475                 PH_FRINFC_MIFARESTD_VAL0)?
5476                 PH_FRINFC_MIFARESTD_VAL1:
5477                 PH_FRINFC_MIFARESTD_VAL0);
5478
5479         }
5480         else
5481         {
5482             NdefMap->TLVStruct.NdefTLVAuthFlag = 
5483             ((((NdefMap->StdMifareContainer.currentBlock + 
5484                 PH_FRINFC_MIFARESTD_VAL1) % 
5485                 PH_FRINFC_MIFARESTD_BLK4) == 
5486                 PH_FRINFC_MIFARESTD_VAL0)?
5487                 PH_FRINFC_MIFARESTD_FLAG1:
5488                 PH_FRINFC_MIFARESTD_FLAG0);
5489
5490             NdefMap->StdMifareContainer.currentBlock -= 
5491             ((((NdefMap->StdMifareContainer.currentBlock + 
5492                 PH_FRINFC_MIFARESTD_VAL1) % 
5493                 PH_FRINFC_MIFARESTD_BLK4) == 
5494                 PH_FRINFC_MIFARESTD_VAL1)?
5495                 PH_FRINFC_MIFARESTD_VAL1:
5496                 PH_FRINFC_MIFARESTD_VAL0);
5497                 
5498         }
5499     }
5500     else
5501     {
5502         /*Error: No Ndef Compliant Sectors present.*/
5503         Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 
5504                             NFCSTATUS_INVALID_PARAMETER);
5505     }
5506     
5507     return Result;
5508 }
5509
5510 static void phFriNfc_MifStd_H_fillTLV1_1(phFriNfc_NdefMap_t        *NdefMap)
5511 {
5512     switch(NdefMap->TLVStruct.NdefTLVByte)
5513     {
5514     case PH_FRINFC_MIFARESTD_VAL0:
5515         /* In the first write ndef length procedure, the 
5516             length is updated, in this case T and L = 0xFF of TLV are 
5517             updated */
5518         NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
5519         NdefMap->TLVStruct.NdefTLVBlock = 
5520                             NdefMap->StdMifareContainer.currentBlock;
5521         NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL14;
5522
5523         NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL15] = 
5524                                 PH_FRINFC_MIFARESTD_NDEFTLV_T;
5525         NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL16] = 
5526                                 PH_FRINFC_MIFARESTD_NDEFTLV_L;
5527         break;
5528
5529     case PH_FRINFC_MIFARESTD_VAL1:
5530         /* In the first write ndef length procedure, the 
5531             length is updated, in this case T of TLV is 
5532             updated */
5533         NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
5534         NdefMap->TLVStruct.NdefTLVBlock = 
5535                             NdefMap->StdMifareContainer.currentBlock;
5536         NdefMap->TLVStruct.NdefTLVByte = 
5537                             PH_FRINFC_MIFARESTD_VAL15;
5538         NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL16] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
5539         break;
5540
5541     case PH_FRINFC_MIFARESTD_VAL15:
5542     default:
5543         /* In the first ndef write length, part of the L field or only T 
5544             (if update length is less than 255) is updated */
5545         NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL1] = 
5546                                     (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5547         break;
5548     }
5549     NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
5550 }
5551
5552 static void phFriNfc_MifStd_H_fillTLV2_1(phFriNfc_NdefMap_t        *NdefMap)
5553 {
5554     uint8_t     TempLength = PH_FRINFC_MIFARESTD_VAL1;
5555     switch(NdefMap->TLVStruct.NdefTLVByte)
5556     {       
5557     case PH_FRINFC_MIFARESTD_VAL13:
5558         /* In last write ndef length, part of length (L) field of TLV 
5559             is updated now */
5560         NdefMap->SendRecvBuf[TempLength] = 
5561                     (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5562         break;
5563
5564     case PH_FRINFC_MIFARESTD_VAL14:
5565         /* In last write ndef length, part of length (L) field of TLV 
5566                 is updated now */
5567         if(NdefMap->TLVStruct.prevLenByteValue >= 
5568                     PH_FRINFC_MIFARESTD_NDEFTLV_L)
5569         {
5570             NdefMap->SendRecvBuf[TempLength] = 
5571                             (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >> 
5572                             PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
5573             TempLength++;
5574             NdefMap->SendRecvBuf[TempLength] = 
5575                             (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5576         }
5577         else
5578         {
5579             NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL2;
5580             NdefMap->TLVStruct.NdefTLVBlock = 
5581                                 NdefMap->StdMifareContainer.currentBlock;
5582             NdefMap->TLVStruct.NdefTLVByte = 
5583                                 (TempLength - PH_FRINFC_MIFARESTD_VAL1);
5584             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
5585             TempLength++;
5586             NdefMap->SendRecvBuf[TempLength] = 
5587                                         (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5588         }
5589         break;
5590
5591     case PH_FRINFC_MIFARESTD_VAL15:
5592     default:
5593         if(NdefMap->TLVStruct.prevLenByteValue >= 
5594             PH_FRINFC_MIFARESTD_NDEFTLV_L)
5595         {
5596             /* In last write ndef length, only T of TLV is updated and 
5597                 length (L) field of TLV is updated now */
5598             NdefMap->SendRecvBuf[TempLength] = 
5599                             PH_FRINFC_MIFARESTD_NDEFTLV_L;
5600             TempLength++;
5601             NdefMap->SendRecvBuf[TempLength] = 
5602                             (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >> 
5603                             PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
5604             TempLength++;
5605             NdefMap->SendRecvBuf[TempLength] = 
5606                             (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5607         }
5608         else
5609         {
5610             NdefMap->SendRecvBuf[TempLength] = 
5611                             PH_FRINFC_MIFARESTD_NULLTLV_T;
5612             TempLength++;
5613             NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL2;
5614             NdefMap->TLVStruct.NdefTLVBlock = 
5615                                 NdefMap->StdMifareContainer.currentBlock;
5616             NdefMap->TLVStruct.NdefTLVByte = 
5617                                 (TempLength - PH_FRINFC_MIFARESTD_VAL1);
5618             NdefMap->SendRecvBuf[TempLength] = 
5619                             PH_FRINFC_MIFARESTD_NDEFTLV_T;
5620             TempLength++;
5621             NdefMap->SendRecvBuf[TempLength] = 
5622                         (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5623         }
5624         break;
5625     }
5626     NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
5627 }
5628
5629 static NFCSTATUS phFriNfc_MifStd_H_RdTLV(phFriNfc_NdefMap_t        *NdefMap)
5630 {
5631     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
5632     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_TLV;
5633     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE;
5634
5635     Result = phFriNfc_MifStd_H_Rd16Bytes(NdefMap, 
5636                 NdefMap->StdMifareContainer.currentBlock);
5637     return Result;
5638 }
5639
5640 static NFCSTATUS phFriNfc_MifStd_H_ProRdTLV(phFriNfc_NdefMap_t        *NdefMap)
5641 {
5642     NFCSTATUS   Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
5643                                     NFCSTATUS_INVALID_DEVICE_REQUEST);
5644     uint8_t     TempLength = PH_FRINFC_MIFARESTD_VAL0,
5645                 NDEFFlag = PH_FRINFC_MIFARESTD_FLAG1;
5646
5647     /*TempLength = (uint8_t)(((NdefMap->TLVStruct.NULLTLVCount >= 
5648                 PH_FRINFC_MIFARESTD_VAL2) && 
5649                 (NdefMap->TLVStruct.BytesRemainLinTLV > 0xFE))?
5650                 ((NdefMap->TLVStruct.NdefTLVByte + 
5651                 PH_FRINFC_MIFARESTD_VAL2)%
5652                 PH_FRINFC_MIFARESTD_VAL16):
5653                 ((NdefMap->TLVStruct.NdefTLVByte + 
5654                 PH_FRINFC_MIFARESTD_VAL4)%
5655                 PH_FRINFC_MIFARESTD_VAL16));*/
5656
5657     TempLength = (uint8_t)((NdefMap->TLVStruct.BytesRemainLinTLV <= 0xFE)?
5658                         ((NdefMap->TLVStruct.NdefTLVByte + 
5659                         PH_FRINFC_MIFARESTD_VAL2)%
5660                         PH_FRINFC_MIFARESTD_VAL16):
5661                         ((NdefMap->TLVStruct.NdefTLVByte + 
5662                         PH_FRINFC_MIFARESTD_VAL4)%
5663                         PH_FRINFC_MIFARESTD_VAL16));
5664
5665     if((*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ) && 
5666         (NdefMap->ApduBuffIndex < NdefMap->ApduBufferSize))
5667     {
5668         if(NdefMap->TLVStruct.BytesRemainLinTLV != 0)
5669         {
5670             NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
5671             /* To read the remaining length (L) in TLV */
5672             Result = phFriNfc_MifStd_H_RemainTLV(NdefMap, &NDEFFlag, &TempLength);
5673         }
5674     }
5675     return Result;
5676 }
5677
5678 static NFCSTATUS phFriNfc_MifStd_H_WrTermTLV(phFriNfc_NdefMap_t   *NdefMap)
5679 {
5680     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
5681     uint8_t     index = PH_FRINFC_MIFARESTD_VAL0;
5682
5683     /* Change the state to check ndef compliancy */
5684     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_TERM_TLV;
5685     
5686     NdefMap->SendRecvBuf[index] = 
5687                         NdefMap->StdMifareContainer.currentBlock;
5688     index++;
5689     NdefMap->SendRecvBuf[index] = PH_FRINFC_MIFARESTD_TERMTLV_T;
5690     index++;
5691
5692     while(index < PH_FRINFC_MIFARESTD_WR_A_BLK)
5693     {
5694         NdefMap->SendRecvBuf[index] = PH_FRINFC_MIFARESTD_NULLTLV_T;
5695         index++;
5696     }
5697
5698     NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
5699
5700     Result = phFriNfc_MifStd_H_WrTLV(NdefMap);
5701     
5702     return Result;
5703 }
5704
5705
5706 static NFCSTATUS phFriNfc_MifStd_H_ProWrABlock(phFriNfc_NdefMap_t   *NdefMap)
5707 {
5708     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
5709
5710     NdefMap->StdMifareContainer.WrLength = PH_FRINFC_MIFARESTD_VAL0;
5711     if(NdefMap->ApduBuffIndex < 
5712         (uint16_t)NdefMap->ApduBufferSize)
5713     {
5714         /* Remaining bytes to write < 16 */
5715         if(NdefMap->StdMifareContainer.RemainingBufFlag == 
5716             PH_FRINFC_MIFARESTD_FLAG1)
5717         {
5718             /* Write complete, so next byte shall be */
5719             NdefMap->StdMifareContainer.internalLength =
5720                 *NdefMap->DataCount;
5721         
5722             /* Copy bytes less than 16 to internal buffer
5723                 for the next write this can be used */
5724             (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
5725                     NdefMap->StdMifareContainer.Buffer,
5726                     NdefMap->StdMifareContainer.internalLength);
5727
5728             /* Increment the Send Buffer index */
5729             NdefMap->ApduBuffIndex += NdefMap->NumOfBytesWritten;
5730
5731             NdefMap->StdMifareContainer.remainingSize -= 
5732                     NdefMap->NumOfBytesWritten;
5733
5734             NdefMap->StdMifareContainer.RemainingBufFlag = PH_FRINFC_MIFARESTD_VAL0;
5735             /* Check for the End of Card */
5736                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = 
5737                     (uint8_t)((NdefMap->StdMifareContainer.remainingSize == 
5738                     PH_FRINFC_MIFARESTD_VAL0)?
5739                     PH_FRINFC_MIFARESTD_FLAG1:
5740                     PH_FRINFC_MIFARESTD_FLAG0);
5741
5742             NdefMap->TLVStruct.SetTermTLVFlag = 
5743                     (uint8_t)(((NdefMap->StdMifareContainer.remainingSize == 
5744                             PH_FRINFC_MIFARESTD_VAL0) || 
5745                             (NdefMap->TLVStruct.SetTermTLVFlag == 
5746                             PH_FRINFC_MIFARESTD_FLAG1))?
5747                             PH_FRINFC_MIFARESTD_FLAG1:
5748                             PH_FRINFC_MIFARESTD_FLAG0);
5749
5750         } /* internal Buffer > Send Buffer */
5751         else if(NdefMap->StdMifareContainer.internalBufFlag == 
5752                 PH_FRINFC_MIFARESTD_FLAG1)
5753         {
5754             (void)memcpy(NdefMap->StdMifareContainer.internalBuf,
5755                     NdefMap->StdMifareContainer.Buffer,
5756                     *NdefMap->DataCount);
5757
5758             NdefMap->StdMifareContainer.internalLength =
5759                                     *NdefMap->DataCount;
5760
5761             /* Increment the Send Buffer index */
5762             NdefMap->ApduBuffIndex += 
5763                     NdefMap->NumOfBytesWritten;
5764
5765             NdefMap->StdMifareContainer.remainingSize -= 
5766                     NdefMap->NumOfBytesWritten;
5767
5768             NdefMap->StdMifareContainer.internalBufFlag = 
5769                                 PH_FRINFC_MIFARESTD_FLAG0;
5770             /* Check for the End of Card */
5771             NdefMap->StdMifareContainer.ReadWriteCompleteFlag = 
5772                 (uint8_t)(((NdefMap->StdMifareContainer.remainingSize == 
5773                     PH_FRINFC_MIFARESTD_VAL0) &&
5774                     (NdefMap->StdMifareContainer.internalLength == 
5775                     PH_FRINFC_MIFARESTD_VAL0))?
5776                     PH_FRINFC_MIFARESTD_FLAG1:
5777                     PH_FRINFC_MIFARESTD_FLAG0);
5778
5779             NdefMap->TLVStruct.SetTermTLVFlag = 
5780                     (uint8_t)(((NdefMap->StdMifareContainer.remainingSize == 
5781                             PH_FRINFC_MIFARESTD_VAL0) || 
5782                             (NdefMap->TLVStruct.SetTermTLVFlag == 
5783                             PH_FRINFC_MIFARESTD_FLAG1))?
5784                             PH_FRINFC_MIFARESTD_FLAG1:
5785                             PH_FRINFC_MIFARESTD_FLAG0);
5786         }
5787         else
5788         {
5789             NdefMap->StdMifareContainer.internalLength = 0;
5790             /* Increment the Send Buffer index */
5791             NdefMap->ApduBuffIndex += 
5792                     NdefMap->NumOfBytesWritten;
5793             NdefMap->StdMifareContainer.remainingSize -= 
5794                     NdefMap->NumOfBytesWritten;
5795             
5796             /* Check for the End of Card */
5797             if((NdefMap->StdMifareContainer.remainingSize == 
5798                     PH_FRINFC_MIFARESTD_VAL0) || 
5799                     (NdefMap->ApduBuffIndex == NdefMap->ApduBufferSize))
5800             {
5801                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = 
5802                 (uint8_t)((NdefMap->StdMifareContainer.remainingSize == 0)?
5803                     PH_FRINFC_MIFARESTD_FLAG1:PH_FRINFC_MIFARESTD_FLAG0);
5804
5805                 if(NdefMap->StdMifareContainer.internalLength == 
5806                     PH_FRINFC_MIFARESTD_VAL0)
5807                 {
5808                     NdefMap->StdMifareContainer.currentBlock++;
5809                     /* Mifare 4k Card, After 128th Block
5810                     each sector = 16 blocks in Mifare 4k */
5811                     Result = ((NdefMap->StdMifareContainer.remainingSize == 0)?
5812                                 Result:
5813                                 phFriNfc_MifStd_H_BlkChk(NdefMap));
5814                     NdefMap->StdMifareContainer.NdefBlocks++;
5815                 }
5816                 NdefMap->TLVStruct.SetTermTLVFlag = 
5817                     (uint8_t)(((NdefMap->StdMifareContainer.remainingSize == 
5818                             PH_FRINFC_MIFARESTD_VAL0) || 
5819                             (NdefMap->TLVStruct.SetTermTLVFlag == 
5820                             PH_FRINFC_MIFARESTD_FLAG1))?
5821                             PH_FRINFC_MIFARESTD_FLAG1:
5822                             PH_FRINFC_MIFARESTD_FLAG0);
5823             }
5824             else
5825             {
5826                 NdefMap->StdMifareContainer.currentBlock++;
5827                 NdefMap->StdMifareContainer.WrLength = 
5828                     (uint16_t)(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex);
5829                 /* Mifare 4k Card, After 128th Block
5830                 each sector = 16 blocks in Mifare 4k */
5831                 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
5832                 if(Result == NFCSTATUS_SUCCESS)
5833                 {
5834                     NdefMap->StdMifareContainer.NdefBlocks++;
5835                     Result = ((NdefMap->StdMifareContainer.AuthDone == 
5836                                 PH_FRINFC_MIFARESTD_FLAG1)?
5837                                 phFriNfc_MifStd_H_WrABlock(NdefMap):
5838                                 phFriNfc_MifStd_H_AuthSector(NdefMap));
5839                 }
5840             }
5841         }
5842     }
5843     else
5844     {
5845         Result = PHNFCSTVAL(    CID_FRI_NFC_NDEF_MAP, 
5846                                 NFCSTATUS_INVALID_DEVICE_REQUEST); 
5847     }
5848
5849     if((Result == NFCSTATUS_SUCCESS) && 
5850         (NdefMap->TLVStruct.SetTermTLVFlag != 
5851         PH_FRINFC_MIFARESTD_FLAG1) && 
5852         (NdefMap->StdMifareContainer.remainingSize > 
5853         PH_FRINFC_MIFARESTD_VAL0))
5854     {
5855         Result = phFriNfc_MifStd_H_WrTermTLV(NdefMap);
5856     }
5857     else 
5858     {
5859         if((Result == NFCSTATUS_SUCCESS) && 
5860             (NdefMap->TLVStruct.SetTermTLVFlag == 
5861             PH_FRINFC_MIFARESTD_FLAG1))
5862         {
5863             /* Write the length to the L field in the TLV */
5864             NdefMap->StdMifareContainer.TempBlockNo = 
5865                         NdefMap->StdMifareContainer.currentBlock;
5866             phFriNfc_MifStd_H_SetNdefBlkAuth(NdefMap);
5867             NdefMap->StdMifareContainer.currentBlock = 
5868                             NdefMap->TLVStruct.NdefTLVBlock;
5869             Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
5870         }
5871     }
5872     return Result;
5873 }
5874
5875 static NFCSTATUS phFriNfc_MifStd_H_CallDisCon(phFriNfc_NdefMap_t   *NdefMap)
5876 {
5877     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
5878     /*Set Ndef State*/
5879     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_DISCONNECT;
5880     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
5881     NdefMap->MapCompletionInfo.Context = NdefMap; 
5882
5883 #ifndef PH_HAL4_ENABLE
5884     /*Call the Overlapped HAL POLL function */
5885     Result =  phFriNfc_OvrHal_Disconnect( NdefMap->LowerDevice,
5886                                           &NdefMap->MapCompletionInfo,
5887                                           NdefMap->psRemoteDevInfo);
5888 #else
5889     /*Call the Overlapped HAL Reconnect function */
5890     Result =  phFriNfc_OvrHal_Reconnect( NdefMap->LowerDevice,
5891                                           &NdefMap->MapCompletionInfo,
5892                                           NdefMap->psRemoteDevInfo);
5893 #endif
5894
5895     return Result;
5896 }
5897
5898 #ifndef PH_HAL4_ENABLE
5899 static NFCSTATUS phFriNfc_MifStd_H_CallPoll(phFriNfc_NdefMap_t   *NdefMap)
5900 {
5901     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
5902     /*Set Ndef State*/
5903     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_POLL;
5904     /* Opmodes */
5905     NdefMap->OpModeType[PH_FRINFC_MIFARESTD_VAL0] = phHal_eOpModesMifare;
5906     NdefMap->OpModeType[PH_FRINFC_MIFARESTD_VAL1] = phHal_eOpModesArrayTerminator;
5907
5908     /* Number of devices to poll */
5909     NdefMap->NoOfDevices = PH_FRINFC_MIFARESTD_VAL1;
5910
5911     /*Call the Overlapped HAL POLL function */
5912     Result =  phFriNfc_OvrHal_Poll( NdefMap->LowerDevice,
5913                                     &NdefMap->MapCompletionInfo,
5914                                     NdefMap->OpModeType,
5915                                     NdefMap->psRemoteDevInfo,
5916                                     &NdefMap->NoOfDevices,
5917                                     NdefMap->StdMifareContainer.DevInputParam);
5918     return Result;
5919 }
5920 #endif
5921
5922 static NFCSTATUS phFriNfc_MifStd_H_CallConnect(phFriNfc_NdefMap_t   *NdefMap)
5923 {
5924     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
5925     /*Set Ndef State*/
5926     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_CONNECT;
5927
5928     /*Call the Overlapped HAL POLL function */
5929     Result =  phFriNfc_OvrHal_Connect(  NdefMap->LowerDevice,
5930                                         &NdefMap->MapCompletionInfo,
5931                                         NdefMap->psRemoteDevInfo,
5932                                         NdefMap->StdMifareContainer.DevInputParam);
5933     return Result;
5934 }
5935
5936 static void phFriNfc_MifStd1k_H_BlkChk(phFriNfc_NdefMap_t   *NdefMap,
5937                                     uint8_t              SectorID,
5938                                     uint8_t              *callbreak)
5939 {
5940     /* every last block of a sector needs to be skipped */
5941     if(((NdefMap->StdMifareContainer.currentBlock + PH_FRINFC_MIFARESTD_INC_1) % 
5942         PH_FRINFC_MIFARESTD_BLK4) == 0)
5943     {
5944         NdefMap->StdMifareContainer.currentBlock++;                     
5945     }
5946     else 
5947     {
5948         if(NdefMap->StdMifareContainer.aid[SectorID] == 
5949             PH_FRINFC_MIFARESTD_NDEF_COMP)
5950         {
5951             /* Check whether the block is first block of a (next)new sector and 
5952             also check if it is first block then internal length is zero 
5953             or not. Because once Authentication is done for the sector again 
5954             we should not authenticate it again */
5955             if((NdefMap->StdMifareContainer.currentBlock == 
5956                 (SectorID * PH_FRINFC_MIFARESTD_BLK4)) &&
5957                 (NdefMap->StdMifareContainer.internalLength == 0))
5958             {
5959                 NdefMap->StdMifareContainer.AuthDone = 0;
5960             }
5961             *callbreak = 1;
5962         }
5963         else
5964         {
5965             NdefMap->StdMifareContainer.currentBlock += PH_FRINFC_MIFARESTD_BLK4;
5966         }
5967     }
5968 }
5969
5970 #ifdef UNIT_TEST
5971 #include <phUnitTestNfc_MifareStd_static.c>
5972 #endif
5973
5974 #endif  /* PH_FRINFC_MAP_MIFARESTD_DISABLED */