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