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