diff options
Diffstat (limited to 'src/phFriNfc_TopazDynamicMap.c')
-rw-r--r-- | src/phFriNfc_TopazDynamicMap.c | 518 |
1 files changed, 500 insertions, 18 deletions
diff --git a/src/phFriNfc_TopazDynamicMap.c b/src/phFriNfc_TopazDynamicMap.c index dc99a43..697604d 100644 --- a/src/phFriNfc_TopazDynamicMap.c +++ b/src/phFriNfc_TopazDynamicMap.c @@ -20,10 +20,10 @@ * * Project: NFC-FRI * -* $Date: Tue Jun 8 17:19:18 2010 $ +* $Date: Wed Oct 27 10:21:29 2010 $ * $Author: ing02260 $ -* $Revision: 1.38 $ -* $Aliases: NFC_FRI1.1_WK1023_R35_1 $ +* $Revision: 1.41 $ +* $Aliases: $ * */ @@ -43,8 +43,8 @@ * */ /*@{*/ -#define PHFRINFCTOPAZMAP_FILEREVISION "$Revision: 1.38 $" -#define PHFRINFCTOPAZMAP_FILEALIASES "$Aliases: NFC_FRI1.1_WK1023_R35_1 $" +#define PHFRINFCTOPAZMAP_FILEREVISION "$Revision: 1.41 $" +#define PHFRINFCTOPAZMAP_FILEALIASES "$Aliases: $" /*@}*/ /*! * \name Topaz Mapping - Helper data structures and macros @@ -53,7 +53,21 @@ /*@{*/ /********************************** Start of data structures *********************************/ +#ifdef FRINFC_READONLY_NDEF + #define DYN_CC_BLOCK_NUMBER (0x01U) + #define DYN_STATIC_LOCK_BLOCK_NUM (0x0EU) + + #define DYN_STATIC_LOCK0_BYTE_NUM (0x00U) + #define DYN_STATIC_LOCK0_BYTE_VALUE (0xFFU) + + #define DYN_STATIC_LOCK1_BYTE_NUM (0x01U) + #define DYN_STATIC_LOCK1_BYTE_VALUE (0x7FU) + + #define DYN_CC_RWA_BYTE_NUMBER (0x03U) + #define DYN_CC_READ_ONLY_VALUE (0x0FU) + +#endif /* #ifdef FRINFC_READONLY_NDEF */ /*! * \brief \copydoc page_ovr enum for the topaz sequence of execution. @@ -86,12 +100,30 @@ typedef enum phFriNfc_Tpz_WrSeq WR_NMN_E1 }phFriNfc_Tpz_WrSeq_t; +#ifdef FRINFC_READONLY_NDEF + +typedef enum phFriNfc_Tpz_RO_Seq +{ + WR_READONLY_CC, + RD_LOCK_BYTES, + WR_LOCK_BYTES, + RD_STATIC_LOCK_BYTE0, + WR_STATIC_LOCK_BYTE0, + WR_STATIC_LOCK_BYTE1 +}phFriNfc_Tpz_RO_Seq_t; + +#endif /* #ifdef FRINFC_READONLY_NDEF */ + /********************************** End of data structures *********************************/ /********************************** Start of Macros *********************************/ /* New state for TOPAZ dynamic card*/ #define PH_FRINFC_TOPAZ_STATE_RD_FOR_WR_NDEF (0x10U) +#ifdef FRINFC_READONLY_NDEF + #define PH_FRINFC_TOPAZ_STATE_READ_ONLY (0x11U) +#endif /* #ifdef FRINFC_READONLY_NDEF */ + #define NIBBLE_SIZE (0x04U) /* Byte shifting for the topaz */ #define TOPAZ_BYTE_SHIFT (0x08U) @@ -110,7 +142,7 @@ typedef enum phFriNfc_Tpz_WrSeq /* First lock or reserved byte number in the static area of the card */ #define TOPAZ_STATIC_LOCK_RES_START (0x68U) /* End lock or reserved byte number in the static area of the card */ -#define TOPAZ_STATIC_LOCK_RES_END (0x80U) +#define TOPAZ_STATIC_LOCK_RES_END (0x78U) /* CC byte length */ #define TOPAZ_CC_BYTES_LENGTH (0x04U) @@ -168,6 +200,14 @@ so there are 4 segements in the card */ (((block_no) + 1) + TOPAZ_STATIC_LOCK_BLOCK_AREAS) : \ ((block_no) + 1)) +#ifdef FRINFC_READONLY_NDEF + +#define TOPAZ_CONVERT_BITS_TO_BYTES(bits_to_bytes) \ + (((bits_to_bytes % TOPAZ_BYTE_SIZE_IN_BITS) > 0) ? \ + ((bits_to_bytes / TOPAZ_BYTE_SIZE_IN_BITS) + 1) : \ + (bits_to_bytes / TOPAZ_BYTE_SIZE_IN_BITS)) + +#endif /* #ifdef FRINFC_READONLY_NDEF */ /********************************** End of Macros *********************************/ /*@}*/ @@ -489,6 +529,21 @@ NFCSTATUS phFriNfc_Tpz_H_UpdateNdefTypeField ( phFriNfc_NdefMap_t *psNdefMap); +#ifdef FRINFC_READONLY_NDEF + +static +NFCSTATUS +phFriNfc_Tpz_H_ProcessReadOnly ( + phFriNfc_NdefMap_t *psNdefMap); + +static +NFCSTATUS +phFriNfc_Tpz_H_UpdateAndWriteLockBits ( + phFriNfc_NdefMap_t *psNdefMap); + + +#endif /* #ifdef FRINFC_READONLY_NDEF */ + /*! * \brief Check whether a particular Remote Device is NDEF compliant. @@ -522,6 +577,12 @@ NFCSTATUS phFriNfc_TopazDynamicMap_ChkNdef( phFriNfc_NdefMap_t *NdefMap) NdefMap->TopazContainer.WriteSeq = 0; NdefMap->TopazContainer.ExpectedSeq = 0; + (void)memset ((void *)&(NdefMap->LockTlv), 0, + sizeof (phFriNfc_LockCntrlTLVCont_t)); + + (void)memset ((void *)&(NdefMap->MemTlv), 0, + sizeof (phFriNfc_ResMemCntrlTLVCont_t)); + /* Set card state */ NdefMap->CardType = PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD; @@ -649,6 +710,44 @@ NFCSTATUS phFriNfc_TopazDynamicMap_RdNdef( phFriNfc_NdefMap_t *NdefMap return Result; } +#ifdef FRINFC_READONLY_NDEF + +NFCSTATUS +phFriNfc_TopazDynamicMap_ConvertToReadOnly ( + phFriNfc_NdefMap_t *psNdefMap) +{ + NFCSTATUS result = NFCSTATUS_SUCCESS; + uint8_t cc_read_only_byte = 0x0FU; + + psNdefMap->State = PH_FRINFC_TOPAZ_STATE_READ_ONLY; + + psNdefMap->TopazContainer.read_only_seq = 0; + + + + psNdefMap->TopazContainer.CurrentBlock = 0x01U; + psNdefMap->TopazContainer.ByteNumber = 0x03U; + +#ifdef TOPAZ_RAW_SUPPORT + *psNdefMap->SendRecvBuf = (uint8_t)PH_FRINFC_TOPAZ_CMD_WRITE_1E; +#else + psNdefMap->Cmd.JewelCmd = phHal_eJewel_Write1E; +#endif /* #ifdef TOPAZ_RAW_SUPPORT */ + + result = phFriNfc_Tpz_H_NxpWrite (psNdefMap, &cc_read_only_byte, + 1); + + if (NFCSTATUS_PENDING == result) + { + psNdefMap->TopazContainer.read_only_seq = (uint8_t)WR_READONLY_CC; + } + + + return result; +} + +#endif /* #ifdef FRINFC_READONLY_NDEF */ + /*! * \brief Initiates Writing of NDEF information to the Remote Device. * @@ -793,6 +892,14 @@ void phFriNfc_TopazDynamicMap_Process( void *Context, Status = phFriNfc_Tpz_H_ChkReadID(NdefMap); break; } + +#ifdef FRINFC_READONLY_NDEF + case PH_FRINFC_TOPAZ_STATE_READ_ONLY: + { + Status = phFriNfc_Tpz_H_ProcessReadOnly (NdefMap); + break; + } +#endif /* #ifdef FRINFC_READONLY_NDEF */ default: { @@ -810,6 +917,364 @@ void phFriNfc_TopazDynamicMap_Process( void *Context, } } +#ifdef FRINFC_READONLY_NDEF + +static +NFCSTATUS +phFriNfc_Tpz_H_UpdateAndWriteLockBits ( + phFriNfc_NdefMap_t *psNdefMap) +{ + NFCSTATUS result = NFCSTATUS_SUCCESS; + phFriNfc_TopazCont_t *ps_tpz_info = NULL; + phFriNfc_LockCntrlTLVCont_t *ps_locktlv_info = NULL; + uint8_t remaining_lock_bits = 0; + uint8_t byte_index = 0; + uint8_t lock_bytes_value[TOPAZ_BYTES_PER_BLOCK] = {0}; + uint8_t lock_byte_index = 0; + uint8_t no_of_bits_left_in_block = 0; + + ps_tpz_info = &(psNdefMap->TopazContainer); + ps_locktlv_info = &(psNdefMap->LockTlv); + + (void)memcpy ((void *)lock_bytes_value, (void *)psNdefMap->SendRecvBuf, + TOPAZ_BYTES_PER_BLOCK); + + if (ps_tpz_info->CurrentBlock == ps_locktlv_info->BlkNum) + { + /* Get the lock bits that has to locked */ + remaining_lock_bits = ps_locktlv_info->LockTlvBuff[1]; + byte_index = (uint8_t)ps_locktlv_info->ByteNum; + } + else + { + /* This condition applies only for the lock bits not ending with + " ps_locktlv_info->BlkNum ". + Calculate the remaining lock bits */ + remaining_lock_bits = (uint8_t)(ps_locktlv_info->LockTlvBuff[1] - + ps_tpz_info->lock_bytes_written); + } + + no_of_bits_left_in_block = (uint8_t)((TOPAZ_BYTES_PER_BLOCK - byte_index) * + TOPAZ_BYTE_SIZE_IN_BITS); + + if (no_of_bits_left_in_block >= remaining_lock_bits) + { + /* Entire lock bits can be written */ + uint8_t mod_value = 0; + + mod_value = (uint8_t)(remaining_lock_bits % TOPAZ_BYTES_PER_BLOCK); + + if (mod_value) + { + /* The lock bits ends in between of a byte */ + /* lock bits to write is greater than 8 bits */ + if (mod_value > TOPAZ_BYTE_SIZE_IN_BITS) + { + while (lock_byte_index < + (TOPAZ_CONVERT_BITS_TO_BYTES(remaining_lock_bits) - 1)) + { + /* Set 1b to all bits left in the block */ + lock_bytes_value[byte_index] = 0xFF; + lock_byte_index = (uint8_t)(lock_byte_index + 1); + byte_index = (uint8_t)(byte_index + 1); + } + /* Last byte of the lock bits shall be filled partially, + Set only the remaining lock bits and dont change + the other bit value */ + lock_bytes_value[byte_index] = 0; + lock_bytes_value[byte_index] = (uint8_t) + SET_BITS8 (lock_bytes_value[byte_index], 0, + mod_value, 1); + } + else + { + /* lock bits to write is less than 8 bits, so + there is only one byte to write. + Set only the remaining lock bits and dont change + the other bit value */ + lock_bytes_value[0] = (uint8_t) + SET_BITS8 (lock_bytes_value[0], 0, + mod_value, 1); + } + } /* if (mod_value) */ + else + { + /* The lock bits exactly ends at a byte + MOD operation is 00, that means entire byte value shall be 0xFF, means + every bit shall be to 1 */ + + while (lock_byte_index < TOPAZ_CONVERT_BITS_TO_BYTES(remaining_lock_bits)) + { + /* Set 1b to all bits left in the block */ + lock_bytes_value[byte_index] = 0xFF; + lock_byte_index = (uint8_t)(lock_byte_index + 1); + byte_index = (uint8_t)(byte_index + 1); + } + } /* else of /* if (mod_value) */ + ps_tpz_info->lock_bytes_written = remaining_lock_bits; + } + else /* if (no_of_bits_left_in_block >= remaining_lock_bits) */ + { + /* Partial lock bits can be written. use next read to write + the remaining lock bits */ + while (lock_byte_index < (no_of_bits_left_in_block / + TOPAZ_BYTES_PER_BLOCK)) + { + /* Set 1b to all bits left in the block */ + lock_bytes_value[byte_index] = 0xFF; + lock_byte_index = (uint8_t)(lock_byte_index + 1); + byte_index = (uint8_t)(byte_index + 1); + } + ps_tpz_info->lock_bytes_written = (uint8_t)(no_of_bits_left_in_block / + TOPAZ_BYTES_PER_BLOCK); + } /* else of if (no_of_bits_left_in_block >= remaining_lock_bits) */ + +#ifdef TOPAZ_RAW_SUPPORT + *psNdefMap->SendRecvBuf = PH_FRINFC_TOPAZ_CMD_WRITE_E8; +#else + psNdefMap->Cmd.JewelCmd = phHal_eJewel_Write8E; +#endif /* #ifdef TOPAZ_RAW_SUPPORT */ + + result = phFriNfc_Tpz_H_NxpWrite (psNdefMap, lock_bytes_value, + sizeof (lock_bytes_value)); + return result; +} + +static +NFCSTATUS +phFriNfc_Tpz_H_ProcessReadOnly ( + phFriNfc_NdefMap_t *psNdefMap) +{ + NFCSTATUS result = NFCSTATUS_SUCCESS; + phFriNfc_Tpz_RO_Seq_t e_readonly_seq = RD_LOCK_BYTES; + phFriNfc_TopazCont_t *ps_tpz_info = NULL; + phFriNfc_LockCntrlTLVCont_t *ps_locktlv_info = NULL; + static uint8_t static_lock_bytes[2] = {0}; + + ps_tpz_info = &(psNdefMap->TopazContainer); + ps_locktlv_info = &(psNdefMap->LockTlv); + e_readonly_seq = (phFriNfc_Tpz_RO_Seq_t)psNdefMap->TopazContainer.read_only_seq; + + switch (e_readonly_seq) + { + case WR_READONLY_CC: + { + if (TOPAZ_WRITE_1_RESPONSE == *psNdefMap->SendRecvLength) + { + psNdefMap->TopazContainer.CurrentBlock = (uint8_t) + psNdefMap->LockTlv.BlkNum; + + e_readonly_seq = RD_LOCK_BYTES; +#ifdef TOPAZ_RAW_SUPPORT + + *psNdefMap->SendRecvBuf = PH_FRINFC_TOPAZ_CMD_READ8; + +#else + + /* Topaz command = Jewel Nxp Read */ +#ifdef PH_HAL4_ENABLE + psNdefMap->Cmd.JewelCmd = phHal_eJewel_Read; +#else + psNdefMap->Cmd.JewelCmd = phHal_eJewelCmdListJewelRead; +#endif + + psNdefMap->Cmd.JewelCmd = phHal_eJewel_Read8; + +#endif /* #ifdef TOPAZ_RAW_SUPPORT */ + /* Call read segment */ + result = phFriNfc_Tpz_H_NxpRead (psNdefMap); + } + else + { + result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, + NFCSTATUS_INVALID_RECEIVE_LENGTH); + } + break; + } + + case RD_LOCK_BYTES: + { + if (TOPAZ_READ_8_RESPONSE == *psNdefMap->SendRecvLength) + { + result = phFriNfc_Tpz_H_UpdateAndWriteLockBits (psNdefMap); + + if (NFCSTATUS_PENDING == result) + { + e_readonly_seq = WR_LOCK_BYTES; + } + } + else + { + result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, + NFCSTATUS_INVALID_RECEIVE_LENGTH); + } + break; + } + + case WR_LOCK_BYTES: + { + if (TOPAZ_WRITE_8_RESPONSE == *psNdefMap->SendRecvLength) + { + ps_tpz_info->CurrentBlock = (uint8_t) + (ps_tpz_info->CurrentBlock + 1); + if (ps_locktlv_info->LockTlvBuff[1] - + ps_tpz_info->lock_bytes_written) + { +#ifdef TOPAZ_RAW_SUPPORT + + *psNdefMap->SendRecvBuf = PH_FRINFC_TOPAZ_CMD_READ8; + +#else + + /* Topaz command = Jewel Nxp Read */ +#ifdef PH_HAL4_ENABLE + psNdefMap->Cmd.JewelCmd = phHal_eJewel_Read; +#else + psNdefMap->Cmd.JewelCmd = phHal_eJewelCmdListJewelRead; +#endif + + psNdefMap->Cmd.JewelCmd = phHal_eJewel_Read8; + +#endif /* #ifdef TOPAZ_RAW_SUPPORT */ + /* Call read segment */ + result = phFriNfc_Tpz_H_NxpRead (psNdefMap); + e_readonly_seq = RD_LOCK_BYTES; + } + else + { + ps_tpz_info->CurrentBlock = (uint8_t) + DYN_STATIC_LOCK_BLOCK_NUM; + ps_tpz_info->ByteNumber = (uint8_t) + DYN_STATIC_LOCK0_BYTE_NUM; +#ifdef TOPAZ_RAW_SUPPORT + + *psNdefMap->SendRecvBuf = (uint8_t)PH_FRINFC_TOPAZ_CMD_READ8; + +#else + + /* Topaz command = Jewel Nxp Read */ +#ifdef PH_HAL4_ENABLE + psNdefMap->Cmd.JewelCmd = phHal_eJewel_Read; +#else + psNdefMap->Cmd.JewelCmd = phHal_eJewelCmdListJewelRead; +#endif + + psNdefMap->Cmd.JewelCmd = phHal_eJewel_Read8; + +#endif /* #ifdef TOPAZ_RAW_SUPPORT */ + /* Call read segment */ + result = phFriNfc_Tpz_H_NxpRead (psNdefMap); + e_readonly_seq = RD_STATIC_LOCK_BYTE0; + + } + } + else + { + result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, + NFCSTATUS_INVALID_RECEIVE_LENGTH); + } + break; + } + + case RD_STATIC_LOCK_BYTE0: + { + if (TOPAZ_READ_8_RESPONSE == *psNdefMap->SendRecvLength) + { + uint8_t lock_byte_value = 0; + + (void)memcpy ((void *)static_lock_bytes, + (void *)(psNdefMap->SendRecvBuf + + ps_tpz_info->ByteNumber), + sizeof (static_lock_bytes)); + + + lock_byte_value = (uint8_t)(static_lock_bytes[0] | + DYN_STATIC_LOCK0_BYTE_VALUE); + +#ifdef TOPAZ_RAW_SUPPORT + *psNdefMap->SendRecvBuf = (uint8_t)PH_FRINFC_TOPAZ_CMD_WRITE_1E; +#else + psNdefMap->Cmd.JewelCmd = phHal_eJewel_Write1E; +#endif /* #ifdef TOPAZ_RAW_SUPPORT */ + + result = phFriNfc_Tpz_H_NxpWrite (psNdefMap, &lock_byte_value, + 1); + + if (NFCSTATUS_PENDING == result) + { + e_readonly_seq = (uint8_t)WR_STATIC_LOCK_BYTE0; + } + } + else + { + result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, + NFCSTATUS_INVALID_RECEIVE_LENGTH); + } + break; + } + + case WR_STATIC_LOCK_BYTE0: + { + if (TOPAZ_WRITE_1_RESPONSE == *psNdefMap->SendRecvLength) + { + uint8_t lock_byte_value = + (static_lock_bytes[1] | + DYN_STATIC_LOCK1_BYTE_VALUE); + + ps_tpz_info->CurrentBlock = (uint8_t) + DYN_STATIC_LOCK_BLOCK_NUM; + ps_tpz_info->ByteNumber = (uint8_t) + DYN_STATIC_LOCK1_BYTE_NUM; +#ifdef TOPAZ_RAW_SUPPORT + *psNdefMap->SendRecvBuf = (uint8_t)PH_FRINFC_TOPAZ_CMD_WRITE_1E; +#else + psNdefMap->Cmd.JewelCmd = phHal_eJewel_Write1E; +#endif /* #ifdef TOPAZ_RAW_SUPPORT */ + + result = phFriNfc_Tpz_H_NxpWrite (psNdefMap, &lock_byte_value, + 1); + + if (NFCSTATUS_PENDING == result) + { + e_readonly_seq = (uint8_t)WR_STATIC_LOCK_BYTE1; + } + } + else + { + result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, + NFCSTATUS_INVALID_RECEIVE_LENGTH); + } + break; + } + + case WR_STATIC_LOCK_BYTE1: + { + if (TOPAZ_WRITE_1_RESPONSE == *psNdefMap->SendRecvLength) + { + /* READ ONLY successful */ + } + else + { + result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, + NFCSTATUS_INVALID_RECEIVE_LENGTH); + } + break; + } + + default: + { + result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, + NFCSTATUS_INVALID_RECEIVE_LENGTH); + break; + } + } + + psNdefMap->TopazContainer.read_only_seq = (uint8_t)e_readonly_seq; + return result; +} + +#endif /* #ifdef FRINFC_READONLY_NDEF */ + static NFCSTATUS phFriNfc_Tpz_H_ProWrResp ( @@ -1278,7 +1743,7 @@ phFriNfc_Tpz_H_ChkReadID( compare_result = phOsalNfc_MemCompare ( psNdefMap->psRemoteDevInfo->RemoteDevInfo.Jewel_Info.Uid, &psNdefMap->SendRecvBuf[PH_FRINFC_TOPAZ_VAL2], - psNdefMap->psRemoteDevInfo->RemoteDevInfo.Jewel_Info.UidLength); + TOPAZ_UID_LENGTH_FOR_READ_WRITE); if (0 == compare_result) { /* State has to be changed */ @@ -1449,9 +1914,9 @@ phFriNfc_Tpz_H_NxpRead ( (void)memcpy ((void *)(psNdefMap->SendRecvBuf + send_index), (void *)psNdefMap->psRemoteDevInfo->RemoteDevInfo.Jewel_Info.Uid, - psNdefMap->psRemoteDevInfo->RemoteDevInfo.Jewel_Info.UidLength); + TOPAZ_UID_LENGTH_FOR_READ_WRITE); send_index = (uint8_t)(send_index + - psNdefMap->psRemoteDevInfo->RemoteDevInfo.Jewel_Info.UidLength); + TOPAZ_UID_LENGTH_FOR_READ_WRITE); } psNdefMap->SendLength = send_index; @@ -1570,9 +2035,8 @@ phFriNfc_Tpz_H_NxpWrite( (void)memcpy ((void *)(psNdefMap->SendRecvBuf + send_index), (void *)psNdefMap->psRemoteDevInfo->RemoteDevInfo.Jewel_Info.Uid, - psNdefMap->psRemoteDevInfo->RemoteDevInfo.Jewel_Info.UidLength); - send_index = (uint8_t)(send_index + - psNdefMap->psRemoteDevInfo->RemoteDevInfo.Jewel_Info.UidLength); + TOPAZ_UID_LENGTH_FOR_READ_WRITE); + send_index = (uint8_t)(send_index + TOPAZ_UID_LENGTH_FOR_READ_WRITE); #endif /* #ifdef TOPAZ_RAW_SUPPORT */ @@ -2128,9 +2592,9 @@ phFriNfc_Tpz_H_CopyReadData ( phFriNfc_Tpz_H_GetNDEFValueFieldAddrForRead (psNdefMap)) == ps_tpz_info->CurrentSeg) { - copy_index = (uint16_t)( + copy_index = (uint16_t)(copy_index + ( phFriNfc_Tpz_H_GetNDEFValueFieldAddrForRead ( - psNdefMap) % TOPAZ_SEGMENT_READ_LENGTH); + psNdefMap) % TOPAZ_SEGMENT_READ_LENGTH)); skip_size = 0; } @@ -2159,7 +2623,11 @@ phFriNfc_Tpz_H_CopyReadData ( <= ps_locktlv_info->ByteAddr) ) { - copy_till_address = ps_locktlv_info->ByteAddr; + if ((ps_locktlv_info->ByteAddr < TOPAZ_STATIC_LOCK_RES_START) || + (ps_locktlv_info->ByteAddr >= (TOPAZ_STATIC_LOCK_RES_END + 8))) + { + copy_till_address = ps_locktlv_info->ByteAddr; + } skip_size = phFriNfc_Tpz_H_GetSkipSize (psNdefMap, ps_locktlv_info->ByteAddr); } @@ -2179,10 +2647,14 @@ phFriNfc_Tpz_H_CopyReadData ( <= ps_memtlv_info->ByteAddr) ) { - copy_till_address = (uint16_t) + if ((ps_memtlv_info->ByteAddr < TOPAZ_STATIC_LOCK_RES_START) || + (ps_memtlv_info->ByteAddr >= (TOPAZ_STATIC_LOCK_RES_END + 8))) + { + copy_till_address = (uint16_t) (((ps_memtlv_info->ByteAddr < copy_till_address) || (0 == copy_till_address))? ps_memtlv_info->ByteAddr : copy_till_address); + } if (copy_till_address == ps_memtlv_info->ByteAddr) { @@ -2286,6 +2758,11 @@ phFriNfc_Tpz_H_CopyReadData ( } } + if (copy_index != copy_till_address) + { + skip_size = 0; + } + if ((copy_index + skip_size) <= recv_length) { copy_index = (uint16_t)(copy_index + skip_size); @@ -2455,6 +2932,10 @@ phFriNfc_Tpz_H_ParseTLVs ( /* All the 3 bytes are copied in the local buffer */ if (TOPAZ_MEM_LOCK_TLV_LENGTH == lock_mem_ndef_index) { +#ifdef FRINFC_READONLY_NDEF + (void)memcpy ((void *)psNdefMap->LockTlv.LockTlvBuff, + (void *)lock_mem_buf, sizeof (lock_mem_buf)); +#endif /* #ifdef FRINFC_READONLY_NDEF */ /* Calculate the byte address and size of the lock bytes */ result = phFriNfc_Tpz_H_GetLockBytesInfo (psNdefMap, lock_mem_buf); lock_mem_ndef_index = 0; @@ -2712,6 +3193,7 @@ phFriNfc_Tpz_H_ParseTLVs ( ps_tpz_info->NDEFRWSize = (uint16_t) (ps_tpz_info->NDEFRWSize - 2); ndef_tlv_byte_addr = 0; + result = NFCSTATUS_SUCCESS; } } } @@ -3683,7 +4165,7 @@ phFriNfc_Tpz_H_GetLockBytesInfo ( ByteAddr = PageAddr*2^BytesPerPage + ByteOffset */ ps_locktlv_info->ByteAddr = (uint16_t)((page_address - * (2 << ps_locktlv_info->BytesPerPage)) + * (1 << ps_locktlv_info->BytesPerPage)) + bytes_offset); @@ -3746,7 +4228,7 @@ phFriNfc_Tpz_H_GetMemBytesInfo ( ByteAddr = PageAddr * 2^BytesPerPage + ByteOffset */ ps_memtlv_info->ByteAddr = (uint16_t)((page_address - * (2 << ps_memtlv_info->BytesPerPage)) + * (1 << ps_memtlv_info->BytesPerPage)) + bytes_offset); |