summaryrefslogtreecommitdiffstats
path: root/src/phFriNfc_TopazMap.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/phFriNfc_TopazMap.c')
-rw-r--r--src/phFriNfc_TopazMap.c120
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:
{