15d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
25d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Copyright (C) 2010 NXP Semiconductors
35d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
45d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Licensed under the Apache License, Version 2.0 (the "License");
55d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * you may not use this file except in compliance with the License.
65d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * You may obtain a copy of the License at
75d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
85d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *      http://www.apache.org/licenses/LICENSE-2.0
95d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Unless required by applicable law or agreed to in writing, software
115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * distributed under the License is distributed on an "AS IS" BASIS,
125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * See the License for the specific language governing permissions and
145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * limitations under the License.
155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \file  phFriNfc_FelicaMap.c
195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief This component encapsulates read/write/check ndef/process functionalities,
205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *        for the Felica Smart Card.
215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Project: NFC-FRI
235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * $Date: Thu May  6 14:01:35 2010 $
255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * $Author: ing07385 $
265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * $Revision: 1.10 $
275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * $Aliases: NFC_FRI1.1_WK1017_R34_4,NFC_FRI1.1_WK1023_R35_1 $
285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_FELICA_DISABLED
325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phNfcTypes.h>
345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_OvrHal.h>
355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_FelicaMap.h>
365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_MapTools.h>
375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! \ingroup grp_file_attributes
405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  \name NDEF Mapping
415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * File: \ref phFriNfc_FelicaMap.c
435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*@{*/
465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define PHFRINFCNDEFMAP_FILEREVISION "$Revision: 1.10 $"
485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define PHFRINFCNDEFMAP_FILEALIASES  "$Aliases: NFC_FRI1.1_WK1017_R34_4,NFC_FRI1.1_WK1023_R35_1 $"
495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*@}*/
515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Helpers for Read and updating the attribute informations*/
535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS   phFriNfc_Felica_HRdAttrInfo(phFriNfc_NdefMap_t *NdefMap);
545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS   phFriNfc_Felica_HUpdateAttrInfo(phFriNfc_NdefMap_t *NdefMap);
555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Felica_HCalCheckSum(const uint8_t *TempBuffer,
565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                              uint8_t StartIndex,
575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                              uint8_t EndIndex,
585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                              uint16_t RecvChkSum);
595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Helpers for Poll Related Operations*/
615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS   phFriNfc_Felica_HPollCard( phFriNfc_NdefMap_t   *NdefMap,
625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                              const uint8_t sysCode[],
635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                              uint8_t state);
645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS   phFriNfc_Felica_HUpdateManufIdDetails(const phFriNfc_NdefMap_t *NdefMap);
665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*Helpers for Reading Operations*/
685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Felica_HReadData(phFriNfc_NdefMap_t *NdefMap,uint8_t offset);
695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic uint16_t    phFriNfc_Felica_HGetMaximumBlksToRead(const phFriNfc_NdefMap_t *NdefMap,uint8_t NbcOrNmaxb );
705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void        phFriNfc_Felica_HAfterRead_CopyDataToBuff(phFriNfc_NdefMap_t *NdefMap);
715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS   phFriNfc_Felica_HSetTransceiveForRead(phFriNfc_NdefMap_t *NdefMap,uint16_t TrxLen,uint8_t Offset);
725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic uint16_t    phFriNfc_Felica_HSetTrxLen(phFriNfc_NdefMap_t *NdefMap,uint16_t Nbc);
735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS   phFriNfc_Felica_HChkApduBuff_Size( phFriNfc_NdefMap_t *NdefMap);
745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Helpers for Writing Operations*/
765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS   phFriNfc_Felica_HChkAttrBlkForWrOp(phFriNfc_NdefMap_t *NdefMap);
775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS   phFriNfc_Felica_HChkAttrBlkForRdOp(phFriNfc_NdefMap_t *NdefMap,
785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                      uint32_t NdefLen);
795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS  phFriNfc_Felica_HUpdateAttrBlkForWrOp(phFriNfc_NdefMap_t *NdefMap,uint8_t isStarted);
805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS   phFriNfc_Felica_HUpdateData(phFriNfc_NdefMap_t *NdefMap);
815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Felica_HWriteDataBlk(phFriNfc_NdefMap_t *NdefMap);
825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Write Empty NDEF Message*/
845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Felica_HWrEmptyMsg(phFriNfc_NdefMap_t *NdefMap);
855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*Helpers for common checks*/
875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS   phFriNfc_Felica_HCheckManufId(const phFriNfc_NdefMap_t *NdefMap);
885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_Felica_HCrHandler(phFriNfc_NdefMap_t  *NdefMap,
895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 uint8_t              CrIndex,
905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 NFCSTATUS            Status);
915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_Felica_HInitInternalBuf(uint8_t *Buffer);
935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic int phFriNfc_Felica_MemCompare ( void *s1, void *s2, unsigned int n );
955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief returns maximum number of blocks can be read from the Felica Smart Card.
985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * The function is useful in reading of NDEF information from a felica tag.
1005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
1015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic uint16_t    phFriNfc_Felica_HGetMaximumBlksToRead(const phFriNfc_NdefMap_t *NdefMap, uint8_t NbcOrNmaxb )
1035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
1045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   uint16_t    BlksToRead=0;
1055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   uint32_t    DataLen = 0;
1065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* This part of the code is useful if we take account of Nbc blks reading*/
1075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ( NbcOrNmaxb == PH_NFCFRI_NDEFMAP_FELI_NBC )
1085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
1095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        PH_NFCFRI_NDEFMAP_FELI_CAL_LEN_BYTES(NdefMap->FelicaAttrInfo.LenBytes[0],
1105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                NdefMap->FelicaAttrInfo.LenBytes[1],
1115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                NdefMap->FelicaAttrInfo.LenBytes[2],
1125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                DataLen);
1135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Calculate Nbc*/
1145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BlksToRead = (uint16_t) ( ((DataLen % 16) == 0) ? (DataLen >> 4) : ((DataLen >> 4) +1) );
1155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
1185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else if ( NbcOrNmaxb == PH_NFCFRI_NDEFMAP_FELI_NMAXB)
1195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
1205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BlksToRead = NdefMap->FelicaAttrInfo.Nmaxb;
1215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
1225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
1235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
1245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* WARNING !!! code should not reach this point*/
1255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ;
1265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
1275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (BlksToRead);
1285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
1295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
1315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Initiates Reading of NDEF information from the Felica Card.
1325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
1335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * The function initiates the reading of NDEF information from a Remote Device.
1345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * It performs a reset of the state and starts the action (state machine).
1355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * A periodic call of the \ref phFriNfcNdefMap_Process has to be
1365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * done once the action has been triggered.
1375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
1385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_Felica_RdNdef(  phFriNfc_NdefMap_t  *NdefMap,
1405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    uint8_t             *PacketData,
1415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    uint32_t            *PacketDataLength,
1425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    uint8_t             Offset)
1435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
1445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS status = NFCSTATUS_PENDING;
1465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint32_t  Nbc = 0;
1475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->ApduBufferSize = *PacketDataLength;
1495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*Store the packet data buffer*/
1505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->ApduBuffer = PacketData;
1515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->NumOfBytesRead = PacketDataLength ;
1535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    *NdefMap->NumOfBytesRead = 0;
1545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->ApduBuffIndex = 0;
1555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE;
1575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->Felica.Offset = Offset;
1585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( ( Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN )||( NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_WRITE_OPE))
1605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
1615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->Felica.CurBlockNo = 0;
1625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->Felica.OpFlag = PH_FRINFC_NDEFMAP_FELI_RD_ATTR_RD_OP;
1635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->Felica.IntermediateCpyFlag = FALSE;
1645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->Felica.IntermediateCpyLen = 0;
1655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->Felica.Rd_NoBytesToCopy = 0;
1665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->Felica.EofCardReachedFlag= FALSE ;
1675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->Felica.LastBlkReachedFlag = FALSE;
1685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->Felica.CurrBytesRead = 0;
1695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phFriNfc_Felica_HInitInternalBuf(NdefMap->Felica.Rd_BytesToCopyBuff);
1715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* send request to read attribute information*/
1735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = phFriNfc_Felica_HRdAttrInfo(NdefMap);
1745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* handle the error in Transc function*/
1755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if ( (status & PHNFCSTBLOWER) != (NFCSTATUS_PENDING & PHNFCSTBLOWER))
1765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
1775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* call respective CR */
1785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            phFriNfc_Felica_HCrHandler(NdefMap,PH_FRINFC_NDEFMAP_CR_CHK_NDEF,status);
1795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
1805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
1815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
1825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
1835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         Nbc = phFriNfc_Felica_HGetMaximumBlksToRead(NdefMap,PH_NFCFRI_NDEFMAP_FELI_NBC);
1845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         /* Offset = Current, but the read has reached the End of NBC Blocks */
1865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(( ( Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) && (NdefMap->Felica.CurBlockNo == Nbc)) &&
1875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            (NdefMap->Felica.EofCardReachedFlag == FELICA_RD_WR_EOF_CARD_REACHED ))
1885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
1895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,  NFCSTATUS_EOF_NDEF_CONTAINER_REACHED);
1905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
1915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
1925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
1935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->Felica.CurrBytesRead = ((NdefMap->Felica.CurBlockNo * 16)- NdefMap->Felica.Rd_NoBytesToCopy);
1955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = phFriNfc_Felica_HReadData(NdefMap,NdefMap->Felica.Offset);
1965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
1985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
1995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (status);
2005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
2015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*Read Operation Related Helper Routines*/
2035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
2055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Used in Read Opearation.Sets the Trx Buffer Len calls Transc Cmd.
2065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * After a successful read operation, function does checks the user buffer size
2075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * sets the status flags.
2085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
2095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Felica_HReadData(phFriNfc_NdefMap_t *NdefMap,uint8_t offset)
2115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
2125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS status = NFCSTATUS_PENDING;
2135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint16_t Nbc=0,TranscLen=0;
2145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    Nbc = phFriNfc_Felica_HGetMaximumBlksToRead(NdefMap,PH_NFCFRI_NDEFMAP_FELI_NBC);
2165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( ( (NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex) > 0) && (NdefMap->Felica.CurBlockNo < Nbc ))
2175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* if data is present in the internal buffer*/
2195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if (NdefMap->Felica.Rd_NoBytesToCopy > 0 )
2205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
2215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* copy data to external buffer*/
2225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            phFriNfc_Felica_HAfterRead_CopyDataToBuff(NdefMap);
2235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /*Check the size of user buffer*/
2245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = phFriNfc_Felica_HChkApduBuff_Size(NdefMap);
2255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if ( (status != NFCSTATUS_SUCCESS) && (NdefMap->Felica.IntermediateRdFlag == TRUE ))
2265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
2275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* set the transc len and call transc cmd*/
2285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                TranscLen = phFriNfc_Felica_HSetTrxLen(NdefMap,Nbc);
2295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                status= phFriNfc_Felica_HSetTransceiveForRead(NdefMap,TranscLen,offset);
2305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
2315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
2325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
2335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Nothing to be done , if IntermediateRdFlag is set to zero*/
2345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ;
2355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
2365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
2375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
2385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
2395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* set the transc len and call transc cmd*/
2405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            TranscLen = phFriNfc_Felica_HSetTrxLen(NdefMap,Nbc);
2415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status= phFriNfc_Felica_HSetTransceiveForRead(NdefMap,TranscLen,offset);
2425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
2435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
2445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
2455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Chk the Buffer size*/
2475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = phFriNfc_Felica_HChkApduBuff_Size(NdefMap);
2485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if ( (status != NFCSTATUS_SUCCESS) && (NdefMap->Felica.IntermediateRdFlag == TRUE ))
2495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
2505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            TranscLen = phFriNfc_Felica_HSetTrxLen(NdefMap,Nbc);
2515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status= phFriNfc_Felica_HSetTransceiveForRead(NdefMap,TranscLen,offset);
2525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
2535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
2545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (status);
2555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
2565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
2585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Used in Read Opearation.Sets the Trx Buffer Len.
2595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
2605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic uint16_t    phFriNfc_Felica_HSetTrxLen(phFriNfc_NdefMap_t *NdefMap,uint16_t Nbc)
2625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
2635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint16_t TranscLen = 0,BlocksToRead=0;
2645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( ( (NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex)% 16) == 0)
2665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BlocksToRead = (uint16_t)( (NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex)/16 );
2685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
2695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
2705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BlocksToRead = (uint16_t)(((NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex)/16) +1);
2725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
2735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ( (BlocksToRead > Nbc) ||( (BlocksToRead) > ( Nbc - NdefMap->Felica.CurBlockNo)) )
2745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BlocksToRead = Nbc - NdefMap->Felica.CurBlockNo;
2765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
2775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ( BlocksToRead >= NdefMap->FelicaAttrInfo.Nbr)
2805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if( NdefMap->FelicaAttrInfo.Nbr < Nbc )
2825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
2835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            TranscLen =  NdefMap->FelicaAttrInfo.Nbr*16;
2845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
2855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
2865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
2875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            TranscLen = Nbc*16;
2885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->Felica.LastBlkReachedFlag =1;
2895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
2905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
2915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
2925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if (BlocksToRead <= Nbc )
2945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
2955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if ( ( BlocksToRead * 16) == ((Nbc *16) -  (NdefMap->Felica.CurBlockNo * 16)))
2965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
2975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->Felica.LastBlkReachedFlag =1;
2985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
3005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            TranscLen = BlocksToRead*16;
3015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
3035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
3045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
3055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            TranscLen = Nbc*16;
3065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
3075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
3085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* As Cur Blk changes, to remember the exact len what we had set
3095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    in the begining of each read operation*/
3105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->Felica.TrxLen = TranscLen;
3115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (TranscLen);
3125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
3135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
3155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Used in Read Opearation.After a successful read operation,
3165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *   Copies the data to user buffer.
3175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
3185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void    phFriNfc_Felica_HAfterRead_CopyDataToBuff(phFriNfc_NdefMap_t *NdefMap)
3205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
3215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t ResetFlag = FALSE, ExtrBytesToCpy = FALSE;
3225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint16_t Nbc=0;
3235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint32_t DataLen=0;
3245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    Nbc = phFriNfc_Felica_HGetMaximumBlksToRead(NdefMap,PH_NFCFRI_NDEFMAP_FELI_NBC );
3265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    PH_NFCFRI_NDEFMAP_FELI_CAL_LEN_BYTES(NdefMap->FelicaAttrInfo.LenBytes[0],
3285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                NdefMap->FelicaAttrInfo.LenBytes[1],
3295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                NdefMap->FelicaAttrInfo.LenBytes[2],
3305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                DataLen);
3315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Internal Buffer has some old read bytes to cpy to user buffer*/
3325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( NdefMap->Felica.Rd_NoBytesToCopy > 0 )
3335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
3345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if ( (NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex) < NdefMap->Felica.Rd_NoBytesToCopy )
3355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
3365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->Felica.Rd_NoBytesToCopy -= (uint8_t)(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex);
3375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if (NdefMap->Felica.IntermediateCpyFlag == TRUE )
3395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
3405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /*Copy data from the internal buffer to user buffer*/
3415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     (void)memcpy( (&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex])),
3425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    (&(NdefMap->Felica.Rd_BytesToCopyBuff[NdefMap->Felica.IntermediateCpyLen])),
3435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    (NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex));
3445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* Store number of bytes copied frm internal buffer to User Buffer */
3485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->Felica.IntermediateCpyLen += (uint8_t)(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex);
3495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->Felica.IntermediateCpyFlag = 1;
3505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* check do we reach len bytes any chance*/
3525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    PH_NFCFRI_NDEFMAP_FELI_CAL_LEN_BYTES(NdefMap->FelicaAttrInfo.LenBytes[0],
3535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                    NdefMap->FelicaAttrInfo.LenBytes[1],
3545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                    NdefMap->FelicaAttrInfo.LenBytes[2],
3555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                    DataLen);
3565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* Internal buffer has zero bytes for copy operation*/
3575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if ( NdefMap->Felica.Rd_NoBytesToCopy == 0)
3585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
3595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->Felica.EofCardReachedFlag =FELICA_RD_WR_EOF_CARD_REACHED;
3605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
3615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
3625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
3635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
3645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /*Copy data from the internal buffer to apdu buffer*/
3655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     (void)memcpy( (&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex])),
3665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    NdefMap->Felica.Rd_BytesToCopyBuff,
3675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    (NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex));
3685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
3695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->ApduBuffIndex += (uint8_t)(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex);
3705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
3725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else if ( (NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex) == NdefMap->Felica.Rd_NoBytesToCopy )
3735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
3745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if ( NdefMap->Felica.IntermediateCpyFlag == TRUE )
3755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
3765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*Copy data internal buff to apdubuffer*/
3775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 (void)memcpy( (&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex])),
3785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               (&(NdefMap->Felica.Rd_BytesToCopyBuff[NdefMap->Felica.IntermediateCpyLen])),
3795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               NdefMap->Felica.Rd_NoBytesToCopy);
3805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
3815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
3825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
3835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*Copy data internal buff to apdubuffer*/
3845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 (void)memcpy( (&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex])),
3855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->Felica.Rd_BytesToCopyBuff,
3865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->Felica.Rd_NoBytesToCopy);
3875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
3885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /*increment the index,internal buffer len*/
3905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->ApduBuffIndex += NdefMap->Felica.Rd_NoBytesToCopy;
3915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->Felica.Rd_NoBytesToCopy -= (uint8_t)(NdefMap->ApduBuffIndex);
3925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* To reset the parameters*/
3945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            ResetFlag = TRUE;
3955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
3965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
3975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
3985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* Extra Bytes to Copy from internal buffer to external buffer*/
3995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if ( NdefMap->Felica.IntermediateCpyFlag == TRUE )
4005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
4015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*Copy data internal buff to apdubuffer*/
4025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 (void)memcpy( (&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex])),
4035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               (&(NdefMap->Felica.Rd_BytesToCopyBuff[NdefMap->Felica.IntermediateCpyLen])),
4045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               NdefMap->Felica.Rd_NoBytesToCopy);
4055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
4065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
4075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
4085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*Copy data internal buff to apdubuffer*/
4095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 (void)memcpy( (&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex])),
4105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->Felica.Rd_BytesToCopyBuff,
4115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->Felica.Rd_NoBytesToCopy);
4125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
4135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /*increment the index*/
4145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->ApduBuffIndex += NdefMap->Felica.Rd_NoBytesToCopy;
4155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* To reset the parameters*/
4175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            ResetFlag = TRUE;
4185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
4195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }/*End of Internal Buffer has some old read bytes to cpy to user buffer*/
4205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
4215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
4225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* check if last block is reached*/
4235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if ( ((NdefMap->Felica.LastBlkReachedFlag == 1) && (( NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex) >= 16)) )
4245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
4255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* greater than 16 but less than the data len size*/
4265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if (( NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex) >= DataLen)
4275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
4285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->Felica.CurrBytesRead = (uint16_t)((DataLen) - (NdefMap->Felica.CurrBytesRead +
4295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    NdefMap->ApduBuffIndex));
4305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 (void)memcpy( (&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex])),
4325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               (&(NdefMap->SendRecvBuf[13])),
4335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->Felica.CurrBytesRead);
4345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->ApduBuffIndex += NdefMap->Felica.CurrBytesRead;
4365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if ( NdefMap->ApduBuffIndex == DataLen)
4375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
4385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    ResetFlag = TRUE;
4395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
4405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
4415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
4425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
4435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* need to check exact no. of bytes to copy to buffer*/
4445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if( ( (NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex) <= NdefMap->Felica.TrxLen )||
4455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    ((NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex) <= DataLen ))
4465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
4475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    ExtrBytesToCpy = TRUE;
4495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
4505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
4515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
4525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->Felica.Rd_NoBytesToCopy = (uint8_t)(16-(( Nbc * 16) - (DataLen)));
4535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if ( NdefMap->Felica.Rd_NoBytesToCopy > (NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex))
4555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
4565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /*Reduce already copied bytes from the internal buffer*/
4575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->Felica.Rd_NoBytesToCopy -= (uint8_t)(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex);
4585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        ExtrBytesToCpy = TRUE;
4595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
4605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
4615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
4625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        ExtrBytesToCpy = FALSE;
4635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
4645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
4655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if ( ExtrBytesToCpy == TRUE )
4665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
4675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->Felica.CurrBytesRead = (uint16_t)((DataLen)- (NdefMap->Felica.CurrBytesRead +
4685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    NdefMap->ApduBuffIndex));
4695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(NdefMap->Felica.CurrBytesRead <
4715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        (uint16_t)(NdefMap->ApduBufferSize -
4725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->ApduBuffIndex))
4735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
4745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                         (void)memcpy( (&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex])),
4755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                       (&(NdefMap->SendRecvBuf[13])),
4765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                       NdefMap->Felica.CurrBytesRead);
4775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
4785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
4795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
4805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                         (void)memcpy( (&( NdefMap->ApduBuffer[NdefMap->ApduBuffIndex])),
4815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                       (&( NdefMap->SendRecvBuf[13])),
4825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        (uint16_t)(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex));
4835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
4845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if ( NdefMap->Felica.LastBlkReachedFlag == 1 )
4865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
4875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->Felica.Rd_NoBytesToCopy =
4885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    (uint8_t)((NdefMap->Felica.CurrBytesRead >
4895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    (uint16_t)(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex))?
4905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    (NdefMap->Felica.CurrBytesRead -
4915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    (uint16_t)(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex)):
4925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    0);
4935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        ResetFlag = ((NdefMap->Felica.Rd_NoBytesToCopy == 0)?TRUE:FALSE);
4955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
4975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
4985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
4995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->Felica.Rd_NoBytesToCopy = (uint8_t)( NdefMap->Felica.TrxLen - (NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex));
5005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
5015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* Copy remained bytes back into internal buffer*/
5035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     (void)memcpy(   NdefMap->Felica.Rd_BytesToCopyBuff,
5045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                  (&(NdefMap->SendRecvBuf[PH_NFCFRI_NDEFMAP_FELI_RESP_HEADER_LEN+(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex)])),
5055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                     NdefMap->Felica.Rd_NoBytesToCopy);
5065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* set the intermediate flag : This flag remembers that there are still X no. bytes remained in
5085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Internal Buffer Ex: User has given only one byte buffer,needs to cpy one byte at a time*/
5095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->Felica.IntermediateCpyFlag = TRUE;
5105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->ApduBuffIndex += ((NdefMap->Felica.CurrBytesRead <
5125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                (uint16_t)(NdefMap->ApduBufferSize -
5135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                NdefMap->ApduBuffIndex))?
5145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                NdefMap->Felica.CurrBytesRead:
5155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                (uint16_t)(NdefMap->ApduBufferSize -
5165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                NdefMap->ApduBuffIndex));
5175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
5195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /*Copy data from the internal buffer to user buffer*/
5215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    (void)memcpy( (&( NdefMap->ApduBuffer[NdefMap->ApduBuffIndex])),
5225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                  (&( NdefMap->SendRecvBuf[13])),
5235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                   NdefMap->Felica.Rd_NoBytesToCopy);
5245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->ApduBuffIndex += NdefMap->Felica.Rd_NoBytesToCopy;
5265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    ResetFlag = TRUE;
5275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
5305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
5325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
5335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
5345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if ((NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex) < NdefMap->Felica.TrxLen )
5355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
5365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Calculate exactly remained bytes to copy to internal buffer and set it*/
5375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if ( NdefMap->Felica.LastBlkReachedFlag == 1)
5385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->Felica.Rd_NoBytesToCopy = (uint8_t)(16-(( Nbc * 16) - DataLen));
5405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if ( NdefMap->Felica.Rd_NoBytesToCopy > (NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex))
5425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
5435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /*Reduce already copied bytes from the internal buffer*/
5445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->Felica.Rd_NoBytesToCopy -= (uint8_t)(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex);
5455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        ExtrBytesToCpy = TRUE;
5465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
5475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
5495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->Felica.Rd_NoBytesToCopy = (uint8_t)(NdefMap->Felica.TrxLen - (NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex));
5515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    ExtrBytesToCpy = TRUE;
5525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if ( ExtrBytesToCpy == TRUE )
5545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /*Copy the read data from trx buffer to apdu of size apdu*/
5565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     (void)memcpy( (&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex])),
5575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                   (&(NdefMap->SendRecvBuf[13])),
5585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex);
5595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /*copy bytesToCopy to internal buffer*/
5615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     (void)memcpy( NdefMap->Felica.Rd_BytesToCopyBuff,
5625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                         (&(NdefMap->SendRecvBuf[13+(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex)])),
5635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    NdefMap->Felica.Rd_NoBytesToCopy);
5645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->Felica.IntermediateCpyFlag = TRUE;
5665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->ApduBuffIndex += (uint16_t)NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex;
5675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
5695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /*Copy data from the internal buffer to user buffer*/
5715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     (void)memcpy( (&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex])),
5725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                   (&(NdefMap->SendRecvBuf[13])),
5735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    NdefMap->Felica.Rd_NoBytesToCopy);
5745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->ApduBuffIndex += NdefMap->Felica.Rd_NoBytesToCopy;
5765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    ResetFlag = TRUE;
5775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if ( DataLen <= (NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex) )
5805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->Felica.EofCardReachedFlag =FELICA_RD_WR_EOF_CARD_REACHED;
5825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
5845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ;
5865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
5885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else if ((NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex) == NdefMap->Felica.TrxLen )
5895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
5905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*Copy exactly remained last bytes to user buffer and increment the index*/
5915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*13 : 1+12 : 1st byte entire pkt length + 12 bytes to skip manuf details*/
5925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 (void)memcpy( (&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex])),
5935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               (&(NdefMap->SendRecvBuf[13])),
5945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               (NdefMap->Felica.TrxLen ));
5955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->ApduBuffIndex += NdefMap->Felica.TrxLen;
5975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
5985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
5995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
6005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if ((NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex) > NdefMap->Felica.TrxLen )
6015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
6025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /*Copy the data to apdu buffer and increment the index */
6035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                         (void)memcpy( (&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex])),
6045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                       (&(NdefMap->SendRecvBuf[PH_NFCFRI_NDEFMAP_FELI_RESP_HEADER_LEN])),
6055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NdefMap->Felica.TrxLen);
6065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->ApduBuffIndex += (uint16_t)NdefMap->Felica.TrxLen;
6085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
6095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
6105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
6115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
6125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ( ResetFlag == TRUE )
6135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
6145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* reset the internal buffer variables*/
6155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->Felica.Rd_NoBytesToCopy =0;
6165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->Felica.IntermediateCpyLen =0;
6175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->Felica.IntermediateCpyFlag =FALSE;
6185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
6195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return;
6205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
6215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
6245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Used in Read Opearation.After a successful read operation,
6255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    Checks the relavent buffer sizes and set the status.Following function is used
6265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    when we read the Nmaxb blocks. Retained for future purpose.
6275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
6285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Felica_HChkApduBuff_Size( phFriNfc_NdefMap_t *NdefMap)
6305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
6315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS status = NFCSTATUS_PENDING;
6325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t ResetFlag = FALSE;
6335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint32_t Nbc = 0;
6345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    Nbc = phFriNfc_Felica_HGetMaximumBlksToRead(NdefMap,PH_NFCFRI_NDEFMAP_FELI_NBC);
6365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* set status to Success : User Buffer is full and Curblk < nmaxb*/
6385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ( (( NdefMap->ApduBufferSize-NdefMap->ApduBuffIndex )== 0) &&
6395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         (NdefMap->Felica.CurBlockNo < Nbc ))
6405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
6415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_NONE,
6425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                       NFCSTATUS_SUCCESS);
6435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*Reset the index, internal buffer counters back to zero*/
6445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
6455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->ApduBuffIndex = 0;
6465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }/*if( (NdefMap->ApduBufferSize-NdefMap->ApduBuffIndex )== 0 && NdefMap->Felica.CurBlockNo < NdefMap->FelicaAttrInfo.Nmaxb )*/
6485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
6495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
6505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if (( ( NdefMap->ApduBufferSize-NdefMap->ApduBuffIndex )== 0) &&
6515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly             (NdefMap->Felica.CurBlockNo == Nbc ))
6525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
6535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = PHNFCSTVAL(CID_NFC_NONE,
6545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                       NFCSTATUS_SUCCESS);
6555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            ResetFlag = ((NdefMap->Felica.Rd_NoBytesToCopy > 0 )?
6575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            FALSE:
6585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            TRUE);
6595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if( ResetFlag== FALSE)
6605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
6615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
6625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*Reset the index, internal buffer counters back to zero*/
6635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->ApduBuffIndex = 0;
6645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
6655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }/*if ((NdefMap->ApduBufferSize-NdefMap->ApduBuffIndex )== 0 && NdefMap->Felica.CurBlockNo == NdefMap->FelicaAttrInfo.Nmaxb )*/
6665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
6675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
6685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* reached reading all the blks available in the card: set EOF flag*/
6695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if ( NdefMap->ApduBuffIndex == (Nbc*16))
6705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
6715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                status = PHNFCSTVAL(CID_NFC_NONE,
6725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    NFCSTATUS_SUCCESS);
6735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ResetFlag = TRUE;
6745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
6755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
6765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
6775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if ((NdefMap->ApduBufferSize-NdefMap->ApduBuffIndex )> 0 )
6785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
6795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if ( NdefMap->Felica.CurBlockNo == Nbc )
6805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
6815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /* bytes pending in internal buffer , No Space in User Buffer*/
6825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        if ( NdefMap->Felica.Rd_NoBytesToCopy > 0)
6835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
6845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            if ( NdefMap->Felica.EofCardReachedFlag == TRUE )
6855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
6865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                status = PHNFCSTVAL(CID_NFC_NONE,
6875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NFCSTATUS_SUCCESS);
6885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
6895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->ApduBuffIndex=0;
6905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
6915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            else
6925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
6935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                phFriNfc_Felica_HAfterRead_CopyDataToBuff(NdefMap);
6945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                if( NdefMap->Felica.Rd_NoBytesToCopy > 0 )
6955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                {
6965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    status = PHNFCSTVAL(CID_NFC_NONE,
6975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NFCSTATUS_SUCCESS);
6985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
6995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    NdefMap->ApduBuffIndex=0;
7005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                }
7015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                else
7025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                {
7035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    /* EOF Card Reached set the internal EOF Flag*/
7045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    status = PHNFCSTVAL(CID_NFC_NONE,
7055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                       NFCSTATUS_SUCCESS);
7065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    ResetFlag = TRUE;
7085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                }
7095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
7105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
7115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /* All bytes from internal buffer are copied and set eof flag*/
7125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        else
7135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
7145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               status = PHNFCSTVAL(CID_NFC_NONE,
7155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                      NFCSTATUS_SUCCESS);
7165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               ResetFlag = TRUE;
7175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                         }
7185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
7195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
7205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
7215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /* This flag is set to ensure that, need of Read Opearation
7225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        we completed coying the data from internal buffer to external buffer
7235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        left some more bytes,in User bufer so initiate the read operation */
7245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->Felica.IntermediateRdFlag = TRUE;
7255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
7265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
7275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
7285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
7295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = PHNFCSTVAL(CID_NFC_NONE,
7305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                       NFCSTATUS_SUCCESS);
7315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
7325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
7335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
7345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if ( ResetFlag == TRUE)
7355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
7365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
7375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                /*Reset the index, internal buffer counters back to zero*/
7385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->ApduBuffIndex = 0;
7395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->Felica.Rd_NoBytesToCopy=0;
7405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->Felica.EofCardReachedFlag=FELICA_RD_WR_EOF_CARD_REACHED;
7415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
7435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
7455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return( status);
7465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
7475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
7495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Used in Read Opearation.Sets the transceive Command for read.
7505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
7515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS   phFriNfc_Felica_HSetTransceiveForRead(phFriNfc_NdefMap_t *NdefMap,uint16_t TrxLen,uint8_t Offset)
7525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
7535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS TrxStatus =  NFCSTATUS_PENDING;
7545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint16_t BufIndex=0,i=0;
7555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* set the felica cmd */
7575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE
7585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->Cmd.FelCmd = phHal_eFelica_Raw;
7595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
7605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->Cmd.FelCmd = phHal_eFelicaCmdListFelicaCmd;
7615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef PH_HAL4_ENABLE */
7625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*Change the state to Read */
7645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->State = PH_NFCFRI_NDEFMAP_FELI_STATE_RD_BLOCK;
7655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* set the complition routines for the mifare operations */
7675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_Felica_Process;
7685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->MapCompletionInfo.Context = NdefMap;
7695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*set the additional informations for the data exchange*/
7715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
7725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
7735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* pkt len : updated at the end*/
7755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]    =   0x00;
7765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex ++;
7775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]    =   0x06;
7795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
7805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* IDm - Manufacturer Id : 8bytes*/
7825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE
7835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    (void)memcpy((&(NdefMap->SendRecvBuf[BufIndex])),
7845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                  (void * )(&(NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.IDm)),
7855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                   8);
7865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
7875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly     (void)memcpy((&(NdefMap->SendRecvBuf[BufIndex])),
7885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                  (void * )(&(NdefMap->psRemoteDevInfo->RemoteDevInfo.CardInfo212_424.Startup212_424.NFCID2t)),
7895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                   8);
7905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif  /* #ifdef PH_HAL4_ENABLE */
7915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex+=8;
7935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*Number of Services (n=1 ==> 0x80)*/
7955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]    =   0x01;
7965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
7975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*Service Code List*/
7995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]    =   0x0B;
8005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
8015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]    =   0x00;
8035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
8045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*Number of Blocks to read*/
8065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]    =  (uint8_t)(TrxLen/16);
8075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
8085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Set the Blk numbers as per the offset set by the user : Block List*/
8095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ( Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN )
8105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
8115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        for ( i=0;i<(TrxLen/16);i++)
8125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
8135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /*1st Service Code list : byte 1*/
8145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->SendRecvBuf[BufIndex]    =   0x80;
8155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            BufIndex++;
8165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* No. Of Blocks*/
8185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->SendRecvBuf[BufIndex]    =   (uint8_t)(i + 1);
8195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            BufIndex++;
8205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
8215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
8225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
8235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
8245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        for ( i= 1;i<=(TrxLen/16);i++)
8255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
8265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /*1st Service Code list : byte 1*/
8275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->SendRecvBuf[BufIndex]    =   0x80;
8285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            BufIndex++;
8295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* No. Of Blocks*/
8315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->SendRecvBuf[BufIndex]    =   (uint8_t)(NdefMap->Felica.CurBlockNo + i);
8325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            BufIndex++;
8335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
8345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
8355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* len of entire pkt*/
8375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[PH_NFCFRI_NDEFMAP_FELI_PKT_LEN_INDEX]          =  (uint8_t) BufIndex;
8385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Set the Pkt Len*/
8405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendLength = BufIndex;
8415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
8435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    TrxStatus = phFriNfc_OvrHal_Transceive(NdefMap->LowerDevice,
8455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        &NdefMap->MapCompletionInfo,
8465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NdefMap->psRemoteDevInfo,
8475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NdefMap->Cmd,
8485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        &NdefMap->psDepAdditionalInfo,
8495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NdefMap->SendRecvBuf,
8505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NdefMap->SendLength,
8515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NdefMap->SendRecvBuf,
8525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NdefMap->SendRecvLength);
8535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (TrxStatus);
8545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
8555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
8575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Initiates Writing of NDEF information to the Remote Device.
8585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
8595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * The function initiates the writing of NDEF information to a Remote Device.
8605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * It performs a reset of the state and starts the action (state machine).
8615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * A periodic call of the \ref phFriNfcNdefMap_Process has to be done once the action
8625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * has been triggered.
8635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
8645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_Felica_WrNdef(  phFriNfc_NdefMap_t  *NdefMap,
8665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    uint8_t             *PacketData,
8675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    uint32_t            *PacketDataLength,
8685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    uint8_t             Offset)
8695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
8705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS status = NFCSTATUS_PENDING;
8725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->ApduBufferSize = *PacketDataLength;
8745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*Store the packet data buffer*/
8755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->ApduBuffer = PacketData;
8765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* To Update the Acutal written bytes to context*/
8785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->WrNdefPacketLength = PacketDataLength;
8795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    *NdefMap->WrNdefPacketLength = 0;
8805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
8835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->Felica.Offset = Offset;
8845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->Felica.OpFlag = PH_FRINFC_NDEFMAP_FELI_WR_ATTR_RD_OP;
8865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    status = phFriNfc_Felica_HRdAttrInfo(NdefMap);
8875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* handle the error in Transc function*/
8885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ( (status & PHNFCSTBLOWER) != (NFCSTATUS_PENDING & PHNFCSTBLOWER))
8895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
8905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* call respective CR */
8915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phFriNfc_Felica_HCrHandler(NdefMap,PH_FRINFC_NDEFMAP_CR_CHK_NDEF,status);
8925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
8935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (status);
8945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
8955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
8975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Initiates Writing of Empty NDEF information to the Remote Device.
8985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
8995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * The function initiates the writing empty of NDEF information to a Remote Device.
9005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * It performs a reset of the state and starts the action (state machine).
9015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * A periodic call of the \ref phFriNfcNdefMap_Process has to be done once the action
9025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * has been triggered.
9035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
9045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_Felica_EraseNdef(  phFriNfc_NdefMap_t  *NdefMap)
9065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
9075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS status = NFCSTATUS_PENDING;
9095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    static uint32_t PktDtLength =0;
9105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ( NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID )
9125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
9135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*  Card is in invalid state, cannot have any read/write
9145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        operations*/
9155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
9165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NFCSTATUS_INVALID_FORMAT);
9175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
9185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else if ( NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY )
9195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
9205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*Can't write to the card :No Grants */
9215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
9225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NFCSTATUS_WRITE_FAILED);
9235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* set the no. bytes written is zero*/
9245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->WrNdefPacketLength = &PktDtLength;
9255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        *NdefMap->WrNdefPacketLength = 0;
9265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
9275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
9285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
9295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* set the Operation*/
9315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->Felica.OpFlag = PH_FRINFC_NDEFMAP_FELI_WR_EMPTY_MSG_OP;
9325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = phFriNfc_Felica_HRdAttrInfo(NdefMap);
9345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
9355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (status);
9365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
9375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
9405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Used in Write Opearation.
9415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * check the value set for the Write Flag, in first write operation(begin), sets the
9425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * WR flag in attribute blck.
9435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * After a successful write operation, This function sets the WR flag off and updates
9445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * the LEN bytes in attribute Block.
9455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
9465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS  phFriNfc_Felica_HUpdateAttrBlkForWrOp(phFriNfc_NdefMap_t *NdefMap,uint8_t isStarted)
9485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
9495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS   status = NFCSTATUS_PENDING;
9505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint16_t ChkSum=0,index=0;
9525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t BufIndex=0, ErrFlag = FALSE;
9535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint32_t TotNoWrittenBytes=0;
9545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Write Operation : Begin/End Check*/
9565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->State =
9585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    (( isStarted == FELICA_WRITE_STARTED )?
9595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    PH_NFCFRI_NDEFMAP_FELI_STATE_ATTR_BLK_WR_BEGIN:
9605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    PH_NFCFRI_NDEFMAP_FELI_STATE_ATTR_BLK_WR_END);
9615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( ( NdefMap->State == PH_NFCFRI_NDEFMAP_FELI_STATE_ATTR_BLK_WR_BEGIN)||
9635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ( NdefMap->State == PH_NFCFRI_NDEFMAP_FELI_STATE_ATTR_BLK_WR_END) )
9645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
9655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Set the Felica Cmd*/
9675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE
9685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->Cmd.FelCmd = phHal_eFelica_Raw;
9695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
9705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->Cmd.FelCmd = phHal_eFelicaCmdListFelicaCmd;
9715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif  /* #ifdef PH_HAL4_ENABLE */
9725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* 1st byte represents the length of the cmd packet*/
9745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->SendRecvBuf[BufIndex] = 0x00;
9755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex++;
9765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Write/Update command code*/
9785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->SendRecvBuf[BufIndex] = 0x08;
9795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex++;
9805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* IDm - Manufacturer Id : 8bytes*/
9825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE
9835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        (void)memcpy( (&(NdefMap->SendRecvBuf[BufIndex])),
9845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    (void*)(&(NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.IDm)),
9855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        8);
9865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
9875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        (void)memcpy( (&(NdefMap->SendRecvBuf[BufIndex])),
9885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    (void*)(&(NdefMap->psRemoteDevInfo->RemoteDevInfo.CardInfo212_424.Startup212_424.NFCID2t)),
9895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        8);
9905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef PH_HAL4_ENABLE */
9915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex+=8;
9935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->SendRecvBuf[BufIndex]    =   0x01;  /*  Number of Services (n=1 ==> 0x80)*/
9955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex++;
9965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->SendRecvBuf[BufIndex]    =   0x09;  /*  Service Code List*/
9985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex++;
9995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->SendRecvBuf[BufIndex]    =   0x00;  /*  Service Code List*/
10015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex++;
10025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->SendRecvBuf[BufIndex]    =   0x01;  /*  Number of Blocks to Write*/
10045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex++;
10055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->SendRecvBuf[BufIndex]    =   0x80;  /*  1st Block Element : byte 1*/
10075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex++;
10085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->SendRecvBuf[BufIndex]    =   0x00;  /*  1st Block Element : byte 2, block 1*/
10105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex++;
10115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Fill Attribute Blk Information*/
10135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->SendRecvBuf[BufIndex]  = NdefMap->FelicaAttrInfo.Version;
10145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex++;
10155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->SendRecvBuf[BufIndex]  = NdefMap->FelicaAttrInfo.Nbr;
10175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex++;
10185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->SendRecvBuf[BufIndex]  = NdefMap->FelicaAttrInfo.Nbw;
10205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex++;
10215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->SendRecvBuf[BufIndex]  = (uint8_t)((NdefMap->FelicaAttrInfo.Nmaxb) >> 8);
10235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex++;
10245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->SendRecvBuf[BufIndex]  = (uint8_t)((NdefMap->FelicaAttrInfo.Nmaxb) & (0x00ff));
10265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex++;
10275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->SendRecvBuf[BufIndex]  = 0x00; /*RFU*/
10295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex++;
10305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->SendRecvBuf[BufIndex]  = 0x00; /*RFU*/
10325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex++;
10335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->SendRecvBuf[BufIndex]  = 0x00; /*RFU*/
10355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex++;
10365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->SendRecvBuf[BufIndex]  = 0x00; /*RFU*/
10385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex++;
10395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if (isStarted == FELICA_WRITE_STARTED )
10415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
10425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->SendRecvBuf[BufIndex]  = 0x0F; /* Write Flag Made On*/
10435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            BufIndex++;
10445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->SendRecvBuf[BufIndex]  = NdefMap->FelicaAttrInfo.RdWrFlag; /* Read write flag*/
10465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            BufIndex++;
10475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* Len Bytes*/
10495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->SendRecvBuf[BufIndex]  = NdefMap->FelicaAttrInfo.LenBytes[0];
10505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            BufIndex++;
10515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->SendRecvBuf[BufIndex]  = NdefMap->FelicaAttrInfo.LenBytes[1];
10535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            BufIndex++;
10545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->SendRecvBuf[BufIndex]  = NdefMap->FelicaAttrInfo.LenBytes[2];
10565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            BufIndex++;
10575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
10585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
10595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
10605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* Case: Previous Write Operation failed and integration context continues with write
10615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            operation with offset set to Current. In this case, if we find Internal Bytes remained in the
10625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            felica context is true(>0) and current block number is Zero. Then we shouldn't allow the module
10635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            to write the data to card, as this is a invalid case*/
10645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if ( (NdefMap->Felica.Wr_BytesRemained > 0) && (NdefMap->Felica.CurBlockNo == 0))
10655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
10665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
10675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NFCSTATUS_INVALID_PARAMETER);
10685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ErrFlag = TRUE;
10695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
10705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
10715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
10725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->SendRecvBuf[BufIndex]  = 0x00; /* Write Flag Made Off*/
10745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                BufIndex++;
10755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->SendRecvBuf[BufIndex]  = NdefMap->FelicaAttrInfo.RdWrFlag; /* Read write flag*/
10775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                BufIndex++;
10785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if ( NdefMap->Felica.Wr_BytesRemained > 0 )
10805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
10815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    TotNoWrittenBytes = ( (NdefMap->Felica.CurBlockNo *16)- (16 - (NdefMap->Felica.Wr_BytesRemained)));
10825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
10835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
10845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
10855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    TotNoWrittenBytes = ( NdefMap->Felica.CurBlockNo *16);
10865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
10885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Update Len Bytes*/
10905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->SendRecvBuf[BufIndex]  = (uint8_t)(( TotNoWrittenBytes & 0x00ff0000) >> 16);
10915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                BufIndex++;
10925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->SendRecvBuf[BufIndex]  = (uint8_t)((TotNoWrittenBytes & 0x0000ff00) >> 8);
10945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                BufIndex++;
10955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->SendRecvBuf[BufIndex]  = (uint8_t)(TotNoWrittenBytes & 0x000000ff);
10975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                BufIndex++;
10985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
10995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
11005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if ( ErrFlag != TRUE )
11025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
11035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* check sum update*/
11045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            for ( index = 16 ; index < 30 ; index ++)
11055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
11065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ChkSum += NdefMap->SendRecvBuf[index];
11075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
11085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* fill check sum in command pkt*/
11105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->SendRecvBuf[BufIndex] = (uint8_t)(ChkSum >> 8);
11115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            BufIndex++;
11125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->SendRecvBuf[BufIndex] = (uint8_t )(ChkSum & 0x00ff);
11145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            BufIndex++;
11155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* update length of the cmd pkt*/
11175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->SendRecvBuf[PH_NFCFRI_NDEFMAP_FELI_PKT_LEN_INDEX] = BufIndex;
11185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
11205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* Update the Send Len*/
11225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->SendLength = BufIndex;
11235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /*set the completion routines for the desfire card operations*/
11255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_NdefMap_Process;
11265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->MapCompletionInfo.Context = NdefMap;
11275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /*set the additional informations for the data exchange*/
11295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
11305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
11315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /*Call the Overlapped HAL Transceive function */
11335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = phFriNfc_OvrHal_Transceive( NdefMap->LowerDevice,
11345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                &NdefMap->MapCompletionInfo,
11355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                NdefMap->psRemoteDevInfo,
11365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                NdefMap->Cmd,
11375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                &NdefMap->psDepAdditionalInfo,
11385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                NdefMap->SendRecvBuf,
11395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                NdefMap->SendLength,
11405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                NdefMap->SendRecvBuf,
11415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                NdefMap->SendRecvLength);
11425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
11435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
11445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
11455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
11465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
11475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                      NFCSTATUS_INVALID_PARAMETER);
11485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
11505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (status);
11515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
11525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS  phFriNfc_Felica_HWrEmptyMsg(phFriNfc_NdefMap_t *NdefMap)
11545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
11555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS   status = NFCSTATUS_PENDING;
11565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint16_t ChkSum=0,index=0;
11585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t BufIndex=0;
11595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Write Operation : To Erase the present NDEF Data*/
11615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->State = PH_NFCFRI_NDEFMAP_FELI_STATE_WR_EMPTY_MSG;
11635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Set the Felica Cmd*/
11655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE
11665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->Cmd.FelCmd = phHal_eFelica_Raw;
11675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
11685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->Cmd.FelCmd = phHal_eFelicaCmdListFelicaCmd;
11695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif  /* #ifdef PH_HAL4_ENABLE */
11705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* 1st byte represents the length of the cmd packet*/
11725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex] = 0x00;
11735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
11745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Write/Update command code*/
11765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex] = 0x08;
11775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
11785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* IDm - Manufacturer Id : 8bytes*/
11805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE
11815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    (void)memcpy( (&(NdefMap->SendRecvBuf[BufIndex])),
11825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                (void*)(&(NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.IDm)),
11835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    8);
11845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
11855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    (void)memcpy( (&(NdefMap->SendRecvBuf[BufIndex])),
11865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                (void*)(&(NdefMap->psRemoteDevInfo->RemoteDevInfo.CardInfo212_424.Startup212_424.NFCID2t)),
11875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    8);
11885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif  /* #ifdef PH_HAL4_ENABLE */
11895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex+=8;
11925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]    =   0x01;  /*  Number of Services (n=1 ==> 0x80)*/
11945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
11955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]    =   0x09;  /*  Service Code List*/
11975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
11985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]    =   0x00;  /*  Service Code List*/
12005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
12015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]    =   0x01;  /*  Number of Blocks to Write*/
12035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
12045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]    =   0x80;  /*  1st Block Element : byte 1*/
12065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
12075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]    =   0x00;  /*  1st Block Element : byte 2, block 1*/
12095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
12105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Fill Attribute Blk Information*/
12125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]  = NdefMap->FelicaAttrInfo.Version;
12135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
12145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]  = NdefMap->FelicaAttrInfo.Nbr;
12165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
12175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]  = NdefMap->FelicaAttrInfo.Nbw;
12195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
12205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]  = (uint8_t)((NdefMap->FelicaAttrInfo.Nmaxb) >> 8);
12225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
12235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]  = (uint8_t)((NdefMap->FelicaAttrInfo.Nmaxb) & (0x00ff));
12255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
12265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]  = 0x00; /*RFU*/
12285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
12295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]  = 0x00; /*RFU*/
12315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
12325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]  = 0x00; /*RFU*/
12345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
12355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]  = 0x00; /*RFU*/
12375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
12385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]  = NdefMap->FelicaAttrInfo.WriteFlag;
12405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
12415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]  = NdefMap->FelicaAttrInfo.RdWrFlag; /* Read write flag*/
12435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
12445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Len Bytes are set to 0 : Empty Msg*/
12465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]  = 0x00;
12475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
12485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]  = 0x00;
12505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
12515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]  = 0x00;
12535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
12545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* check sum update*/
12565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    for ( index = 16 ; index < 30 ; index ++)
12575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
12585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ChkSum += NdefMap->SendRecvBuf[index];
12595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
12605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* fill check sum in command pkt*/
12625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex] = (uint8_t)(ChkSum >> 8);
12635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
12645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex] = (uint8_t )(ChkSum & 0x00ff);
12665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
12675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* update length of the cmd pkt*/
12695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[PH_NFCFRI_NDEFMAP_FELI_PKT_LEN_INDEX] = BufIndex;
12705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
12725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Update the Send Len*/
12745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendLength = BufIndex;
12755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*set the completion routines for the desfire card operations*/
12775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_NdefMap_Process;
12785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->MapCompletionInfo.Context = NdefMap;
12795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*set the additional informations for the data exchange*/
12815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
12825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
12835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*Call the Overlapped HAL Transceive function */
12855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    status = phFriNfc_OvrHal_Transceive( NdefMap->LowerDevice,
12865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        &NdefMap->MapCompletionInfo,
12875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NdefMap->psRemoteDevInfo,
12885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NdefMap->Cmd,
12895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        &NdefMap->psDepAdditionalInfo,
12905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NdefMap->SendRecvBuf,
12915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NdefMap->SendLength,
12925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NdefMap->SendRecvBuf,
12935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NdefMap->SendRecvLength);
12945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (status);
12965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
12975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
13005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
13015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
13025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Used in Write Opearation.
13035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  This Function is called after a successful validation and storing of attribution block
13045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  content in to context.
13055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  If the write operation is initiated with begin,function initiates the write operation with
13065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  RdWr flag.
13075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  If the Offset is set to Current, Checks for the EOF card reached status and writes data to
13085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  The Card
13095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
13105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
13115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS   phFriNfc_Felica_HChkAttrBlkForWrOp(phFriNfc_NdefMap_t  *NdefMap)
13125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
13135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS   status = NFCSTATUS_PENDING;
13145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint32_t DataLen=0;
13155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
13165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*check RW Flag Access Rights*/
13175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* set to read only cannot write*/
13185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ( NdefMap->FelicaAttrInfo.RdWrFlag == 0x00)
13195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
13205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
13215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
13225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                       NFCSTATUS_INVALID_DEVICE_REQUEST);
13235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
13245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
13255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
13265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if ( ( NdefMap->Felica.Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN) ||
13275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ( ( NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_READ_OPE) &&
13285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                   (NdefMap->Felica.Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN ) ))
13295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
13305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* check allready written number of bytes and apdu buffer size*/
13315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if (NdefMap->ApduBufferSize > (uint32_t)(NdefMap->FelicaAttrInfo.Nmaxb *16))
13325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
13335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->Felica.EofCardReachedFlag = FELICA_EOF_REACHED_WR_WITH_BEGIN_OFFSET;
13345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
13355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
13365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
13375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->Felica.EofCardReachedFlag = FALSE;
13385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
13395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
13405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
13415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* reset the internal variables initiate toupdate the attribute blk*/
13425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->Felica.Wr_BytesRemained = 0;
13435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->Felica.CurBlockNo = 0;
13445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->Felica.NoBlocksWritten = 0;
13455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            phFriNfc_Felica_HInitInternalBuf(NdefMap->Felica.Wr_RemainedBytesBuff);
13465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status= phFriNfc_Felica_HUpdateAttrBlkForWrOp(NdefMap,FELICA_WRITE_STARTED);
13475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
13485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
13495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
13505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
13515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if (NdefMap->Felica.Offset == PH_FRINFC_NDEFMAP_SEEK_CUR )
13525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
13535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Calculate the Allready Written No. Of Blocks*/
13545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                PH_NFCFRI_NDEFMAP_FELI_CAL_LEN_BYTES(NdefMap->FelicaAttrInfo.LenBytes[0],
13555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                NdefMap->FelicaAttrInfo.LenBytes[1],
13565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                NdefMap->FelicaAttrInfo.LenBytes[2],
13575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                DataLen);
13585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
13595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if (( NdefMap->ApduBufferSize + (DataLen )) >
13605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        (uint32_t)( NdefMap->FelicaAttrInfo.Nmaxb *16))
13615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
13625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(( DataLen ) ==  (uint32_t)(NdefMap->FelicaAttrInfo.Nmaxb *16) )
13635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
13645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
13655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                     NFCSTATUS_EOF_NDEF_CONTAINER_REACHED);
13665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
13675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
13685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
13695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
13705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->Felica.EofCardReachedFlag =FELICA_EOF_REACHED_WR_WITH_CURR_OFFSET;
13715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->ApduBuffIndex =0;
13725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->Felica.NoBlocksWritten = 0;
13735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status= phFriNfc_Felica_HUpdateAttrBlkForWrOp(NdefMap,FELICA_WRITE_STARTED);
13745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
13755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
13765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
13775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
13785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->ApduBuffIndex =0;
13795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->Felica.NoBlocksWritten = 0;
13805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status= phFriNfc_Felica_HUpdateAttrBlkForWrOp(NdefMap,FELICA_WRITE_STARTED);
13815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
13825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }/*if (NdefMap->Felica.Offset == PH_FRINFC_NDEFMAP_SEEK_CUR )*/
13835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
13845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
13855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (status);
13865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
13875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
13885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
13895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Used in Read Opearation.
13905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  This Function is called after a successful validation and storing of attribution block
13915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  content in to context.
13925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  While Offset is set to Current, Checks for the EOF card reached status and reads data from
13935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  The Card
13945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
13955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
13965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS   phFriNfc_Felica_HChkAttrBlkForRdOp(phFriNfc_NdefMap_t *NdefMap,
13975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                      uint32_t NdefLen)
13985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
13995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS   status = NFCSTATUS_PENDING;
14005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
14015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*check WR Flag Access Rights*/
14025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* set to still writing data state only cannot Read*/
14035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ( NdefMap->FelicaAttrInfo.WriteFlag == 0x0F )
14045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
14055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         status =  PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,NFCSTATUS_READ_FAILED);
14065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         /* As we are not able to continue with reading data
14075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            bytes read set to zero*/
14085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         *NdefMap->NumOfBytesRead = 0;
14095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
14105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
14115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
14125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = phFriNfc_MapTool_SetCardState( NdefMap,NdefLen);
14135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if ( status == NFCSTATUS_SUCCESS)
14145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
14155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* Read data From the card*/
14165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = phFriNfc_Felica_HReadData(NdefMap,NdefMap->Felica.Offset);
14175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
14185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
14195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
14205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (status);
14215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
14225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
14235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
14245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Used in Write Opearation.
14255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * This function writes the data in terms of blocks.
14265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Each write operation supports,minimum Nbw blocks of bytes.
14275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Also checks for the EOF,>=NBW,<NBW etc
14285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
14295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS   phFriNfc_Felica_HUpdateData(phFriNfc_NdefMap_t *NdefMap)
14305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
14315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS status = NFCSTATUS_PENDING;
14325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
14335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t BufIndex=0,
14345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            i=0,
14355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            BlkNo=0,
14365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            PadBytes=0,
14375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            CurBlk=1,
14385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NoOfBlks=0,
14395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NbwCheck=0,
14405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            TotNoBlks=0;
14415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
14425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint32_t BytesRemainedInCard=0,
14435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly             BytesRemained=0,
14445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly             TotNoWrittenBytes=0;
14455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
14465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( (NdefMap->ApduBufferSize -  NdefMap->ApduBuffIndex) > 0 )
14475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
14485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Prepare the write cmd pkt for felica*/
14495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* 1st byte represents the length of the cmd packet*/
14505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->SendRecvBuf[BufIndex] = 0x00;
14515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex++;
14525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
14535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Write/Update command code*/
14545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->SendRecvBuf[BufIndex] = 0x08;
14555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex++;
14565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
14575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* IDm - Manufacturer Id : 8bytes*/
14585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE
14595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        (void)memcpy((&(NdefMap->SendRecvBuf[BufIndex])),
14605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     (&(NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.IDm)),
14615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                      8);
14625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
14635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         (void)memcpy((&(NdefMap->SendRecvBuf[BufIndex])),
14645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     (&(NdefMap->psRemoteDevInfo->RemoteDevInfo.CardInfo212_424.Startup212_424.NFCID2t)),
14655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                      8);
14665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif  /* #ifdef PH_HAL4_ENABLE */
14675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
14685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex+=8;
14695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
14705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->SendRecvBuf[BufIndex]    =   0x01;   /*  Number of Services (n=1 ==> 0x80)*/
14715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex++;
14725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
14735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->SendRecvBuf[BufIndex]    =   0x09;   /*  Service Code List*/
14745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex++;
14755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
14765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->SendRecvBuf[BufIndex]    =   0x00;   /* Service Code List*/
14775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        BufIndex++;
14785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
14795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if ( NdefMap->Felica.EofCardReachedFlag == FELICA_EOF_REACHED_WR_WITH_BEGIN_OFFSET)
14805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
14815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* check for the eof card reached flag.Need to write only mamximum bytes(memory)to card.
14825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Used when, offset set to begin case*/
14835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            BytesRemainedInCard= ( (NdefMap->FelicaAttrInfo.Nmaxb*16) - (NdefMap->Felica.CurBlockNo * 16));
14845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
14855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
14865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
14875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* Offset : Cuurent*/
14885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if ( NdefMap->Felica.EofCardReachedFlag == FELICA_EOF_REACHED_WR_WITH_CURR_OFFSET )
14895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
14905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                  /* caculate previously written Ndef blks*/
14915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 (void)phFriNfc_Felica_HGetMaximumBlksToRead(NdefMap,PH_NFCFRI_NDEFMAP_FELI_NBC);
14925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
14935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 if ( NdefMap->Felica.Wr_BytesRemained  )
14945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 {
14955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    TotNoWrittenBytes = ( (NdefMap->Felica.CurBlockNo *16)- (16 - (NdefMap->Felica.Wr_BytesRemained)));
14965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 }
14975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 else
14985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 {
14995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    TotNoWrittenBytes = ( NdefMap->Felica.CurBlockNo *16);
15005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 }
15015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 /* Determine exactly, how many bytes we can write*/
15025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 BytesRemainedInCard = (NdefMap->FelicaAttrInfo.Nmaxb*16 - (TotNoWrittenBytes));
15035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
15045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
15055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
15065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Write Data Pending in the Internal Buffer*/
15075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(NdefMap->Felica.Wr_BytesRemained > 0)
15085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
15095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* update the number of blocks to write with the block list elements*/
15105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* Total Number of blocks to write*/
15115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->SendRecvBuf[BufIndex]    =   0;
15125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            BufIndex++;
15135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
15145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* Update this Total no. Bloks later*/
15155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NoOfBlks = BufIndex;
15165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
15175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* As we are writing atleast one block*/
15185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            TotNoBlks = 1;
15195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
15205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* check do we have some extra bytes to write? in User Buffer*/
15215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if ( NdefMap->ApduBufferSize >(uint32_t) (16 - NdefMap->Felica.Wr_BytesRemained))
15225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
15235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Have we reached EOF?*/
15245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if ( NdefMap->Felica.EofCardReachedFlag )
15255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
15265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    BytesRemained = BytesRemainedInCard;
15275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
15285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
15295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
15305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* This value tells how many extra bytes we can write other than internal buffer bytes*/
15315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    BytesRemained = (uint8_t)NdefMap->ApduBufferSize - (16 - NdefMap->Felica.Wr_BytesRemained);
15325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
15335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
15345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if ( BytesRemained )
15355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
15365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* Not reached EOF*/
15375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if (!NdefMap->Felica.EofCardReachedFlag)
15385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
15395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                       /* Calculate How many blks we need to write*/
15405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        BlkNo =((uint8_t)( BytesRemained )/16);
15415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
15425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /* check blocks to write exceeds nbw*/
15435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        if ( BlkNo >= NdefMap->FelicaAttrInfo.Nbw )
15445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
15455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            BlkNo = NdefMap->FelicaAttrInfo.Nbw;
15465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            /* No. Blks to write are more than Nbw*/
15475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NbwCheck = 1;
15485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
15495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        else
15505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
15515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             if  ((( BytesRemained %16) == 0)&& (BlkNo == 0 ))
15525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
15535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                BlkNo=1;
15545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
15555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
15565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /* check do we need pad bytes?*/
15575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        if( (!NbwCheck && (uint8_t)( BytesRemained)%16) != 0)
15585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
15595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            BlkNo++;
15605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            PadBytes = (BlkNo * 16) - (uint8_t)( BytesRemained);
15615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->Felica.PadByteFlag = TRUE;
15625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->Felica.NoBlocksWritten = BlkNo;
15635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            TotNoBlks += BlkNo;
15645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
15655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
15665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        else
15675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
15685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            if ( NbwCheck )
15695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
15705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                /* as we have to write only 8 blocks and already we have pad bytes so we have
15715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                to strat from previous block*/
15725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                TotNoBlks += BlkNo - 1;
15735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->Felica.NoBlocksWritten = TotNoBlks-1;
15745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
15755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            else
15765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
15775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                if ( !(BytesRemained - (16 -NdefMap->Felica.Wr_BytesRemained)== 0 ))
15785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                {
15795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    TotNoBlks += BlkNo;
15805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                }
15815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                else
15825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                {
15835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
15845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                }
15855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 if ( NdefMap->Felica.PadByteFlag )
15865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                {
15875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    NdefMap->Felica.NoBlocksWritten = TotNoBlks-1;
15885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
15895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                }
15905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
15915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
15925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
15935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
15945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
15955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                         /* we have reached the eof card & hv bytes to write*/
15965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        BlkNo =(uint8_t)(( BytesRemained - ((16 -NdefMap->Felica.Wr_BytesRemained)) )/16);
15975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
15985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /* check are we exceeding the NBW limit, while a write?*/
15995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        if ( BlkNo >= NdefMap->FelicaAttrInfo.Nbw )
16005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
16015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            BlkNo = NdefMap->FelicaAttrInfo.Nbw;
16025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
16035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            /* No. Blks to write are more than Nbw*/
16045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NbwCheck = 1;
16055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
16065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
16075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        else
16085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
16095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            if  ((( BytesRemained %16) == 0)&& (BlkNo == 0 ))
16105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
16115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                BlkNo=1;
16125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
16135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
16145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
16155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /*check Total how many blocks to write*/
16165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        if(((!NbwCheck) &&( BytesRemained- (16 - NdefMap->Felica.Wr_BytesRemained))%16) != 0)
16175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
16185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            BlkNo++;
16195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            PadBytes = (BlkNo * 16) - (uint8_t)( BytesRemained);
16205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->Felica.PadByteFlag = TRUE;
16215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->Felica.NoBlocksWritten = BlkNo;
16225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            TotNoBlks += BlkNo;
16235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
16245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
16255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        else
16265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
16275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            if ( NbwCheck )
16285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
16295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                /* as we have to write only 8 blocks and already we have pad bytes so we have
16305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                to strat from previous last block*/
16315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                TotNoBlks += BlkNo - 1;
16325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->Felica.NoBlocksWritten = TotNoBlks-1;
16335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
16345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            else
16355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
16365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                /* we need to write only one block ( bytesremanind + internal buffer size = 16)*/
16375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                if ( !(BytesRemained - (16 -NdefMap->Felica.Wr_BytesRemained)== 0 ))
16385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                {
16395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    TotNoBlks += BlkNo;
16405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                }
16415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                else
16425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                {
16435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    ;/* we are not incrementing the Total no. of blocks to write*/
16445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                }
16455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
16465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                if ( NdefMap->Felica.PadByteFlag )
16475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                {
16485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    NdefMap->Felica.NoBlocksWritten = TotNoBlks -1;
16495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
16505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                }
16515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
16525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
16535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
16545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }/*if ( BytesRemained )*/
16555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
16565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
16575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                   ; /*Nothing to process here*/
16585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
16595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }/*if ( NdefMap->ApduBufferSize >(uint32_t) (16 - NdefMap->Felica.Wr_BytesRemained))*/
16605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
16615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
16625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* No new blks to write*/
16635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->Felica.NoBlocksWritten = 0;
16645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
16655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* Prepare the Blk List for Write Operation*/
16665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* Block List for NBw : 1st byte : two byte len list: 2nd byte is the block number*/
16675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            for ( i=0; i< TotNoBlks; i++)
16685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
16695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->SendRecvBuf[BufIndex]    =   0x80;
16705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                BufIndex++;
16715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* remember the previous Blk no and continue from there*/
16725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if ( NdefMap->Felica.PadByteFlag == TRUE )
16735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
16745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->SendRecvBuf[BufIndex]    =   NdefMap->Felica.CurBlockNo + i;
16755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    BufIndex++;
16765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
16775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
16785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
16795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    CurBlk = NdefMap->Felica.CurBlockNo +1;
16805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->SendRecvBuf[BufIndex]    =   CurBlk + i;
16815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    BufIndex++;
16825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
16835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
16845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* Copy relevant data to Transc buffer*/
16855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if((NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex) >= (uint32_t)(16 - NdefMap->Felica.Wr_BytesRemained))
16865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
16875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
16885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*Copy the Remained bytes from the internal buffer to  trxbuffer */
16895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                (void)memcpy( (&(NdefMap->SendRecvBuf[BufIndex])),
16905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->Felica.Wr_RemainedBytesBuff,
16915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->Felica.Wr_BytesRemained);
16925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
16935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*Increment the buff index*/
16945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                BufIndex += NdefMap->Felica.Wr_BytesRemained;
16955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
16965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
16975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*append copy 16-bytesToPad to trxBuffer*/
16985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                (void)memcpy( (&(NdefMap->SendRecvBuf[BufIndex])),
16995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               (&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex])),
17005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                (16 - NdefMap->Felica.Wr_BytesRemained));
17015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
17025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Update Number Of Bytes Writtened*/
17035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->NumOfBytesWritten = 16 - NdefMap->Felica.Wr_BytesRemained;
17045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
17055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* increment the index*/
17065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                BufIndex += 16 - NdefMap->Felica.Wr_BytesRemained;
17075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
17085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if ( BytesRemained )
17095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
17105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if (!NdefMap->Felica.EofCardReachedFlag)
17115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
17125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /* check nbw limit*/
17135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        if ( NbwCheck != 1 )
17145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
17155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            /* Copy Extra Bytes other than the internal buffer bytes*/
17165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            (void)memcpy( (&(NdefMap->SendRecvBuf[BufIndex])),
17175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        (&(NdefMap->ApduBuffer[(16 - NdefMap->Felica.Wr_BytesRemained)])),
17185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        (NdefMap->ApduBufferSize - (16 - NdefMap->Felica.Wr_BytesRemained)));
17195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
17205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
17215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            /* Update Number Of Bytes Writtened*/
17225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->NumOfBytesWritten += (uint16_t)(NdefMap->ApduBufferSize - (16 - NdefMap->Felica.Wr_BytesRemained));
17235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
17245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            BufIndex += (uint8_t)(NdefMap->ApduBufferSize - (16 - NdefMap->Felica.Wr_BytesRemained));
17255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
17265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            if ( PadBytes )
17275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
17285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                for(i= 0; i< PadBytes; i++)
17295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                {
17305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    NdefMap->SendRecvBuf[BufIndex] =0x00;
17315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    BufIndex++;
17325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                }
17335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                /* no of bytes remained copy*/
17345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->Felica.Wr_BytesRemained = (uint8_t)(16 - PadBytes);
17355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
17365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                /*copy the data to internal buffer : Bytes remained*/
17375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                (void)memcpy( NdefMap->Felica.Wr_RemainedBytesBuff,
17385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                              (&( NdefMap->ApduBuffer[(NdefMap->ApduBufferSize - NdefMap->Felica.Wr_BytesRemained)])),
17395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                              ( NdefMap->Felica.Wr_BytesRemained));
17405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
17415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            else
17425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
17435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                /* No Bytes in Internal buffer*/
17445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->Felica.Wr_BytesRemained = 0;
17455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
17465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
17475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
17485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        else
17495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
17505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
17515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            /*Copy Nbw*16 bytes of data to the trx buffer*/
17525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             (void)memcpy( (&(NdefMap->SendRecvBuf[BufIndex])),
17535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                           (&(NdefMap->ApduBuffer[(16 - NdefMap->Felica.Wr_BytesRemained)])),
17545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            (NdefMap->FelicaAttrInfo.Nbw - 1) * 16);
17555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
17565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            /* increment the Buffindex*/
17575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            BufIndex += ((NdefMap->FelicaAttrInfo.Nbw - 1 )*16);
17585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
17595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->Felica.Wr_BytesRemained = 0;
17605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->NumOfBytesWritten+= ((NdefMap->FelicaAttrInfo.Nbw -1)*16);
17615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->Felica.PadByteFlag =FALSE;
17625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
17635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }/*if (!NdefMap->Felica.EofCardReachedFlag)*/
17645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
17655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
17665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                         /* check nbw limit*/
17675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        if ( NbwCheck != 1 )
17685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
17695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            /* handle EOF card reached case*/
17705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            (void)memcpy( (&(NdefMap->SendRecvBuf[BufIndex])),
17715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                       (&(NdefMap->ApduBuffer[(16 - NdefMap->Felica.Wr_BytesRemained)])),
17725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                       ( BytesRemained - ((16 -NdefMap->Felica.Wr_BytesRemained) )));
17735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
17745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            /* Update Number Of Bytes Writtened*/
17755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->NumOfBytesWritten += (uint16_t)( BytesRemained - (16 -NdefMap->Felica.Wr_BytesRemained));
17765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
17775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            BufIndex += (uint8_t)( BytesRemained - (16 -NdefMap->Felica.Wr_BytesRemained));
17785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
17795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            if ( PadBytes )
17805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
17815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                for(i= 0; i< PadBytes; i++)
17825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                {
17835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    NdefMap->SendRecvBuf[BufIndex] =0x00;
17845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    BufIndex++;
17855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                }
17865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
17875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                /*no of bytes remained copy*/
17885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->Felica.Wr_BytesRemained = (uint8_t)(16 - PadBytes);
17895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
17905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                /*copy the data to internal buffer : Bytes remained*/
17915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                (void)memcpy(NdefMap->Felica.Wr_RemainedBytesBuff,
17925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             (&(NdefMap->ApduBuffer[(NdefMap->ApduBufferSize - NdefMap->Felica.Wr_BytesRemained)])),
17935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             (NdefMap->Felica.Wr_BytesRemained));
17945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
17955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
17965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            else
17975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
17985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->Felica.Wr_BytesRemained = 0;
17995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
18005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
18015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        else
18025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
18035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
18045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            /*Copy Nbw*16 bytes of data to the trx buffer*/
18055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            (void)memcpy((&(NdefMap->SendRecvBuf[BufIndex])),
18065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                       (&(NdefMap->ApduBuffer[(16 - NdefMap->Felica.Wr_BytesRemained)])),
18075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                       (NdefMap->FelicaAttrInfo.Nbw - 1) * 16);
18085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
18095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            /* increment the Buffindex*/
18105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            BufIndex += ((NdefMap->FelicaAttrInfo.Nbw - 1 )*16);
18115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
18125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->Felica.Wr_BytesRemained = 0;
18135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->NumOfBytesWritten+= ((NdefMap->FelicaAttrInfo.Nbw -1)*16);
18145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
18155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->Felica.PadByteFlag =FALSE;
18165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
18175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
18185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }/*if ( BytesRemained )*/
18195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
18205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
18215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->Felica.Wr_BytesRemained = 0;
18225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
18235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Update Total No. of blocks writtened*/
18245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->SendRecvBuf[NoOfBlks -1 ]=TotNoBlks;
18255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }/*if((NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex) >= (uint32_t)(16 - NdefMap->Felica.Wr_BytesRemained))*/
18265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
18275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
18285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*copy the internal buffer data to   trx buffer*/
18295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                (void)memcpy((&(NdefMap->SendRecvBuf[BufIndex])),
18305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                              NdefMap->Felica.Wr_RemainedBytesBuff,
18315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             (NdefMap->Felica.Wr_BytesRemained));
18325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
18335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* increment the index*/
18345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                BufIndex+=NdefMap->Felica.Wr_BytesRemained;
18355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
18365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*append the apdusize data to the trx buffer*/
18375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                (void)memcpy((&(NdefMap->SendRecvBuf[BufIndex])),
18385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            (&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex])),
18395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->ApduBufferSize);
18405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
18415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 /* Index increment*/
18425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                BufIndex+= (uint8_t)NdefMap->ApduBufferSize;
18435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
18445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Tells how many bytes present in the internal buffer*/
18455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                BytesRemained = NdefMap->Felica.Wr_BytesRemained + NdefMap->ApduBufferSize;
18465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
18475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                PadBytes = (uint8_t)(16-BytesRemained);
18485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
18495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Pad empty bytes with Zeroes to complete 16 bytes*/
18505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                for(i= 0; i< PadBytes; i++)
18515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
18525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->SendRecvBuf[BufIndex] =0x00;
18535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    BufIndex++;
18545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
18555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
18565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Update Number Of Bytes Writtened*/
18575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->NumOfBytesWritten = (uint16_t)NdefMap->ApduBufferSize;
18585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
18595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Flag set to understand that , we have received less no. of bytes than
18605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                present in the internal buffer*/
18615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->Felica.IntermediateWrFlag = TRUE;
18625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
18635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if ( NdefMap->Felica.PadByteFlag )
18645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
18655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->Felica.NoBlocksWritten = 0;
18665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
18675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
18685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
18695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->SendRecvBuf[PH_NFCFRI_NDEFMAP_FELI_PKT_LEN_INDEX] = BufIndex;
18705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->SendLength = BufIndex;
18715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* Update Total No. of blocks writtened*/
18725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->SendRecvBuf[NoOfBlks -1 ]=TotNoBlks;
18735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
18745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
18755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
18765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /*Fresh write, starting from a new block*/
18775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if ( (NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex) >= (uint32_t)(16* NdefMap->FelicaAttrInfo.Nbw ))
18785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
18795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* check for the card size and write Nbw Blks*/
18805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if ( NdefMap->FelicaAttrInfo.Nmaxb - NdefMap->Felica.CurBlockNo >= NdefMap->FelicaAttrInfo.Nbw)
18815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
18825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* update the number of blocks to write with the block list elements*/
18835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* Total Number of blocks to write*/
18845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->SendRecvBuf[BufIndex]    =   NdefMap->FelicaAttrInfo.Nbw;
18855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    BufIndex++;
18865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
18875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* Block List for NBw : 1st byte : two byte len list: 2nd byte is the block number*/
18885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    for ( i=1; i<= NdefMap->FelicaAttrInfo.Nbw; i++)
18895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
18905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->SendRecvBuf[BufIndex]    =   0x80;
18915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        BufIndex++;
18925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
18935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->SendRecvBuf[BufIndex]    =   NdefMap->Felica.CurBlockNo + i;
18945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        BufIndex++;
18955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
18965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /*Copy Nbw*16 bytes of data to the trx buffer*/
18975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
18985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    (void)memcpy((&(NdefMap->SendRecvBuf[BufIndex])),
18995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 (&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex])),
19005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 NdefMap->FelicaAttrInfo.Nbw * 16);
19015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
19025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* increment the Buffindex*/
19035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    BufIndex += (NdefMap->FelicaAttrInfo.Nbw*16);
19045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
19055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* update the length*/
19065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->SendRecvBuf[PH_NFCFRI_NDEFMAP_FELI_PKT_LEN_INDEX] = BufIndex;
19075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
19085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->Felica.Wr_BytesRemained = 0;
19095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->NumOfBytesWritten = (NdefMap->FelicaAttrInfo.Nbw*16);
19105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->Felica.NoBlocksWritten = NdefMap->FelicaAttrInfo.Nbw;
19115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
19125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* update the Send length*/
19135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->SendLength = BufIndex;
19145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
19155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->Felica.PadByteFlag = FALSE;
19165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }/*if ( NdefMap->FelicaAttrInfo.Nmaxb - NdefMap->Felica.CurBlockNo >= NdefMap->FelicaAttrInfo.Nbw)*/
19175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
19185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
19195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* we need to write less than nbw blks*/
19205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* update the number of blocks to write with the block list elements*/
19215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* Total Number of blocks to write*/
19225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->SendRecvBuf[BufIndex] = (uint8_t)( NdefMap->FelicaAttrInfo.Nmaxb - NdefMap->Felica.CurBlockNo);
19235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    BufIndex++;
19245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
19255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* Block List for NBw : 1st byte : two byte len list: 2nd byte is the block number*/
19265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    for ( i=1; i<= (NdefMap->FelicaAttrInfo.Nmaxb - NdefMap->Felica.CurBlockNo); i++)
19275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
19285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->SendRecvBuf[BufIndex]    =   0x80;
19295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        BufIndex++;
19305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->SendRecvBuf[BufIndex]    =   NdefMap->Felica.CurBlockNo + i;
19315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        BufIndex++;
19325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
19335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
19345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /*Copy Nbw*16 bytes of data to the trx buffer*/
19355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    (void)memcpy((&(NdefMap->SendRecvBuf[BufIndex])),
19365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 (&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex])),
19375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 (NdefMap->FelicaAttrInfo.Nmaxb - NdefMap->Felica.CurBlockNo)*16);
19385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
19395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* increment the Buffindex*/
19405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    BufIndex += (uint8_t)((NdefMap->FelicaAttrInfo.Nmaxb - NdefMap->Felica.CurBlockNo )*16);
19415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
19425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* update the length*/
19435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->SendRecvBuf[PH_NFCFRI_NDEFMAP_FELI_PKT_LEN_INDEX] = BufIndex;
19445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
19455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->NumOfBytesWritten = ((NdefMap->FelicaAttrInfo.Nmaxb - NdefMap->Felica.CurBlockNo)*16);
19465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->Felica.NoBlocksWritten = (uint8_t)(NdefMap->FelicaAttrInfo.Nmaxb - NdefMap->Felica.CurBlockNo);
19475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
19485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* update the Send length*/
19495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->SendLength = BufIndex;
19505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
19515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->Felica.PadByteFlag =FALSE;
19525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->Felica.Wr_BytesRemained = 0;
19535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
19545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }/* if ( (NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex) >= (uint32_t)(16* NdefMap->FelicaAttrInfo.Nbw )) */
19555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
19565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
19575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*chk eof reached*/
19585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if ( NdefMap->Felica.EofCardReachedFlag)
19595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
19605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    BlkNo =((uint8_t)(BytesRemainedInCard )/16);
19615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(((uint8_t)( BytesRemainedInCard )%16) != 0)
19625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
19635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        BlkNo++;
19645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        PadBytes = ((BlkNo * 16) - (uint8_t)(BytesRemainedInCard ));
19655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->Felica.PadByteFlag = TRUE;
19665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
19675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
19685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
19695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
19705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
19715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    BlkNo =((uint8_t)( NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex)/16);
19725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(((uint8_t)( NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex)%16) != 0)
19735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
19745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        BlkNo++;
19755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        PadBytes = (BlkNo * 16) - (uint8_t)( NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex);
19765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->Felica.PadByteFlag = TRUE;
19775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
19785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
19795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
19805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
19815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
19825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
19835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* update the number of blocks to write with the block list elements*/
19845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Total Number of blocks to write*/
19855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->SendRecvBuf[BufIndex]    =  BlkNo;
19865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                BufIndex++;
19875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
19885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->Felica.NoBlocksWritten = BlkNo;
19895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
19905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Block List for NBw : 1st byte : two byte len list: 2nd byte is the block number*/
19915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                for ( i=0; i< BlkNo; i++)
19925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
19935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->SendRecvBuf[BufIndex]    =   0x80;
19945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    BufIndex++;
19955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
19965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        CurBlk = NdefMap->Felica.CurBlockNo +1;
19975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->SendRecvBuf[BufIndex]    =   CurBlk + i;
19985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        BufIndex++;
19995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
20005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
20015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if ( NdefMap->Felica.EofCardReachedFlag )
20025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
20035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /*Copy last data to the trx buffer*/
20045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    (void)memcpy((&(NdefMap->SendRecvBuf[BufIndex])),
20055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 (&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex])),
20065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 BytesRemainedInCard );
20075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
20085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* increment the bufindex and bytes written*/
20095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    BufIndex += (uint8_t )BytesRemainedInCard ;
20105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->NumOfBytesWritten = (uint16_t)BytesRemainedInCard ;
20115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
20125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
20135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
20145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /*Copy data to the trx buffer*/
20155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    (void)memcpy((&(NdefMap->SendRecvBuf[BufIndex])),
20165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 (&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex])),
20175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 (NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex));
20185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
20195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* increment the bufindex and bytes written*/
20205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    BufIndex += (uint8_t)(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex);
20215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->NumOfBytesWritten = (uint8_t)(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex);
20225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
20235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if ( PadBytes )
20245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
20255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    for(i= 0; i< PadBytes; i++)
20265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
20275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->SendRecvBuf[BufIndex] =0x00;
20285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        BufIndex++;
20295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
20305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /*no of bytes remained copy*/
20315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->Felica.Wr_BytesRemained = (uint8_t)(16 - PadBytes);
20325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
20335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if ( NdefMap->Felica.EofCardReachedFlag )
20345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
20355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /*copy the data to internal buffer : Bytes remained*/
20365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        (void)memcpy(NdefMap->Felica.Wr_RemainedBytesBuff,
20375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    (&(NdefMap->ApduBuffer[((BytesRemainedInCard - (BytesRemainedInCard % 16)))])),
20385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    ( NdefMap->Felica.Wr_BytesRemained));
20395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
20405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
20415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
20425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
20435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /*copy the data to internal buffer : Bytes remained*/
20445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        (void)memcpy( NdefMap->Felica.Wr_RemainedBytesBuff,
20455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                       (&(NdefMap->ApduBuffer[((NdefMap->ApduBufferSize - NdefMap->Felica.Wr_BytesRemained))])),
20465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        ( NdefMap->Felica.Wr_BytesRemained));
20475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
20485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
20495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }/*if ( PadBytes )*/
20505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
20515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
20525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->Felica.Wr_BytesRemained = 0;
20535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->Felica.PadByteFlag = FALSE;
20545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
20555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* update the pkt len*/
20565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->SendRecvBuf[PH_NFCFRI_NDEFMAP_FELI_PKT_LEN_INDEX] = BufIndex;
20575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NdefMap->SendLength = BufIndex;
20585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
20595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }/* else of if ( (NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex) >= (uint32_t)(16* NdefMap->FelicaAttrInfo.Nbw )) */
20605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = phFriNfc_Felica_HWriteDataBlk(NdefMap);
20615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
20625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
20635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
20645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*0 represents the write operation ended*/
20655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = phFriNfc_Felica_HUpdateAttrBlkForWrOp(NdefMap,FELICA_WRITE_ENDED);
20665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
20675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (status);
20685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
20695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
20705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
20715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
20725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Used in Write Opearation.
20735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * This function prepares and sends transcc Cmd Pkt.
20745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
20755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
20765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Felica_HWriteDataBlk(phFriNfc_NdefMap_t *NdefMap)
20775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
20785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS status = NFCSTATUS_PENDING;
20795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
20805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*set the additional informations for the data exchange*/
20815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
20825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
20835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
20845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*Set the ISO14434 command*/
20855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE
20865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->Cmd.FelCmd = phHal_eFelica_Raw;
20875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
20885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->Cmd.FelCmd = phHal_eFelicaCmdListFelicaCmd;
20895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif  /* #ifdef PH_HAL4_ENABLE */
20905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
20915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* set the state*/
20925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->State = PH_NFCFRI_NDEFMAP_FELI_STATE_WR_BLOCK;
20935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
20945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* set send receive length*/
20955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
20965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
20975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly     /*Call the Overlapped HAL Transceive function */
20985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    status = phFriNfc_OvrHal_Transceive( NdefMap->LowerDevice,
20995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                         &NdefMap->MapCompletionInfo,
21005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                         NdefMap->psRemoteDevInfo,
21015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                         NdefMap->Cmd,
21025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                         &NdefMap->psDepAdditionalInfo,
21035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                         NdefMap->SendRecvBuf,
21045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                         NdefMap->SendLength,
21055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                         NdefMap->SendRecvBuf,
21065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                         NdefMap->SendRecvLength);
21075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (status);
21085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
21095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
21105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
21115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Check whether a particular Remote Device is NDEF compliant.
21125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * The function checks whether the peer device is NDEF compliant.
21135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
21145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
21155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_Felica_ChkNdef( phFriNfc_NdefMap_t     *NdefMap)
21165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
21175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS status = NFCSTATUS_PENDING;
21185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t sysCode[2];
21195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
21205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* set the system code for selecting the wild card*/
21215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    sysCode[0] = 0x12;
21225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    sysCode[1] = 0xFC;
21235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
21245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    status = phFriNfc_Felica_HPollCard( NdefMap,sysCode,PH_NFCFRI_NDEFMAP_FELI_STATE_SELECT_NDEF_APP);
21255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
21265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (status);
21275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
21285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
21295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
21305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Check whether a particular Remote Device is NDEF compliant.
2131dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi * selects the sysCode and then NFC Forum Reference Applications
21325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
2133dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi#ifdef PH_HAL4_ENABLE
2134dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogistatic NFCSTATUS   phFriNfc_Felica_HPollCard(  phFriNfc_NdefMap_t     *NdefMap,
2135dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi                                        const uint8_t sysCode[],
2136dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi                                        uint8_t state)
2137dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi{
2138dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    NFCSTATUS status = NFCSTATUS_PENDING;
2139dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi
2140dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    /*Format the Poll Packet for selecting the system code passed as parameter */
2141dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    NdefMap->SendRecvBuf[0] = 0x06;
2142dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    NdefMap->SendRecvBuf[1] = 0x00;
2143dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    NdefMap->SendRecvBuf[2] = sysCode[0];
2144dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    NdefMap->SendRecvBuf[3] = sysCode[1];
2145dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    NdefMap->SendRecvBuf[4] = 0x01;
2146dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    NdefMap->SendRecvBuf[5] = 0x03;
2147dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi
2148dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    NdefMap->SendLength = 6;
2149dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi
2150dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi     /*set the completion routines for the felica card operations*/
2151dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_Felica_Process;
2152dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    NdefMap->MapCompletionInfo.Context = NdefMap;
2153dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi
2154dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    /*Set Ndef State*/
2155dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    NdefMap->State = state;
2156dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi
2157dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    /* set the felica cmd */
2158dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    NdefMap->Cmd.FelCmd = phHal_eFelica_Raw;
2159dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi
2160dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    /*set the additional informations for the data exchange*/
2161dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
2162dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
2163dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi
2164dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    status = phFriNfc_OvrHal_Transceive(NdefMap->LowerDevice,
2165dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi                                        &NdefMap->MapCompletionInfo,
2166dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi                                        NdefMap->psRemoteDevInfo,
2167dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi                                        NdefMap->Cmd,
2168dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi                                        &NdefMap->psDepAdditionalInfo,
2169dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi                                        NdefMap->SendRecvBuf,
2170dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi                                        NdefMap->SendLength,
2171dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi                                        NdefMap->SendRecvBuf,
2172dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi                                        NdefMap->SendRecvLength);
2173dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    return (status);
2174dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi}
2175dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi#endif
2176dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi
21775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
21785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_HAL4_ENABLE
21795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS   phFriNfc_Felica_HPollCard(  phFriNfc_NdefMap_t     *NdefMap,
21805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        const uint8_t                 sysCode[],
21815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        uint8_t                 state)
21825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
21835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS status = NFCSTATUS_PENDING;
21845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
21855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*Format the Poll Packet for selecting the wild card "0xff 0xff as system code*/
21865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->FelicaPollDetails.DevInputParam->FelicaPollPayload[0]   =   0x00;
21875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->FelicaPollDetails.DevInputParam->FelicaPollPayload[1]   =   sysCode[0];
21885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->FelicaPollDetails.DevInputParam->FelicaPollPayload[2]   =   sysCode[1];
21895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->FelicaPollDetails.DevInputParam->FelicaPollPayload[3]   =   0x01;
21905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->FelicaPollDetails.DevInputParam->FelicaPollPayload[4]   =   0x03;
21915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
21925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* set the length to zero*/
21935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->FelicaPollDetails.DevInputParam->GeneralByteLength =0x00;
21945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
21955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->NoOfDevices = PH_FRINFC_NDEFMAP_FELI_NUM_DEVICE_TO_DETECT;
21965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
21975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly     /*set the completion routines for the felica card operations*/
21985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_Felica_Process;
21995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->MapCompletionInfo.Context = NdefMap;
22005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
22015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*Set Ndef State*/
22025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->State = state;
22035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
22045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*  Harsha: This is a special case for felica.
22055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        Make a copy of the remote device information and send it for
22065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        polling. Return the original remote device information to the
22075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        caller. The user does not need the updated results of the poll
22085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        that we are going to call now. This is only used for checking
22095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        whether the felica card is NDEF compliant or not. */
22105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly     (void) memcpy( &NdefMap->FelicaPollDetails.psTempRemoteDevInfo,
22115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefMap->psRemoteDevInfo,
22125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            sizeof(phHal_sRemoteDevInformation_t));
22135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
22145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*  Reset the session opened flag */
22155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->FelicaPollDetails.psTempRemoteDevInfo.SessionOpened = 0x00;
22165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
22175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*Call the Overlapped HAL POLL function */
22185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    status =  phFriNfc_OvrHal_Poll( NdefMap->LowerDevice,
22195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    &NdefMap->MapCompletionInfo,
22205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    NdefMap->OpModeType,
22215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    &NdefMap->FelicaPollDetails.psTempRemoteDevInfo,
22225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    &NdefMap->NoOfDevices,
22235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    NdefMap->FelicaPollDetails.DevInputParam);
22245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
22255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (status);
22265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
22275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifndef PH_HAL4_ENABLE */
22285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
22295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Checks validity of system code sent from the lower device, during poll operation.
22305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
22315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
22325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS   phFriNfc_Felica_HUpdateManufIdDetails(const phFriNfc_NdefMap_t *NdefMap)
22335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
22345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS status = NFCSTATUS_PENDING;
22355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2236dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    /* Get the details from Poll Response packet */
2237dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    if (NdefMap->SendRecvLength >= 20)
22385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2239dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi        (void)memcpy(  (uint8_t *)NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.IDm,
2240dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi                       (uint8_t *)&NdefMap->SendRecvBuf[2], 8);
2241dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi        (void)memcpy(  (uint8_t *)NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.PMm,
2242dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi                       (uint8_t *)&NdefMap->SendRecvBuf[10], 8);
2243dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi        NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.SystemCode[1] = NdefMap->SendRecvBuf[18];
2244dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi        NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.SystemCode[0] = NdefMap->SendRecvBuf[19];
2245dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi        NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.IDmLength = 8;
22465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2247dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi        /* copy the IDm and PMm in Manufacture Details Structure*/
2248dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi        (void)memcpy( (uint8_t *)(NdefMap->FelicaManufDetails.ManufID),
2249dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi                      (uint8_t *)NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.IDm,
2250dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi                      8);
2251dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi        (void)memcpy( (uint8_t *)(NdefMap->FelicaManufDetails.ManufParameter),
2252dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi                      (uint8_t *)NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.PMm,
2253dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi                      8);
2254dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi        if((NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.SystemCode[1] == 0x12)
2255dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi            && (NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.SystemCode[0] == 0xFC))
2256dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi        {
2257dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi            status = PHNFCSTVAL(CID_NFC_NONE, NFCSTATUS_SUCCESS);
2258dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi        }
2259dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi        else
2260dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi        {
2261dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi            status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
2262dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi                                NFCSTATUS_NO_NDEF_SUPPORT);
2263dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi        }
22645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
22655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
22665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2267dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi        status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
2268dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi                            NFCSTATUS_NO_NDEF_SUPPORT);
22695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
22705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2271dd7125f5ab402a8e52625182542c668db3e51c2cSunil Jogi    return (status);
22725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
22735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
22745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
22755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
22765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Completion Routine, Processing function, needed to avoid long blocking.
22775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \note The lower (Overlapped HAL) layer must register a pointer to this function as a Completion
22785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Routine in order to be able to notify the component that an I/O has finished and data are
22795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * ready to be processed.
22805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
22815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
22825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellyvoid phFriNfc_Felica_Process(void       *Context,
22835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             NFCSTATUS   Status)
22845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
22855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t  CRFlag = FALSE;
22865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint16_t RecvTxLen = 0,
22875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly             BytesToRecv = 0,
22885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly             Nbc = 0;
22895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint32_t TotNoWrittenBytes = 0,
22905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly             NDEFLen=0;
22915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
22925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*Set the context to Map Module*/
22935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phFriNfc_NdefMap_t      *NdefMap = (phFriNfc_NdefMap_t *)Context;
22945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
22955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ( Status == NFCSTATUS_SUCCESS )
22965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
22975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        switch (NdefMap->State)
22985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
22995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case PH_NFCFRI_NDEFMAP_FELI_STATE_SELECT_NDEF_APP:
23005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
23015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* check the ndef compliency with the system code reecived in the RemoteDevInfo*/
23025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Status = phFriNfc_Felica_HUpdateManufIdDetails(NdefMap);
23035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
23045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if (Status == NFCSTATUS_SUCCESS)
23055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
23065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /* Mantis ID : 645*/
23075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /* set the operation type to Check ndef type*/
23085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->Felica.OpFlag = PH_FRINFC_NDEFMAP_FELI_CHK_NDEF_OP;
23095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        Status = phFriNfc_Felica_HRdAttrInfo(NdefMap);
23105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /* handle the error in Transc function*/
23115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        if ( (Status & PHNFCSTBLOWER) != (NFCSTATUS_PENDING & PHNFCSTBLOWER))
23125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
23135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            CRFlag = TRUE;
23145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
23155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
23165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
23175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
23185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        CRFlag = TRUE;
23195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
23205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if ( CRFlag == TRUE )
23215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
23225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /* call respective CR */
23235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        phFriNfc_Felica_HCrHandler(NdefMap,PH_FRINFC_NDEFMAP_CR_CHK_NDEF,Status);
23245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
23255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
23265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
23275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
23285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case PH_NFCFRI_NDEFMAP_FELI_STATE_RD_ATTR:
23295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly             /* check for the status flag1 and status flag2for the successful read operation*/
23305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if ( NdefMap->SendRecvBuf[10] == 0x00)
23315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
23325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* check the Manuf Id in the receive buffer*/
23335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Status = phFriNfc_Felica_HCheckManufId(NdefMap);
23345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if ( Status == NFCSTATUS_SUCCESS)
23355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
23365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /* Update the Attribute Information in to the context structure*/
23375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        Status = phFriNfc_Felica_HUpdateAttrInfo(NdefMap);
23385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        if ( Status == NFCSTATUS_SUCCESS )
23395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
23405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            PH_NFCFRI_NDEFMAP_FELI_CAL_LEN_BYTES(NdefMap->FelicaAttrInfo.LenBytes[0],
23415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                NdefMap->FelicaAttrInfo.LenBytes[1],
23425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                NdefMap->FelicaAttrInfo.LenBytes[2],
23435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                NDEFLen);
23445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
23455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            if ( NdefMap->Felica.OpFlag == PH_FRINFC_NDEFMAP_FELI_WR_ATTR_RD_OP )
23465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
23475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                /* Proceed With Write Functinality*/
23485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                Status = phFriNfc_Felica_HChkAttrBlkForWrOp(NdefMap);
23495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                /* handle the error in Transc function*/
23505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                if ( (Status & PHNFCSTBLOWER) != (NFCSTATUS_PENDING & PHNFCSTBLOWER))
23515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                {
23525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    /* call respective CR */
23535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    phFriNfc_Felica_HCrHandler(NdefMap,PH_FRINFC_NDEFMAP_CR_WR_NDEF,Status);
23545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                }
23555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
23565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            else if( NdefMap->Felica.OpFlag == PH_FRINFC_NDEFMAP_FELI_RD_ATTR_RD_OP )
23575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
23585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                /* Proceed With Read Functinality*/
23595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                Status = phFriNfc_Felica_HChkAttrBlkForRdOp(NdefMap,NDEFLen);
23605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                if ( (Status & PHNFCSTBLOWER) != (NFCSTATUS_PENDING & PHNFCSTBLOWER))
23615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                {
23625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    /* call respective CR */
23635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    phFriNfc_Felica_HCrHandler(NdefMap,PH_FRINFC_NDEFMAP_CR_RD_NDEF,Status);
23645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                }
23655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
23665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            else if( NdefMap->Felica.OpFlag == PH_FRINFC_NDEFMAP_FELI_CHK_NDEF_OP )
23675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
23685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
23695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                Status = phFriNfc_MapTool_SetCardState( NdefMap,
23705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                        NDEFLen);
23715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                /* check status value*/
23725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->CardType = PH_FRINFC_NDEFMAP_FELICA_SMART_CARD;
23735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                /*reset the buffer index*/
23745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->ApduBuffIndex = 0;
23755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                /* set the Next operation Flag to indicate need of reading attribute information*/
23765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->Felica.OpFlag = PH_FRINFC_NDEFMAP_FELI_OP_NONE;
23775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                /* call respective CR */
23785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                phFriNfc_Felica_HCrHandler(NdefMap,PH_FRINFC_NDEFMAP_CR_CHK_NDEF,Status);
23795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
23805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            else if ( NdefMap->Felica.OpFlag == PH_FRINFC_NDEFMAP_FELI_WR_EMPTY_MSG_OP )
23815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
23825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                /* Proceed With Write Functinality*/
23835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                Status = phFriNfc_Felica_HWrEmptyMsg(NdefMap);
23845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                /* handle the error in Transc function*/
23855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                if ( (Status & PHNFCSTBLOWER) != (NFCSTATUS_PENDING & PHNFCSTBLOWER))
23865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                {
23875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    /* call respective CR */
23885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    phFriNfc_Felica_HCrHandler(NdefMap,PH_FRINFC_NDEFMAP_CR_ERASE_NDEF,Status);
23895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                }
23905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
23915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            else
23925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
23935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
23945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                /* invalid operation occured*/
23955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
23965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NFCSTATUS_INVALID_DEVICE_REQUEST);
23975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                CRFlag =TRUE ;
23985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
23995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
24005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        else
24015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
24025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            CRFlag =TRUE ;
24035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
24045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
24055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
24065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
24075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        CRFlag =TRUE ;
24085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
24095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
24105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
24115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
24125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    CRFlag =TRUE;
24135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /*handle the  Error case*/
24145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
24155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NFCSTATUS_READ_FAILED);
24165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
24175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if ( CRFlag == TRUE )
24185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
24195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* call respective CR */
24205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    phFriNfc_Felica_HCrHandler(NdefMap,PH_FRINFC_NDEFMAP_CR_RD_NDEF,Status);
24215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
24225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
24235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
24245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case PH_NFCFRI_NDEFMAP_FELI_STATE_ATTR_BLK_WR_BEGIN:
24255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* chk the status flags 1 and 2*/
24265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if ( NdefMap->SendRecvBuf[10] == 0x00 )
24275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
24285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /* Update Data Call*/
24295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        Status =phFriNfc_Felica_HUpdateData(NdefMap);
24305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        if ( (Status & PHNFCSTBLOWER) != (NFCSTATUS_PENDING & PHNFCSTBLOWER))
24315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
24325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            /* call respective CR */
24335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            phFriNfc_Felica_HCrHandler(NdefMap,PH_FRINFC_NDEFMAP_CR_WR_NDEF,Status);
24345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
24355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
24365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
24375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
24385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /*handle the  Error case*/
24395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
24405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            NFCSTATUS_WRITE_FAILED);
24415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        phFriNfc_Felica_HCrHandler(NdefMap,PH_FRINFC_NDEFMAP_CR_WR_NDEF,Status);
24425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
24435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
24445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
24455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case PH_NFCFRI_NDEFMAP_FELI_STATE_ATTR_BLK_WR_END:
24465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
24475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* chk the status flags 1 and 2*/
24485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if ( NdefMap->SendRecvBuf[10] == 0x00)
24495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
24505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /* Entire Write Operation is complete*/
24515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        Status = PHNFCSTVAL(CID_NFC_NONE,\
24525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            NFCSTATUS_SUCCESS);
24535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
24545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
24555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
24565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                         /*handle the  Error case*/
24575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
24585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            NFCSTATUS_WRITE_FAILED);
24595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
24605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    phFriNfc_Felica_HCrHandler(NdefMap,PH_FRINFC_NDEFMAP_CR_WR_NDEF,Status);
24615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
24625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
24635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case PH_NFCFRI_NDEFMAP_FELI_STATE_WR_EMPTY_MSG :
24645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
24655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* chk the status flags 1 and 2*/
24665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if ( NdefMap->SendRecvBuf[10] == 0x00)
24675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
24685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /* Entire Write Operation is complete*/
24695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        Status = PHNFCSTVAL(CID_NFC_NONE,\
24705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            NFCSTATUS_SUCCESS);
24715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
24725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
24735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
24745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                         /*handle the  Error case*/
24755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
24765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            NFCSTATUS_WRITE_FAILED);
24775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
24785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    phFriNfc_Felica_HCrHandler(NdefMap,PH_FRINFC_NDEFMAP_CR_WR_NDEF,Status);
24795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
24805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
24815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case PH_NFCFRI_NDEFMAP_FELI_STATE_WR_BLOCK :
24825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if(NdefMap->SendRecvBuf[1] == PH_NFCFRI_NDEFMAP_FELI_WR_RESP_BYTE )
24835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
24845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* chk the status flags 1 and 2*/
24855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if ( NdefMap->SendRecvBuf[10] == 0x00 )
24865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
24875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /* This is used when we have bytes less than 16 bytes*/
24885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        if ( NdefMap->Felica.IntermediateWrFlag == TRUE )
24895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
24905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            /* after Successful write copy the last writtened bytes back to the
24915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            internal buffer*/
24925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            (void)memcpy( (&(NdefMap->Felica.Wr_RemainedBytesBuff[NdefMap->Felica.Wr_BytesRemained])),
24935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            NdefMap->ApduBuffer,
24945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            NdefMap->NumOfBytesWritten);
24955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
24965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->Felica.Wr_BytesRemained +=
24975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                           (uint8_t)( NdefMap->NumOfBytesWritten);
24985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
24995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            /* Increment the Send Buffer index */
25005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->ApduBuffIndex +=
25015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->NumOfBytesWritten;
25025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
25035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            *NdefMap->WrNdefPacketLength = NdefMap->ApduBuffIndex;
25045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->Felica.IntermediateWrFlag = FALSE;
25055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            /* Call Update Data()*/
25065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            Status = phFriNfc_Felica_HUpdateData(NdefMap);
25075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
25085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        else
25095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
25105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            /* update the index and bytes writtened*/
25115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->ApduBuffIndex += NdefMap->NumOfBytesWritten;
25125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            *NdefMap->WrNdefPacketLength = NdefMap->ApduBuffIndex;
25135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            if ( NdefMap->Felica.EofCardReachedFlag )
25145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
25155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                if ( NdefMap->Felica.CurBlockNo < NdefMap->FelicaAttrInfo.Nmaxb)
25165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                {
25175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    NdefMap->Felica.CurBlockNo += NdefMap->Felica.NoBlocksWritten;
25185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                }
25195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                if (( NdefMap->Felica.CurBlockNo == NdefMap->FelicaAttrInfo.Nmaxb) &&
25205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 ( NdefMap->ApduBuffIndex == (NdefMap->FelicaAttrInfo.Nmaxb*16)))
25215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                {
25225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    NdefMap->Felica.EofCardReachedFlag = FELICA_RD_WR_EOF_CARD_REACHED ;
25235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    /*0 represents the write ended*/
25245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    Status = phFriNfc_Felica_HUpdateAttrBlkForWrOp(NdefMap,FELICA_WRITE_ENDED);
25255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    if( (Status & PHNFCSTBLOWER) != (NFCSTATUS_PENDING & PHNFCSTBLOWER))
25265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    {
25275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        /* call respective CR */
25285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        phFriNfc_Felica_HCrHandler(NdefMap,PH_FRINFC_NDEFMAP_CR_WR_NDEF,Status);
25295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    }
25305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                }
25315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                else
25325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                {
25335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    PH_NFCFRI_NDEFMAP_FELI_CAL_LEN_BYTES(NdefMap->FelicaAttrInfo.LenBytes[0],
25345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                NdefMap->FelicaAttrInfo.LenBytes[1],
25355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                NdefMap->FelicaAttrInfo.LenBytes[2],
25365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                TotNoWrittenBytes);
25375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    if ( ( NdefMap->Felica.CurBlockNo == NdefMap->FelicaAttrInfo.Nmaxb) &&
25385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        ((TotNoWrittenBytes + NdefMap->ApduBuffIndex) == (uint32_t)(NdefMap->FelicaAttrInfo.Nmaxb*16)))
25395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    {
25405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NdefMap->Felica.EofCardReachedFlag =FELICA_RD_WR_EOF_CARD_REACHED;
25415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        /*0 represents the write ended*/
25425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        Status = phFriNfc_Felica_HUpdateAttrBlkForWrOp(NdefMap,FELICA_WRITE_ENDED);
25435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        if ( (Status & PHNFCSTBLOWER) != (NFCSTATUS_PENDING & PHNFCSTBLOWER))
25445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        {
25455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            /* call respective CR */
25465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            phFriNfc_Felica_HCrHandler(NdefMap,PH_FRINFC_NDEFMAP_CR_WR_NDEF,Status);
25475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        }
25485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    }
25495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    else
25505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    {
25515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        /* Call Update Data()*/
25525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        Status = phFriNfc_Felica_HUpdateData(NdefMap);
25535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        if ( (Status & PHNFCSTBLOWER) != (NFCSTATUS_PENDING & PHNFCSTBLOWER))
25545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        {
25555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            /* call respective CR */
25565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            phFriNfc_Felica_HCrHandler(NdefMap,PH_FRINFC_NDEFMAP_CR_WR_NDEF,Status);
25575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        }
25585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    }
25595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                }
25605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }/*if ( NdefMap->Felica.EofCardReachedFlag )*/
25615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            else
25625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
25635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->Felica.CurBlockNo += NdefMap->Felica.NoBlocksWritten;
25645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                /* Call Update Data()*/
25655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                Status = phFriNfc_Felica_HUpdateData(NdefMap);
25665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                if ( (Status & PHNFCSTBLOWER) != (NFCSTATUS_PENDING & PHNFCSTBLOWER))
25675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                {
25685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    /* call respective CR */
25695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    phFriNfc_Felica_HCrHandler(NdefMap,PH_FRINFC_NDEFMAP_CR_WR_NDEF,Status);
25705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                }
25715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
25725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
25735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }/*if ( NdefMap->SendRecvBuf[10] == 0x00 )*/
25745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
25755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
25765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /*handle the  Error case*/
25775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
25785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            NFCSTATUS_WRITE_FAILED);
25795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        CRFlag = TRUE;
25805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
25815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
25825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }/*if(NdefMap->SendRecvBuf[1] == PH_NFCFRI_NDEFMAP_FELI_WR_RESP_BYTE )*/
25835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
25845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
25855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                   /*return Error "Invalid Write Response Code"*/
25865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
25875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                       NFCSTATUS_WRITE_FAILED);
25885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    CRFlag = TRUE;
25895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
25905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
25915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if ( CRFlag == TRUE )
25925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
25935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* Reset following parameters*/
25945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->ApduBuffIndex=0;
25955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->Felica.Wr_BytesRemained = 0;
25965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->ApduBufferSize = 0;
25975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    phFriNfc_Felica_HCrHandler(NdefMap,PH_FRINFC_NDEFMAP_CR_WR_NDEF,Status);
25985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
25995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
26005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
26015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
26025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case    PH_NFCFRI_NDEFMAP_FELI_STATE_RD_BLOCK :
26035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
26045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* check the Manuf Id in the receive buffer*/
26055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Status = phFriNfc_Felica_HCheckManufId(NdefMap);
26065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if ( Status == NFCSTATUS_SUCCESS )
26075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
26085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if(NdefMap->SendRecvBuf[1] == PH_NFCFRI_NDEFMAP_FELI_RD_RESP_BYTE )
26095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
26105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* calculate the Nmaxb*/
26115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Nbc = phFriNfc_Felica_HGetMaximumBlksToRead(NdefMap,PH_NFCFRI_NDEFMAP_FELI_NBC);
26125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /*get Receive length from the card for corss verifications*/
26135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    RecvTxLen= phFriNfc_Felica_HSetTrxLen(NdefMap,Nbc);
26145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    BytesToRecv = NdefMap->SendRecvBuf[12]*16;
26155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
26165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* chk the status flags 1 */
26175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if ( NdefMap->SendRecvBuf[10] == 0x00)
26185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
26195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        if ( RecvTxLen == BytesToRecv)
26205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
26215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->Felica.CurBlockNo += (uint8_t)(RecvTxLen/16);
26225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            phFriNfc_Felica_HAfterRead_CopyDataToBuff(NdefMap);
26235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            Status = phFriNfc_Felica_HReadData(NdefMap,PH_FRINFC_NDEFMAP_SEEK_CUR);
26245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            /* handle the error in Transc function*/
26255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            if ( (Status & PHNFCSTBLOWER) != (NFCSTATUS_PENDING & PHNFCSTBLOWER))
26265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
26275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                CRFlag =TRUE;
26285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
26295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
26305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        else
26315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
26325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            CRFlag =TRUE;
26335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
26345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                NFCSTATUS_INVALID_RECEIVE_LENGTH);
26355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            /*set the buffer index back to zero*/
26365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->ApduBuffIndex = 0;
26375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->Felica.Rd_NoBytesToCopy = 0;
26385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
26395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
26405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
26415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
26425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->ApduBuffIndex=0;
26435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /*handle the  Error case*/
26445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
26455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            NFCSTATUS_READ_FAILED);
26465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        CRFlag =TRUE;
26475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
26485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
26495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
26505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
26515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    CRFlag =TRUE;
26525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefMap->ApduBuffIndex=0;
26535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /*return Error "Invalid Read Response Code"*/
26545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
26555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NFCSTATUS_READ_FAILED);
26565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
26575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
26585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
26595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
26605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                CRFlag =TRUE;
26615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
26625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if ( CRFlag ==TRUE )
26635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
26645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* call respective CR */
26655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                phFriNfc_Felica_HCrHandler(NdefMap,PH_FRINFC_NDEFMAP_CR_RD_NDEF,Status);
26665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
26675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            break;
26685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
26695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        default:
26705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
26715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               NFCSTATUS_INVALID_DEVICE_REQUEST);
26725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            phFriNfc_Felica_HCrHandler(NdefMap, PH_FRINFC_NDEFMAP_CR_INVALID_OPE, Status);
26735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            break;
26745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
26755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
26765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
26775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
26785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
26795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
26805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Call CR for unknown Error's*/
26815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        switch ( NdefMap->State)
26825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
26835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case PH_FRINFC_NDEFMAP_FELI_STATE_CHK_NDEF :
26845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case PH_NFCFRI_NDEFMAP_FELI_STATE_SELECT_WILD_CARD :
26855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case PH_NFCFRI_NDEFMAP_FELI_STATE_SELECT_NDEF_APP :
26865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case PH_NFCFRI_NDEFMAP_FELI_STATE_RD_ATTR :
26875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                phFriNfc_Felica_HCrHandler(NdefMap, PH_FRINFC_NDEFMAP_CR_CHK_NDEF,
26885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            Status);
26895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
26905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case PH_NFCFRI_NDEFMAP_FELI_STATE_WR_BLOCK :
26915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case PH_NFCFRI_NDEFMAP_FELI_STATE_ATTR_BLK_WR_BEGIN :
26925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case PH_NFCFRI_NDEFMAP_FELI_STATE_ATTR_BLK_WR_END :
26935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                phFriNfc_Felica_HCrHandler(NdefMap, PH_FRINFC_NDEFMAP_CR_WR_NDEF,
26945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            Status);
26955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
26965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case PH_NFCFRI_NDEFMAP_FELI_STATE_RD_BLOCK :
26975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                phFriNfc_Felica_HCrHandler(NdefMap, PH_FRINFC_NDEFMAP_CR_RD_NDEF,
26985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            Status);
26995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
27005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            default :
27015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*set the invalid state*/
27025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_DEVICE_REQUEST);
27035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                phFriNfc_Felica_HCrHandler(NdefMap, PH_FRINFC_NDEFMAP_CR_INVALID_OPE, Status);
27045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
27055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
27065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
27075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
27095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
27115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Prepares Cmd Pkt for reading attribute Blk information.
27125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
27135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS   phFriNfc_Felica_HRdAttrInfo(phFriNfc_NdefMap_t *NdefMap)
27145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
27155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS   status = NFCSTATUS_PENDING;
27175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t BufIndex = 0;
27185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Set the Felica Cmd*/
27205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE
27215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->Cmd.FelCmd = phHal_eFelica_Raw;
27225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
27235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->Cmd.FelCmd = phHal_eFelicaCmdListFelicaCmd;
27245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif  /* #ifdef PH_HAL4_ENABLE */
27255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*set the additional informations for the data exchange*/
27275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
27285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
27295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* 1st byte represents the length of the cmd packet*/
27315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex] = 0x00;
27325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
27335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Read/check command code*/
27355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex] = 0x06;
27365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
27375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* IDm - Manufacturer Id : 8bytes*/
27395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE
27405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    (void)memcpy((&(NdefMap->SendRecvBuf[BufIndex])),
27415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                (void * )&NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.IDm,
27425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                8);
27435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
27445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    (void)memcpy((&(NdefMap->SendRecvBuf[BufIndex])),
27455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                (void * )&NdefMap->psRemoteDevInfo->RemoteDevInfo.CardInfo212_424.Startup212_424.NFCID2t,
27465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                8);
27475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif  /* #ifdef PH_HAL4_ENABLE */
27495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex+=8;
27515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]    =   0x01;  /*  Number of Services (n=1 ==> 0x80)*/
27535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
27545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]    =   0x0B;  /*  Service Code List*/
27565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
27575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]    =   0x00;  /*  Service Code List*/
27595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
27605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]    =   0x01;  /*  Number of Blocks to read)*/
27625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
27635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]    =   0x80;  /*  1st Block Element : byte 1*/
27655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
27665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[BufIndex]    =   0x00;  /*  1st Block Element : byte 2, block 1*/
27685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    BufIndex++;
27695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendRecvBuf[PH_NFCFRI_NDEFMAP_FELI_PKT_LEN_INDEX]             =   BufIndex;
27715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
27735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Update the Send Len*/
27755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->SendLength = BufIndex;
27765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Change the state to  PH_NFCFRI_NDEFMAP_FELI_STATE_RD_ATTR */
27785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->State =  PH_NFCFRI_NDEFMAP_FELI_STATE_RD_ATTR;
27795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*set the completion routines for the desfire card operations*/
27815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_NdefMap_Process;
27825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->MapCompletionInfo.Context = NdefMap;
27835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*Call the Overlapped HAL Transceive function */
27855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    status = phFriNfc_OvrHal_Transceive( NdefMap->LowerDevice,
27865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                         &NdefMap->MapCompletionInfo,
27875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                         NdefMap->psRemoteDevInfo,
27885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                         NdefMap->Cmd,
27895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                         &NdefMap->psDepAdditionalInfo,
27905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                         NdefMap->SendRecvBuf,
27915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                         NdefMap->SendLength,
27925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                         NdefMap->SendRecvBuf,
27935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                         NdefMap->SendRecvLength);
27945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      return (status);
27955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
27975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
27985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
27995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Validated manufacturer Details, during the read/write operations.
28005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
28015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS   phFriNfc_Felica_HCheckManufId(const phFriNfc_NdefMap_t *NdefMap)
28035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
28045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS status = NFCSTATUS_PENDING;
28055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t result = 0;
28075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* check the stored manufacture id with the received manufacture id*/
28095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    result = (uint8_t)(phFriNfc_Felica_MemCompare( (void *)(&(NdefMap->SendRecvBuf[2])),
28105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               (void *)NdefMap->FelicaManufDetails.ManufID,
28115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               8));
28125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ( result != 0)
28145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
28155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_REMOTE_DEVICE);
28165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
28185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
28195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
28205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_NONE,NFCSTATUS_SUCCESS);
28215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
28235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (status);
28245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
28255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Felica_HCalCheckSum(const uint8_t *TempBuffer,
28275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                              uint8_t StartIndex,
28285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                              uint8_t EndIndex,
28295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                              uint16_t RecvChkSum)
28305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
28315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS   Result = NFCSTATUS_SUCCESS;
28325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint16_t CheckSum=0,
28335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly             BufIndex=0;
28345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    for(BufIndex = StartIndex;BufIndex <=EndIndex;BufIndex++)
28365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
28375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        CheckSum += TempBuffer[BufIndex];
28385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
28395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( RecvChkSum != CheckSum )
28405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
28415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly           Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
28425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NFCSTATUS_INVALID_FORMAT);
28435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
28445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (Result);
28455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
28465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
28585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief On successful read attribute blk information, this function validates and stores the
28595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Attribute informations in to the context.
28605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
28615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS   phFriNfc_Felica_HUpdateAttrInfo(phFriNfc_NdefMap_t *NdefMap)
28625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
28635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS status = NFCSTATUS_PENDING;
28645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t   CRFlag = FALSE,
28655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly              Nmaxb1, Nmaxb2 = 0,
28665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly              ChkSum1 = 0, ChkSum2=0;
28675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint16_t  Nmaxblk = 0,
28695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly              RecvChkSum=0,
28705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly              NdefBlk = 0;
28715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint32_t  DataLen =0;
28725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Validate T3VNo and NFCDevVNo */
28755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    status = phFriNfc_MapTool_ChkSpcVer(NdefMap,
28765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        PH_NFCFRI_NDEFMAP_FELI_VERSION_INDEX);
28775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ( status != NFCSTATUS_SUCCESS )
28785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
28795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        CRFlag = TRUE;
28805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
28815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
28825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
28835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* get the Nmaxb from the receive buffer*/
28845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        Nmaxb1 = NdefMap->SendRecvBuf[16];
28855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        Nmaxb2 = NdefMap->SendRecvBuf[17];
28865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        Nmaxblk = (((uint16_t)Nmaxb1 << 8) | (Nmaxb2 & 0x00ff));
28885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
28895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if ( Nmaxblk != 0 )
28905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
28915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* check the Nbr against the Nmaxb*/
28925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if ( NdefMap->SendRecvBuf[14] > Nmaxblk )
28935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
28945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                CRFlag = TRUE;
28955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
28965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
28975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
28985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*check Nbw > Nmaxb*/
28995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*check the write flag validity*/
29005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*check for the RFU bytes validity*/
29015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 if ( (NdefMap->SendRecvBuf[15] > Nmaxblk) ||
29025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     ((NdefMap->SendRecvBuf[22] != 0x00) && (NdefMap->SendRecvBuf[22] !=0x0f ))||
29035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     ( (NdefMap->SendRecvBuf[23] != 0x00) && (NdefMap->SendRecvBuf[23] !=0x01 ))||
29045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     ( NdefMap->SendRecvBuf[18] != 0x00) ||
29055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     ( NdefMap->SendRecvBuf[19] != 0x00) ||
29065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     ( NdefMap->SendRecvBuf[20] != 0x00) ||
29075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     ( NdefMap->SendRecvBuf[21] != 0x00))
29085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
29095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
29105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    CRFlag = TRUE;
29115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
29125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
29135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
29145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* check the validity of the actual ndef data len*/
29155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    PH_NFCFRI_NDEFMAP_FELI_CAL_LEN_BYTES( NdefMap->SendRecvBuf[24],
29165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                          NdefMap->SendRecvBuf[25],
29175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                          NdefMap->SendRecvBuf[26],
29185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                          DataLen);
29195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
29205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
29215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* Calculate Nbc*/
29225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NdefBlk = (uint16_t )((( DataLen % 16) == 0 ) ? (DataLen >> 4) : ((DataLen >> 4) +1));
29235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
29245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* check Nbc against Nmaxb*/
29255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if ((NdefBlk > Nmaxblk))
29265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
29275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        CRFlag = TRUE;
29285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
29295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
29305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
29315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /*Store the attribute information in phFriNfc_Felica_AttrInfo*/
29325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->FelicaAttrInfo.Version = NdefMap->SendRecvBuf[PH_NFCFRI_NDEFMAP_FELI_VERSION_INDEX];
29335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->FelicaAttrInfo.Nbr = NdefMap->SendRecvBuf[14];
29345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->FelicaAttrInfo.Nbw = NdefMap->SendRecvBuf[15];
29355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
29365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->FelicaAttrInfo.Nmaxb = Nmaxblk;
29375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
29385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->FelicaAttrInfo.WriteFlag = NdefMap->SendRecvBuf[22];
29395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NdefMap->FelicaAttrInfo.RdWrFlag = NdefMap->SendRecvBuf[23];
29405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
29415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /* Get CheckSum*/
29425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        ChkSum1 = NdefMap->SendRecvBuf[27];
29435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        ChkSum2 = NdefMap->SendRecvBuf[28];
29445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
29455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        RecvChkSum = (((uint16_t)ChkSum1 << 8) | (ChkSum2 & 0x00ff));
29465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
29475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /* Check the check sum validity?*/
29485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = phFriNfc_Felica_HCalCheckSum(NdefMap->SendRecvBuf,
29495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                              PH_NFCFRI_NDEFMAP_FELI_VERSION_INDEX,
29505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                              26,
29515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                              RecvChkSum);
29525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        if ( status != NFCSTATUS_SUCCESS )
29535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
29545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            CRFlag = TRUE;
29555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
29565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        else
29575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
29585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            /*check RW Flag Access Rights*/
29595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            /* set to read only cannot write*/
29605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            if ( NdefMap->FelicaAttrInfo.RdWrFlag == 0x00 )
29615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
29625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->CardState = PH_NDEFMAP_CARD_STATE_READ_ONLY;
29635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
29640e7fc7d2f5f7eaccf33ebb73a3347e51661b97fdJan Brands                            else if ( NdefMap->FelicaAttrInfo.RdWrFlag == 0x01 ) // additional check for R/W access
29655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
29665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NdefMap->CardState = PH_NDEFMAP_CARD_STATE_READ_WRITE;
29675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
29680e7fc7d2f5f7eaccf33ebb73a3347e51661b97fdJan Brands                            else // otherwise invalid
29690e7fc7d2f5f7eaccf33ebb73a3347e51661b97fdJan Brands                            {
29700e7fc7d2f5f7eaccf33ebb73a3347e51661b97fdJan Brands                                NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
29710e7fc7d2f5f7eaccf33ebb73a3347e51661b97fdJan Brands                            }
29725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
29735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->FelicaAttrInfo.LenBytes[0] = NdefMap->SendRecvBuf[24];
29745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->FelicaAttrInfo.LenBytes[1] = NdefMap->SendRecvBuf[25];
29755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NdefMap->FelicaAttrInfo.LenBytes[2] = NdefMap->SendRecvBuf[26];
29765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            status = PHNFCSTVAL(CID_NFC_NONE,NFCSTATUS_SUCCESS);
29775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
29785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
29795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
29805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
29815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
29825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
29835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
29845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            CRFlag = TRUE;
29855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
29865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
29875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ( (status == NFCSTATUS_INVALID_FORMAT ) && (CRFlag == TRUE ))
29885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
29895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
29905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
29915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ( CRFlag == TRUE )
29925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
29935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*Return Status Error � Invalid Format�*/
29945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status =  PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,NFCSTATUS_INVALID_FORMAT);
29955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
29965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
29975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (status);
29985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
29995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
30005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
30015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief this shall notify the integration software with respective
30025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  success/error status along with the completion routines.
30035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
30045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_Felica_HCrHandler(phFriNfc_NdefMap_t  *NdefMap,
30055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 uint8_t              CrIndex,
30065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 NFCSTATUS            Status)
30075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
30085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* set the state back to the Reset_Init state*/
30095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->State =  PH_FRINFC_NDEFMAP_STATE_RESET_INIT;
30105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
30115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* set the completion routine*/
30125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefMap->CompletionRoutine[CrIndex].
30135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        CompletionRoutine(NdefMap->CompletionRoutine->Context, Status);
30145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
30155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
30165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
30175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief this shall initialise the internal buffer data to zero.
30185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
30195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_Felica_HInitInternalBuf(uint8_t *Buffer)
30205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
30215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t index=0;
30225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
30235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    for( index = 0; index< 16 ; index++)
30245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
30255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        Buffer[index] = 0;
30265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
30275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
30285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
30295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic int phFriNfc_Felica_MemCompare ( void *s1, void *s2, unsigned int n )
30305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
30315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    int8_t   diff = 0;
30325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    int8_t *char_1  =(int8_t *)s1;
30335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    int8_t *char_2  =(int8_t *)s2;
30345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if(NULL == s1 || NULL == s2)
30355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
30365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        PHDBG_CRITICAL_ERROR("NULL pointer passed to memcompare");
30375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
30385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
30395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
30405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        for(;((n>0)&&(diff==0));n--,char_1++,char_2++)
30415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
30425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            diff = *char_1 - *char_2;
30435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
30445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
30455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (int)diff;
30465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
30475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
30485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
30495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef UNIT_TEST
30505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phUnitTestNfc_Felica_static.c>
30515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif
30525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
30535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif  /* PH_FRINFC_MAP_FELICA_DISABLED */
3054