reset back to latest, and keep history
diff --git a/Android.mk b/Android.mk
index 0557a87..8f64cba 100644
--- a/Android.mk
+++ b/Android.mk
@@ -105,7 +105,11 @@
LOCAL_SRC_FILES += Linux_x86/phDal4Nfc_i2c.c
LOCAL_SRC_FILES += Linux_x86/phDal4Nfc_messageQueueLib.c
+# Really verbose:
#LOCAL_CFLAGS += -DNXP_MESSAGING -DANDROID -DDEBUG -DDAL_TRACE -DINCLUDE_DALINIT_DEINIT -pipe -fomit-frame-pointer -Wall -Wno-trigraphs -Werror-implicit-function-declaration -fno-strict-aliasing -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -msoft-float -Uarm -fno-common -fpic
+# Just show I2C traffic:
+#LOCAL_CFLAGS += -DNXP_MESSAGING -DANDROID -DINCLUDE_DALINIT_DEINIT -DLOW_LEVEL_TRACES -pipe -fomit-frame-pointer -Wall -Wno-trigraphs -Werror-implicit-function-declaration -fno-strict-aliasing -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -msoft-float -Uarm -fno-common -fpic
+# Quiet:
LOCAL_CFLAGS += -DNXP_MESSAGING -DANDROID -DINCLUDE_DALINIT_DEINIT -pipe -fomit-frame-pointer -Wall -Wno-trigraphs -Werror-implicit-function-declaration -fno-strict-aliasing -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -msoft-float -Uarm -fno-common -fpic
ifeq ($(NFC_BUILD_VARIANT),debug)
diff --git a/Linux_x86/phDal4Nfc.c b/Linux_x86/phDal4Nfc.c
index 1222525..6d3c9fb 100644
--- a/Linux_x86/phDal4Nfc.c
+++ b/Linux_x86/phDal4Nfc.c
@@ -30,6 +30,7 @@
#include <unistd.h>
#include <pthread.h>
+#include <stdlib.h>
#ifdef ANDROID
#include <linux/ipc.h>
#else
@@ -660,6 +661,7 @@
phDal4Nfc_Message_t sMsg;
phOsalNfc_Message_t OsalMsg ;
int i;
+ int i2c_error_count;
pthread_setname_np(pthread_self(), "reader");
@@ -676,13 +678,38 @@
sem_wait(&nfc_read_sem);
DAL_PRINT("RX Thread Sem UnLock\n");
/* Issue read operation.*/
+
+ i2c_error_count = 0;
+retry:
gReadWriteContext.nNbOfBytesRead=0;
DAL_DEBUG("\n*New *** *****Request Length = %d",gReadWriteContext.nNbOfBytesToRead);
memsetRet=memset(gReadWriteContext.pReadBuffer,0,gReadWriteContext.nNbOfBytesToRead);
/* Wait for IRQ !!! */
- gReadWriteContext.nNbOfBytesRead = gLinkFunc.read(gReadWriteContext.pReadBuffer, gReadWriteContext.nNbOfBytesToRead);
-
+ gReadWriteContext.nNbOfBytesRead = gLinkFunc.read(gReadWriteContext.pReadBuffer, gReadWriteContext.nNbOfBytesToRead);
+
+ /* TODO: Remove this hack
+ * Reading the value 0x57 indicates a HW I2C error at I2C address 0x57
+ * (pn544). There should not be false positives because a read of length 1
+ * must be a HCI length read, and a length of 0x57 is impossible (max is 33).
+ */
+ if(gReadWriteContext.nNbOfBytesToRead == 1 && gReadWriteContext.pReadBuffer[0] == 0x57)
+ {
+ i2c_error_count++;
+ DAL_DEBUG("Read 0x57 %d times\n", i2c_error_count);
+ if (i2c_error_count < 5) {
+ usleep(2000);
+ goto retry;
+ }
+ DAL_PRINT("NOTHING TO READ, RECOVER");
+ phOsalNfc_RaiseException(phOsalNfc_e_UnrecovFirmwareErr,1);
+ }
+ else
+ {
+ i2c_error_count = 0;
+#ifdef LOW_LEVEL_TRACES
+ phOsalNfc_PrintData("Received buffer", (uint16_t)gReadWriteContext.nNbOfBytesRead, gReadWriteContext.pReadBuffer);
+#endif
DAL_DEBUG("Read ok. nbToRead=%d\n", gReadWriteContext.nNbOfBytesToRead);
DAL_DEBUG("NbReallyRead=%d\n", gReadWriteContext.nNbOfBytesRead);
DAL_PRINT("ReadBuff[]={ ");
@@ -691,17 +718,16 @@
DAL_DEBUG("0x%x ", gReadWriteContext.pReadBuffer[i]);
}
DAL_PRINT("}\n");
-
+
/* read completed immediately */
- sMsg.eMsgType= PHDAL4NFC_READ_MESSAGE;
- /* Update the state */
- phDal4Nfc_FillMsg(&sMsg,&OsalMsg);
- phDal4Nfc_DeferredCall((pphDal4Nfc_DeferFuncPointer_t)phDal4Nfc_DeferredCb,(void *)pmsgType);
- memsetRet=memset(&sMsg,0,sizeof(phDal4Nfc_Message_t));
- memsetRet=memset(&OsalMsg,0,sizeof(phOsalNfc_Message_t));
+ sMsg.eMsgType= PHDAL4NFC_READ_MESSAGE;
+ /* Update the state */
+ phDal4Nfc_FillMsg(&sMsg,&OsalMsg);
+ phDal4Nfc_DeferredCall((pphDal4Nfc_DeferFuncPointer_t)phDal4Nfc_DeferredCb,(void *)pmsgType);
+ memsetRet=memset(&sMsg,0,sizeof(phDal4Nfc_Message_t));
+ memsetRet=memset(&OsalMsg,0,sizeof(phOsalNfc_Message_t));
+ }
-
-
} /* End of thread Loop*/
return TRUE;
}
@@ -824,9 +850,15 @@
break;
case PHDAL4NFC_WRITE_MESSAGE:
DAL_PRINT(" Dal deferred write called \n");
+
+#ifdef LOW_LEVEL_TRACES
+ phOsalNfc_PrintData("Send buffer", (uint16_t)gReadWriteContext.nNbOfBytesToWrite, gReadWriteContext.pWriteBuffer);
+#endif
+
/* DAL_DEBUG("dalMsg->transactInfo.length : %d\n", dalMsg->transactInfo.length); */
/* Make a Physical WRITE */
- usleep(3000); /* Wait 3ms before issuing a Write */
+ /* NOTE: need to usleep(3000) here if the write is for SWP */
+ usleep(500); /* NXP advise 500us sleep required between I2C writes */
gReadWriteContext.nNbOfBytesWritten = gLinkFunc.write(gReadWriteContext.pWriteBuffer, gReadWriteContext.nNbOfBytesToWrite);
if (gReadWriteContext.nNbOfBytesWritten != gReadWriteContext.nNbOfBytesToWrite)
{
diff --git a/Linux_x86/phOsalNfc.c b/Linux_x86/phOsalNfc.c
index 6149fc3..9765e2c 100644
--- a/Linux_x86/phOsalNfc.c
+++ b/Linux_x86/phOsalNfc.c
@@ -150,3 +150,26 @@
}
}
+/*!
+ * \brief display data bytes.
+ * This function displays data bytes for debug purpose
+ * \param[in] pString pointer to string to be displayed.
+ * \param[in] length number of bytes to be displayed.
+ * \param[in] pBuffer pointer to data bytes to be displayed.
+ *
+ */
+void phOsalNfc_PrintData(const char *pString, uint32_t length, uint8_t *pBuffer)
+{
+ char print_buffer[512]; // Max length 512 for the download mode
+ int i;
+
+ if(NULL!=pString && length > 1 && length < 34)
+ {
+ print_buffer[0] = '\0';
+ for (i = 0; i < length; i++) {
+ snprintf(&print_buffer[i*5], 6, " 0x%02X", pBuffer[i]);
+ }
+ LOGD("> NFC I2C %s: %s", pString,print_buffer);
+ }
+}
+
diff --git a/inc/phNfcConfig.h b/inc/phNfcConfig.h
index ccc20c0..19a881b 100644
--- a/inc/phNfcConfig.h
+++ b/inc/phNfcConfig.h
@@ -141,7 +141,7 @@
/**< Default Session ID for Initialisation */
#ifndef DEFAULT_SESSION
-#define DEFAULT_SESSION "android7"
+#define DEFAULT_SESSION "android8"
#endif
@@ -240,7 +240,7 @@
#define DEV_MGMT_ACT_GRD_TO_DEFAULT 0x20U
#endif
-/**< NFCIP Active Mode Configuration
+/**< NFCIP Active Mode Default Configuration (when acting as Target)
0x01 106 kbps
0x02 212 kbps
0x04 424 kbps
@@ -323,7 +323,7 @@
/**< Macro to Enable the Peer to Peer Feature */
#define ENABLE_P2P
-#define DEFAULT_NFCIP_INITIATOR_MODE_SUPPORT 0x0FU
+#define DEFAULT_NFCIP_INITIATOR_MODE_SUPPORT 0x3FU
#define DEFAULT_NFCIP_TARGET_MODE_SUPPORT 0x0FU
/**< Macro to Enable the ISO14443-B Feature */
diff --git a/inc/phNfcTypes.h b/inc/phNfcTypes.h
index 03ce30d..989cfe8 100644
--- a/inc/phNfcTypes.h
+++ b/inc/phNfcTypes.h
@@ -978,10 +978,12 @@
{
phNfc_eDefaultP2PMode = 0x00U,
phNfc_ePassive106 = 0x01U,
- phNfc_ePassive212 = 0x02U,
- phNfc_ePassive424 = 0x04U,
- phNfc_eActive = 0x08U,
- phNfc_eP2P_ALL = 0x0FU,
+ phNfc_ePassive212 = 0x02U,
+ phNfc_ePassive424 = 0x04U,
+ phNfc_eActive106 = 0x08U,
+ phNfc_eActive212 = 0x10U,
+ phNfc_eActive424 = 0x20U,
+ phNfc_eP2P_ALL = 0x27U, /* All Passive and 424 Active */
phNfc_eInvalidP2PMode = 0xFFU
} phNfc_eP2PMode_t;
diff --git a/src/phFriNfc_Llcp.c b/src/phFriNfc_Llcp.c
index 13f1f92..ac38311 100644
--- a/src/phFriNfc_Llcp.c
+++ b/src/phFriNfc_Llcp.c
@@ -408,7 +408,7 @@
if (sValueBuffer.length != PHFRINFC_LLCP_TLV_LENGTH_VERSION)
{
/* Error : Ill-formed VERSION parameter TLV */
- return PHNFCSTVAL(CID_FRI_NFC_LLCP, NFCSTATUS_INVALID_PARAMETER);
+ break;
}
/* Get VERSION */
version = sValueBuffer.buffer[0];
@@ -420,7 +420,7 @@
if (sValueBuffer.length != PHFRINFC_LLCP_TLV_LENGTH_MIUX)
{
/* Error : Ill-formed MIUX parameter TLV */
- return PHNFCSTVAL(CID_FRI_NFC_LLCP, NFCSTATUS_INVALID_PARAMETER);
+ break;
}
/* Get MIU */
sParams.miu = PHFRINFC_LLCP_MIU_DEFAULT + ((sValueBuffer.buffer[0] << 8) | sValueBuffer.buffer[1]) & PHFRINFC_LLCP_TLV_MIUX_MASK;
@@ -432,7 +432,7 @@
if (sValueBuffer.length != PHFRINFC_LLCP_TLV_LENGTH_WKS)
{
/* Error : Ill-formed MIUX parameter TLV */
- return PHNFCSTVAL(CID_FRI_NFC_LLCP, NFCSTATUS_INVALID_PARAMETER);
+ break;
}
/* Get WKS */
sParams.wks = (sValueBuffer.buffer[0] << 8) | sValueBuffer.buffer[1];
@@ -446,7 +446,7 @@
if (sValueBuffer.length != PHFRINFC_LLCP_TLV_LENGTH_LTO)
{
/* Error : Ill-formed LTO parameter TLV */
- return PHNFCSTVAL(CID_FRI_NFC_LLCP, NFCSTATUS_INVALID_PARAMETER);
+ break;
}
/* Get LTO */
sParams.lto = sValueBuffer.buffer[0];
@@ -458,7 +458,7 @@
if (sValueBuffer.length != PHFRINFC_LLCP_TLV_LENGTH_OPT)
{
/* Error : Ill-formed OPT parameter TLV */
- return PHNFCSTVAL(CID_FRI_NFC_LLCP, NFCSTATUS_INVALID_PARAMETER);
+ break;;
}
/* Get OPT */
sParams.option = sValueBuffer.buffer[0] & PHFRINFC_LLCP_TLV_OPT_MASK;
@@ -467,7 +467,7 @@
default:
{
/* Error : Unknown Type */
- return PHNFCSTVAL(CID_FRI_NFC_LLCP, NFCSTATUS_INVALID_PARAMETER);
+ break;
}
}
}
diff --git a/src/phFriNfc_Llcp.h b/src/phFriNfc_Llcp.h
index 4d2e71e..73fa486 100644
--- a/src/phFriNfc_Llcp.h
+++ b/src/phFriNfc_Llcp.h
@@ -119,7 +119,7 @@
#define PHFRINFC_LLCP_SAP_SDP 0x01 /**< Service Discovery Protocol SAP.*/
#define PHFRINFC_LLCP_SAP_SDP_ADVERTISED_FIRST 0x10 /**< First SAP number from SDP-avertised SAP range.*/
#define PHFRINFC_LLCP_SAP_SDP_UNADVERTISED_FIRST 0x20 /**< First SAP number from SDP-unavertised SAP range.*/
-#define PHFRINFC_LLCP_SAP_NUMBER 0x30 /**< Number of possible SAP values (also first invalid value).*/
+#define PHFRINFC_LLCP_SAP_NUMBER 0x40 /**< Number of possible SAP values (also first invalid value).*/
#define PHFRINFC_LLCP_SAP_DEFAULT 0xFF /**< Default number when a socket is created or reset */
/*@}*/
diff --git a/src/phFriNfc_LlcpTransport_Connection.c b/src/phFriNfc_LlcpTransport_Connection.c
index fff63b4..fcdb246 100644
--- a/src/phFriNfc_LlcpTransport_Connection.c
+++ b/src/phFriNfc_LlcpTransport_Connection.c
@@ -627,7 +627,7 @@
if(sValueBuffer.length == 0)
{
/* Error : Ill-formed SN parameter TLV */
- return PHNFCSTVAL(CID_FRI_NFC_LLCP,NFCSTATUS_INVALID_PARAMETER);
+ break;
}
/* Get the Service Name */
*psServiceName = sValueBuffer;
@@ -639,7 +639,7 @@
if (sValueBuffer.length != PHFRINFC_LLCP_TLV_LENGTH_RW)
{
/* Error : Ill-formed MIUX parameter TLV */
- return PHNFCSTVAL(CID_FRI_NFC_LLCP,NFCSTATUS_INVALID_PARAMETER);
+ break;
}
*pRemoteRW_Size = sValueBuffer.buffer[0];
}break;
@@ -650,10 +650,16 @@
if (sValueBuffer.length != PHFRINFC_LLCP_TLV_LENGTH_MIUX)
{
/* Error : Ill-formed MIUX parameter TLV */
- return PHNFCSTVAL(CID_FRI_NFC_LLCP,NFCSTATUS_INVALID_PARAMETER);
+ break;
}
*pRemoteMIU = PHFRINFC_LLCP_MIU_DEFAULT + (((sValueBuffer.buffer[0] << 8) | sValueBuffer.buffer[1]) & PHFRINFC_LLCP_TLV_MIUX_MASK);
}break;
+
+ default:
+ {
+ /* Error : Unknown type */
+ break;
+ }
}
}
}
diff --git a/src/phHal4Nfc_P2P.c b/src/phHal4Nfc_P2P.c
index 47a64de..99c5978 100644
--- a/src/phHal4Nfc_P2P.c
+++ b/src/phHal4Nfc_P2P.c
@@ -478,7 +478,7 @@
Hal4Ctxt->psTrcvCtxtInfo->TransactionTimerId
= PH_OSALNFC_INVALID_TIMER_ID;
Hal4Ctxt->psTrcvCtxtInfo->RecvDataBufferStatus
- = NFCSTATUS_MORE_INFORMATION;
+ = NFCSTATUS_PENDING;
}
}
if(NULL == Hal4Ctxt->psTrcvCtxtInfo)
diff --git a/src/phOsalNfc.h b/src/phOsalNfc.h
index ad55066..246c2e6 100644
--- a/src/phOsalNfc.h
+++ b/src/phOsalNfc.h
@@ -154,6 +154,19 @@
*/
void phOsalNfc_DbgString(const char *pString);
+/*!
+ * \ingroup grp_osal_nfc
+ * \brief Print data buffer
+ *
+ * Outputs given string to debug port.
+ *
+ * \param[in] pString pointer to string to be displayed.
+ * \param[in] length number of bytes to be displayed.
+ * \param[in] pBuffer pointer to data bytes to be displayed.
+ *
+ * \retval None
+ */
+void phOsalNfc_PrintData(const char *pString, uint32_t length, uint8_t *pBuffer);
/*!
* \ingroup grp_osal_nfc