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_MifareUL.c
19  * \brief This component encapsulates read/write/check ndef/process functionalities,
20  *        for the Mifare UL card.
21  *
22  * Project: NFC-FRI
23  *
24  * $Date: Wed Feb 17 15:18:08 2010 $
25  * $Author: ing07385 $
26  * $Revision: 1.36 $
27  * $Aliases: NFC_FRI1.1_WK1007_R33_1,NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $
28  *
29  */
30 
31 #ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED
32 
33 #include <phFriNfc_NdefMap.h>
34 #include <phFriNfc_MifareULMap.h>
35 #include <phFriNfc_MapTools.h>
36 #include <phFriNfc_OvrHal.h>
37 #include <phFriNfc.h>
38 
39 
40 /*! \ingroup grp_file_attributes
41  *  \name NDEF Mapping
42  *
43  * File: \ref phFriNfc_MifareUL.c
44  *
45  */
46 /*@{*/
47 #define PHFRINFCNDEFMAP_FILEREVISION "$Revision: 1.35 $"
48 #define PHFRINFCNDEFMAP_FILEALIASES  "$Aliases: NFC_FRI1.1_WK1007_R33_1,NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $"
49 /*@}*/
50 /* Completion Helper */
51 static void phFriNfc_MifareUL_H_Complete(phFriNfc_NdefMap_t  *NdefMap,
52                                         NFCSTATUS            Status);
53 
54 /*!
55  * \brief \copydoc page_ovr Helper function for Mifare UL. This function reads
56  *  a 16 bytes from the card.
57  */
58 static NFCSTATUS phFriNfc_MfUL_H_Rd16Bytes( phFriNfc_NdefMap_t  *NdefMap);
59 
60 /*!
61  * \brief \copydoc page_ovr Helper function for Mifare UL. This function is
62  *  to find NDEF TLV
63  */
64 static NFCSTATUS phFriNfc_MfUL_H_findNDEFTLV(phFriNfc_NdefMap_t *NdefMap,
65                                         uint8_t                 *CRFlag);
66 
67 /*!
68  * \brief \copydoc page_ovr Helper function for Mifare UL. This function is
69  *  to check the completing the reading 16 bytes
70  */
71 static NFCSTATUS phFriNfc_MfUL_H_Chk16Bytes(phFriNfc_NdefMap_t   *NdefMap,
72                                             uint16_t             TempLength);
73 
74 
75 /*!
76  * \brief \copydoc page_ovr Helper function for Mifare UL. This function is
77  *  to read 16 bytes for the finding the ndef TLV
78  */
79 static NFCSTATUS phFriNfc_MfUL_H_RdCardfindNdefTLV( phFriNfc_NdefMap_t  *NdefMap,
80                                                  uint8_t                BlockNo);
81 
82 /*!
83  * \brief \copydoc page_ovr Helper function for Mifare UL. This function is
84  *  to check the remaining size of the 3 byte of length field in TLV
85  */
86 static NFCSTATUS phFriNfc_MfUL_H_ChkRemainTLV(phFriNfc_NdefMap_t  *NdefMap,
87                                               uint8_t             *CRFlag);
88 
89 /*!
90  * \brief \copydoc page_ovr Helper function for Mifare UL. This function is
91  *  to byte and block number of the next TLV in the card and updating the
92  *  remaining free space in the card
93  */
94 static void phFriNfc_MfUL_H_UpdateLen(phFriNfc_NdefMap_t        *NdefMap,
95                                       uint16_t                  DataLen);
96 
97 /*!
98  * \brief \copydoc page_ovr Helper function for Mifare UL. Depending on the
99  * operation (read/write/check ndef), the next function is called
100  */
101 static NFCSTATUS phFriNfc_MfUL_H_NxtOp(phFriNfc_NdefMap_t       *NdefMap,
102                                        uint8_t                  *CRFlag);
103 
104 /*!
105  * \brief \copydoc page_ovr Helper function for Mifare UL function. This
106  * function is to copy the read bytes to the internal "ReadBuf" buffer
107  */
108 static NFCSTATUS phFriNfc_MfUL_H_CopyRdBytes(phFriNfc_NdefMap_t  *NdefMap);
109 
110 /*!
111  * \brief \copydoc page_ovr Helper function for Mifare UL function. This
112  * function is to copy the read bytes to the user buffer
113  */
114 static NFCSTATUS phFriNfc_MfUL_H_CpDataToUserBuf(phFriNfc_NdefMap_t *NdefMap);
115 
116 /*!
117  * \brief \copydoc page_ovr Helper function for Mifare UL function. This
118  * function is to write 4 bytes to 1 block in the card
119  */
120 static NFCSTATUS   phFriNfc_MfUL_H_Wr4bytes(phFriNfc_NdefMap_t  *NdefMap);
121 
122 /*!
123  * \brief \copydoc page_ovr Helper function for Mifare UL function. This
124  * function is to check the CC bytes in block 3 card
125  */
126 static NFCSTATUS phFriNfc_MfUL_H_ChkCCBytes(phFriNfc_NdefMap_t  *NdefMap);
127 
128 /*!
129  * \brief \copydoc page_ovr Helper function for Mifare UL function. This
130  * function is to read the TLVs and then start writing
131  */
132 static NFCSTATUS phFriNfc_MfUL_H_RdBeforeWrite(phFriNfc_NdefMap_t  *NdefMap);
133 
134 /*!
135  * \brief \copydoc page_ovr Helper function for Mifare UL function. This
136  * function is to call write operation after reading the NDEF TLV block
137  */
138 static NFCSTATUS phFriNfc_MfUL_H_CallWrOp(phFriNfc_NdefMap_t        *NdefMap);
139 
140 /*!
141  * \brief \copydoc page_ovr Helper function for Mifare UL function. This
142  * function is to process the written data
143  */
144 static NFCSTATUS phFriNfc_MfUL_H_ProWrittenBytes(phFriNfc_NdefMap_t *NdefMap);
145 
146 /*!
147  * \brief \copydoc page_ovr Helper function for Mifare UL function. This
148  * function is to fill the send buffer before write
149  */
150 static NFCSTATUS phFriNfc_MfUL_H_fillSendBufToWr(phFriNfc_NdefMap_t *NdefMap);
151 
152 /*!
153  * \brief \copydoc page_ovr Helper function for Mifare UL function. This
154  * function is to update the length L of the TLV
155  */
156 static NFCSTATUS phFriNfc_MfUL_H_UpdateWrLen(phFriNfc_NdefMap_t *NdefMap);
157 
158 /*!
159  * \brief \copydoc page_ovr Helper function for Mifare UL function. This
160  * function is to write the terminator TLV after writing all the bytes
161  */
162 static NFCSTATUS phFriNfc_MfUL_H_WrTermTLV(phFriNfc_NdefMap_t   *NdefMap);
163 
164 #ifdef LOCK_BITS_CHECK_ENABLE
165     static
166     void
167     phFriNfc_MfUL_H_ChkLockBits (
168         phFriNfc_NdefMap_t *NdefMap);
169 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
170 
171 /*!
172  * \brief \copydoc select sector function for Mifare UL function. This
173  * function is to write the terminator TLV after writing all the bytes
174  */
175 static NFCSTATUS  phFriNfc_MfUL_H_SelectSector(phFriNfc_NdefMap_t  *NdefMap,
176                                                    uint8_t              SectorNo,
177                                                    uint8_t              CmdNo,
178                                                    uint8_t              NextState);
179 
180 
181 
182 static void phFriNfc_MfUL_H_UpdateCrc( uint8_t ch,
183                                           uint16_t *lpwCrc );
184 
185 static void phFriNfc_MfUL_H_ComputeCrc( int      CRCType,
186                                  uint8_t  *Data,
187                                  int      Length,
188                                  uint8_t  *TransmitFirst,
189                                  uint8_t  *TransmitSecond
190                                  );
191 
192 static void
193 phFriNfc_MfUL_CalcByteNum(phFriNfc_NdefMap_t *NdefMap);
194 
195 
196 #define CRC_A 0
197 #define CRC_B 1
198 
199 
phFriNfc_MifareUL_H_Reset(phFriNfc_NdefMap_t * NdefMap)200 NFCSTATUS phFriNfc_MifareUL_H_Reset(phFriNfc_NdefMap_t        *NdefMap)
201 {
202     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
203 
204     if ( NdefMap == NULL)
205     {
206         Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
207     }
208     else
209     {
210         /* TLV structure initialisation */
211         NdefMap->TLVStruct.NdefTLVBlock = PH_FRINFC_NDEFMAP_MFUL_VAL4;
212         NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_NDEFMAP_MFUL_VAL0;
213         NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_NDEFMAP_MFUL_VAL0;
214         NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_NDEFMAP_MFUL_VAL0;
215         NdefMap->TLVStruct.prevLenByteValue = PH_FRINFC_NDEFMAP_MFUL_VAL0;
216         NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
217         NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
218         NdefMap->TLVStruct.ActualSize = PH_FRINFC_NDEFMAP_MFUL_VAL0;
219         NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
220         NdefMap->TLVStruct.WrLenFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
221 
222         /* Mifare UL container initialisation */
223         NdefMap->MifareULContainer.ByteNumber = PH_FRINFC_NDEFMAP_MFUL_VAL0;
224         NdefMap->MifareULContainer.CRindex = PH_FRINFC_NDEFMAP_MFUL_VAL0;
225         NdefMap->MifareULContainer.CurrentSector = PH_FRINFC_NDEFMAP_MFUL_VAL0;
226         NdefMap->MifareULContainer.CurrentBlock = PH_FRINFC_NDEFMAP_MFUL_VAL0;
227         NdefMap->MifareULContainer.InternalLength = PH_FRINFC_NDEFMAP_MFUL_VAL0;
228         NdefMap->MifareULContainer.ReadBufIndex = PH_FRINFC_NDEFMAP_MFUL_VAL0;
229         NdefMap->MifareULContainer.ReadWriteCompleteFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
230         NdefMap->MifareULContainer.RemainingSize = PH_FRINFC_NDEFMAP_MFUL_VAL0;
231 
232         /* Fill all the structure related buffer to ZERO */
233         (void)memset(NdefMap->TLVStruct.NdefTLVBuffer,
234                     PH_FRINFC_NDEFMAP_MFUL_VAL0,
235                     PH_FRINFC_NDEFMAP_MFUL_VAL4);
236         (void)memset(NdefMap->MifareULContainer.Buffer,
237                     PH_FRINFC_NDEFMAP_MFUL_VAL0,
238                     PH_FRINFC_NDEFMAP_MFUL_VAL4);
239         (void)memset(NdefMap->MifareULContainer.InternalBuf,
240                     PH_FRINFC_NDEFMAP_MFUL_VAL0,
241                     PH_FRINFC_NDEFMAP_MFUL_VAL4);
242         (void)memset(NdefMap->MifareULContainer.ReadBuf,
243                     PH_FRINFC_NDEFMAP_MFUL_VAL0,
244                     PH_FRINFC_NDEFMAP_MFUL_VAL64);
245     }
246     return Result;
247 }
248 
249 /*!
250  * \brief Initiates Reading of NDEF information from the Mifare UL.
251  *
252  * It performs a reset of the state and starts the action (state machine).
253  * A periodic call of the \ref phFriNfcNdefMap_Process has to be done once the action
254  * has been triggered.
255  */
256 
phFriNfc_MifareUL_RdNdef(phFriNfc_NdefMap_t * NdefMap,uint8_t * PacketData,uint32_t * PacketDataLength,uint8_t Offset)257 NFCSTATUS phFriNfc_MifareUL_RdNdef( phFriNfc_NdefMap_t  *NdefMap,
258                                     uint8_t             *PacketData,
259                                     uint32_t            *PacketDataLength,
260                                     uint8_t             Offset)
261 {
262     NFCSTATUS                   Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
263                                                     NFCSTATUS_INVALID_PARAMETER);
264 
265     if((NdefMap != NULL) && (PacketData != NULL) && (PacketDataLength != NULL) &&
266         (*PacketDataLength != PH_FRINFC_NDEFMAP_MFUL_VAL0) &&
267         (Offset <= PH_FRINFC_NDEFMAP_SEEK_BEGIN) &&
268         (NdefMap->CompletionRoutine->CompletionRoutine != NULL) &&
269         (NdefMap->CompletionRoutine->Context != NULL ) &&
270         ((NdefMap->CardState != PH_NDEFMAP_CARD_STATE_INITIALIZED) &&
271         (NdefMap->CardState != PH_NDEFMAP_CARD_STATE_INVALID)))
272     {
273         /*Register PacketData to Data Buffer of NdefMap */
274         NdefMap->ApduBuffer = PacketData;
275         /*Register PacketDataLength to Data Length of NdefMap */
276         NdefMap->ApduBufferSize = *PacketDataLength ;
277         /*  To return actual number of bytes read to the caller */
278         NdefMap->NumOfBytesRead = PacketDataLength ;
279         *NdefMap->NumOfBytesRead = 0;
280 
281         if( (Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN) || ( NdefMap->PrevOperation ==
282             PH_FRINFC_NDEFMAP_WRITE_OPE))
283         {
284             NdefMap->MifareULContainer.CurrentBlock = PH_FRINFC_NDEFMAP_MFUL_BLOCK4;
285             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
286             NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
287             NdefMap->TLVStruct.NdefTLVBlock = PH_FRINFC_NDEFMAP_MFUL_BLOCK4;
288             NdefMap->MifareULContainer.RemainingSize = NdefMap->CardMemSize;
289             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
290             NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_NDEFMAP_MFUL_VAL0;
291             NdefMap->MifareULContainer.ReadBufIndex = PH_FRINFC_NDEFMAP_MFUL_VAL0;
292             NdefMap->MifareULContainer.ReadWriteCompleteFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
293         }
294 
295         NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE;
296         NdefMap->MifareULContainer.CRindex = PH_FRINFC_NDEFMAP_CR_RD_NDEF;
297 
298         if( (Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) &&
299             (NdefMap->MifareULContainer.ReadWriteCompleteFlag ==
300                                 PH_FRINFC_NDEFMAP_MFUL_FLAG1))
301         {
302             /*  No space on card for reading : we have already
303                 reached the end of file !
304                 Offset is set to Continue Operation */
305             Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
306                             NFCSTATUS_EOF_NDEF_CONTAINER_REACHED);
307         }
308         else
309         {
310             NdefMap->Offset = (((Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN) &&
311                                 ( NdefMap->PrevOperation != PH_FRINFC_NDEFMAP_READ_OPE))?
312                                 PH_FRINFC_NDEFMAP_SEEK_BEGIN:
313                                 Offset);
314 
315             Result = ((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN)?
316             phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap, NdefMap->MifareULContainer.CurrentBlock):
317             phFriNfc_MfUL_H_CpDataToUserBuf(NdefMap));
318         }
319     }
320     return Result;
321 }
322 
323 
324 /*!
325  * \brief Initiates writing of NDEF information to the Mifare UL.
326  *
327  * The function initiates the writing of NDEF information to a Mifare UL.
328  * It performs a reset of the state and starts the action (state machine).
329  * A periodic call of the \ref phFriNfcNdefMap_Process has to be done once the action
330  * has been triggered.
331  */
332 
phFriNfc_MifareUL_WrNdef(phFriNfc_NdefMap_t * NdefMap,uint8_t * PacketData,uint32_t * PacketDataLength,uint8_t Offset)333 NFCSTATUS phFriNfc_MifareUL_WrNdef( phFriNfc_NdefMap_t  *NdefMap,
334                                     uint8_t             *PacketData,
335                                     uint32_t            *PacketDataLength,
336                                     uint8_t             Offset)
337 {
338       NFCSTATUS                   Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
339                                                     NFCSTATUS_INVALID_PARAMETER);
340 
341 
342 
343         if((NdefMap != NULL) && (PacketData != NULL) && (PacketDataLength != NULL) &&
344             (*PacketDataLength != PH_FRINFC_NDEFMAP_MFUL_VAL0) &&
345             (Offset <= PH_FRINFC_NDEFMAP_SEEK_BEGIN) &&
346             (NdefMap->CompletionRoutine->CompletionRoutine != NULL) &&
347             (NdefMap->CompletionRoutine->Context != NULL ) &&
348             ((NdefMap->CardState != PH_NDEFMAP_CARD_STATE_READ_ONLY) &&
349             (NdefMap->CardState != PH_NDEFMAP_CARD_STATE_INVALID)))
350         {
351             NdefMap->MifareULContainer.CRindex = PH_FRINFC_NDEFMAP_CR_WR_NDEF;
352             /*Register PacketData to Data Buffer of NdefMap */
353             NdefMap->ApduBuffer = PacketData;
354             /*Register PacketDataLength to Data Length of NdefMap */
355             NdefMap->ApduBufferSize = *PacketDataLength ;
356             /*  To return actual number of bytes read to the caller */
357             NdefMap->WrNdefPacketLength = PacketDataLength ;
358             *NdefMap->WrNdefPacketLength = 0;
359 
360             if( (Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN) || ( NdefMap->PrevOperation ==
361                 PH_FRINFC_NDEFMAP_READ_OPE))
362             {
363                 NdefMap->MifareULContainer.CurrentSector = NdefMap->TLVStruct.NdefTLVSector;
364                 NdefMap->MifareULContainer.CurrentBlock = NdefMap->TLVStruct.NdefTLVBlock;
365                 NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
366                 NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_NDEFMAP_MFUL_VAL0;
367                 NdefMap->MifareULContainer.ReadBufIndex = PH_FRINFC_NDEFMAP_MFUL_VAL0;
368                 NdefMap->MifareULContainer.ReadWriteCompleteFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
369                 NdefMap->TLVStruct.WrLenFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
370                 NdefMap->MifareULContainer.InternalLength = PH_FRINFC_NDEFMAP_MFUL_VAL0;
371                 NdefMap->MifareULContainer.RemainingSize =
372                                     (NdefMap->CardMemSize -
373                                     (((NdefMap->TLVStruct.NdefTLVBlock -
374                                     PH_FRINFC_NDEFMAP_MFUL_BYTE4) *
375                                     PH_FRINFC_NDEFMAP_MFUL_BYTE4) +
376                                     NdefMap->TLVStruct.NdefTLVByte +
377                                     PH_FRINFC_NDEFMAP_MFUL_VAL1));
378             }
379             NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
380             NdefMap->MifareULContainer.CRindex = PH_FRINFC_NDEFMAP_CR_WR_NDEF;
381 
382             if( (Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) &&
383                 (NdefMap->MifareULContainer.ReadWriteCompleteFlag ==
384                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1))
385             {
386                 /*  No space on card for reading : we have already
387                     reached the end of file !
388                     Offset is set to Continue Operation */
389                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
390                                 NFCSTATUS_EOF_NDEF_CONTAINER_REACHED);
391             }
392             else
393             {
394                 NdefMap->Offset = (((Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN) &&
395                                     ( NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_READ_OPE))?
396                                     PH_FRINFC_NDEFMAP_SEEK_BEGIN:
397                                     Offset);
398 
399                 if (NdefMap->TLVStruct.NdefTLVSector == 1)
400                 {
401                     NdefMap->MifareULContainer.CurrentSector = 1;
402 
403                     /* Change to sector 1 */
404                     Result = phFriNfc_MfUL_H_SelectSector(NdefMap,
405                     NdefMap->MifareULContainer.CurrentSector, 1,
406                     PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_INIT_1);
407 
408                 }
409                 else
410                 {
411                     Result = ((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN)?
412                         phFriNfc_MfUL_H_RdBeforeWrite(NdefMap):
413                         phFriNfc_MfUL_H_fillSendBufToWr(NdefMap));
414                 }
415             }
416         }
417 
418 
419     return Result;
420 }
421 
422 
423 
424 /*!
425  * \brief Check whether a particular Mifare UL is NDEF compliant.
426  *
427  * The function checks whether the peer device is NDEF compliant.
428  *
429  */
430 
phFriNfc_MifareUL_ChkNdef(phFriNfc_NdefMap_t * NdefMap)431 NFCSTATUS phFriNfc_MifareUL_ChkNdef( phFriNfc_NdefMap_t     *NdefMap)
432 {
433     NFCSTATUS                   status =    NFCSTATUS_PENDING;
434     uint8_t                     index=0,
435                                 pSensRes[2] = {0};
436 
437     /* set the data for additional data exchange*/
438     NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
439     NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
440     NdefMap->psDepAdditionalInfo.NAD = 0;
441 
442     /*
443      *  Changed
444      *  Description: CardInfo106 replase
445      */
446 
447     /* retrive remote card information */
448     pSensRes[0]  = NdefMap->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.AtqA[0];
449 
450     NdefMap->TLVStruct.NdefTLVBlock = PH_FRINFC_NDEFMAP_MFUL_VAL4;
451 #ifdef LOCK_BITS_CHECK_ENABLE
452     NdefMap->MifareULContainer.CurrentBlock = PH_FRINFC_NDEFMAP_MFUL_BLOCK2;
453 #else
454     NdefMap->MifareULContainer.CurrentBlock = PH_FRINFC_NDEFMAP_MFUL_BLOCK3;
455 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
456     NdefMap->MifareULContainer.CRindex = PH_FRINFC_NDEFMAP_CR_CHK_NDEF;
457 
458     /* Check for Mifare Bit information  */
459     if (((pSensRes[0] & PH_FRINFC_NDEFMAP_MFUL_CHECK_RESP) == PH_FRINFC_NDEFMAP_MFUL_CHECK_RESP))
460     {
461         NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_CHECK_OPE;
462         /* set the offset*/
463         NdefMap->SendRecvBuf[index] = NdefMap->MifareULContainer.CurrentBlock;
464 
465         /*set the send length*/
466         NdefMap->SendLength = PH_FRINFC_NDEFMAP_MFUL_MAX_SEND_BUF_TO_READ;
467 
468         /* Change the state to check ndef compliancy */
469         NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_CHK_NDEF_COMP;
470 
471         /* Set the card type as Mifare UL */
472         NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_UL_CARD;
473 
474         /* set the cmd to mifare read*/
475         /*
476          * Changed
477          * Description: phHal_eMifareCmdListMifareRead replace with phHal_eMifareRead
478          */
479         NdefMap->Cmd.MfCmd = phHal_eMifareRead;
480 
481         /* Set the CR and context for Mifare operations*/
482         NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareUL_Process;
483         NdefMap->MapCompletionInfo.Context = NdefMap;
484 
485         /*Set the Length*/
486         *NdefMap->SendRecvLength = PH_FRINFC_NDEFMAP_MF_READ_BLOCK_SIZE;
487 
488 
489         /*Call the Overlapped HAL Transceive function */
490         status = phFriNfc_OvrHal_Transceive(NdefMap->LowerDevice,
491                                             &NdefMap->MapCompletionInfo,
492                                             NdefMap->psRemoteDevInfo,
493                                             NdefMap->Cmd,
494                                             &NdefMap->psDepAdditionalInfo,
495                                             NdefMap->SendRecvBuf,
496                                             NdefMap->SendLength,
497                                             NdefMap->SendRecvBuf,
498                                             NdefMap->SendRecvLength);
499     }
500     else
501     {
502         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_REMOTE_DEVICE);
503     }
504     return status;
505 }
506 
507 static void
phFriNfc_MfUL_CalcByteNum(phFriNfc_NdefMap_t * NdefMap)508 phFriNfc_MfUL_CalcByteNum(phFriNfc_NdefMap_t *NdefMap)
509 {
510     uint8_t     i = PH_FRINFC_NDEFMAP_MFUL_VAL0;
511     uint16_t    TemLength = PH_FRINFC_NDEFMAP_MFUL_VAL0;
512 
513 
514     for (i = 0; i < 16; i++)
515     {
516         if ((NdefMap->MifareULContainer.ReadBuf[i] ==
517         PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_T) &&
518         ((NdefMap->MifareULContainer.ReadBuf[i + 1] ==
519         NdefMap->TLVStruct.ActualSize) ||
520         (NdefMap->MifareULContainer.ReadBuf[i + 1] == 0xFF)))
521         {
522             if (NdefMap->MifareULContainer.ReadBuf[i + 1] == 0xFF)
523             {
524                 TemLength = NdefMap->MifareULContainer.ReadBuf[i + 2] |
525                 ((uint16_t)NdefMap->MifareULContainer.ReadBuf[i + 3] << 8);
526 
527                 if (TemLength == NdefMap->TLVStruct.ActualSize)
528                 {
529                     NdefMap->MifareULContainer.ByteNumber = i + 1;
530                     break;
531                 }
532             }
533             else
534             {
535                 NdefMap->MifareULContainer.ByteNumber = i + 1;
536                 break;
537             }
538         }
539      }
540 
541     return;
542 }
543 
544 
545 #ifdef LOCK_BITS_CHECK_ENABLE
546 
547 #define MIF_UL_LOCK_BIT_CHECK           0xFF
548 #define MIF_UL_LOCK_BIT_0_VALUE         0x0F
549 #define MIF_UL_LOCK_BIT_1_VALUE         0x00
550 
551 static
552 void
phFriNfc_MfUL_H_ChkLockBits(phFriNfc_NdefMap_t * NdefMap)553 phFriNfc_MfUL_H_ChkLockBits (
554     phFriNfc_NdefMap_t *NdefMap)
555 {
556     uint8_t         index = 2;
557 
558     if (((NdefMap->SendRecvBuf[index] &
559         MIF_UL_LOCK_BIT_CHECK) > MIF_UL_LOCK_BIT_0_VALUE) ||
560         (MIF_UL_LOCK_BIT_1_VALUE !=
561         (NdefMap->SendRecvBuf[(index + 1)] & MIF_UL_LOCK_BIT_CHECK)))
562     {
563         NdefMap->CardState = PH_NDEFMAP_CARD_STATE_READ_ONLY;
564     }
565 }
566 
567 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE  */
568 
569 /*!
570  * \brief Completion Routine, Processing function, needed to avoid long
571  * blocking.
572  * \note The lower (Overlapped HAL) layer must register a pointer to
573  *  this function as a Completion
574  *  Routine in order to be able to notify the component that an I/O
575  *  has finished and data are ready to be processed.
576  *
577  */
578 
phFriNfc_MifareUL_Process(void * Context,NFCSTATUS Status)579 void phFriNfc_MifareUL_Process( void        *Context,
580                                 NFCSTATUS   Status)
581 
582 {
583 
584     uint8_t     index = PH_FRINFC_NDEFMAP_MFUL_VAL0,
585                 i = PH_FRINFC_NDEFMAP_MFUL_VAL0;
586     phFriNfc_NdefMap_t          *NdefMap;
587     uint16_t    TemLength = PH_FRINFC_NDEFMAP_MFUL_VAL0;
588     /*uint16_t                    TempByte = PH_FRINFC_NDEFMAP_MFUL_VAL0; */
589     static uint8_t                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
590 
591     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
592 
593     /* set the context to Map module */
594 
595     NdefMap = (phFriNfc_NdefMap_t *)Context;
596 
597     if ( Status == NFCSTATUS_SUCCESS )
598     {
599         switch (NdefMap->State)
600         {
601             case PH_FRINFC_NDEFMAP_MFUL_STATE_CHK_NDEF_COMP:
602                 if (*NdefMap->SendRecvLength ==
603                     PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)
604                 {
605                     /* Checks for the Ndef Compliency and validy of the memory size*/
606                     Status = phFriNfc_MfUL_H_ChkCCBytes(NdefMap);
607                     CRFlag = (uint8_t)((Status != NFCSTATUS_SUCCESS)?
608                                 PH_FRINFC_NDEFMAP_MFUL_FLAG1:
609                                 PH_FRINFC_NDEFMAP_MFUL_FLAG0);
610 
611 #ifdef LOCK_BITS_CHECK_ENABLE
612 
613                     /* Check for lock bits */
614                     if (NFCSTATUS_SUCCESS == Status)
615                     {
616                         phFriNfc_MfUL_H_ChkLockBits(NdefMap);
617                     }
618 
619 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
620 
621                     /* Find the NDEF TLV */
622                     NdefMap->MifareULContainer.CurrentBlock = PH_FRINFC_NDEFMAP_MFUL_BLOCK4;
623                     Status = ((Status != NFCSTATUS_SUCCESS)?
624                                 Status:
625                                 phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
626                                             NdefMap->MifareULContainer.CurrentBlock));
627                     CRFlag = (uint8_t)(((Status != NFCSTATUS_PENDING ) ||
628                                 (CRFlag == PH_FRINFC_NDEFMAP_MFUL_FLAG1))?
629                                 PH_FRINFC_NDEFMAP_MFUL_FLAG1:
630                                 PH_FRINFC_NDEFMAP_MFUL_FLAG0);
631 
632 #ifdef PH_HAL4_ENABLE
633                     if ((Status != NFCSTATUS_PENDING ) &&
634                         (Status != NFCSTATUS_SUCCESS))
635                     {
636                         NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
637                     }
638 #endif /* #ifdef PH_HAL4_ENABLE */
639                 }
640             break;
641 
642 
643             case PH_FRINFC_NDEFMAP_MFUL_STATE_READ:
644                 /* check the received bytes size equals 16 bytes*/
645                 if (*NdefMap->SendRecvLength ==
646                     PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)
647                 {
648                     if(NdefMap->MifareULContainer.ReadBufIndex <
649                         (NdefMap->TLVStruct.ActualSize + (((NdefMap->TLVStruct.NdefTLVBlock -
650 						PH_FRINFC_NDEFMAP_MFUL_BLOCK4)
651                             * PH_FRINFC_NDEFMAP_MFUL_VAL4) + (NdefMap->TLVStruct.NdefTLVByte - 1) + 4)))
652 
653                     {
654                         Status = phFriNfc_MfUL_H_CopyRdBytes(NdefMap);
655                     }
656 
657                     if (Status == NFCSTATUS_SUCCESS)
658                     {
659                         if(NdefMap->MifareULContainer.ReadBufIndex >=
660                             (NdefMap->TLVStruct.ActualSize + (((NdefMap->TLVStruct.NdefTLVBlock -
661 							PH_FRINFC_NDEFMAP_MFUL_BLOCK4)
662                             * PH_FRINFC_NDEFMAP_MFUL_VAL4) + (NdefMap->TLVStruct.NdefTLVByte - 1) + 4)))
663                         {
664 
665                             phFriNfc_MfUL_CalcByteNum(NdefMap);
666 #if 0
667                             for (i = 0; i < 16; i++)
668                             {
669                                 if ((NdefMap->MifareULContainer.ReadBuf[i] ==
670                                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_T) &&
671                                     ((NdefMap->MifareULContainer.ReadBuf[i + 1] ==
672                                     NdefMap->TLVStruct.ActualSize) ||
673                                     (NdefMap->MifareULContainer.ReadBuf[i + 1] == 0xFF)))
674                                 {
675                                     if (NdefMap->MifareULContainer.ReadBuf[i + 1] == 0xFF)
676                                     {
677                                         TemLength = NdefMap->MifareULContainer.ReadBuf[i + 2] |
678                                             ((uint16_t)NdefMap->MifareULContainer.ReadBuf[i + 3] << 8);
679 
680                                         if (TemLength == NdefMap->TLVStruct.ActualSize)
681                                         {
682                                             NdefMap->MifareULContainer.ByteNumber = i + 1;
683                                             break;
684                                         }
685                                     }
686                                     else
687                                     {
688                                         NdefMap->MifareULContainer.ByteNumber = i + 1;
689                                         break;
690                                     }
691                                 }
692                             }
693 #endif
694 
695                             if (NdefMap->MifareULContainer.ReadBuf
696                                 [NdefMap->MifareULContainer.ByteNumber] == 0xFF)
697                             {
698                                 NdefMap->MifareULContainer.ByteNumber =
699                                     NdefMap->MifareULContainer.ByteNumber + 3;
700                             }
701                             else
702                             {
703                                 NdefMap->MifareULContainer.ByteNumber =
704                                     NdefMap->MifareULContainer.ByteNumber + 1;
705                             }
706 
707                             Status = phFriNfc_MfUL_H_CpDataToUserBuf(NdefMap);
708                             if (NdefMap->MifareULContainer.CurrentSector > 0)
709                             {
710                                 NdefMap->MifareULContainer.CurrentSector = 0;
711                                 NdefMap->PrevState = PH_FRINFC_NDEFMAP_MFUL_STATE_READ;
712 
713                                 Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
714                                     NdefMap->MifareULContainer.CurrentSector, 1,
715                                     PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_1);
716                                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING )?
717                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1:
718                                     PH_FRINFC_NDEFMAP_MFUL_FLAG0);
719                             }
720                             else
721                             {
722                                 CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
723                             }
724                         }
725                         else
726                         {
727                             Status = phFriNfc_MfUL_H_Rd16Bytes(NdefMap);
728                             CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
729                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1:
730                                     PH_FRINFC_NDEFMAP_MFUL_FLAG0);
731                         }
732                     }
733                     else
734                     {
735 
736                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
737                     }
738                 }
739                 else
740                 {
741                     /* read error */
742                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
743                                         NFCSTATUS_INVALID_RECEIVE_LENGTH);
744                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
745                 }
746             break;
747 
748             case PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE:
749                 Status = phFriNfc_MfUL_H_ProWrittenBytes(NdefMap);
750                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
751                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
752                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
753             break;
754 
755             case PH_FRINFC_NDEFMAP_MFUL_STATE_FND_NDEF_COMP:
756                 if (*NdefMap->SendRecvLength ==
757                     PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)
758                 {
759                     switch(NdefMap->PrevOperation)
760                     {
761                     case PH_FRINFC_NDEFMAP_CHECK_OPE:
762                     case PH_FRINFC_NDEFMAP_READ_OPE:
763                             CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
764                             if(NdefMap->TLVStruct.NoLbytesinTLV >
765                                 PH_FRINFC_NDEFMAP_MFUL_VAL0)
766                             {
767                                 Status = phFriNfc_MfUL_H_ChkRemainTLV(NdefMap, &CRFlag);
768                             }
769                             else
770                             {
771                                 if(NdefMap->TLVStruct.NdefTLVFoundFlag !=
772                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1)
773                                 {
774                                     /* Find the NDEF TLV */
775                                     Status = phFriNfc_MfUL_H_findNDEFTLV(NdefMap, &CRFlag);
776                                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING )?
777                                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
778                                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
779                                 }
780                             }
781                             if((NdefMap->TLVStruct.NdefTLVFoundFlag ==
782                                 PH_FRINFC_NDEFMAP_MFUL_FLAG1) &&
783                                 (NdefMap->TLVStruct.NoLbytesinTLV ==
784                                 PH_FRINFC_NDEFMAP_MFUL_VAL0))
785                             {
786                                 CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
787                                 /* Ndef TLV found, so call the next function depending on the
788                                     check/read/write ndef operation */
789 
790                                 if (NdefMap->MifareULContainer.CurrentSector > 0)
791                                 {
792                                     NdefMap->MifareULContainer.CurrentSector = 0;
793                                     NdefMap->PrevState = PH_FRINFC_NDEFMAP_MFUL_STATE_FND_NDEF_COMP;
794 
795                                     Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
796                                         NdefMap->MifareULContainer.CurrentSector, 1,
797                                         PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_1);
798                                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING )?
799                                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
800                                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
801                                 }
802                                 else
803                                 {
804                                     /* Sector is 0 no need to send sector select */
805                                     Status = phFriNfc_MfUL_H_NxtOp(NdefMap, &CRFlag);
806                                 }
807                             }
808 
809 #ifdef PH_HAL4_ENABLE
810                             if ((Status != NFCSTATUS_PENDING ) &&
811                                 (Status != NFCSTATUS_SUCCESS) &&
812                                 (PH_FRINFC_NDEFMAP_CHECK_OPE ==
813                                 NdefMap->PrevOperation))
814                             {
815                                 NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
816                             }
817 #endif /* #ifdef PH_HAL4_ENABLE */
818                         break;
819 
820                     case PH_FRINFC_NDEFMAP_WRITE_OPE:
821                         /* Remove UpdateWrLen */
822                         Status = ((NdefMap->TLVStruct.WrLenFlag ==
823                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1)?
824                                     phFriNfc_MfUL_H_UpdateWrLen(NdefMap):
825                                     phFriNfc_MfUL_H_CallWrOp(NdefMap));
826                         CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
827                                 PH_FRINFC_NDEFMAP_MFUL_FLAG1:
828                                 PH_FRINFC_NDEFMAP_MFUL_FLAG0);
829                         break;
830 
831                     default:
832                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
833                                 NFCSTATUS_INVALID_REMOTE_DEVICE);
834                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
835                         break;
836 
837                     }
838                 }
839             break;
840 
841             case PH_FRINFC_NDEFMAP_MFUL_STATE_TERM_TLV:
842                 Status = phFriNfc_MfUL_H_UpdateWrLen(NdefMap);
843                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
844                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
845                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
846             break;
847 
848             case PH_FRINFC_NDEFMAP_MFUL_STATE_WR_LEN_TLV:
849                 if(((((NdefMap->TLVStruct.NdefTLVByte -
850                     PH_FRINFC_NDEFMAP_MFUL_VAL1) ==
851                     PH_FRINFC_NDEFMAP_MFUL_VAL3) &&
852                     (NdefMap->MifareULContainer.CurrentBlock ==
853                     (NdefMap->TLVStruct.NdefTLVBlock +
854                     PH_FRINFC_NDEFMAP_MFUL_VAL1))) ||
855                     (((NdefMap->TLVStruct.NdefTLVByte -
856                         PH_FRINFC_NDEFMAP_MFUL_VAL1) <
857                     PH_FRINFC_NDEFMAP_MFUL_VAL3) && (
858                     NdefMap->MifareULContainer.CurrentBlock ==
859                     NdefMap->TLVStruct.NdefTLVBlock))))
860                 {
861                     (void)memcpy(NdefMap->MifareULContainer.InternalBuf,
862                                 NdefMap->MifareULContainer.Buffer,
863                                 NdefMap->MifareULContainer.InternalLength);
864                 }
865                 (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer,
866                             NdefMap->MifareULContainer.Buffer,
867                             PH_FRINFC_NDEFMAP_MFUL_VAL4);
868 
869                 NdefMap->CardState =(uint8_t) ((NdefMap->CardState ==
870                                     PH_NDEFMAP_CARD_STATE_INITIALIZED)?
871                                     PH_NDEFMAP_CARD_STATE_READ_WRITE:
872                                     NdefMap->CardState);
873                 NdefMap->ApduBuffIndex = PH_FRINFC_NDEFMAP_MFUL_VAL0;
874                 NdefMap->NumOfBytesWritten = PH_FRINFC_NDEFMAP_MFUL_VAL0;
875 
876                 if (NdefMap->MifareULContainer.CurrentSector > 0)
877                 {
878                     /* Reset sector */
879                     NdefMap->MifareULContainer.CurrentSector = 0;
880                     NdefMap->PrevState = PH_FRINFC_NDEFMAP_MFUL_STATE_WR_LEN_TLV;
881 
882                     Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
883                             NdefMap->MifareULContainer.CurrentSector, 1,
884                             PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_1);
885                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
886                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1:
887                                     PH_FRINFC_NDEFMAP_MFUL_FLAG0);
888                 }
889                 else
890                 {
891                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
892                 }
893 
894             break;
895 
896             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_CHK_1:
897                  /* check the received bytes size equals 1 byte*/
898                 if (*NdefMap->SendRecvLength ==
899                     PH_FRINFC_NDEFMAP_MFUL_VAL1)
900                 {
901                     if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] == 0x0A)
902                     {
903                         /* Send second command */
904                         Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
905                             NdefMap->MifareULContainer.CurrentSector, 2,
906                             PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_CHK_2);
907                     }
908                     else
909                     {
910                         /* read error */
911                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
912                                 NFCSTATUS_INVALID_FORMAT);
913                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
914                     }
915                 }
916                 else
917                 {
918                     /* read error */
919                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
920                             NFCSTATUS_INVALID_RECEIVE_LENGTH);
921                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
922 
923                 }
924             break;
925 
926             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_CHK_2:
927                 {
928                     NdefMap->MifareULContainer.CurrentBlock +=
929                                 PH_FRINFC_NDEFMAP_MFUL_BLOCK4;
930 
931                     Status = phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
932                                 NdefMap->MifareULContainer.CurrentBlock);
933                 }
934             break;
935 
936             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_READ_1:
937                  /* check the received bytes size equals 1 byte*/
938                 if (*NdefMap->SendRecvLength ==
939                     PH_FRINFC_NDEFMAP_MFUL_VAL1)
940                 {
941                     if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] == 0x0A)
942                     {
943                         /* Send second command */
944                         Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
945                             NdefMap->MifareULContainer.CurrentSector, 2,
946                             PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_READ_2);
947                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
948                     }
949                     else
950                     {
951                         /* read error */
952                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
953                                 NFCSTATUS_INVALID_FORMAT);
954                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
955                     }
956                 }
957                 else
958                 {
959                     /* read error */
960                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
961                             NFCSTATUS_INVALID_RECEIVE_LENGTH);
962                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
963 
964                 }
965             break;
966 
967             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_READ_2:
968                 {
969                     if (NdefMap->MifareULContainer.CurrentBlock == 0xFF)
970                     {
971                         NdefMap->MifareULContainer.CurrentBlock = 0;
972                     }
973                     else
974                     {
975                         NdefMap->MifareULContainer.CurrentBlock =
976                             (NdefMap->TLVStruct.NdefTLVBlock / 4) * 4;
977                     }
978 
979                     Status = phFriNfc_MfUL_H_Rd16Bytes(NdefMap);
980                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
981                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1:
982                                     PH_FRINFC_NDEFMAP_MFUL_FLAG0);
983                 }
984             break;
985 
986             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_1:
987                  /* check the received bytes size equals 1 byte*/
988                 if (*NdefMap->SendRecvLength ==
989                     PH_FRINFC_NDEFMAP_MFUL_VAL1)
990                 {
991                     if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] == 0x0A)
992                     {
993                         /* Send second command */
994                         Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
995                             NdefMap->MifareULContainer.CurrentSector, 2,
996                             PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_2);
997                     }
998                     else
999                     {
1000                         /* read error */
1001                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1002                                 NFCSTATUS_INVALID_FORMAT);
1003                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1004                     }
1005                 }
1006                 else
1007                 {
1008                     /* read error */
1009                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1010                             NFCSTATUS_INVALID_RECEIVE_LENGTH);
1011                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1012 
1013                 }
1014             break;
1015 
1016             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_2:
1017                 {
1018                     NdefMap->MifareULContainer.CurrentBlock = 0;
1019                     Status = phFriNfc_MfUL_H_fillSendBufToWr(NdefMap);
1020 
1021                     if((Status == NFCSTATUS_SUCCESS) &&
1022                         (NdefMap->TLVStruct.SetTermTLVFlag !=
1023                             PH_FRINFC_NDEFMAP_MFUL_FLAG1) &&
1024                             (NdefMap->MifareULContainer.RemainingSize >
1025                             PH_FRINFC_NDEFMAP_MFUL_VAL0))
1026                     {
1027                         Status = phFriNfc_MfUL_H_WrTermTLV(NdefMap);
1028                     }
1029                     else
1030                     {
1031                         if((Status == NFCSTATUS_SUCCESS) &&
1032                             (NdefMap->TLVStruct.SetTermTLVFlag ==
1033                             PH_FRINFC_NDEFMAP_MFUL_FLAG1))
1034                         {
1035                             Status = phFriNfc_MfUL_H_UpdateWrLen(NdefMap);
1036                         }
1037                     }
1038 
1039                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1040                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
1041                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
1042                 }
1043             break;
1044 
1045             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_INIT_1:
1046                  /* check the received bytes size equals 1 byte*/
1047                 if (*NdefMap->SendRecvLength ==
1048                     PH_FRINFC_NDEFMAP_MFUL_VAL1)
1049                 {
1050                     if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] == 0x0A)
1051                     {
1052                         /* Send second command */
1053                         Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
1054                             NdefMap->MifareULContainer.CurrentSector, 2,
1055                             PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_INIT_2);
1056                     }
1057                     else
1058                     {
1059                         /* read error */
1060                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1061                                 NFCSTATUS_INVALID_FORMAT);
1062                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1063                     }
1064                 }
1065                 else
1066                 {
1067                     /* read error */
1068                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1069                             NFCSTATUS_INVALID_RECEIVE_LENGTH);
1070                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1071 
1072                 }
1073             break;
1074 
1075             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_INIT_2:
1076                 {
1077                     Status = ((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN)?
1078                         phFriNfc_MfUL_H_RdBeforeWrite(NdefMap):
1079                         phFriNfc_MfUL_H_fillSendBufToWr(NdefMap));
1080 
1081 
1082                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1083                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
1084                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
1085                 }
1086             break;
1087 
1088 
1089             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RW_1:
1090                  /* check the received bytes size equals 1 byte*/
1091                 if (*NdefMap->SendRecvLength ==
1092                     PH_FRINFC_NDEFMAP_MFUL_VAL1)
1093                 {
1094                     if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] == 0x0A)
1095                     {
1096                         /* Send second command */
1097                         Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
1098                             NdefMap->MifareULContainer.CurrentSector, 2,
1099                             PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RW_2);
1100                     }
1101                     else
1102                     {
1103                         /* read error */
1104                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1105                                 NFCSTATUS_INVALID_FORMAT);
1106                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1107                     }
1108                 }
1109                 else
1110                 {
1111                     /* read error */
1112                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1113                             NFCSTATUS_INVALID_RECEIVE_LENGTH);
1114                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1115 
1116                 }
1117             break;
1118 
1119             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RW_2:
1120                 {
1121                     NdefMap->MifareULContainer.CurrentBlock = 0;
1122 
1123                     NdefMap->SendRecvBuf[index] =
1124                                         NdefMap->MifareULContainer.CurrentBlock;
1125                     index++;
1126                     NdefMap->SendRecvBuf[index] =
1127                                             PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
1128                     index++;
1129 
1130                     if((((NdefMap->TLVStruct.NdefTLVByte -
1131                             PH_FRINFC_NDEFMAP_MFUL_VAL1) == PH_FRINFC_NDEFMAP_MFUL_VAL0) ||
1132                             ((NdefMap->TLVStruct.NdefTLVByte - PH_FRINFC_NDEFMAP_MFUL_VAL1)
1133                             == PH_FRINFC_NDEFMAP_MFUL_VAL3)))
1134                         {
1135                             /* Length to know how many bytes has to be written to the card */
1136                         TemLength = (((NdefMap->TLVStruct.NdefTLVByte - PH_FRINFC_NDEFMAP_MFUL_VAL1) ==
1137                                         PH_FRINFC_NDEFMAP_MFUL_VAL0)?
1138                                         PH_FRINFC_NDEFMAP_MFUL_VAL2:
1139                                         PH_FRINFC_NDEFMAP_MFUL_VAL3);
1140 
1141                         if(NdefMap->ApduBufferSize >= TemLength)
1142                         {
1143                             /* Prepare the receive buffer */
1144                             (void)memcpy(&(NdefMap->SendRecvBuf[
1145                                             index]),
1146                                             &(NdefMap->ApduBuffer[
1147                                             NdefMap->ApduBuffIndex]),
1148                                             TemLength);
1149 
1150                             /* Number of bytes written to the card from user buffer */
1151                             NdefMap->NumOfBytesWritten = TemLength;
1152 
1153                             index = index+(uint8_t)TemLength;
1154                             /* Exact number of bytes written in the card including TLV */
1155                             *NdefMap->DataCount = (index - PH_FRINFC_NDEFMAP_MFUL_VAL1);
1156                         }
1157                         else
1158                         {
1159                             /* Prepare the receive buffer */
1160                             (void)memcpy(&(NdefMap->SendRecvBuf[
1161                                             index]),
1162                                             &(NdefMap->ApduBuffer[
1163                                             NdefMap->ApduBuffIndex]),
1164                                             (uint16_t)NdefMap->ApduBufferSize);
1165 
1166                             /* Number of bytes written to the card from user buffer */
1167                             NdefMap->NumOfBytesWritten = (uint16_t)NdefMap->ApduBufferSize;
1168 
1169                             index= index +(uint8_t)NdefMap->ApduBufferSize;
1170                             /* Exact number of bytes written in the card including TLV */
1171                             *NdefMap->DataCount = (index - PH_FRINFC_NDEFMAP_MFUL_VAL1);
1172 
1173                             for(i = index; i < PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK; i++)
1174                             {
1175                                 NdefMap->SendRecvBuf[i] = (uint8_t)((i == index)?
1176                                         PH_FRINFC_NDEFMAP_MFUL_TERMTLV:
1177                                         PH_FRINFC_NDEFMAP_MFUL_NULLTLV);
1178                                 NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1179                             }
1180                         }
1181 
1182                         /* store the bytes in buffer till the bytes are
1183                             written in a block */
1184                         (void)memcpy(NdefMap->MifareULContainer.Buffer,
1185                                         &(NdefMap->SendRecvBuf[
1186                                         PH_FRINFC_NDEFMAP_MFUL_VAL1]),
1187                                         (PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK -
1188                                         PH_FRINFC_NDEFMAP_MFUL_VAL1));
1189 
1190                         (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer,
1191                                     NdefMap->MifareULContainer.Buffer,
1192                                     (PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK -
1193                                         PH_FRINFC_NDEFMAP_MFUL_VAL1));
1194 
1195                         /* Change the state to check ndef compliancy */
1196                         NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE;
1197 
1198                         Status = phFriNfc_MfUL_H_Wr4bytes(NdefMap);
1199                     }
1200 
1201 
1202                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1203                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
1204                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
1205                 }
1206             break;
1207 
1208             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_1:
1209                  /* check the received bytes size equals 1 byte*/
1210                 if (*NdefMap->SendRecvLength ==
1211                     PH_FRINFC_NDEFMAP_MFUL_VAL1)
1212                 {
1213                     if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] == 0x0A)
1214                     {
1215                         /* Send second command */
1216                         Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
1217                             NdefMap->MifareULContainer.CurrentSector, 2,
1218                             PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_2);
1219                     }
1220                     else
1221                     {
1222                         /* read error */
1223                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1224                                 NFCSTATUS_INVALID_FORMAT);
1225                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1226                     }
1227                 }
1228                 else
1229                 {
1230                     /* read error */
1231                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1232                             NFCSTATUS_INVALID_RECEIVE_LENGTH);
1233                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1234 
1235                 }
1236             break;
1237 
1238             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_2:
1239                 {
1240                     if (NdefMap->PrevState == PH_FRINFC_NDEFMAP_MFUL_STATE_FND_NDEF_COMP)
1241                     {
1242                         Status = phFriNfc_MfUL_H_NxtOp(NdefMap, &CRFlag);
1243                     }
1244                     else if (NdefMap->PrevState == PH_FRINFC_NDEFMAP_MFUL_STATE_READ)
1245                     {
1246                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1247                     }
1248                     else if (NdefMap->PrevState == PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE)
1249                     {
1250                         Status = phFriNfc_MfUL_H_UpdateWrLen(NdefMap);
1251                         CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1252                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
1253                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
1254                     }
1255                     else if (NdefMap->PrevState == PH_FRINFC_NDEFMAP_MFUL_STATE_WR_LEN_TLV)
1256                     {
1257                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1258                     }
1259                     else
1260                     {
1261                         /* read error */
1262                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1263                                     NFCSTATUS_READ_FAILED);
1264                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1265 
1266                     }
1267                 }
1268             break;
1269 
1270             default:
1271                 /*set the invalid state*/
1272                 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_DEVICE_REQUEST);
1273                 phFriNfc_MifareUL_H_Complete(NdefMap, Status);
1274             break;
1275         }
1276         if(CRFlag == PH_FRINFC_NDEFMAP_MFUL_FLAG1)
1277         {
1278             /* call the CR routine*/
1279             phFriNfc_MifareUL_H_Complete(NdefMap, Status);
1280         }
1281     }
1282     else
1283     {
1284         phFriNfc_MifareUL_H_Complete(NdefMap,Status);
1285     }
1286 }
1287 
phFriNfc_MfUL_H_ChkCCBytes(phFriNfc_NdefMap_t * NdefMap)1288 static NFCSTATUS phFriNfc_MfUL_H_ChkCCBytes(phFriNfc_NdefMap_t  *NdefMap )
1289 {
1290     NFCSTATUS Result = PHNFCSTVAL(  CID_FRI_NFC_NDEF_MAP,
1291                                     NFCSTATUS_NO_NDEF_SUPPORT);
1292 
1293 #ifdef LOCK_BITS_CHECK_ENABLE
1294         switch(NdefMap->SendRecvBuf[7])
1295 #else
1296         switch(NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_BYTE3])
1297 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
1298         {
1299             case PH_FRINFC_NDEFMAP_MFUL_CC_BYTE3_RW:
1300                 /* This state can be either INITIALISED or READWRITE. but default
1301                     is INITIALISED */
1302                 NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INITIALIZED;
1303                 break;
1304 
1305             case PH_FRINFC_NDEFMAP_MFUL_CC_BYTE3_RO:
1306                 NdefMap->CardState = PH_NDEFMAP_CARD_STATE_READ_ONLY;
1307                 break;
1308 
1309             default :
1310                 NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
1311         }
1312 
1313 
1314 
1315         /* Check for Ndef compliancy : 0 and 1 byte spcifies the ndef compliancy
1316            2 byte specifies the version of the MF UL tag*/
1317 #ifdef LOCK_BITS_CHECK_ENABLE
1318         if(( NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_BYTE4] ==
1319 #else
1320         if(( NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_BYTE0] ==
1321 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
1322             PH_FRINFC_NDEFMAP_MFUL_CC_BYTE0) && (
1323             (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INITIALIZED) ||
1324             (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY)))
1325         {
1326             /* Check the version number */
1327             Result =phFriNfc_MapTool_ChkSpcVer( NdefMap,
1328 #ifdef LOCK_BITS_CHECK_ENABLE
1329                                                 5);
1330 
1331 #else
1332                                                 PH_FRINFC_NDEFMAP_MFUL_BYTE1);
1333 
1334 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
1335 #if 0
1336 #ifdef PH_NDEF_MIFARE_ULC
1337             if (Result == NFCSTATUS_SUCCESS)
1338             {
1339 #ifdef LOCK_BITS_CHECK_ENABLE
1340 
1341                 if (NdefMap->SendRecvBuf[6] == 0x06)
1342                 {
1343                     NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_UL_CARD;
1344                 }
1345                 else if (NdefMap->SendRecvBuf[6] == 0x12)
1346                 {
1347 //                  NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_ULC_CARD;
1348                     NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_UL_CARD;
1349                 }
1350 
1351 #else /* #ifdef LOCK_BITS_CHECK_ENABLE */
1352 
1353                 if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_BYTE2] == 0x06)
1354                 {
1355                     NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_UL_CARD;
1356                 }
1357                 else if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_BYTE2] == 0x12)
1358                 {
1359 //                  NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_ULC_CARD;
1360                     NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_UL_CARD;
1361                 }
1362 
1363 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
1364                 else
1365                 {
1366                     Result = PHNFCSTVAL(  CID_FRI_NFC_NDEF_MAP,
1367                                                         NFCSTATUS_INVALID_REMOTE_DEVICE);
1368                 }
1369             }
1370 #else
1371 
1372         /*  Check the CC header size: Only valid ones are
1373                 0x06 for 48 bytes. */
1374 #ifdef LOCK_BITS_CHECK_ENABLE
1375             Result = ((( NdefMap->SendRecvBuf[6] !=
1376 #else /* #ifdef LOCK_BITS_CHECK_ENABLE */
1377             Result = ((( NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_BYTE2] !=
1378 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
1379                         PH_FRINFC_NDEFMAP_MFUL_CC_BYTE2) || (Result !=
1380                         NFCSTATUS_SUCCESS))?
1381                         (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1382                         NFCSTATUS_INVALID_REMOTE_DEVICE)):
1383                         Result);
1384 #endif /* #ifdef PH_NDEF_MIFARE_ULC */
1385 #endif
1386             NdefMap->MifareULContainer.RemainingSize =
1387             NdefMap->CardMemSize = ((Result == NFCSTATUS_SUCCESS)?
1388 #ifdef LOCK_BITS_CHECK_ENABLE
1389                                     (NdefMap->SendRecvBuf[6] *
1390 #else /* #ifdef LOCK_BITS_CHECK_ENABLE */
1391                                     (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_BYTE2] *
1392 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
1393                                     PH_FRINFC_NDEFMAP_MFUL_MUL8):
1394                                     NdefMap->CardMemSize);
1395 
1396             if (NdefMap->CardMemSize > 256)
1397             {
1398                 NdefMap->CardMemSize = NdefMap->CardMemSize - 2;
1399                 NdefMap->MifareULContainer.RemainingSize = NdefMap->CardMemSize;
1400             }
1401 
1402         }
1403         else
1404         {
1405             NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
1406         }
1407 
1408 
1409     return Result;
1410 }
1411 
1412 /*!
1413  * \brief this shall notify the integration software with respective
1414  *  success/error status along with the completion routines.
1415  *
1416  *  This routine is called from the mifareul process function.
1417  *
1418  */
1419 
phFriNfc_MifareUL_H_Complete(phFriNfc_NdefMap_t * NdefMap,NFCSTATUS Status)1420 static void phFriNfc_MifareUL_H_Complete(phFriNfc_NdefMap_t  *NdefMap,
1421                                         NFCSTATUS            Status)
1422 {
1423     if(NdefMap!=NULL)
1424     {
1425         if((PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE   ==  NdefMap->State)
1426             &&  (NFCSTATUS_SUCCESS !=  Status))
1427         {
1428             *NdefMap->WrNdefPacketLength    =   0;
1429         }
1430         /* set the state back to the Reset_Init state*/
1431         NdefMap->State =  PH_FRINFC_NDEFMAP_STATE_RESET_INIT;
1432 
1433         /* set the completion routine*/
1434         NdefMap->CompletionRoutine[NdefMap->MifareULContainer.CRindex].
1435             CompletionRoutine(NdefMap->CompletionRoutine->Context, Status);
1436     }
1437 }
1438 
phFriNfc_MfUL_H_Rd16Bytes(phFriNfc_NdefMap_t * NdefMap)1439 static NFCSTATUS   phFriNfc_MfUL_H_Rd16Bytes( phFriNfc_NdefMap_t  *NdefMap)
1440 {
1441     NFCSTATUS   Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1442                     NFCSTATUS_INVALID_PARAMETER);
1443 
1444     NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_READ;
1445 
1446     /*  Set the previous operation flag to read. */
1447     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE;
1448 
1449     /*  Have we already read the entire file? */
1450     if(NdefMap->ApduBuffIndex < NdefMap->ApduBufferSize)
1451     {
1452         /* set the data for additional data exchange */
1453         NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = PH_FRINFC_NDEFMAP_MFUL_VAL0;
1454         NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = PH_FRINFC_NDEFMAP_MFUL_VAL0;
1455         NdefMap->psDepAdditionalInfo.NAD = PH_FRINFC_NDEFMAP_MFUL_VAL0;
1456         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] =
1457                                 NdefMap->MifareULContainer.CurrentBlock;
1458         NdefMap->SendLength = PH_FRINFC_NDEFMAP_MFUL_VAL1;
1459         *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
1460         /*
1461          * Changed
1462          * Description: replace with  phHal_eMifareRead
1463          */
1464 
1465         NdefMap->Cmd.MfCmd =  phHal_eMifareRead;
1466 
1467         /* Call the overlapped HAL Transceive function */
1468         Result = phFriNfc_OvrHal_Transceive(    NdefMap->LowerDevice,
1469                                                 &NdefMap->MapCompletionInfo,
1470                                                 NdefMap->psRemoteDevInfo,
1471                                                 NdefMap->Cmd,
1472                                                 &NdefMap->psDepAdditionalInfo,
1473                                                 NdefMap->SendRecvBuf,
1474                                                 NdefMap->SendLength,
1475                                                 NdefMap->SendRecvBuf,
1476                                                 NdefMap->SendRecvLength);
1477     }
1478     return Result;
1479 }
1480 
phFriNfc_MfUL_H_Wr4bytes(phFriNfc_NdefMap_t * NdefMap)1481 static NFCSTATUS   phFriNfc_MfUL_H_Wr4bytes(  phFriNfc_NdefMap_t  *NdefMap)
1482 {
1483     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
1484 
1485     /* set the receive length*/
1486     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
1487 
1488     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
1489 
1490     /*
1491      * Changed
1492      * Description: phHal_eMifareCmdListMifareWrite4 replace with phHal_eMifareWrite4
1493      */
1494     /* set the cmd to mifare read*/
1495     NdefMap->Cmd.MfCmd = phHal_eMifareWrite4;
1496 
1497     /* Set the CR and context for Mifare operations*/
1498     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareUL_Process;
1499     NdefMap->MapCompletionInfo.Context = NdefMap;
1500 
1501     NdefMap->SendLength = PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK;
1502     /*Call the Overlapped HAL Transceive function */
1503     Result = phFriNfc_OvrHal_Transceive(NdefMap->LowerDevice,
1504                                         &NdefMap->MapCompletionInfo,
1505                                         NdefMap->psRemoteDevInfo,
1506                                         NdefMap->Cmd,
1507                                         &NdefMap->psDepAdditionalInfo,
1508                                         NdefMap->SendRecvBuf,
1509                                         NdefMap->SendLength,
1510                                         NdefMap->SendRecvBuf,
1511                                         NdefMap->SendRecvLength);
1512     return Result;
1513 }
1514 
phFriNfc_MfUL_H_findNDEFTLV(phFriNfc_NdefMap_t * NdefMap,uint8_t * CRFlag)1515 static NFCSTATUS phFriNfc_MfUL_H_findNDEFTLV(phFriNfc_NdefMap_t     *NdefMap,
1516                                             uint8_t                 *CRFlag)
1517 {
1518     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
1519     uint16_t    ShiftLength = PH_FRINFC_NDEFMAP_MFUL_VAL0,
1520                 TemLength = PH_FRINFC_NDEFMAP_MFUL_VAL0,
1521                 Temp16Bytes = PH_FRINFC_NDEFMAP_MFUL_VAL0;
1522     Temp16Bytes = ((NdefMap->TLVStruct.NdefTLVByte > PH_FRINFC_NDEFMAP_MFUL_VAL0)?
1523                     (NdefMap->TLVStruct.NdefTLVByte - PH_FRINFC_NDEFMAP_MFUL_VAL1):
1524                     NdefMap->TLVStruct.NdefTLVByte);
1525     for(;;)
1526     {
1527         if(NdefMap->SendRecvBuf[Temp16Bytes] ==
1528                         PH_FRINFC_NDEFMAP_MFUL_NULLTLV)
1529         {
1530             NdefMap->MifareULContainer.RemainingSize -=
1531                         PH_FRINFC_NDEFMAP_MFUL_VAL1;
1532 #ifdef PH_HAL4_ENABLE
1533             /* This check is added to know the remaining size in
1534             the card is not 0, if this is 0, then complete card has
1535             been read */
1536             if (NdefMap->MifareULContainer.RemainingSize ==
1537                         PH_FRINFC_NDEFMAP_MFUL_VAL0)
1538             {
1539                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1540                                     NFCSTATUS_NO_NDEF_SUPPORT);
1541                 break;
1542             }
1543             else
1544             {
1545                 Result = NFCSTATUS_SUCCESS;
1546             }
1547 #else
1548             Result = ((NdefMap->MifareULContainer.RemainingSize ==
1549                         PH_FRINFC_NDEFMAP_MFUL_VAL0)?
1550                         (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1551                                     NFCSTATUS_NO_NDEF_SUPPORT)):
1552                         NFCSTATUS_SUCCESS);
1553 #endif /* #ifdef PH_HAL4_ENABLE */
1554             Temp16Bytes++;
1555 #ifdef PH_HAL4_ENABLE
1556             /* This code is added to read next 16 bytes. This means previous
1557             16 bytes read contains only NULL TLV, so read further to get the
1558             NDEF TLV */
1559             Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
1560                                                 Temp16Bytes);
1561             if(NFCSTATUS_SUCCESS != Result)
1562             {
1563                 NdefMap->TLVStruct.NdefTLVBlock =
1564                     NdefMap->TLVStruct.NdefTLVBlock + PH_FRINFC_NDEFMAP_MFUL_VAL4;
1565                 break;
1566             }
1567 #endif /* #ifdef PH_HAL4_ENABLE */
1568         }
1569         else
1570         {
1571             Result = ((NdefMap->SendRecvBuf[Temp16Bytes] ==
1572                         PH_FRINFC_NDEFMAP_MFUL_TERMTLV)?
1573                         (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1574                                     NFCSTATUS_NO_NDEF_SUPPORT)):
1575                         NFCSTATUS_SUCCESS);
1576 
1577             if(Result != NFCSTATUS_SUCCESS)
1578             {
1579                 *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1580                 break;
1581             }
1582 
1583 #ifdef PH_NDEF_MIFARE_ULC
1584             if ((NdefMap->SendRecvBuf[Temp16Bytes] ==
1585                         PH_FRINFC_NDEFMAP_MFUL_LOCK_CTRL_TLV) ||
1586                         (NdefMap->SendRecvBuf[Temp16Bytes] ==
1587                         PH_FRINFC_NDEFMAP_MFUL_MEM_CTRL_TLV) ||
1588                         (NdefMap->SendRecvBuf[Temp16Bytes] ==
1589                         PH_FRINFC_NDEFMAP_MFUL_PROPRIETRY_TLV))
1590             {
1591 
1592                  NdefMap->TLVStruct.NdefTLVByte =
1593                                     ((Temp16Bytes %
1594                                     PH_FRINFC_NDEFMAP_MFUL_VAL4) +
1595                                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
1596 
1597                  Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
1598                                                 Temp16Bytes);
1599                 if(Result != NFCSTATUS_SUCCESS)
1600                 {
1601                     NdefMap->TLVStruct.TcheckedinTLVFlag =
1602                                             PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1603                     NdefMap->TLVStruct.NoLbytesinTLV =
1604                                             PH_FRINFC_NDEFMAP_MFUL_VAL3;
1605                     break;
1606                 }
1607                 Temp16Bytes++;
1608                 NdefMap->MifareULContainer.RemainingSize -=
1609                                 PH_FRINFC_NDEFMAP_MFUL_VAL1;
1610 
1611                 if(NdefMap->MifareULContainer.RemainingSize ==
1612                   PH_FRINFC_NDEFMAP_MFUL_VAL0)
1613                 {
1614                     Result = (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1615                                         NFCSTATUS_NO_NDEF_SUPPORT));
1616                     break;
1617                 }
1618 
1619                 Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
1620                                                     Temp16Bytes);
1621                 if(Result != NFCSTATUS_SUCCESS)
1622                 {
1623                     NdefMap->TLVStruct.TcheckedinTLVFlag =
1624                                         PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1625                     NdefMap->TLVStruct.NoLbytesinTLV =
1626                                         PH_FRINFC_NDEFMAP_MFUL_VAL3;
1627                     break;
1628                 }
1629 
1630 
1631                  /* If the value of the Length(L) in TLV is FF then enter else
1632                             check for the card memory */
1633                 if((NdefMap->SendRecvBuf[Temp16Bytes] ==
1634                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_LFF) ||
1635                     ((NdefMap->SendRecvBuf[Temp16Bytes] ==
1636                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L) &&
1637                     (NdefMap->TLVStruct.NdefTLVFoundFlag !=
1638                     PH_FRINFC_NDEFMAP_MFUL_FLAG1)))
1639                 {
1640                     /* In the present case, the card space is not greater
1641                         than 0xFF */
1642                     Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1643                                         NFCSTATUS_NO_NDEF_SUPPORT);
1644 
1645                     *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1646                     break;
1647                 }
1648                 else
1649                 {
1650                     NdefMap->TLVStruct.BytesRemainLinTLV =
1651                                     NdefMap->SendRecvBuf[Temp16Bytes];
1652 
1653                     NdefMap->TLVStruct.ActualSize =
1654                                     NdefMap->SendRecvBuf[Temp16Bytes];
1655 
1656                     if((NdefMap->MifareULContainer.RemainingSize <
1657                         NdefMap->SendRecvBuf[Temp16Bytes]) ||
1658                         (NdefMap->MifareULContainer.RemainingSize <
1659                         PH_FRINFC_NDEFMAP_MFUL_VAL2) ||
1660                         (NdefMap->TLVStruct.BytesRemainLinTLV >
1661                         (NdefMap->MifareULContainer.RemainingSize)) ||
1662                         ((NdefMap->TLVStruct.BytesRemainLinTLV ==
1663                         PH_FRINFC_NDEFMAP_MFUL_VAL0) &&
1664                         (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_READ_OPE)))
1665                     {
1666                         /* No NDEF TLV found */
1667                         Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1668                                             NFCSTATUS_NO_NDEF_SUPPORT);
1669                         *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1670                         break;
1671                     }
1672 
1673                     if(NdefMap->TLVStruct.NdefTLVFoundFlag !=
1674                         PH_FRINFC_NDEFMAP_MFUL_FLAG1)
1675                     {
1676                         NdefMap->TLVStruct.NdefTLVByte =
1677                                         (((Temp16Bytes + PH_FRINFC_NDEFMAP_MFUL_VAL1 +
1678                                         NdefMap->SendRecvBuf[Temp16Bytes]) %
1679                                         PH_FRINFC_NDEFMAP_MFUL_VAL4) +
1680                                         PH_FRINFC_NDEFMAP_MFUL_VAL1);
1681 #if 0
1682                         NdefMap->TLVStruct.NdefTLVBlock =
1683                                         (uint8_t)(NdefMap->TLVStruct.NdefTLVBlock
1684                                         + ((Temp16Bytes +
1685                                         NdefMap->SendRecvBuf[Temp16Bytes] + 1)/
1686                                         PH_FRINFC_NDEFMAP_MFUL_VAL4));
1687 #endif
1688                         NdefMap->TLVStruct.NdefTLVBlock =
1689                                         (uint8_t)(((NdefMap->TLVStruct.NdefTLVBlock / PH_FRINFC_NDEFMAP_MFUL_VAL4) *
1690                                             PH_FRINFC_NDEFMAP_MFUL_VAL4)
1691                                             + ((Temp16Bytes + NdefMap->SendRecvBuf[Temp16Bytes] + 1)/
1692                                             PH_FRINFC_NDEFMAP_MFUL_VAL4));
1693 
1694 
1695                         TemLength = (Temp16Bytes +
1696                                 NdefMap->SendRecvBuf[Temp16Bytes]);
1697 
1698                         NdefMap->MifareULContainer.RemainingSize =
1699                                         (NdefMap->MifareULContainer.RemainingSize -
1700                                         (NdefMap->SendRecvBuf[Temp16Bytes]
1701                                         + PH_FRINFC_NDEFMAP_MFUL_VAL1));
1702 
1703                         /* If the Length (L) in TLV < 16 bytes */
1704                         Temp16Bytes = ((TemLength >=
1705                                 PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)?
1706                                 PH_FRINFC_NDEFMAP_MFUL_VAL0:
1707                                 (TemLength +
1708                                 PH_FRINFC_NDEFMAP_MFUL_VAL1));
1709 
1710                         Result = ((TemLength >=
1711                                 PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)?
1712                                 phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
1713                                             NdefMap->TLVStruct.NdefTLVBlock):
1714                                 NFCSTATUS_SUCCESS);
1715 
1716                         if(TemLength >= PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)
1717                         {
1718                             break;
1719                         }
1720                         TemLength = Temp16Bytes;
1721                     }
1722                 }
1723 
1724 
1725 
1726 
1727 #if 0
1728 
1729                  NdefMap->MifareULContainer.RemainingSize =
1730                                     (NdefMap->MifareULContainer.RemainingSize -
1731                                     (NdefMap->SendRecvBuf[Temp16Bytes + 1]
1732                                     + PH_FRINFC_NDEFMAP_MFUL_VAL2));
1733 
1734                 NdefMap->TLVStruct.NdefTLVBlock =
1735                                     (uint8_t)(NdefMap->TLVStruct.NdefTLVBlock
1736                                     + ((Temp16Bytes +
1737                                     NdefMap->SendRecvBuf[Temp16Bytes + 1] + 2)/
1738                                     PH_FRINFC_NDEFMAP_MFUL_VAL4));
1739 
1740 
1741                 Temp16Bytes = Temp16Bytes +
1742                         NdefMap->SendRecvBuf[Temp16Bytes + 1] + 2;
1743 #endif
1744             }
1745 #endif /* #ifdef PH_NDEF_MIFARE_ULC */
1746             else {
1747 
1748             /* Check the byte for 0x03 Type of NDEF TLV */
1749             NdefMap->TLVStruct.NdefTLVFoundFlag =
1750                     ((NdefMap->SendRecvBuf[Temp16Bytes] ==
1751                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_T)?
1752                     PH_FRINFC_NDEFMAP_MFUL_FLAG1:
1753                     PH_FRINFC_NDEFMAP_MFUL_FLAG0);
1754 
1755             if(NdefMap->TLVStruct.NdefTLVFoundFlag ==
1756                 PH_FRINFC_NDEFMAP_MFUL_FLAG1)
1757             {
1758                 ShiftLength = (Temp16Bytes +
1759                                     NdefMap->SendRecvBuf[Temp16Bytes]);
1760 
1761                  NdefMap->TLVStruct.NdefTLVByte =
1762                                     ((Temp16Bytes %
1763                                     PH_FRINFC_NDEFMAP_MFUL_VAL4) +
1764                                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
1765 
1766                 NdefMap->TLVStruct.NdefTLVBlock =
1767                                     (uint8_t)(((NdefMap->TLVStruct.NdefTLVBlock /4) * 4)
1768                                     + (Temp16Bytes)/
1769                                     PH_FRINFC_NDEFMAP_MFUL_VAL4);
1770 
1771                 NdefMap->TLVStruct.NdefTLVSector = NdefMap->MifareULContainer.CurrentSector;
1772 
1773             }
1774 #ifdef PH_HAL4_ENABLE
1775             else
1776             {
1777                 /* if the Type of the NDEF TLV is not found, then return
1778                     error saying no ndef TLV found*/
1779                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1780                                     NFCSTATUS_NO_NDEF_SUPPORT);
1781                 break;
1782 #if 0
1783                 /* This change is added to continue the loop, if the Type of the
1784                     NDEF TLV is not found
1785                     16 bytes are read, so for each byte, there is a check for the
1786                     Type (T) of the TLV, if T != 0x03, then increment the byte
1787                     count and restart the loop, till the T = 0x03 is found or all
1788                     the bytes in the card is completely read.
1789                 */
1790                 Temp16Bytes = (uint16_t)(Temp16Bytes + 1);
1791                 NdefMap->MifareULContainer.RemainingSize -=
1792                         PH_FRINFC_NDEFMAP_MFUL_VAL1;
1793                 if (NdefMap->MifareULContainer.RemainingSize ==
1794                             PH_FRINFC_NDEFMAP_MFUL_VAL0)
1795                 {
1796                     Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1797                                         NFCSTATUS_NO_NDEF_SUPPORT);
1798                     break;
1799                 }
1800                 else
1801                 {
1802                     Result = NFCSTATUS_SUCCESS;
1803                     Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
1804                                                 Temp16Bytes);
1805                     if(NFCSTATUS_PENDING == Result)
1806                     {
1807                         break;
1808                     }
1809                     continue;
1810                 }
1811 #endif /* #if 0 */
1812             }
1813 #endif /* #ifdef PH_HAL4_ENABLE */
1814 
1815             Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
1816                                                 Temp16Bytes);
1817             if(Result != NFCSTATUS_SUCCESS)
1818             {
1819                 NdefMap->TLVStruct.TcheckedinTLVFlag =
1820                                         PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1821                 NdefMap->TLVStruct.NoLbytesinTLV =
1822                                         PH_FRINFC_NDEFMAP_MFUL_VAL3;
1823                 break;
1824             }
1825             Temp16Bytes++;
1826             NdefMap->MifareULContainer.RemainingSize -=
1827                             PH_FRINFC_NDEFMAP_MFUL_VAL1;
1828 
1829             if(NdefMap->MifareULContainer.RemainingSize ==
1830               PH_FRINFC_NDEFMAP_MFUL_VAL0)
1831             {
1832                 Result = (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1833                                     NFCSTATUS_NO_NDEF_SUPPORT));
1834                 break;
1835             }
1836 
1837             Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
1838                                                 Temp16Bytes);
1839             if(Result != NFCSTATUS_SUCCESS)
1840             {
1841                 NdefMap->TLVStruct.TcheckedinTLVFlag =
1842                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1843                 NdefMap->TLVStruct.NoLbytesinTLV =
1844                                     PH_FRINFC_NDEFMAP_MFUL_VAL3;
1845                 break;
1846             }
1847 
1848             /* If the value of the Length(L) in TLV is FF then enter else
1849                 check for the card memory */
1850             if((NdefMap->SendRecvBuf[Temp16Bytes] ==
1851                 PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_LFF) ||
1852                 ((NdefMap->SendRecvBuf[Temp16Bytes] ==
1853                 PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L) &&
1854                 (NdefMap->TLVStruct.NdefTLVFoundFlag !=
1855                 PH_FRINFC_NDEFMAP_MFUL_FLAG1)))
1856             {
1857                 /* In the present case, the card space is not greater
1858                     than 0xFF */
1859                 /*
1860                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1861                                     NFCSTATUS_NO_NDEF_SUPPORT);
1862 
1863                 *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1864                 break;
1865                 */
1866 
1867                 Temp16Bytes++;
1868                 Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
1869                                                     Temp16Bytes);
1870                 if(Result != NFCSTATUS_SUCCESS)
1871                 {
1872                     NdefMap->TLVStruct.TcheckedinTLVFlag =
1873                                             PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1874                     NdefMap->TLVStruct.NoLbytesinTLV =
1875                                             PH_FRINFC_NDEFMAP_MFUL_VAL2;
1876 
1877                     break;
1878                 }
1879 
1880                 ShiftLength = (uint16_t) NdefMap->SendRecvBuf[Temp16Bytes];
1881                 NdefMap->MifareULContainer.RemainingSize--;
1882 
1883                 Temp16Bytes++;
1884                 Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
1885                                                     Temp16Bytes);
1886                 if(Result != NFCSTATUS_SUCCESS)
1887                 {
1888                     NdefMap->TLVStruct.TcheckedinTLVFlag =
1889                                             PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1890                     NdefMap->TLVStruct.NoLbytesinTLV =
1891                                             PH_FRINFC_NDEFMAP_MFUL_VAL1;
1892                     NdefMap->TLVStruct.prevLenByteValue =
1893                                     NdefMap->SendRecvBuf[Temp16Bytes - 1];
1894                     break;
1895                 }
1896 
1897 
1898                 ShiftLength =
1899                     (uint16_t) (NdefMap->SendRecvBuf[Temp16Bytes]
1900                          | (ShiftLength << PH_FRINFC_NDEFMAP_MFUL_SHIFT8));
1901 
1902     //          NdefMap->MifareULContainer.RemainingSize--;
1903 
1904                 if(ShiftLength > (NdefMap->MifareULContainer.RemainingSize))
1905                 {
1906                     // Size in the Length(L) of TLV is greater
1907                     //than the actual size of the card
1908                     Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1909                                         NFCSTATUS_INVALID_PARAMETER);
1910                     *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1911                     break;
1912                 }
1913 
1914         //      NdefMap->MifareULContainer.RemainingSize--;
1915                 /*
1916                 NdefMap->TLVStruct.NdefTLVByte =
1917                                     (NdefMap->SendRecvBuf[Temp16Bytes] %
1918                                     PH_FRINFC_NDEFMAP_MFUL_VAL4);
1919 
1920                 NdefMap->TLVStruct.NdefTLVBlock =
1921                                 (uint8_t)(NdefMap->MifareULContainer.CurrentBlock
1922                             + (Temp16Bytes/PH_FRINFC_NDEFMAP_MFUL_VAL4));
1923                 */
1924 
1925                 NdefMap->TLVStruct.ActualSize =
1926                     NdefMap->TLVStruct.BytesRemainLinTLV = ShiftLength;
1927 
1928                 NdefMap->TLVStruct.NdefTLVFoundFlag = 1;
1929 
1930                 NdefMap->TLVStruct.NdefTLVSector = NdefMap->MifareULContainer.CurrentSector;
1931 
1932 
1933                 Result = ((NdefMap->TLVStruct.NoLbytesinTLV ==
1934                                     PH_FRINFC_NDEFMAP_MFUL_VAL0)?
1935                                     phFriNfc_MapTool_SetCardState(  NdefMap, ShiftLength):
1936                                     Result);
1937 /*
1938                 Result = phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
1939                                                     NdefMap->TLVStruct.NdefTLVBlock);
1940 */
1941                 break;
1942             }
1943             else
1944             {
1945                 NdefMap->TLVStruct.BytesRemainLinTLV =
1946                                 NdefMap->SendRecvBuf[Temp16Bytes];
1947 
1948                 NdefMap->TLVStruct.ActualSize =
1949                                 NdefMap->SendRecvBuf[Temp16Bytes];
1950 
1951                 if((NdefMap->MifareULContainer.RemainingSize <
1952                     NdefMap->SendRecvBuf[Temp16Bytes]) ||
1953                     (NdefMap->MifareULContainer.RemainingSize <
1954                     PH_FRINFC_NDEFMAP_MFUL_VAL2) ||
1955                     (NdefMap->TLVStruct.BytesRemainLinTLV >
1956                     (NdefMap->MifareULContainer.RemainingSize)) ||
1957                     ((NdefMap->TLVStruct.BytesRemainLinTLV ==
1958                     PH_FRINFC_NDEFMAP_MFUL_VAL0) &&
1959                     (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_READ_OPE)))
1960                 {
1961                     /* No NDEF TLV found */
1962                     Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1963                                         NFCSTATUS_NO_NDEF_SUPPORT);
1964                     *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
1965                     break;
1966                 }
1967 
1968                 if(NdefMap->TLVStruct.NdefTLVFoundFlag !=
1969                     PH_FRINFC_NDEFMAP_MFUL_FLAG1)
1970                 {
1971                     NdefMap->TLVStruct.NdefTLVByte =
1972                                     (((Temp16Bytes + PH_FRINFC_NDEFMAP_MFUL_VAL1 +
1973                                     NdefMap->SendRecvBuf[Temp16Bytes]) %
1974                                     PH_FRINFC_NDEFMAP_MFUL_VAL4) +
1975                                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
1976                     NdefMap->TLVStruct.NdefTLVBlock =
1977                                     (uint8_t)(NdefMap->TLVStruct.NdefTLVBlock
1978                                     + ((Temp16Bytes +
1979                                     NdefMap->SendRecvBuf[Temp16Bytes] + 1)/
1980                                     PH_FRINFC_NDEFMAP_MFUL_VAL4));
1981 
1982                     TemLength = (Temp16Bytes +
1983                             NdefMap->SendRecvBuf[Temp16Bytes]);
1984 
1985                     NdefMap->MifareULContainer.RemainingSize =
1986                                     (NdefMap->MifareULContainer.RemainingSize -
1987                                     (NdefMap->SendRecvBuf[Temp16Bytes]
1988                                     + PH_FRINFC_NDEFMAP_MFUL_VAL1));
1989 
1990                     /* If the Length (L) in TLV < 16 bytes */
1991                     Temp16Bytes = ((TemLength >=
1992                             PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)?
1993                             PH_FRINFC_NDEFMAP_MFUL_VAL0:
1994                             (TemLength +
1995                             PH_FRINFC_NDEFMAP_MFUL_VAL1));
1996 
1997                     Result = ((TemLength >=
1998                             PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)?
1999                             phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
2000                                         NdefMap->TLVStruct.NdefTLVBlock):
2001                             NFCSTATUS_SUCCESS);
2002 
2003                     if(TemLength >= PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)
2004                     {
2005                         break;
2006                     }
2007                     TemLength = Temp16Bytes;
2008                 }
2009             }
2010             if(NdefMap->TLVStruct.NdefTLVFoundFlag ==
2011                         PH_FRINFC_NDEFMAP_MFUL_FLAG1)
2012             {
2013 #if 0
2014                 NdefMap->TLVStruct.NdefTLVBlock =
2015                                     (uint8_t)(NdefMap->TLVStruct.NdefTLVBlock
2016                                     + ((Temp16Bytes + 1)/
2017                                     PH_FRINFC_NDEFMAP_MFUL_VAL4)) - 1;
2018 #endif
2019                 NdefMap->MifareULContainer.RemainingSize =
2020                                     (NdefMap->MifareULContainer.RemainingSize -
2021                                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
2022                     ShiftLength = NdefMap->SendRecvBuf[Temp16Bytes];
2023                     Result = ((NdefMap->TLVStruct.NoLbytesinTLV ==
2024                             PH_FRINFC_NDEFMAP_MFUL_VAL0)?
2025                             phFriNfc_MapTool_SetCardState(  NdefMap, ShiftLength):
2026                             Result);
2027 
2028                 break;
2029             }
2030         }
2031         }
2032     }
2033 
2034     return Result;
2035 }
2036 
2037 
phFriNfc_MfUL_H_Chk16Bytes(phFriNfc_NdefMap_t * NdefMap,uint16_t TempLength)2038 static NFCSTATUS phFriNfc_MfUL_H_Chk16Bytes(phFriNfc_NdefMap_t   *NdefMap,
2039                                             uint16_t             TempLength)
2040 {
2041     uint16_t localCurrentBlock;
2042 
2043     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
2044     if(TempLength == PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)
2045     {
2046         localCurrentBlock = NdefMap->MifareULContainer.CurrentBlock +
2047                             PH_FRINFC_NDEFMAP_MFUL_BLOCK4;
2048 
2049         if (localCurrentBlock < 256)
2050         {
2051             NdefMap->MifareULContainer.CurrentBlock +=
2052                                 PH_FRINFC_NDEFMAP_MFUL_BLOCK4;
2053 
2054             Result = phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
2055                             NdefMap->MifareULContainer.CurrentBlock);
2056         }
2057         else
2058         {
2059             /* Go to next sector */
2060             NdefMap->MifareULContainer.CurrentSector++;
2061 
2062             Result = phFriNfc_MfUL_H_SelectSector(NdefMap,
2063                 NdefMap->MifareULContainer.CurrentSector, 1,
2064                 PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_CHK_1);
2065         }
2066     }
2067 
2068     return Result;
2069 }
2070 
2071 
phFriNfc_MfUL_H_UpdateCrc(uint8_t ch,uint16_t * lpwCrc)2072 static void phFriNfc_MfUL_H_UpdateCrc( uint8_t ch,
2073                                           uint16_t *lpwCrc )
2074 {
2075     ch = (ch^(uint8_t)((*lpwCrc) & 0x00FF));
2076     ch = (ch^(ch<<4));
2077     *lpwCrc = (*lpwCrc >> 8)^((uint16_t)ch << 8)^ \
2078                 ((uint16_t)ch<<3)^((uint16_t)ch>>4);
2079 
2080     return;
2081 }
2082 
phFriNfc_MfUL_H_ComputeCrc(int CRCType,uint8_t * Data,int Length,uint8_t * TransmitFirst,uint8_t * TransmitSecond)2083 static void phFriNfc_MfUL_H_ComputeCrc( int      CRCType,
2084                                  uint8_t  *Data,
2085                                  int      Length,
2086                                  uint8_t  *TransmitFirst,
2087                                  uint8_t  *TransmitSecond
2088                                  )
2089 {
2090     uint8_t chBlock;
2091     uint16_t wCrc;
2092     switch(CRCType)
2093     {
2094     case CRC_A:
2095         wCrc = 0x6363; /* ITU-V.41 */
2096         break;
2097     case CRC_B:
2098         wCrc = 0xFFFF; /* ISO/IEC 13239 (formerly ISO/IEC 3309) */
2099         break;
2100     default:
2101         return;
2102     }
2103 
2104     do
2105     {
2106         chBlock = *Data++;
2107         phFriNfc_MfUL_H_UpdateCrc(chBlock, &wCrc);
2108     } while (--Length);
2109     *TransmitFirst = (uint8_t) (wCrc & 0xFF);
2110     *TransmitSecond = (uint8_t) ((wCrc >> 8) & 0xFF);
2111     return;
2112 }
2113 
2114 
2115 
phFriNfc_MfUL_H_SelectSector(phFriNfc_NdefMap_t * NdefMap,uint8_t SectorNo,uint8_t CmdNo,uint8_t NextState)2116 static NFCSTATUS  phFriNfc_MfUL_H_SelectSector(phFriNfc_NdefMap_t  *NdefMap,
2117                                                    uint8_t              SectorNo,
2118                                                    uint8_t              CmdNo,
2119                                                    uint8_t              NextState)
2120 {
2121 
2122     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
2123 
2124     /* set the data for additional data exchange */
2125     NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = PH_FRINFC_NDEFMAP_MFUL_VAL0;
2126     NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = PH_FRINFC_NDEFMAP_MFUL_VAL0;
2127     NdefMap->psDepAdditionalInfo.NAD = PH_FRINFC_NDEFMAP_MFUL_VAL0;
2128 
2129     NdefMap->State = NextState;
2130 
2131     if (CmdNo == 1)
2132     {
2133         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] = 0x00;
2134         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL1] = 0x00;
2135         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL2] = 0xC2;
2136         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL3] = 0xFF;
2137         NdefMap->SendLength = PH_FRINFC_NDEFMAP_MFUL_VAL4;
2138     }
2139     else
2140     {
2141         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] = 0x00;
2142         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL1] = 0x00;
2143         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL2] = SectorNo;
2144         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL3] = 0;
2145         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL4] = 0;
2146         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL5] = 0;
2147         NdefMap->SendLength = PH_FRINFC_NDEFMAP_MFUL_VAL5 + 1;
2148     }
2149 
2150     /* Calculate CRC */
2151 
2152     phFriNfc_MfUL_H_ComputeCrc(CRC_A, &NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL2],
2153             NdefMap->SendLength - 2,
2154             &NdefMap->SendRecvBuf[NdefMap->SendLength],
2155             &NdefMap->SendRecvBuf[NdefMap->SendLength + 1]);
2156 
2157     NdefMap->SendLength += PH_FRINFC_NDEFMAP_MFUL_VAL2;
2158 
2159 
2160     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
2161 
2162     NdefMap->Cmd.MfCmd = phHal_eMifareRaw;
2163 
2164     /* Call the overlapped HAL Transceive function */
2165     Result = phFriNfc_OvrHal_Transceive(     NdefMap->LowerDevice,
2166                                              &NdefMap->MapCompletionInfo,
2167                                              NdefMap->psRemoteDevInfo,
2168                                              NdefMap->Cmd,
2169                                              &NdefMap->psDepAdditionalInfo,
2170                                              NdefMap->SendRecvBuf,
2171                                              NdefMap->SendLength,
2172                                              NdefMap->SendRecvBuf,
2173                                              NdefMap->SendRecvLength);
2174      return Result;
2175 }
2176 
2177 
phFriNfc_MfUL_H_RdCardfindNdefTLV(phFriNfc_NdefMap_t * NdefMap,uint8_t BlockNo)2178 static NFCSTATUS   phFriNfc_MfUL_H_RdCardfindNdefTLV( phFriNfc_NdefMap_t  *NdefMap,
2179                                                    uint8_t              BlockNo)
2180 {
2181     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
2182     NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_FND_NDEF_COMP;
2183     /* set the data for additional data exchange */
2184     NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = PH_FRINFC_NDEFMAP_MFUL_VAL0;
2185     NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = PH_FRINFC_NDEFMAP_MFUL_VAL0;
2186     NdefMap->psDepAdditionalInfo.NAD = PH_FRINFC_NDEFMAP_MFUL_VAL0;
2187     NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] =
2188                                                     BlockNo;
2189     NdefMap->SendLength = PH_FRINFC_NDEFMAP_MFUL_VAL1;
2190     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
2191 
2192     /*
2193      * Changed
2194      * Description: phHal_eMifareCmdListMifareRead replace with phHal_eMifareRead
2195      */
2196     NdefMap->Cmd.MfCmd = phHal_eMifareRead;
2197 
2198     /* Call the overlapped HAL Transceive function */
2199     Result = phFriNfc_OvrHal_Transceive(    NdefMap->LowerDevice,
2200                                             &NdefMap->MapCompletionInfo,
2201                                             NdefMap->psRemoteDevInfo,
2202                                             NdefMap->Cmd,
2203                                             &NdefMap->psDepAdditionalInfo,
2204                                             NdefMap->SendRecvBuf,
2205                                             NdefMap->SendLength,
2206                                             NdefMap->SendRecvBuf,
2207                                             NdefMap->SendRecvLength);
2208     return Result;
2209 }
2210 
phFriNfc_MfUL_H_ChkRemainTLV(phFriNfc_NdefMap_t * NdefMap,uint8_t * CRFlag)2211 static NFCSTATUS phFriNfc_MfUL_H_ChkRemainTLV(phFriNfc_NdefMap_t  *NdefMap,
2212                                               uint8_t             *CRFlag)
2213 {
2214     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
2215     uint16_t    TempLength = PH_FRINFC_NDEFMAP_MFUL_VAL0,
2216                 ShiftLength = PH_FRINFC_NDEFMAP_MFUL_VAL0;
2217 
2218     switch(NdefMap->TLVStruct.NoLbytesinTLV)
2219     {
2220         case PH_FRINFC_NDEFMAP_MFUL_VAL1:
2221         case PH_FRINFC_NDEFMAP_MFUL_VAL2:
2222             ShiftLength = ((NdefMap->TLVStruct.NoLbytesinTLV ==
2223                             PH_FRINFC_NDEFMAP_MFUL_VAL1)?
2224                             NdefMap->TLVStruct.prevLenByteValue:
2225                             NdefMap->SendRecvBuf[TempLength]);
2226             ShiftLength = ((NdefMap->TLVStruct.NoLbytesinTLV ==
2227                             PH_FRINFC_NDEFMAP_MFUL_VAL1)?
2228                             (((uint16_t)(NdefMap->SendRecvBuf[TempLength]) <<
2229                             PH_FRINFC_NDEFMAP_MFUL_SHIFT8) |
2230                             ShiftLength):
2231                             (((uint16_t)(NdefMap->SendRecvBuf[(TempLength +
2232                             PH_FRINFC_NDEFMAP_MFUL_VAL1)]) <<
2233                             PH_FRINFC_NDEFMAP_MFUL_SHIFT8) |
2234                             ShiftLength));
2235 
2236             NdefMap->MifareULContainer.RemainingSize -=
2237                                             PH_FRINFC_NDEFMAP_MFUL_VAL1;
2238 
2239             NdefMap->TLVStruct.ActualSize =
2240             NdefMap->TLVStruct.BytesRemainLinTLV = ShiftLength;
2241 
2242             /* Check for remaining free space in the card with the
2243                 length (L) of TLV OR length(L) of TLV is less than
2244                 255 bytes (The length (L) of TLV for 3 byte should not
2245                 be less than 255) */
2246             Result = ((((NdefMap->MifareULContainer.RemainingSize)<=
2247                         ShiftLength) || (ShiftLength <
2248                         PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_LFF))?
2249                         (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
2250                         NFCSTATUS_INVALID_PARAMETER)):
2251                         Result);
2252 
2253 
2254             Result = ((Result == NFCSTATUS_SUCCESS)?
2255                             phFriNfc_MapTool_SetCardState(  NdefMap, ShiftLength):
2256                             Result);
2257 
2258             *CRFlag = (uint8_t)((Result == (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
2259                         NFCSTATUS_INVALID_PARAMETER)))?
2260                         PH_FRINFC_NDEFMAP_MFUL_FLAG1:
2261                         PH_FRINFC_NDEFMAP_MFUL_FLAG0);
2262 
2263 
2264             if(Result == NFCSTATUS_SUCCESS)
2265             {
2266 
2267                 NdefMap->MifareULContainer.RemainingSize= NdefMap->MifareULContainer.RemainingSize-
2268                     NdefMap->TLVStruct.NoLbytesinTLV;
2269 /*
2270                 NdefMap->TLVStruct.NdefTLVByte = ((ShiftLength%
2271                         PH_FRINFC_NDEFMAP_MFUL_VAL4) +
2272                         PH_FRINFC_NDEFMAP_MFUL_VAL1);
2273 
2274                 NdefMap->TLVStruct.NdefTLVBlock =
2275                         (uint8_t)(NdefMap->MifareULContainer.CurrentBlock
2276                         + (ShiftLength/PH_FRINFC_NDEFMAP_MFUL_VAL4));
2277                 NdefMap->MifareULContainer.CurrentBlock =
2278                                 NdefMap->TLVStruct.NdefTLVBlock;
2279 
2280                 Result = phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
2281                                                 NdefMap->TLVStruct.NdefTLVBlock);
2282                                                 */
2283             }
2284             break;
2285 
2286         default:
2287             if((NdefMap->SendRecvBuf[TempLength] ==
2288                 PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_LFF) ||
2289                 ((NdefMap->SendRecvBuf[TempLength] ==
2290                 PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L) &&
2291                 (NdefMap->TLVStruct.NdefTLVFoundFlag !=
2292                 PH_FRINFC_NDEFMAP_MFUL_FLAG1)))
2293             {
2294                 /* In the present case, the card space is not greater
2295                     than 0xFF */
2296 /*
2297                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
2298                                     NFCSTATUS_NO_NDEF_SUPPORT);
2299 
2300                 *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
2301 
2302 */
2303 
2304                 ShiftLength = NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_NDEFMAP_MFUL_VAL1)];
2305                 ShiftLength = (((uint16_t)(NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_NDEFMAP_MFUL_VAL2)])
2306                                 << PH_FRINFC_NDEFMAP_MFUL_SHIFT8) |
2307                                 ShiftLength);
2308                 Result = ((ShiftLength > (NdefMap->MifareULContainer.RemainingSize))?
2309                             (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
2310                             NFCSTATUS_INVALID_PARAMETER)):
2311                             Result);
2312 
2313 
2314                 Result = ((Result == NFCSTATUS_SUCCESS)?
2315                                             phFriNfc_MapTool_SetCardState(  NdefMap, ShiftLength):
2316                                             Result);
2317 
2318                 NdefMap->TLVStruct.ActualSize =
2319                     NdefMap->TLVStruct.BytesRemainLinTLV = ShiftLength;
2320 
2321                 if(Result == NFCSTATUS_SUCCESS)
2322                 {
2323 
2324                     NdefMap->MifareULContainer.RemainingSize= NdefMap->MifareULContainer.RemainingSize-
2325                     NdefMap->TLVStruct.NoLbytesinTLV;
2326 /*
2327                     NdefMap->TLVStruct.NdefTLVByte = ((ShiftLength%
2328                         PH_FRINFC_NDEFMAP_MFUL_VAL4) +
2329                         PH_FRINFC_NDEFMAP_MFUL_VAL1);
2330 
2331                     NdefMap->TLVStruct.NdefTLVBlock =
2332                         (uint8_t)(NdefMap->MifareULContainer.CurrentBlock
2333                         + (ShiftLength/PH_FRINFC_NDEFMAP_MFUL_VAL4));
2334 
2335                     NdefMap->MifareULContainer.CurrentBlock =
2336                                 NdefMap->TLVStruct.NdefTLVBlock;
2337 
2338                     Result = phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
2339                                                         NdefMap->TLVStruct.NdefTLVBlock);
2340 */
2341                 }
2342             }
2343             else
2344             {
2345                 /* length (L) value in TLV shall not be greater than
2346                     remaining free space in the card */
2347                 Result = ((NdefMap->SendRecvBuf[TempLength] >
2348                     NdefMap->MifareULContainer.RemainingSize)?
2349                         (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
2350                         NFCSTATUS_INVALID_PARAMETER)):
2351                         Result);
2352 
2353                 NdefMap->TLVStruct.ActualSize =
2354                 NdefMap->TLVStruct.BytesRemainLinTLV =
2355                                 NdefMap->SendRecvBuf[TempLength];
2356                 NdefMap->MifareULContainer.RemainingSize--;
2357 
2358                 if((Result == NFCSTATUS_SUCCESS) &&
2359                     (NdefMap->TLVStruct.NdefTLVFoundFlag !=
2360                     PH_FRINFC_NDEFMAP_MFUL_FLAG1))
2361                 {
2362                     phFriNfc_MfUL_H_UpdateLen(NdefMap,
2363                                 (uint16_t)NdefMap->SendRecvBuf[TempLength]);
2364 
2365                     NdefMap->MifareULContainer.CurrentBlock =
2366                                         NdefMap->TLVStruct.NdefTLVBlock;
2367                     TempLength=TempLength+(NdefMap->SendRecvBuf[TempLength]);
2368                     Result =((TempLength < PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)?
2369                             phFriNfc_MfUL_H_findNDEFTLV(NdefMap, CRFlag):
2370                             phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
2371                                     NdefMap->TLVStruct.NdefTLVBlock));
2372                 }
2373             }
2374             break;
2375     }
2376     NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_NDEFMAP_MFUL_VAL0;
2377 
2378     Result = phFriNfc_MapTool_SetCardState(  NdefMap, NdefMap->TLVStruct.ActualSize);
2379 
2380     return Result;
2381 }
2382 
phFriNfc_MfUL_H_UpdateLen(phFriNfc_NdefMap_t * NdefMap,uint16_t DataLen)2383 static void phFriNfc_MfUL_H_UpdateLen(phFriNfc_NdefMap_t        *NdefMap,
2384                                       uint16_t                  DataLen)
2385 {
2386     NdefMap->MifareULContainer.RemainingSize= NdefMap->MifareULContainer.RemainingSize-DataLen;
2387     NdefMap->TLVStruct.NdefTLVByte = ((DataLen %
2388                         PH_FRINFC_NDEFMAP_MFUL_VAL4) +
2389                         PH_FRINFC_NDEFMAP_MFUL_VAL1);
2390     NdefMap->TLVStruct.NdefTLVBlock =
2391                         (uint8_t)(NdefMap->MifareULContainer.CurrentBlock
2392                         + (DataLen/PH_FRINFC_NDEFMAP_MFUL_VAL4));
2393 }
2394 
phFriNfc_MfUL_H_NxtOp(phFriNfc_NdefMap_t * NdefMap,uint8_t * CRFlag)2395  static NFCSTATUS phFriNfc_MfUL_H_NxtOp(phFriNfc_NdefMap_t       *NdefMap,
2396                                        uint8_t                  *CRFlag)
2397 {
2398     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
2399 
2400     switch(NdefMap->PrevOperation)
2401     {
2402         case PH_FRINFC_NDEFMAP_CHECK_OPE:
2403             *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
2404 			/* Fix to check if the actual size in the TLV is greater than card */
2405             if (NdefMap->TLVStruct.ActualSize > (NdefMap->CardMemSize - 2))
2406             {
2407                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
2408                                     NFCSTATUS_NO_NDEF_SUPPORT);
2409             }
2410             break;
2411 
2412         case PH_FRINFC_NDEFMAP_READ_OPE:
2413             if (NdefMap->TLVStruct.NdefTLVSector == 1)
2414             {
2415                 /* Goto sector 1 */
2416                 NdefMap->MifareULContainer.CurrentSector = 1;
2417                 NdefMap->MifareULContainer.CurrentBlock = 0;
2418 
2419                 Result = phFriNfc_MfUL_H_SelectSector(NdefMap,
2420                         NdefMap->MifareULContainer.CurrentSector, 1,
2421                         PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_READ_1);
2422             }
2423             else
2424             {
2425                 NdefMap->MifareULContainer.CurrentBlock = (NdefMap->TLVStruct.NdefTLVBlock / 4) * 4;
2426 
2427                 Result = phFriNfc_MfUL_H_Rd16Bytes(NdefMap);
2428             }
2429 #if 0
2430             NdefMap->MifareULContainer.CurrentBlock =
2431                 PH_FRINFC_NDEFMAP_MFUL_VAL4;
2432 
2433              Result = phFriNfc_MfUL_H_Rd16Bytes(NdefMap);
2434 #endif
2435 
2436 
2437             *CRFlag = (uint8_t)((Result != NFCSTATUS_PENDING)?
2438                         PH_FRINFC_NDEFMAP_MFUL_FLAG1:
2439                         PH_FRINFC_NDEFMAP_MFUL_FLAG0);
2440             break;
2441 
2442         case PH_FRINFC_NDEFMAP_WRITE_OPE:
2443             break;
2444 
2445         default:
2446             break;
2447     }
2448     return Result;
2449 }
2450 
2451 
2452 
phFriNfc_MfUL_H_CopyRdBytes(phFriNfc_NdefMap_t * NdefMap)2453 static NFCSTATUS phFriNfc_MfUL_H_CopyRdBytes(phFriNfc_NdefMap_t  *NdefMap)
2454 {
2455     NFCSTATUS Result = NFCSTATUS_SUCCESS;
2456     uint16_t localCurrentBlock;
2457 
2458 #ifndef NDEF_READ_CHANGE
2459 	uint16_t			v_field_byte = 0;
2460 
2461 	if (NdefMap->MifareULContainer.CurrentBlock
2462 		== NdefMap->TLVStruct.NdefTLVBlock)
2463 	{
2464 		if (NdefMap->CardMemSize > (0x12 * PH_FRINFC_NDEFMAP_MFUL_MUL8))
2465 		{
2466 			v_field_byte = NdefMap->TLVStruct.NdefTLVByte;
2467 		}
2468 
2469 		/* Calculate the Value field of the TLV to read */
2470 		if (NdefMap->TLVStruct.ActualSize >= 0xFF)
2471 		{
2472 
2473 			/* here
2474 				3 is the 3 LENGTH bytes to skip
2475 				4 is the block size
2476 				1 is to increment the byte number
2477 			*/
2478 			v_field_byte = (uint16_t)
2479 							(((v_field_byte + 3) % 4) + 1);
2480 		}
2481 		else
2482 		{
2483 			/* less than 0xFF */
2484 #if 0
2485 			if ((0x03 == v_field_byte)
2486 				|| (0x04 == v_field_byte))
2487 			{
2488 				/*
2489 					here
2490 					1 is the 1 LENGTH byte to skip
2491 					4 is the block size
2492 					1 is to increment the byte number
2493 				*/
2494 				v_field_byte = (uint16_t)
2495 								(((v_field_byte + 1) % 4) + 1);
2496 			}
2497 			else
2498 			{
2499 				v_field_byte = (uint16_t)
2500 								(v_field_byte + 1);
2501 			}
2502 #endif /* #if 0 */
2503 		}
2504 	}
2505 #endif /* #ifndef NDEF_READ_CHANGE */
2506 
2507 #ifndef NDEF_READ_CHANGE
2508 	(void)memcpy(&(NdefMap->MifareULContainer.ReadBuf[
2509                 NdefMap->MifareULContainer.ReadBufIndex]),
2510                 (void *)(NdefMap->SendRecvBuf + v_field_byte),
2511                 (*NdefMap->SendRecvLength - v_field_byte));
2512 
2513 	NdefMap->MifareULContainer.ReadBufIndex = (uint16_t)
2514 		(NdefMap->MifareULContainer.ReadBufIndex +
2515 		(*NdefMap->SendRecvLength - v_field_byte));
2516 #else /* #ifndef NDEF_READ_CHANGE */
2517 
2518     (void)memcpy(&(NdefMap->MifareULContainer.ReadBuf[
2519                 NdefMap->MifareULContainer.ReadBufIndex]),
2520                 NdefMap->SendRecvBuf,
2521                 *NdefMap->SendRecvLength);
2522 
2523     NdefMap->MifareULContainer.ReadBufIndex=NdefMap->MifareULContainer.ReadBufIndex +*NdefMap->SendRecvLength;
2524 #endif /* #ifndef NDEF_READ_CHANGE */
2525 
2526     localCurrentBlock = NdefMap->MifareULContainer.CurrentBlock+
2527                             (uint8_t)((NdefMap->MifareULContainer.ReadBufIndex !=
2528                             NdefMap->CardMemSize)?
2529                             PH_FRINFC_NDEFMAP_MFUL_BLOCK4:
2530                             PH_FRINFC_NDEFMAP_MFUL_VAL0);
2531     if (localCurrentBlock < 256)
2532     {
2533         NdefMap->MifareULContainer.CurrentBlock =  NdefMap->MifareULContainer.CurrentBlock+
2534                             (uint8_t)((NdefMap->MifareULContainer.ReadBufIndex !=
2535                             NdefMap->CardMemSize)?
2536                             PH_FRINFC_NDEFMAP_MFUL_BLOCK4:
2537                             PH_FRINFC_NDEFMAP_MFUL_VAL0);
2538     }
2539     else
2540     {
2541         /* Go to next sector */
2542         if (NdefMap->MifareULContainer.CurrentSector == 0)
2543         {
2544             NdefMap->MifareULContainer.CurrentSector++;
2545             NdefMap->MifareULContainer.CurrentBlock = 0xff;
2546 
2547             Result = phFriNfc_MfUL_H_SelectSector(NdefMap,
2548                     NdefMap->MifareULContainer.CurrentSector, 1,
2549                     PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_READ_1);
2550         }
2551     }
2552 
2553     return Result;
2554 }
2555 
phFriNfc_MfUL_H_CpDataToUserBuf(phFriNfc_NdefMap_t * NdefMap)2556 static NFCSTATUS phFriNfc_MfUL_H_CpDataToUserBuf(phFriNfc_NdefMap_t *NdefMap)
2557 {
2558     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
2559 
2560     /* Check the user buffer size with the
2561     L value of TLV */
2562     if(NdefMap->ApduBufferSize >=
2563         NdefMap->TLVStruct.BytesRemainLinTLV)
2564     {
2565         (void)memcpy(NdefMap->ApduBuffer,
2566             &(NdefMap->MifareULContainer.ReadBuf[
2567             NdefMap->MifareULContainer.ByteNumber]),
2568             NdefMap->TLVStruct.BytesRemainLinTLV);
2569 
2570         *(NdefMap->NumOfBytesRead) =
2571                     NdefMap->TLVStruct.BytesRemainLinTLV;
2572         NdefMap->MifareULContainer.ByteNumber =
2573                                 PH_FRINFC_NDEFMAP_MFUL_VAL0;
2574         NdefMap->MifareULContainer.ReadWriteCompleteFlag =
2575                                 PH_FRINFC_NDEFMAP_MFUL_FLAG1;
2576         NdefMap->MifareULContainer.RemainingSize =  NdefMap->MifareULContainer.RemainingSize-
2577                                                     NdefMap->TLVStruct.BytesRemainLinTLV;
2578         NdefMap->TLVStruct.BytesRemainLinTLV =
2579                                 PH_FRINFC_NDEFMAP_MFUL_VAL0;
2580     }
2581     else
2582     {
2583         (void)memcpy(NdefMap->ApduBuffer,
2584             &(NdefMap->MifareULContainer.ReadBuf[
2585             NdefMap->MifareULContainer.ByteNumber]),
2586             NdefMap->ApduBufferSize);
2587 
2588         *(NdefMap->NumOfBytesRead) =
2589                     NdefMap->ApduBufferSize;
2590         NdefMap->MifareULContainer.ByteNumber = NdefMap->MifareULContainer.ByteNumber+
2591                                                 (uint16_t)NdefMap->ApduBufferSize;
2592         NdefMap->MifareULContainer.RemainingSize=NdefMap->MifareULContainer.RemainingSize-
2593                                                      (uint16_t)NdefMap->ApduBufferSize;
2594         NdefMap->TLVStruct.BytesRemainLinTLV =  NdefMap->TLVStruct.BytesRemainLinTLV-
2595                     (uint16_t)NdefMap->ApduBufferSize;
2596     }
2597     return Result;
2598 }
2599 
phFriNfc_MfUL_H_RdBeforeWrite(phFriNfc_NdefMap_t * NdefMap)2600 static NFCSTATUS phFriNfc_MfUL_H_RdBeforeWrite(phFriNfc_NdefMap_t       *NdefMap)
2601 {
2602     uint16_t localCurrentBlock = NdefMap->TLVStruct.NdefTLVBlock;
2603 
2604     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
2605     uint8_t     index = PH_FRINFC_NDEFMAP_MFUL_VAL0,
2606                 i = PH_FRINFC_NDEFMAP_MFUL_VAL0;
2607     /*            BytesToWrite = PH_FRINFC_NDEFMAP_MFUL_VAL0;*/
2608     uint16_t    TemLength = PH_FRINFC_NDEFMAP_MFUL_VAL0;
2609 
2610     switch((NdefMap->TLVStruct.NdefTLVByte - PH_FRINFC_NDEFMAP_MFUL_VAL1))
2611     {
2612         case PH_FRINFC_NDEFMAP_MFUL_VAL0:
2613             /* go the NDEF TLV block to start write */
2614             NdefMap->MifareULContainer.CurrentBlock =
2615                 NdefMap->TLVStruct.NdefTLVBlock;
2616             /* fill send buffer for write */
2617             NdefMap->SendRecvBuf[index] =
2618                                 NdefMap->MifareULContainer.CurrentBlock;
2619             index++;
2620             NdefMap->SendRecvBuf[index] =
2621                                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_T;
2622             index++;
2623             if (NdefMap->ApduBufferSize > 254)
2624             {
2625                 NdefMap->SendRecvBuf[index] = 0xFF;
2626                 index++;
2627                 NdefMap->SendRecvBuf[index] =
2628                                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
2629                 index++;
2630                 NdefMap->SendRecvBuf[index] =
2631                                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
2632                 index++;
2633             }
2634             else
2635             {
2636                 NdefMap->SendRecvBuf[index] =
2637                                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
2638                 index++;
2639             }
2640 
2641 
2642             break;
2643 
2644         case PH_FRINFC_NDEFMAP_MFUL_VAL1:
2645         case PH_FRINFC_NDEFMAP_MFUL_VAL2:
2646             /* read to get the previous bytes */
2647             Result = phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
2648                             NdefMap->TLVStruct.NdefTLVBlock);
2649             break;
2650 
2651         case PH_FRINFC_NDEFMAP_MFUL_VAL3:
2652 
2653             localCurrentBlock = (NdefMap->MifareULContainer.CurrentBlock +
2654                                 PH_FRINFC_NDEFMAP_MFUL_VAL1);
2655 
2656             if (localCurrentBlock < 256)
2657             {
2658 
2659                 NdefMap->MifareULContainer.CurrentBlock =
2660                             (NdefMap->MifareULContainer.CurrentBlock +
2661                                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
2662                 NdefMap->SendRecvBuf[index] =
2663                                     NdefMap->MifareULContainer.CurrentBlock;
2664                 index++;
2665 
2666                 if (NdefMap->ApduBufferSize > 254)
2667                 {
2668                     NdefMap->SendRecvBuf[index] = 0xFF;
2669                     index++;
2670                     NdefMap->SendRecvBuf[index] =
2671                                         PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
2672                     index++;
2673                     NdefMap->SendRecvBuf[index] =
2674                                         PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
2675                     index++;
2676                 }
2677                 else
2678                 {
2679                     NdefMap->SendRecvBuf[index] =
2680                                         PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
2681                     index++;
2682                 }
2683             }
2684             else
2685             {
2686                 /* Go to next sector */
2687                 NdefMap->MifareULContainer.CurrentSector++;
2688 
2689                 Result = phFriNfc_MfUL_H_SelectSector(NdefMap,
2690                     NdefMap->MifareULContainer.CurrentSector, 1,
2691                     PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RW_1);
2692             }
2693             break;
2694 
2695         default:
2696             Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
2697                                 NFCSTATUS_INVALID_REMOTE_DEVICE);
2698             break;
2699     }
2700 
2701     if((((NdefMap->TLVStruct.NdefTLVByte -
2702         PH_FRINFC_NDEFMAP_MFUL_VAL1) == PH_FRINFC_NDEFMAP_MFUL_VAL0) ||
2703         ((NdefMap->TLVStruct.NdefTLVByte - PH_FRINFC_NDEFMAP_MFUL_VAL1)
2704         == PH_FRINFC_NDEFMAP_MFUL_VAL3)) && localCurrentBlock < 256)
2705     {
2706         /* Length to know how many bytes has to be written to the card */
2707         TemLength = (((NdefMap->TLVStruct.NdefTLVByte - PH_FRINFC_NDEFMAP_MFUL_VAL1) ==
2708                         PH_FRINFC_NDEFMAP_MFUL_VAL0)?
2709                         PH_FRINFC_NDEFMAP_MFUL_VAL2:
2710                         PH_FRINFC_NDEFMAP_MFUL_VAL3);
2711 
2712         if (NdefMap->ApduBufferSize > 254)
2713         {
2714             TemLength -= 2;
2715         }
2716 
2717         if(NdefMap->ApduBufferSize >= TemLength)
2718         {
2719             /* Prepare the receive buffer */
2720             (void)memcpy(&(NdefMap->SendRecvBuf[
2721                             index]),
2722                             &(NdefMap->ApduBuffer[
2723                             NdefMap->ApduBuffIndex]),
2724                             TemLength);
2725 
2726             /* Number of bytes written to the card from user buffer */
2727             NdefMap->NumOfBytesWritten = TemLength;
2728 
2729             index = index+(uint8_t)TemLength;
2730             /* Exact number of bytes written in the card including TLV */
2731             if (index >= 1)
2732             {
2733                 *NdefMap->DataCount = (index - PH_FRINFC_NDEFMAP_MFUL_VAL1);
2734             }
2735             else
2736             {
2737                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
2738                                 NFCSTATUS_INVALID_REMOTE_DEVICE);
2739             }
2740         }
2741         else
2742         {
2743             /* Prepare the receive buffer */
2744             (void)memcpy(&(NdefMap->SendRecvBuf[
2745                             index]),
2746                             &(NdefMap->ApduBuffer[
2747                             NdefMap->ApduBuffIndex]),
2748                             (uint16_t)NdefMap->ApduBufferSize);
2749 
2750             /* Number of bytes written to the card from user buffer */
2751             NdefMap->NumOfBytesWritten = (uint16_t)NdefMap->ApduBufferSize;
2752 
2753             index= index +(uint8_t)NdefMap->ApduBufferSize;
2754             /* Exact number of bytes written in the card including TLV */
2755             *NdefMap->DataCount = (index - PH_FRINFC_NDEFMAP_MFUL_VAL1);
2756 
2757             for(i = index; i < PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK; i++)
2758             {
2759                 NdefMap->SendRecvBuf[i] = (uint8_t)((i == index)?
2760                         PH_FRINFC_NDEFMAP_MFUL_TERMTLV:
2761                         PH_FRINFC_NDEFMAP_MFUL_NULLTLV);
2762                 NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
2763             }
2764         }
2765 
2766         /* store the bytes in buffer till the bytes are
2767             written in a block */
2768         (void)memcpy(NdefMap->MifareULContainer.Buffer,
2769                         &(NdefMap->SendRecvBuf[
2770                         PH_FRINFC_NDEFMAP_MFUL_VAL1]),
2771                         (PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK -
2772                         PH_FRINFC_NDEFMAP_MFUL_VAL1));
2773 
2774         (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer,
2775                     NdefMap->MifareULContainer.Buffer,
2776                     (PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK -
2777                         PH_FRINFC_NDEFMAP_MFUL_VAL1));
2778 
2779         /* Change the state to check ndef compliancy */
2780         NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE;
2781 
2782         Result = phFriNfc_MfUL_H_Wr4bytes(NdefMap);
2783     }
2784     return Result;
2785 }
2786 
phFriNfc_MfUL_H_CallWrOp(phFriNfc_NdefMap_t * NdefMap)2787 static NFCSTATUS phFriNfc_MfUL_H_CallWrOp(phFriNfc_NdefMap_t        *NdefMap)
2788 {
2789     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
2790    /* uint8_t     index = PH_FRINFC_NDEFMAP_MFUL_VAL1;*/
2791 
2792 
2793     NdefMap->MifareULContainer.CurrentBlock =
2794                         NdefMap->TLVStruct.NdefTLVBlock;
2795 
2796     (void)memcpy(&(NdefMap->SendRecvBuf[
2797                 PH_FRINFC_NDEFMAP_MFUL_VAL1]),
2798                 NdefMap->SendRecvBuf,
2799                 PH_FRINFC_NDEFMAP_MFUL_VAL4);
2800 
2801     NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] =
2802                             NdefMap->MifareULContainer.CurrentBlock;
2803 
2804     if (NdefMap->ApduBufferSize > 254)
2805     {
2806          NdefMap->SendRecvBuf[(NdefMap->TLVStruct.NdefTLVByte +
2807                             PH_FRINFC_NDEFMAP_MFUL_VAL1)] = 0xFF;
2808 
2809 
2810         if((NdefMap->TLVStruct.NdefTLVByte + PH_FRINFC_NDEFMAP_MFUL_VAL1) <
2811             PH_FRINFC_NDEFMAP_MFUL_VAL4)
2812         {
2813             NdefMap->SendRecvBuf[(NdefMap->TLVStruct.NdefTLVByte +
2814                             PH_FRINFC_NDEFMAP_MFUL_VAL2 )] = 0x00;
2815 
2816             NdefMap->NumOfLReminWrite = 1;
2817 
2818         }
2819         else
2820         {
2821             NdefMap->NumOfLReminWrite = 2;
2822         }
2823         NdefMap->NumOfBytesWritten = 0;
2824     }
2825     else
2826     {
2827         /* Write the length value = 0 */
2828         NdefMap->SendRecvBuf[(NdefMap->TLVStruct.NdefTLVByte +
2829                                 PH_FRINFC_NDEFMAP_MFUL_VAL1)] =
2830                                 PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
2831 
2832         if((NdefMap->TLVStruct.NdefTLVByte + PH_FRINFC_NDEFMAP_MFUL_VAL1) <
2833             PH_FRINFC_NDEFMAP_MFUL_VAL4)
2834         {
2835             /* Only one byte  */
2836             (void)memcpy(&(NdefMap->SendRecvBuf[
2837                     PH_FRINFC_NDEFMAP_MFUL_VAL4]),
2838                     &(NdefMap->ApduBuffer[
2839                     NdefMap->ApduBuffIndex]),
2840                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
2841             /* Number of bytes written to the card from user buffer */
2842             NdefMap->NumOfBytesWritten = PH_FRINFC_NDEFMAP_MFUL_VAL1;
2843         }
2844     }
2845 
2846     (void)memcpy(NdefMap->MifareULContainer.Buffer,
2847                 &(NdefMap->SendRecvBuf[
2848                 PH_FRINFC_NDEFMAP_MFUL_VAL1]),
2849                 PH_FRINFC_NDEFMAP_MFUL_VAL4);
2850 
2851     /* Copy the Ndef TLV buffer to send buffer */
2852     (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer,
2853                 NdefMap->MifareULContainer.Buffer,
2854                 PH_FRINFC_NDEFMAP_MFUL_BYTE4);
2855 
2856     /* Exact number of bytes written in the card including TLV */
2857     *NdefMap->DataCount = PH_FRINFC_NDEFMAP_MFUL_VAL4;
2858 
2859     /* Change the state to check ndef compliancy */
2860     NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE;
2861 
2862     Result = phFriNfc_MfUL_H_Wr4bytes(NdefMap);
2863 
2864     return Result;
2865 }
2866 
phFriNfc_MfUL_H_ProWrittenBytes(phFriNfc_NdefMap_t * NdefMap)2867 static NFCSTATUS phFriNfc_MfUL_H_ProWrittenBytes(phFriNfc_NdefMap_t *NdefMap)
2868 {
2869     uint16_t localCurrentBlock;
2870     NFCSTATUS   Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
2871                         NFCSTATUS_INVALID_REMOTE_DEVICE);
2872 
2873     if(NdefMap->ApduBuffIndex < NdefMap->ApduBufferSize)
2874     {
2875         NdefMap->ApduBuffIndex =  NdefMap->ApduBuffIndex+NdefMap->NumOfBytesWritten;
2876         if(*NdefMap->DataCount <
2877             PH_FRINFC_NDEFMAP_MFUL_VAL4)
2878         {
2879             (void)memcpy(NdefMap->MifareULContainer.InternalBuf,
2880                         NdefMap->MifareULContainer.Buffer,
2881                         *NdefMap->DataCount);
2882 
2883             NdefMap->MifareULContainer.InternalLength = *NdefMap->DataCount;
2884         }
2885         else
2886         {
2887             NdefMap->MifareULContainer.InternalLength =
2888                                 PH_FRINFC_NDEFMAP_MFUL_VAL0;
2889         }
2890 
2891         NdefMap->MifareULContainer.RemainingSize=  NdefMap->MifareULContainer.RemainingSize-
2892                                             NdefMap->NumOfBytesWritten;
2893         if((NdefMap->ApduBuffIndex == NdefMap->ApduBufferSize) ||
2894             (NdefMap->MifareULContainer.RemainingSize ==
2895             PH_FRINFC_NDEFMAP_MFUL_VAL0))
2896         {
2897             Result = NFCSTATUS_SUCCESS;
2898             NdefMap->MifareULContainer.ReadWriteCompleteFlag =
2899                 (uint8_t)((NdefMap->MifareULContainer.RemainingSize ==
2900                 PH_FRINFC_NDEFMAP_MFUL_VAL0)?
2901                 PH_FRINFC_NDEFMAP_MFUL_FLAG1:
2902                 PH_FRINFC_NDEFMAP_MFUL_FLAG0);
2903 
2904                 NdefMap->TLVStruct.SetTermTLVFlag =
2905                 (uint8_t)(((NdefMap->MifareULContainer.RemainingSize ==
2906                 PH_FRINFC_NDEFMAP_MFUL_VAL0) ||
2907                 (NdefMap->TLVStruct.SetTermTLVFlag ==
2908                 PH_FRINFC_NDEFMAP_MFUL_FLAG1))?
2909                 PH_FRINFC_NDEFMAP_MFUL_FLAG1:
2910                 PH_FRINFC_NDEFMAP_MFUL_FLAG0);
2911 
2912                 NdefMap->MifareULContainer.CurrentBlock = NdefMap->MifareULContainer.CurrentBlock+
2913                     (uint8_t)((NdefMap->MifareULContainer.InternalLength !=
2914                     PH_FRINFC_NDEFMAP_MFUL_VAL0)?
2915                     PH_FRINFC_NDEFMAP_MFUL_VAL0:
2916                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
2917 
2918             *NdefMap->WrNdefPacketLength = NdefMap->ApduBuffIndex;
2919         }
2920         else
2921         {
2922             localCurrentBlock = NdefMap->MifareULContainer.CurrentBlock + 1;
2923             if (localCurrentBlock < 256)
2924             {
2925                 NdefMap->MifareULContainer.CurrentBlock++;
2926                 Result = phFriNfc_MfUL_H_fillSendBufToWr(NdefMap);
2927             }
2928             else
2929             {
2930                 /* Go to next sector */
2931                 NdefMap->MifareULContainer.CurrentSector++;
2932 
2933                 Result = phFriNfc_MfUL_H_SelectSector(NdefMap,
2934                     NdefMap->MifareULContainer.CurrentSector, 1,
2935                     PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_1);
2936             }
2937         }
2938     }
2939 
2940     if((Result == NFCSTATUS_SUCCESS) &&
2941         (NdefMap->TLVStruct.SetTermTLVFlag !=
2942         PH_FRINFC_NDEFMAP_MFUL_FLAG1) &&
2943         (NdefMap->MifareULContainer.RemainingSize >
2944         PH_FRINFC_NDEFMAP_MFUL_VAL0))
2945     {
2946         Result = phFriNfc_MfUL_H_WrTermTLV(NdefMap);
2947     }
2948     else
2949     {
2950         if((Result == NFCSTATUS_SUCCESS) &&
2951             (NdefMap->TLVStruct.SetTermTLVFlag ==
2952             PH_FRINFC_NDEFMAP_MFUL_FLAG1))
2953         {
2954             Result = phFriNfc_MfUL_H_UpdateWrLen(NdefMap);
2955         }
2956     }
2957     return Result;
2958 }
phFriNfc_MfUL_H_fillSendBufToWr(phFriNfc_NdefMap_t * NdefMap)2959 static NFCSTATUS phFriNfc_MfUL_H_fillSendBufToWr(phFriNfc_NdefMap_t *NdefMap)
2960 {
2961     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
2962     uint16_t    RemainingBytes = PH_FRINFC_NDEFMAP_MFUL_VAL0,
2963                 BytesToWrite = PH_FRINFC_NDEFMAP_MFUL_VAL0;
2964     uint8_t     index = PH_FRINFC_NDEFMAP_MFUL_VAL0;
2965 
2966     RemainingBytes = (uint16_t)(( (NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex) <=
2967                         NdefMap->MifareULContainer.RemainingSize)?
2968                         (uint16_t)(NdefMap->ApduBufferSize -
2969                         NdefMap->ApduBuffIndex):
2970                         NdefMap->MifareULContainer.RemainingSize);
2971 
2972     NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] =
2973                         NdefMap->MifareULContainer.CurrentBlock;
2974 
2975     /* Get the number of bytes that can be written after copying
2976         the internal buffer */
2977     BytesToWrite = ((RemainingBytes <
2978                     (PH_FRINFC_NDEFMAP_MFUL_BYTE4 -
2979                     NdefMap->MifareULContainer.InternalLength))?
2980                     RemainingBytes:
2981                     (PH_FRINFC_NDEFMAP_MFUL_BYTE4 -
2982                     NdefMap->MifareULContainer.InternalLength));
2983 
2984     if (NdefMap->NumOfBytesWritten == 0 && NdefMap->NumOfLReminWrite > 0)
2985     {
2986         BytesToWrite = BytesToWrite - NdefMap->NumOfLReminWrite;
2987 
2988         if (NdefMap->NumOfLReminWrite == 1)
2989         {
2990             NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL1] = 0x00;
2991         }
2992         else
2993         {
2994             NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL1] = 0x00;
2995             NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL2] = 0x00;
2996         }
2997     }
2998 
2999     if(NdefMap->MifareULContainer.InternalLength >
3000         PH_FRINFC_NDEFMAP_MFUL_VAL0)
3001     {
3002         /* copy the internal buffer to the send buffer */
3003         (void)memcpy(&(NdefMap->SendRecvBuf[
3004                     PH_FRINFC_NDEFMAP_MFUL_VAL1]),
3005                     NdefMap->MifareULContainer.InternalBuf,
3006                     NdefMap->MifareULContainer.InternalLength);
3007 
3008     }
3009 
3010     /* Copy Bytes to write in the send buffer */
3011     (void)memcpy(&(NdefMap->SendRecvBuf[
3012                 (PH_FRINFC_NDEFMAP_MFUL_VAL1 +
3013                 NdefMap->MifareULContainer.InternalLength) +
3014                 NdefMap->NumOfLReminWrite]),
3015                 &(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex]),
3016                 BytesToWrite);
3017 
3018     /* update number of bytes written from the user buffer */
3019     NdefMap->NumOfBytesWritten = BytesToWrite;
3020 
3021     /* check the exact number of bytes written to a block including the
3022         internal length */
3023     *NdefMap->DataCount =
3024             (BytesToWrite + NdefMap->MifareULContainer.InternalLength +
3025                     NdefMap->NumOfLReminWrite);
3026 
3027 
3028     /* if total bytes to write in the card is less than 4 bytes then
3029     pad zeroes till 4 bytes */
3030     if((BytesToWrite + NdefMap->MifareULContainer.InternalLength +
3031         NdefMap->NumOfLReminWrite)
3032             < PH_FRINFC_NDEFMAP_MFUL_BYTE4)
3033     {
3034         for(index = (uint8_t)((BytesToWrite + NdefMap->MifareULContainer.InternalLength + NdefMap->NumOfLReminWrite) +
3035                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
3036             index < PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK;
3037             index++)
3038             {
3039                 NdefMap->SendRecvBuf[index] = (uint8_t)((index ==
3040                                     ((BytesToWrite +
3041                                     NdefMap->MifareULContainer.InternalLength + NdefMap->NumOfLReminWrite) +
3042                                     PH_FRINFC_NDEFMAP_MFUL_VAL1))?
3043                                     PH_FRINFC_NDEFMAP_MFUL_TERMTLV:
3044                                     PH_FRINFC_NDEFMAP_MFUL_NULLTLV);
3045 
3046                 NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
3047             }
3048     }
3049 
3050     /* A temporary buffer to hold four bytes of data that is
3051         written to the card */
3052     (void)memcpy(NdefMap->MifareULContainer.Buffer,
3053                 &(NdefMap->SendRecvBuf[
3054                 PH_FRINFC_NDEFMAP_MFUL_VAL1]),
3055                 PH_FRINFC_NDEFMAP_MFUL_BYTE4);
3056 
3057 
3058 
3059         if((NdefMap->TLVStruct.NdefTLVByte - PH_FRINFC_NDEFMAP_MFUL_VAL1) <
3060         PH_FRINFC_NDEFMAP_MFUL_VAL3)
3061         {
3062             if ((NdefMap->TLVStruct.NdefTLVSector ==
3063                 NdefMap->MifareULContainer.CurrentSector))
3064             {
3065                 if(NdefMap->MifareULContainer.CurrentBlock ==
3066                         NdefMap->TLVStruct.NdefTLVBlock)
3067                 {
3068                     (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer,
3069                         NdefMap->MifareULContainer.Buffer,
3070                         PH_FRINFC_NDEFMAP_MFUL_BYTE4);
3071                 }
3072             }
3073 
3074             if ((NdefMap->TLVStruct.NdefTLVSector ==
3075                 NdefMap->MifareULContainer.CurrentSector) ||
3076                 (NdefMap->TLVStruct.NdefTLVBlock == 0xFF))
3077             {
3078                 if(NdefMap->MifareULContainer.CurrentBlock ==
3079                     (NdefMap->TLVStruct.NdefTLVBlock + PH_FRINFC_NDEFMAP_MFUL_VAL1))
3080                 {
3081                     (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer1,
3082                     NdefMap->MifareULContainer.Buffer,
3083                     PH_FRINFC_NDEFMAP_MFUL_BYTE4);
3084                 }
3085             }
3086         }
3087         else
3088         {
3089             if ((NdefMap->TLVStruct.NdefTLVSector ==
3090                 NdefMap->MifareULContainer.CurrentSector))
3091             {
3092                 if(NdefMap->MifareULContainer.CurrentBlock ==
3093                     (NdefMap->TLVStruct.NdefTLVBlock +
3094                     PH_FRINFC_NDEFMAP_MFUL_VAL1))
3095                 {
3096                     (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer,
3097                                 NdefMap->MifareULContainer.Buffer,
3098                                 PH_FRINFC_NDEFMAP_MFUL_BYTE4);
3099                 }
3100             }
3101 
3102             if ((NdefMap->TLVStruct.NdefTLVSector ==
3103                 NdefMap->MifareULContainer.CurrentSector)||
3104                 (NdefMap->TLVStruct.NdefTLVBlock == 0xFF))
3105             {
3106                 if(NdefMap->MifareULContainer.CurrentBlock ==
3107                     (NdefMap->TLVStruct.NdefTLVBlock + PH_FRINFC_NDEFMAP_MFUL_VAL2))
3108                 {
3109                     (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer1,
3110                                 NdefMap->MifareULContainer.Buffer,
3111                                 PH_FRINFC_NDEFMAP_MFUL_BYTE4);
3112                 }
3113             }
3114         }
3115 
3116 
3117     /* Change the state to check ndef compliancy */
3118     NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE;
3119 
3120     NdefMap->NumOfLReminWrite = 0;
3121 
3122     /* Start writing to the current block */
3123     Result = phFriNfc_MfUL_H_Wr4bytes(NdefMap);
3124 
3125     return Result;
3126 }
phFriNfc_MfUL_H_WrTermTLV(phFriNfc_NdefMap_t * NdefMap)3127 static NFCSTATUS phFriNfc_MfUL_H_WrTermTLV(phFriNfc_NdefMap_t   *NdefMap)
3128 {
3129     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
3130     uint8_t     index = PH_FRINFC_NDEFMAP_MFUL_VAL0,
3131                 i = PH_FRINFC_NDEFMAP_MFUL_VAL0;
3132 
3133     /* Change the state to check ndef compliancy */
3134     NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_TERM_TLV;
3135 
3136     NdefMap->SendRecvBuf[index] =
3137                         (NdefMap->MifareULContainer.CurrentBlock +
3138                         PH_FRINFC_NDEFMAP_MFUL_VAL0);
3139     index++;
3140     NdefMap->SendRecvBuf[index] = PH_FRINFC_NDEFMAP_MFUL_TERMTLV;
3141     index++;
3142 
3143     for(i = index; i < PH_FRINFC_NDEFMAP_MFUL_VAL4; i++)
3144     {
3145         NdefMap->SendRecvBuf[i] = PH_FRINFC_NDEFMAP_MFUL_NULLTLV;
3146     }
3147 
3148     Result = phFriNfc_MfUL_H_Wr4bytes(NdefMap);
3149     return Result;
3150 }
3151 
phFriNfc_MfUL_H_UpdateWrLen(phFriNfc_NdefMap_t * NdefMap)3152 static NFCSTATUS phFriNfc_MfUL_H_UpdateWrLen(phFriNfc_NdefMap_t *NdefMap)
3153 {
3154     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
3155     uint16_t    BlockNo = PH_FRINFC_NDEFMAP_MFUL_VAL0,
3156                 ByteNo = PH_FRINFC_NDEFMAP_MFUL_VAL0;
3157 
3158     if ((NdefMap->TLVStruct.NdefTLVSector ==
3159         NdefMap->MifareULContainer.CurrentSector) ||
3160         ((NdefMap->TLVStruct.NdefTLVBlock == 0xFF) &&
3161         (NdefMap->TLVStruct.NdefTLVByte == 4) &&
3162         (NdefMap->TLVStruct.NdefTLVSector == 0)))
3163     {
3164         BlockNo = (((NdefMap->TLVStruct.NdefTLVByte -
3165                     PH_FRINFC_NDEFMAP_MFUL_VAL1) !=
3166                     PH_FRINFC_NDEFMAP_MFUL_VAL3)?
3167                     NdefMap->TLVStruct.NdefTLVBlock:
3168                     (NdefMap->TLVStruct.NdefTLVBlock +
3169                     PH_FRINFC_NDEFMAP_MFUL_VAL1));
3170 
3171         ByteNo = (((NdefMap->TLVStruct.NdefTLVByte -
3172                     PH_FRINFC_NDEFMAP_MFUL_VAL1) ==
3173                     PH_FRINFC_NDEFMAP_MFUL_VAL3)?
3174                     PH_FRINFC_NDEFMAP_MFUL_VAL1:
3175                     (NdefMap->TLVStruct.NdefTLVByte +
3176                     PH_FRINFC_NDEFMAP_MFUL_VAL1));
3177 
3178         if (NdefMap->NumOfLReminWrite > 0)
3179         {
3180             BlockNo++;
3181 
3182             /* Copy the Ndef TLV buffer to send buffer */
3183             (void)memcpy(&(NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL1]),
3184                         NdefMap->TLVStruct.NdefTLVBuffer1,
3185                         PH_FRINFC_NDEFMAP_MFUL_BYTE4);
3186 
3187             if (NdefMap->NumOfLReminWrite == 1)
3188             {
3189                 /* NdefMap->SendRecvBuf[1] = (uint8_t) ((NdefMap->ApduBuffIndex & 0xFF00) >> 8); */
3190 				NdefMap->SendRecvBuf[1] = (uint8_t) NdefMap->ApduBuffIndex;
3191 
3192             }
3193             else if (NdefMap->NumOfLReminWrite == 2)
3194             {
3195 				NdefMap->SendRecvBuf[1] = (uint8_t) ((NdefMap->ApduBuffIndex & 0xFF00) >> 8);
3196                 NdefMap->SendRecvBuf[2]= (uint8_t) (NdefMap->ApduBuffIndex);
3197 
3198             }
3199             else
3200             {
3201 
3202             }
3203             NdefMap->NumOfLReminWrite = 0;
3204         }
3205         else
3206         {
3207             /* Copy the Ndef TLV buffer to send buffer */
3208             (void)memcpy(&(NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL1]),
3209                         NdefMap->TLVStruct.NdefTLVBuffer,
3210                         PH_FRINFC_NDEFMAP_MFUL_BYTE4);
3211 
3212 
3213             if (NdefMap->ApduBuffIndex > 254)
3214             {
3215                 ByteNo++;
3216                 if  ((ByteNo == 3) || (ByteNo == 2))
3217                 {
3218                     NdefMap->SendRecvBuf[ByteNo]= (uint8_t) ((NdefMap->ApduBuffIndex & 0xFF00) >> 8);
3219                     ByteNo++;
3220                     NdefMap->SendRecvBuf[ByteNo] = (uint8_t) (NdefMap->ApduBuffIndex);
3221                     ByteNo++;
3222                     NdefMap->NumOfLReminWrite = 0;
3223                 }
3224                 else if (ByteNo == 4)
3225                 {
3226                     /* NdefMap->SendRecvBuf[ByteNo]= (uint8_t) (NdefMap->ApduBuffIndex); */
3227 					NdefMap->SendRecvBuf[ByteNo]= (uint8_t) ((NdefMap->ApduBuffIndex & 0xFF00) >> 8);
3228                     ByteNo++;
3229                     NdefMap->NumOfLReminWrite = 1;
3230                 }
3231                 else
3232                 {
3233                     NdefMap->NumOfLReminWrite = 2;
3234                 }
3235             }
3236             else
3237             {
3238                 NdefMap->SendRecvBuf[ByteNo]=
3239                                     (uint8_t)((NdefMap->Offset ==
3240                                     PH_FRINFC_NDEFMAP_SEEK_BEGIN)?
3241                                     (uint8_t)NdefMap->ApduBuffIndex:
3242                                     (NdefMap->ApduBuffIndex +
3243                                     NdefMap->SendRecvBuf[ByteNo]));
3244             }
3245         }
3246 
3247         (void)memcpy(NdefMap->MifareULContainer.Buffer,
3248                     &(NdefMap->SendRecvBuf[
3249                     PH_FRINFC_NDEFMAP_MFUL_VAL1]),
3250                     PH_FRINFC_NDEFMAP_MFUL_BYTE4);
3251 
3252         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] = (uint8_t)BlockNo;
3253         Result = phFriNfc_MfUL_H_Wr4bytes(NdefMap);
3254 
3255         if (NdefMap->NumOfLReminWrite == 0)
3256         {
3257             NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_WR_LEN_TLV;
3258         }
3259         else
3260         {
3261             NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_TERM_TLV;
3262         }
3263     }
3264     else if (NdefMap->TLVStruct.NdefTLVSector == 0)
3265     {
3266         /* Reset sector */
3267         NdefMap->MifareULContainer.CurrentSector = 0;
3268         NdefMap->PrevState = PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE;
3269 
3270         Result = phFriNfc_MfUL_H_SelectSector(NdefMap,
3271                 NdefMap->MifareULContainer.CurrentSector, 1,
3272                 PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_1);
3273 
3274     }
3275     else
3276     {
3277         Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_DEVICE_REQUEST);
3278     }
3279 
3280 
3281     return Result;
3282 }
3283 #ifdef UNIT_TEST
phFriNfc_MifareUL_UnitTest(void * Context,uint32_t Length)3284 extern void phFriNfc_MifareUL_UnitTest(void *Context,uint32_t Length)
3285 {
3286         uint8_t value=10;
3287         uint8_t* CrFlag=&value;
3288         phFriNfc_NdefMap_t *pNdefMap=(phFriNfc_NdefMap_t*)Context;
3289         phFriNfc_MfUL_H_UpdateLen(pNdefMap,(uint16_t) Length);
3290         phFriNfc_MfUL_H_WrTermTLV(pNdefMap);
3291         phFriNfc_MfUL_H_CallWrOp(pNdefMap);
3292         phFriNfc_MfUL_H_UpdateWrLen(pNdefMap);
3293         phFriNfc_MfUL_H_ChkRemainTLV(pNdefMap,CrFlag);
3294         phFriNfc_MfUL_H_ProWrittenBytes(pNdefMap);
3295 
3296         pNdefMap->PrevOperation=PH_FRINFC_NDEFMAP_READ_OPE;
3297         phFriNfc_MfUL_H_NxtOp(pNdefMap,CrFlag);
3298 
3299         pNdefMap->PrevOperation=PH_FRINFC_NDEFMAP_WRITE_OPE;
3300         phFriNfc_MfUL_H_NxtOp(pNdefMap,CrFlag);
3301 
3302         pNdefMap->TLVStruct.NoLbytesinTLV=PH_FRINFC_NDEFMAP_MFUL_VAL1;
3303         phFriNfc_MfUL_H_ChkRemainTLV(pNdefMap,CrFlag);
3304 
3305         pNdefMap->SendRecvBuf[0x00]= PH_FRINFC_NDEFMAP_MFUL_NULLTLV;
3306         phFriNfc_MfUL_H_findNDEFTLV(pNdefMap,CrFlag);
3307 
3308 
3309         pNdefMap->SendRecvBuf[0x00]= PH_FRINFC_NDEFMAP_MFUL_NULLTLV;
3310         phFriNfc_MfUL_H_findNDEFTLV(pNdefMap,CrFlag);
3311 
3312 
3313         phFriNfc_MfUL_H_RdBeforeWrite(pNdefMap);
3314         pNdefMap->TLVStruct.NdefTLVByte=1;
3315         phFriNfc_MfUL_H_RdBeforeWrite(pNdefMap);
3316 
3317         pNdefMap->TLVStruct.NdefTLVByte=3;
3318         phFriNfc_MfUL_H_RdBeforeWrite(pNdefMap);
3319 
3320         pNdefMap->TLVStruct.NdefTLVByte=4;
3321         phFriNfc_MfUL_H_RdBeforeWrite(pNdefMap);
3322 
3323 
3324         phFriNfc_MifareUL_H_Complete(pNdefMap,NFCSTATUS_SUCCESS);
3325         phFriNfc_MifareUL_H_Complete(NULL,NFCSTATUS_SUCCESS);
3326         phFriNfc_MifareUL_H_Complete(pNdefMap,NFCSTATUS_SUCCESS);
3327         pNdefMap->State=PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE;
3328         phFriNfc_MifareUL_H_Complete(pNdefMap,NFCSTATUS_SUCCESS);
3329 
3330         phFriNfc_MifareUL_H_Complete(pNdefMap,NFCSTATUS_FAILED);
3331         phFriNfc_MifareUL_H_Complete(NULL,NFCSTATUS_SUCCESS);
3332         phFriNfc_MifareUL_H_Complete(pNdefMap,NFCSTATUS_FAILED);
3333 
3334         *pNdefMap->DataCount=0x3;
3335         phFriNfc_MfUL_H_ProWrittenBytes(pNdefMap);
3336 
3337         pNdefMap->ApduBuffIndex=0x31;
3338         phFriNfc_MfUL_H_ProWrittenBytes(pNdefMap);
3339 
3340 
3341 
3342 }
3343 
3344 #endif
3345 #endif  /* PH_FRINFC_MAP_MIFAREUL_DISABLED */
3346 
3347