diff options
Diffstat (limited to 'src/phFriNfc_TopazMap.c')
-rw-r--r-- | src/phFriNfc_TopazMap.c | 120 |
1 files changed, 112 insertions, 8 deletions
diff --git a/src/phFriNfc_TopazMap.c b/src/phFriNfc_TopazMap.c index ff445cb..78828ec 100644 --- a/src/phFriNfc_TopazMap.c +++ b/src/phFriNfc_TopazMap.c @@ -20,10 +20,10 @@ * * Project: NFC-FRI * -* $Date: Wed May 12 10:21:17 2010 $ +* $Date: Mon Dec 13 14:14:14 2010 $ * $Author: ing02260 $ -* $Revision: 1.21 $ -* $Aliases: NFC_FRI1.1_WK1019_SDK,NFC_FRI1.1_WK1023_R35_1 $ +* $Revision: 1.23 $ +* $Aliases: $ * */ @@ -42,8 +42,8 @@ * */ /*@{*/ -#define PHFRINFCTOPAZMAP_FILEREVISION "$Revision: 1.21 $" -#define PHFRINFCTOPAZMAP_FILEALIASES "$Aliases: NFC_FRI1.1_WK1019_SDK,NFC_FRI1.1_WK1023_R35_1 $" +#define PHFRINFCTOPAZMAP_FILEREVISION "$Revision: 1.23 $" +#define PHFRINFCTOPAZMAP_FILEALIASES "$Aliases: $" /*@}*/ /****************** Start of macros ********************/ /* Below MACRO is used for the WRITE error scenario, @@ -56,6 +56,14 @@ #ifdef FRINFC_READONLY_NDEF #define CC_BLOCK_NUMBER (0x01U) + #define LOCK_BLOCK_NUMBER (0x0EU) + + #define LOCK0_BYTE_NUMBER (0x00U) + #define LOCK0_BYTE_VALUE (0xFFU) + + #define LOCK1_BYTE_NUMBER (0x01U) + #define LOCK1_BYTE_VALUE (0x7FU) + #define CC_RWA_BYTE_NUMBER (0x03U) #define CC_READ_ONLY_VALUE (0x0FU) @@ -298,7 +306,7 @@ phFriNfc_TopazMap_ConvertToReadOnly ( if (NFCSTATUS_PENDING == PHNFCSTATUS(result)) { - NdefMap->State = PH_FRINFC_TOPAZ_STATE_READ_ONLY; + NdefMap->State = PH_FRINFC_TOPAZ_STATE_WR_CC_BYTE; } return result; } @@ -502,6 +510,9 @@ void phFriNfc_TopazMap_Process( void *Context, static uint8_t rf_error_state = 0; #endif /* #ifdef TOPAZ_RF_ERROR_WORKAROUND */ +#ifdef FRINFC_READONLY_NDEF + static uint8_t written_lock_byte = 0; +#endif /* #ifdef FRINFC_READONLY_NDEF */ psNdefMap = (phFriNfc_NdefMap_t *)Context; @@ -510,12 +521,27 @@ void phFriNfc_TopazMap_Process( void *Context, switch (psNdefMap->State) { #ifdef FRINFC_READONLY_NDEF - case PH_FRINFC_TOPAZ_STATE_READ_ONLY: + case PH_FRINFC_TOPAZ_STATE_WR_CC_BYTE: { if((CC_READ_ONLY_VALUE == *psNdefMap->SendRecvBuf) && (PH_FRINFC_TOPAZ_VAL1 == *psNdefMap->SendRecvLength)) { - /* Do nothing */ +#ifdef TOPAZ_RAW_SUPPORT + *psNdefMap->SendRecvBuf = PH_FRINFC_TOPAZ_CMD_READ; +#else +#ifdef PH_HAL4_ENABLE + psNdefMap->Cmd.JewelCmd = phHal_eJewel_Read1; +#else + psNdefMap->Cmd.JewelCmd = phHal_eJewelCmdListJewelRead1; +#endif /* #ifdef PH_HAL4_ENABLE */ +#endif /* #ifdef TOPAZ_RAW_SUPPORT */ + Status = phFriNfc_Tpz_H_RdBytes (psNdefMap, LOCK_BLOCK_NUMBER, + LOCK0_BYTE_NUMBER); + + if (NFCSTATUS_PENDING == PHNFCSTATUS(Status)) + { + psNdefMap->State = PH_FRINFC_TOPAZ_STATE_RD_LOCK0_BYTE; + } } else { @@ -524,6 +550,84 @@ void phFriNfc_TopazMap_Process( void *Context, } break; } + + case PH_FRINFC_TOPAZ_STATE_RD_LOCK0_BYTE: + { + if (PH_FRINFC_TOPAZ_VAL1 == *psNdefMap->SendRecvLength) + { + Status = phFriNfc_Tpz_H_WrAByte (psNdefMap, LOCK_BLOCK_NUMBER, + LOCK0_BYTE_NUMBER, + LOCK0_BYTE_VALUE); + + if (NFCSTATUS_PENDING == PHNFCSTATUS(Status)) + { + psNdefMap->State = PH_FRINFC_TOPAZ_STATE_WR_LOCK0_BYTE; + } + } + break; + } + + case PH_FRINFC_TOPAZ_STATE_WR_LOCK0_BYTE: + { + if((LOCK0_BYTE_VALUE == *psNdefMap->SendRecvBuf) + && (PH_FRINFC_TOPAZ_VAL1 == *psNdefMap->SendRecvLength)) + { +#ifdef TOPAZ_RAW_SUPPORT + *psNdefMap->SendRecvBuf = PH_FRINFC_TOPAZ_CMD_READ; +#else +#ifdef PH_HAL4_ENABLE + psNdefMap->Cmd.JewelCmd = phHal_eJewel_Read1; +#else + psNdefMap->Cmd.JewelCmd = phHal_eJewelCmdListJewelRead1; +#endif /* #ifdef PH_HAL4_ENABLE */ +#endif /* #ifdef TOPAZ_RAW_SUPPORT */ + Status = phFriNfc_Tpz_H_RdBytes (psNdefMap, LOCK_BLOCK_NUMBER, + LOCK1_BYTE_NUMBER); + + if (NFCSTATUS_PENDING == PHNFCSTATUS(Status)) + { + psNdefMap->State = PH_FRINFC_TOPAZ_STATE_RD_LOCK1_BYTE; + } + } + else + { + Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, + NFCSTATUS_INVALID_RECEIVE_LENGTH); + } + } + + case PH_FRINFC_TOPAZ_STATE_RD_LOCK1_BYTE: + { + if (PH_FRINFC_TOPAZ_VAL1 == *psNdefMap->SendRecvLength) + { + written_lock_byte = (uint8_t)(*psNdefMap->SendRecvBuf | LOCK1_BYTE_VALUE); + Status = phFriNfc_Tpz_H_WrAByte (psNdefMap, LOCK_BLOCK_NUMBER, + LOCK1_BYTE_NUMBER, + written_lock_byte); + + if (NFCSTATUS_PENDING == PHNFCSTATUS(Status)) + { + psNdefMap->State = PH_FRINFC_TOPAZ_STATE_WR_LOCK1_BYTE; + } + } + break; + } + + case PH_FRINFC_TOPAZ_STATE_WR_LOCK1_BYTE: + { + if((written_lock_byte == *psNdefMap->SendRecvBuf) + && (PH_FRINFC_TOPAZ_VAL1 == *psNdefMap->SendRecvLength)) + { + written_lock_byte = 0; + /* Do nothing */ + } + else + { + written_lock_byte = 0; + Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, + NFCSTATUS_INVALID_RECEIVE_LENGTH); + } + } #endif /* #ifdef FRINFC_READONLY_NDEF */ case PH_FRINFC_TOPAZ_STATE_WRITE: { |