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_TopazMap.c 195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief NFC Ndef Mapping For Remote Devices. 205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Project: NFC-FRI 225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 23c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen* $Date: Mon Dec 13 14:14:14 2010 $ 245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* $Author: ing02260 $ 25c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen* $Revision: 1.23 $ 26c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen* $Aliases: $ 275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_NdefMap.h> 335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_TopazMap.h> 345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_MapTools.h> 355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_OvrHal.h> 365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_TOPAZ_DISABLED 385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! \ingroup grp_file_attributes 395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \name NDEF Mapping 405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* File: \ref phFriNfcNdefMap.c 425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*@{*/ 45c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen#define PHFRINFCTOPAZMAP_FILEREVISION "$Revision: 1.23 $" 46c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen#define PHFRINFCTOPAZMAP_FILEALIASES "$Aliases: $" 475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*@}*/ 485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/****************** Start of macros ********************/ 495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Below MACRO is used for the WRITE error scenario, 505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly in case PN544 returns error for any WRITE, then 515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly read the written block and byte number, to check the data 525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly written to the card is correct or not 535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* #define TOPAZ_RF_ERROR_WORKAROUND */ 555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#ifdef FRINFC_READONLY_NDEF 5780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen 5880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen #define CC_BLOCK_NUMBER (0x01U) 59c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen #define LOCK_BLOCK_NUMBER (0x0EU) 60c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen 61c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen #define LOCK0_BYTE_NUMBER (0x00U) 62c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen #define LOCK0_BYTE_VALUE (0xFFU) 63c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen 64c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen #define LOCK1_BYTE_NUMBER (0x01U) 65c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen #define LOCK1_BYTE_VALUE (0x7FU) 66c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen 6780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen #define CC_RWA_BYTE_NUMBER (0x03U) 6880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen #define CC_READ_ONLY_VALUE (0x0FU) 6980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen 7080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#endif /* #ifdef FRINFC_READONLY_NDEF */ 7180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen 725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TOPAZ_RF_ERROR_WORKAROUND 735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Below MACROs are added for the error returned from HAL, if the 755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly below error has occured during the WRITE, then read the error 765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly returned blocks to confirm */ 775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly #define FRINFC_RF_TIMEOUT_89 (0x89U) 785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly #define FRINFC_RF_TIMEOUT_90 (0x90U) 795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* State specific to read after the RF ERROR for the WRITE */ 815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly #define PH_FRINFC_TOPAZ_STATE_RF_ERROR_READ (0x0FU) 825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef TOPAZ_RF_ERROR_WORKAROUND */ 845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/****************** End of macros ********************/ 865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \name Topaz Mapping - Helper Functions 895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*@{*/ 925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief \copydoc page_ovr Helper function for Topaz. This function shall read 8 bytes 955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* from the card. 965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_RdBytes(phFriNfc_NdefMap_t *NdefMap, 985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t BlockNo, 995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t ByteNo); 1005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 1025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief \copydoc page_ovr Helper function for Topaz. This function shall process 1035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* read id command 1045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 1055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_ProReadID(phFriNfc_NdefMap_t *NdefMap); 1065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 1085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief \copydoc page_ovr Helper function for Topaz. This function shall process 1095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* read all command 1105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 1115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_ProReadAll(phFriNfc_NdefMap_t *NdefMap); 1125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 1145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief \copydoc page_ovr Helper function for Topaz. This function depends on 1155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* function called by the user 1165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 1175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_CallNxtOp(phFriNfc_NdefMap_t *NdefMap); 1185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 1205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief \copydoc page_ovr Helper function for Topaz. This function checks the CC 1215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* bytes 1225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 1235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_ChkCCBytes(phFriNfc_NdefMap_t *NdefMap); 1245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 1265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief \copydoc page_ovr Helper function for Topaz. This function finds 1275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* NDEF TLV 1285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 1295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_findNDEFTLV(phFriNfc_NdefMap_t *NdefMap); 1305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 1325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief \copydoc page_ovr Helper function for Topaz. This function writes a 1335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* byte into the card 1345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 1355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_WrAByte(phFriNfc_NdefMap_t *NdefMap, 1365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t BlockNo, 1375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t ByteNo, 1385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t ByteVal 1395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ); 1405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 1425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief \copydoc page_ovr Helper function for Topaz. This function shall process the 1435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* NMN write 1445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 1455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_ProWrNMN(phFriNfc_NdefMap_t *NdefMap); 1465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 1485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief \copydoc page_ovr Helper function for Topaz. This function writes the length field of 1495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* the NDEF TLV 1505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 1515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_ProWrTLV(phFriNfc_NdefMap_t *NdefMap); 1525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 1545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief \copydoc page_ovr Helper function for Topaz. This function updates length field 1555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* of the NDEF TLV after complete write. 1565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 1575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_WrLByte(phFriNfc_NdefMap_t *NdefMap); 1585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 1605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief \copydoc page_ovr Helper function for Topaz. This function copies the card data 1615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* to the user buffer 1625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 1635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_CpDataToUsrBuf( phFriNfc_NdefMap_t *NdefMap); 1645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 1665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief \copydoc page_ovr Helper function for Topaz. This function shall process the 1675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* written data 1685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 1695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_ProWrUsrData( phFriNfc_NdefMap_t *NdefMap); 1705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 1725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief \copydoc page_ovr Helper function for Topaz. This function checks the block 1735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* number is correct or not 1745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 1755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_Tpz_H_BlkChk(phFriNfc_NdefMap_t *NdefMap); 1765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 1785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief \copydoc page_ovr Helper function for Topaz. This function writes the 0th 1795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* byte of block 1 has Zero 1805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 1815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_WrByte0ValE1(phFriNfc_NdefMap_t *NdefMap); 1825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 1845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief \copydoc page_ovr Helper function for Topaz. This function calls the 1855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* completion routine 1865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 1875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_Tpz_H_Complete(phFriNfc_NdefMap_t *NdefMap, 1885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Status); 1895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 1915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief \copydoc page_ovr Helper function for Topaz check ndef. This function checks 1925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* the CC byte in check ndef function 1935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 1945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_ChkCCinChkNdef(phFriNfc_NdefMap_t *NdefMap); 1955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 1975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief \copydoc page_ovr Helper function for Topaz check ndef. This function checks 1985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* the lock bits and set a card state 1995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 2005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_Tpz_H_ChkLockBits(phFriNfc_NdefMap_t *NdefMap); 2015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 2035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief \copydoc page_ovr Helper function for Topaz. This function writes CC bytes or 2045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* type of the TLV 2055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 2065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_WrCCorTLV(phFriNfc_NdefMap_t *NdefMap); 2075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TOPAZ_RF_ERROR_WORKAROUND 2095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 2115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief \copydoc page_ovr Helper function for Topaz. This function checks the written 2125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* value after the 2135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 2145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic 2155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS 2165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphFriNfc_Tpz_H_CheckWrittenData ( 2175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_NdefMap_t *psNdefMap, 2185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t state_rf_error); 2195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef TOPAZ_RF_ERROR_WORKAROUND */ 2215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 2235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief \copydoc page_ovr Helper function for Topaz. This function checks the written 2245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* CC bytes are correct 2255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 2265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_ProCCTLV(phFriNfc_NdefMap_t *NdefMap); 2275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*@}*/ 2285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellyvoid phFriNfc_TopazMap_H_Reset(phFriNfc_NdefMap_t *NdefMap) 2295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 2305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Initialising the Topaz structure variable */ 2315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.CRIndex = PH_FRINFC_NDEFMAP_CR_INVALID_OPE; 2325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.CurrentBlock = PH_FRINFC_TOPAZ_VAL1; 2335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber = PH_FRINFC_TOPAZ_VAL0; 2345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.InternalState = PH_FRINFC_TOPAZ_VAL0; 2355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (void)memset(NdefMap->TopazContainer.ReadBuffer, PH_FRINFC_TOPAZ_VAL0, 2365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly sizeof(NdefMap->TopazContainer.ReadBuffer)); 2375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ReadWriteCompleteFlag = PH_FRINFC_TOPAZ_FLAG0; 2385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.RemainingSize = PH_FRINFC_TOPAZ_VAL0; 2395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (void)memset(NdefMap->TopazContainer.UID, PH_FRINFC_TOPAZ_VAL0, 2405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly sizeof(NdefMap->TopazContainer.UID)); 2415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.Cur_RW_Index=0; 2425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteRWFrmCard =0; 2435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 2445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 2465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief Check whether a particular Remote Device is NDEF compliant. 2475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 2485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* The function checks whether the peer device is NDEF compliant. 2495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 2505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \param[in] NdefMap Pointer to a valid instance of the \ref phFriNfc_NdefMap_t 2515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* structure describing the component context. 2525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 2535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \retval NFCSTATUS_PENDING The action has been successfully triggered. 2545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \retval Others An error has occurred. 2555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 2565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 2575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_TopazMap_ChkNdef( phFriNfc_NdefMap_t *NdefMap) 2595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 2605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 2615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_PARAMETER); 2625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( NdefMap != NULL) 2635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the previous operation */ 2655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_CHECK_OPE; 2665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the CR index to know from which operation completion 2675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly routine has to be called */ 2685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.CRIndex = PH_FRINFC_NDEFMAP_CR_CHK_NDEF; 2695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.CurrentBlock = PH_FRINFC_TOPAZ_VAL1; 2705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber = PH_FRINFC_TOPAZ_VAL0; 2715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Set card state */ 2735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardType = PH_FRINFC_NDEFMAP_TOPAZ_CARD; 2745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Change the state to Check Ndef Compliant */ 2765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_TOPAZ_STATE_READID; 2775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_CHECK_OPE; 2785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TOPAZ_RAW_SUPPORT 2805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd.JewelCmd = phHal_eJewel_Raw; 2815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] = PH_FRINFC_TOPAZ_CMD_READID; 2825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 2835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 2845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd.JewelCmd = phHal_eJewel_RID; 2855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 2865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd.JewelCmd = phHal_eJewelCmdListJewelRid; 2875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 2885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef TOPAZ_RAW_SUPPORT */ 2895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_RdBytes(NdefMap, NdefMap->TopazContainer.CurrentBlock, 2915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber); 2925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Result; 2945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 2955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 29680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#ifdef FRINFC_READONLY_NDEF 29780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen 29880ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenNFCSTATUS 29980ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenphFriNfc_TopazMap_ConvertToReadOnly ( 30080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen phFriNfc_NdefMap_t *NdefMap) 30180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen{ 30280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen NFCSTATUS result = NFCSTATUS_SUCCESS; 30380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen 30480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen result = phFriNfc_Tpz_H_WrAByte (NdefMap, CC_BLOCK_NUMBER, 30580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen CC_RWA_BYTE_NUMBER, CC_READ_ONLY_VALUE); 30680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen 30780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen if (NFCSTATUS_PENDING == PHNFCSTATUS(result)) 30880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen { 309c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen NdefMap->State = PH_FRINFC_TOPAZ_STATE_WR_CC_BYTE; 31080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen } 31180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen return result; 31280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen} 31380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen 31480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#endif /* #ifdef FRINFC_READONLY_NDEF */ 3155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 3175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief Initiates Reading of NDEF information from the Remote Device. 3185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 3195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* The function initiates the reading of NDEF information from a Remote Device. 3205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* It performs a reset of the state and starts the action (state machine). 3215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* A periodic call of the \ref phFriNfcNdefMap_Process has to be done once the action 3225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* has been triggered. 3235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 3245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_TopazMap_RdNdef( phFriNfc_NdefMap_t *NdefMap, 3255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t *PacketData, 3265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint32_t *PacketDataLength, 3275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t Offset) 3285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 3295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Result = NFCSTATUS_SUCCESS; 3305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Copy user buffer to the context */ 3325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffer = PacketData; 3335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Copy user length to the context */ 3345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBufferSize = *PacketDataLength; 3355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the user memory size to a context variable */ 3365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->NumOfBytesRead = PacketDataLength; 3375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Number of bytes read from the card is zero. 3385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly This variable returns the number of bytes read 3395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly from the card. */ 3405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *NdefMap->NumOfBytesRead = PH_FRINFC_TOPAZ_VAL0; 3415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Index to know the length read */ 3425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffIndex = PH_FRINFC_TOPAZ_VAL0; 3435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Store the offset in the context */ 3445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Offset = Offset; 3455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the CR index to know from which operation completion 3465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly routine has to be called */ 3475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.CRIndex = PH_FRINFC_NDEFMAP_CR_RD_NDEF; 3485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN) || ( NdefMap->PrevOperation == 3505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_NDEFMAP_WRITE_OPE)) 3515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* If previous operation is not read then the read shall 3535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly start from BEGIN */ 3545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Offset = PH_FRINFC_NDEFMAP_SEEK_BEGIN; 3555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Initialise current block and byte number */ 3565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.CurrentBlock = PH_FRINFC_TOPAZ_VAL1; 3575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber = PH_FRINFC_TOPAZ_VAL0; 3585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* State has to be changed */ 3595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_TOPAZ_STATE_READALL; 3605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ReadWriteCompleteFlag = 3615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_FLAG0; 3625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Topaz command = READALL */ 3635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TOPAZ_RAW_SUPPORT 3645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd.JewelCmd = phHal_eJewel_Raw; 3655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] = PH_FRINFC_TOPAZ_CMD_READALL; 3665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 3675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 3695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd.JewelCmd = phHal_eJewel_ReadAll; 3705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 3715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd.JewelCmd = phHal_eJewelCmdListJewelReadAll; 3725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 3735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef TOPAZ_RAW_SUPPORT */ 3755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE; 3785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Offset = Current, but the read has reached the End of Card */ 3795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) && 3805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->TopazContainer.ReadWriteCompleteFlag == 3815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_FLAG1)) 3825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 3845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_EOF_NDEF_CONTAINER_REACHED); 3855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 3875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* if the offset is begin then call READALL else copy the data 3895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly from the user buffer */ 3905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = ((Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN)? 3915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Tpz_H_RdBytes(NdefMap, 3925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.CurrentBlock, 3935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber): 3945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Tpz_H_CpDataToUsrBuf(NdefMap)); 3955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Result; 3985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 3995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 4015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief Initiates Writing of NDEF information to the Remote Device. 4025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 4035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* The function initiates the writing of NDEF information to a Remote Device. 4045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* It performs a reset of the state and starts the action (state machine). 4055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* A periodic call of the \ref phFriNfcNdefMap_Process has to be done once the action 4065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* has been triggered. 4075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 4085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_TopazMap_WrNdef( phFriNfc_NdefMap_t *NdefMap, 4095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t *PacketData, 4105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint32_t *PacketDataLength, 4115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t Offset) 4125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 4135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Result = NFCSTATUS_SUCCESS; 4145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t TempByteVal = 0; 4155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Copy user buffer to the context */ 4165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffer = PacketData; 4175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Copy user length to the context */ 4185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBufferSize = *PacketDataLength; 4195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Index to know the length written */ 4205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffIndex = PH_FRINFC_TOPAZ_VAL0; 4215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the user memory size to a context variable */ 4225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->WrNdefPacketLength = PacketDataLength; 4235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Number of bytes written to the card is zero. 4245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly This variable returns the number of bytes written 4255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly to the card. */ 4265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *NdefMap->WrNdefPacketLength = PH_FRINFC_TOPAZ_VAL0; 4275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the CR index to know from which operation completion 4285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly routine has to be called */ 4295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.CRIndex = PH_FRINFC_NDEFMAP_CR_WR_NDEF; 4305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Store the offset in the context */ 4315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Offset = Offset; 4325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN) || 4355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_READ_OPE)) 4365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Offset = PH_FRINFC_NDEFMAP_SEEK_BEGIN; 4385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Initialise current block and byte number */ 4395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.CurrentBlock = PH_FRINFC_TOPAZ_VAL1; 4405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber = PH_FRINFC_TOPAZ_VAL0; 4415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* State has to be changed */ 4425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_TOPAZ_STATE_READALL; 4435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Topaz command = READALL */ 4445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TOPAZ_RAW_SUPPORT 4465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd.JewelCmd = phHal_eJewel_Raw; 4475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] = PH_FRINFC_TOPAZ_CMD_READALL; 4485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 4495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 4505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd.JewelCmd = phHal_eJewel_ReadAll; 4515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 4525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd.JewelCmd = phHal_eJewelCmdListJewelReadAll; 4535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 4545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef TOPAZ_RAW_SUPPORT */ 4555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ReadWriteCompleteFlag = 4565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_FLAG0; 4575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.RemainingSize = NdefMap->CardMemSize; 4585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly TempByteVal = NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL1]; 4595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 4615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* State has to be changed */ 4635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_TOPAZ_STATE_WRITE; 4645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* copy the user data to write into the card */ 4655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly TempByteVal = NdefMap->ApduBuffer[NdefMap->ApduBuffIndex]; 4665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the previous operation to write operation */ 4695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE; 4705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) && 4715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->TopazContainer.ReadWriteCompleteFlag == 4725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_FLAG1)) 4735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Offset = Current, but the read has reached the End of Card */ 4755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 4765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_EOF_NDEF_CONTAINER_REACHED); 4775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 4795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check the block */ 4815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Tpz_H_BlkChk(NdefMap); 4825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* if offset is begin then call READALL else start writing */ 4835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = ((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN)? 4845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Tpz_H_RdBytes(NdefMap, NdefMap->TopazContainer.CurrentBlock, 4855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber): 4865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Tpz_H_WrAByte(NdefMap, NdefMap->TopazContainer.CurrentBlock, 4875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber,TempByteVal)); 4885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Result; 4915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 4925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 4955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief Completion Routine, Processing function, needed to avoid long blocking. 4965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \note The lower (Overlapped HAL) layer must register a pointer to this function as a Completion 4975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Routine in order to be able to notify the component that an I/O has finished and data are 4985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* ready to be processed. 4995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 5005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 5015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellyvoid phFriNfc_TopazMap_Process( void *Context, 5035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Status) 5045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 5055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_NdefMap_t *psNdefMap = NULL; 5075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TOPAZ_RF_ERROR_WORKAROUND 5095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly static uint8_t rf_error_state = 0; 5115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef TOPAZ_RF_ERROR_WORKAROUND */ 513c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen#ifdef FRINFC_READONLY_NDEF 514c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen static uint8_t written_lock_byte = 0; 515c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen#endif /* #ifdef FRINFC_READONLY_NDEF */ 5165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psNdefMap = (phFriNfc_NdefMap_t *)Context; 5185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ((Status & PHNFCSTBLOWER) == (NFCSTATUS_SUCCESS & PHNFCSTBLOWER)) 5205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch (psNdefMap->State) 5225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 52380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#ifdef FRINFC_READONLY_NDEF 524c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen case PH_FRINFC_TOPAZ_STATE_WR_CC_BYTE: 52580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen { 52680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen if((CC_READ_ONLY_VALUE == *psNdefMap->SendRecvBuf) 52780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen && (PH_FRINFC_TOPAZ_VAL1 == *psNdefMap->SendRecvLength)) 52880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen { 529a6243755a9b438bfbfe0be331ece55953f8cf9ebMartijn Coenen written_lock_byte = 0; 530c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen#ifdef TOPAZ_RAW_SUPPORT 531c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen *psNdefMap->SendRecvBuf = PH_FRINFC_TOPAZ_CMD_READ; 532c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen#else 533c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen#ifdef PH_HAL4_ENABLE 534c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen psNdefMap->Cmd.JewelCmd = phHal_eJewel_Read1; 535c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen#else 536c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen psNdefMap->Cmd.JewelCmd = phHal_eJewelCmdListJewelRead1; 537c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen#endif /* #ifdef PH_HAL4_ENABLE */ 538c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen#endif /* #ifdef TOPAZ_RAW_SUPPORT */ 539c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen Status = phFriNfc_Tpz_H_RdBytes (psNdefMap, LOCK_BLOCK_NUMBER, 540c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen LOCK0_BYTE_NUMBER); 541c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen 542c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen if (NFCSTATUS_PENDING == PHNFCSTATUS(Status)) 543c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen { 544c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen psNdefMap->State = PH_FRINFC_TOPAZ_STATE_RD_LOCK0_BYTE; 545c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen } 54680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen } 54780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen else 54880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen { 54980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 55080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen NFCSTATUS_INVALID_RECEIVE_LENGTH); 55180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen } 55280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen break; 55380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen } 554c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen 555c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen case PH_FRINFC_TOPAZ_STATE_RD_LOCK0_BYTE: 556c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen { 557c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen if (PH_FRINFC_TOPAZ_VAL1 == *psNdefMap->SendRecvLength) 558c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen { 559c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen Status = phFriNfc_Tpz_H_WrAByte (psNdefMap, LOCK_BLOCK_NUMBER, 560c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen LOCK0_BYTE_NUMBER, 561c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen LOCK0_BYTE_VALUE); 562c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen 563c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen if (NFCSTATUS_PENDING == PHNFCSTATUS(Status)) 564c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen { 565c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen psNdefMap->State = PH_FRINFC_TOPAZ_STATE_WR_LOCK0_BYTE; 566c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen } 567c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen } 568c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen break; 569c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen } 570c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen 571c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen case PH_FRINFC_TOPAZ_STATE_WR_LOCK0_BYTE: 572c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen { 573c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen if((LOCK0_BYTE_VALUE == *psNdefMap->SendRecvBuf) 574c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen && (PH_FRINFC_TOPAZ_VAL1 == *psNdefMap->SendRecvLength)) 575c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen { 576c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen#ifdef TOPAZ_RAW_SUPPORT 577c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen *psNdefMap->SendRecvBuf = PH_FRINFC_TOPAZ_CMD_READ; 578c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen#else 579c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen#ifdef PH_HAL4_ENABLE 580c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen psNdefMap->Cmd.JewelCmd = phHal_eJewel_Read1; 581c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen#else 582c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen psNdefMap->Cmd.JewelCmd = phHal_eJewelCmdListJewelRead1; 583c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen#endif /* #ifdef PH_HAL4_ENABLE */ 584c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen#endif /* #ifdef TOPAZ_RAW_SUPPORT */ 585c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen Status = phFriNfc_Tpz_H_RdBytes (psNdefMap, LOCK_BLOCK_NUMBER, 586c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen LOCK1_BYTE_NUMBER); 587c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen 588c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen if (NFCSTATUS_PENDING == PHNFCSTATUS(Status)) 589c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen { 590c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen psNdefMap->State = PH_FRINFC_TOPAZ_STATE_RD_LOCK1_BYTE; 591c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen } 592c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen } 593c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen else 594c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen { 595c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 596c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen NFCSTATUS_INVALID_RECEIVE_LENGTH); 597c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen } 598c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen } 599c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen 600c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen case PH_FRINFC_TOPAZ_STATE_RD_LOCK1_BYTE: 601c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen { 602c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen if (PH_FRINFC_TOPAZ_VAL1 == *psNdefMap->SendRecvLength) 603c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen { 604c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen written_lock_byte = (uint8_t)(*psNdefMap->SendRecvBuf | LOCK1_BYTE_VALUE); 605c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen Status = phFriNfc_Tpz_H_WrAByte (psNdefMap, LOCK_BLOCK_NUMBER, 606c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen LOCK1_BYTE_NUMBER, 607c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen written_lock_byte); 608c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen 609c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen if (NFCSTATUS_PENDING == PHNFCSTATUS(Status)) 610c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen { 611c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen psNdefMap->State = PH_FRINFC_TOPAZ_STATE_WR_LOCK1_BYTE; 612c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen } 613c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen } 614c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen break; 615c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen } 616c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen 617c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen case PH_FRINFC_TOPAZ_STATE_WR_LOCK1_BYTE: 618c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen { 619c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen if((written_lock_byte == *psNdefMap->SendRecvBuf) 620c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen && (PH_FRINFC_TOPAZ_VAL1 == *psNdefMap->SendRecvLength)) 621c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen { 622c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen written_lock_byte = 0; 623c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen /* Do nothing */ 624c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen } 625c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen else 626c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen { 627c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen written_lock_byte = 0; 628c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 629c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen NFCSTATUS_INVALID_RECEIVE_LENGTH); 630c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen } 631c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen } 63280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#endif /* #ifdef FRINFC_READONLY_NDEF */ 6335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_STATE_WRITE: 6345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phFriNfc_Tpz_H_ProWrUsrData (psNdefMap); 6365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_STATE_READID: 6405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phFriNfc_Tpz_H_ProReadID (psNdefMap); 6425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_STATE_READALL: 6465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phFriNfc_Tpz_H_ProReadAll (psNdefMap); 6485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_STATE_WRITE_NMN: 6525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phFriNfc_Tpz_H_ProWrNMN (psNdefMap); 6545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_STATE_WRITE_L_TLV: 6585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phFriNfc_Tpz_H_ProWrTLV (psNdefMap); 6605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_STATE_WR_CC_OR_TLV: 6645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phFriNfc_Tpz_H_ProCCTLV (psNdefMap); 6665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TOPAZ_RF_ERROR_WORKAROUND 6705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_STATE_RF_ERROR_READ: 6725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phFriNfc_Tpz_H_CheckWrittenData (psNdefMap, 6745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly rf_error_state); 6755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef TOPAZ_RF_ERROR_WORKAROUND */ 6795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 6815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = PHNFCSTVAL (CID_FRI_NFC_NDEF_MAP, 6835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_DEVICE_REQUEST); 6845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 6895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TOPAZ_RF_ERROR_WORKAROUND 6915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ((FRINFC_RF_TIMEOUT_89 == PHNFCSTATUS (Status)) || 6935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (FRINFC_RF_TIMEOUT_90 == PHNFCSTATUS (Status)) || 6945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NFCSTATUS_RF_TIMEOUT == PHNFCSTATUS (Status))) 6955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t byte_number = 0; 6975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t block_number = 0; 6985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly rf_error_state = psNdefMap->State; 7005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TOPAZ_RAW_SUPPORT 7025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *psNdefMap->SendRecvBuf = PH_FRINFC_TOPAZ_CMD_READ; 7045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 7065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 7085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psNdefMap->Cmd.JewelCmd = phHal_eJewel_Read1; 7105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 7125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psNdefMap->Cmd.JewelCmd = phHal_eJewelCmdListJewelRead1; 7145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef PH_HAL4_ENABLE */ 7165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef TOPAZ_RAW_SUPPORT */ 7185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the state variable to the new work around state*/ 7205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psNdefMap->State = PH_FRINFC_TOPAZ_STATE_RF_ERROR_READ; 7215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Switch is used to know, if the error occured during WRITE or READ */ 7235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch (rf_error_state) 7245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_STATE_WRITE_NMN: 7265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Block and byte number is updated for NMN */ 7285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly byte_number = PH_FRINFC_TOPAZ_VAL0; 7295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly block_number = PH_FRINFC_TOPAZ_VAL1; 7305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 7315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_STATE_WRITE_L_TLV: 7345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Get the L field of the TLV block */ 7365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly block_number = (uint8_t)(((psNdefMap->TLVStruct.NdefTLVByte + 7375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL1) > 7385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL7)? 7395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (psNdefMap->TLVStruct.NdefTLVBlock + 7405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL1): 7415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psNdefMap->TLVStruct.NdefTLVBlock); 7425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Get the L byte */ 7435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly byte_number = (uint8_t)((psNdefMap->TLVStruct.NdefTLVByte + 7445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL1) % 7455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL8); 7465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 7475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_STATE_WR_CC_OR_TLV: 7505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch (psNdefMap->TopazContainer.InternalState) 7525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_WR_CC_BYTE0: 7545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Block and byte number is updated for the CC byte 0 */ 7565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly block_number = (uint8_t)PH_FRINFC_TOPAZ_VAL1; 7575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly byte_number = (uint8_t)PH_FRINFC_TOPAZ_VAL0; 7585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 7595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_WR_CC_BYTE1: 7625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Block and byte number is updated for the CC byte 1 */ 7645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly block_number = (uint8_t)PH_FRINFC_TOPAZ_VAL1; 7655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly byte_number = (uint8_t)PH_FRINFC_TOPAZ_VAL1; 7665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 7675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_WR_CC_BYTE2: 7705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Block and byte number is updated for the CC byte 2 */ 7725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly block_number = (uint8_t)PH_FRINFC_TOPAZ_VAL1; 7735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly byte_number = (uint8_t)PH_FRINFC_TOPAZ_VAL2; 7745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 7755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_WR_CC_BYTE3: 7785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Block and byte number is updated for the CC byte 3 */ 7805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly block_number = (uint8_t)PH_FRINFC_TOPAZ_VAL1; 7815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly byte_number = (uint8_t)PH_FRINFC_TOPAZ_VAL3; 7825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 7835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_WR_T_OF_TLV: 7865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Block and byte number is updated for the Type field of the TLV */ 7885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly block_number = psNdefMap->TLVStruct.NdefTLVBlock; 7895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly byte_number = (uint8_t)psNdefMap->TLVStruct.NdefTLVByte; 7905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 7915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 7945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Do nothing */ 7965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 7975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } /* switch (psNdefMap->TopazContainer.InternalState) */ 7995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 8005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_STATE_WRITE: 8035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Block and byte number is updated for the written error data */ 8055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly block_number = psNdefMap->TopazContainer.CurrentBlock; 8065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly byte_number = psNdefMap->TopazContainer.ByteNumber; 8075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 8085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 8115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Error occured is not during WRITE, so update 8135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly state variable to the previous state */ 8145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psNdefMap->State = rf_error_state; 8155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 8165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } /* switch (rf_error_state) */ 8185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* The below check is added, to know if the error is for 8205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly the WRITE or READ scenario, 8215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly If the error is for READ, then state variable is not updated 8225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly If the error is for WRITE, then state variable is updated with 8235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_STATE_RF_ERROR_READ value */ 8245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (PH_FRINFC_TOPAZ_STATE_RF_ERROR_READ == psNdefMap->State) 8255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Read the data with the updated block and byte number */ 8275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phFriNfc_Tpz_H_RdBytes (psNdefMap, block_number, 8285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly byte_number); 8295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef TOPAZ_RF_ERROR_WORKAROUND */ 8335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Call Completion Routine, if Status != PENDING */ 8365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (NFCSTATUS_PENDING != Status) 8375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Tpz_H_Complete(psNdefMap, Status); 8395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 8415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TOPAZ_RF_ERROR_WORKAROUND 8445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic 8465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS 8475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphFriNfc_Tpz_H_CheckWrittenData ( 8485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_NdefMap_t *psNdefMap, 8495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t state_rf_error) 8505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 8515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS result = NFCSTATUS_SUCCESS; 8525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch (state_rf_error) 8545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_STATE_WRITE: 8565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly result = phFriNfc_Tpz_H_ProWrUsrData (psNdefMap); 8585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 8595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_STATE_WRITE_NMN: 8625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly result = phFriNfc_Tpz_H_ProWrNMN (psNdefMap); 8645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 8655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_STATE_WRITE_L_TLV: 8685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly result = phFriNfc_Tpz_H_ProWrTLV (psNdefMap); 8705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 8715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_STATE_WR_CC_OR_TLV: 8745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly result = phFriNfc_Tpz_H_ProCCTLV (psNdefMap); 8765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 8775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 8805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 8825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return result; 8865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 8875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef TOPAZ_RF_ERROR_WORKAROUND */ 8905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_RdBytes(phFriNfc_NdefMap_t *NdefMap, 8925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t BlockNo, 8935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t ByteNo) 8945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 8955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Result = NFCSTATUS_SUCCESS; 8965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TOPAZ_RAW_SUPPORT 8975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t index = 0; 8985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef TOPAZ_RAW_SUPPORT */ 8995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the data for additional data exchange*/ 9015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = PH_FRINFC_TOPAZ_VAL0; 9025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = PH_FRINFC_TOPAZ_VAL0; 9035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->psDepAdditionalInfo.NAD = PH_FRINFC_TOPAZ_VAL0; 9045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_TopazMap_Process; 9065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->MapCompletionInfo.Context = NdefMap; 9075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *NdefMap->SendRecvLength = NdefMap->TempReceiveLength; 9095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Depending on the jewel command, the send length is decided */ 9115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TOPAZ_RAW_SUPPORT 9125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0]) 9135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 9145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(NdefMap->Cmd.JewelCmd) 9155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef TOPAZ_RAW_SUPPORT */ 9165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TOPAZ_RAW_SUPPORT 9195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_CMD_READID: 9205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 9215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 9225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHal_eJewel_RID: 9235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 9245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHal_eJewelCmdListJewelRid: 9255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 9265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef TOPAZ_RAW_SUPPORT */ 9275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TOPAZ_RAW_SUPPORT 9295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd.JewelCmd = phHal_eJewel_Raw; 9305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Copy command to Send Buffer*/ 9315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] = PH_FRINFC_TOPAZ_CMD_READID; 9325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index ++; 9335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Copy UID of the tag to Send Buffer*/ 9355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (void)memset(&(NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL1]), 9365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 0x00,(0x06)); 9375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index = index + 0x06; 9385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the length of the command buffer*/ 9405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendLength = index; 9415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 9425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* For READ ID and READ ALL, send length is 0 */ 9435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendLength = PH_FRINFC_TOPAZ_VAL0; 9445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef TOPAZ_RAW_SUPPORT */ 9455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 9465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TOPAZ_RAW_SUPPORT 9485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_CMD_READALL: 9495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 9505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 9515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHal_eJewel_ReadAll: 9525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 9535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHal_eJewelCmdListJewelReadAll: 9545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 9555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef TOPAZ_RAW_SUPPORT */ 9565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TOPAZ_RAW_SUPPORT 9585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd.JewelCmd = phHal_eJewel_Raw; 9595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Copy command to Send Buffer*/ 9605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] = PH_FRINFC_TOPAZ_CMD_READALL; 9615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index ++; 9625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Copy 0x00 to Send Buffer*/ 9645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL1] = 0x00; 9655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index ++; 9665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL2] = 0x00; 9675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index ++; 9685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Copy UID of the tag to Send Buffer*/ 9705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (void)memcpy(&(NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL3]), 9715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &(NdefMap->psRemoteDevInfo->RemoteDevInfo.Jewel_Info.Uid), 97280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen TOPAZ_UID_LENGTH_FOR_READ_WRITE); 9735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 97480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen index = (uint8_t)(index + TOPAZ_UID_LENGTH_FOR_READ_WRITE); 9755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the length of the command buffer*/ 9775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendLength = index; 9785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 9795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* For READ ID and READ ALL, send length is 0 */ 9805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendLength = PH_FRINFC_TOPAZ_VAL0; 9815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef TOPAZ_RAW_SUPPORT */ 9825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 9835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TOPAZ_RAW_SUPPORT 9855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_CMD_READ: 9865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 9875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 9885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHal_eJewel_Read1: 9895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 9905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHal_eJewelCmdListJewelRead1: 9915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 9925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef TOPAZ_RAW_SUPPORT */ 9945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TOPAZ_RAW_SUPPORT 9965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd.JewelCmd = phHal_eJewel_Raw; 9975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Copy command to Send Buffer*/ 9985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] = PH_FRINFC_TOPAZ_CMD_READ; 9995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index ++; 10005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Copy Address to Send Buffer*/ 10025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Calculate send length 10035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7 | 6 5 4 3 | 2 1 0 | 10045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly | block no | byte no | 10055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 10065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL1] = 10075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t)((BlockNo << PH_FRINFC_TOPAZ_SHIFT3) + 10085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ByteNo); 10095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index ++; 10105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Copy 0x00 to Send Buffer*/ 10115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL2] = 0x00; 10125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index ++; 10135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Copy UID of the tag to Send Buffer*/ 10155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (void)memcpy(&(NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL3]), 10165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &(NdefMap->psRemoteDevInfo->RemoteDevInfo.Jewel_Info.Uid), 101780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen TOPAZ_UID_LENGTH_FOR_READ_WRITE); 101880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen index = (uint8_t)(index + TOPAZ_UID_LENGTH_FOR_READ_WRITE); 10195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the length of the command buffer*/ 10215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendLength = index; 10225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 10235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Calculate send length 10245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7 | 6 5 4 3 | 2 1 0 | 10255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly | block no | byte no | 10265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 10275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] = 10285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t)((BlockNo << PH_FRINFC_TOPAZ_SHIFT3) + 10295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ByteNo); 10305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendLength = PH_FRINFC_TOPAZ_VAL1; 10315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef TOPAZ_RAW_SUPPORT */ 10325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 10345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TOPAZ_RAW_SUPPORT 10355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 10365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 10375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHal_eJewel_Read: 10385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] = 0x00; 10395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL1] = 0x00; 10405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL2] = 104; 10415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendLength = 3; 10425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 10435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 10445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef TOPAZ_RAW_SUPPORT */ 10455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 10475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 10485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_DEVICE_REQUEST); 10495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(Result == NFCSTATUS_SUCCESS) 10525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 10535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Call the Overlapped HAL Transceive function */ 10545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_OvrHal_Transceive( NdefMap->LowerDevice, 10555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &NdefMap->MapCompletionInfo, 10565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->psRemoteDevInfo, 10575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd, 10585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &NdefMap->psDepAdditionalInfo, 10595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf, 10605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendLength, 10615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf, 10625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvLength); 10635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Result; 10655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 10665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_WrAByte(phFriNfc_NdefMap_t *NdefMap, 10685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t BlockNo, 10695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t ByteNo, 10705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t ByteVal 10715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 10725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 10735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Result = NFCSTATUS_SUCCESS; 10745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t index = 0; 10755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PHNFC_UNUSED_VARIABLE(ByteVal); 10785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the data for additional data exchange*/ 10795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = PH_FRINFC_TOPAZ_VAL0; 10805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = PH_FRINFC_TOPAZ_VAL0; 10815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->psDepAdditionalInfo.NAD = PH_FRINFC_TOPAZ_VAL0; 10825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_TopazMap_Process; 10845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->MapCompletionInfo.Context = NdefMap; 10855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *NdefMap->SendRecvLength = NdefMap->TempReceiveLength; 10875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Command used to write 1 byte */ 10885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TOPAZ_RAW_SUPPORT 10895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd.JewelCmd = phHal_eJewel_Raw; 10905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 10915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 10925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd.JewelCmd = phHal_eJewel_Write1E; 10935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 10945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd.JewelCmd = phHal_eJewelCmdListJewelWriteErase1; 10955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 10965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef TOPAZ_RAW_SUPPORT */ 10975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TOPAZ_RAW_SUPPORT 10995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Copy command to Send Buffer*/ 11005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] = PH_FRINFC_TOPAZ_CMD_WRITE_1E; 11015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index ++; 11025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Copy Address to Send Buffer*/ 11045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Calculate send length 11055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7 | 6 5 4 3 | 2 1 0 | 11065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly | block no | byte no | 11075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 11085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL1] = 11095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t)((BlockNo << PH_FRINFC_TOPAZ_SHIFT3) + 11105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ByteNo); 11115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index ++; 11125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Copy Data byte to Send Buffer*/ 11135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[index] = ByteVal; 11145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index ++; 11155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Copy UID of the tag to Send Buffer*/ 11175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (void)memcpy(&(NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL3]), 11185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &(NdefMap->psRemoteDevInfo->RemoteDevInfo.Jewel_Info.Uid), 111980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen TOPAZ_UID_LENGTH_FOR_READ_WRITE); 112080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen index = (uint8_t)(index + TOPAZ_UID_LENGTH_FOR_READ_WRITE); 11215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the length of the command buffer*/ 11235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendLength = index; 11245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 11265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Depending on the jewel command, the send length is decided */ 11275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Calculate send length 11285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7 | 6 5 4 3 | 2 1 0 | 11295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly | block no | byte no | 11305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 11315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[index] = 11325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t)((BlockNo << PH_FRINFC_TOPAZ_SHIFT3) + 11335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ByteNo); 11345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index ++; 11355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[index] = ByteVal; 11365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index ++; 11375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendLength = PH_FRINFC_TOPAZ_VAL2; 11385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef TOPAZ_RAW_SUPPORT */ 11405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Call the Overlapped HAL Transceive function */ 11425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_OvrHal_Transceive( NdefMap->LowerDevice, 11435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &NdefMap->MapCompletionInfo, 11445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->psRemoteDevInfo, 11455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd, 11465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &NdefMap->psDepAdditionalInfo, 11475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf, 11485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendLength, 11495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf, 11505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvLength); 11515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Result; 11535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 11545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_ProReadID(phFriNfc_NdefMap_t *NdefMap) 11565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 11575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 11585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_RECEIVE_LENGTH); 11595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(((NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] & 11615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_HEADROM0_CHK) == PH_FRINFC_TOPAZ_HEADROM0_VAL) && 11625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (*NdefMap->SendRecvLength == PH_FRINFC_TOPAZ_VAL6)) 11635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Copy UID to the context, Used when the READ ALL command is used */ 11655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (void)memcpy(NdefMap->TopazContainer.UID, 11665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL2], 11675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL4); 11685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* State has to be changed */ 11705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_TOPAZ_STATE_READALL; 11715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Topaz command = READALL */ 11725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TOPAZ_RAW_SUPPORT 11735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd.JewelCmd = phHal_eJewel_Raw; 11745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] = PH_FRINFC_TOPAZ_CMD_READALL; 11755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 11765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 11775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd.JewelCmd = phHal_eJewel_ReadAll; 11785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 11795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd.JewelCmd = phHal_eJewelCmdListJewelReadAll; 11805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 11815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef TOPAZ_RAW_SUPPORT */ 11825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Read all bytes from the card */ 11845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_RdBytes(NdefMap, NdefMap->TopazContainer.CurrentBlock, 11855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber); 11865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 11875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Result; 11895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 11905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_ProReadAll(phFriNfc_NdefMap_t *NdefMap) 11925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 11935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 11945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_RECEIVE_LENGTH); 11955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly int32_t memcompare = PH_FRINFC_TOPAZ_VAL0; 11965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Compare the UID of READ ALL command with the stored UID */ 11985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 11995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ((NdefMap->TopazContainer.UID[0] == NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL2]) && 12005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->TopazContainer.UID[1] == NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL2 + 1]) && 12015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->TopazContainer.UID[2] == NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL2 + 2]) && 12025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->TopazContainer.UID[3] == NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL2 + 3])) 12035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 12045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly memcompare = PH_FRINFC_TOPAZ_VAL0; 12055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 12065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 12075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 12085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly memcompare = PH_FRINFC_TOPAZ_VAL1; 12095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 12105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 12115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly memcompare = memcmp(NdefMap->TopazContainer.UID, 12125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL2], 12135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL4); 12145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef PH_HAL4_ENABLE */ 12155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(((NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] & 12175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_HEADROM0_CHK) == PH_FRINFC_TOPAZ_HEADROM0_VAL) && 12185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (*NdefMap->SendRecvLength == PH_FRINFC_TOPAZ_READALL_RESP) && 12195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (memcompare == PH_FRINFC_TOPAZ_VAL0)) 12205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 12215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Copy 96 bytes from the read/write memory space */ 12225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (void)memcpy(NdefMap->TopazContainer.ReadBuffer, 12235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL10], 12245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_TOTAL_RWBYTES); 12255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check the lock bits and set the card state */ 12275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Tpz_H_ChkLockBits(NdefMap); 12285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_CallNxtOp(NdefMap); 12305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 12315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Result; 12325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 12335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_CallNxtOp(phFriNfc_NdefMap_t *NdefMap) 12355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 12365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 12375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_RECEIVE_LENGTH); 12385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Depending on the operation (check, read or write ndef), process the 12395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly read data */ 12405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(NdefMap->PrevOperation) 12415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 12425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_CHECK_OPE: 12435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check the capabilty container values, according 12445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly to the spec */ 12455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_ChkCCinChkNdef(NdefMap); 12465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (NdefMap->CardState != PH_NDEFMAP_CARD_STATE_INVALID) 12485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 12495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check the spec version */ 12505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_ChkSpcVer( NdefMap, 12515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ReadBuffer[PH_FRINFC_TOPAZ_VAL1]); 12525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check the CC header size: Only valid ones are 12535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 0x0C for 96 bytes. */ 12545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ((Result == NFCSTATUS_SUCCESS) && 12555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ( NdefMap->TopazContainer.ReadBuffer[PH_FRINFC_TOPAZ_VAL2] <= 12565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_CC_BYTE2_MAX)) 12575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 12585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_findNDEFTLV(NdefMap); 12595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* As there is possibility of either having or not having TLV in 12605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Topaz, no need to send the Actual status to the context*/ 12615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = NFCSTATUS_SUCCESS; 12625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 12635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 12645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 12655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1266a6243755a9b438bfbfe0be331ece55953f8cf9ebMartijn Coenen Result = NFCSTATUS_SUCCESS; 1267a6243755a9b438bfbfe0be331ece55953f8cf9ebMartijn Coenen NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INITIALIZED; 1268a6243755a9b438bfbfe0be331ece55953f8cf9ebMartijn Coenen NdefMap->CardMemSize = 1269a6243755a9b438bfbfe0be331ece55953f8cf9ebMartijn Coenen NdefMap->TopazContainer.RemainingSize = (uint16_t) 1270a6243755a9b438bfbfe0be331ece55953f8cf9ebMartijn Coenen /* 1271a6243755a9b438bfbfe0be331ece55953f8cf9ebMartijn Coenen 4 is decremented from the max size because of the 4 CC bytes 1272a6243755a9b438bfbfe0be331ece55953f8cf9ebMartijn Coenen 2 is decremented because of the NDEF TLV T and L byte 1273a6243755a9b438bfbfe0be331ece55953f8cf9ebMartijn Coenen to get the actual data size 1274a6243755a9b438bfbfe0be331ece55953f8cf9ebMartijn Coenen */ 1275a6243755a9b438bfbfe0be331ece55953f8cf9ebMartijn Coenen (PH_FRINFC_TOPAZ_MAX_CARD_SZ - PH_FRINFC_TOPAZ_VAL4 - 1276a6243755a9b438bfbfe0be331ece55953f8cf9ebMartijn Coenen PH_FRINFC_TOPAZ_VAL2); 12775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 12785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 12795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_READ_OPE: 12815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check the capabilty container values, according 12825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly to the spec */ 12835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_ChkCCBytes(NdefMap); 12845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* If success, find the ndef TLV */ 12865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = ((Result != NFCSTATUS_SUCCESS)? 12875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 12885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_FORMAT)): 12895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Tpz_H_findNDEFTLV(NdefMap)); 12905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(Result == NFCSTATUS_SUCCESS) 12925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 12935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber += PH_FRINFC_TOPAZ_VAL2; 12945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* If success, copy the read bytes to the user buffer */ 12955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_CpDataToUsrBuf(NdefMap); 12965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 12975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 12985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_WRITE_OPE: 13005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 13015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_WRITE) || 13025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INITIALIZED)) 13035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 13045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check the capabilty container values, according 13055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly to the spec */ 13065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_ChkCCBytes(NdefMap); 13075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(Result == NFCSTATUS_SUCCESS) 13085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 13095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Find the NDEF TLV */ 13105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_findNDEFTLV(NdefMap); 13115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Write the TLV */ 13135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.InternalState = PH_FRINFC_TOPAZ_WR_T_OF_TLV; 13145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 13155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 13165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 13175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_TOPAZ_VAL4; 13185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TLVStruct.NdefTLVBlock = PH_FRINFC_TOPAZ_VAL1; 13195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber = PH_FRINFC_TOPAZ_VAL4; 13205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Write the TLV */ 13215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.InternalState = PH_FRINFC_TOPAZ_WR_CC_BYTE0; 13225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 13235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Write CC bytes */ 13245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_WrCCorTLV(NdefMap); 13255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 13265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 13275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 13285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Result; 13295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 13305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_ChkCCBytes(phFriNfc_NdefMap_t *NdefMap) 13325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 13335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 13345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_NO_NDEF_SUPPORT); 13355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NdefMap->TopazContainer.ReadBuffer[PH_FRINFC_TOPAZ_VAL0] == 13375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_CC_BYTE0) 13385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 13395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check the spec version */ 13405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_ChkSpcVer( NdefMap, 13415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ReadBuffer[PH_FRINFC_TOPAZ_VAL1]); 13425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check the CC header size: Only valid ones are 13435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 0x0C for 96 bytes. */ 13445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = ((( NdefMap->TopazContainer.ReadBuffer[PH_FRINFC_TOPAZ_VAL2] > 13455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_CC_BYTE2_MAX) || (Result != 13465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_SUCCESS))? 13475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 13485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_EOF_NDEF_CONTAINER_REACHED)): 13495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result); 13505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Get the read/write card memory size */ 13525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.RemainingSize = 13535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardMemSize = ((Result == NFCSTATUS_SUCCESS)? 13545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (PH_FRINFC_TOPAZ_MAX_CARD_SZ - PH_FRINFC_TOPAZ_VAL4): 13555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardMemSize); 13565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* if the call is from write ndef then check for read write access */ 13585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(((NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_WRITE_OPE) && 13595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->TopazContainer.ReadBuffer[PH_FRINFC_TOPAZ_VAL3] != 13605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_CC_BYTE3_RW) && (Result == NFCSTATUS_SUCCESS))) 13615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 13625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 13635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_FORMAT)); 13645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 13655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* if the call is from read ndef then check for read only or read write access */ 13675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(((NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_READ_OPE) && 13685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ((NdefMap->TopazContainer.ReadBuffer[PH_FRINFC_TOPAZ_VAL3] != 13695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_CC_BYTE3_RW) && 13705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->TopazContainer.ReadBuffer[PH_FRINFC_TOPAZ_VAL3] != 13715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_CC_BYTE3_RO))&& (Result == NFCSTATUS_SUCCESS))) 13725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 13735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 13745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_FORMAT)); 13755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 13765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 13775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Result; 13785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 13795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellyextern NFCSTATUS phFriNfc_Tpz_H_ChkSpcVer( phFriNfc_NdefMap_t *NdefMap, 13815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t VersionNo) 13825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 13835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Result = NFCSTATUS_SUCCESS; 13845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t TagVerNo = VersionNo; 13855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* To remove "warning (VS C4100) : unreferenced formal parameter" */ 13875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PHNFC_UNUSED_VARIABLE(NdefMap); 13885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( TagVerNo == 0 ) 13905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 13915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Return Status Error � Invalid Format�*/ 13925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,NFCSTATUS_INVALID_FORMAT); 13935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 13945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 13955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 13965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* calculate the major and minor version number of T3VerNo */ 13975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM == 13985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo ) )&& 13995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ( PH_NFCFRI_NDEFMAP_NFCDEV_MINOR_VER_NUM >= 14005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_NFCFRI_NDEFMAP_GET_MINOR_TAG_VERNO(TagVerNo))) || 14015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM == 14025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo ) )&& 14035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ( PH_NFCFRI_NDEFMAP_NFCDEV_MINOR_VER_NUM < 14045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_NFCFRI_NDEFMAP_GET_MINOR_TAG_VERNO(TagVerNo) ))) 14055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 14065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = PHNFCSTVAL(CID_NFC_NONE,NFCSTATUS_SUCCESS); 14075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 14085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 14095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 14105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM < 14115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo) ) || 14125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM > 14135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo))) 14145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 14155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,NFCSTATUS_INVALID_FORMAT); 14165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 14175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 14185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 14195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Result; 14205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 14215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_findNDEFTLV(phFriNfc_NdefMap_t *NdefMap) 14235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 14245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 14255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_NO_NDEF_SUPPORT); 14265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t index = PH_FRINFC_TOPAZ_VAL4; 14275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* If remaining size is less than 3 then, there cant be any 14295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly TLV present in the card */ 14305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly while((index < PH_FRINFC_TOPAZ_TOTAL_RWBYTES) && 14315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->TopazContainer.RemainingSize >= PH_FRINFC_TOPAZ_VAL3)) 14325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 14335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(NdefMap->TopazContainer.ReadBuffer[index]) 14345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 14355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_NDEF_T: 14365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* To get the length field of the TLV */ 14375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index++; 14385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Type and length are not data bytes, so to know the exact 14395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly remaining size in the card, the below operation is done */ 14405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.RemainingSize -= PH_FRINFC_TOPAZ_VAL2; 14415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Set the card state depending on the L value */ 14425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_MapTool_SetCardState(NdefMap, 14435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint32_t)NdefMap->TopazContainer.ReadBuffer[index]); 14445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check the TLV is correct */ 14455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NdefMap->TopazContainer.ReadBuffer[index] > 14465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.RemainingSize) || 14475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ((NdefMap->TopazContainer.ReadBuffer[index] == 14485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL0) && (NdefMap->PrevOperation == 14495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_NDEFMAP_READ_OPE)) || (Result != NFCSTATUS_SUCCESS)) 14505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 14515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* L field value cant be greater than the remaining size, so error */ 14525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 14535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_NO_NDEF_SUPPORT); 14545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* To break out of the loop */ 14555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index = PH_FRINFC_TOPAZ_TOTAL_RWBYTES; 14565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 14575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 14585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 14595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* So remaining size also changes, according to the position of NDEF TLV */ 14605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TLVStruct.BytesRemainLinTLV = 14615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ReadBuffer[index]; 14625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Get the byte number */ 14645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TLVStruct.NdefTLVByte = (uint16_t)((index - PH_FRINFC_TOPAZ_VAL1) % 14655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL8); 14665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Get the block number */ 14675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TLVStruct.NdefTLVBlock = (uint8_t)(((index - PH_FRINFC_TOPAZ_VAL1) / 14685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL8) + 14695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL1); 14705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* TLV found flag is set */ 14715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_TOPAZ_FLAG1; 14725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* To know the position of V field in the TLV */ 14735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber = (uint8_t)(((NdefMap->TLVStruct.NdefTLVBlock - 1) * 8) + 14745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TLVStruct.NdefTLVByte); 14755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* To break out of the loop */ 14765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index = PH_FRINFC_TOPAZ_TOTAL_RWBYTES; 14775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = NFCSTATUS_SUCCESS; 14785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 14795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 14805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_NULL_T: 14825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Null TLV, Skip the TLV */ 14835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.RemainingSize--; 14845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index++; 14855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 14865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_TERM_T: 14885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* No more TLV present in the card, so error */ 14895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index = PH_FRINFC_TOPAZ_TOTAL_RWBYTES; 14905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 14915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_NO_NDEF_SUPPORT); 14925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 14935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 14955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Go till the length field of the TLV */ 14965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index++; 14975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Type and length is not the data, so to know the exact 14985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly remaining size in the card, the below operation is done */ 14995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.RemainingSize -= PH_FRINFC_TOPAZ_VAL2; 15005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NdefMap->TopazContainer.ReadBuffer[index] > 15015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.RemainingSize) 15025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 15035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* L field value cant be greater than the remaining size, so error */ 15045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index = PH_FRINFC_TOPAZ_TOTAL_RWBYTES; 15055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 15065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_NO_NDEF_SUPPORT); 15075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 15085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 15095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 15105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Remaining size of the free space available in the card changes, 15115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly according to the position of NDEF TLV */ 15125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.RemainingSize = 15135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.RemainingSize - 15145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ReadBuffer[index]; 15155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 15165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Get the position of the next TLV */ 15175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index = (uint8_t)(index + 15185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->TopazContainer.ReadBuffer[index] + 15195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL1)); 15205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 15215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 15225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 15235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 15245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 15255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* If no Ndef TLV found and operation done is read */ 15265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NdefMap->TLVStruct.NdefTLVFoundFlag == PH_FRINFC_TOPAZ_FLAG0) && 15275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_READ_OPE)) 15285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 15295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 15305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_EOF_NDEF_CONTAINER_REACHED); 15315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 15325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NdefMap->TLVStruct.NdefTLVFoundFlag == PH_FRINFC_TOPAZ_FLAG0) && 15335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ((NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_WRITE_OPE) || 15345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_CHECK_OPE))) 15355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 15365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_TOPAZ_VAL4; 15375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TLVStruct.NdefTLVBlock = PH_FRINFC_TOPAZ_VAL1; 15385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber = PH_FRINFC_TOPAZ_VAL4; 15395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.RemainingSize = PH_FRINFC_TOPAZ_TOTAL_RWBYTES1; 15405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 15415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Result; 15425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 15435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 15445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_CpDataToUsrBuf(phFriNfc_NdefMap_t *NdefMap) 15455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 15465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Result = NFCSTATUS_SUCCESS; 15475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 15485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check the the TLV size and the user size */ 15495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NdefMap->ApduBufferSize >= 15505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TLVStruct.BytesRemainLinTLV) 15515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 15525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Copy the read bytes to user buffer till the value (V) 15535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly of TLV ends */ 15545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (void)memcpy(NdefMap->ApduBuffer, 15555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &(NdefMap->TopazContainer.ReadBuffer[ 15565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber]), 15575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TLVStruct.BytesRemainLinTLV); 15585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 15595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the number of read bytes to the user */ 15605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *(NdefMap->NumOfBytesRead) = 15615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TLVStruct.BytesRemainLinTLV; 15625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* There is no byte to read */ 15635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber = 15645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL0; 15655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* No further read is possible */ 15665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ReadWriteCompleteFlag = 15675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_FLAG1; 15685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Remaining size in the card can be greater than length field in 15695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly the TLV */ 15705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.RemainingSize = 15715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.RemainingSize - 15725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TLVStruct.BytesRemainLinTLV; 15735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* TLV has been completely read, no more bytes to read */ 15745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TLVStruct.BytesRemainLinTLV = 15755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL0; 15765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 15775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 15785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 15795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Copy read bytes till the user buffer size */ 15805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (void)memcpy(NdefMap->ApduBuffer, 15815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &(NdefMap->TopazContainer.ReadBuffer[ 15825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber]), 15835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBufferSize); 15845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 15855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the number of read bytes to the user */ 15865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *(NdefMap->NumOfBytesRead) = 15875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBufferSize; 15885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Get the next byte number to read */ 15895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber = 15905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t)(NdefMap->TopazContainer.ByteNumber + 15915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBufferSize); 15925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Free space left in the card */ 15935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.RemainingSize 15945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly = NdefMap->TopazContainer.RemainingSize 15955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly - (uint16_t)NdefMap->ApduBufferSize; 15965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Bytes left in the TLV */ 15975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TLVStruct.BytesRemainLinTLV = 15985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TLVStruct.BytesRemainLinTLV - 15995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint16_t)NdefMap->ApduBufferSize; 16005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 16015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Result; 16025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 16035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_ProWrNMN(phFriNfc_NdefMap_t *NdefMap) 16055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 16065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 16075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_RECEIVE_LENGTH); 16085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t BlockNo = PH_FRINFC_TOPAZ_VAL0, 16095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ByteNo = PH_FRINFC_TOPAZ_VAL0; 16105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NdefMap->TopazContainer.InternalState == 16125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_WR_NMN_0) && 16135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] == 16145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL0) && 16155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (*NdefMap->SendRecvLength == PH_FRINFC_TOPAZ_VAL1)) 16165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 16175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_TOPAZ_STATE_WRITE_L_TLV; 16185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Get the L field of the TLV block */ 16195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly BlockNo = (uint8_t)(((NdefMap->TLVStruct.NdefTLVByte + PH_FRINFC_TOPAZ_VAL1) > 16205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL7)? 16215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->TLVStruct.NdefTLVBlock + PH_FRINFC_TOPAZ_VAL1): 16225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TLVStruct.NdefTLVBlock); 16235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Get the L byte */ 16245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ByteNo = (uint8_t)((NdefMap->TLVStruct.NdefTLVByte + PH_FRINFC_TOPAZ_VAL1) % 16255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL8); 16265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Here the NMN is written 0, so internal state is used */ 16295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.InternalState = PH_FRINFC_TOPAZ_WR_L_TLV_0; 16305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Write the length value = 0x00 , Write L field of TLV = 0 inside this*/ 16315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_WrAByte( NdefMap, BlockNo, ByteNo, 16325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL0); 16335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 16345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 16355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 16365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NdefMap->TopazContainer.InternalState == 16375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_WR_NMN_E1) && 16385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] == 16395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_CC_BYTE0) && 16405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (*NdefMap->SendRecvLength == PH_FRINFC_TOPAZ_VAL1)) 16415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 16425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Card state is initialised or invalid */ 16435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardState = (uint8_t)((NdefMap->CardState == 16445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_NDEFMAP_CARD_STATE_INITIALIZED)? 16455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_NDEFMAP_CARD_STATE_READ_WRITE: 16465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardState); 16475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* update the length to the user */ 16485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *NdefMap->WrNdefPacketLength = NdefMap->ApduBuffIndex; 16495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = NFCSTATUS_SUCCESS; 16505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 16515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 16525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Result; 16535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 16545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_ProWrTLV(phFriNfc_NdefMap_t *NdefMap) 16565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 16575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 16585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_RECEIVE_LENGTH); 16595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NdefMap->TopazContainer.InternalState == 16605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_WR_L_TLV_0) && 16615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] == 16625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL0) && 16635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (*NdefMap->SendRecvLength == PH_FRINFC_TOPAZ_VAL1)) 16645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 16655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* state is writing user data to the card */ 16665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_TOPAZ_STATE_WRITE; 16675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber++; 16695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check the byte number */ 16705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Tpz_H_BlkChk(NdefMap); 16715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Write data to the specified location */ 16735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Write the data to the card from the user buffer */ 16745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_WrAByte( NdefMap, 16755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.CurrentBlock, 16765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber, 16775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffer[NdefMap->ApduBuffIndex] 16785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ); 16795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 16805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 16815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 16825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NdefMap->TopazContainer.InternalState == 16835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_WR_L_TLV) && 16845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN) && 16855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] == 16865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffIndex)) || 16875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) && 16885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] == 16895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->ApduBuffIndex + NdefMap->TLVStruct.BytesRemainLinTLV)))) && 16905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (*NdefMap->SendRecvLength == PH_FRINFC_TOPAZ_VAL1)) 16915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 16925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the L value in the context */ 16935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TLVStruct.BytesRemainLinTLV = 16945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN)? 16955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffIndex: 16965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->TLVStruct.BytesRemainLinTLV + NdefMap->ApduBuffIndex)); 16975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Write 0xE1 in block number = 1 and byte number = 0 */ 16995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_WrByte0ValE1(NdefMap); 17005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 17015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 17025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Result; 17035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 17045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_ProWrUsrData(phFriNfc_NdefMap_t *NdefMap) 17065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 17075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 17085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_RECEIVE_LENGTH); 17095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* send buffer should be equal to receive buffer */ 17105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] == 17115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffer[NdefMap->ApduBuffIndex]) && 17125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (*NdefMap->SendRecvLength == PH_FRINFC_TOPAZ_VAL1)) 17135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 17145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Increment the index */ 17155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffIndex += PH_FRINFC_TOPAZ_VAL1; 17165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Remaining space left in the card is less by one */ 17185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.RemainingSize -= PH_FRINFC_TOPAZ_VAL1; 17195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Increment the byte number */ 17215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber++; 17225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check the block number */ 17245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Tpz_H_BlkChk(NdefMap); 17255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* check for the user space or the card size */ 17275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NdefMap->ApduBufferSize == NdefMap->ApduBuffIndex) || 17285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->TopazContainer.RemainingSize == PH_FRINFC_TOPAZ_VAL0)) 17295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 17305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Set write complete, if the end of card is reached */ 17315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ReadWriteCompleteFlag = (uint8_t) 17325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ((NdefMap->TopazContainer.RemainingSize == PH_FRINFC_TOPAZ_VAL0)? 17335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_FLAG1:PH_FRINFC_TOPAZ_FLAG0); 17345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_WrLByte(NdefMap); 17365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 17375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 17385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 17395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* State is continued to be in write */ 17405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_TOPAZ_STATE_WRITE; 17415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Write the byte to the specified location , and Byte to write */ 17435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_WrAByte(NdefMap, NdefMap->TopazContainer.CurrentBlock, 17445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber, 17455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffer[NdefMap->ApduBuffIndex] 17465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ); 17475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 17485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 17495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Result; 17505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 17515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_WrLByte(phFriNfc_NdefMap_t *NdefMap) 17535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 17545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Result = NFCSTATUS_SUCCESS; 17555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t BlockNo = PH_FRINFC_TOPAZ_VAL0, 17565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ByteNo = PH_FRINFC_TOPAZ_VAL0; 17575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t TempByteVal = 0; 17585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly BlockNo = (uint8_t)(((NdefMap->TLVStruct.NdefTLVByte + 17595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL1) > 17605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL7)? 17615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->TLVStruct.NdefTLVBlock + 17625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL1): 17635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TLVStruct.NdefTLVBlock); 17645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ByteNo = (uint8_t)((NdefMap->TLVStruct.NdefTLVByte + 17665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL1) % PH_FRINFC_TOPAZ_VAL8); 17675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update L field */ 17685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_TOPAZ_STATE_WRITE_L_TLV; 17695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Internal state for write */ 17705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.InternalState = PH_FRINFC_TOPAZ_WR_L_TLV; 17715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the length field depending on the offset */ 17725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly TempByteVal = (uint8_t) 17735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN)? 17745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffIndex: 17755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->ApduBuffIndex + 17765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TLVStruct.BytesRemainLinTLV)); 17775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Write the L field */ 17785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_WrAByte(NdefMap, BlockNo, ByteNo,TempByteVal); 17795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Result; 17805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 17815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_WrByte0ValE1(phFriNfc_NdefMap_t *NdefMap) 17835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 17845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Result = NFCSTATUS_SUCCESS; 17855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update L field */ 17875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_TOPAZ_STATE_WRITE_NMN; 17885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Internal state for writing 0xE1 */ 17895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.InternalState = PH_FRINFC_TOPAZ_WR_NMN_E1; 17905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the length field depending on the offset */ 17915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Write the L field */ 17925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_WrAByte(NdefMap, PH_FRINFC_TOPAZ_VAL1, 17935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL0,PH_FRINFC_TOPAZ_CC_BYTE0); 17945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Result; 17955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 17965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_Tpz_H_Complete(phFriNfc_NdefMap_t *NdefMap, 17985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Status) 17995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 18005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the state back to the Reset_Init state*/ 18015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RESET_INIT; 18025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 18035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the completion routine*/ 18045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CompletionRoutine[NdefMap->TopazContainer.CRIndex]. 18055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly CompletionRoutine(NdefMap->CompletionRoutine->Context, Status); 18065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 18075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 18085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_Tpz_H_BlkChk(phFriNfc_NdefMap_t *NdefMap) 18095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 18105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.CurrentBlock = 18115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t)((NdefMap->TopazContainer.ByteNumber > 18125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL7)? 18135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->TopazContainer.CurrentBlock + 18145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL1): 18155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.CurrentBlock); 18165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 18175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber = (uint8_t)(NdefMap->TopazContainer.ByteNumber % 18185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL8); 18195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 18205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 18215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_ChkCCinChkNdef(phFriNfc_NdefMap_t *NdefMap) 18225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 18235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 18245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_NO_NDEF_SUPPORT); 18255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 18265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NdefMap->TopazContainer.ReadBuffer[PH_FRINFC_TOPAZ_VAL0] == 18275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_CC_BYTE0) 18285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 18295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check the most significant nibble of byte 3 (RWA) = 0 */ 18305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = (((NdefMap->TopazContainer.ReadBuffer[PH_FRINFC_TOPAZ_VAL3] & 18315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_BYTE3_MSB)== PH_FRINFC_TOPAZ_VAL0)? 18325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_SUCCESS: 18335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result); 18345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 18355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Card size is initialised */ 18365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardMemSize = NdefMap->TopazContainer.RemainingSize = 18375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ((Result == NFCSTATUS_SUCCESS)? 18385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (PH_FRINFC_TOPAZ_MAX_CARD_SZ - PH_FRINFC_TOPAZ_VAL4): 18395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardMemSize); 18405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 18415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 18425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (NdefMap->CardState != PH_NDEFMAP_CARD_STATE_READ_ONLY) 18435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 18445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardState = (uint8_t)((Result == NFCSTATUS_SUCCESS)? 18455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_NDEFMAP_CARD_STATE_INITIALIZED: 18465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_NDEFMAP_CARD_STATE_INVALID); 18475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 18485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 18495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Result; 18505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 18515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 18525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_Tpz_H_ChkLockBits(phFriNfc_NdefMap_t *NdefMap) 18535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 18545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Set the card state */ 18555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardState = (uint8_t) 18565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (((NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_LOCKBIT_BYTENO_0] == 18575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_LOCKBIT_BYTE114) && 18585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ((NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_LOCKBIT_BYTENO_1] == 18595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_LOCKBIT_BYTE115_1) || 18605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_LOCKBIT_BYTENO_1] == 18615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_LOCKBIT_BYTE115_2)))? 18625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_NDEFMAP_CARD_STATE_READ_WRITE: 18635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_NDEFMAP_CARD_STATE_READ_ONLY); 18645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 18655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Set the card state from CC bytes */ 18665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_WRITE) 18675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 18685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_CC_BYTENO_3] == PH_FRINFC_TOPAZ_CC_READWRITE) 18695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 18705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardState = PH_NDEFMAP_CARD_STATE_READ_WRITE; 18715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 18725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if (NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_CC_BYTENO_3] == PH_FRINFC_TOPAZ_CC_READONLY) 18735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 18745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardState = PH_NDEFMAP_CARD_STATE_READ_ONLY; 18755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 18765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 18775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 18785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID; 18795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 18805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 18815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 18825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 18835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_WrCCorTLV(phFriNfc_NdefMap_t *NdefMap) 18845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 18855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Result = NFCSTATUS_SUCCESS; 18865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t ByteNo = PH_FRINFC_TOPAZ_VAL0, 18875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly BlockNo = PH_FRINFC_TOPAZ_VAL0; 18885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t TempByteVal = 0; 18895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(NdefMap->TopazContainer.InternalState) 18905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 18915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_WR_CC_BYTE0: 18925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* To write the CC bytes */ 18935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly TempByteVal = PH_FRINFC_TOPAZ_CC_BYTE0; 18945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ByteNo = (uint8_t)PH_FRINFC_TOPAZ_VAL0; 18955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly BlockNo = PH_FRINFC_TOPAZ_VAL1; 18965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 18975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 18985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_WR_CC_BYTE1: 18995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* To write the CC bytes */ 19005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly TempByteVal = PH_FRINFC_TOPAZ_CC_BYTE1; 19015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ByteNo = (uint8_t)PH_FRINFC_TOPAZ_VAL1; 19025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly BlockNo = PH_FRINFC_TOPAZ_VAL1; 19035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 19045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 19055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_WR_CC_BYTE2: 19065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* To write the CC bytes */ 19075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly TempByteVal = PH_FRINFC_TOPAZ_CC_BYTE2_MAX; 19085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ByteNo = (uint8_t)PH_FRINFC_TOPAZ_VAL2; 19095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly BlockNo = PH_FRINFC_TOPAZ_VAL1; 19105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 19115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 19125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_WR_CC_BYTE3: 19135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* To write the CC bytes */ 19145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly TempByteVal = PH_FRINFC_TOPAZ_CC_BYTE3_RW; 19155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ByteNo = (uint8_t)PH_FRINFC_TOPAZ_VAL3; 19165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly BlockNo = PH_FRINFC_TOPAZ_VAL1; 19175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 19185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 19195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_WR_T_OF_TLV: 19205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 19215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* To write the NDEF TLV (if not present) */ 19225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly TempByteVal = PH_FRINFC_TOPAZ_NDEF_T; 19235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ByteNo = (uint8_t)NdefMap->TLVStruct.NdefTLVByte; 19245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly BlockNo = NdefMap->TLVStruct.NdefTLVBlock; 19255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 19265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 19275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_TOPAZ_STATE_WR_CC_OR_TLV; 19285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_WrAByte( NdefMap, BlockNo, ByteNo,TempByteVal); 19295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Result; 19305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 19315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 19325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Tpz_H_ProCCTLV(phFriNfc_NdefMap_t *NdefMap) 19335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 19345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 19355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_RECEIVE_LENGTH); 19365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(NdefMap->TopazContainer.InternalState) 19375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 19385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_WR_CC_BYTE0: 19395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Process the CC byte */ 19405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check the response */ 19415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] == 19425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_CC_BYTE0) && 19435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (*NdefMap->SendRecvLength == PH_FRINFC_TOPAZ_VAL1)) 19445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 19455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.InternalState = PH_FRINFC_TOPAZ_WR_CC_BYTE1; 19465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_WrCCorTLV(NdefMap); 19475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 19485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 19495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 19505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_WR_CC_BYTE1: 19515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Process the CC byte */ 19525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check the response */ 19535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] == 19545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_CC_BYTE1) && 19555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (*NdefMap->SendRecvLength == PH_FRINFC_TOPAZ_VAL1)) 19565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 19575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.InternalState = PH_FRINFC_TOPAZ_WR_CC_BYTE2; 19585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_WrCCorTLV(NdefMap); 19595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 19605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 19615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 19625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_WR_CC_BYTE2: 19635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Process the CC byte */ 19645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check the response */ 19655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] == 19665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_CC_BYTE2_MAX) && 19675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (*NdefMap->SendRecvLength == PH_FRINFC_TOPAZ_VAL1)) 19685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 19695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.InternalState = PH_FRINFC_TOPAZ_WR_CC_BYTE3; 19705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_WrCCorTLV(NdefMap); 19715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 19725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 19735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 19745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_WR_CC_BYTE3: 19755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Process the CC byte */ 19765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check the response */ 19775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] == 19785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_CC_BYTE3_RW) && 19795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (*NdefMap->SendRecvLength == PH_FRINFC_TOPAZ_VAL1)) 19805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 19815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.InternalState = PH_FRINFC_TOPAZ_WR_T_OF_TLV; 19825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_WrCCorTLV(NdefMap); 19835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 19845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 19855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 19865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_TOPAZ_WR_T_OF_TLV: 19875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 19885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check the response */ 19895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL0] == 19905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_NDEF_T) && 19915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (*NdefMap->SendRecvLength == PH_FRINFC_TOPAZ_VAL1)) 19925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 19935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Increment the Byte Number */ 19945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.ByteNumber++; 19955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check the block and byte number */ 19965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Tpz_H_BlkChk(NdefMap); 19975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Process the T of NDEF TLV */ 19985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_TOPAZ_STATE_WRITE_NMN; 19995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 20005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Here the NMN is written 0, so internal state is used */ 20015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TopazContainer.InternalState = PH_FRINFC_TOPAZ_WR_NMN_0; 20025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 20035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Inside this call Write NMN (block number 1 and byte number 0) = 0 */ 20045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Tpz_H_WrAByte( NdefMap, PH_FRINFC_TOPAZ_VAL1, 20055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_TOPAZ_VAL0,PH_FRINFC_TOPAZ_VAL0); 20065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 20075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 20085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 20095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Result; 20105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 20115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 20125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef UNIT_TEST 20135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phUnitTestNfc_Topaz_static.c> 20145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 20155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 20165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_TOPAZ_DISABLED */ 2017