18605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/*
28605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Copyright (C) 2015 The Android Open Source Project
38605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
48605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Licensed under the Apache License, Version 2.0 (the "License");
58605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * you may not use this file except in compliance with the License.
68605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * You may obtain a copy of the License at
78605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
88605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *      http://www.apache.org/licenses/LICENSE-2.0
98605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Unless required by applicable law or agreed to in writing, software
118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * distributed under the License is distributed on an "AS IS" BASIS,
128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * See the License for the specific language governing permissions and
148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * limitations under the License.
158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao */
168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/*
188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * NFC Ndef Mapping For Remote Devices.
198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao */
218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#include <phFriNfc_MifStdFormat.h>
238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#include <phNfcCompId.h>
248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#include <phNxpExtns_MifareStd.h>
258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#include <phFriNfc_MifareStdMap.h>
268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/**************** local methods used in this file only ************************/
288605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_RdABlock (phFriNfc_NdefMap_t *NdefMap);
298605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_WrABlock (phFriNfc_NdefMap_t *NdefMap);
308605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_AuthSector (phFriNfc_NdefMap_t *NdefMap);
318605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd4k_H_CheckNdef (phFriNfc_NdefMap_t *NdefMap);
328605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd_H_fillAIDarray (phFriNfc_NdefMap_t *NdefMap);
338605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic uint8_t phFriNfc_MifStd_H_GetSect (uint8_t BlockNumber);
348605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_BlkChk (phFriNfc_NdefMap_t *NdefMap);
358605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_RdAcsBit (phFriNfc_NdefMap_t *NdefMap);
368605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ChkAcsBit (phFriNfc_NdefMap_t *NdefMap);
378605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ChkRdWr (phFriNfc_NdefMap_t *NdefMap);
388605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd_H_ChkNdefCmpltSects (phFriNfc_NdefMap_t *NdefMap);
398605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_RemainTLV (phFriNfc_NdefMap_t *NdefMap,
408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                         uint8_t            *Flag,
418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                         uint8_t            *Temp16Bytes);
428605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ChkIntLen (phFriNfc_NdefMap_t *NdefMap);
438605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_IntLenWioutNdef (phFriNfc_NdefMap_t *NdefMap,
448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            uint8_t             *Flag,
458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            uint8_t             *TempintBytes);
468605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic uint8_t phFriNfc_MifStd_H_UpdateTLV (phFriNfc_NdefMap_t *NdefMap);
478605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_WriteNdefLen (phFriNfc_NdefMap_t *NdefMap);
488605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd_H_SetNdefBlkAuth (phFriNfc_NdefMap_t *NdefMap);
498605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd_H_RdWrReset (phFriNfc_NdefMap_t *NdefMap);
508605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_RdtoWrNdefLen (phFriNfc_NdefMap_t *NdefMap);
518605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_GetActCardLen (phFriNfc_NdefMap_t *NdefMap);
528605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ChkTLVs (phFriNfc_NdefMap_t *NdefMap,
538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                           uint8_t            *CRFlag);
548605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_GetNxtTLV (phFriNfc_NdefMap_t *NdefMap,
558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                       uint16_t             *TempLength,
568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                       uint8_t              *TL4bytesFlag);
578605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_Chk16Bytes (phFriNfc_NdefMap_t *NdefMap,
588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                       uint16_t             TempLength);
598605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ChkRemainTLVs (phFriNfc_NdefMap_t *NdefMap,
608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                          uint8_t            *CRFlag,
618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                          uint8_t            *NDEFFlag);
628605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd_H_Complete (phFriNfc_NdefMap_t *NdefMap,
638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                 NFCSTATUS            Result);
648605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd_H_Get1kStTrail (phFriNfc_NdefMap_t *NdefMap);
658605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd_H_Get4kStTrail (phFriNfc_NdefMap_t *NdefMap);
668605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ProChkNdef (phFriNfc_NdefMap_t *NdefMap);
678605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ProAuth (phFriNfc_NdefMap_t *NdefMap);
688605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_Rd16Bytes (phFriNfc_NdefMap_t *NdefMap,
698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                              uint8_t               BlockNo);
708605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ProAcsBits (phFriNfc_NdefMap_t *NdefMap);
718605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_GPBChk (phFriNfc_NdefMap_t *NdefMap);
728605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ProStatNotValid (phFriNfc_NdefMap_t *NdefMap,
738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                   NFCSTATUS             status);
748605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_RdBeforeWr (phFriNfc_NdefMap_t *NdefMap);
758605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ProBytesToWr (phFriNfc_NdefMap_t *NdefMap);
768605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_fillSendBuf (phFriNfc_NdefMap_t *NdefMap,
778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                               uint8_t                   Length);
788605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_WrTLV (phFriNfc_NdefMap_t *NdefMap);
798605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ProWrTLV (phFriNfc_NdefMap_t *NdefMap);
808605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic uint8_t phFriNfc_MifStd_H_UpdRemTLV (phFriNfc_NdefMap_t *NdefMap);
818605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd_H_fillTLV1 (phFriNfc_NdefMap_t *NdefMap);
828605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd_H_fillTLV2 (phFriNfc_NdefMap_t *NdefMap);
838605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_CallWrNdefLen (phFriNfc_NdefMap_t *NdefMap);
848605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_BlkChk_1 (phFriNfc_NdefMap_t *NdefMap);
858605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd_H_fillTLV1_1 (phFriNfc_NdefMap_t *NdefMap);
868605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd_H_fillTLV2_1 (phFriNfc_NdefMap_t *NdefMap);
878605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_RdTLV (phFriNfc_NdefMap_t *NdefMap);
888605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ProRdTLV (phFriNfc_NdefMap_t *NdefMap);
898605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_WrTermTLV (phFriNfc_NdefMap_t *NdefMap);
908605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ProWrABlock (phFriNfc_NdefMap_t *NdefMap);
918605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_CallConnect (phFriNfc_NdefMap_t *NdefMap);
928605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_CallDisCon (phFriNfc_NdefMap_t *NdefMap);
938605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd1k_H_BlkChk (phFriNfc_NdefMap_t *NdefMap,
948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    uint8_t              SectorID,
958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    uint8_t              *callbreak);
968605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic uint8_t phFriNfc_MifStd_H_GetSectorTrailerBlkNo (uint8_t SectorID);
978605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ProSectorTrailorAcsBits (phFriNfc_NdefMap_t *NdefMap);
988605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_WrSectorTrailorBlock (phFriNfc_NdefMap_t *NdefMap);
998605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ProWrSectorTrailor (phFriNfc_NdefMap_t *NdefMap);
1008605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS   phFriNfc_MapTool_ChkSpcVer (const phFriNfc_NdefMap_t *NdefMap,
1018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        uint8_t             VersionIndex) __attribute__((unused));
1028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
1038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/* Mifare Standard Mapping - Constants */
1048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT1        0xA0 /* internal Authenticate Command for MAD Sector */
1058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT2        0xA1 /* internal Authenticate Command for MAD Sector */
1068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT3        0xA2 /* internal Authenticate Command for MAD Sector */
1078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT4        0xA3 /* internal Authenticate Command for MAD Sector */
1088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT5        0xA4 /* internal Authenticate Command for MAD Sector */
1098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT6        0xA5 /* internal Authenticate Command for MAD Sector */
1108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1       0xD3 /* internal Authenticate Command for NDEF Sectors 1 */
1118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2       0xF7 /* internal Authenticate Command for NDEF Sectors 2 */
1128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#define PH_FRINFC_NDEFMAP_MIFARESTD_NDEF_COMPVAL2        0x03 /* internal Ndef Compliant command 1 */
1138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#define PH_FRINFC_NDEFMAP_MIFARESTD_NDEF_COMPVAL1        0xE1 /* internal Ndef Compliant command 2 */
1148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
1158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/* Enable access bits check for the MAD sector
1168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#define ENABLE_ACS_BIT_CHK_FOR_MAD */
1178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
1188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#define PH_FRINFC_NDEFMAP_MFUL_VAL0 0
1198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
1208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
1218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MapTool_SetCardState
1228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
1238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function sets the appropriate card state.
1248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
1258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
1268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
1278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
1288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
1298605731e8f17d1fde003084811f13f52539eb20cJizhou LiaoNFCSTATUS phFriNfc_MapTool_SetCardState (phFriNfc_NdefMap_t *NdefMap,
1308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                         uint32_t           Length)
1318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
1328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
1338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
1348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (Length == PH_FRINFC_NDEFMAP_MFUL_VAL0)
1358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
1368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* As the NDEF LEN / TLV Len is Zero, irrespective of any state the card
1378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           shall be set to INITIALIZED STATE*/
1388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->CardState =(uint8_t) (((NdefMap->CardState ==
1398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_NDEFMAP_CARD_STATE_READ_ONLY) ||
1408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                (NdefMap->CardState ==
1418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_NDEFMAP_CARD_STATE_INVALID))?
1428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_NDEFMAP_CARD_STATE_INVALID:
1438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_NDEFMAP_CARD_STATE_INITIALIZED);
1448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
1458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
1468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
1478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        switch (NdefMap->CardState)
1488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
1498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            case PH_NDEFMAP_CARD_STATE_INITIALIZED:
1508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->CardState =(uint8_t) ((NdefMap->CardState ==
1518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_NDEFMAP_CARD_STATE_INVALID)?
1528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->CardState:
1538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_NDEFMAP_CARD_STATE_READ_WRITE);
1548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
1558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
1568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            case PH_NDEFMAP_CARD_STATE_READ_ONLY:
1578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->CardState = (uint8_t) ((NdefMap->CardState ==
1588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_NDEFMAP_CARD_STATE_INVALID)?
1598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->CardState:
1608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_NDEFMAP_CARD_STATE_READ_ONLY);
1618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
1628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
1638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            case PH_NDEFMAP_CARD_STATE_READ_WRITE:
1648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->CardState = (uint8_t) ((NdefMap->CardState ==
1658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_NDEFMAP_CARD_STATE_INVALID)?
1668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->CardState:
1678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_NDEFMAP_CARD_STATE_READ_WRITE);
1688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD ||
1698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD ||
1708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD)
1718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
1728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        if(NdefMap->StdMifareContainer.ReadOnlySectorIndex &&
1738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                           NdefMap->StdMifareContainer.SectorTrailerBlockNo == NdefMap->StdMifareContainer.currentBlock )
1748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        {
1758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NdefMap->CardState = (uint8_t) ((NdefMap->CardState ==
1768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                            PH_NDEFMAP_CARD_STATE_INVALID)?
1778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                            NdefMap->CardState:
1788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                            PH_NDEFMAP_CARD_STATE_READ_ONLY);
1798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        }
1808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
1818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
1828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
1838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            default:
1848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
1858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NFCSTATUS_NO_NDEF_SUPPORT);
1878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
1888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
1898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
1908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    Result = ((NdefMap->CardState ==
1918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_NDEFMAP_CARD_STATE_INVALID)?
1928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
1938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NFCSTATUS_NO_NDEF_SUPPORT):
1948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result);
1958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
1968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
1978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
1988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
1998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
2008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifareStdMap_H_Reset
2018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
2028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function resets the component instance to the initial
2038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  state and lets the component forget about the list of
2048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  registered items. Moreover, the lower device is set.
2058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
2068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
2078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
2088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
2098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
2108605731e8f17d1fde003084811f13f52539eb20cJizhou LiaoNFCSTATUS phFriNfc_MifareStdMap_H_Reset (phFriNfc_NdefMap_t *NdefMap)
2118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
2128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   status = NFCSTATUS_SUCCESS;
2138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t     index = PH_FRINFC_MIFARESTD_VAL0;
2148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (NdefMap == NULL)
2168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
2178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
2188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
2198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
2208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
2218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Current Block stores the present block accessed in the card */
2228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_VAL0;
2238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        for (index = PH_FRINFC_MIFARESTD_VAL0; index < PH_FRINFC_NDEFMAP_MIFARESTD_ST15_BYTES; index++)
2258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
2268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* internal buffer to store the odd bytes of length < 15 */
2278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.internalBuf[index] = PH_FRINFC_MIFARESTD_VAL0;
2288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
2298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        for (index = 0; index < PH_FRINFC_NDEFMAP_MIFARESTD_TOTALNO_BLK; index++)
2318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
2328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* aid buffer reset to non ndef compliant */
2338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.aid[index] = PH_FRINFC_MIFARESTD_NON_NDEF_COMP;
2348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
2358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* odd bytes length stored in the internal buffer */
2378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
2388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INITIALIZED;
2408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Flag to get that last few bytes are taken from the user buffer */
2428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.RemainingBufFlag = PH_FRINFC_MIFARESTD_FLAG0;
2438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Flag to find that the read/write operation has reached the end of the card.
2458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Further reading/writing is not possible */
2468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.ReadWriteCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
2478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Flag to get that last few bytes are taken from the internal buffer */
2498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.internalBufFlag = PH_FRINFC_MIFARESTD_FLAG0;
2508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Authentication Flag for every sector */
2528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
2538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Used in Check Ndef for storing the sector ID */
2558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.SectorIndex = PH_FRINFC_MIFARESTD_VAL0;
2568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.NdefBlocks = PH_FRINFC_MIFARESTD_VAL0;
2588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.NoOfNdefCompBlocks = PH_FRINFC_MIFARESTD_VAL0;
2608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.ReadAcsBitFlag = PH_FRINFC_MIFARESTD_FLAG0;
2628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.remSizeUpdFlag = PH_FRINFC_MIFARESTD_FLAG0;
2648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_MIFARESTD_VAL0;
2668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.prevLenByteValue = PH_FRINFC_MIFARESTD_VAL0;
2688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
2708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.NdefTLVBlock = PH_FRINFC_MIFARESTD_VAL0;
2728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL0;
2748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
2768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.remainingSize = PH_FRINFC_MIFARESTD_VAL0;
2788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.ReadNdefFlag = PH_FRINFC_MIFARESTD_FLAG0;
2808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.WrNdefFlag = PH_FRINFC_MIFARESTD_FLAG0;
2828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.ChkNdefFlag = PH_FRINFC_MIFARESTD_FLAG0;
2848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.aidCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
2868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
2888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.ProprforumSectFlag = PH_FRINFC_MIFARESTD_PROP_1ST_CONFIG;
2908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.ReadCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
2928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG0;
2948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.WrLength = PH_FRINFC_MIFARESTD_VAL1;
2968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.ChkNdefCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
2988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
2998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.ReadOnlySectorIndex = PH_FRINFC_MIFARESTD_FLAG0;
3008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
3018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.TotalNoSectors = PH_FRINFC_MIFARESTD_FLAG0;
3028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
3038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.SectorTrailerBlockNo = PH_FRINFC_MIFARESTD_FLAG0;
3048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
3058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
3068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return status;
3078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
3088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
3098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
3108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifareStdMap_ChkNdef
3118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
3128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      The function checks whether the peer device is NDEF compliant.
3138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
3148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_PENDING in case of success
3158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
3168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
3178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
3188605731e8f17d1fde003084811f13f52539eb20cJizhou LiaoNFCSTATUS phFriNfc_MifareStdMap_ChkNdef ( phFriNfc_NdefMap_t *NdefMap)
3198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
3208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS status = NFCSTATUS_PENDING;
3218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t atq, sak;
3228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
3238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (NdefMap == NULL)
3248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
3258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
3268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
3278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
3288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
3298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_CHECK_OPE;
3308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.CRIndex = PH_FRINFC_NDEFMAP_CR_CHK_NDEF;
3318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
3328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Get the Select Response and Sense Response to get
3338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            the exact Card Type either Mifare 1k or 4k */
3348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        sak = NdefMap->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.Sak;
3358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        atq = NdefMap->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.AtqA[0];
3368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
3378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (0x08 == (sak & 0x18))
3388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
3398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Total Number of Blocks in Mifare 1k Card */
3408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.NoOfNdefCompBlocks =
3418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_NDEFMAP_MIFARESTD_1KNDEF_COMPBLOCK;
3428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.remainingSize =
3438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                ((NdefMap->CardType == PH_FRINFC_MIFARESTD_VAL0) ?
3448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                (PH_FRINFC_NDEFMAP_MIFARESTD_1KNDEF_COMPBLOCK *
3458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                PH_FRINFC_MIFARESTD_BLOCK_BYTES) :
3468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                NdefMap->StdMifareContainer.remainingSize);
3478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD;
3488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
3498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else if (0x19 == (sak & 0x19))
3508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
3518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Total Number of Blocks in Mifare 2k Card */
3528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.NoOfNdefCompBlocks =
3538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_NDEFMAP_MIFARESTD_2KNDEF_COMPBLOCK;
3548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.remainingSize =
3558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            ((NdefMap->CardType == PH_FRINFC_MIFARESTD_VAL0) ?
3568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            (PH_FRINFC_NDEFMAP_MIFARESTD_2KNDEF_COMPBLOCK *
3578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            PH_FRINFC_MIFARESTD_BLOCK_BYTES) :
3588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            NdefMap->StdMifareContainer.remainingSize);
3598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD;
3608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
3618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
3628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
3638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao             /* Total Number of Blocks in Mifare 4k Card */
3648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.NoOfNdefCompBlocks =
3658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_NDEFMAP_MIFARESTD_4KNDEF_COMPBLOCK;
3668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.remainingSize =
3678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            ((NdefMap->CardType == PH_FRINFC_MIFARESTD_VAL0) ?
3688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            (PH_FRINFC_NDEFMAP_MIFARESTD_4KNDEF_COMPBLOCK *
3698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            PH_FRINFC_MIFARESTD_BLOCK_BYTES) :
3708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            NdefMap->StdMifareContainer.remainingSize);
3718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD;
3728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
3738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
3748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
3758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /*  phFriNfc_MifareStdMap_ChkNdef should be called only
3768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            when currentBlock is 0 OR 64,65 and 66 (for Mifare 4k).
3778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Otherwise return error */
3788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* and also Check the Authentication Flag */
3798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if ((NdefMap->StdMifareContainer.currentBlock != 0) &&
3808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->StdMifareContainer.currentBlock != 1) &&
3818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->StdMifareContainer.currentBlock != 2) &&
3828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->StdMifareContainer.currentBlock != 64) &&
3838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->StdMifareContainer.currentBlock != 65) &&
3848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->StdMifareContainer.currentBlock != 66))
3858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
3868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
3878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
3888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else if ( NdefMap->StdMifareContainer.AuthDone == 0)
3898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
3908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /*  Block 0 contains Manufacturer information and
3918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                also other informaton. So go for block 1 which
3928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                contains AIDs. Authenticating any of the block
3938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                in a sector, Authenticates the whole sector */
3948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if (NdefMap->StdMifareContainer.currentBlock == 0)
3958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
3968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.currentBlock = 1;
3978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
3988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            status = phFriNfc_MifStd_H_AuthSector (NdefMap);
3998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
4008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
4018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
4028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /**
4038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao             * Mifare 1k, sak = 0x08 atq = 0x04
4048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao             * Mifare 2k, sak = 0x19 atq = 0x02
4058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao             * Mifare 4k, sak = 0x18 atq = 0x02
4068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao             */
4078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if ((NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD) ||
4088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD) ||
4098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD))
4108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
4118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Change the state to Check Ndef Compliant */
4128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->State = PH_FRINFC_NDEFMAP_STATE_CHK_NDEF_COMP;
4138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_CHECK_OPE;
4148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.ChkNdefFlag = PH_FRINFC_MIFARESTD_FLAG1;
4158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
4168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
4178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->MapCompletionInfo.Context = NdefMap;
4188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
4198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->Cmd.MfCmd = phHal_eMifareRead;
4208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
4218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->SendRecvBuf [0] = NdefMap->StdMifareContainer.currentBlock;
4228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_READ;
4238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
4248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Call the Overlapped HAL Transceive function */
4258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                status = phFriNfc_ExtnsTransceive (NdefMap->pTransceiveInfo,
4268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->Cmd,
4278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->SendRecvBuf,
4288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->SendLength,
4298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->SendRecvLength);
4308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
4318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else
4328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
4338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Since we have decided temporarily not to go
4348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    for any new error codes we are using
4358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NFCSTATUS_INVALID_PARAMETER even though it is not
4368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    the relevant error code here TBD */
4378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
4388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
4398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
4408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
4418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
4428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return status;
4438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
4448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
4458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
4468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifareStdMap_RdNdef
4478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
4488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      The function initiates the reading of NDEF information from
4498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  a Remote Device. It performs a reset of the state and starts
4508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  the action (state machine). A periodic call of the
4518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  phFriNfcNdefMap_Process has to be done once the action
4528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  has been triggered.
4538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
4548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_PENDING in case of success
4558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
4568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
4578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
4588605731e8f17d1fde003084811f13f52539eb20cJizhou LiaoNFCSTATUS phFriNfc_MifareStdMap_RdNdef (phFriNfc_NdefMap_t *NdefMap,
4598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        uint8_t            *PacketData,
4608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        uint32_t           *PacketDataLength,
4618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        uint8_t            Offset)
4628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
4638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS status = NFCSTATUS_PENDING;
4648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
4658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->ApduBufferSize = *PacketDataLength;
4668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->NumOfBytesRead = PacketDataLength;
4678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    *NdefMap->NumOfBytesRead = 0;
4688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->ApduBuffIndex = 0;
4698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE;
4708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->StdMifareContainer.CRIndex = PH_FRINFC_NDEFMAP_CR_RD_NDEF;
4718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
4728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if ((NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID)
4738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        || (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INITIALIZED))
4748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
4758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Card state  is not correct */
4768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
4778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NFCSTATUS_INVALID_PARAMETER);
4788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
4798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
4808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
4818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if ((Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN) || ( NdefMap->PrevOperation ==
4828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_NDEFMAP_WRITE_OPE))
4838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
4848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            phFriNfc_MifStd_H_RdWrReset (NdefMap);
4858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.ReadNdefFlag = PH_FRINFC_MIFARESTD_FLAG1;
4868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
4878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
4888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Offset = Current, but the read has reached the End of Card */
4898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if ((Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) &&
4908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->StdMifareContainer.ReadWriteCompleteFlag ==
4918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG1))
4928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
4938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, NFCSTATUS_EOF_NDEF_CONTAINER_REACHED);
4948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
4958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
4968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
4978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->Offset = (((Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN) &&
4988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                (NdefMap->PrevOperation ==
4998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_NDEFMAP_WRITE_OPE)) ?
5008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_NDEFMAP_SEEK_BEGIN :
5018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                Offset);
5028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            status = phFriNfc_MifStd_H_BlkChk (NdefMap);
5038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if (status == NFCSTATUS_SUCCESS)
5048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
5058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->ApduBuffer = PacketData;
5068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
5078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Read Operation in Progress */
5088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.ReadWriteCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
5098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
5108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Check Authentication Flag */
5118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                status =
5128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    ((NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1) ?
5138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    phFriNfc_MifStd_H_RdABlock(NdefMap) :
5148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    phFriNfc_MifStd_H_AuthSector(NdefMap));
5158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
5168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
5178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
5188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
5198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return status;
5208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
5218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
5228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
5238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifareStdMap_WrNdef
5248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
5258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      The function initiates the writing of NDEF information to
5268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  a Remote Device. It performs a reset of the state and starts
5278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  the action (state machine). A periodic call of the
5288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  phFriNfcNdefMap_Process has to be done once the action
5298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  has been triggered.
5308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
5318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_PENDING in case of success
5328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
5338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
5348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
5358605731e8f17d1fde003084811f13f52539eb20cJizhou LiaoNFCSTATUS phFriNfc_MifareStdMap_WrNdef (phFriNfc_NdefMap_t    *NdefMap,
5368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        uint8_t               *PacketData,
5378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        uint32_t              *PacketDataLength,
5388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        uint8_t               Offset)
5398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
5408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS status = NFCSTATUS_PENDING;
5418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
5428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->ApduBuffer = PacketData;
5438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->ApduBufferSize = *PacketDataLength;
5448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->ApduBuffIndex = PH_FRINFC_MIFARESTD_VAL0;
5458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->WrNdefPacketLength = PacketDataLength;
5468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    *NdefMap->WrNdefPacketLength = PH_FRINFC_MIFARESTD_VAL0;
5478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
5488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->StdMifareContainer.CRIndex = PH_FRINFC_NDEFMAP_CR_WR_NDEF;
5498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
5508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if ((NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID)
5518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        || (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY))
5528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
5538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Card state  is not correct */
5548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
5558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NFCSTATUS_INVALID_PARAMETER);
5568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
5578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
5588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
5598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if ((Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN) ||
5608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_READ_OPE))
5618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
5628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
5638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.RdBeforeWrFlag = PH_FRINFC_MIFARESTD_FLAG1;
5648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.WrNdefFlag = PH_FRINFC_MIFARESTD_FLAG1;
5658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
5668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
5678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
5688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
5698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL0;
5708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVAuthFlag = PH_FRINFC_MIFARESTD_FLAG0;
5718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG0;
5728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.remainingSize =
5738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.NoOfNdefCompBlocks *
5748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_BLOCK_BYTES);
5758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.currentBlock =
5768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            PH_FRINFC_MIFARESTD_BLK4;
5778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.NdefBlocks = PH_FRINFC_MIFARESTD_VAL1;
5788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
5798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* This macro is added, to be compliant with the previous HAL 2.0
5808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                For HAL 2.0, polling is done before writing data to the mifare
5818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                std (if the offset is BEGIN), because if an error is reported
5828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                during read or write and again write is called, the PN531 state is
5838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                unchanged (so write will fail), to bring the PN531 to the correct
5848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                state, polling is done.
5858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Changed on 13th Jan 2009
5868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            */
5878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.PollFlag = PH_FRINFC_MIFARESTD_FLAG0;
5888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.WrLength = PH_FRINFC_MIFARESTD_VAL0;
5898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.FirstWriteFlag = PH_FRINFC_MIFARESTD_FLAG1;
5908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
5918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
5928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (((Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) &&
5938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->StdMifareContainer.ReadWriteCompleteFlag ==
5948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG1)) || ((NdefMap->StdMifareContainer.PollFlag ==
5958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG1) && (Offset == PH_FRINFC_NDEFMAP_SEEK_CUR)))
5968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
5978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Offset = Current, but the read has reached the End of Card */
5988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
5998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NFCSTATUS_EOF_NDEF_CONTAINER_REACHED);
6008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
6018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
6028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
6038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->Offset = (((Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN) &&
6048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (NdefMap->PrevOperation ==
6058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_NDEFMAP_READ_OPE)) ?
6068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_NDEFMAP_SEEK_BEGIN :
6078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            Offset);
6088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
6098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            status = phFriNfc_MifStd_H_BlkChk (NdefMap);
6108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.ReadWriteCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
6118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if (status == NFCSTATUS_SUCCESS)
6128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
6138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if (NdefMap->StdMifareContainer.PollFlag ==
6148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_FLAG1)
6158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
6168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    /* if poll flag is set then call disconnect because the authentication
6178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        has failed so reactivation of card is required */
6188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    status = phFriNfc_MifStd_H_CallDisCon (NdefMap);
6198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
6208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Check Authentication Flag */
6218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                else if (NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)
6228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
6238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    status =  ((NdefMap->Offset ==
6248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_NDEFMAP_SEEK_BEGIN) ?
6258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                phFriNfc_MifStd_H_RdBeforeWr (NdefMap) :
6268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                phFriNfc_MifStd_H_WrABlock (NdefMap));
6278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
6288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                else
6298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
6308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    status = phFriNfc_MifStd_H_AuthSector (NdefMap);
6318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
6328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
6338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
6348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
6358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
6368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return status;
6378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
6388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
6398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
6408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
6418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifareStdMap_Process
6428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
6438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function is a Completion Routine, Processing function,
6448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  needed to avoid long blocking.
6458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  This function as a Completion Routine in order to be able
6468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  to notify the component that an I/O has finished and data
6478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  are ready to be processed.
6488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
6498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          void
6508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
6518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
6528605731e8f17d1fde003084811f13f52539eb20cJizhou Liaovoid phFriNfc_MifareStdMap_Process (void       *Context,
6538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NFCSTATUS   Status)
6548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
6558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    phFriNfc_NdefMap_t      *NdefMap;
6568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t                 NDEFFlag = 0,
6578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            CRFlag = 0,
6588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            Temp16Bytes = 0,
6598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            i = 0;
6608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
6618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap = (phFriNfc_NdefMap_t *)Context;
6628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
6638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if ((Status & PHNFCSTBLOWER) == (NFCSTATUS_SUCCESS & PHNFCSTBLOWER))
6648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
6658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        switch (NdefMap->State)
6668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
6678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            case PH_FRINFC_NDEFMAP_STATE_CHK_NDEF_COMP:
6688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Status = phFriNfc_MifStd_H_ProChkNdef (NdefMap);
6698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING) ?
6708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG1 :
6718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG0);
6728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
6738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
6748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            case PH_FRINFC_NDEFMAP_STATE_READ:
6758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Receive Length for read shall always be equal to 16 */
6768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if ((*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ) &&
6778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (NdefMap->ApduBuffIndex < (uint16_t) NdefMap->ApduBufferSize))
6788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
6798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Temp16Bytes = PH_FRINFC_MIFARESTD_VAL0;
6808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NDEFFlag = (uint8_t) PH_FRINFC_MIFARESTD_FLAG1;
6818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if (NdefMap->TLVStruct.BytesRemainLinTLV != 0)
6828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
6838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
6848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        CRFlag = PH_FRINFC_MIFARESTD_FLAG0;
6858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        /* To read the remaining length (L) in TLV */
6868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        Status = phFriNfc_MifStd_H_RemainTLV (NdefMap, &NDEFFlag, &Temp16Bytes);
6878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
6888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                             PH_FRINFC_MIFARESTD_FLAG1 :
6898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                             PH_FRINFC_MIFARESTD_FLAG0);
6908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
6918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
6928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    /* check the NDEFFlag is set. if this is not set, then
6938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        in the above RemainTLV function all the 16 bytes has been
6948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        read */
6958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
6968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                else
6978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
6988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_RECEIVE_LENGTH);
6998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
7008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
7018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
7028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
7038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            case PH_FRINFC_NDEFMAP_STATE_WRITE:
7048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Status = phFriNfc_MifStd_H_ProWrABlock (NdefMap);
7058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
7068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                     PH_FRINFC_MIFARESTD_FLAG1 :
7078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                     PH_FRINFC_MIFARESTD_FLAG0);
7088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
7098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Call Completion Routine if CR Flag is Set to 1 */
7108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if (CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
7118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
7128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    *NdefMap->WrNdefPacketLength = NdefMap->ApduBuffIndex;
7138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
7148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
7158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
7168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            case PH_FRINFC_NDEFMAP_STATE_AUTH:
7178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG0;
7188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Status = phFriNfc_MifStd_H_ProAuth (NdefMap);
7198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
7208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                     PH_FRINFC_MIFARESTD_FLAG1 :
7218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                     PH_FRINFC_MIFARESTD_FLAG0);
7228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
7238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
7248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            case PH_FRINFC_NDEFMAP_STATE_RD_ACS_BIT:
7258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Status = phFriNfc_MifStd_H_ProAcsBits (NdefMap);
7268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
7278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                     PH_FRINFC_MIFARESTD_FLAG1 :
7288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                     PH_FRINFC_MIFARESTD_FLAG0);
7298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
7308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
7318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            case PH_FRINFC_NDEFMAP_STATE_WR_NDEF_LEN:
7328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if (NdefMap->StdMifareContainer.RdAfterWrFlag ==
7338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_FLAG1)
7348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
7358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Status = phFriNfc_MifStd_H_CallWrNdefLen (NdefMap);
7368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
7378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_FLAG1 :
7388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_FLAG0);
7398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
7408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                else
7418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
7428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    /* Check this */
7438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if (NdefMap->StdMifareContainer.TempBlockNo ==
7448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->StdMifareContainer.currentBlock)
7458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
7468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        memcpy (NdefMap->StdMifareContainer.internalBuf,
7478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NdefMap->StdMifareContainer.Buffer,
7488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NdefMap->StdMifareContainer.internalLength);
7498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
7508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
7518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    *NdefMap->WrNdefPacketLength = NdefMap->ApduBuffIndex;
7528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.currentBlock =
7538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NdefMap->StdMifareContainer.TempBlockNo;
7548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->CardState = (uint8_t) ((NdefMap->CardState ==
7558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_NDEFMAP_CARD_STATE_INITIALIZED) ?
7568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_NDEFMAP_CARD_STATE_READ_WRITE :
7578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        NdefMap->CardState);
7588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    CRFlag = (uint8_t) PH_FRINFC_MIFARESTD_FLAG1;
7598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
7608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
7618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
7628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            case PH_FRINFC_NDEFMAP_STATE_RD_TO_WR_NDEF_LEN:
7638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
7648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
7658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NFCSTATUS_INVALID_DEVICE_REQUEST);
7668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if (*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ)
7678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
7688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    /* Size of NdefMap->SendRecvBuf is set by phLibNfc_Gen_NdefMapReset to PH_LIBNFC_GEN_MAX_BUFFER */
7698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    /* We don't have to check memory here */
7708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    for (i = PH_FRINFC_MIFARESTD_BYTES_READ; i > 0; i--)
7718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
7728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->SendRecvBuf [i] = NdefMap->SendRecvBuf [i-1];
7738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
7748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->SendRecvBuf [PH_FRINFC_MIFARESTD_VAL0] =
7758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NdefMap->StdMifareContainer.currentBlock;
7768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Status = phFriNfc_MifStd_H_WriteNdefLen (NdefMap);
7778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
7788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_FLAG1 :
7798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_FLAG0);
7808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
7818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
7828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
7838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            case PH_FRINFC_NDEFMAP_STATE_GET_ACT_CARDSIZE:
7848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NDEFFlag = PH_FRINFC_MIFARESTD_FLAG1;
7858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if (NdefMap->TLVStruct.NoLbytesinTLV > PH_FRINFC_MIFARESTD_VAL0)
7868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
7878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
7888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Status = phFriNfc_MifStd_H_ChkRemainTLVs (NdefMap, &CRFlag, &NDEFFlag);
7898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->TLVStruct.NoLbytesinTLV =
7908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_VAL0;
7918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
7928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if ((NDEFFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
7938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (CRFlag != PH_FRINFC_MIFARESTD_FLAG1))
7948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
7958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Status = phFriNfc_MifStd_H_ChkTLVs (NdefMap, &CRFlag);
7968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
7978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if (((NdefMap->StdMifareContainer.ReadNdefFlag ==
7988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_FLAG1) ||
7998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (NdefMap->StdMifareContainer.WrNdefFlag ==
8008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_FLAG1)) &&
8018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (Status != NFCSTATUS_PENDING))
8028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
8038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.NFCforumSectFlag =
8048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            PH_FRINFC_MIFARESTD_FLAG1;
8058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    CRFlag = PH_FRINFC_MIFARESTD_FLAG0;
8068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    /* if the card state has changed to initialised and
8078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                     read ndef is called then error is returned */
8088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if (((NdefMap->StdMifareContainer.WrNdefFlag ==
8098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG1) &&
8108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY)) ||
8118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        ((NdefMap->StdMifareContainer.ReadNdefFlag ==
8128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG1) &&
8138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INITIALIZED)))
8148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
8158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        Status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
8168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            NFCSTATUS_NO_NDEF_SUPPORT);
8178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
8188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if (NdefMap->StdMifareContainer.AuthDone ==
8198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG0)
8208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
8218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        Status = phFriNfc_MifStd_H_AuthSector (NdefMap);
8228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
8238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    else
8248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
8258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        Status = ((NdefMap->StdMifareContainer.ReadNdefFlag ==
8268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_FLAG1) ?
8278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    phFriNfc_MifStd_H_RdTLV (NdefMap) :
8288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    phFriNfc_MifStd_H_RdBeforeWr (NdefMap));
8298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
8308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.ReadNdefFlag =
8318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            PH_FRINFC_MIFARESTD_FLAG0;
8328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.WrNdefFlag =
8338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            PH_FRINFC_MIFARESTD_FLAG0;
8348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
8358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
8368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if (NdefMap->StdMifareContainer.ChkNdefFlag ==
8378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_FLAG1)
8388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
8398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
8408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG1 :
8418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG0);
8428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
8438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
8448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
8458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            case PH_FRINFC_NDEFMAP_STATE_RD_BEF_WR:
8468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Read flag says that already part of TLV has been written */
8478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Status = phFriNfc_MifStd_H_ProBytesToWr (NdefMap);
8488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                 CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
8498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_FLAG1 :
8508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_FLAG0);
8518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
8528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
8538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            case PH_FRINFC_NDEFMAP_STATE_WR_TLV:
8548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Status = phFriNfc_MifStd_H_ProWrTLV (NdefMap);
8558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
8568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_FLAG1 :
8578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_FLAG0);
8588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
8598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
8608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            case PH_FRINFC_NDEFMAP_STATE_RD_TLV:
8618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Status = phFriNfc_MifStd_H_ProRdTLV (NdefMap);
8628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
8638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_FLAG1 :
8648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_FLAG0);
8658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
8668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
8678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            case PH_FRINFC_NDEFMAP_STATE_TERM_TLV:
8688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                phFriNfc_MifStd_H_SetNdefBlkAuth(NdefMap);
8698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.currentBlock =
8708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NdefMap->TLVStruct.NdefTLVBlock;
8718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Status = phFriNfc_MifStd_H_RdtoWrNdefLen (NdefMap);
8728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
8738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_FLAG1 :
8748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_FLAG0);
8758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
8768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
8778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            case PH_FRINFC_NDEFMAP_STATE_DISCONNECT:
8788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.PollFlag = PH_FRINFC_MIFARESTD_FLAG0;
8798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
8808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Status = phFriNfc_MifStd_H_CallConnect (NdefMap);
8818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
8828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_FLAG1 :
8838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_FLAG0);
8848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
8858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
8868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            case PH_FRINFC_NDEFMAP_STATE_CONNECT:
8878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if (NdefMap->StdMifareContainer.FirstReadFlag == PH_FRINFC_MIFARESTD_FLAG1)
8888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
8898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG0;
8908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Status = phFriNfc_MifStd_H_AuthSector (NdefMap);
8918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
8928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                else if ((NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD ||
8938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                          NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD ||
8948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                          NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD) &&
8958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                         (NdefMap->StdMifareContainer.ReadOnlySectorIndex &&
8968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                          NdefMap->StdMifareContainer.SectorTrailerBlockNo ==  NdefMap->StdMifareContainer.currentBlock))
8978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
8988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.ReadOnlySectorIndex =
8998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG0;
9008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.SectorTrailerBlockNo =
9018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG0;
9028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_FLAG0;
9038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Status = NFCSTATUS_FAILED;
9048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
9058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                else
9068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
9078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Status = ((((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) &&
9088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_WRITE_OPE)) ||
9098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.WrLength >
9108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_VAL0)) ?
9118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        phFriNfc_MifStd_H_ProStatNotValid (NdefMap, Status) :
9128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        phFriNfc_MifStd_H_AuthSector (NdefMap));
9138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
9148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
9158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_FLAG1 :
9168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_FLAG0);
9178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
9188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
9198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            case PH_FRINFC_NDEFMAP_STATE_RD_SEC_ACS_BIT:
9208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Status = phFriNfc_MifStd_H_ProSectorTrailorAcsBits (NdefMap);
9218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING)?
9228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_FLAG1 :
9238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_FLAG0);
9248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if ((CRFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
9258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (NdefMap->StdMifareContainer.WriteAcsBitFlag == PH_FRINFC_MIFARESTD_FLAG0))
9268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
9278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
9288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NFCSTATUS_INVALID_DEVICE_REQUEST);
9298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
9308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
9318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
9328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            case PH_FRINFC_NDEFMAP_STATE_WRITE_SEC:
9338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Set flag for writing of Acs bit */
9348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.WriteAcsBitFlag = PH_FRINFC_MIFARESTD_FLAG1;
9358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
9368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* The first NDEF sector is already made read only,
9378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                   set card state to read only and proceed*/
9388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if (NdefMap->CardState != PH_NDEFMAP_CARD_STATE_READ_ONLY)
9398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
9408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Status = phFriNfc_MapTool_SetCardState (NdefMap, NdefMap->TLVStruct.BytesRemainLinTLV);
9418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if (Status != NFCSTATUS_SUCCESS)
9428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
9438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        CRFlag = (uint8_t) PH_FRINFC_MIFARESTD_FLAG1;
9448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
9458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
9468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
9478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if (CRFlag != PH_FRINFC_MIFARESTD_FLAG1)
9488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
9498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Status = phFriNfc_MifStd_H_ProWrSectorTrailor (NdefMap);
9508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    CRFlag = (uint8_t) ((Status != NFCSTATUS_PENDING) ?
9518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                       PH_FRINFC_MIFARESTD_FLAG1 :
9528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                       PH_FRINFC_MIFARESTD_FLAG0);
9538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
9548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
9558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
9568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            default:
9578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
9588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NFCSTATUS_INVALID_DEVICE_REQUEST);
9598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
9608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
9618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
9628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
9638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else if (NdefMap->State == PH_FRINFC_NDEFMAP_STATE_AUTH)
9648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
9658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.PollFlag = PH_FRINFC_MIFARESTD_FLAG1;
9668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->StdMifareContainer.FirstWriteFlag ==
9678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG1)
9688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
9698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.FirstWriteFlag =
9708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            PH_FRINFC_MIFARESTD_FLAG0;
9718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.WrLength =
9728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                ((NdefMap->StdMifareContainer.NFCforumSectFlag ==
9738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG0) ?
9748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL1 :
9758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.WrLength);
9768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
9778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (NdefMap->StdMifareContainer.WrLength == PH_FRINFC_MIFARESTD_VAL0)
9788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
9798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
9808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NFCSTATUS_EOF_NDEF_CONTAINER_REACHED);
9818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
9828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
9838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
9848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
9858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Authentication has failed */
9868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            CRFlag = PH_FRINFC_MIFARESTD_FLAG1; /* Call Completion Routine */
9878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Status = NFCSTATUS_FAILED;/* Update Status Flag */
9888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
9898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
9908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
9918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
9928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
9938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NFCSTATUS_INVALID_DEVICE_REQUEST);
9948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
9958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
9968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao     /* Call Completion Routine if CR Flag is Set to 1 */
9978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
9988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
9998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        phFriNfc_MifStd_H_Complete (NdefMap, Status);
10008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
10018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
10028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return;
10038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
10048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
10058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
10068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_RdABlock
10078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
10088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function is a Helper function for Mifare Std. It Reads
10098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  a block from the card.
10108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
10118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_PENDING in case of success
10128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
10138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
10148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
10158605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_RdABlock (phFriNfc_NdefMap_t *NdefMap)
10168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
10178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS status = NFCSTATUS_PENDING;
10188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
10198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->State = PH_FRINFC_NDEFMAP_STATE_READ;
10208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE;
10218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
10228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->MapCompletionInfo.Context = NdefMap;
10238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
10248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (NdefMap->ApduBuffIndex < (uint16_t) NdefMap->ApduBufferSize)
10258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
10268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
10278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (NdefMap->StdMifareContainer.internalLength > PH_FRINFC_MIFARESTD_VAL0)
10288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
10298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            status = phFriNfc_MifStd_H_ChkIntLen (NdefMap);
10308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        } /* internal Length Check */
10318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
10328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
10338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf [PH_FRINFC_MIFARESTD_VAL0] =
10348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->StdMifareContainer.currentBlock;
10358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_READ;
10368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
10378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
10388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->Cmd.MfCmd = phHal_eMifareRead;
10398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
10408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Call the Overlapped HAL Transceive function */
10418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            status = phFriNfc_ExtnsTransceive (NdefMap->pTransceiveInfo,
10428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                          NdefMap->Cmd,
10438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                          NdefMap->SendRecvBuf,
10448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                          NdefMap->SendLength,
10458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                          NdefMap->SendRecvLength);
10468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
10478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
10488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
10498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
10508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Check for the Card Size */
10518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if((((NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
10528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.NdefBlocks) *
10538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_BYTES_READ) == 0) ||
10548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->ApduBufferSize == NdefMap->ApduBuffIndex))
10558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
10568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
10578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (uint8_t) ((((NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
10588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.NdefBlocks) *
10598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_BYTES_READ) == 0) ?
10608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG1 :
10618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG0);
10628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
10638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            status = PHNFCSTVAL (CID_NFC_NONE, NFCSTATUS_SUCCESS);
10648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
10658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
10668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
10678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Error: The control should not ideally come here. Return Error. */
10688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, NFCSTATUS_FAILED);
10698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
10708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
10718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
10728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return status;
10738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
10748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
10758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
10768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_WrABlock
10778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
10788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function writes into a block of the card.
10798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
10808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_PENDING in case of success
10818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
10828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
10838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
10848605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_WrABlock (phFriNfc_NdefMap_t *NdefMap)
10858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
10868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS                   status =  NFCSTATUS_PENDING;
10878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
10888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint16_t                    RemainingBytes = 0,
10898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                BytesRemained = 0,
10908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                index = 0;
10918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t                     Temp16Bytes = 0;
10928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
10938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
10948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->MapCompletionInfo.Context = NdefMap;
10958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
10968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
10978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WRITE;
10988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
10998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* User Buffer Check */
11008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if( NdefMap->ApduBuffIndex < (uint16_t) NdefMap->ApduBufferSize)
11018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
11028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        RemainingBytes = (((uint16_t) (NdefMap->ApduBufferSize -
11038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                         NdefMap->ApduBuffIndex) <
11048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->StdMifareContainer.remainingSize) ?
11058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (uint16_t)(NdefMap->ApduBufferSize -
11068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->ApduBuffIndex) :
11078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->StdMifareContainer.remainingSize);
11088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
11098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[0] = NdefMap->StdMifareContainer.currentBlock;
11108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Temp16Bytes += PH_FRINFC_MIFARESTD_INC_1;
11118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
11128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Check for internal bytes */
11138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (NdefMap->StdMifareContainer.internalLength > 0)
11148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
11158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* copy the bytes previously written in the internal Buffer */
11168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            memcpy (&(NdefMap->SendRecvBuf [Temp16Bytes]),
11178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.internalBuf,
11188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.internalLength);
11198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
11208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Temp16Bytes += (uint8_t) (NdefMap->StdMifareContainer.internalLength);
11218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if (RemainingBytes >= (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes))
11228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
11238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Copy the Remaining bytes from the user buffer to make the send
11248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    data and length = 16 */
11258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                memcpy (&(NdefMap->SendRecvBuf [Temp16Bytes]),
11268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->ApduBuffer,
11278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes));
11288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
11298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->NumOfBytesWritten =
11308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
11318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Temp16Bytes += (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
11328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                *NdefMap->DataCount = (Temp16Bytes - PH_FRINFC_MIFARESTD_VAL1);
11338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
11348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else
11358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
11368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                memcpy (&(NdefMap->SendRecvBuf [Temp16Bytes]),
11378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->ApduBuffer,
11388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        RemainingBytes);
11398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
11408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.internalBufFlag = PH_FRINFC_MIFARESTD_FLAG1;
11418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->NumOfBytesWritten = RemainingBytes;
11428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Temp16Bytes += (uint8_t) (RemainingBytes);
11438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                *NdefMap->DataCount = (Temp16Bytes - PH_FRINFC_MIFARESTD_VAL1);
11448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
11458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                BytesRemained = (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
11468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Pad empty bytes with Zeroes to complete 16 bytes*/
11478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                for (index = 0; index < BytesRemained; index++)
11488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
11498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->SendRecvBuf [(Temp16Bytes + index)] =
11508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                (uint8_t) ((index == PH_FRINFC_MIFARESTD_VAL0) ?
11518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_TERMTLV_T :
11528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_NULLTLV_T);
11538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
11548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
11558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Temp16Bytes += (uint8_t) (BytesRemained);
11568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
11578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
11588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
11598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
11608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if (RemainingBytes >= (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes))
11618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
11628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Bytes left to write < 16, copy remaining bytes */
11638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                memcpy (&(NdefMap->SendRecvBuf [
11648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        Temp16Bytes]),
11658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        &(NdefMap->ApduBuffer [
11668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->ApduBuffIndex]),
11678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes));
11688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
11698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->NumOfBytesWritten = (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
11708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Temp16Bytes += (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
11718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                *NdefMap->DataCount = (Temp16Bytes - PH_FRINFC_MIFARESTD_VAL1);
11728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
11738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else
11748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
11758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Bytes left to write < 16, copy remaining bytes */
11768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                memcpy (&(NdefMap->SendRecvBuf [
11778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        Temp16Bytes]),
11788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        &(NdefMap->ApduBuffer [
11798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->ApduBuffIndex]),
11808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        RemainingBytes);
11818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
11828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.RemainingBufFlag = PH_FRINFC_MIFARESTD_FLAG1;
11838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->NumOfBytesWritten = RemainingBytes;
11848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Temp16Bytes += (uint8_t) (RemainingBytes);
11858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                *NdefMap->DataCount = (Temp16Bytes - PH_FRINFC_MIFARESTD_VAL1);
11868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
11878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
11888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Pad empty bytes with Zeroes to complete 16 bytes */
11898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                for (index = Temp16Bytes; index < MIFARE_MAX_SEND_BUF_TO_WRITE; index++)
11908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
11918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->SendRecvBuf [index] = (uint8_t) ((index ==
11928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    Temp16Bytes) ?
11938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_TERMTLV_T :
11948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_NULLTLV_T);
11958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
11968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
11978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
11988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
11998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
12008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Buffer to store 16 bytes which is writing to the present block */
12018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        memcpy (NdefMap->StdMifareContainer.Buffer,
12028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                &(NdefMap->SendRecvBuf [PH_FRINFC_MIFARESTD_INC_1]),
12038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_BLOCK_BYTES);
12048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
12058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Write from here */
12068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_WRITE;
12078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->Cmd.MfCmd = phHal_eMifareWrite16;
12088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
12098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Call the Overlapped HAL Transceive function */
12108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        status = phFriNfc_ExtnsTransceive (NdefMap->pTransceiveInfo,
12118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->Cmd,
12128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->SendRecvBuf,
12138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->SendLength,
12148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->SendRecvLength);
12158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
12168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else /* Check User Buffer */
12178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
12188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (NdefMap->StdMifareContainer.NdefBlocks >
12198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao             NdefMap->StdMifareContainer.NoOfNdefCompBlocks)
12208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
12218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
12228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG1;
12238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            status = PHNFCSTVAL (CID_NFC_NONE,
12248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NFCSTATUS_SUCCESS);
12258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
12268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else if (NdefMap->ApduBuffIndex == (uint16_t) NdefMap->ApduBufferSize)
12278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
12288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            status = PHNFCSTVAL (CID_NFC_NONE, NFCSTATUS_SUCCESS);
12298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
12308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
12318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
12328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Error: The control should not ideally come here. Return Error. */
12338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, NFCSTATUS_FAILED);
12348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
12358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
12368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
12378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return status;
12388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
12398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
12408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
12418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_AuthSector
12428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
12438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function authenticates one sector at a time.
12448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
12458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_PENDING in case of success
12468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
12478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
12488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
12498605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_AuthSector (phFriNfc_NdefMap_t *NdefMap)
12508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
12518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS status = NFCSTATUS_PENDING;
12528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
12538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
12548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->MapCompletionInfo.Context = NdefMap;
12558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
12568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
12578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->State = PH_FRINFC_NDEFMAP_STATE_AUTH;
12588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
12598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Authenticate */
12608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->Cmd.MfCmd = phHal_eMifareAuthentA;
12618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
12628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->SendRecvBuf [PH_FRINFC_MIFARESTD_VAL0] =
12638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            ((NdefMap->TLVStruct.NdefTLVAuthFlag ==
12648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_FLAG1) ?
12658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NdefMap->TLVStruct.NdefTLVBlock :
12668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NdefMap->StdMifareContainer.currentBlock);
12678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
12688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* if MAD blocks then authentication key is
12698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 else
12708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7 */
12718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (((NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK0) &&
12728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK1) &&
12738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK2) &&
12748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK64) &&
12758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK65) &&
12768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK66)) ||
12778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (NdefMap->TLVStruct.NdefTLVAuthFlag ==
12788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                (uint8_t) PH_FRINFC_MIFARESTD_FLAG1))
12798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
12808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf [1] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
12818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf [2] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
12828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf [3] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
12838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf [4] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
12848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf [5] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
12858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf [6] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
12868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
12878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
12888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
12898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf [1] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT1; /* 0xA0 */
12908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf [2] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT2; /* 0xA1 */
12918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf [3] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT3; /* 0xA2 */
12928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf [4] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT4; /* 0xA3 */
12938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf [5] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT5; /* 0xA4 */
12948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf [6] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT6; /* 0xA5 */
12958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
12968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
12978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD ||
12988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD ||
12998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD)
13008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
13018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (NdefMap->StdMifareContainer.ReadOnlySectorIndex &&
13028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.SectorTrailerBlockNo == NdefMap->StdMifareContainer.currentBlock)
13038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
13048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            memcpy (&NdefMap->SendRecvBuf [1], &NdefMap->StdMifareContainer.UserScrtKeyB [0], PH_FRINFC_MIFARESTD_KEY_LEN);
13058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
13068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Authenticate with KeyB */
13078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->Cmd.MfCmd = phHal_eMifareAuthentB;
13088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
13098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
13108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
13118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->SendLength = MIFARE_AUTHENTICATE_CMD_LENGTH;
13128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
13138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Call the Overlapped HAL Transceive function */
13148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    status = phFriNfc_ExtnsTransceive (NdefMap->pTransceiveInfo,
13158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->Cmd,
13168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->SendRecvBuf,
13178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->SendLength,
13188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->SendRecvLength);
13198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
13208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return status;
13218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
13228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
13238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
13248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_Complete
13258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
13268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      It is used to call the Completion Routine
13278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
13288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          void
13298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
13308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
13318605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd_H_Complete (phFriNfc_NdefMap_t *NdefMap,
13328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        NFCSTATUS          Result)
13338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
13348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* set the state back to the Reset_Init state */
13358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RESET_INIT;
13368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
13378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* set the completion routine */
13388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->CompletionRoutine [NdefMap->StdMifareContainer.CRIndex].
13398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            CompletionRoutine (NdefMap->CompletionRoutine->Context, Result);
13408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
13418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return;
13428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
13438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
13448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
13458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd4k_H_CheckNdef
13468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
13478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function is used for Mifare 4k Check Ndef to
13488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  get the next AID blocks.
13498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
13508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
13518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
13528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
13538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
13548605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd4k_H_CheckNdef (phFriNfc_NdefMap_t *NdefMap)
13558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
13568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS Result = NFCSTATUS_SUCCESS;
13578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
13588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Get the AID Block */
13598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK2)
13608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
13618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_MAD_BLK64;
13628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
13638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
13648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else if (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK64)
13658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
13668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_MAD_BLK65;
13678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
13688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
13698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
13708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_MAD_BLK66;
13718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
13728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
13738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    Result = phFriNfc_MifareStdMap_ChkNdef (NdefMap);
13748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
13758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
13768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
13778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
13788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
13798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_fillAIDarray
13808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
13818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function storew the AIDs for check ndef.
13828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
13838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          void
13848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
13858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
13868605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd_H_fillAIDarray (phFriNfc_NdefMap_t *NdefMap)
13878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
13888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t byteindex = 0;
13898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
13908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if ((NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK1) ||
13918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK64))
13928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
13938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* The First Two Bytes in Receive Buffer
13948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            are CRC bytes so it is not copied
13958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            instead, 0 is copied in AID[0] & AID[1] */
13968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.aid [NdefMap->StdMifareContainer.SectorIndex] =
13978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_NON_NDEF_COMP;
13988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.SectorIndex++;
13998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        byteindex = 2;
14008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
14018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
14028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    while (byteindex < PH_FRINFC_MIFARESTD_BYTES_READ)
14038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
14048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if ((NdefMap->SendRecvBuf [byteindex] == PH_FRINFC_NDEFMAP_MIFARESTD_NDEF_COMPVAL2) &&
14058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->SendRecvBuf [(byteindex + 1)] == PH_FRINFC_NDEFMAP_MIFARESTD_NDEF_COMPVAL1))
14068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
14078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* This flag is set when a NFC forum sector is found in a
14088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                MAD block for the first time */
14098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG1;
14108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.SectorIndex] =
14118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_NDEF_COMP;
14128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.SectorIndex++;
14138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
14148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
14158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
14168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.aid [NdefMap->StdMifareContainer.SectorIndex] =
14178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_NON_NDEF_COMP;
14188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.SectorIndex++;
14198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* AID complete flag is set when a non NFC forum sector is found in a
14208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao               MAD block after the NFC forum sector. After setting this, all other
14218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao               values are ignored and are NOT NDEF compliant */
14228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.aidCompleteFlag =
14238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                ((NdefMap->StdMifareContainer.NFCforumSectFlag ==
14248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_FLAG1) ?
14258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_FLAG1 :
14268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_FLAG0);
14278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
14288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
14298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if (NdefMap->StdMifareContainer.aidCompleteFlag == PH_FRINFC_MIFARESTD_FLAG1)
14308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
14318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
14328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
14338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
14348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        byteindex += 2;
14358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
14368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
14378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* If "aidCompleteFlag" is set then the remaining sectors are made NOT
14388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao       NDEF compliant */
14398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if ((NdefMap->StdMifareContainer.aidCompleteFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
14408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD))
14418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
14428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* for Mifare 1k there are 16 sectors, till this number all sectors
14438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           are made NOT NDEF compliant */
14448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        for (byteindex = NdefMap->StdMifareContainer.SectorIndex;
14458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao             byteindex < PH_FRINFC_MIFARESTD1K_TOTAL_SECTOR;
14468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao             byteindex++)
14478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
14488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao             NdefMap->StdMifareContainer.aid [byteindex] =
14498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_NON_NDEF_COMP;
14508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
14518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
14528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else if ((NdefMap->StdMifareContainer.aidCompleteFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
14538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao             (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD))
14548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
14558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* for Mifare 2k there are 32 sectors, till this number all sectors
14568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           are made NOT NDEF compliant */
14578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        for (byteindex = NdefMap->StdMifareContainer.SectorIndex;
14588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao             byteindex < PH_FRINFC_MIFARESTD2K_TOTAL_SECTOR;
14598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao             byteindex++)
14608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
14618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.aid[byteindex] =
14628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                   PH_FRINFC_MIFARESTD_NON_NDEF_COMP;
14638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
14648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
14658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
14668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
14678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* for Mifare 4k there are 40 sectors, till this number all sectors
14688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           are made NOT NDEF compliant */
14698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if ((NdefMap->StdMifareContainer.aidCompleteFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
14708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD))
14718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
14728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            for(byteindex = NdefMap->StdMifareContainer.SectorIndex;
14738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                byteindex < PH_FRINFC_MIFARESTD4K_TOTAL_SECTOR;
14748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                byteindex++)
14758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
14768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.aid [byteindex] =
14778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_NON_NDEF_COMP;
14788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
14798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
14808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
14818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
14828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return;
14838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
14848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
14858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
14868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_BlkChk
14878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
14888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function is to check the Ndef compliance of the
14898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  current block, if the block is not Ndef Compliant,
14908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  increment the block till the next Ndef compliant block
14918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  using the Get Sector Helper function
14928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
14938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
14948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
14958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
14968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
14978605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_BlkChk (phFriNfc_NdefMap_t *NdefMap)
14988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
14998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
15008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t     SectorID = 0, callbreak = 0;
15018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
15028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    for (;;)
15038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
15048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Get a Sector ID for the Current Block */
15058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        SectorID = phFriNfc_MifStd_H_GetSect (NdefMap->StdMifareContainer.currentBlock);
15068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Check the card Type 1k or 4k */
15078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* enter if Mifare 1k card. For Mifare 4k go to else */
15088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD)
15098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
15108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* if Sector Id > 15 No Sectors to write */
15118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if (SectorID > 15)
15128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
15138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                SectorID = phFriNfc_MifStd_H_GetSect (NdefMap->StdMifareContainer.currentBlock);
15148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /*Error: No Ndef Compliant Sectors present */
15158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
15168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NFCSTATUS_INVALID_PARAMETER);
15178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                callbreak = 1;
15188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
15198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else
15208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
15218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                phFriNfc_MifStd1k_H_BlkChk (NdefMap, SectorID, &callbreak);
15228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
15238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        } /* End of if */ /* End of Mifare 1k check */
15248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else if (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD) /* Mifare 2k check starts here */
15258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
15268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao             /* Sector > 39 no ndef compliant sectors found*/
15278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if (SectorID > PH_FRINFC_MIFARESTD_SECTOR_NO31)
15288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
15298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                 /*Error: No Ndef Compliant Sectors present */
15308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
15318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NFCSTATUS_INVALID_PARAMETER);
15328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                callbreak = 1;
15338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
15348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else if (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK64)
15358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
15368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.currentBlock += PH_FRINFC_MIFARESTD_BLK4;
15378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
15388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else if (SectorID < PH_FRINFC_MIFARESTD_SECTOR_NO32) /* sector < 32 contains 4 blocks in each sector */
15398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
15408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                 /* If the block checked is 63, the 3 blocks after this
15418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                     are AID(MAD) blocks so its need to be skipped */
15428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK63)
15438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
15448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.currentBlock += PH_FRINFC_MIFARESTD_BLK4;
15458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
15468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                else
15478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
15488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    phFriNfc_MifStd1k_H_BlkChk (NdefMap, SectorID, &callbreak);
15498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
15508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
15518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else
15528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
15538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                phFriNfc_MifStd1k_H_BlkChk (NdefMap, SectorID, &callbreak);
15548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
15558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }/* End of if*/ /* End of Mifare 2k check*/
15568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else /* Mifare 4k check starts here */
15578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
15588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Sector > 39 no ndef compliant sectors found*/
15598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if (SectorID > PH_FRINFC_MIFARESTD_SECTOR_NO39)
15608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
15618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /*Error: No Ndef Compliant Sectors present */
15628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
15638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                callbreak = 1;
15648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
15658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else if (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK64)
15668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
15678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.currentBlock += PH_FRINFC_MIFARESTD_BLK4;
15688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
15698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else if (SectorID < PH_FRINFC_MIFARESTD_SECTOR_NO32) /* sector < 32 contains 4 blocks in each sector */
15708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
15718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* If the block checked is 63, the 3 blocks after this
15728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                   are AID(MAD) blocks so its need to be skipped */
15738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK63)
15748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
15758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.currentBlock += PH_FRINFC_MIFARESTD_BLK4;
15768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
15778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                else
15788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
15798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    phFriNfc_MifStd1k_H_BlkChk (NdefMap, SectorID, &callbreak);
15808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
15818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
15828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else
15838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
15848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* every last block of a sector needs to be skipped */
15858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if (((NdefMap->StdMifareContainer.currentBlock + 1) %
15868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_BLOCK_BYTES) == 0)
15878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
15888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.currentBlock++;
15898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
15908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                else
15918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
15928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if (NdefMap->StdMifareContainer.aid [SectorID] ==
15938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_NDEF_COMP)
15948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
15958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        /* Check whether the block is first block of a (next)new sector and
15968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            also check if it is first block then internal length is zero
15978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            or not. Because once Authentication is done for the sector again
15988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            we should not authenticate it again */
15998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        /* In this case 32 sectors contains 4 blocks and next remaining 8 sectors
16008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            contains 16 blocks that is why (32 * 4) + (sectorID - 32) *16*/
16018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        if ((NdefMap->StdMifareContainer.currentBlock ==
16028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            ((PH_FRINFC_MIFARESTD_SECTOR_NO32 * PH_FRINFC_MIFARESTD_BLK4) +
16038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            ((SectorID - PH_FRINFC_MIFARESTD_SECTOR_NO32) * PH_FRINFC_MIFARESTD_BLOCK_BYTES))) &&
16048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (NdefMap->StdMifareContainer.internalLength == 0))
16058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        {
16068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NdefMap->StdMifareContainer.AuthDone = 0;
16078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        }
16088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        callbreak = 1;
16098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
16108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    else
16118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
16128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->StdMifareContainer.currentBlock += 16;
16138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
16148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
16158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
16168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
16178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (callbreak == 1)
16188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
16198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
16208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
16218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
16228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
16238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
16248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
16258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
16268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
16278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_GetSect
16288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
16298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function  to get the Sector from the current block
16308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
16318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          uint8_t SectorID
16328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
16338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
16348605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic uint8_t phFriNfc_MifStd_H_GetSect (uint8_t BlockNumber)
16358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
16368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t SectorID = 0;
16378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
16388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (BlockNumber >= PH_FRINFC_MIFARESTD4K_BLK128)
16398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
16408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        SectorID = (uint8_t) (PH_FRINFC_MIFARESTD_SECTOR_NO32 +
16418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    ((BlockNumber - PH_FRINFC_MIFARESTD4K_BLK128)/
16428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_BLOCK_BYTES));
16438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
16448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
16458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
16468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        SectorID = (BlockNumber/PH_FRINFC_MIFARESTD_BLK4);
16478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
16488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
16498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return SectorID;
16508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
16518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
16528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
16538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_RdAcsBit
16548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
16558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      It read the access bits of each sector.
16568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  NCI messages.
16578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
16588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
16598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
16608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
16618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
16628605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_RdAcsBit (phFriNfc_NdefMap_t *NdefMap)
16638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
16648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS Result = NFCSTATUS_SUCCESS;
16658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
16668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_ACS_BIT;
16678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
16688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (NdefMap->StdMifareContainer.ReadOnlySectorIndex &&
16698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.currentBlock == NdefMap->StdMifareContainer.SectorTrailerBlockNo)
16708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
16718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_SEC_ACS_BIT;
16728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
16738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
16748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (NdefMap->StdMifareContainer.ReadAcsBitFlag == PH_FRINFC_MIFARESTD_FLAG1)
16758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
16768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Get the sector trailer */
16778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        ((NdefMap->StdMifareContainer.currentBlock > 127) ?
16788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            phFriNfc_MifStd_H_Get4kStTrail(NdefMap) :
16798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            phFriNfc_MifStd_H_Get1kStTrail(NdefMap));
16808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
16818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
16828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
16838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Give the current block to read */
16848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf [PH_FRINFC_MIFARESTD_VAL0] =
16858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->StdMifareContainer.currentBlock;
16868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
16878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
16888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    Result = phFriNfc_MifStd_H_Rd16Bytes(NdefMap,
16898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->SendRecvBuf [PH_FRINFC_MIFARESTD_VAL0]);
16908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
16918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
16928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
16938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
16948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
16958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_ChkAcsBit
16968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
16978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function check the access bits of each sector.
16988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
16998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
17008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
17018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
17028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
17038605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ChkAcsBit (phFriNfc_NdefMap_t *NdefMap)
17048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
17058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS Result = NFCSTATUS_SUCCESS;
17068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
17078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Blocks from 0 to 3 and from 64 to 67(MAD blocks) */
17088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if ((NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK0) ||
17098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK1) ||
17108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK2) ||
17118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK3) ||
17128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK64) ||
17138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK65) ||
17148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK66) )
17158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
17168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Access bits check removed for the MAD blocks */
17178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#ifdef ENABLE_ACS_BIT_CHK_FOR_MAD
17188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
17198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (((NdefMap->SendRecvBuf [
17208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL6] &
17218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_MASK_FF) ==
17228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_MADSECT_ACS_BYTE6) &&
17238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            ((NdefMap->SendRecvBuf [
17248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL7] &
17258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_MASK_FF) ==
17268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_MADSECT_ACS_BYTE7) &&
17278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            ((NdefMap->SendRecvBuf [
17288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL8] &
17298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_MASK_FF) ==
17308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_ACS_BYTE8))
17318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
17328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.WriteFlag =
17338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG0;
17348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.ReadFlag =
17358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG1;
17368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
17378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
17388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
17398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.WriteFlag =
17408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG0;
17418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.ReadFlag =
17428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG0;
17438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
17448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
17458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#else /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
17468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
17478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INITIALIZED;
17488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
17498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#endif /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
17508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
17518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
17528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
17538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Check for Access bytes 6, 7 and 8 value =
17548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            0x7F, 0x07, 0x88 NFC forum sectors*/
17558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (((NdefMap->SendRecvBuf [
17568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL6] &
17578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_MASK_FF) ==
17588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_NFCSECT_ACS_BYTE6) &&
17598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            ((NdefMap->SendRecvBuf [
17608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL7] &
17618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_MASK_FF) ==
17628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_NFCSECT_ACS_BYTE7) &&
17638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            ((NdefMap->SendRecvBuf [
17648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL8] &
17658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_MASK_FF) ==
17668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_ACS_BYTE8))
17678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
17688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.WriteFlag =
17698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG1;
17708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.ReadFlag =
17718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG1;
17728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
17738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else if (((NdefMap->SendRecvBuf [
17748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL6] &
17758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_MASK_FF) ==
17768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE6) &&
17778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            ((NdefMap->SendRecvBuf [
17788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL7] &
17798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_MASK_FF) ==
17808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE7) &&
17818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            ((NdefMap->SendRecvBuf [
17828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL8] &
17838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_MASK_FF) ==
17848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE8))
17858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
17868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Read Only state */
17878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Check for Access bytes 6, 7 and 8 value =
17888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                0x55, 0xAD, 0x2A NFC forum Sectors */
17898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.WriteFlag =
17908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG0;
17918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.ReadFlag =
17928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG1;
17938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
17948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
17958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
17968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.WriteFlag =
17978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG0;
17988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.ReadFlag =
17998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG0;
18008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
18018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
18028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#ifdef ENABLE_ACS_BIT_CHK_FOR_MAD
18038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Do nothing */
18048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#else /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
18058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = phFriNfc_MifStd_H_GPBChk (NdefMap);
18068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#endif /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
18078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
18088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
18098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#ifdef ENABLE_ACS_BIT_CHK_FOR_MAD
18108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    Result = phFriNfc_MifStd_H_GPBChk (NdefMap);
18118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao#endif /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
18128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
18138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
18148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
18158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
18168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
18178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_ChkRdWr
18188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
18198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function is for read access bits, depending
18208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  on the read/write/check ndef function called.
18218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
18228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
18238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
18248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
18258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
18268605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ChkRdWr (phFriNfc_NdefMap_t *NdefMap)
18278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
18288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS Result = NFCSTATUS_SUCCESS;
18298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
18308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    switch (NdefMap->PrevOperation)
18318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
18328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_NDEFMAP_CHECK_OPE:
18338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID)
18348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
18358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* No permission to read */
18368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
18378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NFCSTATUS_READ_FAILED);
18388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
18398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else if ((NdefMap->StdMifareContainer.currentBlock > 3) &&
18408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (NdefMap->StdMifareContainer.ChkNdefCompleteFlag ==
18418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_FLAG1) &&
18428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (NdefMap->StdMifareContainer.currentBlock !=
18438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_MAD_BLK65) &&
18448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (NdefMap->StdMifareContainer.currentBlock !=
18458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_MAD_BLK66))
18468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
18478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = ((NdefMap->StdMifareContainer.ReadAcsBitFlag ==
18488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_FLAG0) ?
18498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                phFriNfc_MifStd_H_RdAcsBit(NdefMap) :
18508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                phFriNfc_MifStd_H_AuthSector(NdefMap));
18518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
18528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else
18538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
18548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = phFriNfc_MifareStdMap_ChkNdef (NdefMap);
18558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
18568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
18578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
18588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_NDEFMAP_READ_OPE:
18598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID)
18608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
18618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* No permission to Read */
18628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, NFCSTATUS_READ_FAILED);
18638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
18648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else if (NdefMap->StdMifareContainer.ReadNdefFlag == PH_FRINFC_MIFARESTD_FLAG1)
18658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
18668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = phFriNfc_MifStd_H_GetActCardLen (NdefMap);
18678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
18688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else
18698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
18708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = phFriNfc_MifStd_H_RdABlock (NdefMap);
18718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
18728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
18738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
18748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_NDEFMAP_WRITE_OPE:
18758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if ((NdefMap->CardState ==
18768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_NDEFMAP_CARD_STATE_INVALID) ||
18778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (NdefMap->CardState ==
18788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_NDEFMAP_CARD_STATE_READ_ONLY))
18798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
18808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* No permission to Read */
18818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
18828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NFCSTATUS_WRITE_FAILED);
18838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
18848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else if (NdefMap->StdMifareContainer.WrNdefFlag ==
18858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_FLAG1)
18868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
18878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = phFriNfc_MifStd_H_GetActCardLen (NdefMap);
18888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
18898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else if (NdefMap->StdMifareContainer.RdBeforeWrFlag ==
18908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_FLAG1)
18918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
18928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /*NdefMap->StdMifareContainer.ReadFlag =
18938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_FLAG0;*/
18948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = phFriNfc_MifStd_H_RdBeforeWr (NdefMap);
18958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
18968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else if (NdefMap->StdMifareContainer.RdAfterWrFlag ==
18978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_FLAG1)
18988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
18998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = phFriNfc_MifStd_H_RdtoWrNdefLen (NdefMap);
19008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
19018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else
19028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
19038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = (((NdefMap->TLVStruct.NdefTLVBlock ==
19048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NdefMap->StdMifareContainer.currentBlock) &&
19058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (NdefMap->Offset ==
19068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_NDEFMAP_SEEK_BEGIN)) ?
19078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            phFriNfc_MifStd_H_RdBeforeWr (NdefMap) :
19088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            phFriNfc_MifStd_H_WrABlock (NdefMap));
19098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
19108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
19118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
19128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_NDEFMAP_GET_ACTSIZE_OPE:
19138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = ((NdefMap->StdMifareContainer.ReadFlag ==
19148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG0) ?
19158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
19168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NFCSTATUS_READ_FAILED)) :
19178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        phFriNfc_MifStd_H_GetActCardLen (NdefMap));
19188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
19198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
19208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        default:
19218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Operation is not correct */
19228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP,
19238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NFCSTATUS_INVALID_PARAMETER);
19248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
19258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
19268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
19278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
19288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
19298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
19308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
19318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
19328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_ChkNdefCmpltSects
19338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
19348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function is used to check ndef to check the
19358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  ndef compliant sectors.
19368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
19378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          void
19388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
19398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
19408605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd_H_ChkNdefCmpltSects (phFriNfc_NdefMap_t *NdefMap)
19418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
19428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t index = 0;
19438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t index_max_4k_2k= 0;
19448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD)
19458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
19468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        index_max_4k_2k = PH_FRINFC_MIFARESTD4K_TOTAL_SECTOR;
19478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
19488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
19498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
19508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        index_max_4k_2k = PH_FRINFC_MIFARESTD2K_TOTAL_SECTOR;
19518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
19528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
19538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD || NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD)
19548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
19558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        for (index = PH_FRINFC_MIFARESTD_SECTOR_NO1; index < index_max_4k_2k; index++)/*Block 0 is MAD block, so it should start with 1*/
19568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
19578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* For Mifare 4k, Block 0 to 31 contains 4 blocks */
19588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* sector 0 and 15 are aid blocks */
19598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if (index != PH_FRINFC_MIFARESTD_SECTOR_NO16)
19608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
19618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if (((index < 32) && (index != PH_FRINFC_MIFARESTD_SECTOR_NO0))
19628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    && (NdefMap->StdMifareContainer.aid [index] ==
19638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_NON_NDEF_COMP))
19648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
19658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    /* Only 3 blocks can be read/written till sector 31 */
19668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.NoOfNdefCompBlocks -=
19678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                PH_FRINFC_MIFARESTD_MAD_BLK3;
19688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
19698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
19708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                else
19718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
19728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    /* For Mifare 4k, Block 32 to 39 contains 16 blocks */
19738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if(NdefMap->StdMifareContainer.aid [index] ==
19748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_NON_NDEF_COMP)
19758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
19768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        /* Only 15 blocks can be read/written from sector 31 */
19778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->StdMifareContainer.NoOfNdefCompBlocks -=
19788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                PH_FRINFC_MIFARESTD_BLK15;
19798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
19808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
19818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
19828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        } /* For index > 40 */
19838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
19848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
19858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
19868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        for (index = PH_FRINFC_MIFARESTD_SECTOR_NO1;
19878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            index < PH_FRINFC_MIFARESTD_SECTOR_NO16; index++)
19888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
19898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if (NdefMap->StdMifareContainer.aid [index] ==
19908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_NON_NDEF_COMP)
19918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
19928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /*  Only three blocks can be read/written in
19938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    a sector. So if a sector is non-ndef
19948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    compliant, decrement 3 */
19958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.NoOfNdefCompBlocks -=
19968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_MAD_BLK3;
19978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
19988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
19998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
20008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
20018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return;
20028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
20038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
20048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
20058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_RemainTLV
20068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
20078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function is used for read ndef to process the
20088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  remaining bytes of length (L) in the TLV.
20098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
20108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_PENDING in case of success
20118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
20128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
20138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
20148605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_RemainTLV (phFriNfc_NdefMap_t *NdefMap,
20158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                              uint8_t            *Flag,
20168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                              uint8_t            *Temp16Bytes)
20178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
20188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
20198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t     CRFlag = 0;
20208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint16_t    RemainingBytes = 0;
20218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
20228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    RemainingBytes = ((uint16_t) NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex);
20238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
20248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (NdefMap->StdMifareContainer.remainingSize < RemainingBytes)
20258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
20268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* If the user Buffer is greater than the Card Size
20278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           set LastBlockFlag = 1. This Flag is used to read bytes
20288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           till the end of the card only */
20298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        RemainingBytes = NdefMap->StdMifareContainer.remainingSize;
20308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
20318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
20328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Remaining Bytes of length (L) in TLV <=  16 */
20338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if ((NdefMap->TLVStruct.BytesRemainLinTLV <=
20348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))) &&
20358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (RemainingBytes <= NdefMap->TLVStruct.BytesRemainLinTLV))
20368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
20378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Copy data to user buffer */
20388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        memcpy (&(NdefMap->ApduBuffer [NdefMap->ApduBuffIndex]),
20398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                &(NdefMap->SendRecvBuf [(*Temp16Bytes)]),
20408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                RemainingBytes);
20418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
20428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->ApduBuffIndex += RemainingBytes;
20438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.remainingSize -= RemainingBytes;
20448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
20458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* copy the bytes to internal buffer, that are read,
20468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           but not used for the user buffer */
20478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (RemainingBytes != NdefMap->TLVStruct.BytesRemainLinTLV)
20488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
20498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            memcpy (NdefMap->StdMifareContainer.internalBuf,
20508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    &(NdefMap->SendRecvBuf [((*Temp16Bytes) + RemainingBytes)]),
20518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    ((PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes)) - RemainingBytes));
20528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
20538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* internal buffer length */
20548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.internalLength =
20558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    ((PH_FRINFC_MIFARESTD_BYTES_READ -
20568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (*Temp16Bytes)) - RemainingBytes);
20578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
20588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        *Temp16Bytes += ((uint8_t)RemainingBytes);
20598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Remaining Bytes of length value in TLV */
20608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
20618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
20628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (NdefMap->StdMifareContainer.internalLength == PH_FRINFC_MIFARESTD_VAL0)
20638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
20648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
20658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
20668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0)) ?
20678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG1 :
20688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG0);
20698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
20708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* internal length bytes completed */
20718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.currentBlock++;
20728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.NdefBlocks++;
20738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
20748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
20758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0)
20768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
20778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Remaining Bytes of length (L) in TLV is Zero means that the next
20788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao               coming bytes are containing type (T), length (L) in TLV */
20798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
20808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
20818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
20828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
20838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* call completion routine */
20848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
20858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        *Flag = PH_FRINFC_MIFARESTD_FLAG0;
20868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
20878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else if ((NdefMap->TLVStruct.BytesRemainLinTLV <=
20888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))) &&
20898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (RemainingBytes > NdefMap->TLVStruct.BytesRemainLinTLV))
20908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
20918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Copy data to user buffer */
20928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        memcpy (&(NdefMap->ApduBuffer [NdefMap->ApduBuffIndex]),
20938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                &(NdefMap->SendRecvBuf [(*Temp16Bytes)]),
20948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->TLVStruct.BytesRemainLinTLV);
20958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
20968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->ApduBuffIndex += NdefMap->TLVStruct.BytesRemainLinTLV;
20978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.remainingSize -= NdefMap->TLVStruct.BytesRemainLinTLV;
20988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
20998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        *Temp16Bytes += ((uint8_t) NdefMap->TLVStruct.BytesRemainLinTLV);
21008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
21018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
21028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        *Flag = PH_FRINFC_MIFARESTD_FLAG1;
21038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
21048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
21058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
21068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* 16 bytes completed */
21078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_BYTES_READ)
21088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
21098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            *Flag = PH_FRINFC_MIFARESTD_FLAG0;
21108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
21118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.currentBlock++;
21128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.NdefBlocks++;
21138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = phFriNfc_MifStd_H_BlkChk (NdefMap);
21148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if (Result == NFCSTATUS_SUCCESS)
21158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
21168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if (NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)
21178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
21188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Result = phFriNfc_MifStd_H_RdABlock (NdefMap);
21198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
21208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                else
21218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
21228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Result = phFriNfc_MifStd_H_AuthSector (NdefMap);
21238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
21248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
21258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
21268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
21278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
21288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.BytesRemainLinTLV =
21298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
21308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* The read operation has finished. so, completion routine
21318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao               can be called. set the Completion routine(CR) flag */
21328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
21338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
21348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
21358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else if ((NdefMap->TLVStruct.BytesRemainLinTLV >
21368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))) &&
21378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (RemainingBytes <= (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))))
21388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
21398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Copy data to user buffer */
21408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        memcpy (&(NdefMap->ApduBuffer [NdefMap->ApduBuffIndex]),
21418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                &(NdefMap->SendRecvBuf [(*Temp16Bytes)]),
21428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                RemainingBytes);
21438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->ApduBuffIndex += RemainingBytes;
21448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.remainingSize -= RemainingBytes;
21458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
21468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Remaining Bytes of length (L) in TLV */
21478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
21488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* copy the bytes to internal buffer, that are read,
21498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        but not used for the user buffer */
21508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        memcpy (NdefMap->StdMifareContainer.internalBuf,
21518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                &(NdefMap->SendRecvBuf[(RemainingBytes + (*Temp16Bytes))]),
21528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                ((PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))
21538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                - RemainingBytes));
21548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
21558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* internal buffer length */
21568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.internalLength =
21578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                ((PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes)) - RemainingBytes);
21588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
21598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (RemainingBytes == (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes)))
21608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
21618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
21628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
21638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0)) ?
21648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG1 :
21658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG0);
21668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
21678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* internal length bytes completed */
21688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.currentBlock++;
21698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.NdefBlocks++;
21708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
21718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        *Temp16Bytes += ((uint8_t) RemainingBytes);
21728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
21738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
21748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        *Flag = PH_FRINFC_MIFARESTD_FLAG0;
21758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
21768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
21778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
21788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if ((NdefMap->TLVStruct.BytesRemainLinTLV >
21798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))) &&
21808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (RemainingBytes > (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))))
21818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
21828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            *Flag = PH_FRINFC_MIFARESTD_FLAG0;
21838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Copy data to user buffer */
21848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            memcpy (&(NdefMap->ApduBuffer [NdefMap->ApduBuffIndex]),
21858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    &(NdefMap->SendRecvBuf [(*Temp16Bytes)]),
21868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes)));
21878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->ApduBuffIndex += (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes));
21888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.remainingSize -=
21898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes));
21908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.BytesRemainLinTLV -= (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes));
21918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            *Temp16Bytes += (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes));
21928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if (NdefMap->TLVStruct.BytesRemainLinTLV != PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0)
21938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
21948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
21958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
21968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* 16 bytes completed */
21978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.currentBlock++;
21988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.NdefBlocks++;
21998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = phFriNfc_MifStd_H_BlkChk (NdefMap);
22008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if (Result == NFCSTATUS_SUCCESS)
22018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
22028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = ((NdefMap->StdMifareContainer.AuthDone ==
22038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG1) ?
22048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        phFriNfc_MifStd_H_RdABlock(NdefMap) :
22058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        phFriNfc_MifStd_H_AuthSector(NdefMap));
22068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
22078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
22088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
22098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
22108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
22118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
22128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
22138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
22148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
22158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0)) ?
22168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG1 :
22178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG0);
22188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
22198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
22208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
22218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
22228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
22238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
22248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_ChkIntLen
22258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
22268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function reads ndef to process the internal bytes.
22278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
22288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success,
22298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
22308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
22318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
22328605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ChkIntLen(phFriNfc_NdefMap_t *NdefMap)
22338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
22348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
22358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t     NDEFFlag = PH_FRINFC_MIFARESTD_FLAG1;
22368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t     TempintBytes = 0;
22378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
22388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(NdefMap->TLVStruct.BytesRemainLinTLV != 0)
22398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
22408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
22418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* To read the remaining length (L) in TLV */
22428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = phFriNfc_MifStd_H_IntLenWioutNdef(NdefMap, &NDEFFlag, &TempintBytes);
22438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
22448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
22458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* check the NDEFFlag is set. if this is not set, then
22468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao       in the above RemainTLV function all the 16 bytes has been
22478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao       read */
22488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
22498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
22508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
22518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
22528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
22538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_IntLenWioutNdef
22548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
22558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function reads ndef to check the internal bytes
22568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  without ndef tlv flag.
22578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
22588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success,
22598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
22608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
22618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
22628605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_IntLenWioutNdef (phFriNfc_NdefMap_t *NdefMap,
22638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                    uint8_t            *Flag,
22648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                    uint8_t            *TempintBytes)
22658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
22668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
22678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t     CRFlag = 0;
22688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint16_t    RemainingBytes = 0;
22698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
22708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    RemainingBytes = ((uint16_t)NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex);
22718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
22728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (NdefMap->StdMifareContainer.remainingSize < RemainingBytes)
22738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
22748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* If the user Buffer is greater than the Card Size
22758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           set LastBlockFlag = 1. This Flag is used to read bytes
22768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           till the end of the card only */
22778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        RemainingBytes = NdefMap->StdMifareContainer.remainingSize;
22788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
22798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
22808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Remaining Bytes of length (L) in TLV <=  internal length */
22818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if ((NdefMap->TLVStruct.BytesRemainLinTLV <=
22828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.internalLength) &&
22838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (RemainingBytes <= NdefMap->TLVStruct.BytesRemainLinTLV))
22848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
22858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        memcpy (&(NdefMap->ApduBuffer [NdefMap->ApduBuffIndex]),
22868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                &(NdefMap->StdMifareContainer.internalBuf [(*TempintBytes)]),
22878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                RemainingBytes);
22888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->ApduBuffIndex += RemainingBytes;
22898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.remainingSize -= RemainingBytes;
22908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        *TempintBytes += ((uint8_t) RemainingBytes);
22918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
22928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* copy the bytes to internal buffer, that are read,
22938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           but not used for the user buffer */
22948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        memcpy (NdefMap->StdMifareContainer.internalBuf,
22958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                &(NdefMap->StdMifareContainer.internalBuf [RemainingBytes]),
22968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (NdefMap->StdMifareContainer.internalLength - RemainingBytes));
22978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
22988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* internal buffer length */
22998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.internalLength -= RemainingBytes;
23008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
23018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
23028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (NdefMap->StdMifareContainer.internalLength == PH_FRINFC_MIFARESTD_VAL0)
23038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
23048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
23058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
23068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0)) ?
23078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG1 :
23088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG0);
23098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
23108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* internal length bytes completed */
23118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.currentBlock++;
23128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.NdefBlocks++;
23138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
23148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
23158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Remaining Bytes of length value in TLV */
23168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (NdefMap->TLVStruct.BytesRemainLinTLV == 0)
23178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
23188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Remaining Bytes of length (L) in TLV is Zero means that the next
23198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao             coming bytes are containing type (T), length (L) in TLV */
23208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
23218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
23228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
23238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
23248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* call completion routine */
23258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
23268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        *Flag = PH_FRINFC_MIFARESTD_FLAG0;
23278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
23288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else if ((NdefMap->TLVStruct.BytesRemainLinTLV <=
23298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.internalLength) &&
23308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (RemainingBytes > NdefMap->TLVStruct.BytesRemainLinTLV))
23318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
23328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        memcpy (&(NdefMap->ApduBuffer [NdefMap->ApduBuffIndex]),
23338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                &(NdefMap->StdMifareContainer.internalBuf [(*TempintBytes)]),
23348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->TLVStruct.BytesRemainLinTLV);
23358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
23368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->ApduBuffIndex += NdefMap->TLVStruct.BytesRemainLinTLV;
23378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.remainingSize -= NdefMap->TLVStruct.BytesRemainLinTLV;
23388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
23398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
23408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        *TempintBytes += ((uint8_t) NdefMap->TLVStruct.BytesRemainLinTLV);
23418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        *Flag = PH_FRINFC_MIFARESTD_FLAG1;
23428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
23438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
23448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
23458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
23468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
23478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
23488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
23498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0)) ?
23508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG1 :
23518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG0);
23528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
23538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (PH_FRINFC_MIFARESTD_FLAG1 == NdefMap->StdMifareContainer.ReadWriteCompleteFlag)
23548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
23558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
23568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
23578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
23588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (NdefMap->TLVStruct.BytesRemainLinTLV == NdefMap->StdMifareContainer.internalLength)
23598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
23608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Remaining Bytes in Length (L) field of TLV is 0 */
23618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
23628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
23638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            *Flag = PH_FRINFC_MIFARESTD_FLAG0;
23648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* internal length bytes completed */
23658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.currentBlock++;
23668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.NdefBlocks++;
23678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = phFriNfc_MifStd_H_BlkChk (NdefMap);
23688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if (Result == NFCSTATUS_SUCCESS)
23698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
23708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result =
23718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                ((NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1) ?
23728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                phFriNfc_MifStd_H_RdABlock (NdefMap) :
23738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                phFriNfc_MifStd_H_AuthSector (NdefMap));
23748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
23758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
23768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
23778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
23788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Remaining Bytes in Length (L) field of TLV is 0 */
23798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
23808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            *Flag = PH_FRINFC_MIFARESTD_FLAG1;
23818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
23828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
23838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else if ((NdefMap->TLVStruct.BytesRemainLinTLV >
23848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.internalLength) &&
23858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (RemainingBytes <= NdefMap->StdMifareContainer.internalLength))
23868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
23878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        memcpy(&(NdefMap->ApduBuffer [NdefMap->ApduBuffIndex]),
23888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                &(NdefMap->StdMifareContainer.internalBuf [(*TempintBytes)]),
23898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                RemainingBytes);
23908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
23918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->ApduBuffIndex += RemainingBytes;
23928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.remainingSize -= RemainingBytes;
23938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        *TempintBytes += ((uint8_t) RemainingBytes);
23948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Remaining Bytes of length (L) in TLV */
23958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
23968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
23978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* copy the bytes to internal buffer, that are read,
23988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        but not used for the user buffer */
23998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        memcpy (NdefMap->StdMifareContainer.internalBuf,
24008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                &(NdefMap->StdMifareContainer.internalBuf [RemainingBytes]),
24018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (NdefMap->StdMifareContainer.internalLength - RemainingBytes));
24028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
24038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* internal buffer length */
24048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.internalLength -= RemainingBytes;
24058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (NdefMap->StdMifareContainer.internalLength == PH_FRINFC_MIFARESTD_VAL0)
24068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
24078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
24088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
24098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0)) ?
24108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG1 :
24118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG0);
24128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
24138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* internal length bytes completed */
24148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.currentBlock++;
24158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.NdefBlocks++;
24168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
24178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
24188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
24198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
24208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        *Flag = PH_FRINFC_MIFARESTD_FLAG0;
24218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
24228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
24238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
24248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if ((NdefMap->TLVStruct.BytesRemainLinTLV >
24258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.internalLength) &&
24268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (RemainingBytes > NdefMap->StdMifareContainer.internalLength))
24278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
24288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            memcpy (&(NdefMap->ApduBuffer [NdefMap->ApduBuffIndex]),
24298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    &(NdefMap->StdMifareContainer.internalBuf [(*TempintBytes)]),
24308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.internalLength);
24318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            *Flag = PH_FRINFC_MIFARESTD_FLAG0;
24328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->ApduBuffIndex += NdefMap->StdMifareContainer.internalLength;
24338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.remainingSize -=
24348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NdefMap->StdMifareContainer.internalLength;
24358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.BytesRemainLinTLV -= NdefMap->StdMifareContainer.internalLength;
24368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
24378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if(NdefMap->TLVStruct.BytesRemainLinTLV != PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0)
24388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
24398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
24408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
24418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
24428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
24438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* internal length bytes completed */
24448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.currentBlock++;
24458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.NdefBlocks++;
24468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
24478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if(Result == NFCSTATUS_SUCCESS)
24488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
24498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = ((NdefMap->StdMifareContainer.AuthDone ==
24508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG1)?
24518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            phFriNfc_MifStd_H_RdABlock(NdefMap):
24528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            phFriNfc_MifStd_H_AuthSector(NdefMap));
24538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
24548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
24558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
24568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
24578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
24588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
24598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
24608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
24618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
24628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG1:
24638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG0);
24648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
24658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
24668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
24678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
24688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
24698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
24708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
24718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_WriteNdefLen
24728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
24738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function is Helper function for write ndef
24748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  to write the Length TLV.
24758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
24768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_PENDING in case of success
24778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
24788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
24798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
24808605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_WriteNdefLen(phFriNfc_NdefMap_t *NdefMap)
24818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
24828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
24838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WR_NDEF_LEN;
24848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
24858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* If Current block = Ndef TLV block then the starting point
24868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao       is writing from type of TLV
24878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao       Else */
24888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
24898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(NdefMap->StdMifareContainer.currentBlock ==
24908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NdefMap->TLVStruct.NdefTLVBlock)
24918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
24928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
24938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->TLVStruct.NULLTLVCount >=
24948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL2)
24958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
24968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            phFriNfc_MifStd_H_fillTLV1(NdefMap);
24978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
24988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
24998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
25008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            phFriNfc_MifStd_H_fillTLV2(NdefMap);
25018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
25028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
25038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
25048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
25058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->TLVStruct.NULLTLVCount >=
25068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL2)
25078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
25088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            phFriNfc_MifStd_H_fillTLV1_1(NdefMap);
25098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
25108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
25118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
25128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            phFriNfc_MifStd_H_fillTLV2_1(NdefMap);
25138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
25148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
25158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
25168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    memcpy( NdefMap->StdMifareContainer.Buffer,
25178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            &(NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL1]),
25188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_BYTES_READ);
25198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
25208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
25218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Write from here */
25228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_WRITE;
25238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
25248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->Cmd.MfCmd = phHal_eMifareWrite16;
25258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
25268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
25278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Call the Overlapped HAL Transceive function */
25288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    Result = phFriNfc_ExtnsTransceive(NdefMap->pTransceiveInfo,
25298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                   NdefMap->Cmd,
25308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                   NdefMap->SendRecvBuf,
25318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                   NdefMap->SendLength,
25328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                   NdefMap->SendRecvLength);
25338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
25348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
25358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
25368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
25378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
25388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_RdWrReset
25398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
25408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      It resets ndef TLV values. This is used when the offset
25418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  is BEGIN.
25428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
25438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          void
25448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
25458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
25468605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd_H_RdWrReset(phFriNfc_NdefMap_t   *NdefMap)
25478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
25488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_BLK4;
25498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->StdMifareContainer.NdefBlocks = PH_FRINFC_MIFARESTD_VAL1;
25508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
25518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
25528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
25538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->TLVStruct.NdefTLVAuthFlag = PH_FRINFC_MIFARESTD_FLAG0;
25548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->TLVStruct.NdefTLVBlock = PH_FRINFC_MIFARESTD_MAD_BLK0;
25558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL0;
25568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_MIFARESTD_VAL0;
25578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
25588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
25598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
25608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
25618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG1;
25628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->StdMifareContainer.ReadWriteCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
25638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->StdMifareContainer.remainingSize = (uint16_t)
25648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.NoOfNdefCompBlocks *
25658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_BLOCK_BYTES);
25668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->StdMifareContainer.WrLength = PH_FRINFC_MIFARESTD_VAL1;
25678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
25688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return;
25698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
25708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
25718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
25728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_RdtoWrNdefLen
25738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
25748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function is used to read the first ndef compliant
25758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  block to change the length.
25768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
25778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_PENDING in case of success
25788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
25798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
25808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
25818605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_RdtoWrNdefLen(phFriNfc_NdefMap_t *NdefMap)
25828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
25838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS Result = NFCSTATUS_SUCCESS;
25848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
25858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_TO_WR_NDEF_LEN;
25868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
25878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(NdefMap->TLVStruct.NdefTLVAuthFlag == PH_FRINFC_MIFARESTD_FLAG1)
25888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
25898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
25908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = phFriNfc_MifStd_H_AuthSector(NdefMap);
25918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
25928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
25938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
25948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[0] = NdefMap->StdMifareContainer.currentBlock;
25958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_READ;
25968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
25978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
25988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->Cmd.MfCmd = phHal_eMifareRead;
25998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
26008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Call the Overlapped HAL Transceive function */
26018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = phFriNfc_ExtnsTransceive(NdefMap->pTransceiveInfo,
26028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->Cmd,
26038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->SendRecvBuf,
26048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->SendLength,
26058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->SendRecvLength);
26068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
26078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
26088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
26098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
26108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
26118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
26128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_SetNdefBlkAuth
26138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
26148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function is used to set the authentication flag
26158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  for the ndef TLV block.
26168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
26178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          void
26188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
26198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
26208605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd_H_SetNdefBlkAuth(phFriNfc_NdefMap_t   *NdefMap)
26218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
26228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->TLVStruct.NdefTLVAuthFlag =
26238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            ((phFriNfc_MifStd_H_GetSect(NdefMap->TLVStruct.NdefTLVBlock)
26248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            == phFriNfc_MifStd_H_GetSect(NdefMap->StdMifareContainer.currentBlock))?
26258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG0:
26268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG1);
26278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
26288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return;
26298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
26308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
26318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
26328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_GetActCardLen
26338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
26348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      Helper function to get the actual length of card.
26358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
26368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
26378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
26388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
26398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
26408605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_GetActCardLen(phFriNfc_NdefMap_t *NdefMap)
26418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
26428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
26438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
26448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->State = PH_FRINFC_NDEFMAP_STATE_GET_ACT_CARDSIZE;
26458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_GET_ACTSIZE_OPE;
26468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
26478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    Result = ((NdefMap->StdMifareContainer.AuthDone ==
26488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG0)?
26498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            phFriNfc_MifStd_H_AuthSector(NdefMap):
26508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            phFriNfc_MifStd_H_Rd16Bytes(NdefMap,
26518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.currentBlock));
26528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
26538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
26548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
26558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
26568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
26578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_ChkTLVs
26588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
26598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      Helper function to check all the TLVs.
26608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
26618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
26628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
26638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
26648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
26658605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ChkTLVs(phFriNfc_NdefMap_t *NdefMap,
26668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                           uint8_t            *CRFlag)
26678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
26688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS       Result = NFCSTATUS_SUCCESS;
26698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint16_t        TempLength = PH_FRINFC_MIFARESTD_VAL0,
26708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    ShiftLength = PH_FRINFC_MIFARESTD_VAL0;
26718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t         TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
26728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
26738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_GET_ACTSIZE_OPE;
26748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    TempLength = NdefMap->TLVStruct.NdefTLVByte;
26758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
26768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    for(;;)
26778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
26788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if((NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_TERMTLV_T) &&
26798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_NULLTLV_T) &&
26808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_NDEFTLV_T) &&
26818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (FALSE == NdefMap->TLVStruct.NdefTLVFoundFlag))
26828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
26838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
26848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NFCSTATUS_NO_NDEF_SUPPORT);
26858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.BytesRemainLinTLV = 0;
26868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
26878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
26888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
26898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
26908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
26918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
26928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if((NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_TERMTLV_T) &&
26938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_NULLTLV_T))
26948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
26958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if(NdefMap->SendRecvBuf[TempLength] == PH_FRINFC_MIFARESTD_NDEFTLV_T)
26968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
26978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->TLVStruct.NdefTLVBlock =
26988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NdefMap->StdMifareContainer.currentBlock;
26998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->TLVStruct.NdefTLVByte = (uint8_t)TempLength;
27008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->TLVStruct.NdefTLVFoundFlag =
27018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            ((NdefMap->SendRecvBuf[TempLength] ==
27028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_NDEFTLV_T)?
27038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_FLAG1:
27048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_FLAG0);
27058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
27068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->TLVStruct.NULLTLVCount = ((NdefMap->TLVStruct.NULLTLVCount
27078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            == PH_FRINFC_MIFARESTD_VAL1)?
27088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            PH_FRINFC_MIFARESTD_VAL0:
27098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            NdefMap->TLVStruct.NULLTLVCount);
27108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
27118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else
27128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
27138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
27148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
27158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
27168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
27178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if(TempLength == PH_FRINFC_MIFARESTD_BYTES_READ)
27188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
27198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->TLVStruct.TcheckedinTLVFlag =
27208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_FLAG1;
27218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->TLVStruct.NoLbytesinTLV =
27228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_VAL3;
27238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
27248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = phFriNfc_MifStd_H_Chk16Bytes(  NdefMap,
27258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                    TempLength);
27268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if(Result != NFCSTATUS_SUCCESS)
27278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
27288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                *CRFlag = (uint8_t)((Result == NFCSTATUS_PENDING)?
27298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG0:
27308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG1);
27318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
27328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
27338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
27348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if(((((  NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
27358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->StdMifareContainer.NdefBlocks) *
27368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_BLOCK_BYTES) +
27378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (PH_FRINFC_MIFARESTD_BLOCK_BYTES -
27388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        TempLength)) <
27398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->SendRecvBuf[TempLength]) &&
27408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        ((NdefMap->SendRecvBuf[TempLength] <
27418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_NDEFTLV_L) &&
27428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->TLVStruct.NdefTLVFoundFlag !=
27438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_VAL1)))
27448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
27458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Result = Error */
27468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
27478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NFCSTATUS_INVALID_PARAMETER);
27488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
27498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
27508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
27518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
27528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if(((((  NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
27538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->StdMifareContainer.NdefBlocks) *
27548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_BLOCK_BYTES) +
27558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (PH_FRINFC_MIFARESTD_BLOCK_BYTES -
27568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        TempLength)) <
27578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->SendRecvBuf[TempLength]) &&
27588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        ((NdefMap->SendRecvBuf[TempLength] ==
27598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_VAL0) &&
27608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->TLVStruct.NdefTLVFoundFlag ==
27618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_VAL1)))
27628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
27638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Result = Error */
27648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
27658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NFCSTATUS_INVALID_PARAMETER);
27668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
27678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
27688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
27698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
27708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if((NdefMap->TLVStruct.NdefTLVFoundFlag ==
27718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG1) &&
27728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (NdefMap->SendRecvBuf[TempLength] <
27738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                 PH_FRINFC_MIFARESTD_NDEFTLV_L))
27748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
27758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = phFriNfc_MapTool_SetCardState(NdefMap,
27768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NdefMap->SendRecvBuf[TempLength]);
27778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->TLVStruct.BytesRemainLinTLV =
27788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NdefMap->SendRecvBuf[TempLength];
27798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.remainingSize -=
27808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            PH_FRINFC_MIFARESTD_VAL2;
27818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* This flag is set */
27828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.remSizeUpdFlag =
27838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (uint8_t)((NdefMap->TLVStruct.NULLTLVCount >=
27848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_VAL2)?
27858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_FLAG0:
27868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_FLAG1);
27878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
27888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
27898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
27908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
27918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
27928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.remainingSize -=
27938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    ((  NdefMap->SendRecvBuf[TempLength] <
27948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_NDEFTLV_L)?
27958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (NdefMap->SendRecvBuf[TempLength]
27968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            + PH_FRINFC_MIFARESTD_VAL2):
27978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_VAL0);
27988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
27998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if(( NdefMap->SendRecvBuf[TempLength] ==
28008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_VAL0))
28018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
28028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
28038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NFCSTATUS_INVALID_PARAMETER);
28048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
28058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
28068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
28078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
28088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
28098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* get the next TLV after the proprietary TLV */
28108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result =
28118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                ((NdefMap->SendRecvBuf[TempLength] <
28128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_NDEFTLV_L)?
28138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    phFriNfc_MifStd_H_GetNxtTLV(NdefMap, &TempLength, &TL4bytesFlag):
28148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NFCSTATUS_PENDING);
28158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
28168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if((TempLength >= PH_FRINFC_MIFARESTD_BYTES_READ) &&
28178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (Result == NFCSTATUS_SUCCESS))
28188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
28198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->TLVStruct.TcheckedinTLVFlag =
28208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_FLAG0;
28218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->TLVStruct.NoLbytesinTLV =
28228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_VAL0;
28238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
28248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
28258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                *CRFlag = (uint8_t)((Result != NFCSTATUS_PENDING)?
28268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG1:
28278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG0);
28288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
28298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
28308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else
28318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
28328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if(Result == NFCSTATUS_PENDING)
28338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
28348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG1;
28358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Result = ((NdefMap->SendRecvBuf[TempLength] ==
28368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_NDEFTLV_L) ?
28378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NFCSTATUS_SUCCESS:
28388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
28398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NFCSTATUS_INVALID_PARAMETER)));
28408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
28418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if(Result != NFCSTATUS_SUCCESS)
28428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
28438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
28448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        break;
28458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
28468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
28478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    TempLength++;
28488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    /* Check 0xFF */
28498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if(TempLength == PH_FRINFC_MIFARESTD_BYTES_READ)
28508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
28518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->TLVStruct.TcheckedinTLVFlag =
28528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                PH_FRINFC_MIFARESTD_FLAG1;
28538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->TLVStruct.NoLbytesinTLV =
28548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            PH_FRINFC_MIFARESTD_VAL2;
28558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
28568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Result = phFriNfc_MifStd_H_Chk16Bytes(  NdefMap,
28578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                            TempLength);
28588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if(Result != NFCSTATUS_SUCCESS)
28598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
28608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        break;
28618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
28628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
28638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    ShiftLength = NdefMap->SendRecvBuf[TempLength];
28648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    TempLength++;
28658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if(TempLength == PH_FRINFC_MIFARESTD_BYTES_READ)
28668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
28678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->TLVStruct.TcheckedinTLVFlag =
28688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                PH_FRINFC_MIFARESTD_FLAG1;
28698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->TLVStruct.NoLbytesinTLV =
28708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            PH_FRINFC_MIFARESTD_VAL1;
28718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->TLVStruct.prevLenByteValue =
28728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NdefMap->SendRecvBuf[(TempLength -
28738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                PH_FRINFC_MIFARESTD_VAL1)];
28748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
28758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Result = phFriNfc_MifStd_H_Chk16Bytes(  NdefMap,
28768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                            TempLength);
28778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if(Result != NFCSTATUS_SUCCESS)
28788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
28798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        break;
28808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
28818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
28828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
28838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if((((  NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
28848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->StdMifareContainer.NdefBlocks) *
28858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_BLOCK_BYTES) +
28868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (PH_FRINFC_MIFARESTD_BLOCK_BYTES -
28878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        TempLength)) <
28888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (( ShiftLength
28898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        << 8) + NdefMap->SendRecvBuf[TempLength]))
28908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
28918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
28928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NFCSTATUS_INVALID_REMOTE_DEVICE);
28938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
28948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        break;
28958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
28968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
28978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if(NdefMap->TLVStruct.NdefTLVFoundFlag ==
28988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG1)
28998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
29008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        ShiftLength = (( ShiftLength<< 8) +
29018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NdefMap->SendRecvBuf[TempLength]);
29028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->TLVStruct.BytesRemainLinTLV = ShiftLength;
29038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        Result = phFriNfc_MapTool_SetCardState(NdefMap,
29048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                                ShiftLength);
29058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->StdMifareContainer.remainingSize -=
29068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            PH_FRINFC_MIFARESTD_VAL4;
29078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
29088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        break;
29098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
29108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
29118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.remainingSize -=
29128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                ((ShiftLength<< 8) +
29138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)]);
29148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    TempLength++;
29158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
29168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    /* get the next TLV after the proprietary TLV */
29178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Result = phFriNfc_MifStd_H_GetNxtTLV(NdefMap, &TempLength, &TL4bytesFlag);
29188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
29198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if((TempLength >= PH_FRINFC_MIFARESTD_BYTES_READ) &&
29208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (Result == NFCSTATUS_SUCCESS))
29218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
29228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->TLVStruct.TcheckedinTLVFlag =
29238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                PH_FRINFC_MIFARESTD_FLAG0;
29248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->TLVStruct.NoLbytesinTLV =
29258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            PH_FRINFC_MIFARESTD_VAL0;
29268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
29278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
29288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        break;
29298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
29308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    break;
29318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
29328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
29338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
29348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else if((NdefMap->SendRecvBuf[TempLength] == PH_FRINFC_MIFARESTD_TERMTLV_T) &&
29358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (NdefMap->TLVStruct.NdefTLVFoundFlag == PH_FRINFC_MIFARESTD_FLAG0))
29368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
29378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
29388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NFCSTATUS_INVALID_PARAMETER);
29398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
29408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_FLAG1;
29418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
29428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
29438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
29448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else if(NdefMap->SendRecvBuf[TempLength] == PH_FRINFC_MIFARESTD_NULLTLV_T)
29458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
29468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
29478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NULLTLVCount += PH_FRINFC_MIFARESTD_VAL1;
29488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            ShiftLength = NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL1)];
29498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.remainingSize -= PH_FRINFC_MIFARESTD_VAL1;
29508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if(NdefMap->StdMifareContainer.remainingSize <
29518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (( ShiftLength << 8) + NdefMap->SendRecvBuf[TempLength]))
29528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
29538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
29548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NFCSTATUS_INVALID_REMOTE_DEVICE);
29558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
29568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
29578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = phFriNfc_MifStd_H_Chk16Bytes(  NdefMap,
29588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                    TempLength);
29598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if(Result != NFCSTATUS_SUCCESS)
29608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
29618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL0;
29628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                break;
29638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
29648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
29658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
29668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
29678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if((NdefMap->SendRecvBuf[TempLength] == PH_FRINFC_MIFARESTD_TERMTLV_T) &&
29688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (NdefMap->TLVStruct.NdefTLVFoundFlag == PH_FRINFC_MIFARESTD_FLAG1))
29698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
29708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                TempLength++;
29718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = NFCSTATUS_SUCCESS;
29728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.remainingSize -=
29738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                PH_FRINFC_MIFARESTD_VAL1;
29748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
29758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
29768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
29778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
29788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(NdefMap->TLVStruct.BytesRemainLinTLV >
29798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.remainingSize)
29808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
29818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
29828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NFCSTATUS_INVALID_FORMAT);
29838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
29848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
29858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
29868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->StdMifareContainer.remainingSize ==
29878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL0)
29888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
29898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = ((NdefMap->TLVStruct.NdefTLVFoundFlag ==
29908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG1)?
29918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NFCSTATUS_SUCCESS:
29928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
29938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NFCSTATUS_INVALID_PARAMETER)));
29948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
29958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
29968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
29978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
29988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
29998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
30008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
30018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_GetNxtTLV
30028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
30038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This is a Helper function to get the next TLV.
30048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
30058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
30068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
30078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
30088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
30098605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_GetNxtTLV(phFriNfc_NdefMap_t    *NdefMap,
30108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      uint16_t              *TempLength,
30118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                       uint8_t              *TL4bytesFlag)
30128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
30138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
30148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint16_t    LengthRemaining = PH_FRINFC_MIFARESTD_VAL0,
30158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                TempLen = PH_FRINFC_MIFARESTD_VAL0,
30168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                ShiftLength = PH_FRINFC_MIFARESTD_VAL0;
30178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
30188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    TempLen = (*TempLength);
30198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    LengthRemaining = (PH_FRINFC_MIFARESTD_BYTES_READ -
30208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (TempLen + PH_FRINFC_MIFARESTD_VAL1));
30218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
30228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(*TL4bytesFlag == PH_FRINFC_MIFARESTD_FLAG0)
30238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
30248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (*TempLength) += (NdefMap->SendRecvBuf[TempLen] +
30258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_VAL1);
30268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
30278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->TLVStruct.NdefTLVFoundFlag == PH_FRINFC_MIFARESTD_FLAG0)
30288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
30298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            LengthRemaining =
30308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (((*TempLength) < PH_FRINFC_MIFARESTD_BYTES_READ)?
30318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL0:
30328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (NdefMap->SendRecvBuf[TempLen] -
30338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                LengthRemaining));
30348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
30358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
30368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
30378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            LengthRemaining =
30388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (((*TempLength) < PH_FRINFC_MIFARESTD_BYTES_READ)?
30398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL0:
30408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (NdefMap->SendRecvBuf[TempLen] -
30418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                LengthRemaining));
30428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
30438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
30448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
30458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
30468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        *TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
30478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->TLVStruct.NoLbytesinTLV ==
30488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL1)
30498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
30508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            ShiftLength = NdefMap->TLVStruct.prevLenByteValue;
30518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (*TempLength) += ((ShiftLength
30528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                << 8) + NdefMap->SendRecvBuf[TempLen] +
30538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_VAL1);
30548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
30558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            LengthRemaining =
30568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (((ShiftLength
30578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                << 8) + NdefMap->SendRecvBuf[TempLen]) -
30588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                LengthRemaining);
30598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
30608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
30618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
30628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            ShiftLength = NdefMap->SendRecvBuf[(TempLen - PH_FRINFC_MIFARESTD_VAL1)];
30638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (*TempLength) += ((ShiftLength
30648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                << 8) + NdefMap->SendRecvBuf[TempLen] +
30658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_VAL1);
30668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
30678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            LengthRemaining =
30688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (((ShiftLength
30698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    << 8) + NdefMap->SendRecvBuf[TempLen]) -
30708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    LengthRemaining);
30718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
30728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
30738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
30748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->TLVStruct.NdefTLVByte =
30758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (uint8_t)(((*TempLength) < PH_FRINFC_MIFARESTD_BYTES_READ)?
30768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (*TempLength):
30778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (LengthRemaining % PH_FRINFC_MIFARESTD_BYTES_READ));
30788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
30798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    while(LengthRemaining != PH_FRINFC_MIFARESTD_VAL0)
30808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
30818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.currentBlock++;
30828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.NdefBlocks++;
30838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
30848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        LengthRemaining -=
30858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            ((LengthRemaining <= PH_FRINFC_MIFARESTD_BYTES_READ)?
30868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            LengthRemaining:
30878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_BYTES_READ);
30888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
30898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
30908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL0)
30918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
30928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.currentBlock++;
30938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.NdefBlocks++;
30948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
30958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
30968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
30978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
30988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
30998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
31008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
31018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_Chk16Bytes
31028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
31038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This Helper function is used to know whether the read
31048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  16 bytes are parsed completely.
31058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
31068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
31078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
31088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
31098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
31108605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_Chk16Bytes(phFriNfc_NdefMap_t   *NdefMap,
31118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                       uint16_t             TempLength)
31128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
31138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
31148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
31158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(TempLength == PH_FRINFC_MIFARESTD_BYTES_READ)
31168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
31178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.currentBlock++;
31188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.NdefBlocks++;
31198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
31208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
31218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result =
31228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            ((NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)?
31238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            phFriNfc_MifStd_H_GetActCardLen(NdefMap):
31248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            phFriNfc_MifStd_H_AuthSector(NdefMap));
31258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
31268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
31278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
31288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
31298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
31308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
31318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_ChkRemainTLVs
31328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
31338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function is used to know whether the read
31348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  16 bytes are parsed completely.
31358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
31368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
31378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
31388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
31398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
31408605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ChkRemainTLVs(phFriNfc_NdefMap_t *NdefMap,
31418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                          uint8_t            *CRFlag,
31428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                          uint8_t            *NDEFFlag)
31438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
31448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
31458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint16_t    TempLength = PH_FRINFC_MIFARESTD_VAL0,
31468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                ShiftLength = PH_FRINFC_MIFARESTD_VAL0;
31478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t     TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
31488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
31498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    switch(NdefMap->TLVStruct.NoLbytesinTLV)
31508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
31518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_VAL3:
31528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* if TLV is found then set card state */
31538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = ((NdefMap->TLVStruct.NdefTLVFoundFlag ==
31548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG1)?
31558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        phFriNfc_MapTool_SetCardState(NdefMap,
31568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->SendRecvBuf[TempLength]):
31578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        Result);
31588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
31598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = ((NdefMap->TLVStruct.NdefTLVFoundFlag ==
31608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG1)? 1 : Result);
31618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
31628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
31638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Check the length field is less than or
31648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao               equal to 0xFF if yes enter below statement
31658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao               else enter else if*/
31668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if((NdefMap->SendRecvBuf[TempLength] <
31678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_NDEFTLV_L) &&
31688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (Result == NFCSTATUS_SUCCESS))
31698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
31708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.remainingSize -=
31718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_VAL2;
31728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
31738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = ((NdefMap->SendRecvBuf[TempLength] >
31748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NdefMap->StdMifareContainer.remainingSize)?
31758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
31768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NFCSTATUS_INVALID_FORMAT)):
31778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            Result);
31788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
31798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if((NdefMap->TLVStruct.NdefTLVFoundFlag ==
31808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_FLAG1) &&
31818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (Result == NFCSTATUS_SUCCESS))
31828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
31838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->TLVStruct.BytesRemainLinTLV =
31848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->SendRecvBuf[TempLength];
31858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
31868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
31878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
31888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                else if(Result == NFCSTATUS_SUCCESS)
31898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
31908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    TempLength++;
31918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Result = phFriNfc_MifStd_H_GetNxtTLV(NdefMap,
31928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    &TempLength, &TL4bytesFlag);
31938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
31948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.remainingSize -=
31958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NdefMap->SendRecvBuf[TempLength];
31968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if((TempLength >= PH_FRINFC_MIFARESTD_BYTES_READ) &&
31978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (*CRFlag == PH_FRINFC_MIFARESTD_FLAG0))
31988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
31998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        *NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
32008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
32018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
32028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
32038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
32048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                else
32058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
32068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    /* do nothing */
32078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
32088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
32098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else if((NdefMap->SendRecvBuf[TempLength] ==
32108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_NDEFTLV_L) &&
32118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (Result == NFCSTATUS_SUCCESS))
32128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
32138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                TempLength++;
32148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.remainingSize -=
32158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_VAL4;
32168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
32178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = (((((uint16_t)NdefMap->SendRecvBuf[TempLength] << 8) +
32188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NdefMap->SendRecvBuf[(TempLength +
32198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_VAL1)]) >
32208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NdefMap->StdMifareContainer.remainingSize)?
32218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
32228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NFCSTATUS_INVALID_FORMAT)):
32238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                Result);
32248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if((NdefMap->TLVStruct.NdefTLVFoundFlag ==
32258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_FLAG1) &&
32268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (Result == NFCSTATUS_SUCCESS))
32278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
32288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
32298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->TLVStruct.BytesRemainLinTLV =
32308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                (((uint16_t)NdefMap->SendRecvBuf[TempLength] << 8) +
32318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NdefMap->SendRecvBuf[(TempLength +
32328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_VAL1)]);
32338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
32348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
32358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                else if(Result == NFCSTATUS_SUCCESS)
32368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
32378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    TempLength++;
32388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
32398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Result = phFriNfc_MifStd_H_GetNxtTLV(NdefMap,
32408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                &TempLength, &TL4bytesFlag);
32418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.remainingSize -=
32428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                (((uint16_t)NdefMap->SendRecvBuf[TempLength] << 8) +
32438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NdefMap->SendRecvBuf[(TempLength +
32448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_VAL1)]);
32458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
32468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    *NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
32478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
32488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
32498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                else
32508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
32518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    /* do nothing */
32528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
32538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
32548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
32558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else
32568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
32578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Result = Error */
32588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
32598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NFCSTATUS_INVALID_FORMAT);
32608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
32618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
32628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
32638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
32648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_VAL2:
32658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_VAL1:
32668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            ShiftLength = ((NdefMap->TLVStruct.NoLbytesinTLV ==
32678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_VAL1)?
32688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            ((NdefMap->TLVStruct.prevLenByteValue << 8) +
32698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NdefMap->SendRecvBuf[TempLength]):
32708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (((uint16_t)NdefMap->SendRecvBuf[TempLength] << 8) +
32718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NdefMap->SendRecvBuf[(TempLength +
32728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_VAL1)]));
32738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if((((  NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
32748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.NdefBlocks) *
32758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_BLOCK_BYTES) +
32768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (PH_FRINFC_MIFARESTD_BLOCK_BYTES -
32778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    TempLength)) <
32788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    ShiftLength)
32798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
32808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Result = Error */
32818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
32828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NFCSTATUS_INVALID_PARAMETER);
32838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
32848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
32858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else
32868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
32878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.remainingSize -=
32888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_VAL2;
32898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if(NdefMap->TLVStruct.NdefTLVFoundFlag ==
32908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG1)
32918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
32928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->TLVStruct.BytesRemainLinTLV = ShiftLength;
32938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if(NdefMap->TLVStruct.BytesRemainLinTLV >
32948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->StdMifareContainer.remainingSize)
32958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
32968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
32978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                NFCSTATUS_INVALID_FORMAT);
32988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
32998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
33008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    *NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
33018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
33028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                else
33038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
33048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.remainingSize -=
33058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        ShiftLength;
33068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    *CRFlag = PH_FRINFC_MIFARESTD_FLAG0;
33078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    TempLength += PH_FRINFC_MIFARESTD_VAL2;
33088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG1;
33098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Result = ((NdefMap->TLVStruct.NdefTLVFoundFlag == PH_FRINFC_MIFARESTD_FLAG1)?
33108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NFCSTATUS_SUCCESS:
33118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                phFriNfc_MifStd_H_GetNxtTLV(NdefMap, &TempLength, &TL4bytesFlag));
33128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
33138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    *NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
33148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
33158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
33168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
33178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
33188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
33198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        default:
33208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
33218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
33228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
33238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
33248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
33258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
33268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
33278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_Get1kStTrail
33288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
33298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function is used to get the Mifare 1k Sector Trailer.
33308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
33318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          void
33328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
33338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
33348605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd_H_Get1kStTrail(phFriNfc_NdefMap_t  *NdefMap)
33358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
33368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    switch((NdefMap->StdMifareContainer.currentBlock % 4))
33378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
33388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_VAL0:
33398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
33408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (NdefMap->StdMifareContainer.currentBlock +
33418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_MAD_BLK3);
33428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
33438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
33448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_VAL1:
33458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
33468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.currentBlock +
33478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_MAD_BLK2);
33488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
33498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
33508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_VAL2:
33518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
33528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.currentBlock +
33538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_MAD_BLK1);
33548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
33558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
33568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        default:
33578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
33588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->StdMifareContainer.currentBlock;
33598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
33608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
33618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
33628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return;
33638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
33648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
33658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
33668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_Get4kStTrail
33678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
33688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function gets the Mifare 4k Sector Trailer.
33698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
33708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          void
33718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
33728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
33738605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd_H_Get4kStTrail(phFriNfc_NdefMap_t  *NdefMap)
33748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
33758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    switch((NdefMap->StdMifareContainer.currentBlock % 16))
33768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
33778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_MAD_BLK0:
33788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
33798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (NdefMap->StdMifareContainer.currentBlock +
33808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_BLK15);
33818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
33828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
33838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_MAD_BLK1:
33848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
33858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.currentBlock +
33868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_BLK14);
33878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
33888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
33898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_MAD_BLK2:
33908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
33918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.currentBlock +
33928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_BLK13);
33938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
33948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
33958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_MAD_BLK3:
33968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
33978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.currentBlock +
33988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_BLK12);
33998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
34008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
34018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_BLK4:
34028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
34038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.currentBlock +
34048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_BLK11);
34058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
34068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
34078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_BLK5:
34088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
34098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.currentBlock +
34108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_BLK10);
34118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
34128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
34138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_BLK6:
34148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
34158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.currentBlock +
34168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_BLK9);
34178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
34188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
34198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_BLK7:
34208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
34218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.currentBlock +
34228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_BLK8);
34238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
34248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
34258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_BLK8:
34268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
34278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.currentBlock +
34288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_BLK7);
34298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
34308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
34318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_BLK9:
34328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
34338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.currentBlock +
34348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_BLK6);
34358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
34368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
34378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_BLK10:
34388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
34398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.currentBlock +
34408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_BLK5);
34418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
34428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
34438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_BLK11:
34448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
34458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.currentBlock +
34468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_BLK4);
34478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
34488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
34498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_BLK12:
34508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
34518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.currentBlock +
34528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_MAD_BLK3);
34538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
34548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
34558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_BLK13:
34568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
34578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.currentBlock +
34588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_MAD_BLK2);
34598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
34608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
34618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_BLK14:
34628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
34638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.currentBlock +
34648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_MAD_BLK1);
34658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
34668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
34678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        default:
34688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
34698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->StdMifareContainer.currentBlock;
34708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
34718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
34728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
34738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return;
34748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
34758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
34768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
34778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_ProChkNdef
34788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
34798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function processes the check ndef call.
34808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
34818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_PENDING in case of success
34828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
34838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
34848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
34858605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ProChkNdef(phFriNfc_NdefMap_t        *NdefMap)
34868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
34878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
34888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
34898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Copy remaining bytes into the AID array
34908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao       from Receive Buffer till array number 7 in aid */
34918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(NdefMap->StdMifareContainer.currentBlock ==
34928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        PH_FRINFC_MIFARESTD_VAL1)
34938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
34948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Helper Function to Store AID Information */
34958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        phFriNfc_MifStd_H_fillAIDarray(NdefMap);
34968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
34978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_VAL2;
34988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* read remaining AIDs from block number 2 */
34998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = ((NdefMap->StdMifareContainer.aidCompleteFlag ==
35008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG1)?
35018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result:
35028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                phFriNfc_MifareStdMap_ChkNdef( NdefMap));
35038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
35048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else if(((NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD) &&
35058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->StdMifareContainer.currentBlock ==
35068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_MAD_BLK2)) || (
35078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->StdMifareContainer.currentBlock ==
35088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_MAD_BLK66) &&
35098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->CardType ==
35108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD ||
35118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->CardType ==
35128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD)))
35138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
35148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Helper Function to Store AID Information */
35158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        phFriNfc_MifStd_H_fillAIDarray(NdefMap);
35168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
35178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.aidCompleteFlag =
35188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG1;
35198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    } /* Mifare 1k and Mifare 4k end Check */
35208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else if((NdefMap->StdMifareContainer.currentBlock >
35218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL1) &&
35228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->CardType ==
35238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD ||
35248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->CardType ==
35258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD))
35268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
35278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        phFriNfc_MifStd_H_fillAIDarray(NdefMap);
35288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* read remaining AIDs from block number 2 */
35298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Mifare 4k Helper Function */
35308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = ((NdefMap->StdMifareContainer.aidCompleteFlag ==
35318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_FLAG1)?
35328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Result:
35338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    phFriNfc_MifStd4k_H_CheckNdef(NdefMap));
35348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    } /* Card Type 4k Check */
35358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
35368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
35378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Since we have decided temporarily not to go
35388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           for any new error codes we are using
35398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           NFCSTATUS_INVALID_PARAMETER even though it is not
35408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           the relevant error code here TBD */
35418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = PHNFCSTVAL(    CID_FRI_NFC_NDEF_MAP,
35428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NFCSTATUS_INVALID_PARAMETER);
35438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
35448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
35458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(NdefMap->StdMifareContainer.aidCompleteFlag ==
35468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG1)
35478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
35488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.ChkNdefCompleteFlag =
35498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG1;
35508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /*  The check for NDEF compliant information is now over for
35518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            the Mifare 1K card.
35528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Update(decrement) the NoOfNdefCompBlocks as much required,
35538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            depending on the NDEF compliant information found */
35548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Check the Sectors are Ndef Compliant */
35558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        phFriNfc_MifStd_H_ChkNdefCmpltSects(NdefMap);
35568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if((NdefMap->StdMifareContainer.NoOfNdefCompBlocks == 0) ||
35578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->StdMifareContainer.NoOfNdefCompBlocks > 255))
35588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
35598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
35608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NFCSTATUS_NO_NDEF_SUPPORT);
35618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
35628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
35638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
35648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.aidCompleteFlag =
35658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG0;
35668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.NFCforumSectFlag =
35678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_FLAG0;
35688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_BLK4;
35698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
35708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = ((Result != NFCSTATUS_SUCCESS)?
35718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        Result:phFriNfc_MifStd_H_AuthSector(NdefMap));
35728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
35738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
35748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
35758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
35768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
35778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
35788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
35798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
35808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_ProAuth
35818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
35828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function process the authentication of a sector.
35838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
35848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
35858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
35868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
35878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
35888605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ProAuth(phFriNfc_NdefMap_t       *NdefMap)
35898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
35908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
35918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
35928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(NdefMap->TLVStruct.NdefTLVAuthFlag ==
35938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao       PH_FRINFC_MIFARESTD_FLAG1)
35948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
35958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.NdefTLVAuthFlag =
35968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_FLAG0;
35978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG1;
35988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
35998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
36008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
36018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
36028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.AuthDone = 1;
36038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.ReadAcsBitFlag = 1;
36048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = phFriNfc_MifStd_H_RdAcsBit(NdefMap);
36058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
36068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
36078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
36088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
36098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
36108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
36118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_Rd16Bytes
36128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
36138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function reads 16 bytes from a specifed block no.
36148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
36158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_PENDING in case of success
36168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
36178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
36188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
36198605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_Rd16Bytes(phFriNfc_NdefMap_t     *NdefMap,
36208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                              uint8_t               BlockNo)
36218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
36228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
36238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
36248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = BlockNo;
36258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_READ;
36268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
36278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->Cmd.MfCmd = phHal_eMifareRead;
36288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
36298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->MapCompletionInfo.Context = NdefMap;
36308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
36318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Call the Overlapped HAL Transceive function */
36328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    Result = phFriNfc_ExtnsTransceive(NdefMap->pTransceiveInfo,
36338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->Cmd,
36348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->SendRecvBuf,
36358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->SendLength,
36368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->SendRecvLength);
36378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
36388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
36398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
36408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
36418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
36428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_ProAcsBits
36438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
36448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      It processes access bits of the sector trailer.
36458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
36468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
36478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
36488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
36498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
36508605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ProAcsBits(phFriNfc_NdefMap_t        *NdefMap)
36518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
36528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
36538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t     CRFlag = PH_FRINFC_MIFARESTD_FLAG0;
36548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
36558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ)
36568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
36578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->StdMifareContainer.ReadAcsBitFlag ==
36588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG1)
36598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
36608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* check for the correct access bits */
36618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = phFriNfc_MifStd_H_ChkAcsBit(NdefMap);
36628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
36638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if((NdefMap->StdMifareContainer.ChkNdefFlag ==
36648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG1) &&
36658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (Result == NFCSTATUS_SUCCESS))
36668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
36678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if(NdefMap->CardState ==
36688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_NDEFMAP_CARD_STATE_INVALID)
36698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
36708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.NoOfNdefCompBlocks =
36718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    ((NdefMap->StdMifareContainer.currentBlock >=
36728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD4K_BLK128)?
36738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
36748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_BLK15):
36758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
36768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_MAD_BLK3));
36778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
36788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.ProprforumSectFlag =
36798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        ((NdefMap->StdMifareContainer.NFCforumSectFlag ==
36808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG1)?
36818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_PROP_2ND_CONFIG:
36828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_PROP_3RD_CONFIG);
36838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
36848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Result = phFriNfc_MifStd_H_ProStatNotValid(NdefMap, Result);
36858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
36868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                else
36878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
36888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.NFCforumSectFlag =
36898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (((NdefMap->StdMifareContainer.currentBlock == 64) &&
36908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD)||
36918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD))?
36928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->StdMifareContainer.NFCforumSectFlag:
36938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            PH_FRINFC_MIFARESTD_FLAG1);
36948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
36958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
36968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if(NdefMap->StdMifareContainer.ProprforumSectFlag !=
36978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_PROP_2ND_CONFIG)
36988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
36998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.ReadAcsBitFlag = PH_FRINFC_MIFARESTD_FLAG0;
37008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                /* ((NdefMap->StdMifareContainer.ReadCompleteFlag ==
37018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_FLAG1)?
37028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_FLAG0:
37038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_FRINFC_MIFARESTD_FLAG1);*/
37048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
37058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.ReadCompleteFlag =
37068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (uint8_t)((((((NdefMap->StdMifareContainer.currentBlock +
37078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_VAL4) >=
37088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD1K_MAX_BLK) &&
37098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->CardType ==
37108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD)) &&
37118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.ReadCompleteFlag ==
37128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG0)) ||
37138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.ReadCompleteFlag ==
37148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG1))?
37158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG1:
37168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG0);
37178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
37188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.ReadCompleteFlag =
37198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (uint8_t)((((((uint16_t)(NdefMap->StdMifareContainer.currentBlock +
37208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_VAL4) >=
37218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD4K_MAX_BLK) &&
37228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->CardType ==
37238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD)) &&
37248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.ReadCompleteFlag ==
37258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG0)) ||
37268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.ReadCompleteFlag ==
37278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG1))?
37288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG1:
37298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG0);
37308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
37318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.ReadCompleteFlag =
37328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (uint8_t)((((((uint16_t)(NdefMap->StdMifareContainer.currentBlock +
37338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_VAL4) >=
37348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD4K_MAX_BLK) &&
37358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->CardType ==
37368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD)) &&
37378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.ReadCompleteFlag ==
37388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG0)) ||
37398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->StdMifareContainer.ReadCompleteFlag ==
37408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG1))?
37418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG1:
37428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG0);
37438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
37448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.currentBlock =
37458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        ((NdefMap->StdMifareContainer.ReadCompleteFlag ==
37468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG1)?
37478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_BLK4:
37488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NdefMap->StdMifareContainer.currentBlock);
37498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
37508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Result =
37518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    ((NdefMap->StdMifareContainer.ReadCompleteFlag ==
37528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG1)?
37538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            phFriNfc_MifStd_H_BlkChk(NdefMap):
37548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            Result);
37558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
37568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
37578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
37588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = ((Result != NFCSTATUS_SUCCESS)?
37598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        Result:
37608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        phFriNfc_MifStd_H_ChkRdWr(NdefMap));
37618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
37628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
37638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
37648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.ChkNdefFlag =
37658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG0;
37668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Here its required to read the entire card to know the */
37678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Get exact ndef size of the card */
37688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = phFriNfc_MifStd_H_ChkTLVs(NdefMap, &CRFlag);
37698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
37708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
37718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
37728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
37738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Since we have decided temporarily not to go
37748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           for any new error codes we are using
37758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           NFCSTATUS_INVALID_PARAMETER even though it is not
37768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           the relevant error code here TBD */
37778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = PHNFCSTVAL(    CID_FRI_NFC_NDEF_MAP,
37788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NFCSTATUS_INVALID_PARAMETER);
37798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
37808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
37818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
37828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
37838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
37848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
37858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_GPBChk
37868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
37878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function is checks the GPB bytes.
37888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
37898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
37908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
37918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
37928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
37938605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_GPBChk(phFriNfc_NdefMap_t        *NdefMap)
37948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
37958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS Result = NFCSTATUS_SUCCESS;
37968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
37978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Spec version needs to be checked every time (Version check is not enabled) */
37988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Result = phFriNfc_MapTool_ChkSpcVer(NdefMap, PH_FRINFC_MIFARESTD_VAL9); */
37998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
38008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Check rhe read and write access field
38018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        in GPB is 00b
38028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        bit 0 and 1 for write access check
38038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        bit 2 and 3 for read access check */
38048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(Result == NFCSTATUS_SUCCESS)
38058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
38068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(((NdefMap->SendRecvBuf[
38078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL9] &
38088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_MASK_GPB_WR) ==
38098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_GPB_RD_WR_VAL) &&
38108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            ((NdefMap->SendRecvBuf[
38118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL9] &
38128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_MASK_GPB_RD) ==
38138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_GPB_RD_WR_VAL))
38148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
38158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->CardState = (((NdefMap->StdMifareContainer.ChkNdefFlag ==
38168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_FLAG1) ||
38178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    (NdefMap->StdMifareContainer.ReadNdefFlag ==
38188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_FLAG1) ||
38198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    (NdefMap->StdMifareContainer.WrNdefFlag ==
38208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_FLAG1))?
38218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_NDEFMAP_CARD_STATE_INITIALIZED:
38228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_NDEFMAP_CARD_STATE_READ_WRITE);
38238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
38248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else if(((NdefMap->SendRecvBuf[
38258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL9] &
38268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_MASK_GPB_WR) !=
38278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_GPB_RD_WR_VAL) &&
38288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            ((NdefMap->SendRecvBuf[
38298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL9] &
38308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_MASK_GPB_RD) ==
38318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_GPB_RD_WR_VAL))
38328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
38338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* write access not given
38348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            only read access check */
38358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->CardState = PH_NDEFMAP_CARD_STATE_READ_ONLY;
38368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
38378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
38388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
38398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
38408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
38418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
38428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
38438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
38448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
38458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
38468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
38478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_ProStatNotValid
38488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
38498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function checks for the different status value in the
38508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  process because of proprietary forum sector.
38518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
38528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
38538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
38548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
38558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
38568605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ProStatNotValid(phFriNfc_NdefMap_t        *NdefMap,
38578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                   NFCSTATUS                 status)
38588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
38598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS Result = status;
38608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
38618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* if NFC forum sector is not found before the proprietary one then
38628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao       authenticate the next sector
38638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao       Else it is a error*/
38648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(NdefMap->StdMifareContainer.NFCforumSectFlag ==
38658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        PH_FRINFC_MIFARESTD_FLAG0)
38668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
38678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.ProprforumSectFlag =
38688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_PROP_3RD_CONFIG;
38698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->StdMifareContainer.currentBlock <
38708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD4K_BLK128)
38718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
38728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao             /* Fix for the disovery problem,
38738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if 1st sector is invalid then ignore the remaining sectors and
38748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                send an error if the card is mifare 1k,
38758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if the card is mifare 4k, then update the block number to 67 and
38768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                continue.
38778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Even if the authentication of that block fails then send error */
38788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if(((NdefMap->StdMifareContainer.currentBlock <
38798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_BLK4) &&
38808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD)) ||
38818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                ((NdefMap->StdMifareContainer.currentBlock <=
38828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_MAD_BLK67) &&
38838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD ||
38848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                 NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD)))
38858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
38868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
38878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NFCSTATUS_NO_NDEF_SUPPORT);
38888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
38898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else if((NdefMap->StdMifareContainer.currentBlock <
38908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_BLK4) &&
38918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD ||
38928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                 NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD))
38938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
38948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = NFCSTATUS_SUCCESS;
38958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.currentBlock =
38968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_MAD_BLK67;
38978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
38988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else if(((NdefMap->StdMifareContainer.currentBlock +
38998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_BLK4) >
39008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD1K_MAX_BLK) &&
39018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD))
39028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
39038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
39048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NFCSTATUS_NO_NDEF_SUPPORT);
39058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
39068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else
39078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
39088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.remainingSize -=
39098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (PH_FRINFC_MIFARESTD_MAD_BLK3 * PH_FRINFC_MIFARESTD_BLOCK_BYTES);
39108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.currentBlock +=
39118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_BLK4;
39128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
39138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
39148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
39158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else if((NdefMap->StdMifareContainer.currentBlock +
39168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_BLK15) >
39178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD4K_MAX_BLK)
39188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
39198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
39208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NFCSTATUS_NO_NDEF_SUPPORT);
39218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
39228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
39238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
39248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.remainingSize -=
39258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (PH_FRINFC_MIFARESTD_BLK15 * PH_FRINFC_MIFARESTD_BLOCK_BYTES);
39268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.currentBlock +=
39278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_BLOCK_BYTES;
39288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
39298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
39308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = ((Result != NFCSTATUS_SUCCESS)?
39318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
39328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NFCSTATUS_NO_NDEF_SUPPORT)):
39338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                phFriNfc_MifStd_H_AuthSector(NdefMap));
39348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
39358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else if((NdefMap->StdMifareContainer.ProprforumSectFlag ==
39368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_PROP_3RD_CONFIG) &&
39378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->StdMifareContainer.NFCforumSectFlag ==
39388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG1))
39398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
39408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /*  if the proprietary forum sector are found before
39418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NFC forum sector then again a proprietary
39428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            forum sector are found after the NFC forum
39438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            sector */
39448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
39458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NFCSTATUS_NO_NDEF_SUPPORT);
39468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
39478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
39488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
39498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.ProprforumSectFlag =
39508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_PROP_2ND_CONFIG;
39518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        switch(NdefMap->PrevOperation)
39528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
39538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_NDEFMAP_CHECK_OPE:
39548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_NDEFMAP_GET_ACTSIZE_OPE:
39558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
39568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NFCSTATUS_NO_NDEF_SUPPORT);
39578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
39588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
39598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_NDEFMAP_READ_OPE:
39608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if((NdefMap->TLVStruct.NdefTLVFoundFlag ==
39618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG1) &&
39628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (NdefMap->TLVStruct.NoLbytesinTLV ==
39638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL0))
39648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
39658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
39668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = NFCSTATUS_SUCCESS;
39678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
39688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else
39698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
39708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
39718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NFCSTATUS_NO_NDEF_SUPPORT);
39728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
39738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
39748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
39758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_NDEFMAP_WRITE_OPE:
39768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        default:
39778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* This means the further write is not possible,
39788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao               EOF_NDEF_CONTAINER_REACHED */
39798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
39808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_FLAG1;
39818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Write the length to the L field in the TLV */
39828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.TempBlockNo =
39838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->StdMifareContainer.currentBlock;
39848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            phFriNfc_MifStd_H_SetNdefBlkAuth(NdefMap);
39858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.currentBlock =
39868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NdefMap->TLVStruct.NdefTLVBlock;
39878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
39888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
39898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
39908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
39918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
39928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
39938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
39948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
39958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
39968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_RdBeforeWr
39978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
39988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function is used to read the NDEF TLV block.
39998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
40008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
40018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
40028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
40038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
40048605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_RdBeforeWr(phFriNfc_NdefMap_t        *NdefMap)
40058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
40068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS Result = NFCSTATUS_SUCCESS;
40078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
40088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_BEF_WR;
40098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
40108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
40118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    Result = phFriNfc_MifStd_H_Rd16Bytes(NdefMap,
40128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.currentBlock);
40138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
40148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
40158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
40168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
40178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
40188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_ProBytesToWr
40198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
40208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function processes the NDEF TLV block read bytes to
40218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  start write from the NDEF TLV.
40228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
40238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
40248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
40258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
40268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
40278605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ProBytesToWr(phFriNfc_NdefMap_t        *NdefMap)
40288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
40298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
40308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t     TempLength = PH_FRINFC_MIFARESTD_VAL0;
40318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
40328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ)
40338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
40348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        memcpy(&NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL1],
40358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->SendRecvBuf,
40368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_BLOCK_BYTES);
40378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
40388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Write to Ndef TLV Block */
40398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
40408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NdefMap->StdMifareContainer.currentBlock;
40418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
40428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        TempLength = ((NdefMap->StdMifareContainer.currentBlock ==
40438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->TLVStruct.NdefTLVBlock)?
40448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        phFriNfc_MifStd_H_UpdateTLV(NdefMap):
40458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        phFriNfc_MifStd_H_UpdRemTLV(NdefMap));
40468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
40478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.remainingSize -=
40488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            ((NdefMap->StdMifareContainer.remSizeUpdFlag ==
40498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG1)?
40508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL2:
40518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL0);
40528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
40538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.remSizeUpdFlag = PH_FRINFC_MIFARESTD_FLAG0;
40548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WR_TLV;
40558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = ((TempLength == PH_FRINFC_MIFARESTD_BLOCK_BYTES)?
40568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    phFriNfc_MifStd_H_WrTLV(NdefMap):
40578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    phFriNfc_MifStd_H_fillSendBuf(NdefMap, TempLength));
40588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
40598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
40608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
40618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
40628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NFCSTATUS_READ_FAILED);
40638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
40648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
40658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
40668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
40678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
40688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
40698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_UpdateTLV
40708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
40718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function writes ndef to add the TLV structure.
40728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
40738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          uint8_t     TempLength
40748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
40758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
40768605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic uint8_t phFriNfc_MifStd_H_UpdateTLV(phFriNfc_NdefMap_t *NdefMap)
40778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
40788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t     TempLength = PH_FRINFC_MIFARESTD_VAL0;
40798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
40808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    TempLength = (uint8_t)(NdefMap->TLVStruct.NdefTLVByte + PH_FRINFC_MIFARESTD_VAL1);
40818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Creating TLV */
40828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(NdefMap->TLVStruct.NULLTLVCount >= 2)
40838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
40848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if((PH_FRINFC_MIFARESTD_BYTES_READ - TempLength) ==
40858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL0)
40868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
40878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
40888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
40898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
40908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
40918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
40928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
40938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
40948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
40958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
40968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
40978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
40988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        switch((PH_FRINFC_MIFARESTD_BYTES_READ -
40998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                TempLength))
41008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
41018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_VAL0:
41028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
41038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        break;
41048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
41058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_VAL1:
41068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
41078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
41088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.prevLenByteValue =
41098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    (uint16_t)((NdefMap->SendRecvBuf[TempLength] >=
41108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_NDEFTLV_L)?
41118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_VAL0:
41128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NdefMap->SendRecvBuf[TempLength]);
41138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
41148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        break;
41158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
41168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_VAL2:
41178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
41188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
41198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.prevLenByteValue =
41208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    (uint16_t)((NdefMap->SendRecvBuf[TempLength] >=
41218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_NDEFTLV_L)?
41228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NdefMap->SendRecvBuf[(TempLength +
41238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                PH_FRINFC_MIFARESTD_VAL1)]:
41248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NdefMap->SendRecvBuf[TempLength]);
41258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
41268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
41278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
41288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        break;
41298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
41308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        default:
41318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.prevLenByteValue =
41328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NdefMap->SendRecvBuf[TempLength];
41338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
41348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
41358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
41368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
41378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
41388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
41398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
41408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        break;
41418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
41428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
41438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
41448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return TempLength;
41458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
41468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
41478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
41488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_fillSendBuf
41498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
41508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      It fill the send buffer to write.
41518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
41528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
41538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
41548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
41558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
41568605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_fillSendBuf(phFriNfc_NdefMap_t        *NdefMap,
41578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                               uint8_t                   Length)
41588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
41598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
41608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint16_t    RemainingBytes = PH_FRINFC_MIFARESTD_VAL0,
41618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                BytesToWrite = PH_FRINFC_MIFARESTD_VAL0;
41628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t     index = PH_FRINFC_MIFARESTD_VAL0;
41638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
41648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    Length = (Length + PH_FRINFC_MIFARESTD_VAL1);
41658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
41668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    RemainingBytes = (uint16_t)((NdefMap->StdMifareContainer.remainingSize
41678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        < (uint16_t)(NdefMap->ApduBufferSize -
41688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->ApduBuffIndex))?
41698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->StdMifareContainer.remainingSize:
41708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (NdefMap->ApduBufferSize -
41718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->ApduBuffIndex));
41728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
41738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
41748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NdefMap->StdMifareContainer.currentBlock;
41758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Get the number of bytes that can be written after copying
41768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao       the internal buffer */
41778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    BytesToWrite = ((RemainingBytes <
41788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    ((PH_FRINFC_MIFARESTD_WR_A_BLK - Length) -
41798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.internalLength))?
41808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    RemainingBytes:
41818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    ((PH_FRINFC_MIFARESTD_WR_A_BLK - Length) -
41828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.internalLength));
41838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
41848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(NdefMap->StdMifareContainer.internalLength >
41858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        PH_FRINFC_MIFARESTD_VAL0)
41868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
41878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* copy the internal buffer to the send buffer */
41888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        memcpy(&(NdefMap->SendRecvBuf[
41898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Length]),
41908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.internalBuf,
41918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.internalLength);
41928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
41938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
41948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Copy Bytes to write in the send buffer */
41958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    memcpy(&(NdefMap->SendRecvBuf[
41968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (Length +
41978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.internalLength)]),
41988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                &(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex]),
41998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                BytesToWrite);
42008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
42018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* update number of bytes written from the user buffer */
42028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->NumOfBytesWritten = BytesToWrite;
42038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
42048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* check the exact number of bytes written to a block including the
42058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        internal length */
42068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    *NdefMap->DataCount =
42078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            ((BytesToWrite + NdefMap->StdMifareContainer.internalLength
42088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            + Length) - PH_FRINFC_MIFARESTD_VAL1);
42098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
42108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* if total bytes to write in the card is less than 4 bytes then
42118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    pad zeroes till 4 bytes */
42128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if((BytesToWrite + NdefMap->StdMifareContainer.internalLength +
42138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Length) < PH_FRINFC_MIFARESTD_WR_A_BLK)
42148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
42158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        for(index = (uint8_t)(BytesToWrite +
42168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.internalLength +
42178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Length);
42188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            index < PH_FRINFC_MIFARESTD_WR_A_BLK;
42198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            index++)
42208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
42218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->SendRecvBuf[index] = (uint8_t)((index ==
42228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    (BytesToWrite + Length +
42238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NdefMap->StdMifareContainer.internalLength))?
42248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_TERMTLV_T:
42258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_MIFARESTD_NULLTLV_T);
42268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
42278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
42288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
42298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
42308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
42318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
42328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
42338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* A temporary buffer to hold four bytes of data that is
42348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao       written to the card */
42358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    memcpy(NdefMap->StdMifareContainer.Buffer,
42368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                &(NdefMap->SendRecvBuf[
42378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL1]),
42388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_BLOCK_BYTES);
42398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
42408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WR_TLV;
42418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    Result = phFriNfc_MifStd_H_WrTLV(NdefMap);
42428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
42438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
42448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
42458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
42468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
42478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_WrTLV
42488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
42498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function writes 16 bytes in a block.
42508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
42518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
42528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
42538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
42548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
42558605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_WrTLV(phFriNfc_NdefMap_t        *NdefMap)
42568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
42578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
42588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
42598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
42608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->MapCompletionInfo.Context = NdefMap;
42618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Write from here */
42628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_WRITE;
42638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
42648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->Cmd.MfCmd = phHal_eMifareWrite16;
42658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
42668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
42678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
42688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Call the Overlapped HAL Transceive function */
42698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    Result = phFriNfc_ExtnsTransceive(NdefMap->pTransceiveInfo,
42708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->Cmd,
42718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->SendRecvBuf,
42728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->SendLength,
42738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->SendRecvLength);
42748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
42758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
42768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
42778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
42788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
42798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
42808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_ProWrTLV
42818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
42828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function processes the write TLV bytes in a block.
42838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
42848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCESS in case of success
42858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
42868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
42878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
42888605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ProWrTLV(phFriNfc_NdefMap_t        *NdefMap)
42898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
42908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
42918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
42928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Check that if complete TLV has been written in the
42938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao       card if yes enter the below check or go to else*/
42948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(((((PH_FRINFC_MIFARESTD_BLOCK_BYTES -
42958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVByte) ==
42968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL1) &&
42978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->TLVStruct.NULLTLVCount >=
42988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL2)) ||
42998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (((PH_FRINFC_MIFARESTD_BLOCK_BYTES -
43008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVByte) <=
43018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL3) &&
43028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->TLVStruct.NULLTLVCount ==
43038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_VAL0))) &&
43048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->StdMifareContainer.currentBlock ==
43058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVBlock))
43068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
43078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* increment the block and chekc the block is in the same sector
43088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           using the block check function */
43098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.RdBeforeWrFlag = PH_FRINFC_MIFARESTD_FLAG1;
43108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.currentBlock++;
43118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.NdefBlocks++;
43128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
43138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(Result == NFCSTATUS_SUCCESS)
43148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
43158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = ((NdefMap->StdMifareContainer.AuthDone ==
43168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_FLAG0)?
43178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        phFriNfc_MifStd_H_AuthSector(NdefMap):
43188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        phFriNfc_MifStd_H_RdBeforeWr(NdefMap));
43198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
43208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
43218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
43228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
43238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.RdBeforeWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
43248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->ApduBuffIndex <
43258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (uint16_t)NdefMap->ApduBufferSize)
43268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
43278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if(*NdefMap->DataCount < PH_FRINFC_MIFARESTD_BLOCK_BYTES)
43288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
43298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Write complete, so next byte shall be */
43308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.internalLength =
43318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    *NdefMap->DataCount;
43328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
43338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Copy bytes less than 16 to internal buffer
43348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                   for the next write this can be used */
43358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                memcpy( NdefMap->StdMifareContainer.internalBuf,
43368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->StdMifareContainer.Buffer,
43378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->StdMifareContainer.internalLength);
43388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
43398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
43408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Increment the Send Buffer index */
43418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao             NdefMap->ApduBuffIndex += NdefMap->NumOfBytesWritten;
43428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
43438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao             NdefMap->StdMifareContainer.remainingSize -=
43448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        NdefMap->NumOfBytesWritten;
43458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
43468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao             /* Check for the End of Card */
43478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if((NdefMap->StdMifareContainer.remainingSize  ==
43488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL0) ||
43498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (NdefMap->ApduBuffIndex == NdefMap->ApduBufferSize))
43508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
43518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
43528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (uint8_t)((NdefMap->StdMifareContainer.remainingSize  == 0)?
43538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_FLAG1:PH_FRINFC_MIFARESTD_FLAG0);
43548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
43558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if(NdefMap->StdMifareContainer.internalLength ==
43568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_VAL0)
43578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
43588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.currentBlock++;
43598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    /* Mifare 4k Card, After 128th Block
43608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    each sector = 16 blocks in Mifare 4k */
43618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
43628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.NdefBlocks++;
43638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
43648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
43658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->TLVStruct.SetTermTLVFlag =
43668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (uint8_t)(((NdefMap->StdMifareContainer.remainingSize ==
43678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_VAL0) ||
43688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (NdefMap->TLVStruct.SetTermTLVFlag ==
43698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG1))?
43708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG1:
43718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG0);
43728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
43738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
43748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else
43758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
43768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.currentBlock++;
43778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Mifare 4k Card, After 128th Block
43788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                each sector = 16 blocks in Mifare 4k */
43798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
43808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if(Result == NFCSTATUS_SUCCESS)
43818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
43828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.NdefBlocks++;
43838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Result = ((NdefMap->StdMifareContainer.AuthDone ==
43848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_FLAG1)?
43858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                phFriNfc_MifStd_H_WrABlock(NdefMap):
43868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                phFriNfc_MifStd_H_AuthSector(NdefMap));
43878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
43888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
43898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
43908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
43918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
43928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if((Result == NFCSTATUS_SUCCESS) &&
43938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (NdefMap->TLVStruct.SetTermTLVFlag !=
43948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        PH_FRINFC_MIFARESTD_FLAG1) &&
43958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (NdefMap->StdMifareContainer.remainingSize >
43968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        PH_FRINFC_MIFARESTD_VAL0))
43978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
43988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = phFriNfc_MifStd_H_WrTermTLV(NdefMap);
43998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
44008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
44018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
44028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if((Result == NFCSTATUS_SUCCESS) &&
44038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->TLVStruct.SetTermTLVFlag ==
44048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG1))
44058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
44068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Write the length to the L field in the TLV */
44078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.TempBlockNo =
44088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->StdMifareContainer.currentBlock;
44098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            phFriNfc_MifStd_H_SetNdefBlkAuth(NdefMap);
44108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.currentBlock =
44118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NdefMap->TLVStruct.NdefTLVBlock;
44128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
44138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
44148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
44158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
44168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
44178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
44188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
44198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
44208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_UpdRemTLV
44218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
44228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function updates the remaining TLV.
44238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
44248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          uint8_t     TempLength : length value
44258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
44268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
44278605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic uint8_t phFriNfc_MifStd_H_UpdRemTLV(phFriNfc_NdefMap_t        *NdefMap)
44288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
44298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t     TempLength = PH_FRINFC_MIFARESTD_VAL1;
44308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
44318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(NdefMap->TLVStruct.NULLTLVCount >=
44328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        PH_FRINFC_MIFARESTD_VAL2)
44338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
44348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.prevLenByteValue = NdefMap->SendRecvBuf[TempLength];
44358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[TempLength] =
44368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_NDEFTLV_L0;
44378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
44388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
44398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
44408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        switch((PH_FRINFC_MIFARESTD_BLOCK_BYTES -
44418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVByte))
44428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
44438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_VAL1:
44448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.prevLenByteValue =
44458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (((NdefMap->SendRecvBuf[TempLength] ==
44468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_NDEFTLV_L))?
44478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (((uint16_t)NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)]
44488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    << PH_FRINFC_MIFARESTD_LEFTSHIFT8) +
44498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL2)]):
44508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->SendRecvBuf[TempLength]);
44518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
44528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
44538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
44548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
44558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
44568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
44578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
44588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_VAL2:
44598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.prevLenByteValue =
44608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (((NdefMap->SendRecvBuf[TempLength] ==
44618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_NDEFTLV_L))?
44628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (((uint16_t)NdefMap->SendRecvBuf[TempLength] <<
44638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_LEFTSHIFT8) +
44648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)]):
44658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->SendRecvBuf[TempLength]);
44668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
44678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
44688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
44698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
44708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
44718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        case PH_FRINFC_MIFARESTD_VAL3:
44728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        default:
44738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.prevLenByteValue =
44748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            ((NdefMap->TLVStruct.prevLenByteValue <<
44758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            PH_FRINFC_MIFARESTD_LEFTSHIFT8)
44768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                            + NdefMap->SendRecvBuf[TempLength]);
44778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
44788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            break;
44798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
44808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
44818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
44828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return TempLength;
44838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
44848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
44858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
44868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_fillTLV1
44878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
44888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function updates the length field if more than one
44898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  NULL TLVs exists before of the NDEF TLV.
44908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
44918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          void
44928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
44938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
44948605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd_H_fillTLV1(phFriNfc_NdefMap_t        *NdefMap)
44958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
44968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t     TempLength = (uint8_t)(NdefMap->TLVStruct.NdefTLVByte +
44978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_VAL1);
44988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
44998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->TLVStruct.prevLenByteValue =
45008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    ((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_CUR)?
45018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (NdefMap->TLVStruct.prevLenByteValue +
45028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->ApduBuffIndex):
45038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->ApduBuffIndex);
45048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
45058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG1;
45068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    switch(NdefMap->TLVStruct.NdefTLVByte)
45078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
45088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    case PH_FRINFC_MIFARESTD_VAL0:
45098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->TLVStruct.prevLenByteValue >=
45108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_NDEFTLV_L)
45118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
45128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] =
45138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
45148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
45158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[(TempLength +
45168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_VAL1)] =
45178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
45188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
45198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
45208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
45218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] =
45228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_NDEFTLV_T;
45238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[(TempLength +
45248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_VAL1)] =
45258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
45268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
45278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.RdAfterWrFlag =
45288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_FLAG0;
45298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
45308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        break;
45318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
45328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    case PH_FRINFC_MIFARESTD_VAL1:
45338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->TLVStruct.prevLenByteValue >=
45348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_NDEFTLV_L)
45358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
45368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength - PH_FRINFC_MIFARESTD_VAL1] =
45378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_NDEFTLV_L;
45388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] =
45398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
45408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
45418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[(TempLength +
45428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_VAL1)] =
45438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
45448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
45458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
45468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
45478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] =
45488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_NDEFTLV_T;
45498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[(TempLength +
45508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_VAL1)] =
45518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
45528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.RdAfterWrFlag =
45538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_FLAG0;
45548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
45558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        break;
45568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
45578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    case PH_FRINFC_MIFARESTD_VAL15:
45588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* if "Type" of TLV present at byte 15 */
45598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->TLVStruct.prevLenByteValue >=
45608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_NDEFTLV_L)
45618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
45628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Update the null TLV, ndef TLV block and ndef TLV byte */
45638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
45648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVBlock =
45658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NdefMap->StdMifareContainer.currentBlock;
45668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVByte =
45678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                (TempLength - PH_FRINFC_MIFARESTD_VAL3);
45688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
45698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL2)] =
45708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_NDEFTLV_T;
45718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL1)] =
45728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_NDEFTLV_L;
45738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] =
45748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
45758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
45768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
45778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
45788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
45798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] =
45808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_NDEFTLV_T;
45818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
45828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        break;
45838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
45848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    default:
45858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Already the TLV is present so just append the length field */
45868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->TLVStruct.prevLenByteValue >=
45878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_NDEFTLV_L)
45888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
45898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Update the null TLV, ndef TLV block and ndef TLV byte */
45908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
45918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVBlock =
45928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NdefMap->StdMifareContainer.currentBlock;
45938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVByte =
45948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                (TempLength - PH_FRINFC_MIFARESTD_VAL3);
45958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
45968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL2)] =
45978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                (uint8_t)PH_FRINFC_MIFARESTD_NDEFTLV_T;
45988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL1)] =
45998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                (uint8_t)PH_FRINFC_MIFARESTD_NDEFTLV_L;
46008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] =
46018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
46028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
46038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)] =
46048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
46058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
46068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
46078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
46088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
46098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)] =
46108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
46118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
46128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.RdAfterWrFlag =
46138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_FLAG0;
46148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        break;
46158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
46168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
46178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return;
46188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
46198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
46208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
46218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_fillTLV2
46228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
46238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function is updates the length field if more than one
46248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  NULL TLVs does not exists before the TLV.
46258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
46268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          void
46278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
46288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
46298605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd_H_fillTLV2(phFriNfc_NdefMap_t        *NdefMap)
46308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
46318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t     TempLength = (uint8_t)(NdefMap->TLVStruct.NdefTLVByte +
46328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_VAL1);
46338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
46348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->TLVStruct.prevLenByteValue = ((NdefMap->Offset ==
46358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_FRINFC_NDEFMAP_SEEK_CUR)?
46368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    (NdefMap->TLVStruct.prevLenByteValue +
46378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NdefMap->ApduBuffIndex):
46388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NdefMap->ApduBuffIndex);
46398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG1;
46408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    switch(NdefMap->TLVStruct.NdefTLVByte)
46418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
46428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    case PH_FRINFC_MIFARESTD_VAL13:
46438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->TLVStruct.prevLenByteValue >=
46448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_NDEFTLV_L)
46458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
46468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
46478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
46488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L;
46498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
46508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
46518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
46528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
46538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
46548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
46558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
46568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
46578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
46588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
46598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
46608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Update the null TLV, ndef TLV block and ndef TLV byte */
46618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL2;
46628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVBlock =
46638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NdefMap->StdMifareContainer.currentBlock;
46648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVByte =
46658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                (TempLength - PH_FRINFC_MIFARESTD_VAL1);
46668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
46678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
46688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
46698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        break;
46708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
46718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    case PH_FRINFC_MIFARESTD_VAL14:
46728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->TLVStruct.prevLenByteValue >=
46738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_NDEFTLV_L)
46748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
46758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
46768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
46778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L;
46788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
46798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
46808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
46818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
46828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
46838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
46848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
46858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        break;
46868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
46878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    case PH_FRINFC_MIFARESTD_VAL15:
46888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->TLVStruct.prevLenByteValue >=
46898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_NDEFTLV_L)
46908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
46918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
46928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
46938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
46948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
46958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
46968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
46978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        break;
46988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
46998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    default:
47008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->TLVStruct.prevLenByteValue >=
47018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_NDEFTLV_L)
47028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
47038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
47048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
47058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L;
47068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
47078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
47088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                                PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
47098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
47108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] =
47118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
47128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
47138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
47148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
47158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
47168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
47178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
47188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
47198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
47208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Update the null TLV, ndef TLV block and ndef TLV byte */
47218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL2;
47228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVBlock =
47238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NdefMap->StdMifareContainer.currentBlock;
47248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVByte =
47258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                (TempLength - PH_FRINFC_MIFARESTD_VAL1);
47268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
47278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
47288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
47298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] =
47308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
47318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
47328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
47338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        break;
47348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
47358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
47368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return;
47378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
47388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
47398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
47408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_CallWrNdefLen
47418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
47428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function is used to increment/decrement the ndef tlv block
47438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  and read the block.
47448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
47458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
47468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
47478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
47488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
47498605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_CallWrNdefLen(phFriNfc_NdefMap_t        *NdefMap)
47508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
47518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
47528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
47538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(NdefMap->TLVStruct.NULLTLVCount >= PH_FRINFC_MIFARESTD_VAL2)
47548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
47558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if((NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL0) ||
47568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL1) )
47578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
47588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* In this case, current block is decremented because the
47598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao               NULL TLVs are in the previous block */
47608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.currentBlock--;
47618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = phFriNfc_MifStd_H_BlkChk_1(NdefMap);
47628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
47638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
47648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
47658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* case NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL15:
47668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao               Current block is incremented to update the remaining TLV
47678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao               structure */
47688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.currentBlock++;
47698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
47708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
47718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
47728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
47738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
47748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if((NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL13) ||
47758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL14) ||
47768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL15))
47778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
47788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Current block is incremented to update the remaining TLV
47798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                structure */
47808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.currentBlock++;
47818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
47828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
47838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
47848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
47858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    Result = ((Result == NFCSTATUS_SUCCESS)?
47868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap):
47878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result);
47888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
47898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
47908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
47918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
47928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
47938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_BlkChk_1
47948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
47958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function check the current block is valid or not
47968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  if not valid decrement the current block till the valid block.
47978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
47988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
47998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
48008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
48018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
48028605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_BlkChk_1(phFriNfc_NdefMap_t        *NdefMap)
48038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
48048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result  = NFCSTATUS_SUCCESS;
48058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t     SectorID = PH_FRINFC_MIFARESTD_VAL0;
48068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
48078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Get a Sector ID for the Current Block */
48088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    SectorID = phFriNfc_MifStd_H_GetSect(NdefMap->StdMifareContainer.currentBlock);
48098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
48108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Check the sector id is valid or not and if valid then check the
48118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        current block is greater than 128 */
48128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if((NdefMap->StdMifareContainer.aid[SectorID] ==
48138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        PH_FRINFC_MIFARESTD_NDEF_COMP) &&
48148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (((SectorID <= PH_FRINFC_MIFARESTD_VAL15) &&
48158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD)) ||
48168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        ((SectorID <= PH_FRINFC_MIFARESTD_SECTOR_NO31) &&
48178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD)) ||
48188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        ((SectorID <= PH_FRINFC_MIFARESTD_SECTOR_NO39) &&
48198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD))))
48208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
48218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->StdMifareContainer.currentBlock > 128)
48228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
48238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVAuthFlag =
48248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            ((((NdefMap->StdMifareContainer.currentBlock +
48258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL1) %
48268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_MAD_BLK16) ==
48278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL0)?
48288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG1:
48298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG0);
48308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
48318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.currentBlock -=
48328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            ((((NdefMap->StdMifareContainer.currentBlock +
48338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL1) %
48348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_MAD_BLK16) ==
48358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL0)?
48368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL1:
48378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL0);
48388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
48398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
48408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
48418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
48428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVAuthFlag =
48438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            ((((NdefMap->StdMifareContainer.currentBlock +
48448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL1) %
48458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_BLK4) ==
48468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL0)?
48478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG1:
48488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG0);
48498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
48508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.currentBlock -=
48518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            ((((NdefMap->StdMifareContainer.currentBlock +
48528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL1) %
48538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_BLK4) ==
48548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL1)?
48558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL1:
48568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL0);
48578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
48588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
48598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
48608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
48618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
48628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /*Error: No Ndef Compliant Sectors present.*/
48638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
48648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NFCSTATUS_INVALID_PARAMETER);
48658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
48668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
48678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
48688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
48698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
48708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
48718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_fillTLV1_1
48728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
48738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function updates the length of the TLV if NULL TLVs
48748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  greater than or equal to 2.
48758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
48768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          void
48778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
48788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
48798605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd_H_fillTLV1_1(phFriNfc_NdefMap_t        *NdefMap)
48808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
48818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    switch(NdefMap->TLVStruct.NdefTLVByte)
48828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
48838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    case PH_FRINFC_MIFARESTD_VAL0:
48848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* In the first write ndef length procedure, the
48858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           length is updated, in this case T and L = 0xFF of TLV are
48868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           updated */
48878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
48888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.NdefTLVBlock =
48898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NdefMap->StdMifareContainer.currentBlock;
48908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL14;
48918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
48928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL15] =
48938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_NDEFTLV_T;
48948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL16] =
48958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_NDEFTLV_L;
48968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        break;
48978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
48988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    case PH_FRINFC_MIFARESTD_VAL1:
48998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* In the first write ndef length procedure, the
49008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           length is updated, in this case T of TLV is
49018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           updated */
49028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
49038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.NdefTLVBlock =
49048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NdefMap->StdMifareContainer.currentBlock;
49058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->TLVStruct.NdefTLVByte =
49068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_VAL15;
49078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL16] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
49088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        break;
49098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
49108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    case PH_FRINFC_MIFARESTD_VAL15:
49118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    default:
49128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* In the first ndef write length, part of the L field or only T
49138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           (if update length is less than 255) is updated */
49148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL1] =
49158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
49168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        break;
49178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
49188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
49198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
49208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return;
49218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
49228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
49238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
49248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_fillTLV2_1
49258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
49268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function updates the length of the TLV if NULL TLVs
49278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  less than 2.
49288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
49298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          void
49308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
49318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
49328605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd_H_fillTLV2_1(phFriNfc_NdefMap_t        *NdefMap)
49338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
49348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t     TempLength = PH_FRINFC_MIFARESTD_VAL1;
49358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    switch(NdefMap->TLVStruct.NdefTLVByte)
49368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
49378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    case PH_FRINFC_MIFARESTD_VAL13:
49388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* In last write ndef length, part of length (L) field of TLV
49398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           is updated now */
49408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[TempLength] =
49418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
49428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        break;
49438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
49448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    case PH_FRINFC_MIFARESTD_VAL14:
49458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* In last write ndef length, part of length (L) field of TLV
49468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           is updated now */
49478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->TLVStruct.prevLenByteValue >=
49488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_NDEFTLV_L)
49498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
49508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] =
49518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
49528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
49538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
49548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] =
49558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
49568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
49578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
49588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
49598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL2;
49608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVBlock =
49618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NdefMap->StdMifareContainer.currentBlock;
49628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVByte =
49638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                (TempLength - PH_FRINFC_MIFARESTD_VAL1);
49648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
49658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
49668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] =
49678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
49688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
49698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        break;
49708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
49718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    case PH_FRINFC_MIFARESTD_VAL15:
49728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    default:
49738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->TLVStruct.prevLenByteValue >=
49748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_NDEFTLV_L)
49758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
49768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* In last write ndef length, only T of TLV is updated and
49778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao               length (L) field of TLV is updated now */
49788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] =
49798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_NDEFTLV_L;
49808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
49818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] =
49828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
49838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
49848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
49858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] =
49868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
49878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
49888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
49898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
49908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] =
49918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_NULLTLV_T;
49928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
49938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL2;
49948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVBlock =
49958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NdefMap->StdMifareContainer.currentBlock;
49968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVByte =
49978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                (TempLength - PH_FRINFC_MIFARESTD_VAL1);
49988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] =
49998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_NDEFTLV_T;
50008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            TempLength++;
50018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->SendRecvBuf[TempLength] =
50028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
50038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
50048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        break;
50058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
50068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
50078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
50088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return;
50098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
50108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
50118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
50128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_RdTLV
50138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
50148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function reads the TLV block.
50158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
50168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
50178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
50188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
50198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
50208605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_RdTLV(phFriNfc_NdefMap_t        *NdefMap)
50218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
50228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
50238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
50248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_TLV;
50258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE;
50268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
50278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    Result = phFriNfc_MifStd_H_Rd16Bytes(NdefMap,
50288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.currentBlock);
50298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
50308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
50318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
50328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
50338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
50348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_ProRdTLV
50358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
50368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function processes the read TLV block.
50378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
50388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
50398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
50408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
50418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
50428605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ProRdTLV(phFriNfc_NdefMap_t        *NdefMap)
50438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
50448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
50458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    NFCSTATUS_INVALID_DEVICE_REQUEST);
50468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t     TempLength = PH_FRINFC_MIFARESTD_VAL0,
50478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NDEFFlag = PH_FRINFC_MIFARESTD_FLAG1;
50488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
50498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /*TempLength = (uint8_t)(((NdefMap->TLVStruct.NULLTLVCount >=
50508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL2) &&
50518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (NdefMap->TLVStruct.BytesRemainLinTLV > 0xFE))?
50528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                ((NdefMap->TLVStruct.NdefTLVByte +
50538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL2)%
50548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL16):
50558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                ((NdefMap->TLVStruct.NdefTLVByte +
50568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL4)%
50578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_VAL16));*/
50588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
50598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    TempLength = (uint8_t)((NdefMap->TLVStruct.BytesRemainLinTLV <= 0xFE)?
50608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        ((NdefMap->TLVStruct.NdefTLVByte +
50618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_VAL2)%
50628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_VAL16):
50638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        ((NdefMap->TLVStruct.NdefTLVByte +
50648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_VAL4)%
50658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        PH_FRINFC_MIFARESTD_VAL16));
50668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
50678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if((*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ) &&
50688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (NdefMap->ApduBuffIndex < NdefMap->ApduBufferSize))
50698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
50708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->TLVStruct.BytesRemainLinTLV != 0)
50718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
50728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
50738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* To read the remaining length (L) in TLV */
50748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = phFriNfc_MifStd_H_RemainTLV(NdefMap, &NDEFFlag, &TempLength);
50758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
50768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
50778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
50788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
50798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
50808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
50818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
50828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_WrTermTLV
50838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
50848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function is used to write the terminator TLV.
50858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
50868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
50878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
50888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
50898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
50908605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_WrTermTLV(phFriNfc_NdefMap_t   *NdefMap)
50918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
50928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
50938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t     index = PH_FRINFC_MIFARESTD_VAL0;
50948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
50958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Change the state to check ndef compliancy */
50968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->State = PH_FRINFC_NDEFMAP_STATE_TERM_TLV;
50978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
50988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->SendRecvBuf[index] =
50998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->StdMifareContainer.currentBlock;
51008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    index++;
51018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->SendRecvBuf[index] = PH_FRINFC_MIFARESTD_TERMTLV_T;
51028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    index++;
51038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
51048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    while(index < PH_FRINFC_MIFARESTD_WR_A_BLK)
51058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
51068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[index] = PH_FRINFC_MIFARESTD_NULLTLV_T;
51078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        index++;
51088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
51098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
51108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
51118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
51128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    Result = phFriNfc_MifStd_H_WrTLV(NdefMap);
51138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
51148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
51158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
51168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
51178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
51188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
51198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_ProWrABlock
51208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
51218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function processes the write a block.
51228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
51238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
51248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
51258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
51268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
51278605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ProWrABlock(phFriNfc_NdefMap_t   *NdefMap)
51288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
51298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
51308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
51318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->StdMifareContainer.WrLength = PH_FRINFC_MIFARESTD_VAL0;
51328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(NdefMap->ApduBuffIndex <
51338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (uint16_t)NdefMap->ApduBufferSize)
51348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
51358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Remaining bytes to write < 16 */
51368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->StdMifareContainer.RemainingBufFlag ==
51378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG1)
51388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
51398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Write complete, so next byte shall be */
51408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.internalLength =
51418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                *NdefMap->DataCount;
51428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
51438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Copy bytes less than 16 to internal buffer
51448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao               for the next write this can be used */
51458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            memcpy( NdefMap->StdMifareContainer.internalBuf,
51468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.Buffer,
51478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.internalLength);
51488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
51498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Increment the Send Buffer index */
51508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->ApduBuffIndex += NdefMap->NumOfBytesWritten;
51518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
51528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.remainingSize -=
51538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->NumOfBytesWritten;
51548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
51558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.RemainingBufFlag = PH_FRINFC_MIFARESTD_VAL0;
51568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Check for the End of Card */
51578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
51588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (uint8_t)((NdefMap->StdMifareContainer.remainingSize ==
51598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_VAL0)?
51608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_FLAG1:
51618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_FLAG0);
51628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
51638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.SetTermTLVFlag =
51648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (uint8_t)(((NdefMap->StdMifareContainer.remainingSize ==
51658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_VAL0) ||
51668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (NdefMap->TLVStruct.SetTermTLVFlag ==
51678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG1))?
51688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG1:
51698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG0);
51708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
51718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        } /* internal Buffer > Send Buffer */
51728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else if(NdefMap->StdMifareContainer.internalBufFlag ==
51738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                PH_FRINFC_MIFARESTD_FLAG1)
51748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
51758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            memcpy(NdefMap->StdMifareContainer.internalBuf,
51768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.Buffer,
51778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    *NdefMap->DataCount);
51788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
51798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.internalLength =
51808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    *NdefMap->DataCount;
51818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
51828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Increment the Send Buffer index */
51838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->ApduBuffIndex +=
51848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->NumOfBytesWritten;
51858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
51868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.remainingSize -=
51878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->NumOfBytesWritten;
51888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
51898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.internalBufFlag =
51908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_FLAG0;
51918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Check for the End of Card */
51928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
51938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (uint8_t)(((NdefMap->StdMifareContainer.remainingSize ==
51948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_VAL0) &&
51958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (NdefMap->StdMifareContainer.internalLength ==
51968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_VAL0))?
51978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_FLAG1:
51988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_FLAG0);
51998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
52008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.SetTermTLVFlag =
52018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (uint8_t)(((NdefMap->StdMifareContainer.remainingSize ==
52028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_VAL0) ||
52038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (NdefMap->TLVStruct.SetTermTLVFlag ==
52048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG1))?
52058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG1:
52068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG0);
52078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
52088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
52098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
52108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.internalLength = 0;
52118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Increment the Send Buffer index */
52128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->ApduBuffIndex +=
52138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->NumOfBytesWritten;
52148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.remainingSize -=
52158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->NumOfBytesWritten;
52168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
52178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Check for the End of Card */
52188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if((NdefMap->StdMifareContainer.remainingSize ==
52198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_VAL0) ||
52208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (NdefMap->ApduBuffIndex == NdefMap->ApduBufferSize))
52218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
52228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
52238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (uint8_t)((NdefMap->StdMifareContainer.remainingSize == 0)?
52248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_FLAG1:PH_FRINFC_MIFARESTD_FLAG0);
52258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
52268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if(NdefMap->StdMifareContainer.internalLength ==
52278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_VAL0)
52288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
52298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.currentBlock++;
52308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    /* Mifare 4k Card, After 128th Block
52318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    each sector = 16 blocks in Mifare 4k */
52328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Result = ((NdefMap->StdMifareContainer.remainingSize == 0)?
52338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                Result:
52348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                phFriNfc_MifStd_H_BlkChk(NdefMap));
52358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.NdefBlocks++;
52368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
52378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->TLVStruct.SetTermTLVFlag =
52388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (uint8_t)(((NdefMap->StdMifareContainer.remainingSize ==
52398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_VAL0) ||
52408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (NdefMap->TLVStruct.SetTermTLVFlag ==
52418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG1))?
52428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG1:
52438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PH_FRINFC_MIFARESTD_FLAG0);
52448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
52458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            else
52468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
52478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.currentBlock++;
52488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.WrLength =
52498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    (uint16_t)(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex);
52508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* Mifare 4k Card, After 128th Block
52518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                each sector = 16 blocks in Mifare 4k */
52528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
52538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if(Result == NFCSTATUS_SUCCESS)
52548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
52558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.NdefBlocks++;
52568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Result = ((NdefMap->StdMifareContainer.AuthDone ==
52578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                PH_FRINFC_MIFARESTD_FLAG1)?
52588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                phFriNfc_MifStd_H_WrABlock(NdefMap):
52598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                phFriNfc_MifStd_H_AuthSector(NdefMap));
52608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
52618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
52628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
52638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
52648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
52658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
52668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = PHNFCSTVAL(    CID_FRI_NFC_NDEF_MAP,
52678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NFCSTATUS_INVALID_DEVICE_REQUEST);
52688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
52698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
52708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if((Result == NFCSTATUS_SUCCESS) &&
52718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (NdefMap->TLVStruct.SetTermTLVFlag !=
52728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        PH_FRINFC_MIFARESTD_FLAG1) &&
52738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        (NdefMap->StdMifareContainer.remainingSize >
52748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        PH_FRINFC_MIFARESTD_VAL0))
52758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
52768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = phFriNfc_MifStd_H_WrTermTLV(NdefMap);
52778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
52788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
52798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
52808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if((Result == NFCSTATUS_SUCCESS) &&
52818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            (NdefMap->TLVStruct.SetTermTLVFlag ==
52828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG1))
52838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
52848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Write the length to the L field in the TLV */
52858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.TempBlockNo =
52868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        NdefMap->StdMifareContainer.currentBlock;
52878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            phFriNfc_MifStd_H_SetNdefBlkAuth(NdefMap);
52888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.currentBlock =
52898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NdefMap->TLVStruct.NdefTLVBlock;
52908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
52918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
52928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
52938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
52948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
52958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
52968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
52978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
52988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_CallDisCon
52998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
53008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function trigger disconnect after the authentication
53018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  has failed.
53028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
53038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_PENDING in case of success
53048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
53058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
53068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
53078605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_CallDisCon(phFriNfc_NdefMap_t   *NdefMap)
53088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
53098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
53108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
53118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Set Ndef State */
53128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->State = PH_FRINFC_NDEFMAP_STATE_DISCONNECT;
53138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
53148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->MapCompletionInfo.Context = NdefMap;
53158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
53168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    Result = phNxNciExtns_MifareStd_Reconnect();
53178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
53188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
53198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
53208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
53218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
53228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_CallConnect
53238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
53248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function sets card state to connect after the
53258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  authentication has failed.
53268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
53278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          NFCSTATUS_SUCCESS
53288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
53298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
53308605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_CallConnect(phFriNfc_NdefMap_t   *NdefMap)
53318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
53328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
53338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
53348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Set Ndef State */
53358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->State = PH_FRINFC_NDEFMAP_STATE_CONNECT;
53368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
53378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
53388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
53398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
53408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
53418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd1k_H_BlkChk
53428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
53438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function used to update the current block.
53448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
53458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          void
53468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
53478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
53488605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic void phFriNfc_MifStd1k_H_BlkChk(phFriNfc_NdefMap_t   *NdefMap,
53498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    uint8_t              SectorID,
53508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    uint8_t              *callbreak)
53518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
53528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* every last block of a sector needs to be skipped */
53538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(((NdefMap->StdMifareContainer.currentBlock + PH_FRINFC_MIFARESTD_INC_1) %
53548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        PH_FRINFC_MIFARESTD_BLK4) == 0)
53558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
53568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.currentBlock++;
53578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
53588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
53598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
53608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->StdMifareContainer.aid[SectorID] ==
53618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_NDEF_COMP)
53628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
53638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Check whether the block is first block of a (next)new sector and
53648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            also check if it is first block then internal length is zero
53658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            or not. Because once Authentication is done for the sector again
53668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            we should not authenticate it again */
53678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if((NdefMap->StdMifareContainer.currentBlock ==
53688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (SectorID * PH_FRINFC_MIFARESTD_BLK4)) &&
53698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                (NdefMap->StdMifareContainer.internalLength == 0))
53708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
53718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.AuthDone = 0;
53728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
53738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            *callbreak = 1;
53748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
53758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
53768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
53778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.currentBlock += PH_FRINFC_MIFARESTD_BLK4;
53788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
53798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
53808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
53818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return;
53828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
53838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
53848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
53858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFrinfc_MifareClassic_GetContainerSize
53868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
53878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function calculate the card size.
53888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
53898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
53908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
53918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
53928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
53938605731e8f17d1fde003084811f13f52539eb20cJizhou LiaoNFCSTATUS phFrinfc_MifareClassic_GetContainerSize(const phFriNfc_NdefMap_t *NdefMap,
53948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                   uint32_t *maxSize, uint32_t *actualSize)
53958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
53968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   result = NFCSTATUS_SUCCESS;
53978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint16_t    valid_no_of_bytes = 0;
53988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t     sect_aid_index = 0;
53998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /*  Mifare std card */
54008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
54018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /*  Max size is the number of NDEF compliant blocks in the card
54028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        multiplied by 16 bytes */
54038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
54048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Skip all the non ndef sectors */
54058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    while ((sect_aid_index < PH_FRINFC_NDEFMAP_MIFARESTD_TOTALNO_BLK) &&
54068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao          (PH_FRINFC_MIFARESTD_NON_NDEF_COMP == NdefMap->StdMifareContainer.aid[sect_aid_index]))
54078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
54088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        sect_aid_index++;
54098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
54108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
54118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Parse only the contiguous NDEF sectors for the max size calculation */
54128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao     while ((sect_aid_index <PH_FRINFC_NDEFMAP_MIFARESTD_TOTALNO_BLK)&&
54138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           (PH_FRINFC_MIFARESTD_NDEF_COMP ==NdefMap->StdMifareContainer.aid[sect_aid_index]))
54148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
54158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (((PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD == NdefMap->CardType)||
54168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao             (PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD == NdefMap->CardType)) && (sect_aid_index >= 32))
54178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
54188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Mifare classic card of 4k size, sector >= 32 has
54198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao               16 blocks per sector and in that 15 blocks are valid data blocks
54208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao               16 is the block number in a sector
54218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao               15 is the number of valid data blocks in a sector
54228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao             */
54238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            valid_no_of_bytes += (uint16_t)(16 * 15);
54248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
54258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
54268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
54278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            valid_no_of_bytes += (uint16_t)(16 * 3);
54288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
54298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
54308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        sect_aid_index++;
54318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if (16 == sect_aid_index)
54328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
54338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Because sector index is 16, that is "MAD 2" block
54348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao               For calculating size MAD block shall be ignored
54358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao             */
54368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            sect_aid_index++;
54378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
54388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
54398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* The below check is for the 3 byte length format of the NDEF TLV
54408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao       If the length field > 255, Max size will less by 4
54418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao       else Max size will less by 2 (Type and Length of the NDEF TLV
54428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao       has to be skipped to provide the maximum size in the card */
54438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    *maxSize = (valid_no_of_bytes > 0xFF) ? (valid_no_of_bytes - 4) : (valid_no_of_bytes - 2);
54448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
54458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    *actualSize = NdefMap->TLVStruct.BytesRemainLinTLV;
54468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
54478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return result;
54488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
54498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
54508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
54518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifareStdMap_ConvertToReadOnly
54528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
54538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function converts the Mifare card to read-only.
54548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  It check preconditions before converting to read only.
54558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
54568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_PENDING in case of success
54578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
54588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
54598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
54608605731e8f17d1fde003084811f13f52539eb20cJizhou LiaoNFCSTATUS
54618605731e8f17d1fde003084811f13f52539eb20cJizhou LiaophFriNfc_MifareStdMap_ConvertToReadOnly (
54628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao               phFriNfc_NdefMap_t *NdefMap,
54638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao               const uint8_t *ScrtKeyB)
54648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
54658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS result = NFCSTATUS_SUCCESS;
54668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t totalNoSectors = 0 , sectorTrailerBlockNo = 0;
54678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
54688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if ( NdefMap == NULL)
54698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
54708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
54718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
54728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else if ( PH_NDEFMAP_CARD_STATE_INVALID == NdefMap->CardState )
54738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
54748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_STATE);
54758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
54768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
54778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
54788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* card state is PH_NDEFMAP_CARD_STATE_READ_WRITE now */
54798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* get AID  array and parse */
54808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if( PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD == NdefMap->CardType )
54818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
54828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            totalNoSectors  = PH_FRINFC_MIFARESTD1K_TOTAL_SECTOR;
54838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
54848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else if ( PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD == NdefMap->CardType )
54858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
54868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            totalNoSectors  = PH_FRINFC_MIFARESTD2K_TOTAL_SECTOR;
54878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
54888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else if ( PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD == NdefMap->CardType )
54898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
54908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao             totalNoSectors  = PH_FRINFC_MIFARESTD4K_TOTAL_SECTOR;
54918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
54928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
54938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Store Key B in the context */
54948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(ScrtKeyB ==NULL)
54958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
54968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            memset (NdefMap->StdMifareContainer.UserScrtKeyB, PH_FRINFC_MIFARESTD_DEFAULT_KEY,
54978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_KEY_LEN);
54988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
54998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
55008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
55018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            memcpy (NdefMap->StdMifareContainer.UserScrtKeyB, ScrtKeyB, PH_FRINFC_MIFARESTD_KEY_LEN);
55028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
55038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
55048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.TotalNoSectors = totalNoSectors;
55058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(totalNoSectors == 0)
55068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
55078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
55088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
55098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        else
55108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
55118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
55128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.RdBeforeWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
55138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.WrNdefFlag = PH_FRINFC_MIFARESTD_FLAG0;
55148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
55158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
55168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
55178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
55188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            NdefMap->StdMifareContainer.WriteAcsBitFlag = PH_FRINFC_MIFARESTD_FLAG0;
55198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
55208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* Sector 0 is MAD sector .Start from Sector 1 */
55218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            for(NdefMap->StdMifareContainer.ReadOnlySectorIndex = PH_FRINFC_MIFARESTD_FLAG1;
55228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.ReadOnlySectorIndex < totalNoSectors;
55238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                NdefMap->StdMifareContainer.ReadOnlySectorIndex++)
55248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
55258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* skip MAD sectors */
55268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if( PH_FRINFC_MIFARESTD_SECTOR_NO16 == NdefMap->StdMifareContainer.ReadOnlySectorIndex  )
55278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
55288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    continue;
55298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
55308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
55318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                /* if not NDEF compliant skip  */
55328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if( PH_FRINFC_MIFARESTD_NON_NDEF_COMP ==
55338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.ReadOnlySectorIndex])
55348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
55358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    continue;
55368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
55378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
55388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if (PH_FRINFC_MIFARESTD_NDEF_COMP ==
55398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                     NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.ReadOnlySectorIndex])
55408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
55418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    /*get the sector trailer block number */
55428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    sectorTrailerBlockNo =
55438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        phFriNfc_MifStd_H_GetSectorTrailerBlkNo(NdefMap->StdMifareContainer.ReadOnlySectorIndex);
55448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.currentBlock = sectorTrailerBlockNo;
55458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    NdefMap->StdMifareContainer.SectorTrailerBlockNo = sectorTrailerBlockNo;
55468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
55478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    /* Proceed to authenticate the sector with Key B
55488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                       and  modify the sector trailor bits to make it read only*/
55498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    result = phFriNfc_MifStd_H_AuthSector(NdefMap);
55508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
55518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if (result == NFCSTATUS_PENDING )
55528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
55538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        break;
55548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
55558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
55568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            } /* end for */
55578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
55588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* There are no NDEF sectors in this card , return */
55598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if(NdefMap->StdMifareContainer.ReadOnlySectorIndex == totalNoSectors &&
55608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao               NFCSTATUS_PENDING!= result )
55618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
55628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_NO_NDEF_SUPPORT);
55638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
55648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        } /* end else */
55658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
55668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
55678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return result;
55688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
55698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
55708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
55718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_GetSectorTrailerBlkNo
55728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
55738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function returns the block number of the sector
55748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  trailor for the given sector trailer Id.
55758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
55768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          uint8_t sectorTrailerblockNumber : sector trailor
55778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
55788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
55798605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic uint8_t phFriNfc_MifStd_H_GetSectorTrailerBlkNo (uint8_t SectorID)
55808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
55818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t sectorTrailerblockNumber = 0;
55828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
55838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* every last block of a sector needs to be skipped */
55848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (SectorID < PH_FRINFC_MIFARESTD_SECTOR_NO32)
55858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
55868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        sectorTrailerblockNumber = (SectorID * PH_FRINFC_MIFARESTD_BLK4 ) + 3;
55878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
55888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
55898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
55908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        sectorTrailerblockNumber = ((PH_FRINFC_MIFARESTD_SECTOR_NO32 * PH_FRINFC_MIFARESTD_BLK4) +
55918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            ((SectorID - PH_FRINFC_MIFARESTD_SECTOR_NO32) * PH_FRINFC_MIFARESTD_SECTOR_BLOCKS)) + 15;
55928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
55938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
55948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return sectorTrailerblockNumber;
55958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
55968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
55978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
55988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_ProSectorTrailorAcsBits
55998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
56008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function is called during ConvertToReadonly process to
56018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  Authenticate NDEF compliant Sector.
56028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
56038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
56048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
56058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
56068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
56078605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ProSectorTrailorAcsBits(phFriNfc_NdefMap_t *NdefMap)
56088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
56098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
56108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
56118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ)
56128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
56138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        if(NdefMap->StdMifareContainer.ReadAcsBitFlag ==
56148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            PH_FRINFC_MIFARESTD_FLAG1)
56158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
56168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            /* check for the correct access bits */
56178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            Result = phFriNfc_MifStd_H_ChkAcsBit(NdefMap);
56188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            if(Result  == NFCSTATUS_SUCCESS)
56198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            {
56208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
56218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                if(NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY)
56228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
56238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    /* Go to next sector */
56248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Result = phFriNfc_MifStd_H_ProWrSectorTrailor(NdefMap);
56258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
56268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                else
56278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
56288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    /* tranceive to write the data into SendRecvBuff */
56298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    Result = phFriNfc_MifStd_H_WrSectorTrailorBlock(NdefMap);
56308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
56318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            }
56328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
56338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
56348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
56358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
56368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
56378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                     NFCSTATUS_INVALID_PARAMETER);
56388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
56398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
56408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return Result;
56418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
56428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
56438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
56448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_WrSectorTrailorBlock
56458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
56468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function makes current NDEF compliant Sector ReadOnly
56478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  modify the sector trailor bits and write it to the card.
56488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
56498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_PENDING in case of success
56508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
56518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
56528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
56538605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_WrSectorTrailorBlock(phFriNfc_NdefMap_t *NdefMap)
56548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
56558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS status = NFCSTATUS_PENDING;
56568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
56578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
56588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->MapCompletionInfo.Context = NdefMap;
56598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
56608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
56618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* next state (update sector index) */
56628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WRITE_SEC;
56638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
56648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* Buffer Check */
56658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(NdefMap->SendRecvBuf != NULL)
56668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
56678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[10] = 0x00;
56688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[10] = NdefMap->SendRecvBuf[9] | PH_FRINFC_MIFARESTD_MASK_GPB_WR; /* WR bits 11*/
56698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
56708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /*The NdefMap->SendRecvBuf already has the sector trailor.
56718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        modify the bits to make Read Only */
56728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[1] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
56738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[2] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
56748605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[3] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
56758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[4] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
56768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[5] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
56778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[6] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
56788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
56798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[7] = PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE6;/* 0x0F */
56808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[8] = PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE7;/* 0x07 */
56818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[9] = PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE8;/* 0x8F */
56828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
56838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[11] = NdefMap->StdMifareContainer.UserScrtKeyB[0];
56848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[12] = NdefMap->StdMifareContainer.UserScrtKeyB[1];
56858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[13] = NdefMap->StdMifareContainer.UserScrtKeyB[2];
56868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[14] = NdefMap->StdMifareContainer.UserScrtKeyB[3];
56878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[15] = NdefMap->StdMifareContainer.UserScrtKeyB[4];
56888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[16] = NdefMap->StdMifareContainer.UserScrtKeyB[5];
56898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
56908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Write to Ndef Sector Block */
56918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = NdefMap->StdMifareContainer.currentBlock;
56928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
56938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Copy Ndef Sector Block into buffer */
56948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        memcpy(NdefMap->StdMifareContainer.Buffer,
56958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    &(NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL1]),
56968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    PH_FRINFC_MIFARESTD_BLOCK_BYTES);
56978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
56988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Write from here */
56998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_WRITE;
57008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->Cmd.MfCmd = phHal_eMifareWrite16;
57018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
57028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
57038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Call the Overlapped HAL Transceive function */
57048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        status = phFriNfc_ExtnsTransceive(NdefMap->pTransceiveInfo,
57058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->Cmd,
57068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->SendRecvBuf,
57078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->SendLength,
57088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      NdefMap->SendRecvLength);
57098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
57108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
57118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
57128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Error: The control should not ideally come here.
57138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao           Return Error.*/
57148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_FAILED);
57158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
57168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
57178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return status;
57188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
57198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
57208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
57218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_ProWrSectorTrailor
57228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
57238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function makes next NDEF compliant Sector ReadOnly.
57248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
57258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
57268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
57278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
57288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
57298605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS phFriNfc_MifStd_H_ProWrSectorTrailor(phFriNfc_NdefMap_t *NdefMap)
57308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
57318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS status =  NFCSTATUS_FAILED;
57328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t sectorTrailerBlockNo = 0;
57338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
57348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /*Increment Sector Index */
57358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NdefMap->StdMifareContainer.ReadOnlySectorIndex++;
57368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
57378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* skip if MAD2 */
57388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if(PH_FRINFC_MIFARESTD_SECTOR_NO16 == NdefMap->StdMifareContainer.ReadOnlySectorIndex )
57398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
57408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.ReadOnlySectorIndex++;
57418605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
57428605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
57438605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    /* if current sector index exceeds total sector index then
57448605731e8f17d1fde003084811f13f52539eb20cJizhou Liao       all ndef sectors are made readonly then return success
57458605731e8f17d1fde003084811f13f52539eb20cJizhou Liao       If a NON def sector is encountered return success*/
57468605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if (NdefMap->StdMifareContainer.ReadOnlySectorIndex >= NdefMap->StdMifareContainer.TotalNoSectors ||
57478605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        PH_FRINFC_MIFARESTD_NON_NDEF_COMP  ==
57488605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.ReadOnlySectorIndex])
57498605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
57508605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        status = NFCSTATUS_SUCCESS;
57518605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
57528605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else if(PH_FRINFC_MIFARESTD_NDEF_COMP  == NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.ReadOnlySectorIndex])
57538605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
57548605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Convert next NDEF sector to read only */
57558605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        sectorTrailerBlockNo = phFriNfc_MifStd_H_GetSectorTrailerBlkNo(NdefMap->StdMifareContainer.ReadOnlySectorIndex);
57568605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.currentBlock = sectorTrailerBlockNo;
57578605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        NdefMap->StdMifareContainer.SectorTrailerBlockNo = sectorTrailerBlockNo;
57588605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
57598605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        status = phFriNfc_MifStd_H_AuthSector(NdefMap);
57608605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
57618605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
57628605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return status;
57638605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
57648605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
57658605731e8f17d1fde003084811f13f52539eb20cJizhou Liao/******************************************************************************
57668605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Function         phFriNfc_MifStd_H_ProWrSectorTrailor
57678605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
57688605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Description      This function checks mapping spec version.
57698605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
57708605731e8f17d1fde003084811f13f52539eb20cJizhou Liao * Returns          This function return NFCSTATUS_SUCCESS in case of success
57718605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *                  In case of failure returns other failure value.
57728605731e8f17d1fde003084811f13f52539eb20cJizhou Liao *
57738605731e8f17d1fde003084811f13f52539eb20cJizhou Liao ******************************************************************************/
57748605731e8f17d1fde003084811f13f52539eb20cJizhou Liaostatic NFCSTATUS   phFriNfc_MapTool_ChkSpcVer( const phFriNfc_NdefMap_t  *NdefMap,
57758605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        uint8_t             VersionIndex)
57768605731e8f17d1fde003084811f13f52539eb20cJizhou Liao{
57778605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    NFCSTATUS status = NFCSTATUS_SUCCESS;
57788605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
57798605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    uint8_t TagVerNo = NdefMap->SendRecvBuf[VersionIndex];
57808605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
57818605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    if ( TagVerNo == 0 )
57828605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
57838605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        /* Return Status Error invalid format */
57848605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,NFCSTATUS_INVALID_FORMAT);
57858605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
57868605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    else
57878605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    {
57888605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        switch (NdefMap->CardType)
57898605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        {
57908605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            case PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD:
57918605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            case PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD:
57928605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            case PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD:
57938605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
57948605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    /* calculate the major and minor version number of Mifare std version number */
57958605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    status = (( (( PH_NFCFRI_MFSTDMAP_NFCDEV_MAJOR_VER_NUM ==
57968605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                        PH_NFCFRI_MFSTDMAP_GET_MAJOR_TAG_VERNO(TagVerNo ) )&&
57978605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    ( PH_NFCFRI_MFSTDMAP_NFCDEV_MINOR_VER_NUM ==
57988605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                      PH_NFCFRI_MFSTDMAP_GET_MINOR_TAG_VERNO(TagVerNo))) ||
57998605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                (( PH_NFCFRI_MFSTDMAP_NFCDEV_MAJOR_VER_NUM ==
58008605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                   PH_NFCFRI_MFSTDMAP_GET_MAJOR_TAG_VERNO(TagVerNo ) )&&
58018605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                 ( PH_NFCFRI_MFSTDMAP_NFCDEV_MINOR_VER_NUM <
58028605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                   PH_NFCFRI_MFSTDMAP_GET_MINOR_TAG_VERNO(TagVerNo) )))?
58038605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            NFCSTATUS_SUCCESS:
58048605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
58058605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                NFCSTATUS_INVALID_FORMAT));
58068605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    break;
58078605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
58088605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
58098605731e8f17d1fde003084811f13f52539eb20cJizhou Liao            default:
58108605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                {
58118605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    /* calculate the major and minor version number of T3VerNo */
58128605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    if( (( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM ==
58138605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                    PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo ) )&&
58148605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                ( PH_NFCFRI_NDEFMAP_NFCDEV_MINOR_VER_NUM ==
58158605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                                  PH_NFCFRI_NDEFMAP_GET_MINOR_TAG_VERNO(TagVerNo))) ||
58168605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            (( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM ==
58178605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                               PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo ) )&&
58188605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                             ( PH_NFCFRI_NDEFMAP_NFCDEV_MINOR_VER_NUM <
58198605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                               PH_NFCFRI_NDEFMAP_GET_MINOR_TAG_VERNO(TagVerNo) )))
58208605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
58218605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        status = PHNFCSTVAL(CID_NFC_NONE,NFCSTATUS_SUCCESS);
58228605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
58238605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    else
58248605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    {
58258605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        if ((PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM <
58268605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                             PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo)) ||
58278605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                             (PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM >
58288605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                             PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo)))
58298605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        {
58308605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                            status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_FORMAT);
58318605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                        }
58328605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    }
58338605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                    break;
58348605731e8f17d1fde003084811f13f52539eb20cJizhou Liao                }
58358605731e8f17d1fde003084811f13f52539eb20cJizhou Liao        }
58368605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    }
58378605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
58388605731e8f17d1fde003084811f13f52539eb20cJizhou Liao    return (status);
58398605731e8f17d1fde003084811f13f52539eb20cJizhou Liao}
58408605731e8f17d1fde003084811f13f52539eb20cJizhou Liao
5841