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