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