Reconcile with gingerbread-release gingerbread-mr4-release
Change-Id: Ibcd6e2299e3f03df1a5320041404a42a20546a57
diff --git a/Android.mk b/Android.mk
index 2ae7f39..2c2220b 100644
--- a/Android.mk
+++ b/Android.mk
@@ -6,7 +6,6 @@
include $(CLEAR_VARS)
-LOCAL_PRELINK_MODULE := false
LOCAL_ARM_MODE := arm
#phLibNfc
@@ -105,27 +104,23 @@
LOCAL_SRC_FILES += Linux_x86/phDal4Nfc_i2c.c
LOCAL_SRC_FILES += Linux_x86/phDal4Nfc_messageQueueLib.c
-# Really verbose:
-#LOCAL_CFLAGS += -DNXP_MESSAGING -DANDROID -DDEBUG -DNFC_TIMER_CONTEXT -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 -DNFC_TIMER_CONTEXT -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 -DNFC_TIMER_CONTEXT -DINCLUDE_DALINIT_DEINIT -pipe -fomit-frame-pointer -Wall -Wno-trigraphs -Werror-implicit-function-declaration -fno-strict-aliasing -fpic
-ifeq ($(TARGET_ARCH),arm)
-LOCAL_CFLAGS += -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -msoft-float -Uarm -fno-common
-endif
+LOCAL_CFLAGS += -DNXP_MESSAGING -DANDROID -fno-strict-aliasing
-ifeq ($(NFC_BUILD_VARIANT),debug)
-LOCAL_CFLAGS += -DDEBUG -D_DEBUG
-LOCAL_CFLAGS += -O0 -g
-$(info DEBUG)
-endif
-ifeq ($(NFC_BUILD_VARIANT),release)
-LOCAL_CFLAGS += -DNDEBUG
-LOCAL_CFLAGS += -Os
-LOCAL_CFLAGS += -Wl,-s
-$(info RELEASE)
-endif
+# Uncomment for Chipset command/responses
+# Or use "setprop debug.nfc.LOW_LEVEL_TRACES" at run-time
+# LOCAL_CFLAGS += -DLOW_LEVEL_TRACES
+
+# Uncomment for DAL traces
+# LOCAL_CFLAGS += -DDEBUG -DDAL_TRACE
+
+# Uncomment for LLC traces
+# LOCAL_CFLAGS += -DDEBUG -DLLC_TRACE
+
+# Uncomment for LLCP traces
+# LOCAL_CFLAGS += -DDEBUG -DLLCP_TRACE
+
+# Uncomment for HCI traces
+# LOCAL_CFLAGS += -DDEBUG -DHCI_TRACE
#includes
LOCAL_CFLAGS += -I$(LOCAL_PATH)/inc
@@ -144,8 +139,6 @@
include $(CLEAR_VARS)
-LOCAL_PRELINK_MODULE := false
-
LOCAL_SRC_FILES += src/phFriNfc_NdefRecord.c
LOCAL_CFLAGS += -I$(LOCAL_PATH)/inc
@@ -156,4 +149,3 @@
LOCAL_SHARED_LIBRARIES := libcutils
include $(BUILD_SHARED_LIBRARY)
-
diff --git a/CleanSpec.mk b/CleanSpec.mk
new file mode 100644
index 0000000..5a4aac6
--- /dev/null
+++ b/CleanSpec.mk
@@ -0,0 +1,53 @@
+# Copyright (C) 2011 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# If you don't need to do a full clean build but would like to touch
+# a file or delete some intermediate files, add a clean step to the end
+# of the list. These steps will only be run once, if they haven't been
+# run before.
+#
+# E.g.:
+# $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
+# $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
+#
+# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
+# files that are missing or have been moved.
+#
+# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
+# Use $(OUT_DIR) to refer to the "out" directory.
+#
+# If you need to re-do something that's already mentioned, just copy
+# the command and add it to the bottom of the list. E.g., if a change
+# that you made last week required touching a file and a change you
+# made today requires touching the same file, just copy the old
+# touch step and add it to the end of the list.
+#
+# ************************************************
+# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
+# ************************************************
+
+# For example:
+#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
+#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
+#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
+#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
+
+# ************************************************
+# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
+# ************************************************
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libnfc_intermediates/)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libnfc_ndef_intermediates/)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/libnfc.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/libnfc_ndef.so)
diff --git a/Linux_x86/phDal4Nfc.c b/Linux_x86/phDal4Nfc.c
index ec92566..9bedaf9 100644
--- a/Linux_x86/phDal4Nfc.c
+++ b/Linux_x86/phDal4Nfc.c
@@ -33,6 +33,8 @@
#include <stdlib.h>
#ifdef ANDROID
#include <linux/ipc.h>
+#include <cutils/log.h>
+#include <cutils/properties.h> // for property_get
#else
#include <sys/msg.h>
#endif
@@ -98,6 +100,7 @@
static pphDal4Nfc_SContext_t pgDalContext;
static phHal_sHwReference_t * pgDalHwContext;
static sem_t nfc_read_sem;
+static int low_level_traces;
#ifdef USE_MQ_MESSAGE_QUEUE
static phDal4Nfc_DeferredCall_Msg_t nDeferedMessage;
static mqd_t nDeferedCallMessageQueueId;
@@ -117,6 +120,31 @@
DAL API IMPLEMENTATION
------------------------------------------------------------------------------------*/
+static void refresh_low_level_traces() {
+#ifdef LOW_LEVEL_TRACES
+ low_level_traces = 1;
+ return;
+#else
+
+#ifdef ANDROID
+ char value[PROPERTY_VALUE_MAX];
+
+ property_get("ro.debuggable", value, "");
+ if (!value[0] || !atoi(value)) {
+ low_level_traces = 0; // user build, do not allow debug
+ return;
+ }
+
+ property_get("debug.nfc.LOW_LEVEL_TRACES", value, "");
+ if (value[0]) {
+ low_level_traces = atoi(value) ? 1 : 0;
+ return;
+ }
+#endif
+ low_level_traces = 0;
+#endif
+}
+
/*-----------------------------------------------------------------------------
FUNCTION: phDal4Nfc_Register
@@ -216,6 +244,8 @@
{
NFCSTATUS result = NFCSTATUS_SUCCESS;
+ refresh_low_level_traces();
+
if ((NULL != pContext) && (NULL != pHwRef))
{
pContext = pgDalContext;
@@ -530,7 +560,6 @@
gLinkFunc.open_and_configure = phDal4Nfc_uart_open_and_configure;
gLinkFunc.read = phDal4Nfc_uart_read;
gLinkFunc.write = phDal4Nfc_uart_write;
- gLinkFunc.download = phDal4Nfc_uart_download;
gLinkFunc.reset = phDal4Nfc_uart_reset;
}
break;
@@ -605,7 +634,7 @@
{
NFCSTATUS retstatus = NFCSTATUS_SUCCESS;
- DAL_DEBUG("phDal4Nfc_Reset: VEN to %d",level);
+ DAL_DEBUG("phDal4Nfc_Reset: VEN to %ld",level);
retstatus = gLinkFunc.reset(level);
@@ -720,17 +749,19 @@
else
{
i2c_error_count = 0;
-#ifdef LOW_LEVEL_TRACES
- phOsalNfc_PrintData("Received buffer", (uint16_t)gReadWriteContext.nNbOfBytesRead, gReadWriteContext.pReadBuffer);
-#endif
+
+ if (low_level_traces)
+ {
+ phOsalNfc_PrintData("RECV", (uint16_t)gReadWriteContext.nNbOfBytesRead, gReadWriteContext.pReadBuffer);
+ }
DAL_DEBUG("RX Thread Read ok. nbToRead=%d\n", gReadWriteContext.nNbOfBytesToRead);
DAL_DEBUG("RX Thread NbReallyRead=%d\n", gReadWriteContext.nNbOfBytesRead);
- DAL_PRINT("RX Thread ReadBuff[]={ ");
+/* DAL_PRINT("RX Thread ReadBuff[]={ ");
for (i = 0; i < gReadWriteContext.nNbOfBytesRead; i++)
{
DAL_DEBUG("RX Thread 0x%x ", gReadWriteContext.pReadBuffer[i]);
}
- DAL_PRINT("RX Thread }\n");
+ DAL_PRINT("RX Thread }\n"); */
/* read completed immediately */
sMsg.eMsgType= PHDAL4NFC_READ_MESSAGE;
@@ -867,9 +898,10 @@
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
+ if(low_level_traces)
+ {
+ phOsalNfc_PrintData("SEND", (uint16_t)gReadWriteContext.nNbOfBytesToWrite, gReadWriteContext.pWriteBuffer);
+ }
/* DAL_DEBUG("dalMsg->transactInfo.length : %d\n", dalMsg->transactInfo.length); */
/* Make a Physical WRITE */
@@ -894,12 +926,12 @@
DAL_PRINT(" Physical Write Success \n");
TransactionInfo.length=(uint16_t)gReadWriteContext.nNbOfBytesWritten;
TransactionInfo.status=NFCSTATUS_SUCCESS;
- DAL_PRINT("WriteBuff[]={ ");
+/* DAL_PRINT("WriteBuff[]={ ");
for (i = 0; i < gReadWriteContext.nNbOfBytesWritten; i++)
{
DAL_DEBUG("0x%x ", gReadWriteContext.pWriteBuffer[i]);
}
- DAL_PRINT("}\n");
+ DAL_PRINT("}\n"); */
// Free TempWriteBuffer
if(gReadWriteContext.pTempWriteBuffer != NULL)
diff --git a/Linux_x86/phDal4Nfc_i2c.c b/Linux_x86/phDal4Nfc_i2c.c
index 2d0e113..72da8e7 100644
--- a/Linux_x86/phDal4Nfc_i2c.c
+++ b/Linux_x86/phDal4Nfc_i2c.c
@@ -23,7 +23,7 @@
*/
#define LOG_TAG "NFC_i2c"
-#include <utils/Log.h>
+#include <cutils/log.h>
#include <stdlib.h>
#include <unistd.h>
@@ -31,6 +31,7 @@
#include <termios.h>
#include <sys/ioctl.h>
#include <sys/select.h>
+#include <errno.h>
#include <phDal4Nfc_debug.h>
#include <phDal4Nfc_i2c.h>
@@ -188,20 +189,49 @@
int phDal4Nfc_i2c_read(uint8_t * pBuffer, int nNbBytesToRead)
{
- int ret;
- DAL_ASSERT_STR(gI2cPortContext.nOpened == 1, "read called but not opened!");
+ int ret;
+ int numRead = 0;
+ struct timeval tv;
+ fd_set rfds;
- DAL_DEBUG("Reading %d bytes\n", nNbBytesToRead);
- ret = read(gI2cPortContext.nHandle, pBuffer, nNbBytesToRead);
- if (ret < 0)
- {
- DAL_DEBUG("Read failed: read() returned %d\n", ret);
- }
- else
- {
- DAL_DEBUG("Read succeed (%d bytes)\n", ret);
- }
- return ret;
+ DAL_ASSERT_STR(gI2cPortContext.nOpened == 1, "read called but not opened!");
+ DAL_DEBUG("_i2c_read() called to read %d bytes", nNbBytesToRead);
+
+ // Read with 2 second timeout, so that the read thread can be aborted
+ // when the pn544 does not respond and we need to switch to FW download
+ // mode. This should be done via a control socket instead.
+ while (numRead < nNbBytesToRead) {
+ FD_ZERO(&rfds);
+ FD_SET(gI2cPortContext.nHandle, &rfds);
+ tv.tv_sec = 2;
+ tv.tv_usec = 0;
+ ret = select(gI2cPortContext.nHandle + 1, &rfds, NULL, NULL, &tv);
+ if (ret < 0) {
+ DAL_DEBUG("select() errno=%d", errno);
+ if (errno == EINTR || errno == EAGAIN) {
+ continue;
+ }
+ return -1;
+ } else if (ret == 0) {
+ DAL_PRINT("timeout!");
+ return -1;
+ }
+ ret = read(gI2cPortContext.nHandle, pBuffer + numRead, nNbBytesToRead - numRead);
+ if (ret > 0) {
+ DAL_DEBUG("read %d bytes", ret);
+ numRead += ret;
+ } else if (ret == 0) {
+ DAL_PRINT("_i2c_read() EOF");
+ return -1;
+ } else {
+ DAL_DEBUG("_i2c_read() errno=%d", errno);
+ if (errno == EINTR || errno == EAGAIN) {
+ continue;
+ }
+ return -1;
+ }
+ }
+ return numRead;
}
/*-----------------------------------------------------------------------------
@@ -215,23 +245,32 @@
int phDal4Nfc_i2c_write(uint8_t * pBuffer, int nNbBytesToWrite)
{
- int ret;
- DAL_ASSERT_STR(gI2cPortContext.nOpened == 1, "write called but not opened!");
+ int ret;
+ int numWrote = 0;
- DAL_DEBUG("Writing %d bytes\n", nNbBytesToWrite);
- ret = write(gI2cPortContext.nHandle, pBuffer, nNbBytesToWrite);
- if (ret < 0)
- {
- DAL_DEBUG("Write failed: write() returned %d \n", ret);
- }
- else
- {
- DAL_DEBUG("Write succeed (%d bytes)\n", ret);
- }
- return ret;
+ DAL_ASSERT_STR(gI2cPortContext.nOpened == 1, "write called but not opened!");
+ DAL_DEBUG("_i2c_write() called to write %d bytes\n", nNbBytesToWrite);
+
+ while (numWrote < nNbBytesToWrite) {
+ ret = write(gI2cPortContext.nHandle, pBuffer + numWrote, nNbBytesToWrite - numWrote);
+ if (ret > 0) {
+ DAL_DEBUG("wrote %d bytes", ret);
+ numWrote += ret;
+ } else if (ret == 0) {
+ DAL_PRINT("_i2c_write() EOF");
+ return -1;
+ } else {
+ DAL_DEBUG("_i2c_write() errno=%d", errno);
+ if (errno == EINTR || errno == EAGAIN) {
+ continue;
+ }
+ return -1;
+ }
+ }
+
+ return numWrote;
}
-
/*-----------------------------------------------------------------------------
FUNCTION: phDal4Nfc_i2c_reset
@@ -241,26 +280,7 @@
-----------------------------------------------------------------------------*/
int phDal4Nfc_i2c_reset(long level)
{
- int ret = NFCSTATUS_SUCCESS;
+ DAL_DEBUG("phDal4Nfc_i2c_reset, VEN level = %ld", level);
- DAL_DEBUG("phDal4Nfc_i2c_reset, VEN level = %ld",level);
-
- ret = ioctl(gI2cPortContext.nHandle, PN544_SET_PWR, level);
-
- /* HACK to increase reset time
- * TODO: move this to kernel
- */
- if (level == 0) {
- LOGW("sleeping a little longer...");
- usleep(50000);
- } else {
- usleep(10000);
- }
-
- return ret;
+ return ioctl(gI2cPortContext.nHandle, PN544_SET_PWR, level);
}
-
-
-
-
-
diff --git a/Linux_x86/phDal4Nfc_uart.c b/Linux_x86/phDal4Nfc_uart.c
index 30cb500..bb891e3 100644
--- a/Linux_x86/phDal4Nfc_uart.c
+++ b/Linux_x86/phDal4Nfc_uart.c
@@ -26,11 +26,17 @@
*
*/
+#define LOG_TAG "NFC_uart"
+#include <cutils/log.h>
+
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
+#include <errno.h>
#include <sys/ioctl.h>
#include <sys/select.h>
+#include <stdio.h>
+#include <errno.h>
#include <phDal4Nfc_debug.h>
#include <phDal4Nfc_uart.h>
@@ -161,28 +167,28 @@
switch(pConfig->nLinkType)
{
case ENUM_DAL_LINK_TYPE_COM1:
- pComPort = "/dev/ttyS0";
+ pComPort = "/dev/ttyO0";
break;
case ENUM_DAL_LINK_TYPE_COM2:
- pComPort = "/dev/ttyS1";
+ pComPort = "/dev/ttyO1";
break;
case ENUM_DAL_LINK_TYPE_COM3:
- pComPort = "/dev/ttyS2";
+ pComPort = "/dev/ttyO2";
break;
case ENUM_DAL_LINK_TYPE_COM4:
- pComPort = "/dev/ttyS3";
+ pComPort = "/dev/ttyO3";
break;
case ENUM_DAL_LINK_TYPE_COM5:
- pComPort = "/dev/ttyS4";
+ pComPort = "/dev/ttyO4";
break;
case ENUM_DAL_LINK_TYPE_COM6:
- pComPort = "/dev/ttyS5";
+ pComPort = "/dev/ttyO5";
break;
case ENUM_DAL_LINK_TYPE_COM7:
- pComPort = "/dev/ttyS6";
+ pComPort = "/dev/ttyO6";
break;
case ENUM_DAL_LINK_TYPE_COM8:
- pComPort = "/dev/ttyS7";
+ pComPort = "/dev/ttyO7";
break;
case ENUM_DAL_LINK_TYPE_USB:
pComPort = "/dev/ttyUSB0";
@@ -263,31 +269,51 @@
Returns the number of bytes really read or -1 in case of error.
-----------------------------------------------------------------------------*/
-
int phDal4Nfc_uart_read(uint8_t * pBuffer, int nNbBytesToRead)
{
- fd_set rfds;
- struct timeval tv;
- int ret;
+ int ret;
+ int numRead = 0;
+ struct timeval tv;
+ fd_set rfds;
- DAL_ASSERT_STR(gComPortContext.nOpened == 1, "read called but not opened!");
+ DAL_ASSERT_STR(gComPortContext.nOpened == 1, "read called but not opened!");
+ DAL_DEBUG("_uart_read() called to read %d bytes", nNbBytesToRead);
- FD_ZERO(&rfds);
- FD_SET(gComPortContext.nHandle, &rfds);
-
- /* select will block for 10 sec */
- tv.tv_sec = 2;
- tv.tv_usec = 0;
-
- ret = select(gComPortContext.nHandle + 1, &rfds, NULL, NULL, &tv);
-
- if (ret == -1)
- return -1;
-
- if (ret)
- return read(gComPortContext.nHandle, pBuffer, nNbBytesToRead);
-
- return 0;
+ // Read with 2 second timeout, so that the read thread can be aborted
+ // when the pn544 does not respond and we need to switch to FW download
+ // mode. This should be done via a control socket instead.
+ while (numRead < nNbBytesToRead) {
+ FD_ZERO(&rfds);
+ FD_SET(gComPortContext.nHandle, &rfds);
+ tv.tv_sec = 2;
+ tv.tv_usec = 0;
+ ret = select(gComPortContext.nHandle + 1, &rfds, NULL, NULL, NULL);
+ if (ret < 0) {
+ DAL_DEBUG("select() errno=%d", errno);
+ if (errno == EINTR || errno == EAGAIN) {
+ continue;
+ }
+ return -1;
+ } else if (ret == 0) {
+ DAL_PRINT("timeout!");
+ break; // return partial response
+ }
+ ret = read(gComPortContext.nHandle, pBuffer + numRead, nNbBytesToRead - numRead);
+ if (ret > 0) {
+ DAL_DEBUG("read %d bytes", ret);
+ numRead += ret;
+ } else if (ret == 0) {
+ DAL_PRINT("_uart_read() EOF");
+ return 0;
+ } else {
+ DAL_DEBUG("_uart_read() errno=%d", errno);
+ if (errno == EINTR || errno == EAGAIN) {
+ continue;
+ }
+ return -1;
+ }
+ }
+ return numRead;
}
/*-----------------------------------------------------------------------------
@@ -301,28 +327,30 @@
int phDal4Nfc_uart_write(uint8_t * pBuffer, int nNbBytesToWrite)
{
- fd_set wfds;
- struct timeval tv;
- int ret;
+ int ret;
+ int numWrote = 0;
- DAL_ASSERT_STR(gComPortContext.nOpened == 1, "write called but not opened!");
+ DAL_ASSERT_STR(gComPortContext.nOpened == 1, "write called but not opened!");
+ DAL_DEBUG("_uart_write() called to write %d bytes\n", nNbBytesToWrite);
- FD_ZERO(&wfds);
- FD_SET(gComPortContext.nHandle, &wfds);
+ while (numWrote < nNbBytesToWrite) {
+ ret = write(gComPortContext.nHandle, pBuffer + numWrote, nNbBytesToWrite - numWrote);
+ if (ret > 0) {
+ DAL_DEBUG("wrote %d bytes", ret);
+ numWrote += ret;
+ } else if (ret == 0) {
+ DAL_PRINT("_uart_write() EOF");
+ return -1;
+ } else {
+ DAL_DEBUG("_uart_write() errno=%d", errno);
+ if (errno == EINTR || errno == EAGAIN) {
+ continue;
+ }
+ return -1;
+ }
+ }
- /* select will block for 10 sec */
- tv.tv_sec = 2;
- tv.tv_usec = 0;
-
- ret = select(gComPortContext.nHandle + 1, NULL, &wfds, NULL, &tv);
-
- if (ret == -1)
- return -1;
-
- if (ret)
- return write(gComPortContext.nHandle, pBuffer, nNbBytesToWrite);
-
- return 0;
+ return numWrote;
}
/*-----------------------------------------------------------------------------
@@ -332,24 +360,38 @@
PURPOSE: Reset the PN544, using the VEN pin
-----------------------------------------------------------------------------*/
-int phDal4Nfc_uart_reset()
+int phDal4Nfc_uart_reset(long level)
{
- DAL_PRINT("phDal4Nfc_uart_reset");
+ static const char NFC_POWER_PATH[] = "/sys/devices/platform/nfc-power/nfc_power";
+ int sz;
+ int fd = -1;
+ int ret = NFCSTATUS_FAILED;
+ char buffer[2];
- return NFCSTATUS_FEATURE_NOT_SUPPORTED;
+ DAL_DEBUG("phDal4Nfc_uart_reset, VEN level = %ld", level);
+
+ if (snprintf(buffer, sizeof(buffer), "%u", (unsigned int)level) != 1) {
+ LOGE("Bad nfc power level (%u)", (unsigned int)level);
+ goto out;
+ }
+
+ fd = open(NFC_POWER_PATH, O_WRONLY);
+ if (fd < 0) {
+ LOGE("open(%s) for write failed: %s (%d)", NFC_POWER_PATH,
+ strerror(errno), errno);
+ goto out;
+ }
+ sz = write(fd, &buffer, sizeof(buffer) - 1);
+ if (sz < 0) {
+ LOGE("write(%s) failed: %s (%d)", NFC_POWER_PATH, strerror(errno),
+ errno);
+ goto out;
+ }
+ ret = NFCSTATUS_SUCCESS;
+
+out:
+ if (fd >= 0) {
+ close(fd);
+ }
+ return ret;
}
-
-/*-----------------------------------------------------------------------------
-
-FUNCTION: phDal4Nfc_uart_write
-
-PURPOSE: Put the PN544 in download mode, using the GPIO4 pin
-
------------------------------------------------------------------------------*/
-int phDal4Nfc_uart_download()
-{
- DAL_PRINT("phDal4Nfc_uart_download");
-
- return NFCSTATUS_FEATURE_NOT_SUPPORTED;
-}
-
diff --git a/Linux_x86/phOsalNfc.c b/Linux_x86/phOsalNfc.c
index 9765e2c..0544309 100644
--- a/Linux_x86/phOsalNfc.c
+++ b/Linux_x86/phOsalNfc.c
@@ -160,16 +160,15 @@
*/
void phOsalNfc_PrintData(const char *pString, uint32_t length, uint8_t *pBuffer)
{
- char print_buffer[512]; // Max length 512 for the download mode
+ char print_buffer[length * 3 + 1];
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);
+ if (pString == NULL) {
+ pString = "";
}
+ print_buffer[0] = '\0';
+ for (i = 0; i < length; i++) {
+ snprintf(&print_buffer[i*3], 4, " %02X", pBuffer[i]);
+ }
+ LOGD("> %s:%s", pString, print_buffer);
}
-
diff --git a/inc/phNfcConfig.h b/inc/phNfcConfig.h
index b11e79d..e7386d9 100644
--- a/inc/phNfcConfig.h
+++ b/inc/phNfcConfig.h
@@ -176,7 +176,7 @@
#endif
#ifndef NXP_MIFARE_XCHG_TIMEOUT
-#define NXP_MIFARE_XCHG_TIMEOUT 0x03U
+#define NXP_MIFARE_XCHG_TIMEOUT 0x0BU
#endif
#ifndef NXP_FELICA_XCHG_TIMEOUT
@@ -223,6 +223,12 @@
#define LINK_CONNECTION_TIMEOUT 1000U
#endif
+/**< Defines ACK time out value for LLC timer,
+ 150 is in milliseconds */
+#ifndef LINK_ACK_TIMEOUT
+#define LINK_ACK_TIMEOUT 1U
+#endif
+
/**< Defines Firmware Download Completion Timeout value ,
120000 is in milliseconds */
@@ -254,7 +260,7 @@
#ifndef NXP_NFC_HCI_TIMER
-#define NXP_NFC_HCI_TIMER 0
+#define NXP_NFC_HCI_TIMER 1
#define NXP_NFC_HCI_TIMEOUT 6000
#endif
@@ -369,15 +375,11 @@
/**< Macro to Enable the Card Emulation Feature */
/* #define HOST_EMULATION */
-#define NXP_HAL_VERIFY_EEPROM_CRC 0x01U
-
/**< Macro to Enable the Download Mode Feature */
#define FW_DOWNLOAD
/**< Macro to Enable the Firmware Download Timer */
-/* 0x01U to use overall timeout */
-/* 0x02U to use per frame timeout */
-#define FW_DOWNLOAD_TIMER 0x02U
+#define FW_DOWNLOAD_TIMER
/**< Macro to Verify the Firmware Download */
/* #define FW_DOWNLOAD_VERIFY */
@@ -386,9 +388,6 @@
#define NXP_FW_INTEGRITY_CHK 1
#endif
-/* To specify the Maximum TX/RX Len */
-#define NXP_FW_MAX_TX_RX_LEN 0x200
-
#define UICC_CONNECTIVITY_PATCH
/* Work around to Delay the initiator activation */
diff --git a/inc/phNfcHalTypes.h b/inc/phNfcHalTypes.h
index 47e9036..a242450 100644
--- a/inc/phNfcHalTypes.h
+++ b/inc/phNfcHalTypes.h
@@ -36,8 +36,6 @@
*
* File: \ref phNfcHalTypes.h
*
- * Developed By: Ravindra U.
- *
*/
/*@{*/
@@ -49,26 +47,6 @@
#include <phNfcCompId.h>
#include <phNfcConfig.h>
-#ifndef NXP_HAL_MEM_INFO_SIZE
-#define NXP_HAL_MEM_INFO_SIZE 0x01U
-#endif
-
-#if (NXP_HAL_MEM_INFO_SIZE > 0x01)
-#define NXP_FW_UPLOAD_PROGRESS 0x965AU
-#define NXP_FW_UPLOAD_SUCCESS 0x0000U
-#else
-#define NXP_FW_UPLOAD_PROGRESS 0x5AU
-#define NXP_FW_UPLOAD_SUCCESS 0x00U
-#endif
-
-
-typedef struct phHal_sMemInfo
-{
- uint16_t fw_magic;
- uint16_t fw_rfu;
- uint32_t hal_version;
-}phHal_sMemInfo_t;
-
/** \ingroup grp_hal_common
*
@@ -858,7 +836,6 @@
NFC_INFO_TXLDO_OVERCUR = 0x71U,
NFC_INFO_MEM_VIOLATION = 0x73U,
NFC_INFO_TEMP_OVERHEAT = 0x74U,
- NFC_INFO_LLC_ERROR = 0x75U,
/* NXP EVENTS */
NFC_EVT_MIFARE_ACCESS = 0x35,
diff --git a/inc/phNfcLlcpTypes.h b/inc/phNfcLlcpTypes.h
index 3c555c2..2954d00 100644
--- a/inc/phNfcLlcpTypes.h
+++ b/inc/phNfcLlcpTypes.h
@@ -55,7 +55,7 @@
*
*/
/*@{*/
-#define PHFRINFC_LLCP_NB_SOCKET_MAX 5 /**< Max.number of simultaneous sockets */
+#define PHFRINFC_LLCP_NB_SOCKET_MAX 10 /**< Max.number of simultaneous sockets */
/*@}*/
/**
diff --git a/src/phDnldNfc.c b/src/phDnldNfc.c
old mode 100644
new mode 100755
index 0c11377..796653e
--- a/src/phDnldNfc.c
+++ b/src/phDnldNfc.c
@@ -24,9 +24,9 @@
* *
* Project: NFC-FRI-1.1 *
* *
-* $Date: Thu Sep 9 14:58:05 2010 $ *
+* $Date: Tue Jun 28 14:25:44 2011 $ *
* $Author: ing04880 $ *
-* $Revision: 1.32 $ *
+* $Revision: 1.33 $ *
* $Aliases: $
* *
* =========================================================================== *
@@ -39,6 +39,7 @@
################################################################################
*/
#include <stdlib.h>
+#include <unistd.h>
#include <phNfcConfig.h>
#include <phNfcCompId.h>
#include <phNfcIoctlCode.h>
@@ -46,8 +47,7 @@
#include <phOsalNfc.h>
#include <phOsalNfc_Timer.h>
#include <phDal4Nfc.h>
-
-
+#include <utils/Log.h>
/*
################################################################################
****************************** Macro Definitions *******************************
@@ -58,6 +58,8 @@
#define STATIC static
#endif
+#define SECTION_HDR
+
#if defined (DNLD_SUMMARY) && !defined (DNLD_TRACE)
#define DNLD_TRACE
#endif
@@ -88,51 +90,19 @@
#define DNLD_PRINT_BUFFER(msg,buf,len)
#endif
-#define DO_DELAY(period) { unsigned i=0; for(;i<period;i++); }
+#define DO_DELAY(period) usleep(period)
-#define PHDNLD_DNLD_DELAY 0x1000U
+/* delay after SW reset cmd in ms, required on uart for XTAL stability */
+#define PHDNLD_DNLD_DELAY 5000
#define PHDNLD_MAX_PACKET 0x0200U /* Max Total Packet Size is 512 */
-#define PHDNLD_DATA_SIZE ((PHDNLD_MAX_PACKET)- 8U) /* 0x01F8U */
+#define PHDNLD_DATA_SIZE ((PHDNLD_MAX_PACKET)- 8U) /* 0x01F8U */
/* Max Data Size is 504 */
#define PHDNLD_MIN_PACKET 0x03U /* Minimum Packet Size is 3*/
-#define DNLD_DEFAULT_RESPONSE_TIMEOUT 0x4000U
-
-#define NXP_FW_MIN_TX_RX_LEN 0x0AU
-
-
-#if defined( NXP_FW_MAX_TX_RX_LEN ) && \
- ( NXP_FW_MAX_TX_RX_LEN > NXP_FW_MIN_TX_RX_LEN )
-
-#define PHDNLD_FW_TX_RX_LEN NXP_FW_MAX_TX_RX_LEN
-
-#elif !defined( NXP_FW_MAX_TX_RX_LEN )
-
-/* To specify the Maximum TX/RX Len */
-#define NXP_FW_MAX_TX_RX_LEN 0x200
-#define PHDNLD_FW_TX_RX_LEN NXP_FW_MAX_TX_RX_LEN
-
-#else
-
-#define PHDNLD_FW_TX_RX_LEN NXP_FW_MIN_TX_RX_LEN
-
-#endif
-
#define PHDNLD_FRAME_LEN_SIZE 0x02U
#define PHDNLD_ADDR_SIZE 0x03U
#define PHDNLD_DATA_LEN_SIZE 0x02U
-#define PHDNLD_FRAME_DATA_OFFSET 0x03U
-#define DNLD_SM_UNLOCK_MASK 0x01U
-#define DNLD_TRIM_MASK 0x02U
-#define DNLD_RESET_MASK 0x04U
-#define DNLD_VERIFY_MASK 0x08U
-#define DNLD_CRITICAL_MASK 0x10U
-
-
-#define NXP_NFC_IMAG_FW_MAX 0x05U
-
-#define PHDNLD_FW_PATCH_SEC 0x5FU
#define PHDNLD_PAGE_SIZE 0x80U /* Page Size Configured for 64 Bytes */
@@ -148,8 +118,6 @@
#define DNLD_PATCH_TABLE_ADDR 0x00008200U
-/* Raw Command to pass the Data in Download Mode */
-#define PHDNLD_CMD_RAW 0x00U
/* Command to Reset the Device in Download Mode */
#define PHDNLD_CMD_RESET 0x01U
/* Command to Read from the Address specified in Download Mode */
@@ -157,7 +125,6 @@
#define PHDNLD_CMD_READ_LEN 0x0005U
/* Command to write to the Address specified in Download Mode */
#define PHDNLD_CMD_WRITE 0x08U
-#define PHDNLD_CMD_SEC_WRITE 0x0CU
#define PHDNLD_CMD_WRITE_MIN_LEN 0x0005U
#define PHDNLD_CMD_WRITE_MAX_LEN PHDNLD_DATA_SIZE
/* Command to verify the data written */
@@ -178,9 +145,6 @@
/* Command to verify the Integrity of the data written */
#define PHDNLD_CMD_CHECK_INTEGRITY 0x0BU
-/* Command to verify the Integrity of the data written */
-#define PHDNLD_CMD_ENCAPSULATE 0x0DU
-
#define CHECK_INTEGRITY_RESP_CRC16_LEN 0x03U
#define CHECK_INTEGRITY_RESP_CRC32_LEN 0x05U
#define CHECK_INTEGRITY_RESP_COMP_LEN 0x10U
@@ -198,23 +162,8 @@
#define PHDNLD_RESP_PROTOCOL_ERROR 0x0BU
/* Invalid parameter Response to a Command Sent in the Download Mode */
#define PHDNLD_RESP_INVALID_PARAMETER 0x11U
-/* Command Not Supported Response to a Command Sent in the Download Mode */
-#define PHDNLD_RESP_CMD_NOT_SUPPORTED 0x13U
/* Length parameter error Response to a Command Sent in the Download Mode */
#define PHDNLD_RESP_INVALID_LENGTH 0x18U
-/* Checksum Error Response to a Command Sent in the Download Mode */
-#define PHDNLD_RESP_CHKSUM_ERROR 0x19U
-/* Version already uptodate Response to a Command Sent in the Download Mode */
-#define PHDNLD_RESP_VERSION_UPTODATE 0x1DU
-/* Memory operation error during the processing of
- the Command Frame in the Download Mode */
-#define PHDNLD_RESP_MEMORY_UPDATE_ERROR 0x20U
-/* The Chaining of the Command Frame was Successful in the Download Mode */
-#define PHDNLD_RESP_CHAINING_SUCCESS 0x21U
-/* The Command is not allowed anymore in the Download Mode */
-#define PHDNLD_RESP_CMD_NOT_ALLOWED 0xE0U
-/* The Error during the Chaining the Command Frame in the Download Mode */
-#define PHDNLD_RESP_CHAINING_ERROR 0xE6U
/* Write Error Response to a Command Sent in the Download Mode */
#define PHDNLD_RESP_WRITE_ERROR 0x74U
@@ -236,7 +185,6 @@
typedef enum phDnldNfc_eSeqType{
DNLD_SEQ_RESET = 0x00U,
DNLD_SEQ_INIT,
- DNLD_SEQ_RAW,
DNLD_SEQ_LOCK,
DNLD_SEQ_UNLOCK,
DNLD_SEQ_UPDATE,
@@ -268,7 +216,6 @@
phDnld_Verify_Integrity,
phDnld_Verify_Section,
phDnld_Complete_Seq,
- phDnld_Raw_Upgrade,
phDnld_Invalid_Seq
}phDnldNfc_eSeq_t;
@@ -297,7 +244,7 @@
uint8_t img_data_offset;
/* Number of fimware images available in the img_data */
uint8_t no_of_fw_img;
- /* Fimware image Padding in the img_data */
+ /* Number of fimware images available in the img_data */
uint8_t fw_img_pad[2];
/* HW Compatiblity table for the set of the Hardwares */
hw_comp_tbl_t comp_tbl;
@@ -326,12 +273,25 @@
{
uint8_t section_hdr_len;
uint8_t section_mem_type;
- uint8_t section_checksum;
- uint8_t section_conf;
+ uint16_t section_data_crc;
uint32_t section_address;
uint32_t section_length;
}section_hdr_t;
+
+typedef struct section_type
+{
+ unsigned system_mem_unlock:1;
+ unsigned trim_val:1;
+ unsigned reset_required:1;
+ unsigned verify_mem:1;
+ unsigned critical_section:1;
+ unsigned section_crc_check:1;
+ unsigned section_type_rfu:2;
+ unsigned section_type_pad:24;
+
+}section_type_t;
+
typedef struct section_info
{
section_hdr_t *p_sec_hdr;
@@ -340,10 +300,6 @@
* to be loaded to the particular address.
*/
uint8_t *p_sec_data;
- /* The Section checksum to verify the integrity of the section
- * data.
- */
- uint8_t *p_sec_chksum;
/** \internal Index used to refer and process the
* Firmware Section Data */
volatile uint32_t section_offset;
@@ -369,24 +325,13 @@
uint8_t data_packet[PHDNLD_DATA_SIZE];
}phDnldNfc_sParam_t;
+
typedef struct phDnldNfc_sDataHdr
{
uint8_t frame_type;
uint8_t frame_length[PHDNLD_FRAME_LEN_SIZE];
}phDnldNfc_sData_Hdr_t;
-typedef struct phDnldNfc_sRawHdr
-{
- uint8_t frame_type;
- uint8_t frame_length[PHDNLD_FRAME_LEN_SIZE];
-}phDnldNfc_sRawHdr_t;
-
-typedef struct phDnldNfc_sRawDataHdr
-{
- uint8_t data_addr[PHDNLD_ADDR_SIZE];
- uint8_t data_len[PHDNLD_DATA_LEN_SIZE];
-}phDnldNfc_sRawDataHdr_t;
-
typedef struct phDnldNfc_sChkCrc16_Resp
{
uint8_t Chk_status;
@@ -417,59 +362,11 @@
union param
{
phDnldNfc_sParam_t data_param;
- uint8_t response_data[PHDNLD_MAX_PACKET];
+ uint8_t response_data[PHDNLD_MAX_PACKET + 0];
uint8_t cmd_param;
}param_info;
}phDnldNfc_sData_t;
-#ifdef NXP_NFC_MULTIPLE_FW
-
-typedef struct phDnldNfc_sFwImageInfo
-{
- /** \internal Data Pointer to the Firmware header section of the Firmware */
- fw_data_hdr_t *p_fw_hdr;
- /** \internal Buffer pointer to store the Firmware Section Data */
- section_info_t *p_fw_sec;
- /** \internal Buffer pointer to store the Firmware Raw Data */
- uint8_t *p_fw_raw;
-}phDnldNfc_sFwImageInfo_t;
-
-#endif /* #ifdef NXP_NFC_MULTIPLE_FW */
-
-
-typedef struct phDnldNfc_TxInfo
-{
- uint8_t *transmit_frame;
-
- uint16_t tx_offset;
-
- /** \internal Remaining amount of data to be sent */
- uint16_t tx_len;
-
- uint16_t tx_total;
-
- /** \internal Chain information for the data to be sent */
- uint8_t tx_chain;
-
-}phDnldNfc_TxInfo_t;
-
-
-typedef struct phDnldNfc_RxInfo
-{
- /** \internal Total length of the received buffer */
- uint16_t rx_total;
- /** \internal Chain information of the received buffer */
- uint16_t rx_chain;
- /** \internal Remaining Data information to be read to complete the
- * Data Information.
- */
- uint16_t rx_remain;
-
- /** \internal Buffer to Send the Raw Data Frame */
- uint8_t raw_buffer_data[PHDNLD_MAX_PACKET
- + PHDNLD_PAGE_SIZE];
-}phDnldNfc_RxInfo_t;
-
typedef struct phDnldNfc_sContext
{
@@ -488,29 +385,18 @@
/** \internal Timer ID for the Download Abort */
uint32_t timer_id;
- /** \internal Internal Download for the Download Abort */
- uint32_t dnld_timeout;
/** \internal Data Pointer to the Image header section of the Firmware */
img_data_hdr_t *p_img_hdr;
-
-#ifdef NXP_NFC_MULTIPLE_FW
- /** \internal Data Pointer to the Firmware Image Information */
- phDnldNfc_sFwImageInfo_t *p_img_info;
-#endif /* #ifdef NXP_NFC_MULTIPLE_FW */
-
/** \internal Data Pointer to the Firmware header section of the Firmware */
fw_data_hdr_t *p_fw_hdr;
/** \internal Buffer pointer to store the Firmware Data */
section_info_t *p_fw_sec;
- /** \internal Buffer pointer to store the Firmware Raw Data */
- uint8_t *p_fw_raw;
/** \internal Previous Download Size */
uint32_t prev_dnld_size;
/** \internal Single Data Block to download the Firmware */
- uint8_t dnld_data[PHDNLD_MAX_PACKET
- + PHDNLD_PAGE_SIZE];
+ phDnldNfc_sData_t dnld_data;
/** \internal Index used to refer and process the Download Data */
volatile uint32_t dnld_index;
@@ -538,12 +424,11 @@
#define NXP_FW_VMID_CARD_MODE_ADDR 0x00009931U
#define NXP_FW_VMID_RD_MODE_ADDR 0x00009981U
- uint8_t vmid_trim_update;
+ unsigned vmid_trim_update:1;
+ unsigned trim_bits_rfu:31;
#endif /* #ifdef NXP_FW_SW_VMID_TRIM */
- uint8_t cur_frame_info;
-
- uint8_t raw_mode_upgrade;
+ uint8_t *p_system_mem_crc;
uint8_t *p_patch_table_crc;
@@ -553,12 +438,18 @@
uint16_t resp_length;
+ /** \internal Total length of the received buffer */
+ volatile uint16_t rx_total;
+
/** \internal Current FW Section in Process */
volatile uint8_t section_index;
/** \internal Previous Command sent */
volatile uint8_t prev_cmd;
+ /** \internal Download Response pending */
+ volatile uint8_t recv_pending;
+
uint8_t dnld_retry;
/** \internal Current Download State */
@@ -571,25 +462,17 @@
/** \internal Next step in Download Sequence */
volatile uint8_t next_dnld_seq;
- /* \internal Data Transmit information */
- phDnldNfc_TxInfo_t tx_info;
-
- /* \internal Data Receive information */
- phDnldNfc_RxInfo_t rx_info;
-
-
}phDnldNfc_sContext_t;
+
/*
################################################################################
******************** Global and Static Variables Definition ********************
################################################################################
*/
-#ifndef NFC_TIMER_CONTEXT
static phDnldNfc_sContext_t *gpphDnldContext = NULL;
-#endif
#ifdef NXP_FW_DNLD_CHECK_PHASE
@@ -597,7 +480,6 @@
#define NXP_FW_DNLD_SYSTEM_PHASE 0x01U
#define NXP_FW_DNLD_CFG_PHASE 0x02U
#define NXP_FW_DNLD_DATA_PHASE 0x03U
-#define NXP_FW_DNLD_RAW_PHASE 0x04U
#define NXP_FW_DNLD_INVALID_PHASE 0xFFU
static uint8_t gphDnldPhase = NXP_FW_DNLD_COMPLETE_PHASE;
@@ -769,10 +651,8 @@
STATIC
void
phDnldNfc_Abort (
- uint32_t abort_id
-#ifdef NFC_TIMER_CONTEXT
- , void *dnld_cntxt
-#endif
+ uint32_t abort_id,
+ void *pContext
);
@@ -940,7 +820,6 @@
phDnldNfc_sContext_t **ppsDnldContext
)
{
-
if(NULL != (*ppsDnldContext)->p_resp_buffer)
{
phOsalNfc_FreeMemory((*ppsDnldContext)->p_resp_buffer);
@@ -1049,20 +928,8 @@
(uint8_t) phDnld_Reset_State;
psDnldContext->next_dnld_state =
(uint8_t)phDnld_Upgrade_State;
- psDnldContext->cur_dnld_seq =
- (uint8_t)phDnld_Upgrade_Section;
psDnldContext->next_dnld_seq =
- psDnldContext->cur_dnld_seq;
- break;
- }
- case DNLD_SEQ_RAW:
- {
- psDnldContext->cur_dnld_state =
- (uint8_t) phDnld_Reset_State;
- psDnldContext->next_dnld_state =
- (uint8_t)phDnld_Upgrade_State;
- psDnldContext->cur_dnld_seq =
- (uint8_t)phDnld_Raw_Upgrade;
+ (uint8_t)phDnld_Upgrade_Section;
psDnldContext->next_dnld_seq =
psDnldContext->cur_dnld_seq;
break;
@@ -1077,17 +944,18 @@
{
psDnldContext->next_dnld_state =
(uint8_t)phDnld_Upgrade_State;
- psDnldContext->cur_dnld_seq =
+ psDnldContext->next_dnld_seq =
(uint8_t)phDnld_Upgrade_Section;
}
else
#endif /* NXP_FW_DNLD_CHECK_PHASE */
{
- psDnldContext->next_dnld_state =
- (uint8_t) phDnld_Unlock_State;
- psDnldContext->cur_dnld_seq =
+ psDnldContext->next_dnld_state =
+ (uint8_t) phDnld_Unlock_State;
+ psDnldContext->cur_dnld_seq =
(uint8_t) phDnld_Activate_Patch;
}
+
psDnldContext->next_dnld_seq =
psDnldContext->cur_dnld_seq;
break;
@@ -1141,6 +1009,26 @@
psDnldContext->cur_dnld_seq ;
break;
}
+#if 0
+ case DNLD_UPDATE_STATE1:
+ {
+ prev_temp_state = (uint8_t) psDnldContext->cur_dnld_state;
+ psDnldContext->cur_dnld_state =
+ psDnldContext->next_dnld_state;
+ /* psDnldContext->next_dnld_state =
+ (uint8_t)phDnld_Invalid_State ; */
+ break;
+ }
+ case DNLD_ROLLBACK_STATE1:
+ {
+ psDnldContext->cur_dnld_state = (uint8_t) prev_temp_state;
+ /* psDnldContext->next_dnld_state =
+ (uint8_t)phDnld_Invalid_State ; */
+ prev_temp_state = 0;
+
+ break;
+ }
+#endif
default:
{
break;
@@ -1182,36 +1070,6 @@
#endif
status = plower_if->send((void *)plower_if->pcontext,
(void *)pHwRef, pdata, length);
-
-#if defined(FW_DOWNLOAD_TIMER) && \
- (FW_DOWNLOAD_TIMER == 2)
- if (
- (NFCSTATUS_PENDING == status)
- && ( NXP_INVALID_TIMER_ID != psDnldContext->timer_id )
- )
- {
- psDnldContext->dnld_timeout = NXP_DNLD_COMPLETE_TIMEOUT;
-
- if ( psDnldContext->dnld_timeout
- < DNLD_DEFAULT_RESPONSE_TIMEOUT)
- {
- psDnldContext->dnld_timeout
- = DNLD_DEFAULT_RESPONSE_TIMEOUT;
- }
- /* Start the Download Timer */
- phOsalNfc_Timer_Start( psDnldContext->timer_id,
- psDnldContext->dnld_timeout,
- (ppCallBck_t) phDnldNfc_Abort
-#ifdef NFC_TIMER_CONTEXT
- , (void *) psDnldContext
-#endif
- );
-
- DNLD_DEBUG(" DNLD : Timer %X Started ", psDnldContext->timer_id);
- DNLD_DEBUG(" \t\t With %U Timeout \n", psDnldContext->dnld_timeout);
- }
-
-#endif /* (NXP_NFC_DNLD_TIMER == 1) */
}
return status;
@@ -1267,10 +1125,8 @@
)
{
NFCSTATUS status = NFCSTATUS_SUCCESS;
- phDnldNfc_sData_t *p_dnld_data =
- (phDnldNfc_sData_t *)psDnldContext->dnld_data;
- phDnldNfc_sParam_t *p_data_param =
- &p_dnld_data->param_info.data_param;
+ phDnldNfc_sParam_t *p_dnld_data =
+ &psDnldContext->dnld_data.param_info.data_param;
uint32_t read_addr = (p_sec_info->p_sec_hdr->section_address
+ p_sec_info->section_offset);
static unsigned sec_type = 0;
@@ -1280,7 +1136,7 @@
sec_type = (unsigned int)p_sec_info->p_sec_hdr->section_mem_type;
if( ( FALSE == p_sec_info->section_read )
- && ((sec_type & DNLD_TRIM_MASK))
+ && (TRUE == ((section_type_t *)(&sec_type))->trim_val)
&& (FALSE == p_sec_info->trim_write) )
{
read_size = (uint16_t) p_sec_info->p_sec_hdr->section_length;
@@ -1288,9 +1144,8 @@
}
else
{
- if (( FALSE == p_sec_info->section_read )
- && ((sec_type & DNLD_VERIFY_MASK))
- )
+ if (( FALSE == p_sec_info->section_read )
+ && (TRUE == ((section_type_t *)(&sec_type))->verify_mem ))
{
read_size = (uint16_t)(psDnldContext->prev_dnld_size );
DNLD_DEBUG(" FW_DNLD: Section Read = %X \n", read_size);
@@ -1317,24 +1172,24 @@
read_size = (uint16_t)((PHDNLD_DATA_SIZE >= read_size)?
read_size: PHDNLD_DATA_SIZE);
- p_dnld_data->frame_length[i] = (uint8_t)0;
+ psDnldContext->dnld_data.frame_length[i] = (uint8_t)0;
/* Update the LSB of the Data and the Address Parameter*/
- p_data_param->data_addr[i] = (uint8_t)((read_addr >>
+ p_dnld_data->data_addr[i] = (uint8_t)((read_addr >>
(BYTE_SIZE + BYTE_SIZE)) & BYTE_MASK);
- p_data_param->data_len[i] = (uint8_t)((read_size >>
+ p_dnld_data->data_len[i] = (uint8_t)((read_size >>
BYTE_SIZE) & BYTE_MASK);
i++;
- p_dnld_data->frame_length[i] = (uint8_t)
+ psDnldContext->dnld_data.frame_length[i] = (uint8_t)
( PHDNLD_CMD_READ_LEN & BYTE_MASK);
/* Update the 2nd byte of the Data and the Address Parameter*/
- p_data_param->data_addr[i] = (uint8_t)((read_addr >>
+ p_dnld_data->data_addr[i] = (uint8_t)((read_addr >>
BYTE_SIZE) & BYTE_MASK);
- p_data_param->data_len[i] = (uint8_t) (read_size & BYTE_MASK);
+ p_dnld_data->data_len[i] = (uint8_t) (read_size & BYTE_MASK);
i++;
/* Update the 3rd byte of the the Address Parameter*/
- p_data_param->data_addr[i] = (uint8_t)(read_addr & BYTE_MASK);
+ p_dnld_data->data_addr[i] = (uint8_t)(read_addr & BYTE_MASK);
status = phDnldNfc_Send_Command( psDnldContext, pHwRef,
PHDNLD_CMD_READ, NULL , 0 );
@@ -1363,10 +1218,8 @@
)
{
NFCSTATUS status = NFCSTATUS_SUCCESS;
- phDnldNfc_sData_t *p_dnld_data =
- (phDnldNfc_sData_t *)psDnldContext->dnld_data;
phDnldNfc_sParam_t *dnld_data =
- &p_dnld_data->param_info.data_param;
+ &psDnldContext->dnld_data.param_info.data_param;
uint8_t *p_sm_trim_data = (uint8_t *)psDnldContext->
dnld_resp.param_info.response_data;
uint32_t dnld_addr = 0;
@@ -1376,7 +1229,7 @@
static unsigned sec_type = 0;
uint8_t i = 0;
uint16_t dnld_size = 0;
- int cmp_val = 0x00;
+ int cmp_val = 0x00;
sec_type = (unsigned int)p_sec_info->p_sec_hdr->section_mem_type;
@@ -1386,7 +1239,7 @@
{
if( (TRUE == p_sec_info->trim_write)
&& (TRUE == p_sec_info->section_read)
- && ((sec_type & DNLD_VERIFY_MASK))
+ && (TRUE == ((section_type_t *)(&sec_type))->verify_mem )
)
{
if(NULL != psDnldContext->trim_store.buffer)
@@ -1415,7 +1268,7 @@
else
{
if((NULL != psDnldContext->dnld_store.buffer)
- && ((sec_type & DNLD_VERIFY_MASK))
+ && (TRUE == ((section_type_t *)(&sec_type))->verify_mem )
&& (TRUE == p_sec_info->section_write)
&& (TRUE == p_sec_info->section_read)
)
@@ -1480,6 +1333,7 @@
if (dnld_size != 0)
{
+
dnld_size = (uint16_t)((PHDNLD_DATA_SIZE >= dnld_size)?
dnld_size: PHDNLD_DATA_SIZE);
@@ -1488,7 +1342,7 @@
(BYTE_SIZE + BYTE_SIZE)) & BYTE_MASK);
dnld_data->data_len[i] = (uint8_t)((dnld_size >> BYTE_SIZE)
& BYTE_MASK);
- p_dnld_data->frame_length[i] = (uint8_t)
+ psDnldContext->dnld_data.frame_length[i] = (uint8_t)
(((dnld_size + PHDNLD_CMD_WRITE_MIN_LEN) >> BYTE_SIZE)
& BYTE_MASK);
i++;
@@ -1496,16 +1350,16 @@
dnld_data->data_addr[i] = (uint8_t)((dnld_addr >> BYTE_SIZE)
& BYTE_MASK);
dnld_data->data_len[i] = (uint8_t) (dnld_size & BYTE_MASK);
- p_dnld_data->frame_length[i] = (uint8_t) ((dnld_size +
+ psDnldContext->dnld_data.frame_length[i] = (uint8_t) ((dnld_size +
PHDNLD_CMD_WRITE_MIN_LEN) & BYTE_MASK);
i++;
/* Update the 3rd byte of the the Address Parameter*/
dnld_data->data_addr[i] = (uint8_t)(dnld_addr & BYTE_MASK);
(void)memcpy( dnld_data->data_packet,
- (p_sec_info->p_sec_data + *p_sec_offset), dnld_size );
+ (p_sec_info->p_sec_data + *p_sec_offset), dnld_size );
- if( ((sec_type & DNLD_TRIM_MASK))
+ if((TRUE == ((section_type_t *)(&sec_type))->trim_val )
&& (p_sec_info->sec_verify_retry != 0)
&& (NULL != psDnldContext->trim_store.buffer)
)
@@ -1513,7 +1367,7 @@
(void)memcpy( dnld_data->data_packet,
psDnldContext->trim_store.buffer, dnld_size );
}
- else if(((sec_type & DNLD_TRIM_MASK))
+ else if((TRUE == ((section_type_t *)(&sec_type))->trim_val )
&& ( TRUE == p_sec_info->section_read )
)
{
@@ -1563,14 +1417,8 @@
psDnldContext->trim_store.buffer = NULL;
psDnldContext->trim_store.length = 0;
}
-#if 1
- (void)
- phDnldNfc_Allocate_Resource((void **)
- &(psDnldContext->trim_store.buffer),dnld_size);
-#else
psDnldContext->trim_store.buffer =
(uint8_t *) phOsalNfc_GetMemory(dnld_size);
-#endif
if(NULL != psDnldContext->trim_store.buffer)
{
@@ -1593,14 +1441,8 @@
psDnldContext->dnld_store.buffer = NULL;
psDnldContext->dnld_store.length = 0;
}
-#if 1
- (void)
- phDnldNfc_Allocate_Resource((void **)
- &(psDnldContext->dnld_store.buffer),dnld_size);
-#else
psDnldContext->dnld_store.buffer =
(uint8_t *) phOsalNfc_GetMemory(dnld_size);
-#endif
if(NULL != psDnldContext->dnld_store.buffer)
{
(void )memset((void *)psDnldContext->dnld_store.buffer,0,
@@ -1612,24 +1454,15 @@
DNLD_DEBUG(" of Size %X ", dnld_size );
}
}
-
- if(PHDNLD_FW_PATCH_SEC != psDnldContext->p_fw_hdr->fw_patch)
- {
status = phDnldNfc_Send_Command( psDnldContext, pHwRef,
PHDNLD_CMD_WRITE, NULL , 0 );
- }
- else
- {
- status = phDnldNfc_Send_Command( psDnldContext, pHwRef,
- PHDNLD_CMD_SEC_WRITE, NULL , 0 );
- }
DNLD_DEBUG(" FW_DNLD: Memory Write Status = %X \n", status);
if ( NFCSTATUS_PENDING == status )
{
psDnldContext->prev_dnld_size = dnld_size;
cmp_val = 0x00;
- if((sec_type & DNLD_TRIM_MASK))
+ if(TRUE == ((section_type_t *)(&sec_type))->trim_val )
{
p_sec_info->trim_write = TRUE;
DNLD_DEBUG(" FW_DNLD: Bytes Downloaded (Trimming Values) = %X Bytes \n",
@@ -1682,7 +1515,7 @@
p_sec_info->trim_write = FALSE;
DNLD_DEBUG(" FW_DNLD: Section %02X Download Complete\n", sec_index);
- if((sec_type & DNLD_RESET_MASK))
+ if(TRUE == ((section_type_t *)(&sec_type))->reset_required )
{
DNLD_DEBUG(" FW_DNLD: Reset After Section %02X Download \n", sec_index);
status = phDnldNfc_Send_Command( psDnldContext, pHwRef,
@@ -1751,7 +1584,7 @@
#if (ES_HW_VER <= 30)
#define NXP_DNLD_PATCH_ADDR 0x01AFFFU
#else
-#define NXP_DNLD_PATCH_ADDR 0x01A1E0U
+#define NXP_DNLD_PATCH_ADDR 0x01AFE0U
#endif
#if (ES_HW_VER <= 30)
@@ -1772,16 +1605,14 @@
{
NFCSTATUS status = NFCSTATUS_SUCCESS;
uint32_t dnld_addr = 0;
- phDnldNfc_sData_t *p_dnld_data =
- (phDnldNfc_sData_t *)psDnldContext->dnld_data;
- phDnldNfc_sParam_t *p_data_param =
- & p_dnld_data->param_info.data_param;
+ phDnldNfc_sParam_t *dnld_data = &psDnldContext->dnld_data
+ .param_info.data_param;
uint8_t *p_data = NULL;
static uint32_t patch_size = 0;
#if (ES_HW_VER == 32)
- static uint8_t patch_table[] = {0xA0, 0xA1, 0xE0, 0x80, 0xA9, 0x6C };
+ static uint8_t patch_table[] = {0xA0, 0xAF, 0xE0, 0x80, 0xA9, 0x6C };
static uint8_t patch_data[] = {0xA5, 0xD0, 0xFE, 0xA5, 0xD0, 0xFD, 0xA5,
0xD0, 0xFC, 0xA5, 0x02, 0x80, 0xA9, 0x75};
@@ -1924,25 +1755,25 @@
{
/* Update the LSB of the Data and the Address Parameter*/
- p_data_param->data_addr[i] = (uint8_t)((dnld_addr >>
+ dnld_data->data_addr[i] = (uint8_t)((dnld_addr >>
(BYTE_SIZE + BYTE_SIZE))
& BYTE_MASK);
- p_data_param->data_len[i] = (uint8_t)((patch_size >> BYTE_SIZE)
+ dnld_data->data_len[i] = (uint8_t)((patch_size >> BYTE_SIZE)
& BYTE_MASK);
- p_dnld_data->frame_length[i] = (uint8_t)
+ psDnldContext->dnld_data.frame_length[i] = (uint8_t)
(((patch_size + PHDNLD_CMD_WRITE_MIN_LEN) >> BYTE_SIZE)
& BYTE_MASK);
i++;
/* Update the 2nd byte of the Data and the Address Parameter*/
- p_data_param->data_addr[i] = (uint8_t)((dnld_addr >> BYTE_SIZE)
+ dnld_data->data_addr[i] = (uint8_t)((dnld_addr >> BYTE_SIZE)
& BYTE_MASK);
- p_data_param->data_len[i] = (uint8_t) (patch_size & BYTE_MASK);
- p_dnld_data->frame_length[i] = (uint8_t)
+ dnld_data->data_len[i] = (uint8_t) (patch_size & BYTE_MASK);
+ psDnldContext->dnld_data.frame_length[i] = (uint8_t)
((patch_size + PHDNLD_CMD_WRITE_MIN_LEN)
& BYTE_MASK);
i++;
/* Update the 3rd byte of the the Address Parameter*/
- p_data_param->data_addr[i] = (uint8_t)(dnld_addr & BYTE_MASK);
+ dnld_data->data_addr[i] = (uint8_t)(dnld_addr & BYTE_MASK);
status = phDnldNfc_Send_Command( psDnldContext, pHwRef,
PHDNLD_CMD_WRITE,(void *)p_data , (uint8_t)patch_size );
@@ -1956,386 +1787,6 @@
return status;
}
-#define FRAME_HEADER_LEN 0x03U
-
-
-static
-void
-phDnldNfc_Tx_Reset(phDnldNfc_sContext_t *psDnldContext)
-{
- psDnldContext->tx_info.transmit_frame = NULL;
- psDnldContext->tx_info.tx_total = 0x00;
- psDnldContext->tx_info.tx_offset = 0x00;
- psDnldContext->tx_info.tx_len = 0x00;
- psDnldContext->tx_info.tx_chain = FALSE;
-}
-
-STATIC
-bool_t
-phDnldNfc_Extract_Chunks(
- uint8_t *frame_data,
- uint16_t frame_offset,
- uint16_t frame_length,
- uint16_t max_frame ,
- uint16_t *chunk_length
- );
-
-
-STATIC
-bool_t
-phDnldNfc_Extract_Chunks(
- uint8_t *frame_data,
- uint16_t frame_offset,
- uint16_t frame_length,
- uint16_t max_frame ,
- uint16_t *chunk_length
- )
-{
- bool_t chunk_present = FALSE;
-
- if( 0 == frame_offset)
- {
- if( max_frame >= (frame_length
- - frame_offset))
- {
- *chunk_length = (frame_length - frame_offset);
- }
- else
- {
- *chunk_length = max_frame
- - FRAME_HEADER_LEN;
- chunk_present = TRUE;
- }
- }
- else
- {
- if( max_frame >= (frame_length
- - frame_offset))
- {
- *chunk_length = (frame_length - frame_offset);
- }
- else
- {
- *chunk_length = max_frame
- - FRAME_HEADER_LEN;
- chunk_present = TRUE;
- }
- }
-
- return chunk_present;
-}
-
-
-STATIC
-NFCSTATUS
-phDnldNfc_Send_Raw(
- phDnldNfc_sContext_t *psDnldContext,
- void *pHwRef,
- uint8_t *raw_frame,
- uint16_t frame_offset,
- uint16_t frame_length
- )
-{
- NFCSTATUS status = NFCSTATUS_SUCCESS;
- phDnldNfc_sRawHdr_t *raw_frame_hdr = ( phDnldNfc_sRawHdr_t * ) raw_frame;
-
-
- switch(raw_frame_hdr->frame_type)
- {
- case PHDNLD_CMD_RESET:
- {
- break;
- }
- case PHDNLD_CMD_READ:
- {
- /* TODO: To Update the length and the buffer to receive data */
- break;
- }
- case PHDNLD_CMD_WRITE:
- {
- phDnldNfc_sRawDataHdr_t *raw_data_hdr =
- ( phDnldNfc_sRawDataHdr_t * ) (raw_frame + FRAME_HEADER_LEN);
-
- psDnldContext->resp_length = PHDNLD_MIN_PACKET;
-
- break;
- }
- case PHDNLD_CMD_SEC_WRITE:
- {
- uint16_t tx_length = 0x00;
- uint16_t frame_offset =
- psDnldContext->tx_info.tx_offset;
- uint16_t chain =
- psDnldContext->tx_info.tx_chain;
-
- chain =
- phDnldNfc_Extract_Chunks(
- raw_frame,
- frame_offset,
- frame_length,
- PHDNLD_FW_TX_RX_LEN,
- &tx_length
- );
-
- if( TRUE == chain )
- {
- status = phDnldNfc_Send_Command( psDnldContext,
- pHwRef, PHDNLD_CMD_ENCAPSULATE,
- (raw_frame + frame_offset),
- tx_length);
- if(NFCSTATUS_PENDING == status)
- {
- psDnldContext->prev_cmd = raw_frame_hdr->frame_type;
- /* TODO: Update for the Chaining */
- psDnldContext->tx_info.tx_offset += tx_length;
- psDnldContext->tx_info.tx_chain = chain;
- }
- }
- else if (0 != frame_offset)
- {
- status = phDnldNfc_Send_Command( psDnldContext,
- pHwRef, PHDNLD_CMD_ENCAPSULATE,
- (raw_frame + frame_offset),
- tx_length);
- if(NFCSTATUS_PENDING == status)
- {
- psDnldContext->prev_cmd = raw_frame_hdr->frame_type;
- /* TODO: Update for the Chaining */
- psDnldContext->prev_dnld_size = frame_length;
- phDnldNfc_Tx_Reset(psDnldContext);
- }
- }
- else
- {
- phDnldNfc_sRawDataHdr_t *raw_data_hdr =
- ( phDnldNfc_sRawDataHdr_t * ) (raw_frame + FRAME_HEADER_LEN);
- psDnldContext->resp_length = PHDNLD_MIN_PACKET;
- }
-
- break;
- }
- case PHDNLD_CMD_CHECK:
- {
- psDnldContext->resp_length = PHDNLD_MIN_PACKET;
- break;
- }
- case PHDNLD_CMD_SET_HIF:
- {
- psDnldContext->resp_length = PHDNLD_MIN_PACKET;
- break;
- }
- case PHDNLD_CMD_ACTIVATE_PATCH:
- {
- psDnldContext->resp_length = PHDNLD_MIN_PACKET;
- break;
- }
- case PHDNLD_CMD_CHECK_INTEGRITY:
- {
- uint8_t integrity_param =
- *(raw_frame + FRAME_HEADER_LEN);
- switch(integrity_param)
- {
- case CHK_INTEGRITY_CONFIG_PAGE_CRC:
- case CHK_INTEGRITY_PATCH_TABLE_CRC:
- {
- psDnldContext->resp_length = PHDNLD_MIN_PACKET
- + CHECK_INTEGRITY_RESP_CRC16_LEN;
- break;
- }
- case CHK_INTEGRITY_FLASH_CODE_CRC:
- case CHK_INTEGRITY_PATCH_CODE_CRC:
- {
- psDnldContext->resp_length = PHDNLD_MIN_PACKET
- + CHECK_INTEGRITY_RESP_CRC32_LEN;
- break;
- }
- case CHK_INTEGRITY_COMPLETE_CRC:
- default:
- {
- psDnldContext->resp_length = PHDNLD_MIN_PACKET
- + CHECK_INTEGRITY_RESP_COMP_LEN;
- break;
- }
- }
- break;
- }
- default:
- {
- status = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_FEATURE_NOT_SUPPORTED);
- break;
- }
- }
-
- if (NFCSTATUS_SUCCESS == status)
- {
- status = phDnldNfc_Send( psDnldContext, pHwRef ,
- raw_frame, frame_length);
-
- if(NFCSTATUS_PENDING == status)
- {
- psDnldContext->prev_cmd = raw_frame_hdr->frame_type;
- /* TODO: Update for the Chaining */
- psDnldContext->prev_dnld_size = frame_length;
- }
- }
-
- return status;
-}
-
-
-static
-NFCSTATUS
-phDnldNfc_Frame_Complete(phDnldNfc_sContext_t *psDnldContext)
-{
- NFCSTATUS status = NFCSTATUS_SUCCESS;
- phDnldNfc_sData_Hdr_t *p_dnld_raw = NULL;
- uint32_t dnld_index = psDnldContext->dnld_index;
- uint8_t *p_raw_sec_hdr = NULL;
- uint16_t tx_length = 0x00;
-
- dnld_index = dnld_index + psDnldContext->prev_dnld_size;
- p_raw_sec_hdr = psDnldContext->p_fw_raw + dnld_index;
- dnld_index = dnld_index + *p_raw_sec_hdr;
-
- p_dnld_raw = (phDnldNfc_sData_Hdr_t *) (psDnldContext->p_fw_raw +
- psDnldContext->dnld_index);
-
- tx_length = ((p_dnld_raw->frame_length[0] << BYTE_SIZE) |
- p_dnld_raw->frame_length[1]);
-
- tx_length = tx_length + PHDNLD_MIN_PACKET;
-
- return status;
-}
-
-
-static
-NFCSTATUS
-phDnldNfc_Raw_Write(
- phDnldNfc_sContext_t *psDnldContext,
- void *pHwRef
- )
-{
- NFCSTATUS status = NFCSTATUS_SUCCESS;
- uint32_t dnld_index = psDnldContext->dnld_index;
- uint32_t tx_length = 0;
- uint8_t *p_raw_sec_hdr = NULL;
- uint8_t dnld_flag = FALSE;
- uint8_t skip_frame = FALSE;
-
- if(NULL != psDnldContext->p_fw_raw)
- {
-
- if( (TRUE != psDnldContext->tx_info.tx_chain)
- && (0x00 == psDnldContext->dnld_retry)
- )
- {
- dnld_index = dnld_index + psDnldContext->prev_dnld_size;
- p_raw_sec_hdr = psDnldContext->p_fw_raw + dnld_index;
- dnld_index = dnld_index + *p_raw_sec_hdr;
- }
- else
- {
-
- phDnldNfc_sData_Hdr_t *p_dnld_raw = (phDnldNfc_sData_Hdr_t *)
- (psDnldContext->p_fw_raw +
- psDnldContext->dnld_index);
-
- tx_length = ((p_dnld_raw->frame_length[0] << BYTE_SIZE) |
- p_dnld_raw->frame_length[1]);
-
- tx_length = tx_length + PHDNLD_MIN_PACKET;
-
- status = phDnldNfc_Send_Raw( psDnldContext, pHwRef,
- (uint8_t *)(p_dnld_raw),
- psDnldContext->tx_info.tx_offset,
- (uint16_t)tx_length);
- }
-
-
-#define PHDNLD_MAJOR_OFFSET 0x04U
-#define PHDNLD_MINOR_OFFSET 0x05U
-#define PHDNLD_PHASE_OFFSET 0x06U
-#define PHDNLD_FRAMETYPE_OFFSET 0x07U
-
-#define PHDNLD_NO_OPERATION 0x00U
-#define PHDNLD_NORMAL_OPERATION 0x10U
-#define PHDNLD_ADVANCED_OPERATION 0x20U
-#define PHDNLD_SETUP_OPERATION 0x40U
-#define PHDNLD_RECOVER_OPERATION 0x80U
-#define PHDNLD_COMPLETE_OPERATION 0xF0U
-
-#define PHDNLD_TERMINATE_TYPE 0x0EU
-
-#define PHDNLD_MARKER_MASK 0x0FU
-
- while((NFCSTATUS_SUCCESS == status )
- && (FALSE == dnld_flag)
- )
- {
- phDnldNfc_sData_Hdr_t *p_dnld_raw = (phDnldNfc_sData_Hdr_t *)
- (psDnldContext->p_fw_raw + dnld_index);
- uint8_t frame_type = *(p_raw_sec_hdr + PHDNLD_FRAMETYPE_OFFSET);
-
- tx_length = ((p_dnld_raw->frame_length[0] << BYTE_SIZE) |
- p_dnld_raw->frame_length[1]);
-
- tx_length = tx_length + PHDNLD_MIN_PACKET;
-
- skip_frame = FALSE;
-
- if( (0x00 == *(p_raw_sec_hdr + PHDNLD_PHASE_OFFSET))
- || (0xFF == *(p_raw_sec_hdr + PHDNLD_PHASE_OFFSET))
- || !( psDnldContext->raw_mode_upgrade
- & (frame_type & (~PHDNLD_MARKER_MASK)) )
- )
- {
- dnld_index = dnld_index + tx_length;
- p_raw_sec_hdr = psDnldContext->p_fw_raw + dnld_index;
- dnld_index = dnld_index + *p_raw_sec_hdr;
- skip_frame = TRUE;
- }
- if (PHDNLD_TERMINATE_TYPE ==
- (frame_type & PHDNLD_MARKER_MASK))
- {
- if(TRUE != skip_frame)
- {
- psDnldContext->raw_mode_upgrade =
- (psDnldContext->raw_mode_upgrade &
- ~(frame_type & ~PHDNLD_MARKER_MASK)) ;
- }
-
- if(PHDNLD_NO_OPERATION ==
- psDnldContext->raw_mode_upgrade)
- {
- dnld_flag = TRUE;
- }
- }
- else
- {
-
- }
-
- if((FALSE == skip_frame)
- && (FALSE == dnld_flag)
- )
- {
- status = phDnldNfc_Send_Raw( psDnldContext, pHwRef,
- (uint8_t *)(p_dnld_raw),
- psDnldContext->tx_info.tx_offset,
- (uint16_t)tx_length);
- }
-
- if( NFCSTATUS_PENDING == status )
- {
- psDnldContext->dnld_index = dnld_index;
- psDnldContext->cur_frame_info= frame_type;
- }
- }
- }
-
- return status;
-}
static
NFCSTATUS
@@ -2347,18 +1798,13 @@
)
{
NFCSTATUS status = NFCSTATUS_SUCCESS;
+ /* section_info_t *p_cur_sec = psDnldContext->p_fw_sec +
+ psDnldContext->section_index; */
PHNFC_UNUSED_VARIABLE(pdata);
PHNFC_UNUSED_VARIABLE(length);
- if(phDnld_Raw_Upgrade == psDnldContext->cur_dnld_seq)
- {
- status = phDnldNfc_Raw_Write( psDnldContext, pHwRef );
- }
- else
- {
status = phDnldNfc_Resume_Write( psDnldContext, pHwRef );
- }
return status;
}
@@ -2377,7 +1823,7 @@
NFCSTATUS status = NFCSTATUS_SUCCESS;
phDnldNfc_eState_t dnld_next_state = (phDnldNfc_eState_t)
psDnldContext->cur_dnld_state;
- phNfc_sCompletionInfo_t comp_info = {0};
+ phNfc_sCompletionInfo_t comp_info = {0,0,0};
switch( dnld_next_state )
{
@@ -2505,7 +1951,7 @@
{
if (crc_i < DNLD_CRC16_SIZE )
{
- patch_table_crc = patch_table_crc
+ patch_table_crc = patch_table_crc
| psDnldContext->chk_integrity_crc.patch_table.Chk_Crc16[crc_i]
<< (crc_i * BYTE_SIZE) ;
}
@@ -2572,14 +2018,12 @@
psDnldContext->lower_interface.pcontext, pHwRef);
phDnldNfc_Release_Lower(psDnldContext, pHwRef);
phDnldNfc_Release_Resources(&psDnldContext);
-#ifndef NFC_TIMER_CONTEXT
- gpphDnldContext = psDnldContext;
-#endif
/* Notify the Error/Success Scenario to the upper layer */
phDnldNfc_Notify( p_upper_notify, p_upper_context, pHwRef, (uint8_t)
((NFCSTATUS_SUCCESS == comp_info.status )? NFC_IO_SUCCESS: NFC_IO_ERROR),
&comp_info );
}
+
return status;
}
@@ -2597,19 +2041,20 @@
(phDnldNfc_sData_Hdr_t *) pdata;
PHNFC_UNUSED_VARIABLE(pHwRef);
- DNLD_DEBUG(" FW_DNLD: Receive Length = %X \n", length );
- if(( psDnldContext->rx_info.rx_total == 0 )
+ /* DNLD_DEBUG(" FW_DNLD: Receive Length = %X \n", length ); */
+ if(( psDnldContext->rx_total == 0 )
&& (PHDNLD_MIN_PACKET <= length)
+ /* && (FALSE == psDnldContext->recv_pending) */
)
{
- psDnldContext->rx_info.rx_total =
+ psDnldContext->rx_total =
((uint16_t)resp_data->frame_length[0] << BYTE_SIZE)|
resp_data->frame_length[1];
- if( psDnldContext->rx_info.rx_total + PHDNLD_MIN_PACKET == length )
+ if( psDnldContext->rx_total + PHDNLD_MIN_PACKET == length )
{
DNLD_DEBUG(" FW_DNLD: Success Memory Read = %X \n",
- psDnldContext->rx_info.rx_total);
+ psDnldContext->rx_total);
#ifndef DNLD_SUMMARY
/* DNLD_PRINT_BUFFER("Receive Buffer",pdata,length); */
#endif
@@ -2619,11 +2064,13 @@
{
/* status = phDnldNfc_Receive( psDnldContext, pHwRef,
psDnldContext->p_resp_buffer,
- (uint8_t)((psDnldContext->rx_info.rx_total <= PHDNLD_MAX_PACKET)?
- psDnldContext->rx_info.rx_total: PHDNLD_MAX_PACKET) ); */
+ (uint8_t)((psDnldContext->rx_total <= PHDNLD_MAX_PACKET)?
+ psDnldContext->rx_total: PHDNLD_MAX_PACKET) );
+ psDnldContext->recv_pending =
+ (uint8_t)( NFCSTATUS_PENDING == status); */
DNLD_PRINT(" FW_DNLD: Invalid Receive length ");
DNLD_DEBUG(": Length Expected = %X \n",
- (psDnldContext->rx_info.rx_total + PHDNLD_MIN_PACKET));
+ (psDnldContext->rx_total + PHDNLD_MIN_PACKET));
status = PHNFCSTVAL( CID_NFC_DNLD,
NFCSTATUS_INVALID_RECEIVE_LENGTH );
}
@@ -2631,7 +2078,7 @@
else
{
/*TODO:*/
- psDnldContext->rx_info.rx_total = 0 ;
+ psDnldContext->rx_total = 0 ;
status = PHNFCSTVAL( CID_NFC_DNLD,
NFCSTATUS_INVALID_RECEIVE_LENGTH );
}
@@ -2653,7 +2100,7 @@
void *pdata = NULL ;
phDnldNfc_sData_Hdr_t *resp_data = NULL;
uint16_t length = 0 ;
- phNfc_sCompletionInfo_t comp_info = {0};
+ phNfc_sCompletionInfo_t comp_info = {0,0,0};
DNLD_PRINT("\n FW_DNLD: Receive Response .... ");
if ( (NULL != psContext)
@@ -2666,7 +2113,6 @@
status = pInfo->status ;
length = pInfo->length ;
pdata = pInfo->buffer;
-
if(status != NFCSTATUS_SUCCESS)
{
DNLD_DEBUG(" Failed. Status = %02X\n",status);
@@ -2678,10 +2124,9 @@
/* Handle the Error Scenario */
status = PHNFCSTVAL( CID_NFC_DNLD, NFCSTATUS_FAILED );
}
- else if ((0 == length)
- || (PHDNLD_MIN_PACKET > length ))
+ else if (0 == length)
{
- DNLD_DEBUG(" Receive Response Length = %u .... \n",length);
+ DNLD_PRINT(" Receive Response Length = 0 .... \n");
/* Handle the Error Scenario */
#ifndef HAL_SW_DNLD_RLEN
status = PHNFCSTVAL( CID_NFC_DNLD,
@@ -2691,15 +2136,6 @@
else
{
-#if defined(FW_DOWNLOAD_TIMER) && \
- (FW_DOWNLOAD_TIMER == 2)
- if ( NXP_INVALID_TIMER_ID != psDnldContext->timer_id )
- {
- phOsalNfc_Timer_Stop( psDnldContext->timer_id );
- }
-
-#endif
-
#ifndef DNLD_SUMMARY
DNLD_PRINT_BUFFER("Receive Buffer",pdata,length);
#endif
@@ -2718,9 +2154,6 @@
{
case PHDNLD_CMD_READ :
{
- if( PHDNLD_NO_OPERATION
- == psDnldContext->raw_mode_upgrade)
- {
status = phDnldNfc_Process_Response(
psDnldContext, pHwRef, pdata , length);
@@ -2730,18 +2163,10 @@
psDnldContext->dnld_retry = NXP_MAX_DNLD_RETRY;
/* psDnldContext->dnld_retry < NXP_MAX_DNLD_RETRY */
}
- }
- else
- {
-
- }
break;
}
case PHDNLD_CMD_CHECK_INTEGRITY :
{
- if( PHDNLD_NO_OPERATION
- == psDnldContext->raw_mode_upgrade)
- {
#if (NXP_FW_INTEGRITY_CHK >= 0x01)
phDnldNfc_sChkCrcComplete_t *p_dnld_crc_all =
&psDnldContext->chk_integrity_crc;
@@ -2786,16 +2211,8 @@
break;
}
}
+
#endif /* #if (NXP_FW_INTEGRITY_CHK >= 0x01) */
- }
- else
- {
- psDnldContext->raw_mode_upgrade =
- (PHDNLD_SETUP_OPERATION | PHDNLD_ADVANCED_OPERATION);
- /* psDnldContext->raw_mode_upgrade =
- (psDnldContext->raw_mode_upgrade &
- ( psDnldContext->cur_frame_info & ~PHDNLD_MARKER_MASK )); */
- }
break;
}
case PHDNLD_CMD_WRITE:
@@ -2803,18 +2220,10 @@
psDnldContext->dnld_retry = 0;
break;
}
- case PHDNLD_CMD_SEC_WRITE:
- {
- psDnldContext->dnld_retry = 0;
- break;
- }
case PHDNLD_CMD_ACTIVATE_PATCH:
case PHDNLD_CMD_CHECK:
default:
{
- if( PHDNLD_NO_OPERATION
- == psDnldContext->raw_mode_upgrade)
- {
if( ( (PHDNLD_MIN_PACKET > length)
|| ( 0 != resp_length) )
)
@@ -2827,20 +2236,14 @@
{
psDnldContext->dnld_retry = 0;
}
- }
- else
- {
- psDnldContext->raw_mode_upgrade =
- (psDnldContext->raw_mode_upgrade & ~PHDNLD_RECOVER_OPERATION);
- }
break;
}
} /* End of the Previous Command Switch Case */
break;
}/* Case PHDNLD_RESP_SUCCESS*/
case PHDNLD_RESP_TIMEOUT:
- case PHDNLD_RESP_CRC_ERROR:
case PHDNLD_RESP_WRITE_ERROR:
+ case PHDNLD_RESP_CRC_ERROR:
{
if(psDnldContext->dnld_retry < NXP_MAX_DNLD_RETRY )
{
@@ -2852,139 +2255,22 @@
}
/* fall through */
case PHDNLD_RESP_ACCESS_DENIED:
+ case PHDNLD_RESP_PROTOCOL_ERROR:
case PHDNLD_RESP_INVALID_PARAMETER:
case PHDNLD_RESP_INVALID_LENGTH:
- /* Initial Frame Checksum */
- case PHDNLD_RESP_CHKSUM_ERROR:
- case PHDNLD_RESP_MEMORY_UPDATE_ERROR:
{
psDnldContext->dnld_retry = NXP_MAX_DNLD_RETRY;
status = PHNFCSTVAL(CID_NFC_DNLD,
resp_data->frame_type);
break;
}
- case PHDNLD_RESP_PROTOCOL_ERROR:
- {
- if(( PHDNLD_NO_OPERATION
- == psDnldContext->raw_mode_upgrade)
- || ( PHDNLD_ADVANCED_OPERATION
- == psDnldContext->raw_mode_upgrade)
- )
- {
- psDnldContext->dnld_retry = NXP_MAX_DNLD_RETRY;
- status = PHNFCSTVAL(CID_NFC_DNLD,
- NFCSTATUS_INVALID_FORMAT);
- }
- else if( (PHDNLD_NORMAL_OPERATION
- & psDnldContext->raw_mode_upgrade)
- )
- {
- psDnldContext->raw_mode_upgrade =
- (psDnldContext->raw_mode_upgrade & ~PHDNLD_NORMAL_OPERATION);
- }
- else if ( PHDNLD_RECOVER_OPERATION
- & psDnldContext->raw_mode_upgrade )
- {
- psDnldContext->dnld_retry = NXP_MAX_DNLD_RETRY;
- status = PHNFCSTVAL(CID_NFC_DNLD,
- NFCSTATUS_INVALID_FORMAT);
- }
- else
- {
- psDnldContext->raw_mode_upgrade =
- (psDnldContext->raw_mode_upgrade &
- ~( psDnldContext->cur_frame_info & ~PHDNLD_MARKER_MASK ));
- }
- break;
- }
- case PHDNLD_RESP_VERSION_UPTODATE:
- {
- /* TODO: to make sure that the Advance Frames are sent to get
- * the updated status */
- if ( PHDNLD_ADVANCED_OPERATION
- == psDnldContext->raw_mode_upgrade)
- {
- status = ( CID_NFC_DNLD << BYTE_SIZE ) ;
- }
- else if ( PHDNLD_NO_OPERATION
- != psDnldContext->raw_mode_upgrade)
- {
-
- psDnldContext->raw_mode_upgrade =
- (psDnldContext->raw_mode_upgrade &
- ~( psDnldContext->cur_frame_info & ~PHDNLD_MARKER_MASK ));
- }
- else
- {
- }
- break;
- }
- case PHDNLD_RESP_CMD_NOT_SUPPORTED:
- {
-
- if ( PHDNLD_NO_OPERATION
- == psDnldContext->raw_mode_upgrade)
- {
- status = PHNFCSTVAL(CID_NFC_DNLD,
- NFCSTATUS_FEATURE_NOT_SUPPORTED);
- }
- else if ( PHDNLD_ADVANCED_OPERATION
- == psDnldContext->raw_mode_upgrade)
- {
- status = PHNFCSTVAL(CID_NFC_DNLD,
- NFCSTATUS_FEATURE_NOT_SUPPORTED);
- }
-#if 0
- else if( (PHDNLD_NORMAL_OPERATION
- & psDnldContext->raw_mode_upgrade)
- )
- {
- psDnldContext->raw_mode_upgrade =
- (psDnldContext->raw_mode_upgrade & ~PHDNLD_NORMAL_OPERATION);
- }
- else if ( PHDNLD_SETUP_OPERATION
- & psDnldContext->raw_mode_upgrade )
- {
- psDnldContext->raw_mode_upgrade =
- (psDnldContext->raw_mode_upgrade & ~PHDNLD_SETUP_OPERATION);
- }
-#endif
- else
- {
- psDnldContext->raw_mode_upgrade =
- (psDnldContext->raw_mode_upgrade &
- ~( psDnldContext->cur_frame_info & ~PHDNLD_MARKER_MASK ));
- }
- break;
- }
- /* The Chaining of the Command Frame
- was Successful in the Download Mode */
- case PHDNLD_RESP_CHAINING_SUCCESS:
- {
- /* TODO: Handle the Corner Case Scenarios
- * the updated status */
- psDnldContext->dnld_retry = 0x00;
- break;
- }
-/* The Error during the Chaining the Command Frame in the Download Mode */
- case PHDNLD_RESP_CHAINING_ERROR:
- {
- /* TODO: Restart the Chunk in Corner Case
- * the updated status */
- psDnldContext->dnld_retry++;
- phDnldNfc_Tx_Reset(psDnldContext);
- break;
- }
-/* The Command is not allowed anymore in the Download Mode */
- case PHDNLD_RESP_CMD_NOT_ALLOWED:
default:
{
psDnldContext->dnld_retry = NXP_MAX_DNLD_RETRY;
status = PHNFCSTVAL(CID_NFC_DNLD,
- NFCSTATUS_NOT_ALLOWED);
+ NFCSTATUS_FEATURE_NOT_SUPPORTED);
break;
}
-
} /* End of the Response Frame Type Switch */
if (NFCSTATUS_PENDING != status)
@@ -3003,57 +2289,10 @@
psDnldContext->lower_interface.pcontext, pHwRef);
phDnldNfc_Release_Lower(psDnldContext, pHwRef);
phDnldNfc_Release_Resources(&psDnldContext);
-#ifndef NFC_TIMER_CONTEXT
- gpphDnldContext = psDnldContext;
-#endif
/* Notify the Error/Success Scenario to the upper layer */
phDnldNfc_Notify( p_upper_notify, p_upper_context, pHwRef,
(uint8_t) NFC_IO_ERROR, &comp_info );
}
- else if ( (NFCSTATUS_SUCCESS != status) &&
- (NFCSTATUS_SUCCESS == PHNFCSTATUS(status))
- )
- {
- pphNfcIF_Notification_CB_t p_upper_notify =
- psDnldContext->p_upper_notify;
- void *p_upper_context =
- psDnldContext->p_upper_context;
-
- comp_info.status = NFCSTATUS_SUCCESS;
- DNLD_DEBUG(" FW_DNLD: Termination in Receive, Status = %X \n", status);
- status = phDal4Nfc_Unregister(
- psDnldContext->lower_interface.pcontext, pHwRef);
- phDnldNfc_Release_Lower(psDnldContext, pHwRef);
- phDnldNfc_Release_Resources(&psDnldContext);
-#ifndef NFC_TIMER_CONTEXT
- gpphDnldContext = psDnldContext;
-#endif
- /* Notify the Error/Success Scenario to the upper layer */
- phDnldNfc_Notify( p_upper_notify, p_upper_context, pHwRef,
- (uint8_t) NFC_IO_SUCCESS, &comp_info );
-
- }
- else if (NFCSTATUS_FEATURE_NOT_SUPPORTED == PHNFCSTATUS(status))
- {
- pphNfcIF_Notification_CB_t p_upper_notify =
- psDnldContext->p_upper_notify;
- void *p_upper_context =
- psDnldContext->p_upper_context;
-
- comp_info.status = status;
- DNLD_DEBUG(" FW_DNLD: Termination in Receive, Status = %X \n", status);
- status = phDal4Nfc_Unregister(
- psDnldContext->lower_interface.pcontext, pHwRef);
- phDnldNfc_Release_Lower(psDnldContext, pHwRef);
- phDnldNfc_Release_Resources(&psDnldContext);
-#ifndef NFC_TIMER_CONTEXT
- gpphDnldContext = psDnldContext;
-#endif
- /* Notify the Error/Success Scenario to the upper layer */
- phDnldNfc_Notify( p_upper_notify, p_upper_context, pHwRef,
- (uint8_t) NFC_IO_SUCCESS, &comp_info );
-
- }
else
{
/* DNLD_PRINT(" FW_DNLD: Successful.\n"); */
@@ -3103,28 +2342,22 @@
if ((PHDNLD_CMD_SET_HIF != psDnldContext->prev_cmd)
&& (PHDNLD_CMD_RESET != psDnldContext->prev_cmd))
{
- psDnldContext->rx_info.rx_total = 0;
+ psDnldContext->rx_total = 0;
status = phDnldNfc_Receive( psDnldContext, pHwRef,
(uint8_t *)(&psDnldContext->dnld_resp),
psDnldContext->resp_length);
+ /* psDnldContext->recv_pending =
+ (uint8_t)( NFCSTATUS_PENDING == status); */
}
else
{
psDnldContext->resp_length = 0;
psDnldContext->dnld_retry = 0;
- if( PHDNLD_CMD_RESET == psDnldContext->prev_cmd )
- {
- DO_DELAY(PHDNLD_DNLD_DELAY);
- }
-#if defined(FW_DOWNLOAD_TIMER) && \
- (FW_DOWNLOAD_TIMER == 2)
-
- if ( NXP_INVALID_TIMER_ID != psDnldContext->timer_id )
- {
- phOsalNfc_Timer_Stop( psDnldContext->timer_id );
- }
-#endif
-
+ /* clock unstable after SW reset command, especially on UART
+ * platform because of its sensitivity to clock. Experimentally
+ * we found clock unstable for 750us. Delay for 5ms to be sure.
+ */
+ usleep(5000);
status = phDnldNfc_Set_Seq(psDnldContext,
DNLD_SEQ_UPDATE);
}
@@ -3140,7 +2373,6 @@
}
-
STATIC
NFCSTATUS
phDnldNfc_Send_Command(
@@ -3155,8 +2387,6 @@
uint16_t tx_length = 0;
uint16_t rx_length = 0;
uint8_t **pp_resp_data = &psDnldContext->p_resp_buffer;
- phDnldNfc_sData_t *p_dnld_data =
- (phDnldNfc_sData_t *)psDnldContext->dnld_data;
switch(cmd)
{
@@ -3168,10 +2398,8 @@
}
case PHDNLD_CMD_READ:
{
- phDnldNfc_sData_t *p_dnld_data =
- (phDnldNfc_sData_t *)psDnldContext->dnld_data;
phDnldNfc_sParam_t *param_info = /* (phDnldNfc_sParam_t *)params */
- &p_dnld_data->param_info.data_param;
+ &psDnldContext->dnld_data.param_info.data_param;
tx_length = PHDNLD_CMD_READ_LEN;
if (NULL != *pp_resp_data)
{
@@ -3182,18 +2410,21 @@
<< BYTE_SIZE) + param_info->data_len[1]);
psDnldContext->resp_length =
- (( rx_length + PHDNLD_MIN_PACKET ));
+#if 0
+ (((rx_length > PHDNLD_DATA_SIZE)?
+ PHDNLD_DATA_SIZE + PHDNLD_MIN_PACKET:
+#else
+ ((
+#endif
+ rx_length + PHDNLD_MIN_PACKET ));
(void)phDnldNfc_Allocate_Resource( (void **) pp_resp_data,
rx_length);
break;
}
case PHDNLD_CMD_WRITE:
- case PHDNLD_CMD_SEC_WRITE:
{
- phDnldNfc_sData_t *p_dnld_data =
- (phDnldNfc_sData_t *)psDnldContext->dnld_data;
phDnldNfc_sParam_t *param_info = /* (phDnldNfc_sParam_t *)params */
- &p_dnld_data->param_info.data_param;
+ &psDnldContext->dnld_data.param_info.data_param;
tx_length = (uint16_t) (((uint16_t)param_info->data_len[0]
<< BYTE_SIZE) + param_info->data_len[1]
+ PHDNLD_CMD_WRITE_MIN_LEN );
@@ -3211,36 +2442,6 @@
psDnldContext->resp_length = PHDNLD_MIN_PACKET;
break;
}
- case PHDNLD_CMD_ENCAPSULATE:
- {
- uint8_t i = 0x00;
- if ((0 != param_length) && (NULL != params))
- {
- p_dnld_data->frame_type =
- PHDNLD_CMD_ENCAPSULATE;
- (void)memcpy((void *)( ((uint8_t *)p_dnld_data)
- + PHDNLD_FRAME_DATA_OFFSET)
- , params, param_length);
- tx_length = param_length;
-
- p_dnld_data->frame_length[i++] =
- (uint8_t)(tx_length >> BYTE_SIZE);
- p_dnld_data->frame_length[i] =
- (uint8_t)( tx_length & BYTE_MASK );
- tx_length += PHDNLD_FRAME_DATA_OFFSET;
-
- psDnldContext->resp_length = PHDNLD_MIN_PACKET;
-
- status = phDnldNfc_Send( psDnldContext, pHwRef ,
- (uint8_t *)p_dnld_data, tx_length);
- }
- else
- {
- status = PHNFCSTVAL(CID_NFC_DNLD,
- NFCSTATUS_NOT_ALLOWED);
- }
- break;
- }
case PHDNLD_CMD_SET_HIF:
{
tx_length++;
@@ -3252,14 +2453,14 @@
psDnldContext->resp_length = PHDNLD_MIN_PACKET;
if ((NULL != params) && ( param_length > 0 ))
{
- p_dnld_data->param_info.cmd_param =
+ psDnldContext->dnld_data.param_info.cmd_param =
(*(uint8_t *)params);
tx_length = param_length;
}
else
{
- p_dnld_data->param_info.cmd_param = FALSE;
- tx_length++;
+ psDnldContext->dnld_data.param_info.cmd_param = FALSE;
+ tx_length++;
}
break;
}
@@ -3268,16 +2469,16 @@
#if (NXP_FW_INTEGRITY_CHK >= 0x01)
if ((NULL != params) && ( param_length > 0 ))
{
- psDnldContext->chk_integrity_param =
+ psDnldContext->chk_integrity_param =
(phDnldNfc_eChkCrc_t)(*(uint8_t *)params);
- tx_length = param_length ;
+ tx_length = param_length;
}
else
{
psDnldContext->chk_integrity_param = CHK_INTEGRITY_COMPLETE_CRC;
tx_length++;
}
- p_dnld_data->param_info.cmd_param =
+ psDnldContext->dnld_data.param_info.cmd_param =
(uint8_t) psDnldContext->chk_integrity_param;
switch(psDnldContext->chk_integrity_param)
{
@@ -3305,7 +2506,7 @@
}
#else
tx_length++;
- p_dnld_data->param_info.cmd_param =
+ psDnldContext->dnld_data.param_info.cmd_param =
(uint8_t) CHK_INTEGRITY_COMPLETE_CRC;
#endif /* #if (NXP_FW_INTEGRITY_CHK >= 0x01) */
@@ -3321,32 +2522,58 @@
{
uint8_t i = 0;
- p_dnld_data->frame_type = cmd;
- p_dnld_data->frame_length[i++] =
+ psDnldContext->dnld_data.frame_type = cmd;
+ psDnldContext->dnld_data.frame_length[i++] =
(uint8_t)(tx_length >> BYTE_SIZE);
- p_dnld_data->frame_length[i] =
+ psDnldContext->dnld_data.frame_length[i] =
(uint8_t)( tx_length & BYTE_MASK );
tx_length = tx_length + PHDNLD_MIN_PACKET;
status = phDnldNfc_Send( psDnldContext, pHwRef ,
- (uint8_t *)p_dnld_data, tx_length);
+ (uint8_t *)(&psDnldContext->dnld_data), tx_length);
if(NFCSTATUS_PENDING == status)
{
psDnldContext->prev_cmd = cmd;
+ if( PHDNLD_CMD_RESET == cmd )
+ DO_DELAY(PHDNLD_DNLD_DELAY); //this seems like its on the wrong thread
}
+
}
return status;
}
+
static
NFCSTATUS
-phDnldNfc_Check_FW(
- phHal_sHwReference_t *pHwRef,
- fw_data_hdr_t *cur_fw_hdr
+phDnldNfc_Process_FW(
+ phDnldNfc_sContext_t *psDnldContext,
+ phHal_sHwReference_t *pHwRef
+#ifdef NXP_FW_PARAM
+ ,uint8_t *nxp_nfc_fw
+#endif
)
{
NFCSTATUS status = NFCSTATUS_FAILED;
+ section_info_t *p_cur_sec = NULL;
+ static unsigned sec_type;
+ uint32_t fw_index = 0;
+ fw_data_hdr_t *cur_fw_hdr = NULL;
+ uint8_t sec_index = 0;
+ uint8_t i = 0;
+
+ psDnldContext->p_img_hdr = (img_data_hdr_t *) nxp_nfc_fw;
+
+ fw_index = sizeof (img_data_hdr_t);
+
+ for ( i=0; i < psDnldContext->p_img_hdr->no_of_fw_img; i++ )
+ {
+
+ psDnldContext->p_fw_hdr = (fw_data_hdr_t *) ( nxp_nfc_fw + fw_index );
+ /* TODO: Create a memory of pointers to store all the Firmwares */
+ cur_fw_hdr = psDnldContext->p_fw_hdr;
+
+ fw_index = fw_index + (cur_fw_hdr->fw_hdr_len * PNDNLD_WORD_LEN);
if ( !pHwRef->device_info.fw_version )
{
@@ -3362,6 +2589,9 @@
status = PHNFCSTVAL( CID_NFC_DNLD, NFCSTATUS_NOT_ALLOWED );
}
else if (( pHwRef->device_info.fw_version < cur_fw_hdr->fw_version )
+#ifdef NXP_FW_PATCH_VERIFY
+ && (pHwRef->device_info.full_version[NXP_PATCH_VER_INDEX] < cur_fw_hdr->fw_patch )
+#endif
)
{
/* TODO: Firmware Version Check and upgrade*/
@@ -3381,87 +2611,22 @@
DNLD_PRINT(" FW_DNLD: Already Updated .... \n");
status = ( CID_NFC_DNLD << BYTE_SIZE ) ;
}
-
- return status;
-}
-
-
-static
-NFCSTATUS
-phDnldNfc_Process_FW(
- phDnldNfc_sContext_t *psDnldContext,
- phHal_sHwReference_t *pHwRef
-#ifdef NXP_FW_PARAM
- ,uint8_t *nxp_nfc_fw
- ,uint32_t nxp_fw_len
-#endif
- )
-{
- NFCSTATUS status = NFCSTATUS_FAILED;
- section_info_t *p_cur_sec = NULL;
- static unsigned sec_type;
- uint32_t fw_index = 0;
-#ifdef NXP_NFC_MULTIPLE_FW
- phDnldNfc_sFwImageInfo_t *p_cur_fw = NULL;
-#endif /* #ifdef NXP_NFC_MULTIPLE_FW */
- fw_data_hdr_t *cur_fw_hdr = NULL;
- uint8_t sec_index = 0;
- uint8_t i = 0;
-
- psDnldContext->p_img_hdr = (img_data_hdr_t *) nxp_nfc_fw;
-
-#ifdef NXP_NFC_MULTIPLE_FW
-
- /* TODO: Create a memory of pointers to store all the Firmwares */
- if( (NXP_NFC_IMAG_FW_MAX > psDnldContext->p_img_hdr->no_of_fw_img)
- && (0 != psDnldContext->p_img_hdr->no_of_fw_img)
- )
- {
- ( void )phDnldNfc_Allocate_Resource((void **)&psDnldContext->p_img_info,
- (psDnldContext->p_img_hdr->no_of_fw_img * sizeof(phDnldNfc_sFwImageInfo_t)));
-
- if(NULL != psDnldContext->p_img_info)
- {
- p_cur_fw = psDnldContext->p_img_info;
- }
}
-#endif /* #ifdef NXP_NFC_MULTIPLE_FW */
-
- fw_index = sizeof (img_data_hdr_t);
-
- for ( i=0; i < psDnldContext->p_img_hdr->no_of_fw_img; i++ )
- {
-
- psDnldContext->p_fw_hdr = (fw_data_hdr_t *) ( nxp_nfc_fw + fw_index );
-
-#ifdef NXP_NFC_MULTIPLE_FW
- if(NULL != p_cur_fw)
- {
- ( p_cur_fw + i)->p_fw_hdr = psDnldContext->p_fw_hdr;
- }
-#endif /* #ifdef NXP_NFC_MULTIPLE_FW */
- cur_fw_hdr = psDnldContext->p_fw_hdr;
-
- fw_index = fw_index + (cur_fw_hdr->fw_hdr_len * PNDNLD_WORD_LEN);
-
- status = phDnldNfc_Check_FW( pHwRef, cur_fw_hdr);
-
- }
-
if ( ( NFCSTATUS_SUCCESS == status )
#if defined (NXP_FW_INTEGRITY_VERIFY)
|| (NFCSTATUS_SUCCESS == PHNFCSTATUS(status) )
#endif /* !defined (NXP_FW_INTEGRITY_VERIFY) */
)
{
- if( (BYTE_MASK > cur_fw_hdr->no_of_sections)
- && (0 != cur_fw_hdr->no_of_sections)
- )
- {
+
(void) phDnldNfc_Allocate_Resource((void **)&psDnldContext->p_fw_sec,
(cur_fw_hdr->no_of_sections * sizeof(section_info_t)));
-
- if(NULL != psDnldContext->p_fw_sec)
+ if(NULL == psDnldContext->p_fw_sec)
+ {
+ status = PHNFCSTVAL(CID_NFC_DNLD,
+ NFCSTATUS_INSUFFICIENT_RESOURCES);
+ }
+ else
{
DNLD_DEBUG(" FW_DNLD: FW Index : %x \n",
fw_index );
@@ -3490,7 +2655,7 @@
sec_type = (unsigned int)p_cur_sec->p_sec_hdr->section_mem_type;
- if((sec_type & DNLD_TRIM_MASK))
+ if(TRUE == ((section_type_t *)(&sec_type))->trim_val )
{
p_cur_sec->p_trim_data = (uint8_t *)
(nxp_nfc_fw + fw_index + sizeof(section_hdr_t));
@@ -3500,42 +2665,25 @@
p_cur_sec->p_trim_data = NULL;
}
- if (0 == sec_index)
- {
- if ((sec_type & DNLD_SM_UNLOCK_MASK))
- {
- (void)phDnldNfc_Set_Seq(psDnldContext,
- DNLD_SEQ_UNLOCK);
- }
- else
- {
- (void)phDnldNfc_Set_Seq(psDnldContext,
- DNLD_SEQ_INIT);
- }
- }
p_cur_sec->section_read = FALSE;
p_cur_sec->section_offset = 0;
p_cur_sec->p_sec_data = ((uint8_t *) nxp_nfc_fw) + fw_index +
+#ifdef SECTION_HDR
(p_cur_sec->p_sec_hdr->section_hdr_len * PNDNLD_WORD_LEN);
+#else
+ sizeof (section_hdr_t) ;
+#endif
fw_index = fw_index +
+#ifdef SECTION_HDR
(p_cur_sec->p_sec_hdr->section_hdr_len * PNDNLD_WORD_LEN)
+#else
+ sizeof (section_hdr_t)
+#endif
+ p_cur_sec->p_sec_hdr->section_length;
-
- if( 0 != p_cur_sec->p_sec_hdr->section_checksum )
- {
- DNLD_DEBUG(" FW_DNLD: Section checksum : %x \n",
- p_cur_sec->p_sec_hdr->section_checksum );
-
- p_cur_sec->p_sec_chksum = ( uint8_t *)(nxp_nfc_fw + fw_index);
-
- fw_index = fw_index +
- p_cur_sec->p_sec_hdr->section_checksum;
- }
-
DNLD_DEBUG(" FW_DNLD: FW Index : %x \n", fw_index );
#if (NXP_FW_INTEGRITY_CHK >= 0x01)
@@ -3569,37 +2717,13 @@
{
break;
}
-
- } /* End of Address Switch */
-#endif /* #if (NXP_FW_INTEGRITY_CHK >= 0x01) */
- } /* End of For Loop */
- } /* End of the Null Check */
- else
- {
- status = PHNFCSTVAL(CID_NFC_DNLD,
- NFCSTATUS_INSUFFICIENT_RESOURCES);
}
+#endif /* #if (NXP_FW_INTEGRITY_CHK >= 0x01) */
}
- else if (
- (0 == cur_fw_hdr->no_of_sections)
- && (PHDNLD_FW_PATCH_SEC == cur_fw_hdr->fw_patch)
- )
- {
- psDnldContext->p_fw_raw = (uint8_t *)(nxp_nfc_fw + fw_index);
-
- psDnldContext->raw_mode_upgrade = PHDNLD_COMPLETE_OPERATION;
-
- (void)phDnldNfc_Set_Seq(psDnldContext,
- DNLD_SEQ_RAW);
- }
- else
- {
- DNLD_PRINT("********* Empty Section and Firmware ******************\n\n");
- }
DNLD_PRINT("*******************************************\n\n");
-
+ }
}
return status;
}
@@ -3634,7 +2758,45 @@
fw_index = fw_index + (cur_fw_hdr->fw_hdr_len * PNDNLD_WORD_LEN);
- status = phDnldNfc_Check_FW( pHwRef, cur_fw_hdr);
+ if ( !pHwRef->device_info.fw_version )
+ {
+ /* Override the Firmware Version Check and upgrade*/;
+ DNLD_PRINT(" FW_DNLD_CHK: Forceful Upgrade of the Firmware .... Required \n");
+ status = NFCSTATUS_SUCCESS;
+ }
+ else if ( (pHwRef->device_info.fw_version >> (BYTE_SIZE * 2))
+ != ( cur_fw_hdr->fw_version >> (BYTE_SIZE * 2) ))
+ {
+ /* Check for the Compatible Romlib Version for the Hardware */
+ DNLD_PRINT(" FW_DNLD: IC Hardware Version Mismatch.. \n");
+ status = PHNFCSTVAL( CID_NFC_DNLD, NFCSTATUS_NOT_ALLOWED );
+ }
+ else if (( pHwRef->device_info.fw_version < cur_fw_hdr->fw_version )
+#ifdef NXP_FW_PATCH_VERIFY
+ && (pHwRef->device_info.full_version[NXP_PATCH_VER_INDEX] < cur_fw_hdr->fw_patch )
+#endif
+ )
+ {
+ /* TODO: Firmware Version Check and upgrade*/
+ DNLD_PRINT(" FW_DNLD_CHK: Older Firmware. Upgrading to newer one.... \n");
+ status = NFCSTATUS_SUCCESS;
+ }
+#ifdef NXP_FW_CHK_LATEST
+ else if (( pHwRef->device_info.fw_version > cur_fw_hdr->fw_version )
+ )
+ {
+ DNLD_PRINT(" FW_DNLD: Newer than the Stored One .... \n");
+ status = PHNFCSTVAL( CID_NFC_DNLD, NFCSTATUS_NOT_ALLOWED );
+ }
+#endif /* NXP_FW_CHK_LATEST */
+ else
+ {
+ DNLD_PRINT(" FW_DNLD_CHK: Already Updated .... \n");
+ status = ( CID_NFC_DNLD << BYTE_SIZE ) ;
+ }
+ }
+ if( NFCSTATUS_SUCCESS == status )
+ {
}
return status;
}
@@ -3645,39 +2807,26 @@
STATIC
void
phDnldNfc_Abort (
- uint32_t abort_id
-#ifdef NFC_TIMER_CONTEXT
- , void *dnld_cntxt
-#endif
+ uint32_t abort_id,
+ void *pContext
)
{
- phNfc_sCompletionInfo_t comp_info = {0};
+ phNfc_sCompletionInfo_t comp_info = {0,0,0};
- phDnldNfc_sContext_t *p_dnld_context = NULL;
-
-#ifdef NFC_TIMER_CONTEXT
- p_dnld_context = (phDnldNfc_sContext_t *)dnld_cntxt;
-#else
- p_dnld_context = gpphDnldContext;
-#endif
-
- if ( ( NULL != p_dnld_context)
- && (abort_id == p_dnld_context->timer_id ))
+ if ( ( NULL != gpphDnldContext)
+ && (abort_id == gpphDnldContext->timer_id ))
{
pphNfcIF_Notification_CB_t p_upper_notify =
- p_dnld_context->p_upper_notify;
+ gpphDnldContext->p_upper_notify;
void *p_upper_context =
- p_dnld_context->p_upper_context;
- phHal_sHwReference_t *pHwRef = p_dnld_context->p_hw_ref;
+ gpphDnldContext->p_upper_context;
+ phHal_sHwReference_t *pHwRef = gpphDnldContext->p_hw_ref;
(void)phDal4Nfc_Unregister(
- p_dnld_context->lower_interface.pcontext, pHwRef );
- phDnldNfc_Release_Lower(p_dnld_context, pHwRef);
- phDnldNfc_Release_Resources(&p_dnld_context);
-#ifndef NFC_TIMER_CONTEXT
- gpphDnldContext = p_dnld_context;
-#endif
+ gpphDnldContext->lower_interface.pcontext, pHwRef );
+ phDnldNfc_Release_Lower(gpphDnldContext, pHwRef);
+ phDnldNfc_Release_Resources(&gpphDnldContext);
/* Notify the Error/Success Scenario to the upper layer */
DNLD_DEBUG(" FW_DNLD: FW_DNLD Aborted with %x Timer Timeout \n",
@@ -3696,7 +2845,6 @@
phDnldNfc_Upgrade (
phHal_sHwReference_t *pHwRef,
#ifdef NXP_FW_PARAM
- uint8_t type,
uint8_t *nxp_nfc_fw,
uint32_t fw_length,
#endif
@@ -3705,7 +2853,7 @@
)
{
phDnldNfc_sContext_t *psDnldContext = NULL;
- phNfcIF_sReference_t dnldReference = { NULL };
+ phNfcIF_sReference_t dnldReference = { NULL,0,0 };
phNfcIF_sCallBack_t if_callback = { NULL, NULL, NULL, NULL };
phNfc_sLowerIF_t *plower_if = NULL;
NFCSTATUS status = NFCSTATUS_SUCCESS;
@@ -3720,15 +2868,16 @@
else
{
DNLD_PRINT(" FW_DNLD: Starting the FW Upgrade Sequence .... \n");
+ /* Create the memory for Download Mgmt Context */
+ psDnldContext = (phDnldNfc_sContext_t *)
+ phOsalNfc_GetMemory(sizeof(phDnldNfc_sContext_t));
- (void)
- phDnldNfc_Allocate_Resource((void **)
- &psDnldContext,sizeof(phDnldNfc_sContext_t));
if(psDnldContext != NULL)
{
-#ifndef NFC_TIMER_CONTEXT
+ (void ) memset((void *)psDnldContext,0,
+ sizeof(phDnldNfc_sContext_t));
+
gpphDnldContext = psDnldContext;
-#endif
psDnldContext->p_hw_ref = pHwRef;
psDnldContext->timer_id = NXP_INVALID_TIMER_ID;
@@ -3762,7 +2911,7 @@
status = phDnldNfc_Process_FW( psDnldContext, pHwRef
#ifdef NXP_FW_PARAM
- ,*nxp_nfc_fw , fw_length
+ ,*nxp_nfc_fw /*, fw_length */
#endif
);
@@ -3773,24 +2922,27 @@
if (NFCSTATUS_PENDING == status)
{
DNLD_PRINT("\n FW_DNLD: Initial Reset .... \n");
+ p_cur_sec = ((section_info_t *)
+ (psDnldContext->p_fw_sec ));
+ sec_type = (unsigned )
+ (p_cur_sec->p_sec_hdr->section_mem_type);
-#if defined(FW_DOWNLOAD_TIMER)
-
+ if(TRUE == ((section_type_t *)
+ (&sec_type))->system_mem_unlock )
+ {
+ (void)phDnldNfc_Set_Seq(psDnldContext,
+ DNLD_SEQ_UNLOCK);
+ }
+ else
+ {
+ (void)phDnldNfc_Set_Seq(psDnldContext,
+ DNLD_SEQ_INIT);
+ }
+#ifdef FW_DOWNLOAD_TIMER
psDnldContext->timer_id = phOsalNfc_Timer_Create( );
-
-#if (FW_DOWNLOAD_TIMER < 2)
phOsalNfc_Timer_Start( psDnldContext->timer_id,
- NXP_DNLD_COMPLETE_TIMEOUT,
- (ppCallBck_t) phDnldNfc_Abort
-#ifdef NFC_TIMER_CONTEXT
- , (void *) psDnldContext
+ NXP_DNLD_COMPLETE_TIMEOUT, phDnldNfc_Abort, NULL );
#endif
- );
-
-#endif /* #if (FW_DOWNLOAD_TIMER < 2) */
-
-#endif /* #if defined(FW_DOWNLOAD_TIMER) */
-
}
}
else if (NFCSTATUS_SUCCESS == PHNFCSTATUS(status))
@@ -3802,33 +2954,23 @@
*/
status = phDnldNfc_Send_Command( psDnldContext, pHwRef,
PHDNLD_CMD_RESET , NULL , 0 );
+
if (NFCSTATUS_PENDING == status)
{
DNLD_PRINT("\n FW_DNLD: Integrity Reset .... \n");
(void)phDnldNfc_Set_Seq(psDnldContext, DNLD_SEQ_COMPLETE);
status = PHNFCSTVAL( CID_NFC_DNLD,
NFCSTATUS_PENDING );
-#if defined(FW_DOWNLOAD_TIMER)
+#ifdef FW_DOWNLOAD_TIMER
psDnldContext->timer_id = phOsalNfc_Timer_Create( );
-#if (FW_DOWNLOAD_TIMER < 2)
phOsalNfc_Timer_Start( psDnldContext->timer_id,
- NXP_DNLD_COMPLETE_TIMEOUT,
- (ppCallBck_t) phDnldNfc_Abort
-#ifdef NFC_TIMER_CONTEXT
- , (void *) psDnldContext
+ NXP_DNLD_COMPLETE_TIMEOUT, phDnldNfc_Abort, NULL );
#endif
- );
-
-#endif /* #if (FW_DOWNLOAD_TIMER < 2) */
-
-#endif /* #if defined(FW_DOWNLOAD_TIMER) */
}
#else
status = NFCSTATUS_SUCCESS;
-
-#endif /* #if defined (NXP_FW_INTEGRITY_VERIFY) */
-
+#endif
}
else
{
@@ -3839,12 +2981,9 @@
if (NFCSTATUS_PENDING != PHNFCSTATUS(status))
{
(void)phDal4Nfc_Unregister(
- psDnldContext->lower_interface.pcontext, pHwRef);
- phDnldNfc_Release_Lower(psDnldContext, pHwRef);
- phDnldNfc_Release_Resources(&psDnldContext);
-#ifndef NFC_TIMER_CONTEXT
- gpphDnldContext = psDnldContext;
-#endif
+ gpphDnldContext->lower_interface.pcontext, pHwRef);
+ phDnldNfc_Release_Lower(gpphDnldContext, pHwRef);
+ phDnldNfc_Release_Resources(&gpphDnldContext);
}
} /* End of Status Check for Memory */
else
@@ -3857,9 +2996,3 @@
return status;
}
-
-
-
-
-
-
diff --git a/src/phFriNfc_FelicaMap.c b/src/phFriNfc_FelicaMap.c
index 2604649..8a810f9 100644
--- a/src/phFriNfc_FelicaMap.c
+++ b/src/phFriNfc_FelicaMap.c
@@ -57,13 +57,10 @@
uint8_t EndIndex,
uint16_t RecvChkSum);
-#ifndef PH_HAL4_ENABLE
/* Helpers for Poll Related Operations*/
static NFCSTATUS phFriNfc_Felica_HPollCard( phFriNfc_NdefMap_t *NdefMap,
const uint8_t sysCode[],
uint8_t state);
-#endif /* #ifndef PH_HAL4_ENABLE */
-
static NFCSTATUS phFriNfc_Felica_HUpdateManufIdDetails(const phFriNfc_NdefMap_t *NdefMap);
@@ -2118,39 +2115,65 @@
NFCSTATUS phFriNfc_Felica_ChkNdef( phFriNfc_NdefMap_t *NdefMap)
{
NFCSTATUS status = NFCSTATUS_PENDING;
-
-#ifndef PH_HAL4_ENABLE
uint8_t sysCode[2];
-#endif /* #ifndef PH_HAL4_ENABLE */
-#ifdef PH_HAL4_ENABLE
-
- /* check the ndef compliency with the system code reecived in the RemoteDevInfo*/
- status = phFriNfc_Felica_HUpdateManufIdDetails(NdefMap);
-
- if (status == NFCSTATUS_SUCCESS)
- {
-
- /* set the operation type to Check ndef type*/
- NdefMap->Felica.OpFlag = PH_FRINFC_NDEFMAP_FELI_CHK_NDEF_OP;
- status = phFriNfc_Felica_HRdAttrInfo(NdefMap);
- }
-#else
-
/* set the system code for selecting the wild card*/
sysCode[0] = 0x12;
sysCode[1] = 0xFC;
status = phFriNfc_Felica_HPollCard( NdefMap,sysCode,PH_NFCFRI_NDEFMAP_FELI_STATE_SELECT_NDEF_APP);
-#endif /* #ifdef PH_HAL4_ENABLE */
return (status);
}
/*!
* \brief Check whether a particular Remote Device is NDEF compliant.
- * selects the wild card and then NFC Forum Reference Applications
+ * selects the sysCode and then NFC Forum Reference Applications
*/
+#ifdef PH_HAL4_ENABLE
+static NFCSTATUS phFriNfc_Felica_HPollCard( phFriNfc_NdefMap_t *NdefMap,
+ const uint8_t sysCode[],
+ uint8_t state)
+{
+ NFCSTATUS status = NFCSTATUS_PENDING;
+
+ /*Format the Poll Packet for selecting the system code passed as parameter */
+ NdefMap->SendRecvBuf[0] = 0x06;
+ NdefMap->SendRecvBuf[1] = 0x00;
+ NdefMap->SendRecvBuf[2] = sysCode[0];
+ NdefMap->SendRecvBuf[3] = sysCode[1];
+ NdefMap->SendRecvBuf[4] = 0x01;
+ NdefMap->SendRecvBuf[5] = 0x03;
+
+ NdefMap->SendLength = 6;
+
+ /*set the completion routines for the felica card operations*/
+ NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_Felica_Process;
+ NdefMap->MapCompletionInfo.Context = NdefMap;
+
+ /*Set Ndef State*/
+ NdefMap->State = state;
+
+ /* set the felica cmd */
+ NdefMap->Cmd.FelCmd = phHal_eFelica_Raw;
+
+ /*set the additional informations for the data exchange*/
+ NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
+ NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
+
+ status = phFriNfc_OvrHal_Transceive(NdefMap->LowerDevice,
+ &NdefMap->MapCompletionInfo,
+ NdefMap->psRemoteDevInfo,
+ NdefMap->Cmd,
+ &NdefMap->psDepAdditionalInfo,
+ NdefMap->SendRecvBuf,
+ NdefMap->SendLength,
+ NdefMap->SendRecvBuf,
+ NdefMap->SendRecvLength);
+ return (status);
+}
+#endif
+
#ifndef PH_HAL4_ENABLE
static NFCSTATUS phFriNfc_Felica_HPollCard( phFriNfc_NdefMap_t *NdefMap,
@@ -2210,50 +2233,45 @@
{
NFCSTATUS status = NFCSTATUS_PENDING;
-#ifdef PH_HAL4_ENABLE
- /* copy the IDm and PMm in Manufacture Details Structure*/
- (void)memcpy( (uint8_t *)(NdefMap->FelicaManufDetails.ManufID),
- (uint8_t *)NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.IDm,
- 8);
- (void)memcpy( (uint8_t *)(NdefMap->FelicaManufDetails.ManufParameter),
- (uint8_t *)NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.PMm,
- 8);
- status = PHNFCSTVAL(CID_NFC_NONE, NFCSTATUS_SUCCESS);
-#else
-
-
- /* Check the System Code for 0x12,0xFC*/
- if( (NdefMap->FelicaPollDetails.psTempRemoteDevInfo.RemoteDevInfo.CardInfo212_424.Startup212_424.SystemCodeAvailable == 1)
- && (NdefMap->FelicaPollDetails.psTempRemoteDevInfo.RemoteDevInfo.CardInfo212_424.Startup212_424.SystemCode[0] == 0x12)
- && (NdefMap->FelicaPollDetails.psTempRemoteDevInfo.RemoteDevInfo.CardInfo212_424.Startup212_424.SystemCode[1] == 0xFC))
+ /* Get the details from Poll Response packet */
+ if (NdefMap->SendRecvLength >= 20)
{
-
- /* copy the IDm and PMm in Manufacture Details Structure*/
- (void)memcpy( (uint8_t *)(NdefMap->FelicaManufDetails.ManufID),
- (uint8_t *)NdefMap->FelicaPollDetails.psTempRemoteDevInfo.RemoteDevInfo.CardInfo212_424.Startup212_424.NFCID2t,
- 8);
- (void)memcpy( (uint8_t *)(NdefMap->FelicaManufDetails.ManufParameter),
- (uint8_t *)NdefMap->FelicaPollDetails.psTempRemoteDevInfo.RemoteDevInfo.CardInfo212_424.Startup212_424.PMm,
- 8);
-
+ (void)memcpy( (uint8_t *)NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.IDm,
+ (uint8_t *)&NdefMap->SendRecvBuf[2], 8);
+ (void)memcpy( (uint8_t *)NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.PMm,
+ (uint8_t *)&NdefMap->SendRecvBuf[10], 8);
+ NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.SystemCode[1] = NdefMap->SendRecvBuf[18];
+ NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.SystemCode[0] = NdefMap->SendRecvBuf[19];
+ NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.IDmLength = 8;
- status = PHNFCSTVAL(CID_NFC_NONE,
- NFCSTATUS_SUCCESS);
-
+ /* copy the IDm and PMm in Manufacture Details Structure*/
+ (void)memcpy( (uint8_t *)(NdefMap->FelicaManufDetails.ManufID),
+ (uint8_t *)NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.IDm,
+ 8);
+ (void)memcpy( (uint8_t *)(NdefMap->FelicaManufDetails.ManufParameter),
+ (uint8_t *)NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.PMm,
+ 8);
+ if((NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.SystemCode[1] == 0x12)
+ && (NdefMap->psRemoteDevInfo->RemoteDevInfo.Felica_Info.SystemCode[0] == 0xFC))
+ {
+ status = PHNFCSTVAL(CID_NFC_NONE, NFCSTATUS_SUCCESS);
+ }
+ else
+ {
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+ NFCSTATUS_NO_NDEF_SUPPORT);
+ }
}
else
{
- status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
- NFCSTATUS_NO_NDEF_SUPPORT);
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+ NFCSTATUS_NO_NDEF_SUPPORT);
}
-#endif /* #ifdef PH_HAL4_ENABLE */
-
+
return (status);
-
}
-
/*!
* \brief Completion Routine, Processing function, needed to avoid long blocking.
* \note The lower (Overlapped HAL) layer must register a pointer to this function as a Completion
diff --git a/src/phFriNfc_ISO15693Format.c b/src/phFriNfc_ISO15693Format.c
index 574c107..077035e 100644
--- a/src/phFriNfc_ISO15693Format.c
+++ b/src/phFriNfc_ISO15693Format.c
@@ -1,5 +1,5 @@
/*
-/*
+ *
* Copyright (C) 2010 NXP Semiconductors
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -112,7 +112,7 @@
typedef enum phFriNfc_ISO15693_FormatSeq
{
ISO15693_GET_SYS_INFO,
- ISO15693_RD_MULTIPLE_BLKS_CHECK,
+ ISO15693_RD_SINGLE_BLK_CHECK,
ISO15693_WRITE_CC_FMT,
ISO15693_WRITE_NDEF_TLV
}phFriNfc_ISO15693_FormatSeq_t;
@@ -351,27 +351,12 @@
(uint8_t)(*psNdefSmtCrdFmt->SendRecvLength -
ISO15693_EXTRA_RESPONSE_FLAG)))
{
- /* Send the READ MULTIPLE BLOCKS COMMAND */
- command_type = ISO15693_RD_MULTIPLE_BLKS_CMD;
- e_format_seq = ISO15693_RD_MULTIPLE_BLKS_CHECK;
+ /* Send the READ SINGLE BLOCK COMMAND */
+ command_type = ISO15693_RD_SINGLE_BLK_CMD;
+ e_format_seq = ISO15693_RD_SINGLE_BLK_CHECK;
- /* Prepare data for the command,
- First add the current block */
- *a_send_byte = (uint8_t)ps_iso15693_info->current_block;
- send_index = (uint8_t)(send_index + 1);
-
- /* Second, add number of blocks to read, here 2 blocks means
- 8 bytes. 1 is decremented because to read multiple block.
- the first block is read by default, apart from the first block,
- next block shall be read, that means remaining block to read is 1
- So, if for eg: 2 blocks needs to be read from block number 0, then 1
- is number of blocks to read. This will read both block 0 and 1
- */
- *(a_send_byte + send_index) = (uint8_t)
- (ISO15693_RD_2_BLOCKS - 1);
- send_index = (uint8_t)(send_index + 1);
-
- send_length = send_index;
+ /* Block number 0 to read */
+ psNdefSmtCrdFmt->AddInfo.s_iso15693_info.current_block = 0x00;
}
else
{
@@ -381,67 +366,76 @@
break;
}
- case ISO15693_RD_MULTIPLE_BLKS_CHECK:
+ case ISO15693_RD_SINGLE_BLK_CHECK:
{
- /* RESPONSE received for READ MULTIPLE BLOCKS
- received, prepare data for writing CC bytes */
-
- command_type = ISO15693_WR_SINGLE_BLK_CMD;
- e_format_seq = ISO15693_WRITE_CC_FMT;
+ /* RESPONSE received for READ SINGLE BLOCK
+ received*/
- /* CC magic number */
- *a_send_byte = (uint8_t)ISO15693_CC_MAGIC_NUM;
- send_index = (uint8_t)(send_index + 1);
+ /* Check if Card is really fresh
+ First 4 bytes must be 0 for fresh card */
- /* CC Version and read/write access */
- *(a_send_byte + send_index) = (uint8_t)
- ISO15693_CC_VER_RW;
- send_index = (uint8_t)(send_index + 1);
-
- /* CC MAX data size, calculated during GET system information */
- *(a_send_byte + send_index) = (uint8_t)
- (ps_iso15693_info->max_data_size /
- ISO15693_CC_MULTIPLE_FACTOR);
- send_index = (uint8_t)(send_index + 1);
-
- switch (ps_iso15693_info->max_data_size)
+ if ((psNdefSmtCrdFmt->AddInfo.s_iso15693_info.current_block == 0x00) &&
+ (psNdefSmtCrdFmt->SendRecvBuf[1] != 0x00 ||
+ psNdefSmtCrdFmt->SendRecvBuf[2] != 0x00 ||
+ psNdefSmtCrdFmt->SendRecvBuf[3] != 0x00 ||
+ psNdefSmtCrdFmt->SendRecvBuf[4] != 0x00))
{
- case ISO15693_SLI_X_MAX_SIZE:
- {
- /* For SLI tags : Inventory Page read not supported */
- *(a_send_byte + send_index) = (uint8_t)
- ISO15693_RDMULBLKS_CMD_MASK;
- break;
- }
-
- case ISO15693_SLI_X_S_MAX_SIZE:
- {
- /* For SLI - S tags : Read multiple blocks not supported */
- *(a_send_byte + send_index) = (uint8_t)
- ISO15693_INVENTORY_CMD_MASK;
- break;
- }
-
- case ISO15693_SLI_X_L_MAX_SIZE:
- {
- /* For SLI - L tags : Read multiple blocks not supported */
- *(a_send_byte + send_index) = (uint8_t)
- ISO15693_INVENTORY_CMD_MASK;
- break;
- }
-
- default:
- {
- result = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT,
- NFCSTATUS_INVALID_DEVICE_REQUEST);
- break;
- }
+ result = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT, NFCSTATUS_INVALID_FORMAT);
}
-
- send_index = (uint8_t)(send_index + 1);
+ else
+ {
+ /* prepare data for writing CC bytes */
- send_length = sizeof (a_send_byte);
-
+ command_type = ISO15693_WR_SINGLE_BLK_CMD;
+ e_format_seq = ISO15693_WRITE_CC_FMT;
+
+ /* CC magic number */
+ *a_send_byte = (uint8_t)ISO15693_CC_MAGIC_NUM;
+ send_index = (uint8_t)(send_index + 1);
+
+ /* CC Version and read/write access */
+ *(a_send_byte + send_index) = (uint8_t) ISO15693_CC_VER_RW;
+ send_index = (uint8_t)(send_index + 1);
+
+ /* CC MAX data size, calculated during GET system information */
+ *(a_send_byte + send_index) = (uint8_t) (ps_iso15693_info->max_data_size / ISO15693_CC_MULTIPLE_FACTOR);
+ send_index = (uint8_t)(send_index + 1);
+
+ switch (ps_iso15693_info->max_data_size)
+ {
+ case ISO15693_SLI_X_MAX_SIZE:
+ {
+ /* For SLI tags : Inventory Page read not supported */
+ *(a_send_byte + send_index) = (uint8_t) ISO15693_RDMULBLKS_CMD_MASK;
+ break;
+ }
+
+ case ISO15693_SLI_X_S_MAX_SIZE:
+ {
+ /* For SLI - S tags : Read multiple blocks not supported */
+ *(a_send_byte + send_index) = (uint8_t) ISO15693_INVENTORY_CMD_MASK;
+ break;
+ }
+
+ case ISO15693_SLI_X_L_MAX_SIZE:
+ {
+ /* For SLI - L tags : Read multiple blocks not supported */
+ *(a_send_byte + send_index) = (uint8_t) ISO15693_INVENTORY_CMD_MASK;
+ break;
+ }
+
+ default:
+ {
+ result = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT, NFCSTATUS_INVALID_DEVICE_REQUEST);
+ break;
+ }
+ }
+
+ send_index = (uint8_t)(send_index + 1);
+
+ send_length = sizeof (a_send_byte);
+ }
+
break;
}
@@ -568,16 +562,8 @@
}
else
{
- if (ISO15693_RD_MULTIPLE_BLKS_CHECK ==
- (phFriNfc_ISO15693_FormatSeq_t)ps_iso15693_info->format_seq)
- {
- /* If READ MULTIPLE BLOCKS is not working then
- do further formatting, disable the READ MULTIPLE BLOCK
- flag in the CC 4th byte, this says that COMMAND is not
- supported and dont use this command
- */
- Status = phFriNfc_ISO15693_H_ProFormat (psNdefSmtCrdFmt);
- }
+ Status = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT,
+ NFCSTATUS_FORMAT_ERROR);
}
/* Handle the all the error cases */
diff --git a/src/phFriNfc_ISO15693Map.c b/src/phFriNfc_ISO15693Map.c
index f07b1bf..a21d9c8 100644
--- a/src/phFriNfc_ISO15693Map.c
+++ b/src/phFriNfc_ISO15693Map.c
@@ -1,5 +1,5 @@
/*
-/*
+ *
* Copyright (C) 2010 NXP Semiconductors
*
* Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/src/phFriNfc_ISO15693Map.h b/src/phFriNfc_ISO15693Map.h
index 596534a..f4c0c08 100644
--- a/src/phFriNfc_ISO15693Map.h
+++ b/src/phFriNfc_ISO15693Map.h
@@ -1,5 +1,5 @@
/*
-/*
+ *
* Copyright (C) 2010 NXP Semiconductors
*
* Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/src/phFriNfc_Llcp.c b/src/phFriNfc_Llcp.c
index ac38311..2a4fcb4 100644
--- a/src/phFriNfc_Llcp.c
+++ b/src/phFriNfc_Llcp.c
@@ -196,24 +196,11 @@
static NFCSTATUS phFriNfc_Llcp_SendSymm( phFriNfc_Llcp_t *Llcp )
{
phFriNfc_Llcp_sPacketHeader_t sHeader;
- bool_t bPendingFlag;
- /* Check for pending messages to send */
- bPendingFlag = phFriNfc_Llcp_HandlePendingSend(Llcp);
-
- if (bPendingFlag == FALSE)
- {
- /* No send pending, send a SYMM instead */
- sHeader.dsap = PHFRINFC_LLCP_SAP_LINK;
- sHeader.ssap = PHFRINFC_LLCP_SAP_LINK;
- sHeader.ptype = PHFRINFC_LLCP_PTYPE_SYMM;
- return phFriNfc_Llcp_InternalSend(Llcp, &sHeader, NULL, NULL);
- }
- else
- {
- /* A pending send has been sent, there is no need to send SYMM */
- return NFCSTATUS_SUCCESS;
- }
+ sHeader.dsap = PHFRINFC_LLCP_SAP_LINK;
+ sHeader.ssap = PHFRINFC_LLCP_SAP_LINK;
+ sHeader.ptype = PHFRINFC_LLCP_PTYPE_SYMM;
+ return phFriNfc_Llcp_InternalSend(Llcp, &sHeader, NULL, NULL);
}
@@ -423,7 +410,7 @@
break;
}
/* Get MIU */
- sParams.miu = PHFRINFC_LLCP_MIU_DEFAULT + ((sValueBuffer.buffer[0] << 8) | sValueBuffer.buffer[1]) & PHFRINFC_LLCP_TLV_MIUX_MASK;
+ sParams.miu = (PHFRINFC_LLCP_MIU_DEFAULT + ((sValueBuffer.buffer[0] << 8) | sValueBuffer.buffer[1])) & PHFRINFC_LLCP_TLV_MIUX_MASK;
break;
}
case PHFRINFC_LLCP_TLV_TYPE_WKS:
@@ -675,7 +662,7 @@
static void phFriNfc_Llcp_LinkStatus_CB( void *pContext,
phFriNfc_LlcpMac_eLinkStatus_t eLinkStatus,
phNfc_sData_t *psParamsTLV,
- phFriNfc_LlcpMac_eType_t PeerRemoteDevType)
+ phFriNfc_LlcpMac_ePeerType_t PeerRemoteDevType)
{
NFCSTATUS status;
@@ -759,6 +746,8 @@
nDuration = (Llcp->sLocalParams.lto * 10) / 2;
}
+ LLCP_DEBUG("Starting LLCP timer with duration %d", nDuration);
+
/* Restart timer */
phOsalNfc_Timer_Start(
Llcp->hSymmTimer,
@@ -915,6 +904,11 @@
phFriNfc_Llcp_InternalDeactivate(Llcp);
}
return_value = TRUE;
+ } else if (Llcp->pfSendCB == NULL) {
+ // Nothing to send, send SYMM instead to allow peer to send something
+ // if it wants.
+ phFriNfc_Llcp_SendSymm(Llcp);
+ return_value = TRUE;
}
clean_and_return:
@@ -1441,6 +1435,10 @@
/* Incorrect state for sending ! */
result = PHNFCSTVAL(CID_FRI_NFC_LLCP, NFCSTATUS_INVALID_STATE);;
}
+
+ if (result != NFCSTATUS_PENDING) {
+ Llcp->pfSendCB = NULL;
+ }
return result;
}
diff --git a/src/phFriNfc_Llcp.h b/src/phFriNfc_Llcp.h
index 73fa486..287f9f9 100644
--- a/src/phFriNfc_Llcp.h
+++ b/src/phFriNfc_Llcp.h
@@ -117,6 +117,7 @@
/*@{*/
#define PHFRINFC_LLCP_SAP_LINK 0x00 /**< Link SAP.*/
#define PHFRINFC_LLCP_SAP_SDP 0x01 /**< Service Discovery Protocol SAP.*/
+#define PHFRINFC_LLCP_SAP_WKS_FIRST 0x02 /**< Other Well-Known Services defined by the NFC Forum.*/
#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 0x40 /**< Number of possible SAP values (also first invalid value).*/
@@ -289,7 +290,7 @@
phFriNfc_LlcpMac_t MAC;
/**< Local LLC role*/
- phFriNfc_LlcpMac_eType_t eRole;
+ phFriNfc_LlcpMac_ePeerType_t eRole;
/**< Local link parameters*/
phFriNfc_Llcp_sLinkParameters_t sLocalParams;
diff --git a/src/phFriNfc_LlcpTransport.c b/src/phFriNfc_LlcpTransport.c
index 130564d..960a33a 100644
--- a/src/phFriNfc_LlcpTransport.c
+++ b/src/phFriNfc_LlcpTransport.c
@@ -32,6 +32,44 @@
#include <phFriNfc_LlcpTransport_Connectionless.h>
#include <phFriNfc_LlcpTransport_Connection.h>
+/* local macros */
+
+/* Check if (a <= x < b) */
+#define IS_BETWEEN(x, a, b) (((x)>=(a)) && ((x)<(b)))
+
+
+static NFCSTATUS phFriNfc_LlcpTransport_AutoBind(phFriNfc_LlcpTransport_Socket_t *pSocket)
+{
+ uint8_t i;
+ uint8_t sap;
+ phFriNfc_LlcpTransport_Socket_t* pSocketTable = pSocket->psTransport->pSocketTable;
+
+ /* Try all possible SAPs */
+ for(sap=PHFRINFC_LLCP_SAP_SDP_UNADVERTISED_FIRST ; sap<PHFRINFC_LLCP_SAP_NUMBER ; sap++)
+ {
+ /* Go through socket list to check if current SAP is in use */
+ for(i=0 ; i<PHFRINFC_LLCP_NB_SOCKET_MAX ; i++)
+ {
+ if((pSocketTable[i].eSocket_State >= phFriNfc_LlcpTransportSocket_eSocketBound) &&
+ (pSocketTable[i].socket_sSap == sap))
+ {
+ /* SAP is already in use */
+ break;
+ }
+ }
+
+ if (i >= PHFRINFC_LLCP_NB_SOCKET_MAX)
+ {
+ /* No socket is using current SAP, proceed with binding */
+ pSocket->socket_sSap = sap;
+ pSocket->eSocket_State = phFriNfc_LlcpTransportSocket_eSocketBound;
+ return NFCSTATUS_SUCCESS;
+ }
+ }
+
+ /* If we reach this point, it means that no SAP is free */
+ return NFCSTATUS_INSUFFICIENT_RESOURCES;
+}
/* TODO: comment function Transport recv CB */
static void phFriNfc_LlcpTransport__Recv_CB(void *pContext,
@@ -227,6 +265,7 @@
case phFriNfc_LlcpTransportSocket_eSocketRejected:
phFriNfc_LlcpTransport_Close(&pLlcpTransport->pSocketTable[i]);
break;
+ default: break;
}
}
else
@@ -234,7 +273,6 @@
phFriNfc_LlcpTransport_Close(&pLlcpTransport->pSocketTable[i]);
}
}
-
return status;
}
@@ -644,6 +682,20 @@
{
status = PHNFCSTVAL(CID_FRI_NFC_LLCP_TRANSPORT, NFCSTATUS_INVALID_PARAMETER);
}
+ /* Test the SAP range for SDP-advertised services */
+ else if((psServiceName->length > 0) &&
+ (!IS_BETWEEN(pLlcpSocket->socket_sSap, PHFRINFC_LLCP_SAP_SDP_ADVERTISED_FIRST, PHFRINFC_LLCP_SAP_SDP_UNADVERTISED_FIRST)) &&
+ (!IS_BETWEEN(pLlcpSocket->socket_sSap, PHFRINFC_LLCP_SAP_WKS_FIRST, PHFRINFC_LLCP_SAP_SDP_ADVERTISED_FIRST)))
+ {
+ status = PHNFCSTVAL(CID_FRI_NFC_LLCP_TRANSPORT, NFCSTATUS_INVALID_PARAMETER);
+ }
+ /* Test the SAP range for non SDP-advertised services */
+ else if((psServiceName->length == 0) &&
+ (!IS_BETWEEN(pLlcpSocket->socket_sSap, PHFRINFC_LLCP_SAP_SDP_UNADVERTISED_FIRST, PHFRINFC_LLCP_SAP_NUMBER)) &&
+ (!IS_BETWEEN(pLlcpSocket->socket_sSap, PHFRINFC_LLCP_SAP_WKS_FIRST, PHFRINFC_LLCP_SAP_SDP_ADVERTISED_FIRST)))
+ {
+ status = PHNFCSTVAL(CID_FRI_NFC_LLCP_TRANSPORT, NFCSTATUS_INVALID_PARAMETER);
+ }
else
{
status = phFriNfc_LlcpTransport_ConnectionOriented_Listen(pLlcpSocket,
@@ -835,26 +887,29 @@
}
else
{
+ /* Implicit bind if socket is not already bound */
if(pLlcpSocket->eSocket_State != phFriNfc_LlcpTransportSocket_eSocketBound)
{
- /* Bind with a sSap Free */
- pLlcpSocket->socket_sSap = 32;
-
- for(i=0;i<PHFRINFC_LLCP_NB_SOCKET_MAX;i++)
+ status = phFriNfc_LlcpTransport_AutoBind(pLlcpSocket);
+ if (status != NFCSTATUS_SUCCESS)
{
- if(pLlcpSocket->socket_sSap == pLlcpSocket->psTransport->pSocketTable[i].socket_sSap)
- {
- pLlcpSocket->socket_sSap++;
- }
+ return status;
}
}
- pLlcpSocket->eSocket_State = phFriNfc_LlcpTransportSocket_eSocketBound;
- status = phFriNfc_LlcpTransport_ConnectionOriented_Connect(pLlcpSocket,
- nSap,
- NULL,
- pConnect_RspCb,
- pContext);
+ /* Test the SAP range for non SDP-advertised services */
+ if(!IS_BETWEEN(pLlcpSocket->socket_sSap, PHFRINFC_LLCP_SAP_SDP_UNADVERTISED_FIRST, PHFRINFC_LLCP_SAP_NUMBER))
+ {
+ status = PHNFCSTVAL(CID_FRI_NFC_LLCP_TRANSPORT, NFCSTATUS_INVALID_PARAMETER);
+ }
+ else
+ {
+ status = phFriNfc_LlcpTransport_ConnectionOriented_Connect(pLlcpSocket,
+ nSap,
+ NULL,
+ pConnect_RspCb,
+ pContext);
+ }
}
return status;
@@ -915,24 +970,29 @@
}
else
{
+ /* Implicit bind if socket is not already bound */
if(pLlcpSocket->eSocket_State != phFriNfc_LlcpTransportSocket_eSocketBound)
{
- /* Bind with a sSap Free */
- pLlcpSocket->socket_sSap = 32;
-
- for(i=0;i<PHFRINFC_LLCP_NB_SOCKET_MAX;i++)
+ status = phFriNfc_LlcpTransport_AutoBind(pLlcpSocket);
+ if (status != NFCSTATUS_SUCCESS)
{
- if(pLlcpSocket->socket_sSap == pLlcpSocket->psTransport->pSocketTable[i].socket_sSap)
- {
- pLlcpSocket->socket_sSap++;
- }
+ return status;
}
}
- status = phFriNfc_LlcpTransport_ConnectionOriented_Connect(pLlcpSocket,
- PHFRINFC_LLCP_SAP_DEFAULT,
- psUri,
- pConnect_RspCb,
- pContext);
+
+ /* Test the SAP range for non SDP-advertised services */
+ if(!IS_BETWEEN(pLlcpSocket->socket_sSap, PHFRINFC_LLCP_SAP_SDP_UNADVERTISED_FIRST, PHFRINFC_LLCP_SAP_NUMBER))
+ {
+ status = PHNFCSTVAL(CID_FRI_NFC_LLCP_TRANSPORT, NFCSTATUS_INVALID_PARAMETER);
+ }
+ else
+ {
+ status = phFriNfc_LlcpTransport_ConnectionOriented_Connect(pLlcpSocket,
+ PHFRINFC_LLCP_SAP_DEFAULT,
+ psUri,
+ pConnect_RspCb,
+ pContext);
+ }
}
return status;
diff --git a/src/phFriNfc_LlcpTransport_Connection.c b/src/phFriNfc_LlcpTransport_Connection.c
index fcdb246..b75406b 100644
--- a/src/phFriNfc_LlcpTransport_Connection.c
+++ b/src/phFriNfc_LlcpTransport_Connection.c
@@ -31,7 +31,6 @@
#include <phFriNfc_Llcp.h>
#include <phFriNfc_LlcpUtils.h>
-
/* Function definition */
static NFCSTATUS phFriNfc_Llcp_Send_DisconnectMode_Frame(phFriNfc_LlcpTransport_t* psTransport,
uint8_t dsap,
@@ -42,8 +41,24 @@
static NFCSTATUS phFriNfc_Llcp_Send_ReceiveNotReady_Frame(phFriNfc_LlcpTransport_Socket_t* pLlcpSocket);
+static NFCSTATUS static_performSendInfo(phFriNfc_LlcpTransport_Socket_t * psLlcpSocket);
+
/********** End Function definition ***********/
+NFCSTATUS phFriNfc_LlcpConnTransport_Send( phFriNfc_Llcp_t *Llcp,
+ phFriNfc_Llcp_sPacketHeader_t *psHeader,
+ phFriNfc_Llcp_sPacketSequence_t *psSequence,
+ phNfc_sData_t *psInfo,
+ phFriNfc_Llcp_Send_CB_t pfSend_CB,
+ phFriNfc_LlcpTransport_t* psTransport ) {
+ NFCSTATUS result = phFriNfc_Llcp_Send(Llcp, psHeader, psSequence, psInfo,
+ pfSend_CB, psTransport);
+ if (result == NFCSTATUS_PENDING) {
+ psTransport->bSendPending = TRUE;
+ }
+ return result;
+}
+
/* TODO: comment functionphFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB */
static void phFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB(void* pContext,
NFCSTATUS status)
@@ -73,16 +88,12 @@
sFrmrBuffer.buffer = psTransport->FrmrInfoBuffer;
sFrmrBuffer.length = 0x04; /* Size of FRMR Information field */
- /* Send Pending */
- psTransport->bSendPending = TRUE;
-
- result = phFriNfc_Llcp_Send(psTransport->pLlcp,
+ result = phFriNfc_LlcpConnTransport_Send(psTransport->pLlcp,
&psTransport->sLlcpHeader,
NULL,
&sFrmrBuffer,
phFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB,
psTransport);
-
}
else if(psTransport->bDmPending)
{
@@ -131,9 +142,9 @@
psTransport->pSocketTable[psTransport->socketIndex].pfSocketSend_Cb = NULL;
}
}break;
+ default: break;
}
-
/* Update Index value with the next socket */
index = psTransport->socketIndex+1;
@@ -183,31 +194,7 @@
/* Test the RW window */
if(CHECK_SEND_RW(psLocalLlcpSocket))
{
- /* Set the Header */
- psLocalLlcpSocket->sLlcpHeader.dsap = psLocalLlcpSocket->socket_dSap;
- psLocalLlcpSocket->sLlcpHeader.ptype = PHFRINFC_LLCP_PTYPE_I;
- psLocalLlcpSocket->sLlcpHeader.ssap = psLocalLlcpSocket->socket_sSap;
-
- /* Set Sequence Numbers */
- psLocalLlcpSocket->sSequence.ns = psLocalLlcpSocket->socket_VS;
- psLocalLlcpSocket->sSequence.nr = psLocalLlcpSocket->socket_VR;
-
- /* Send Pending */
- psTransport->bSendPending = TRUE;
-
- /* Store the index of the socket */
- psTransport->socketIndex = psLocalLlcpSocket->index ;
-
- /* Send I_PDU */
- result = phFriNfc_Llcp_Send(psTransport->pLlcp,
- &psLocalLlcpSocket->sLlcpHeader,
- &psLocalLlcpSocket->sSequence,
- &psLocalLlcpSocket->sSocketSendBuffer,
- phFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB,
- psTransport);
-
- /* Update VS */
- psLocalLlcpSocket->socket_VS = (psLocalLlcpSocket->socket_VS+1)%16;
+ result = static_performSendInfo(psLocalLlcpSocket);
/* Reset Send Pending Flag */
psLocalLlcpSocket->bSocketSendPending = FALSE;
@@ -243,9 +230,6 @@
psLocalLlcpSocket->sLlcpHeader.ptype = PHFRINFC_LLCP_PTYPE_CC;
psLocalLlcpSocket->sLlcpHeader.ssap = psLocalLlcpSocket->socket_sSap;
- /* Send Pending */
- psTransport->bSendPending = TRUE;
-
/* Set the socket state to accepted */
psLocalLlcpSocket->eSocket_State = phFriNfc_LlcpTransportSocket_eSocketAccepted;
@@ -253,7 +237,7 @@
psTransport->socketIndex = psLocalLlcpSocket->index;
/* Send a CC Frame */
- result = phFriNfc_Llcp_Send(psTransport->pLlcp,
+ result = phFriNfc_LlcpConnTransport_Send(psTransport->pLlcp,
&psLocalLlcpSocket->sLlcpHeader,
NULL,
&psLocalLlcpSocket->sSocketSendBuffer,
@@ -266,9 +250,6 @@
/* Reset Accept pending */
psLocalLlcpSocket->bSocketConnectPending = FALSE;
- /* Send Pending */
- psTransport->bSendPending = TRUE;
-
/* Store the index of the socket */
psTransport->socketIndex = psLocalLlcpSocket->index;
@@ -276,7 +257,7 @@
psLocalLlcpSocket->eSocket_State = phFriNfc_LlcpTransportSocket_eSocketConnecting;
/* send CONNECT */
- result = phFriNfc_Llcp_Send(psTransport->pLlcp,
+ result = phFriNfc_LlcpConnTransport_Send(psTransport->pLlcp,
&psLocalLlcpSocket->sLlcpHeader,
NULL,
&psLocalLlcpSocket->sSocketSendBuffer,
@@ -289,9 +270,6 @@
/* Reset Disc Pending */
psLocalLlcpSocket->bSocketDiscPending = FALSE;
- /* Send Pending */
- psTransport->bSendPending = TRUE;
-
/* Set the socket in connecting state */
psLocalLlcpSocket->eSocket_State = phFriNfc_LlcpTransportSocket_eSocketDisconnecting;
@@ -299,7 +277,7 @@
psTransport->socketIndex = psLocalLlcpSocket->index;
/* Send DISC */
- result = phFriNfc_Llcp_Send(psTransport->pLlcp,
+ result = phFriNfc_LlcpConnTransport_Send(psTransport->pLlcp,
&psLocalLlcpSocket->sLlcpHeader,
NULL,
&psLocalLlcpSocket->sSocketSendBuffer,
@@ -330,6 +308,43 @@
}
}
+static NFCSTATUS static_performSendInfo(phFriNfc_LlcpTransport_Socket_t * psLlcpSocket)
+{
+ phFriNfc_LlcpTransport_t *psTransport = psLlcpSocket->psTransport;
+ NFCSTATUS status;
+
+ /* Reset Send Pending */
+ psLlcpSocket->bSocketSendPending = FALSE;
+
+ /* Set the Header */
+ psLlcpSocket->sLlcpHeader.dsap = psLlcpSocket->socket_dSap;
+ psLlcpSocket->sLlcpHeader.ptype = PHFRINFC_LLCP_PTYPE_I;
+ psLlcpSocket->sLlcpHeader.ssap = psLlcpSocket->socket_sSap;
+
+ /* Set Sequence Numbers */
+ psLlcpSocket->sSequence.ns = psLlcpSocket->socket_VS;
+ psLlcpSocket->sSequence.nr = psLlcpSocket->socket_VR;
+
+ /* Update the VRA */
+ psLlcpSocket->socket_VRA = psLlcpSocket->socket_VR;
+
+ /* Store the index of the socket */
+ psTransport->socketIndex = psLlcpSocket->index;
+
+ /* Send I_PDU */
+ status = phFriNfc_LlcpConnTransport_Send(psTransport->pLlcp,
+ &psLlcpSocket->sLlcpHeader,
+ &psLlcpSocket->sSequence,
+ &psLlcpSocket->sSocketSendBuffer,
+ phFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB,
+ psTransport);
+
+ /* Update VS */
+ psLlcpSocket->socket_VS = (psLlcpSocket->socket_VS+1)%16;
+
+ return status;
+}
+
static void phFriNfc_LlcpTransport_ConnectionOriented_Abort(phFriNfc_LlcpTransport_Socket_t * pLlcpSocket)
{
if (pLlcpSocket->pfSocketSend_Cb != NULL)
@@ -400,11 +415,8 @@
psTransport->sDmPayload.buffer = &psTransport->DmInfoBuffer[2];
psTransport->sDmPayload.length = PHFRINFC_LLCP_DM_LENGTH;
- /* Send Pending */
- psTransport->bSendPending = TRUE;
-
/* Send DM frame */
- status = phFriNfc_Llcp_Send(psTransport->pLlcp,
+ status = phFriNfc_LlcpConnTransport_Send(psTransport->pLlcp,
&psTransport->sDmHeader,
NULL,
&psTransport->sDmPayload,
@@ -439,14 +451,11 @@
/* Update VRA */
pLlcpSocket->socket_VRA = (uint8_t)pLlcpSocket->sSequence.nr;
- /* Send Pending */
- pLlcpSocket->psTransport->bSendPending = TRUE;
-
/* Store the index of the socket */
pLlcpSocket->psTransport->socketIndex = pLlcpSocket->index;
/* Send RR frame */
- status = phFriNfc_Llcp_Send(pLlcpSocket->psTransport->pLlcp,
+ status = phFriNfc_LlcpConnTransport_Send(pLlcpSocket->psTransport->pLlcp,
&pLlcpSocket->sLlcpHeader,
&pLlcpSocket->sSequence,
NULL,
@@ -482,14 +491,11 @@
/* Update VRA */
pLlcpSocket->socket_VRA = (uint8_t)pLlcpSocket->sSequence.nr;
- /* Send Pending */
- pLlcpSocket->psTransport->bSendPending = TRUE;
-
/* Store the index of the socket */
pLlcpSocket->psTransport->socketIndex = pLlcpSocket->index;
/* Send RNR frame */
- status = phFriNfc_Llcp_Send(pLlcpSocket->psTransport->pLlcp,
+ status = phFriNfc_LlcpConnTransport_Send(pLlcpSocket->psTransport->pLlcp,
&pLlcpSocket->sLlcpHeader,
&pLlcpSocket->sSequence,
NULL,
@@ -573,11 +579,8 @@
sFrmrBuffer.buffer = psTransport->FrmrInfoBuffer;
sFrmrBuffer.length = 0x04; /* Size of FRMR Information field */
- /* Send Pending */
- psTransport->bSendPending = TRUE;
-
/* Send FRMR frame */
- status = phFriNfc_Llcp_Send(psTransport->pLlcp,
+ status = phFriNfc_LlcpConnTransport_Send(psTransport->pLlcp,
&psTransport->sLlcpHeader,
NULL,
&sFrmrBuffer,
@@ -1269,34 +1272,7 @@
/* Test if a send is pending at LLC layer */
if(psTransport->bSendPending != TRUE)
{
- /* Reset Send Pending */
- psLocalLlcpSocket->bSocketSendPending = FALSE;
-
- /* Send Pending */
- psTransport->bSendPending = TRUE;
-
- /* Store the index of the socket */
- psTransport->socketIndex = psLocalLlcpSocket->index;
-
- /* Set the Header */
- psLocalLlcpSocket->sLlcpHeader.dsap = psLocalLlcpSocket->socket_dSap;
- psLocalLlcpSocket->sLlcpHeader.ptype = PHFRINFC_LLCP_PTYPE_I;
- psLocalLlcpSocket->sLlcpHeader.ssap = psLocalLlcpSocket->socket_sSap;
-
- /* Set Sequence Numbers */
- psLocalLlcpSocket->sSequence.ns = psLocalLlcpSocket->socket_VS;
- psLocalLlcpSocket->sSequence.nr = psLocalLlcpSocket->socket_VR;
-
- /* Send I_PDU */
- status = phFriNfc_Llcp_Send(psTransport->pLlcp,
- &psLocalLlcpSocket->sLlcpHeader,
- &psLocalLlcpSocket->sSequence,
- &psLocalLlcpSocket->sSocketSendBuffer,
- phFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB,
- psTransport);
-
- /* Update VS */
- psLocalLlcpSocket->socket_VS = (psLocalLlcpSocket->socket_VS+1)%16;
+ status = static_performSendInfo(psLocalLlcpSocket);
}
}
else
@@ -1375,34 +1351,7 @@
/* Test if a send is pending at LLC layer */
if(psTransport->bSendPending != TRUE)
{
- /* Reset Send Pending */
- psLocalLlcpSocket->bSocketSendPending = FALSE;
-
- /* Send Pending */
- psTransport->bSendPending = TRUE;
-
- /* Store the index of the socket */
- psTransport->socketIndex = psLocalLlcpSocket->index;
-
- /* Set the Header */
- psLocalLlcpSocket->sLlcpHeader.dsap = psLocalLlcpSocket->socket_dSap;
- psLocalLlcpSocket->sLlcpHeader.ptype = PHFRINFC_LLCP_PTYPE_I;
- psLocalLlcpSocket->sLlcpHeader.ssap = psLocalLlcpSocket->socket_sSap;
-
- /* Set Sequence Numbers */
- psLocalLlcpSocket->sSequence.ns = psLocalLlcpSocket->socket_VS;
- psLocalLlcpSocket->sSequence.nr = psLocalLlcpSocket->socket_VR;
-
- /* Send I_PDU */
- status = phFriNfc_Llcp_Send(psTransport->pLlcp,
- &psLocalLlcpSocket->sLlcpHeader,
- &psLocalLlcpSocket->sSequence,
- &psLocalLlcpSocket->sSocketSendBuffer,
- phFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB,
- psTransport);
-
- /* Update VS */
- psLocalLlcpSocket->socket_VS = (psLocalLlcpSocket->socket_VS+1)%16;
+ status = static_performSendInfo(psLocalLlcpSocket);
}
}
else
@@ -1537,34 +1486,7 @@
/* Test if a send is pending at LLC layer */
if(psTransport->bSendPending != TRUE)
{
- /* Reset Send Pending */
- psLocalLlcpSocket->bSocketSendPending = FALSE;;
-
- /* Send Pending */
- psTransport->bSendPending = TRUE;
-
- /* Store the index of the socket */
- psTransport->socketIndex = psLocalLlcpSocket->index;
-
- /* Set the Header */
- psLocalLlcpSocket->sLlcpHeader.dsap = psLocalLlcpSocket->socket_dSap;
- psLocalLlcpSocket->sLlcpHeader.ptype = PHFRINFC_LLCP_PTYPE_I;
- psLocalLlcpSocket->sLlcpHeader.ssap = psLocalLlcpSocket->socket_sSap;
-
- /* Set Sequence Numbers */
- psLocalLlcpSocket->sSequence.ns = psLocalLlcpSocket->socket_VS;
- psLocalLlcpSocket->sSequence.nr = psLocalLlcpSocket->socket_VR;
-
- /* Send I_PDU */
- status = phFriNfc_Llcp_Send(psTransport->pLlcp,
- &psLocalLlcpSocket->sLlcpHeader,
- &psLocalLlcpSocket->sSequence,
- &psLocalLlcpSocket->sSocketSendBuffer,
- phFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB,
- psTransport);
-
- /* Update VS */
- psLocalLlcpSocket->socket_VS = (psLocalLlcpSocket->socket_VS+1)%16;
+ status = static_performSendInfo(psLocalLlcpSocket);
}
}
}
@@ -1673,34 +1595,7 @@
/* Test if a send is pending at LLC layer */
if(psTransport->bSendPending != TRUE)
{
- /* Reset Send Pending */
- psLocalLlcpSocket->bSocketSendPending = FALSE;
-
- /* Send Pending */
- psTransport->bSendPending = TRUE;
-
- /* Set the Header */
- psLocalLlcpSocket->sLlcpHeader.dsap = psLocalLlcpSocket->socket_dSap;
- psLocalLlcpSocket->sLlcpHeader.ptype = PHFRINFC_LLCP_PTYPE_I;
- psLocalLlcpSocket->sLlcpHeader.ssap = psLocalLlcpSocket->socket_sSap;
-
- /* Set Sequence Numbers */
- psLocalLlcpSocket->sSequence.ns = psLocalLlcpSocket->socket_VS;
- psLocalLlcpSocket->sSequence.nr = psLocalLlcpSocket->socket_VR;
-
- /* Store the index of the socket */
- psTransport->socketIndex = psLocalLlcpSocket->index;
-
- /* Send I_PDU */
- status = phFriNfc_Llcp_Send(psTransport->pLlcp,
- &psLocalLlcpSocket->sLlcpHeader,
- &psLocalLlcpSocket->sSequence,
- &psLocalLlcpSocket->sSocketSendBuffer,
- phFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB,
- psTransport);
-
- /* Update VS */
- psLocalLlcpSocket->socket_VS = (psLocalLlcpSocket->socket_VS+1)%16;
+ status = static_performSendInfo(psLocalLlcpSocket);
}
}
}
@@ -2129,9 +2024,6 @@
pLlcpSocket->sLlcpHeader.ptype = PHFRINFC_LLCP_PTYPE_CC;
pLlcpSocket->sLlcpHeader.ssap = pLlcpSocket->socket_sSap;
- /* Send Pending */
- pLlcpSocket->psTransport->bSendPending = TRUE;
-
/* Set the socket state to accepted */
pLlcpSocket->eSocket_State = phFriNfc_LlcpTransportSocket_eSocketAccepted;
@@ -2142,7 +2034,7 @@
pLlcpSocket->psTransport->socketIndex = pLlcpSocket->index;
/* Send a CC Frame */
- status = phFriNfc_Llcp_Send(pLlcpSocket->psTransport->pLlcp,
+ status = phFriNfc_LlcpConnTransport_Send(pLlcpSocket->psTransport->pLlcp,
&pLlcpSocket->sLlcpHeader,
NULL,
&pLlcpSocket->sSocketSendBuffer,
@@ -2324,9 +2216,6 @@
}
else
{
- /* Send Pending */
- pLlcpSocket->psTransport->bSendPending = TRUE;
-
/* Update Send Buffer length value */
pLlcpSocket->sSocketSendBuffer.length = offset;
@@ -2335,8 +2224,7 @@
/* Store the index of the socket */
pLlcpSocket->psTransport->socketIndex = pLlcpSocket->index;
-
- status = phFriNfc_Llcp_Send(pLlcpSocket->psTransport->pLlcp,
+ status = phFriNfc_LlcpConnTransport_Send(pLlcpSocket->psTransport->pLlcp,
&pLlcpSocket->sLlcpHeader,
NULL,
&pLlcpSocket->sSocketSendBuffer,
@@ -2437,13 +2325,10 @@
}
else
{
- /* Send Pending */
- pLlcpSocket->psTransport->bSendPending = TRUE;
-
/* Store the index of the socket */
pLlcpSocket->psTransport->socketIndex = pLlcpSocket->index;
- status = phFriNfc_Llcp_Send(pLlcpSocket->psTransport->pLlcp,
+ status = phFriNfc_LlcpConnTransport_Send(pLlcpSocket->psTransport->pLlcp,
&pLlcpSocket->sLlcpHeader,
NULL,
NULL,
@@ -2610,59 +2495,32 @@
}
else
{
+ /* Store send buffer pointer */
+ pLlcpSocket->sSocketSendBuffer = *psBuffer;
+
+ /* Store the Send CB and context */
+ pLlcpSocket->pfSocketSend_Cb = pSend_RspCb;
+ pLlcpSocket->pSendContext = pContext;
+
/* Test if a send is pending */
if(pLlcpSocket->psTransport->bSendPending == TRUE)
{
- /* Store the Send CB and context */
- pLlcpSocket->pfSocketSend_Cb = pSend_RspCb;
- pLlcpSocket->pSendContext = pContext;
-
/* Set Send pending */
pLlcpSocket->bSocketSendPending = TRUE;
- /* Store send buffer pointer */
- pLlcpSocket->sSocketSendBuffer = *psBuffer;
-
/* Set status */
status = NFCSTATUS_PENDING;
}
else
{
- /* Store the Send CB and context */
- pLlcpSocket->pfSocketSend_Cb = pSend_RspCb;
- pLlcpSocket->pSendContext = pContext;
-
- /* Set the Header */
- pLlcpSocket->sLlcpHeader.dsap = pLlcpSocket->socket_dSap;
- pLlcpSocket->sLlcpHeader.ptype = PHFRINFC_LLCP_PTYPE_I;
- pLlcpSocket->sLlcpHeader.ssap = pLlcpSocket->socket_sSap;
-
- /* Set Sequence Numbers */
- pLlcpSocket->sSequence.ns = pLlcpSocket->socket_VS;
- pLlcpSocket->sSequence.nr = pLlcpSocket->socket_VR;
-
- /* Send Pending */
- pLlcpSocket->psTransport->bSendPending = TRUE;
-
- /* Store the index of the socket */
- pLlcpSocket->psTransport->socketIndex = pLlcpSocket->index;
-
- /* Send I_PDU */
- status = phFriNfc_Llcp_Send(pLlcpSocket->psTransport->pLlcp,
- &pLlcpSocket->sLlcpHeader,
- &pLlcpSocket->sSequence,
- psBuffer,
- phFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB,
- pLlcpSocket->psTransport);
+ /* Perform I-Frame send */
+ status = static_performSendInfo(pLlcpSocket);
if(status != NFCSTATUS_PENDING)
{
LLCP_PRINT("Release Send callback");
pLlcpSocket->pfSocketSend_Cb = NULL;
pLlcpSocket->pSendContext = NULL;
}
-
- /* Update VS */
- pLlcpSocket->socket_VS = (pLlcpSocket->socket_VS+1)%16;
}
}
@@ -2789,33 +2647,32 @@
if(dataLengthRead != 0)
{
/* Test If data is present in the RW Buffer */
- if(pLlcpSocket->indexRwRead != pLlcpSocket->indexRwWrite)
+ while(pLlcpSocket->indexRwRead != pLlcpSocket->indexRwWrite)
{
- do
+ /* Get the data length available in the linear buffer */
+ dataLengthAvailable = phFriNfc_Llcp_CyclicFifoAvailable(&pLlcpSocket->sCyclicFifoBuffer);
+
+ /* Exit if not enough memory available in linear buffer */
+ if(dataLengthAvailable < pLlcpSocket->sSocketRwBufferTable[(pLlcpSocket->indexRwRead%pLlcpSocket->localRW)].length)
{
- /* Get the data length available in the linear buffer */
- dataLengthAvailable = phFriNfc_Llcp_CyclicFifoAvailable(&pLlcpSocket->sCyclicFifoBuffer);
+ break;
+ }
- /* Test if enought place is available */
- if(dataLengthAvailable > pLlcpSocket->sSocketRwBufferTable[(pLlcpSocket->indexRwRead%pLlcpSocket->localRW)].length )
- {
- /* Write data into the linear buffer */
- dataLengthWrite = phFriNfc_Llcp_CyclicFifoWrite(&pLlcpSocket->sCyclicFifoBuffer,
- pLlcpSocket->sSocketRwBufferTable[(pLlcpSocket->indexRwRead%pLlcpSocket->localRW)].buffer,
- pLlcpSocket->sSocketRwBufferTable[(pLlcpSocket->indexRwRead%pLlcpSocket->localRW)].length);
- /* Update VR */
- pLlcpSocket->socket_VR = (pLlcpSocket->socket_VR+1)%16;
+ /* Write data into the linear buffer */
+ dataLengthWrite = phFriNfc_Llcp_CyclicFifoWrite(&pLlcpSocket->sCyclicFifoBuffer,
+ pLlcpSocket->sSocketRwBufferTable[(pLlcpSocket->indexRwRead%pLlcpSocket->localRW)].buffer,
+ pLlcpSocket->sSocketRwBufferTable[(pLlcpSocket->indexRwRead%pLlcpSocket->localRW)].length);
+ /* Update VR */
+ pLlcpSocket->socket_VR = (pLlcpSocket->socket_VR+1)%16;
- /* Set flag bufferized to TRUE */
- dataBufferized = TRUE;
+ /* Set flag bufferized to TRUE */
+ dataBufferized = TRUE;
- /* Update RW Buffer length */
- pLlcpSocket->sSocketRwBufferTable[(pLlcpSocket->indexRwRead%pLlcpSocket->localRW)].length = 0;
+ /* Update RW Buffer length */
+ pLlcpSocket->sSocketRwBufferTable[(pLlcpSocket->indexRwRead%pLlcpSocket->localRW)].length = 0;
- /* Update Value Rw Read Index*/
- pLlcpSocket->indexRwRead++;
- }
- }while(dataLengthAvailable > pLlcpSocket->sSocketRwBufferTable[(pLlcpSocket->indexRwRead%pLlcpSocket->localRW)].length);
+ /* Update Value Rw Read Index*/
+ pLlcpSocket->indexRwRead++;
}
/* Test if data has been bufferized after a read access */
diff --git a/src/phFriNfc_TopazDynamicMap.c b/src/phFriNfc_TopazDynamicMap.c
index 697604d..2aa29ea 100644
--- a/src/phFriNfc_TopazDynamicMap.c
+++ b/src/phFriNfc_TopazDynamicMap.c
@@ -1010,7 +1010,7 @@
lock_byte_index = (uint8_t)(lock_byte_index + 1);
byte_index = (uint8_t)(byte_index + 1);
}
- } /* else of /* if (mod_value) */
+ } /* 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) */
@@ -3848,7 +3848,7 @@
#endif /* #ifdef TOPAZ_RAW_SUPPORT */
psNdefMap->State = (uint8_t)PH_FRINFC_TOPAZ_STATE_WRITE;
- if ((write_len - psNdefMap->ApduBuffIndex) >= TOPAZ_WRITE_8_DATA_LENGTH)
+ if ((write_len - psNdefMap->ApduBuffIndex) >= (uint16_t)TOPAZ_WRITE_8_DATA_LENGTH)
{
copy_length = (uint8_t)TOPAZ_WRITE_8_DATA_LENGTH;
(void)memcpy ((void *)write_buf,
diff --git a/src/phHal4Nfc.c b/src/phHal4Nfc.c
index 726b4b5..341f183 100644
--- a/src/phHal4Nfc.c
+++ b/src/phHal4Nfc.c
@@ -153,11 +153,7 @@
gpphHal4Nfc_Hwref = NULL;
PHDBG_INFO("Hal4:Open Failed");
/*Call upper layer's Open Cb with error status*/
- if(NULL != pUpper_OpenCb)
- {
- /*Upper layer's Open Cb*/
(*pUpper_OpenCb)(pUpper_Context,status);
- }
}
return;
}
@@ -306,15 +302,17 @@
#include <utils/Log.h>
#include <dlfcn.h>
-const unsigned char *nxp_nfc_full_version;
-const unsigned char *nxp_nfc_fw;
+#define FW_PATH "/system/vendor/firmware/libpn544_fw.so"
+
+const unsigned char *nxp_nfc_full_version = NULL;
+const unsigned char *nxp_nfc_fw = NULL;
int dlopen_firmware() {
void *p;
- void *handle = dlopen("/system/lib/libpn544_fw.so", RTLD_NOW);
+ void *handle = dlopen(FW_PATH, RTLD_NOW);
if (handle == NULL) {
- LOGE("Could not open libpn544.so");
+ LOGE("Could not open %s", FW_PATH);
return -1;
}
@@ -408,7 +406,7 @@
if( openRetVal == NFCSTATUS_SUCCESS )
{
/*update Next state*/
- Hal4Ctxt->Hal4NextState = (HCI_NFC_DEVICE_TEST == eHciInitType?
+ Hal4Ctxt->Hal4NextState = (HCI_SELF_TEST == eHciInitType?
eHal4StateSelfTestMode:eHal4StateOpenAndReady);
/*Store callback and context ,and set Default settings in Context*/
Hal4Ctxt->sUpperLayerInfo.pUpperOpenCb = pOpenCallback;
@@ -472,17 +470,13 @@
else if(NULL == psHwReference->hal_context)
{
#ifdef FW_DOWNLOAD
-
-#if !defined (NXP_FW_INTEGRITY_VERIFY)
if(NFC_FW_DOWNLOAD_CHECK == IoctlCode)
{
RetStatus = phDnldNfc_Run_Check(
psHwReference
);
}
- else
-#endif /* !defined (NXP_FW_INTEGRITY_VERIFY) */
- if((NFC_FW_DOWNLOAD == IoctlCode)
+ else if((NFC_FW_DOWNLOAD == IoctlCode)
&&(NULL == gpphHal4Nfc_Hwref))/*Indicates current state is shutdown*/
{
Hal4Ctxt = (phHal4Nfc_Hal4Ctxt_t *)
@@ -511,9 +505,7 @@
phHal4Nfc_DownloadComplete,
Hal4Ctxt
);
- if((NFCSTATUS_SUCCESS == RetStatus)
- || (NFCSTATUS_PENDING != PHNFCSTATUS(RetStatus))
- )
+ if(NFCSTATUS_SUCCESS == RetStatus)
{
phOsalNfc_FreeMemory(Hal4Ctxt);
((phHal_sHwReference_t *)psHwReference)->hal_context = NULL;
@@ -1016,15 +1008,10 @@
break;
case NFC_NOTIFY_DEVICE_ERROR:
{
- NFCSTATUS status = NFCSTATUS_BOARD_COMMUNICATION_ERROR;
- pphHal4Nfc_GenCallback_t pUpper_OpenCb
- = Hal4Ctxt->sUpperLayerInfo.pUpperOpenCb;
- void *pUpper_Context
- = Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt;
static phHal4Nfc_NotificationInfo_t uNotificationInfo;
+ Hal4Ctxt->Hal4NextState = eHal4StateInvalid;
if(NULL != Hal4Ctxt->sUpperLayerInfo.pDefaultEventHandler)
{
- Hal4Ctxt->Hal4NextState = eHal4StateInvalid;
Hal4Ctxt->sUpperLayerInfo.pDefaultEventHandler(
Hal4Ctxt->sUpperLayerInfo.DefaultListenerCtxt,
NFC_EVENT_NOTIFICATION,
@@ -1032,31 +1019,8 @@
NFCSTATUS_BOARD_COMMUNICATION_ERROR
);
}
- else if (( eHal4StateSelfTestMode == Hal4Ctxt->Hal4NextState )
- || ( eHal4StateOpenAndReady == Hal4Ctxt->Hal4NextState ) )
- {
- Hal4Ctxt->Hal4CurrentState = eHal4StateClosed;
- Hal4Ctxt->Hal4NextState = eHal4StateInvalid;
- (void)phHciNfc_Release((void *)Hal4Ctxt->psHciHandle,
- pHwRef, (pphNfcIF_Notification_CB_t)NULL,
- (void *)Hal4Ctxt);/*Clean up Hci*/
- Hal4Ctxt->psHciHandle = NULL;
- phOsalNfc_FreeMemory((void *)Hal4Ctxt->pHal4Nfc_LayerCfg);
- Hal4Ctxt->pHal4Nfc_LayerCfg = NULL;
- phOsalNfc_FreeMemory((void *)Hal4Ctxt);
- gpphHal4Nfc_Hwref->hal_context = NULL;
- gpphHal4Nfc_Hwref = NULL;
- PHDBG_INFO("Hal4:Open Failed");
- /*Call upper layer's Open Cb with error status*/
- if(NULL != pUpper_OpenCb)
- {
- /*Upper layer's Open Cb*/
- (*pUpper_OpenCb)(pUpper_Context,status);
- }
- }
else
{
- Hal4Ctxt->Hal4NextState = eHal4StateInvalid;
phOsalNfc_RaiseException(phOsalNfc_e_UnrecovFirmwareErr,1);
}
break;
@@ -1254,7 +1218,6 @@
case NFC_INFO_TXLDO_OVERCUR:
case NFC_INFO_MEM_VIOLATION:
case NFC_INFO_TEMP_OVERHEAT:
- case NFC_INFO_LLC_ERROR:
{
sNotificationInfo.info = psEventInfo;
sNotificationInfo.status = NFCSTATUS_SUCCESS;
@@ -1331,23 +1294,10 @@
= Hal4Ctxt->sUpperLayerInfo.pUpperIoctlCb;
void *pUpper_Context = Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt;
/*check for Success*/
- if(( DEVMGMT_SWP_TEST == Hal4Ctxt->Ioctl_Type )
- || ( DEVMGMT_ANTENNA_TEST == Hal4Ctxt->Ioctl_Type ))
+ if((SelfTestResults->length > 0) && (0 == SelfTestResults->buffer[0]))
{
status = NFCSTATUS_SUCCESS;
}
- else if((SelfTestResults->length > 0) && (0 == SelfTestResults->buffer[0]))
- {
- status = NFCSTATUS_SUCCESS;
- }
- else
- {
- if (NULL != pInfo)
- {
- status = ((phNfc_sCompletionInfo_t *)pInfo)->status;
- }
- }
-
/*Copy response buffer and length*/
(void)memcpy(Hal4Ctxt->sUpperLayerInfo.pIoctlOutParam->buffer,
SelfTestResults->buffer,
@@ -1406,8 +1356,7 @@
{
/*for NFC_MEM_READ and NFC_GPIO_READ ,provide one Byte Response*/
if ((NFC_MEM_READ == Hal4Ctxt->Ioctl_Type)
- || (NFC_GPIO_READ == Hal4Ctxt->Ioctl_Type)
- )
+ || (NFC_GPIO_READ == Hal4Ctxt->Ioctl_Type))
{
Hal4Ctxt->sUpperLayerInfo.pIoctlOutParam->length
= sizeof (uint8_t);
diff --git a/src/phHal4Nfc_ADD.c b/src/phHal4Nfc_ADD.c
index 0be1670..5751219 100644
--- a/src/phHal4Nfc_ADD.c
+++ b/src/phHal4Nfc_ADD.c
@@ -489,17 +489,13 @@
psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.UidLength))
{
aRemoteDevTypes[Count] = phHal_eMifare_PICC;
-
+ Count++;
}
- else/*TYPE 3A*/
- {
- aRemoteDevTypes[Count] = phHal_eISO14443_3A_PICC;
- }
- Count++;
}
- else if ( !(Sak & ISO_14443_BITMASK) &&
- !(Sak & NFCIP_BITMASK) && (0 == Count))
+ if ( !(Sak & NFCIP_BITMASK) )
{
+ // Always add a separate 3A target on a separate
+ // handle, so the upper layers can connect to it.
aRemoteDevTypes[Count] = phHal_eISO14443_3A_PICC;
Count++;
}
diff --git a/src/phHal4Nfc_Internal.h b/src/phHal4Nfc_Internal.h
index 8675c55..50f4ea1 100644
--- a/src/phHal4Nfc_Internal.h
+++ b/src/phHal4Nfc_Internal.h
@@ -226,6 +226,7 @@
/*used to ignore multiple Protected events*/
uint8_t Ignore_Event_Protected;
#endif/*#ifdef IGNORE_EVT_PROTECTED*/
+ uint8_t FelicaIDm[(PHHAL_FEL_ID_LEN + 2)];
}phHal4Nfc_Hal4Ctxt_t;
diff --git a/src/phHal4Nfc_Reader.c b/src/phHal4Nfc_Reader.c
index b767858..5a91e85 100644
--- a/src/phHal4Nfc_Reader.c
+++ b/src/phHal4Nfc_Reader.c
@@ -51,6 +51,7 @@
#define PH_HAL4NFC_SEL_SECTOR2_BYTE0 0x02
#define PH_HAL4NFC_SEL_SECTOR2_BYTE_RESERVED 0x00
+phHal4Nfc_Hal4Ctxt_t *gpHal4Ctxt;
/* --------------------Structures and enumerations --------------------------*/
@@ -962,13 +963,24 @@
/*allow only one Presence chk command at any point in time*/
if (eHal4StatePresenceCheck != Hal4Ctxt->Hal4NextState)
{
+ /* Check if remote device is felica */
+ if (Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->RemDevType ==
+ phHal_eFelica_PICC)
+ {
+ /* If felica PICC then copy existing IDm to compare later,
+ If IDm will be same then same PICC is present after presence check
+ else PICC is changed */
+ (void) memcpy(Hal4Ctxt->FelicaIDm,
+ Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->RemoteDevInfo.Felica_Info.IDm,
+ Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->RemoteDevInfo.Felica_Info.IDmLength);
+ }
Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt = context;
Hal4Ctxt->sTgtConnectInfo.pPresenceChkCb = pPresenceChkCb;
RetStatus = phHciNfc_Presence_Check(Hal4Ctxt->psHciHandle,
psHwReference
);
Hal4Ctxt->Hal4NextState = (NFCSTATUS_PENDING == RetStatus?
- eHal4StatePresenceCheck:Hal4Ctxt->Hal4NextState);
+ eHal4StatePresenceCheck:Hal4Ctxt->Hal4NextState);
}
else/*Ongoing presence chk*/
{
@@ -990,6 +1002,28 @@
{
Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->SessionOpened
=(uint8_t)(NFCSTATUS_SUCCESS == RetStatus?TRUE:FALSE);
+ /* Check if remote device is felica */
+ if (Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->RemDevType ==
+ phHal_eFelica_PICC)
+ {
+ /* Check if IDm received is same as saved */
+ if (0 != phOsalNfc_MemCompare(Hal4Ctxt->FelicaIDm,
+ Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->RemoteDevInfo.Felica_Info.IDm,
+ Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->RemoteDevInfo.Felica_Info.IDmLength))
+ {
+ RetStatus = NFCSTATUS_FAILED;
+
+ /* Presence check failed so reset remote device information */
+ (void) memset(Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->RemoteDevInfo.Felica_Info.IDm,
+ 0, PHHAL_FEL_ID_LEN + 2);
+ (void) memset(Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->RemoteDevInfo.Felica_Info.PMm,
+ 0, PHHAL_FEL_PM_LEN);
+ }
+
+ /* Cleanup for stored IDm value for using it next time */
+ (void) memset(Hal4Ctxt->FelicaIDm, 0, PHHAL_FEL_ID_LEN + 2);
+ }
+
(*Hal4Ctxt->sTgtConnectInfo.pPresenceChkCb)(
Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt,
RetStatus
@@ -1035,7 +1069,28 @@
return;
}
+void phHal4Nfc_Felica_RePoll(void *context,
+ NFCSTATUS status)
+{
+ phHal4Nfc_Hal4Ctxt_t *Hal4Ctxt = gpHal4Ctxt;
+ pphHal4Nfc_ConnectCallback_t pUpperConnectCb
+ = Hal4Ctxt->sTgtConnectInfo.pUpperConnectCb;
+ Hal4Ctxt->sTgtConnectInfo.pUpperConnectCb = NULL;
+ PHDBG_INFO("Hal4:Calling Connect callback");
+
+ if (pUpperConnectCb != NULL)
+ {
+ /*Notify to the upper layer*/
+ (*pUpperConnectCb)(
+ Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt,
+ Hal4Ctxt->sTgtConnectInfo.psConnectedDevice,
+ status
+ );
+ }
+
+ return;
+}
void phHal4Nfc_ConnectComplete(
phHal4Nfc_Hal4Ctxt_t *Hal4Ctxt,
void *pInfo
@@ -1046,18 +1101,25 @@
= Hal4Ctxt->sTgtConnectInfo.pUpperConnectCb;
/*Flag to decide whether or not upper layer callback has to be called*/
uint8_t CallConnectCb = TRUE;
+ uint8_t felicaRePoll = FALSE;
+
/*Remote device Connect successful*/
if((NFCSTATUS_SUCCESS == ConnectStatus)
||(eHal4StateTargetConnected == Hal4Ctxt->Hal4CurrentState))
{
+ phHal_sRemoteDevInformation_t *psRmtTgtConnected =
+ Hal4Ctxt->sTgtConnectInfo.psConnectedDevice;
PHDBG_INFO("Hal4:Connect status Success");
Hal4Ctxt->Hal4CurrentState = eHal4StateTargetConnected;
Hal4Ctxt->Hal4NextState = eHal4StateInvalid;
/* Open the Session */
- Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->SessionOpened =
+ psRmtTgtConnected->SessionOpened =
(uint8_t)(NFCSTATUS_SUCCESS == ConnectStatus?TRUE:FALSE);
Hal4Ctxt->sTgtConnectInfo.pUpperConnectCb = NULL;
-
+ if (psRmtTgtConnected->RemDevType == phHal_eFelica_PICC)
+ {
+ felicaRePoll = TRUE;
+ }
}
else/*Remote device Connect failed*/
{
@@ -1094,13 +1156,37 @@
}
if(TRUE == CallConnectCb)
{
- PHDBG_INFO("Hal4:Calling Connect callback");
- /*Notify to the upper layer*/
- (*pUpperConnectCb)(
+ if (felicaRePoll == TRUE)
+ {
+ /* Felica repoll through presence check */
+
+ /* If felica PICC then copy existing IDm to compare later,
+ If IDm will be same then same PICC is present after presence check
+ else PICC is changed */
+ (void) memcpy(Hal4Ctxt->FelicaIDm,
+ Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->RemoteDevInfo.Felica_Info.IDm,
+ Hal4Ctxt->sTgtConnectInfo.psConnectedDevice->RemoteDevInfo.Felica_Info.IDmLength);
+
+ gpHal4Ctxt = Hal4Ctxt;
+ Hal4Ctxt->sTgtConnectInfo.pPresenceChkCb = phHal4Nfc_Felica_RePoll;
+ ConnectStatus = phHciNfc_Presence_Check(Hal4Ctxt->psHciHandle,
+ gpphHal4Nfc_Hwref
+ );
+ Hal4Ctxt->Hal4NextState = (NFCSTATUS_PENDING == ConnectStatus?
+ eHal4StatePresenceCheck:Hal4Ctxt->Hal4NextState);
+ felicaRePoll = FALSE;
+ Hal4Ctxt->sTgtConnectInfo.pUpperConnectCb = pUpperConnectCb;
+ }
+ else
+ {
+ PHDBG_INFO("Hal4:Calling Connect callback");
+ /*Notify to the upper layer*/
+ (*pUpperConnectCb)(
Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt,
Hal4Ctxt->sTgtConnectInfo.psConnectedDevice,
ConnectStatus
);
+ }
}
else
{
diff --git a/src/phHciNfc.c b/src/phHciNfc.c
index 9400820..d6990c1 100644
--- a/src/phHciNfc.c
+++ b/src/phHciNfc.c
@@ -95,7 +95,7 @@
)
{
phHciNfc_sContext_t *psHciContext = NULL;
- phNfcIF_sReference_t hciReference = { NULL };
+ phNfcIF_sReference_t hciReference = { NULL, 0, 0 };
phNfcIF_sCallBack_t if_callback = { NULL, NULL, NULL, NULL };
phNfc_sLowerIF_t *plower_if = NULL;
NFCSTATUS status = NFCSTATUS_SUCCESS;
diff --git a/src/phHciNfc.h b/src/phHciNfc.h
index 4f52b4a..f360413 100644
--- a/src/phHciNfc.h
+++ b/src/phHciNfc.h
@@ -78,9 +78,8 @@
typedef enum phHciNfc_Init
{
HCI_SESSION = 0x00,
- HCI_NFC_DEVICE_TEST,
- HCI_CUSTOM_INIT,
- HCI_SELF_TEST
+ HCI_SELF_TEST,
+ HCI_CUSTOM_INIT
}phHciNfc_Init_t;
/** \ingroup grp_hal_hci
@@ -264,7 +263,7 @@
* of the HCI Layer.
* \param[in] pHwRef pHwRef is the Information of
* the Device Interface Link .
- * \param[in] discovery_type If True: Start re-polling of the target
+ * \param[in] re_poll If True: Start re-polling of the target
* after the Target Device is de-activated
* or else - continue discovery with next
* technology.
@@ -280,7 +279,7 @@
phHciNfc_Restart_Discovery (
void *psHciHandle,
void *pHwRef,
- uint8_t discovery_type
+ uint8_t repoll
);
@@ -496,11 +495,10 @@
* of the HCI Layer.
* \param[in] pHwRef pHwRef is the Information of
* the Device Interface Link .
- * \param[in] discovery_type If NFC_RF_DISCOVERY_REPOLL: Start re-polling of
- * the target after the Target Device is
- * de-activatedor if NFC_RF_DISCOVERY_CONTINUE -
- * continue discovery with next technology or
- * stop the discovery wheel.
+ * \param[in] re_poll If True: Start re-polling of the target
+ * after the Target Device is de-activated
+ * or else - continue discovery with next
+ * technology.
*
* \retval NFCSTATUS_PENDING To De-select the remote target pending.
* \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
@@ -514,7 +512,7 @@
phHciNfc_Disconnect (
void *psHciHandle,
void *pHwRef,
- uint8_t discovery_type
+ uint8_t re_poll
);
diff --git a/src/phHciNfc_DevMgmt.c b/src/phHciNfc_DevMgmt.c
index 5b3eddc..ef3aa78 100644
--- a/src/phHciNfc_DevMgmt.c
+++ b/src/phHciNfc_DevMgmt.c
@@ -71,7 +71,6 @@
#define NXP_EVT_INFO_EXT_RF_FIELD 0x12U
#define NXP_EVT_INFO_MEM_VIOLATION 0x13U
#define NXP_EVT_INFO_TEMP_OVERHEAT 0x14U
-#define NXP_EVT_INFO_LLC_ERROR 0x15U
#define NFC_DEV_TXLDO_MASK 0x03U
@@ -119,6 +118,7 @@
DEV_MGMT_LLC_GRD_TO_L,
DEV_MGMT_LLC_ACK_TO_H,
DEV_MGMT_LLC_ACK_TO_L,
+ DEV_MGMT_FELICA_RC,
DEV_MGMT_EVT_AUTONOMOUS,
DEV_MGMT_PIPE_CLOSE
} phHciNfc_DevMgmt_Seq_t;
@@ -518,18 +518,8 @@
pHwRef, p_pipe_info );
if(status == NFCSTATUS_SUCCESS)
{
-
- if ((HCI_SELF_TEST == psHciContext->init_mode )
- || (HCI_NFC_DEVICE_TEST == psHciContext->init_mode ))
- {
- p_device_mgmt_info->next_seq =
- DEV_MGMT_GPIO_PDIR;
- }
- else
- {
- p_device_mgmt_info->next_seq =
- DEV_MGMT_GET_EEPROM_INFO;
- }
+ p_device_mgmt_info->next_seq =
+ DEV_MGMT_FELICA_RC;
status = NFCSTATUS_PENDING;
}
break;
@@ -581,6 +571,26 @@
}
break;
}
+ case DEV_MGMT_FELICA_RC:
+ {
+ config = 0x00;
+ status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,
+ NFC_FELICA_RC_ADDR , config );
+ if(NFCSTATUS_PENDING == status )
+ {
+ if (HCI_SELF_TEST == psHciContext->init_mode )
+ {
+ p_device_mgmt_info->next_seq =
+ DEV_MGMT_GPIO_PDIR;
+ }
+ else
+ {
+ p_device_mgmt_info->next_seq =
+ DEV_MGMT_GET_EEPROM_INFO;
+ }
+ }
+ break;
+ }
#if ( NXP_NFC_IFC_TIMEOUT & 0x01 )
@@ -643,27 +653,18 @@
#endif /* #if ( NXP_NFC_IFC_TIMEOUT & 0x01 ) */
case DEV_MGMT_TX_LDO:
{
-#if ( NXP_HAL_VERIFY_EEPROM_CRC & 0x01U )
- if (0 != p_device_mgmt_info->eeprom_crc)
- {
- status = NFCSTATUS_FAILED;
- }
- else
-#endif
- {
- config = (NFC_DEV_HWCONF_DEFAULT |
+ config = (NFC_DEV_HWCONF_DEFAULT |
(NXP_DEFAULT_TX_LDO & NFC_DEV_TXLDO_MASK));
- status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,
+ status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,
NFC_ADDRESS_HW_CONF , config );
- if(NFCSTATUS_PENDING == status )
- {
+ if(NFCSTATUS_PENDING == status )
+ {
#if ( SW_TYPE_RF_TUNING_BF & 0x01)
- p_device_mgmt_info->next_seq = DEV_MGMT_ANAIRQ_CONF;
+ p_device_mgmt_info->next_seq = DEV_MGMT_ANAIRQ_CONF;
#else
- p_device_mgmt_info->next_seq = DEV_MGMT_CLK_REQ;
+ p_device_mgmt_info->next_seq = DEV_MGMT_CLK_REQ;
#endif
- /* status = NFCSTATUS_SUCCESS; */
- }
+ /* status = NFCSTATUS_SUCCESS; */
}
break;
}
@@ -1063,20 +1064,17 @@
{
p_device_mgmt_info->current_seq = DEV_MGMT_PIPE_OPEN;
p_device_mgmt_info->next_seq = DEV_MGMT_PIPE_OPEN ;
- break;
- }
+ }break;
case UPDATE_SEQ:
{
p_device_mgmt_info->current_seq = p_device_mgmt_info->next_seq;
- break;
- }
+ }break;
case REL_SEQ:
{
p_device_mgmt_info->current_seq = DEV_MGMT_EVT_AUTONOMOUS;
p_device_mgmt_info->next_seq = DEV_MGMT_EVT_AUTONOMOUS ;
- break;
- }
+ }break;
default:
{
break;
@@ -1121,8 +1119,6 @@
}
else
{
- phHciNfc_DevMgmt_Info_t *p_device_mgmt_info = (phHciNfc_DevMgmt_Info_t *)
- psHciContext->p_device_mgmt_info ;
p_pipe_info = ((phHciNfc_DevMgmt_Info_t *)
psHciContext->p_device_mgmt_info)->p_pipe_info ;
switch(test_type)
@@ -1140,8 +1136,6 @@
p_pipe_info->param_info = test_param->buffer;
p_pipe_info->param_length = (uint8_t)test_param->length;
}
- p_device_mgmt_info->test_result.buffer = NULL;
- p_device_mgmt_info->test_result.length = 0;
status =
phHciNfc_Send_DevMgmt_Command( psHciContext, pHwRef,
pipe_id, (uint8_t)test_type );
@@ -1231,15 +1225,15 @@
break;
}
case NXP_DBG_READ:
+ {
+ *p_device_mgmt_info->p_val = (uint8_t)( length > HCP_HEADER_LEN ) ?
+ pResponse[HCP_HEADER_LEN]: 0;
+ p_device_mgmt_info->p_val = NULL;
+
+ }
/* fall through */
case NXP_DBG_WRITE:
{
- if( NULL != p_device_mgmt_info->p_val )
- {
- *p_device_mgmt_info->p_val = (uint8_t)( length > HCP_HEADER_LEN ) ?
- pResponse[HCP_HEADER_LEN]: 0;
- p_device_mgmt_info->p_val = NULL;
- }
break;
}
/* Self Test Commands */
@@ -1357,6 +1351,7 @@
case NXP_EVT_INFO_MEM_VIOLATION:
{
event_info.eventType = NFC_INFO_MEM_VIOLATION;
+ LOGW("Your NFC controller is kinda hosed, take it to npelly@ to fix");
break;
}
case NXP_EVT_INFO_TEMP_OVERHEAT:
@@ -1368,11 +1363,6 @@
p_device_mgmt_info->overheat_status;
break;
}
- case NXP_EVT_INFO_LLC_ERROR:
- {
- event_info.eventType = NFC_INFO_LLC_ERROR;
- break;
- }
default:
{
status = PHNFCSTVAL(CID_NFC_HCI,
diff --git a/src/phHciNfc_DevMgmt.h b/src/phHciNfc_DevMgmt.h
index 571fac2..e886013 100644
--- a/src/phHciNfc_DevMgmt.h
+++ b/src/phHciNfc_DevMgmt.h
@@ -119,6 +119,7 @@
#define NFC_ADDRESS_PMOS_MOD 0x997AU
#endif
+#define NFC_FELICA_RC_ADDR 0x9F9AU
/* The Address Definition for the Enabling the EVT_HOT_PLUG */
#define NFC_ADDRESS_HOTPLUG_EVT 0x9FF0U
diff --git a/src/phHciNfc_Felica.c b/src/phHciNfc_Felica.c
index 1a353a5..2897690 100644
--- a/src/phHciNfc_Felica.c
+++ b/src/phHciNfc_Felica.c
@@ -51,6 +51,7 @@
#define NXP_WRA_CONTINUE_ACTIVATION 0x12U
#define NXP_FEL_SYS_CODE 0x01U
+#define NXP_FEL_POLREQ_SYS_CODE 0x02U
#define NXP_FEL_CURRENTIDM 0x04U
#define NXP_FEL_CURRENTPMM 0x05U
@@ -58,10 +59,12 @@
#define NXP_FEL_CUR_IDM_PMM_LEN 0x08U
#define FELICA_STATUS 0x00U
-#define FELICA_TIMEOUT NXP_FELICA_XCHG_TIMEOUT
+
+uint8_t nxp_nfc_felica_timeout = NXP_FELICA_XCHG_TIMEOUT;
/* Presence check command for felica tag */
#define FELICA_REQ_MODE 0x04U
+
/*
*************************** Structure and Enumeration ***************************
*/
@@ -417,10 +420,9 @@
{
if (NXP_FEL_SYS_CODE_LEN == reg_length)
{
- HCI_PRINT_BUFFER("\tFelica system code data", reg_value, reg_length);
- /* Update current system code values */
- (void)memcpy(p_fel_tag_info->SystemCode, reg_value,
- reg_length);
+ /* System code from registry is invalid in this case */
+ p_fel_tag_info->SystemCode[0] = 0;
+ p_fel_tag_info->SystemCode[1] = 0;
}
else
{
@@ -500,6 +502,39 @@
index = (index + 1);
psHciContext->rx_index = (HCP_HEADER_LEN + 1);
HCI_PRINT_BUFFER("Felica Bytes received", &pResponse[index], (length - index));
+ /* If Poll response received then update IDm and PMm parameters, when presence check going on */
+ if (pResponse[index + 1] == 0x01)
+ {
+ if (length >= 19)
+ {
+ /* IDm */
+ (void) memcpy(psHciContext->p_target_info->RemoteDevInfo.Felica_Info.IDm,
+ &pResponse[index + 2], 8);
+ /* PMm */
+ (void) memcpy(psHciContext->p_target_info->RemoteDevInfo.Felica_Info.PMm,
+ &pResponse[index + 2 + 8], 8);
+ index = index + 2 + 8 + 8;
+
+ /* SC */
+ if (length >= 21)
+ {
+ /* Copy SC if available */
+ psHciContext->p_target_info->RemoteDevInfo.Felica_Info.SystemCode[0] = pResponse[index];
+ psHciContext->p_target_info->RemoteDevInfo.Felica_Info.SystemCode[1] = pResponse[index + 1];
+ }
+ else
+ {
+ /* If SC is not available in packet then set to zero */
+ psHciContext->p_target_info->RemoteDevInfo.Felica_Info.SystemCode[0] = 0;
+ psHciContext->p_target_info->RemoteDevInfo.Felica_Info.SystemCode[1] = 0;
+ }
+ }
+ else
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI,
+ NFCSTATUS_INVALID_HCI_RESPONSE);
+ }
+ }
}
else
{
@@ -827,7 +862,7 @@
pres_chk_data[1] = 0x00; // Felica poll
pres_chk_data[2] = 0xFF;
pres_chk_data[3] = 0xFF;
- pres_chk_data[4] = 0x00;
+ pres_chk_data[4] = 0x01;
pres_chk_data[5] = 0x00;
ps_pipe_info->param_info = pres_chk_data;
@@ -842,7 +877,6 @@
return status;
}
-
NFCSTATUS
phHciNfc_Send_Felica_Command(
phHciNfc_sContext_t *psContext,
@@ -908,7 +942,7 @@
hcp_message = &(hcp_packet->msg.message);
/* Time out */
- hcp_message->payload[i++] = FELICA_TIMEOUT ;
+ hcp_message->payload[i++] = nxp_nfc_felica_timeout ;
/* Status */
hcp_message->payload[i++] = FELICA_STATUS;
diff --git a/src/phHciNfc_Generic.c b/src/phHciNfc_Generic.c
index 45aefdc..875e295 100644
--- a/src/phHciNfc_Generic.c
+++ b/src/phHciNfc_Generic.c
@@ -90,7 +90,7 @@
static
void
phHciNfc_Response_Timeout (
- uint32_t resp_timer_id
+ uint32_t resp_timer_id, void *pContext
);
#endif /* (NXP_NFC_HCI_TIMER == 1) */
@@ -269,10 +269,10 @@
static
void
phHciNfc_Response_Timeout (
- uint32_t resp_timer_id
+ uint32_t resp_timer_id, void *pContext
)
{
- phNfc_sCompletionInfo_t comp_info = {0};
+ phNfc_sCompletionInfo_t comp_info = {0,0,0};
if ( ( NULL != gpsHciContext)
&& (resp_timer_id == hci_resp_timer_id ))
@@ -1147,11 +1147,11 @@
#ifndef EVENT_NOTIFY
( NFCSTATUS_SUCCESS == status )
|| ( NFCSTATUS_RF_TIMEOUT == status )
- || ( NFCSTATUS_MORE_INFORMATION == status )
+ || (( NFCSTATUS_MORE_INFORMATION == status )
#else
- (FALSE == psHciContext->event_pending )
+ ((FALSE == psHciContext->event_pending )
#endif
- && ( pipe_id <= PHHCINFC_MAX_PIPE )
+ && ( pipe_id <= PHHCINFC_MAX_PIPE ))
)
{
/* phHciNfc_Reset_Pipe_MsgInfo(psHciContext->p_pipe_list[pipe_id]); */
@@ -1562,11 +1562,11 @@
psHciContext->tx_total = HCP_ZERO_LEN ;
psHciContext->tx_remain = HCP_ZERO_LEN ;
psHciContext->tx_hcp_frgmnt_index = HCP_ZERO_LEN ;
- HCI_DEBUG("HCI: In Function: %s \n", __FUNCTION__);
- HCI_DEBUG("HCI: Response Pending status --> %s \n",
- (psHciContext->response_pending)?"TRUE":"FALSE");
- HCI_DEBUG("HCI: Event Pending status --> %s \n",
- (psHciContext->event_pending)?"TRUE":"FALSE");
+ HCI_DEBUG("HCI: %s: response_pending=%s, event_pending=%s",
+ __FUNCTION__,
+ (psHciContext->response_pending)?"TRUE":"FALSE",
+ (psHciContext->event_pending)?"TRUE":"FALSE"
+ );
if ((TRUE == psHciContext->response_pending)
|| (TRUE == psHciContext->event_pending))
{
@@ -2015,7 +2015,7 @@
if ( NXP_INVALID_TIMER_ID != hci_resp_timer_id )
{
- HCI_DEBUG(" HCI : Response Timer Stop, Status:%02X : %X\n",
+ HCI_DEBUG(" HCI : Response Timer Stop, Status:%02X",
psCompInfo->status);
/* Stop and Un-Intialise the Response Timer */
phOsalNfc_Timer_Stop( hci_resp_timer_id );
@@ -2041,7 +2041,7 @@
if (( NFCSTATUS_BOARD_COMMUNICATION_ERROR == PHNFCSTATUS(psCompInfo->status))
&& ( NXP_INVALID_TIMER_ID != hci_resp_timer_id ))
{
- HCI_DEBUG(" HCI : Response Timer Stop, Status:%02X : %X\n",
+ HCI_DEBUG(" HCI : Response Timer Stop, Status:%02X",
psCompInfo->status);
/* Stop the HCI Response Timer */
phOsalNfc_Timer_Stop( hci_resp_timer_id );
diff --git a/src/phHciNfc_Generic.h b/src/phHciNfc_Generic.h
index b4f8a6d..16ffa0e 100644
--- a/src/phHciNfc_Generic.h
+++ b/src/phHciNfc_Generic.h
@@ -55,21 +55,17 @@
***************************** Header File Inclusion ****************************
################################################################################
*/
-
+#define LOG_TAG "NFC-HCI"
+#include <cutils/log.h>
#include <phNfcIoctlCode.h>
#include<phNfcInterface.h>
#include <phHciNfc.h>
-
/*
################################################################################
****************************** Macro Definitions *******************************
################################################################################
*/
-#if defined(DEBUG) /*|| defined(_DEBUG) */
-#define HCI_TRACE
-#endif
-
#define Trace_buffer phOsalNfc_DbgTraceBuffer
/* HCI TRACE Macros */
@@ -80,14 +76,14 @@
#define MAX_TRACE_BUFFER 150
/* #define HCI_PRINT( str ) phOsalNfc_DbgTrace(str) */
#define HCI_PRINT( str ) phOsalNfc_DbgString(str)
-#define HCI_DEBUG(str, arg) \
- { \
- snprintf(Trace_buffer,MAX_TRACE_BUFFER,str,arg); \
- phOsalNfc_DbgString(Trace_buffer); \
- }
+#define HCI_DEBUG(...) LOGD(__VA_ARGS__)
+
+
+
+
#define HCI_PRINT_BUFFER(msg,buf,len) \
{ \
- snprintf(Trace_buffer,MAX_TRACE_BUFFER,"\n\t %s:",msg); \
+ snprintf(Trace_buffer,MAX_TRACE_BUFFER,"\t %s:",msg); \
phOsalNfc_DbgString(Trace_buffer); \
phOsalNfc_DbgTrace(buf,len); \
phOsalNfc_DbgString("\r"); \
@@ -101,7 +97,7 @@
#define HCI_PRINT_BUFFER(msg,buf,len)
#else
#define HCI_PRINT( str )
-#define HCI_DEBUG(str, arg)
+#define HCI_DEBUG(...)
#define HCI_PRINT_BUFFER(msg,buf,len)
#endif /* #if defined(PHDBG_TRACES) */
/* #if defined(PHDBG_INFO) && defined (PHDBG_CRITICAL_ERROR) */
@@ -458,7 +454,6 @@
/* HCI Device Management Sequence */
DEV_INIT_SEQ,
- DEV_HAL_INFO_SEQ,
DEV_CONFIG_SEQ,
DEV_REL_SEQ,
@@ -612,8 +607,8 @@
/** \internal Mode of HCI Initialisation */
phHciNfc_Init_t init_mode;
- /** \internal Memory Information for HCI Initialisation */
- uint8_t hal_mem_info[NXP_HAL_MEM_INFO_SIZE];
+ /** \internal Mode of HCI Initialisation */
+ void *p_io_params;
/** \internal HCI Configuration Type */
phHciNfc_eConfigType_t config_type;
diff --git a/src/phHciNfc_RFReaderA.c b/src/phHciNfc_RFReaderA.c
index ba71724..1b1280a 100644
--- a/src/phHciNfc_RFReaderA.c
+++ b/src/phHciNfc_RFReaderA.c
@@ -67,6 +67,7 @@
#define RDR_A_MIFARE_RAW_LENGTH 0x03U
+uint8_t nxp_nfc_mifareraw_timeout = NXP_MIFARE_XCHG_TIMEOUT;
/*
*************************** Structure and Enumeration ***************************
*/
@@ -1037,7 +1038,7 @@
hcp_message = &(hcp_packet->msg.message);
#ifdef ENABLE_MIFARE_RAW
/* Time out */
- hcp_message->payload[i++] = NXP_MIFARE_XCHG_TIMEOUT ;
+ hcp_message->payload[i++] = nxp_nfc_mifareraw_timeout;
/* Status */
hcp_message->payload[i++] = RDR_A_MIFARE_STATUS;
#else
diff --git a/src/phHciNfc_Sequence.c b/src/phHciNfc_Sequence.c
index 53e8b70..73d7b79 100644
--- a/src/phHciNfc_Sequence.c
+++ b/src/phHciNfc_Sequence.c
@@ -65,10 +65,6 @@
################################################################################
*/
-/* Address Definitions for HAL Configuration */
-#define NFC_ADDRESS_HAL_CONF 0x9FD0U
-
-
/*
################################################################################
********************** Structure/Enumeration Definitions ***********************
@@ -247,10 +243,8 @@
/* Initialise to Perform Test on
the Antenna/SWP Link */
case hciState_Test:
- {
status = NFCSTATUS_SUCCESS;
break;
- }
default:
break;
}
@@ -272,10 +266,8 @@
case hciState_Listen:
/* Specifies the Starting of the Release Sequence */
case hciState_Release:
- {
status = NFCSTATUS_SUCCESS;
break;
- }
default:
break;
}
@@ -314,10 +306,8 @@
case hciState_Connect:
/* Specifies the Starting of the Release Sequence */
case hciState_Release:
- {
status = NFCSTATUS_SUCCESS;
break;
- }
default:
break;
}
@@ -348,10 +338,8 @@
case hciState_Disconnect:
/* Specifies the Starting of the Release Sequence */
case hciState_Release:
- {
status = NFCSTATUS_SUCCESS;
break;
- }
default:
break;
}
@@ -375,10 +363,8 @@
case hciState_Transact:
/* Specifies the Starting of the Release Sequence */
case hciState_Release:
- {
status = NFCSTATUS_SUCCESS;
break;
- }
default:
break;
}
@@ -400,10 +386,8 @@
case hciState_Config:
/* Specifies the Starting of the Release Sequence */
case hciState_Release:
- {
status = NFCSTATUS_SUCCESS;
break;
- }
default:
break;
}
@@ -428,14 +412,10 @@
case hciState_Listen:
/* Specifies the Starting of the Release Sequence */
case hciState_Release:
- {
status = NFCSTATUS_SUCCESS;
break;
- }
default:
- {
break;
- }
}
break;
}
@@ -547,16 +527,16 @@
)
{
- HCI_DEBUG("HCI: In Function: %s \n", __FUNCTION__);
+ HCI_DEBUG("HCI: %s: transition=%02u, cur_state=%02u, next_state=%02u\n",
+ __func__,
+ psHciContext->hci_state.transition,
+ psHciContext->hci_state.cur_state,
+ psHciContext->hci_state.next_state);
- HCI_DEBUG(" HCI: Transition Before FSM Rollback --> %02u \n",
- psHciContext->hci_state.transition );
-
- HCI_DEBUG(" HCI: Current State Before FSM Rollback --> %02u \n",
- psHciContext->hci_state.cur_state );
- HCI_DEBUG(" HCI: Next State Before FSM Rollback --> %02u \n",
- psHciContext->hci_state.next_state );
+
+
+
if( (NFC_FSM_IN_PROGRESS == psHciContext->hci_state.transition)
)
@@ -660,7 +640,7 @@
{
if (hciState_Reset == psHciContext->hci_state.cur_state)
{
- phNfc_sCompletionInfo_t comp_info={FALSE,0, NULL};
+ phNfc_sCompletionInfo_t comp_info;
phHciNfc_Release_Lower( psHciContext, pHwRef );
/* Release all the resources and
@@ -674,7 +654,7 @@
{
/* Notify the Poll/Emulation Configure failure to the upper layer */
- phNfc_sCompletionInfo_t comp_info={FALSE,0, NULL};
+ phNfc_sCompletionInfo_t comp_info;
comp_info.status = error_status ;
@@ -691,8 +671,7 @@
{
/* Notify the Poll Configure failure to the upper layer */
- phNfc_sCompletionInfo_t comp_info={FALSE,0, NULL};
-
+ phNfc_sCompletionInfo_t comp_info;
psHciContext->error_status = error_status;
status = phHciNfc_Pending_Sequence(psHciContext, pHwRef );
@@ -721,7 +700,7 @@
case hciState_Config:
{
/* Notify the Configure failure to the upper layer */
- phNfc_sCompletionInfo_t comp_info={FALSE,0, NULL};
+ phNfc_sCompletionInfo_t comp_info;
psHciContext->error_status = error_status;
status = phHciNfc_Pending_Sequence(psHciContext, pHwRef );
@@ -737,7 +716,7 @@
case hciState_Select:
{
/* Notify the Configure failure to the upper layer */
- phNfc_sCompletionInfo_t comp_info={FALSE,0, NULL};
+ phNfc_sCompletionInfo_t comp_info={0,0,0};
/* Rollback the FSM as the Target Discovery Failed */
phHciNfc_FSM_Rollback(psHciContext);
@@ -763,7 +742,7 @@
case hciState_Transact:
/* Notify the Transceive failure to the upper layer */
{
- phNfc_sTransactionInfo_t transact_info={FALSE,0,NULL,NULL,0};
+ phNfc_sTransactionInfo_t transact_info;
/* Rollback the FSM as the Transceive Failed */
phHciNfc_FSM_Rollback(psHciContext);
@@ -780,7 +759,7 @@
case hciState_Connect:
{
/* Notify the General failure to the upper layer */
- phNfc_sCompletionInfo_t comp_info={FALSE,0, NULL};
+ phNfc_sCompletionInfo_t comp_info;
/* psHciContext->host_rf_type = phHal_eUnknown_DevType; */
status = phHciNfc_ReaderMgmt_Update_Sequence(
@@ -797,7 +776,7 @@
case hciState_Reactivate:
{
/* Notify the General failure to the upper layer */
- phNfc_sCompletionInfo_t comp_info={FALSE,0, NULL};
+ phNfc_sCompletionInfo_t comp_info={FALSE, 0, 0};
/* psHciContext->host_rf_type = phHal_eUnknown_DevType;
status = phHciNfc_ReaderMgmt_Update_Sequence(
@@ -813,7 +792,7 @@
}
case hciState_Presence:
{
- phNfc_sCompletionInfo_t comp_info={FALSE,0, NULL};
+ phNfc_sCompletionInfo_t comp_info;
/* Roll Back to Connect State as Presence Check is Complete */
phHciNfc_FSM_Rollback(psHciContext);
@@ -830,7 +809,7 @@
case hciState_Disconnect:
{
/* Notify the General failure to the upper layer */
- phNfc_sCompletionInfo_t comp_info={FALSE,0, NULL};
+ phNfc_sCompletionInfo_t comp_info;
phHciNfc_FSM_Rollback(psHciContext);
comp_info.status = error_status ;
@@ -844,7 +823,7 @@
#ifdef NXP_HCI_SHUTDOWN_OVERRIDE
status = phHciNfc_Release_Sequence(psHciContext ,pHwRef);
#else
- phNfc_sCompletionInfo_t comp_info={FALSE,0, NULL};
+ phNfc_sCompletionInfo_t comp_info;
phHciNfc_Release_Lower( psHciContext, pHwRef );
/* Release all the resources and
@@ -859,7 +838,7 @@
default:
{
/* Notify the General failure to the upper layer */
- phNfc_sCompletionInfo_t comp_info={FALSE,0, NULL};
+ phNfc_sCompletionInfo_t comp_info;
phHciNfc_FSM_Rollback(psHciContext);
comp_info.status = error_status ;
@@ -880,7 +859,8 @@
else
{
/* Notify the General failure to the upper layer */
- phNfc_sCompletionInfo_t comp_info={FALSE,0, NULL};
+ phNfc_sCompletionInfo_t comp_info;
+
phHciNfc_FSM_Rollback(psHciContext);
comp_info.status = error_status ;
/* Disable the Notification to the Upper Layer */
@@ -913,14 +893,14 @@
)
{
NFCSTATUS status = NFCSTATUS_SUCCESS;
-
- HCI_DEBUG("HCI: In Function: %s \n",
- __FUNCTION__);
- HCI_DEBUG(" HCI: Current HCI State --> %02u \n",
- psHciContext->hci_state.cur_state );
- HCI_DEBUG(" HCI: Next HCI State --> %02u \n",
- psHciContext->hci_state.next_state );
+ HCI_DEBUG("HCI: %s: cur_state=%02u, next_state=%02u",
+ __FUNCTION__,
+ psHciContext->hci_state.cur_state,
+ psHciContext->hci_state.next_state);
+
+
+
switch(psHciContext->hci_state.next_state)
{
@@ -946,7 +926,7 @@
case hciState_Select:
case hciState_Connect:
{
- phNfc_sCompletionInfo_t comp_info={FALSE,0, NULL};
+ phNfc_sCompletionInfo_t comp_info;
/* Update to the Intialise state as the discovery wheel is
* restarted.
@@ -1003,7 +983,7 @@
}
case hciState_Presence:
{
- phNfc_sCompletionInfo_t comp_info={FALSE,0, NULL};
+ phNfc_sCompletionInfo_t comp_info;
/* Roll Back to Connect State as Presence Check is Complete */
phHciNfc_FSM_Rollback(psHciContext);
@@ -1122,7 +1102,7 @@
}
else
{
-#if defined( ESTABLISH_SESSION )
+#ifdef ESTABLISH_SESSION
NFCSTATUS info_status = NFCSTATUS_SUCCESS;
PHNFC_UNUSED_VARIABLE(info_status);
info_status = phHciNfc_IDMgmt_Update_Sequence(
@@ -1130,11 +1110,7 @@
if(NFCSTATUS_SUCCESS == info_status)
{
-#if ( NXP_HAL_MEM_INFO_SIZE > 0x00U )
- psHciContext->hci_seq = DEV_HAL_INFO_SEQ;
-#else
psHciContext->hci_seq = IDENTITY_INFO_SEQ;
-#endif /* #if ( NXP_HAL_MEM_INFO_SIZE > 0x00U ) */
}
else
{
@@ -1142,11 +1118,10 @@
status = PHNFCSTVAL(CID_NFC_HCI,
NFCSTATUS_INVALID_HCI_SEQUENCE);
}
-#elif ( NXP_HAL_MEM_INFO_SIZE > 0x00U )
- psHciContext->hci_seq = DEV_HAL_INFO_SEQ;
#else
psHciContext->hci_seq = HCI_END_SEQ;
-#endif /* #ifdef ESTABLISH_SESSION */
+
+#endif
}
}
@@ -1183,10 +1158,8 @@
status = phHciNfc_EmuMgmt_Initialise( psHciContext,pHwRef );
if(NFCSTATUS_SUCCESS == status)
{
-#if defined( ESTABLISH_SESSION )
+#ifdef ESTABLISH_SESSION
psHciContext->hci_seq = ADMIN_SESSION_SEQ;
-#elif ( NXP_HAL_MEM_INFO_SIZE > 0x00U )
- psHciContext->hci_seq = DEV_HAL_INFO_SEQ;
#else
psHciContext->hci_seq = HCI_END_SEQ;
#endif
@@ -1199,11 +1172,7 @@
status = phHciNfc_Admin_Initialise( psHciContext,pHwRef );
if(NFCSTATUS_SUCCESS == status)
{
-#if ( NXP_HAL_MEM_INFO_SIZE > 0x00U )
- psHciContext->hci_seq = DEV_HAL_INFO_SEQ;
-#else
psHciContext->hci_seq = IDENTITY_INFO_SEQ;
-#endif /* #if ( NXP_HAL_MEM_INFO_SIZE > 0x00U ) */
}
break;
}
@@ -1213,13 +1182,11 @@
psHciContext, pHwRef );
if(NFCSTATUS_SUCCESS == status)
{
-#if defined( SW_AUTO_ACTIVATION )
+#ifdef SW_AUTO_ACTIVATION
psHciContext->hci_seq = READER_SW_AUTO_SEQ;
-#elif ( NXP_HAL_MEM_INFO_SIZE > 0x00U )
- psHciContext->hci_seq = DEV_HAL_INFO_SEQ;
#else
psHciContext->hci_seq = IDENTITY_INFO_SEQ;
-#endif /* #if ( NXP_HAL_MEM_INFO_SIZE > 0x00U ) */
+#endif
}
break;
}
@@ -1252,8 +1219,7 @@
{
if ((HCI_SELF_TEST != psHciContext->init_mode)
/* && ( TRUE == ((phHal_sHwReference_t *)pHwRef)->se_detect ) */
- && (HCI_CUSTOM_INIT != psHciContext->init_mode)
- && (HCI_NFC_DEVICE_TEST != psHciContext->init_mode))
+ && (HCI_CUSTOM_INIT != psHciContext->init_mode))
{
NFCSTATUS info_status = NFCSTATUS_SUCCESS;
PHNFC_UNUSED_VARIABLE(info_status);
@@ -1281,42 +1247,10 @@
}
break;
}
-#endif /* #ifdef ESTABLISH_SESSION */
-
-#if ( NXP_HAL_MEM_INFO_SIZE > 0x00U )
- case DEV_HAL_INFO_SEQ:
- {
- static uint8_t mem_index = 0;
- status = phHciNfc_DevMgmt_Get_Info(psHciContext, pHwRef,
- (NFC_ADDRESS_HAL_CONF + mem_index),
- (psHciContext->hal_mem_info + mem_index));
- if(NFCSTATUS_PENDING == status)
- {
- mem_index++;
- if (NXP_HAL_MEM_INFO_SIZE <= mem_index )
- {
- NFCSTATUS info_status = NFCSTATUS_SUCCESS;
- PHNFC_UNUSED_VARIABLE(info_status);
- info_status = phHciNfc_IDMgmt_Update_Sequence(
- psHciContext, INFO_SEQ );
- mem_index = 0;
- psHciContext->hci_seq = IDENTITY_INFO_SEQ;
- /* psHciContext->hci_seq =
- (HCI_SELF_TEST != psHciContext->init_mode)?
- IDENTITY_INFO_SEQ : HCI_END_SEQ; */
- }
- }
- break;
- }
-#endif /* #if ( NXP_HAL_MEM_INFO_SIZE > 0x00U ) */
+#endif
case HCI_END_SEQ:
{
- phHal_sMemInfo_t *p_mem_info =
- (phHal_sMemInfo_t *) ( psHciContext->hal_mem_info );
- if (
- (HCI_SELF_TEST == psHciContext->init_mode )
- || (HCI_NFC_DEVICE_TEST == psHciContext->init_mode )
- )
+ if (HCI_SELF_TEST == psHciContext->init_mode )
{
psHciContext->hci_state.next_state
= (uint8_t) hciState_Test;
@@ -1326,17 +1260,10 @@
phHciNfc_Uicc_Connectivity( psHciContext, pHwRef );
#endif /* #ifdef UICC_CONNECTIVITY_PATCH */
-#if ( NXP_HAL_MEM_INFO_SIZE > 0x00U )
- if(NXP_FW_UPLOAD_SUCCESS != p_mem_info->fw_magic )
- {
- status = PHNFCSTVAL( CID_NFC_HCI, NFCSTATUS_FAILED );
- }
-#endif /* #if ( NXP_HAL_MEM_INFO_SIZE > 0x00U ) */
-
/* Initialisation Complete Notification to the Upper Layer */
if(NFCSTATUS_SUCCESS == status)
{
- phNfc_sCompletionInfo_t comp_info={FALSE,0, NULL};
+ phNfc_sCompletionInfo_t comp_info;
comp_info.status = status;
phHciNfc_Notify(psHciContext->p_upper_notify,
@@ -1406,10 +1333,6 @@
}
case DEV_REL_SEQ:
{
- NFCSTATUS info_status = NFCSTATUS_SUCCESS;
- PHNFC_UNUSED_VARIABLE(info_status);
- info_status = phHciNfc_DevMgmt_Update_Sequence(
- psHciContext, REL_SEQ );
status = phHciNfc_DevMgmt_Release( psHciContext, pHwRef );
if(NFCSTATUS_SUCCESS == status)
{
@@ -1511,7 +1434,7 @@
)
{
NFCSTATUS status = NFCSTATUS_SUCCESS;
- phNfc_sCompletionInfo_t comp_info = {FALSE,0,NULL};
+ phNfc_sCompletionInfo_t comp_info;
switch(psHciContext->config_type)
{
@@ -1837,7 +1760,7 @@
)
{
NFCSTATUS status = NFCSTATUS_SUCCESS;
- static phNfc_sCompletionInfo_t comp_info = {FALSE,0,NULL};
+ static phNfc_sCompletionInfo_t comp_info;
#if defined(HOST_EMULATION)
phHciNfc_GateID_t ce_gate = phHciNfc_UnknownGate;
#endif /* #ifdef HOST_EMULATION */
@@ -1984,7 +1907,8 @@
NFCSTATUS status = NFCSTATUS_SUCCESS;
phHal_sADD_Cfg_t *p_poll_config = (phHal_sADD_Cfg_t * )
psHciContext->p_config_params;
- phNfc_sCompletionInfo_t comp_info = {FALSE,0,NULL};
+ phNfc_sCompletionInfo_t comp_info;
+
if (NULL != p_poll_config)
{
switch(psHciContext->hci_seq)
@@ -2090,7 +2014,7 @@
)
{
NFCSTATUS status = NFCSTATUS_SUCCESS;
- static phNfc_sCompletionInfo_t comp_info = {FALSE,0,NULL};
+ static phNfc_sCompletionInfo_t comp_info;
phHal_eRemDevType_t target_type = phHal_eUnknown_DevType;
if( NULL != psHciContext->p_target_info )
@@ -2202,7 +2126,7 @@
)
{
NFCSTATUS status = NFCSTATUS_SUCCESS;
- static phNfc_sCompletionInfo_t comp_info = {FALSE, 0 , NULL};
+ static phNfc_sCompletionInfo_t comp_info;
phHal_eRemDevType_t target_type = phHal_eUnknown_DevType;
uint8_t re_poll = 0;
@@ -2286,7 +2210,7 @@
void *pHwRef
)
{
- static phNfc_sTransactionInfo_t transact_info = {FALSE,0,NULL,NULL,0};
+ static phNfc_sTransactionInfo_t transact_info;
pphNfcIF_Notification_CB_t p_upper_notify = psHciContext->p_upper_notify;
void *pcontext = psHciContext->p_upper_context;
@@ -2433,8 +2357,8 @@
)
{
NFCSTATUS status = NFCSTATUS_SUCCESS;
- static phNfc_sCompletionInfo_t comp_info = {0};
- static phNfc_sData_t test_result= {NULL,0};
+ static phNfc_sCompletionInfo_t comp_info;
+ static phNfc_sData_t test_result;
/* Complete the Test Sequence and notify the HAL */
status = phHciNfc_FSM_Complete ( psHciContext );
@@ -2456,7 +2380,7 @@
phHciNfc_Notify(psHciContext->p_upper_notify,
psHciContext->p_upper_context, pHwRef,
NFC_NOTIFY_RESULT , &comp_info);
- HCI_DEBUG(" HCI System Test Completed : Status = %u\n", test_status);
+ HCI_PRINT(" HCI System Test Completed. \n");
}
else
{
@@ -2482,7 +2406,7 @@
)
{
NFCSTATUS status = NFCSTATUS_SUCCESS;
- static phNfc_sCompletionInfo_t comp_info = {0};
+ static phNfc_sCompletionInfo_t comp_info;
/* To remove "warning (VS 4100) : unreferenced formal parameter" */
PHNFC_UNUSED_VARIABLE(pdata);
diff --git a/src/phLibNfc.c b/src/phLibNfc.c
index e0ef435..92bdc40 100644
--- a/src/phLibNfc.c
+++ b/src/phLibNfc.c
@@ -31,6 +31,8 @@
************************* Header Files ****************************************
*/
+#define LOG_TAG "NFC"
+
#include <phLibNfc.h>
#include <phDal4Nfc.h>
#include <phHal4Nfc.h>
@@ -134,12 +136,40 @@
return NFCSTATUS_SUCCESS;
}
+int phLibNfc_GetIsoXchgTimeout() {
+ return nxp_nfc_isoxchg_timeout;
+}
+
extern uint32_t nxp_nfc_hci_response_timeout;
NFCSTATUS phLibNfc_SetHciTimeout(uint32_t timeout_in_ms) {
nxp_nfc_hci_response_timeout = timeout_in_ms;
return NFCSTATUS_SUCCESS;
}
+int phLibNfc_GetHciTimeout() {
+ return nxp_nfc_hci_response_timeout;
+}
+
+extern uint32_t nxp_nfc_felica_timeout;
+NFCSTATUS phLibNfc_SetFelicaTimeout(uint8_t timeout_in_ms) {
+ nxp_nfc_felica_timeout = timeout_in_ms;
+ return NFCSTATUS_SUCCESS;
+}
+
+int phLibNfc_GetFelicaTimeout() {
+ return nxp_nfc_felica_timeout;
+}
+
+extern uint8_t nxp_nfc_mifareraw_timeout;
+NFCSTATUS phLibNfc_SetMifareRawTimeout(uint8_t timeout) {
+ nxp_nfc_mifareraw_timeout = timeout;
+ return NFCSTATUS_SUCCESS;
+}
+
+int phLibNfc_GetMifareRawTimeout() {
+ return nxp_nfc_mifareraw_timeout;
+}
+
/**
* Initialize the phLibNfc interface.
*/
@@ -837,10 +867,15 @@
gpphLibContext->psHwReference->device_info.model_id;
(void)memcpy(phLibNfc_StackCapabilities->psDevCapabilities.full_version,
gpphLibContext->psHwReference->device_info.full_version,NXP_FULL_VERSION_LEN);
-
/* Check the firmware version */
- phLibNfc_StackCapabilities->psDevCapabilities.firmware_update_info = memcmp(phLibNfc_StackCapabilities->psDevCapabilities.full_version, nxp_nfc_full_version,
- NXP_FULL_VERSION_LEN);
+ if (nxp_nfc_full_version == NULL) {
+ // Couldn't load firmware, just pretend we're up to date.
+ LOGW("Firmware image not available: this device might be running old NFC firmware!");
+ phLibNfc_StackCapabilities->psDevCapabilities.firmware_update_info = 0;
+ } else {
+ phLibNfc_StackCapabilities->psDevCapabilities.firmware_update_info = memcmp(phLibNfc_StackCapabilities->psDevCapabilities.full_version, nxp_nfc_full_version,
+ NXP_FULL_VERSION_LEN);
+ }
if(NFCSTATUS_SUCCESS != RetVal)
{
diff --git a/src/phLibNfc.h b/src/phLibNfc.h
index 719cfc1..8621361 100644
--- a/src/phLibNfc.h
+++ b/src/phLibNfc.h
@@ -129,7 +129,10 @@
This can be applied to UICC as well as SmartMX*/
phLibNfc_SE_ActModeVirtual=0x02, /**< Enables Virtual Mode communication.
This can be applied to UICC as well as SmartMX*/
- phLibNfc_SE_ActModeOff =0x03 /**< Inactivate SE.This means,put SE in in-active state */
+ phLibNfc_SE_ActModeOff =0x03, /**< Inactivate SE.This means,put SE in in-active state
+ This can be applied to UICC as well as SmartMX*/
+ phLibNfc_SE_ActModeVirtualVolatile = 0x04 /**< Enabled virtual mode communication for SE through an event
+ This can be applied to UICC as well as SmartMX*/
}phLibNfc_eSE_ActivationMode;
@@ -862,7 +865,27 @@
// bit [4] => timeout enable
// bit [5..7] => unused
NFCSTATUS phLibNfc_SetIsoXchgTimeout(uint8_t timeout);
+int phLibNfc_GetIsoXchgTimeout();
+
NFCSTATUS phLibNfc_SetHciTimeout(uint32_t timeout_in_ms);
+int phLibNfc_GetHciTimeout();
+
+// Felica timeout
+// [0] -> timeout disabled
+// [1..255] -> timeout in ms
+NFCSTATUS phLibNfc_SetFelicaTimeout(uint8_t timeout_in_ms);
+int phLibNfc_GetFelicaTimeout();
+
+// MIFARE RAW timeout (ISO14443-3A / NfcA timeout)
+// timeout is 8 bits
+// bits [0..3] => timeout value, (256*16/13.56*10^6) * 2^value
+// [0] -> 0.0003s
+// ..
+// [14] -> 4.9s
+// [15] -> not allowed
+// bits [4..7] => 0
+NFCSTATUS phLibNfc_SetMifareRawTimeout(uint8_t timeout);
+int phLibNfc_GetMifareRawTimeout();
/**
* \ingroup grp_lib_nfc
diff --git a/src/phLibNfc_Ioctl.c b/src/phLibNfc_Ioctl.c
index 08f34b5..9983c60 100644
--- a/src/phLibNfc_Ioctl.c
+++ b/src/phLibNfc_Ioctl.c
@@ -238,11 +238,8 @@
NFCSTATUS status )
{
phLibNfc_Ioctl_Cntx_t *pIoctlCntx=NULL;
- if(PHNFCSTATUS(status) == NFCSTATUS_FEATURE_NOT_SUPPORTED)
- {
- status = NFCSTATUS_FEATURE_NOT_SUPPORTED;
- }
- else if(PHNFCSTATUS(status)!=NFCSTATUS_SUCCESS)
+
+ if(PHNFCSTATUS(status)!=NFCSTATUS_SUCCESS)
{
status = NFCSTATUS_FAILED;
}
diff --git a/src/phLibNfc_SE.c b/src/phLibNfc_SE.c
index 4e839cf..968c239 100644
--- a/src/phLibNfc_SE.c
+++ b/src/phLibNfc_SE.c
@@ -135,7 +135,7 @@
{
pphLibNfc_LibContext_t pLibContext=(pphLibNfc_LibContext_t)context;
phHal_sEventInfo_t *pEvtInfo = NULL;
- phLibNfc_uSeEvtInfo_t Se_Trans_Info={0};
+ phLibNfc_uSeEvtInfo_t Se_Trans_Info={{{0,0},{0,0}}};
phLibNfc_SE_List_t *pSeInfo=NULL;
if(pLibContext != gpphLibContext)
@@ -473,7 +473,6 @@
switch(eActivation_mode)
{
case phLibNfc_SE_ActModeVirtual:
- case phLibNfc_SE_ActModeDefault:
{
if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].hSecureElement)
{
@@ -507,6 +506,69 @@
}
}
break;
+ case phLibNfc_SE_ActModeVirtualVolatile:
+ {
+ if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].hSecureElement)
+ {
+ eEmulationType = NFC_SMARTMX_EMULATION;
+ /*Enable the SMX -External reader can see it*/
+ pLibContext->sCardEmulCfg.config.smartMxCfg.enableEmulation = TRUE;
+ pLibContext->sSeContext.eActivatedMode = phLibNfc_SE_ActModeVirtualVolatile;
+
+ Status = phHal4Nfc_Switch_SMX_Mode(
+ pLibContext->psHwReference,
+ eSmartMx_Virtual,
+ phLibNfc_SE_SetMode_cb,
+ pLibContext
+ );
+ }
+ else if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].hSecureElement)
+ {
+ eEmulationType = NFC_UICC_EMULATION;
+ /*Enable the UICC -External reader can see it*/
+ pLibContext->sCardEmulCfg.config.uiccEmuCfg.enableUicc = TRUE;
+ pLibContext->sSeContext.eActivatedMode = phLibNfc_SE_ActModeVirtualVolatile;
+
+ Status = phHal4Nfc_Switch_Swp_Mode(
+ pLibContext->psHwReference,
+ eSWP_Switch_On,
+ phLibNfc_SE_SetMode_cb,
+ pLibContext
+ );
+ }
+ else
+ {
+ Status = NFCSTATUS_INVALID_HANDLE;
+ }
+ }
+ break;
+ case phLibNfc_SE_ActModeDefault:
+ {
+ if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].hSecureElement)
+ {
+ Status = phHal4Nfc_Switch_SMX_Mode(
+ pLibContext->psHwReference,
+ eSmartMx_Default,
+ phLibNfc_SE_SetMode_cb,
+ pLibContext
+ );
+ }
+ else if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].hSecureElement)
+ {
+ Status = phHal4Nfc_Switch_Swp_Mode(
+ pLibContext->psHwReference,
+ eSWP_Switch_Default,
+ phLibNfc_SE_SetMode_cb,
+ pLibContext
+ );
+ }
+ else
+ {
+ Status = NFCSTATUS_INVALID_HANDLE;
+ }
+ }
+ break;
+
case phLibNfc_SE_ActModeWired:
{
if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].hSecureElement)
diff --git a/src/phLibNfc_initiator.c b/src/phLibNfc_initiator.c
index 2a03c05..0f71606 100644
--- a/src/phLibNfc_initiator.c
+++ b/src/phLibNfc_initiator.c
@@ -133,6 +133,10 @@
{
Status = NFCSTATUS_FAILED;
}
+ else if (PHNFCSTATUS(status) == NFCSTATUS_DESELECTED)
+ {
+ return;
+ }
else
{
DeviceIndx=0;DeviceIndx1=0;
diff --git a/src/phLibNfc_ndef_raw.c b/src/phLibNfc_ndef_raw.c
index 1e5b395..c39364e 100644
--- a/src/phLibNfc_ndef_raw.c
+++ b/src/phLibNfc_ndef_raw.c
@@ -1049,7 +1049,7 @@
NFCSTATUS status
)
{
- phLibNfc_ChkNdef_Info_t Ndef_Info = {0,0};
+ phLibNfc_ChkNdef_Info_t Ndef_Info = {0,0,0};
NFCSTATUS RetStatus = NFCSTATUS_SUCCESS;
pphLibNfc_ChkNdefRspCb_t pClientCb=NULL;
phLibNfc_LibContext_t *pLibNfc_Ctxt =
diff --git a/src/phLlcNfc.c b/src/phLlcNfc.c
index af0a3a1..36b442b 100644
--- a/src/phLlcNfc.c
+++ b/src/phLlcNfc.c
@@ -228,7 +228,7 @@
{
NFCSTATUS result = NFCSTATUS_SUCCESS;
phLlcNfc_Context_t *ps_llc_ctxt = (phLlcNfc_Context_t*)pContext;
- phLlcNfc_LlcPacket_t *ps_packet_info = NULL;
+ phLlcNfc_LlcPacket_t s_packet_info;
PH_LLCNFC_PRINT("Llc Init called\n");
if ((NULL == ps_llc_ctxt) || (NULL == pLinkInfo))
@@ -239,8 +239,6 @@
else
{
/* Initialisation */
- ps_packet_info = &(ps_llc_ctxt->s_frameinfo.s_llcpacket);
-
ps_llc_ctxt->phwinfo = pLinkInfo;
/* Call the internal frame initialise */
phLlcNfc_H_Frame_Init(ps_llc_ctxt);
@@ -258,17 +256,17 @@
phLlcNfc_CreateTimers();
/* Create a U frame */
- result = phLlcNfc_H_CreateUFramePayload(ps_llc_ctxt,
- ps_packet_info,
- &(ps_packet_info->llcbuf_len),
+ result = phLlcNfc_H_CreateUFramePayload(ps_llc_ctxt,
+ &s_packet_info,
+ &(s_packet_info.llcbuf_len),
phLlcNfc_e_rset);
}
if (NFCSTATUS_SUCCESS == result)
{
/* Call DAL write */
result = phLlcNfc_Interface_Write(ps_llc_ctxt,
- (uint8_t*)&(ps_packet_info->s_llcbuf),
- (uint32_t)ps_packet_info->llcbuf_len);
+ (uint8_t*)&(s_packet_info.s_llcbuf),
+ (uint32_t)s_packet_info.llcbuf_len);
}
if (NFCSTATUS_PENDING == result)
{
@@ -364,8 +362,7 @@
NFCSTATUS result = NFCSTATUS_SUCCESS;
phLlcNfc_Context_t *ps_llc_ctxt = (phLlcNfc_Context_t*)pContext;
phLlcNfc_Frame_t *ps_frame_info = NULL;
- phLlcNfc_LlcPacket_t *ps_packet_info = NULL,
- s_packet_info;
+ phLlcNfc_LlcPacket_t s_packet_info;
phLlcNfc_StoreIFrame_t *ps_store_frame = NULL;
#if 0
uint8_t count = 1;
@@ -404,7 +401,6 @@
&s_packet_info,
pLlcBuf, (uint8_t)llcBufLength);
- ps_packet_info = &(ps_frame_info->s_llcpacket);
/* Store the I frame in the send list */
(void)phLlcNfc_H_StoreIFrame (ps_store_frame, s_packet_info);
@@ -423,13 +419,11 @@
#endif /* #ifdef CTRL_WIN_SIZE_COUNT */
{
- (void)memcpy ((void *)ps_packet_info, (void *)&s_packet_info,
- sizeof(phLlcNfc_LlcPacket_t));
/* Call write to the below layer, only if previous write
is completed */
result = phLlcNfc_Interface_Write (ps_llc_ctxt,
- (uint8_t *)&(ps_packet_info->s_llcbuf),
- (uint32_t)ps_packet_info->llcbuf_len);
+ (uint8_t *)&(s_packet_info.s_llcbuf),
+ (uint32_t)s_packet_info.llcbuf_len);
if ((NFCSTATUS_PENDING == result) ||
(NFCSTATUS_BUSY == PHNFCSTATUS (result)))
diff --git a/src/phLlcNfc_DataTypes.h b/src/phLlcNfc_DataTypes.h
index 2257513..9d5b588 100644
--- a/src/phLlcNfc_DataTypes.h
+++ b/src/phLlcNfc_DataTypes.h
@@ -105,79 +105,81 @@
#endif /* #if (!defined (LLC_TRACE) && !defined (LLC_DATA_BYTES)) */
-/* If the below MACRO (RECV_NR_CHECK_ENABLE) is
-ENABLED : then check for the NR frame received from PN544 in the I frame is
- added. This shall be greater than sent NS from the HOST.
- This is used to stop the timer
-DISABLED : dont check the N9R) frame received from the PN544
+/* If the below MACRO (RECV_NR_CHECK_ENABLE) is
+DEFINED : then check for the NR frame received from PN544 in the I frame is
+ added. This shall be greater than sent NS from the HOST.
+ This is used to stop the timer
+COMMENTED : dont check the N(R) frame received from the PN544
*/
/* #define RECV_NR_CHECK_ENABLE */
-/* If the below MACRO (LLC_UPP_LAYER_NTFY_WRITE_RSP_CB) is
-ENABLED : then if an I frame is received and the
- upper layer response callback (before another READ is pended) is called
- only after sending S frame and wait for the callback and then notify the
+/* If the below MACRO (LLC_UPP_LAYER_NTFY_WRITE_RSP_CB) is
+DEFINED : then if an I frame is received and the
+ upper layer response callback (before another READ is pended) is called
+ only after sending S frame and wait for the callback and then notify the
upper layer
-DISABLED : then if an I frame is received and the
- upper layer response callback (before another READ is pended) is called
- immediately after sending S frame (not waiting for the sent S frame
+COMMENTED : then if an I frame is received and the
+ upper layer response callback (before another READ is pended) is called
+ immediately after sending S frame (not waiting for the sent S frame
callback)
*/
-#define LLC_UPP_LAYER_NTFY_WRITE_RSP_CB
+/* #define LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */
-/* PN544 continuously sends an incorrect I frames to the HOST,
+/* PN544 continuously sends an incorrect I frames to the HOST,
even after the REJ frame from HOST to PN544
-If the below MACRO (LLC_RR_INSTEAD_OF_REJ) is
-ENABLED : then if the received NS = (expected NR - 1) then instead of REJ
+If the below MACRO (LLC_RR_INSTEAD_OF_REJ) is
+DEFINED : then if the received NS = (expected NR - 1) then instead of REJ
RR frame is sent
-DISABLED : then REJ frame is sent
+COMMENTED : then REJ frame is sent
*/
#define LLC_RR_INSTEAD_OF_REJ
#define SEND_UFRAME
-/* If the below MACRO (CTRL_WIN_SIZE_COUNT) is
-ENABLED : then window size will be maximum
-DISABLED : then window size is 1
+/* If the below MACRO (CTRL_WIN_SIZE_COUNT) is
+DEFINED : then window size will be maximum
+COMMENTED : then window size is 1
*/
#define CTRL_WIN_SIZE_COUNT
/*
If the below MACRO (LLC_URSET_NO_DELAY) is
-ENABLED : then after receiving the UA frame, then immediately this will be
+DEFINED : then after receiving the UA frame, then immediately this will be
notified or further operation will be carried on.
-DISABLED : then after receiving the UA frame, then a timer is started, to
+COMMENTED : then after receiving the UA frame, then a timer is started, to
delay the notifiation or to carry on the next operation
*/
#define LLC_URSET_NO_DELAY
-#ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB
-
- /* NO definition is required */
-
-#else
-
/*
- This macro is useful only if the LLC_UPP_LAYER_NTFY_WRITE_RSP_CB is DISABLED
If the below MACRO (LLC_RELEASE_FLAG) is
- ENABLED : then whenever LLC release is called the g_release_flag variable
- will be made TRUE. Also, NO notification is allowed to the
+DEFINED : then whenever LLC release is called the g_release_flag variable
+ will be made TRUE. Also, NO notification is allowed to the
upper layer.
- DISABLED : g_release_flag is not declared and not used
+COMMENTED : g_release_flag is not declared and not used
*/
#define LLC_RELEASE_FLAG
-#endif /* #ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */
/*
- Actually, there is a send and receive error count, if either of them reaches
+ Actually, there is a send and receive error count, if either of them reaches
limit, then exception is raised.
If the below MACRO (LLC_RSET_INSTEAD_OF_EXCEPTION) is
- ENABLED : then exception is not raised, instead a U RSET command is sent.
- DISABLED : then exception is raised
+DEFINED : then exception is not raised, instead a U RSET command is sent.
+COMMENTED : then exception is raised
*/
/* #define LLC_RSET_INSTEAD_OF_EXCEPTION */
+#ifndef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB
+ /*
+ If the below MACRO (PIGGY_BACK) is
+ DEFINED : After receiving I frame, wait till the ACK timer to expire to send an ACK to PN544.
+ COMMENTED : immediately ACK the received I frame
+ */
+ #define PIGGY_BACK
+
+#endif /* LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */
+
#define LLC_SEND_ERROR_COUNT
#define RECV_ERROR_FRAME_COUNT (0x50U)
@@ -191,7 +193,7 @@
#define PH_LLCNFC_CRC_LENGTH (2)
#define PH_LLCNFC_MAX_LLC_PAYLOAD ((PH_LLCNFC_MAX_IFRAME_BUFLEN) + (4))
/** Maximum timer used in the Llc */
-#define PH_LLCNFC_MAX_TIMER_USED (2)
+#define PH_LLCNFC_MAX_TIMER_USED (3)
/** Maximum timer used in the Llc */
#define PH_LLCNFC_MAX_ACK_GUARD_TIMER (4)
/** Maximum I frame that can be stored */
@@ -496,7 +498,7 @@
#ifdef PIGGY_BACK
/** This will store the ack time out values */
- uint16_t ack_to_value[PH_LLCNFC_MAX_ACK_GUARD_TIMER];
+ uint16_t ack_to_value;
#endif /* #ifdef PIGGY_BACK */
/** This is a timer flag
@@ -547,6 +549,9 @@
/** Store the I frames, that has been received, Storage will be
till the window size */
phLlcNfc_StoreIFrame_t s_recv_store;
+
+ /** Response received count to send the ACK once it reaches the window size */
+ uint8_t resp_recvd_count;
#endif /* #ifdef PIGGY_BACK */
/** To receive the packet sent by below layer */
diff --git a/src/phLlcNfc_Frame.c b/src/phLlcNfc_Frame.c
index 81eb1ff..af61761 100644
--- a/src/phLlcNfc_Frame.c
+++ b/src/phLlcNfc_Frame.c
@@ -52,7 +52,6 @@
#ifdef LLC_RELEASE_FLAG
extern uint8_t g_release_flag;
#endif /* #ifdef LLC_RELEASE_FLAG */
-
/************************ End of global variables *****************************/
/*********************** Local functions ****************************/
@@ -107,28 +106,6 @@
/**
* \ingroup grp_hal_nfc_llc_helper
*
-* \brief LLC component <b>Create S frame</b> function
-*
-* \copydoc page_reg This is a helper function which, creates the S frame
-*
-* \param[in/out] psFrameInfo Generic frame information
-* \param[in/out] cmdType Command type of S frame
-*
-* \retval NFCSTATUS_SUCCESS Operation successful.
-* \retval NFCSTATUS_INVALID_PARAMETER At least one parameter of the function is invalid.
-*
-*/
-static
-NFCSTATUS
-phLlcNfc_H_CreateSFramePayload (
- phLlcNfc_Frame_t *psFrameInfo,
- phLlcNfc_LlcCmd_t cmdType
-);
-
-
-/**
-* \ingroup grp_hal_nfc_llc_helper
-*
* \brief LLC helper functions <b>Update I frame list</b> function
*
* \copydoc page_reg This function checks the nr value with the stored I frames
@@ -433,10 +410,10 @@
return result;
}
-static
NFCSTATUS
phLlcNfc_H_CreateSFramePayload (
phLlcNfc_Frame_t *psFrameInfo,
+ phLlcNfc_LlcPacket_t *psLlcPacket,
phLlcNfc_LlcCmd_t cmdType
)
{
@@ -451,7 +428,7 @@
phLlcNfc_Buffer_t *ps_llc_buf = NULL;
uint8_t length = 0;
- ps_llc_buf = &(psFrameInfo->s_llcpacket.s_llcbuf);
+ ps_llc_buf = &(psLlcPacket->s_llcbuf);
/* Initial S frame header */
ps_llc_buf->sllcpayload.llcheader = PH_LLCNFC_S_HEADER_INIT;
@@ -467,11 +444,10 @@
(ps_llc_buf->sllcpayload.llcheader | (uint8_t)cmdType);
/* Maximum S frame length */
- psFrameInfo->s_llcpacket.llcbuf_len = (uint8_t)
- PH_LLCNFC_MAX_S_FRAME_LEN;
+ psLlcPacket->llcbuf_len = (uint8_t)PH_LLCNFC_MAX_S_FRAME_LEN;
/* S frame length byte value */
ps_llc_buf->llc_length_byte = (uint8_t)
- (psFrameInfo->s_llcpacket.llcbuf_len - 1);
+ (psLlcPacket->llcbuf_len - 1);
/*
psFrameInfo->s_llcpacket.s_llcbuf :
@@ -493,7 +469,7 @@
(psFrameInfo->s_llcpacket.llcbuf_len - 3) :
is the array index of the second CRC byte to be calculated
*/
- length = psFrameInfo->s_llcpacket.llcbuf_len;
+ length = psLlcPacket->llcbuf_len;
phLlcNfc_H_ComputeCrc(
(uint8_t *)ps_llc_buf, (length - 2),
&(ps_llc_buf->sllcpayload.llcpayload[(length - 4)]),
@@ -760,7 +736,7 @@
{
NFCSTATUS result = NFCSTATUS_SUCCESS;
phLlcNfc_Frame_t *ps_frame_info = NULL;
- phLlcNfc_LlcPacket_t *ps_create_packet = NULL;
+ phLlcNfc_LlcPacket_t s_create_packet;
phLlcNfc_LlcPacket_t *ps_get_packet = NULL;
phLlcNfc_Payload_t *ps_llc_payload = NULL;
phLlcNfc_StoreIFrame_t *ps_store_frame = NULL;
@@ -778,7 +754,6 @@
else
{
ps_frame_info = &(psLlcCtxt->s_frameinfo);
- ps_create_packet = &(ps_frame_info->s_llcpacket);
ps_store_frame = &(ps_frame_info->s_send_store);
if (
@@ -788,7 +763,7 @@
{
/* Get the stored I frame, only if the new frame is sent
from the upper layer */
- result = phLlcNfc_H_IFrameList_Peek (psListInfo, &ps_get_packet,
+ result = phLlcNfc_H_IFrameList_Peek (psListInfo, &ps_get_packet,
ps_frame_info->n_s);
}
@@ -800,25 +775,25 @@
llc_header = (uint8_t)(llc_header | ps_frame_info->n_r);
/* Create the packet */
- (void)memcpy ((void *)ps_create_packet, (void *)ps_get_packet,
+ (void)memcpy ((void *)&(s_create_packet), (void *)ps_get_packet,
sizeof (phLlcNfc_LlcPacket_t));
- ps_create_packet->s_llcbuf.sllcpayload.llcheader = llc_header;
- ps_llc_payload = &(ps_create_packet->s_llcbuf.sllcpayload);
+ s_create_packet.s_llcbuf.sllcpayload.llcheader = llc_header;
+ ps_llc_payload = &(s_create_packet.s_llcbuf.sllcpayload);
/* Length of the complete llc buffer, sent to PN544 */
- length = ps_create_packet->llcbuf_len;
+ length = s_create_packet.llcbuf_len;
/* Compute CRC for the created packet */
- phLlcNfc_H_ComputeCrc ((uint8_t *)&(ps_create_packet->s_llcbuf),
+ phLlcNfc_H_ComputeCrc ((uint8_t *)&(s_create_packet.s_llcbuf),
(length - 2),
(uint8_t *)&(ps_llc_payload->llcpayload[(length - 4)]),
(uint8_t *)&(ps_llc_payload->llcpayload[(length - 3)]));
/* Send the i frame */
- result = phLlcNfc_Interface_Write (psLlcCtxt,
- (uint8_t *)&(ps_create_packet->s_llcbuf),
- (uint32_t)ps_create_packet->llcbuf_len);
+ result = phLlcNfc_Interface_Write (psLlcCtxt,
+ (uint8_t *)&(s_create_packet.s_llcbuf),
+ (uint32_t)s_create_packet.llcbuf_len);
ps_frame_info->write_status = result;
@@ -865,7 +840,7 @@
{
NFCSTATUS result = NFCSTATUS_SUCCESS;
phLlcNfc_Frame_t *ps_frame_info = NULL;
- phLlcNfc_LlcPacket_t *ps_create_packet = NULL;
+ phLlcNfc_LlcPacket_t s_create_packet;
phLlcNfc_LlcPacket_t *ps_get_packet = NULL;
phLlcNfc_Payload_t *ps_llc_payload = NULL;
phLlcNfc_StoreIFrame_t *ps_store_frame = NULL;
@@ -883,7 +858,6 @@
else
{
ps_frame_info = &(psLlcCtxt->s_frameinfo);
- ps_create_packet = &(ps_frame_info->s_llcpacket);
ps_store_frame = &(ps_frame_info->s_send_store);
@@ -898,7 +872,7 @@
ps_store_frame->s_llcpacket[ns_rejected].frame_to_send)
{
/* Above check is added to know only if */
- result = phLlcNfc_H_IFrameList_Peek (psListInfo, &ps_get_packet,
+ result = phLlcNfc_H_IFrameList_Peek (psListInfo, &ps_get_packet,
ns_rejected);
}
else
@@ -918,25 +892,25 @@
llc_header = (uint8_t)(llc_header | ps_frame_info->n_r);
/* Create the packet */
- (void)memcpy ((void *)ps_create_packet, (void *)ps_get_packet,
+ (void)memcpy ((void *)&(s_create_packet), (void *)ps_get_packet,
sizeof (phLlcNfc_LlcPacket_t));
- ps_create_packet->s_llcbuf.sllcpayload.llcheader = llc_header;
- ps_llc_payload = &(ps_create_packet->s_llcbuf.sllcpayload);
+ s_create_packet.s_llcbuf.sllcpayload.llcheader = llc_header;
+ ps_llc_payload = &(s_create_packet.s_llcbuf.sllcpayload);
/* Length of the complete llc buffer, sent to PN544 */
- length = ps_create_packet->llcbuf_len;
+ length = s_create_packet.llcbuf_len;
/* Compute CRC for the created packet */
- phLlcNfc_H_ComputeCrc ((uint8_t *)&(ps_create_packet->s_llcbuf),
+ phLlcNfc_H_ComputeCrc ((uint8_t *)&(s_create_packet.s_llcbuf),
(length - 2),
(uint8_t *)&(ps_llc_payload->llcpayload[(length - 4)]),
(uint8_t *)&(ps_llc_payload->llcpayload[(length - 3)]));
/* Send the i frame */
result = phLlcNfc_Interface_Write (psLlcCtxt,
- (uint8_t *)&(ps_create_packet->s_llcbuf),
- (uint32_t)ps_create_packet->llcbuf_len);
+ (uint8_t *)&(s_create_packet.s_llcbuf),
+ (uint32_t)s_create_packet.llcbuf_len);
ps_frame_info->write_status = result;
@@ -946,7 +920,7 @@
so update the below variable */
ps_frame_info->write_wait_call = (phLlcNfc_eSentFrameType_t)
(((ns_rejected != ps_store_frame->start_pos) &&
- (resend_i_frame != ps_frame_info->write_wait_call))?
+ (resend_i_frame != ps_frame_info->write_wait_call))?
rejected_i_frame : ps_frame_info->write_wait_call);
}
else
@@ -1009,7 +983,7 @@
NFCSTATUS result = NFCSTATUS_SUCCESS;
phLlcNfc_Frame_t *ps_frame_info = NULL;
phLlcNfc_Timerinfo_t *ps_timer_info = NULL;
- phLlcNfc_LlcPacket_t *ps_create_packet = NULL;
+ phLlcNfc_LlcPacket_t s_create_packet;
phLlcNfc_LlcPacket_t *ps_get_packet = NULL;
phLlcNfc_Payload_t *ps_llc_payload = NULL;
phLlcNfc_StoreIFrame_t *ps_store_frame = NULL;
@@ -1033,7 +1007,6 @@
ps_frame_info = &(psLlcCtxt->s_frameinfo);
ps_timer_info = &(psLlcCtxt->s_timerinfo);
- ps_create_packet = &(ps_frame_info->s_llcpacket);
ps_store_frame = &(ps_frame_info->s_send_store);
timer_index = ps_timer_info->index_to_send;
@@ -1043,16 +1016,17 @@
PH_LLCNFC_DEBUG("SEND TIMEOUT CALL WIN SIZE CNT : 0x%02X\n", ps_store_frame->winsize_cnt);
PH_LLCNFC_DEBUG("SEND TIMEOUT CALL START POS : 0x%02X\n", ps_store_frame->start_pos);
PH_LLCNFC_DEBUG("SEND TIMEOUT CALL N S value : 0x%02X\n", ps_frame_info->n_s);
+ PH_LLCNFC_DEBUG("SEND TIMEOUT TIMER INDEX : 0x%02X\n", timer_index);
PH_LLCNFC_DEBUG("SEND TIMEOUT CALL frame type : 0x%02X\n", ps_timer_info->frame_type[timer_index]);
if (resend_i_frame == ps_timer_info->frame_type[timer_index])
{
/* Get the stored I frame */
- result = phLlcNfc_H_IFrameList_Peek (psListInfo, &ps_get_packet,
+ result = phLlcNfc_H_IFrameList_Peek (psListInfo, &ps_get_packet,
ns_index);
}
- PH_LLCNFC_DEBUG("SEND TIMEOUT CALL Packet : 0x%02X\n", ps_get_packet);
+ PH_LLCNFC_DEBUG("SEND TIMEOUT CALL Packet : 0x%p\n", ps_get_packet);
if (NULL != ps_get_packet)
{
llc_header = ps_get_packet->s_llcbuf.sllcpayload.llcheader;
@@ -1061,25 +1035,25 @@
llc_header = (uint8_t)(llc_header | ps_frame_info->n_r);
/* create the packet */
- (void)memcpy ((void *)ps_create_packet, (void *)ps_get_packet,
+ (void)memcpy ((void *)&(s_create_packet), (void *)ps_get_packet,
sizeof (phLlcNfc_LlcPacket_t));
- ps_create_packet->s_llcbuf.sllcpayload.llcheader = llc_header;
- ps_llc_payload = &(ps_create_packet->s_llcbuf.sllcpayload);
+ s_create_packet.s_llcbuf.sllcpayload.llcheader = llc_header;
+ ps_llc_payload = &(s_create_packet.s_llcbuf.sllcpayload);
/* Length of the complete llc buffer, sent to PN544 */
- length = ps_create_packet->llcbuf_len;
+ length = s_create_packet.llcbuf_len;
/* Compute CRC */
- phLlcNfc_H_ComputeCrc((uint8_t *)&(ps_create_packet->s_llcbuf),
+ phLlcNfc_H_ComputeCrc((uint8_t *)&(s_create_packet.s_llcbuf),
(length - 2),
- (uint8_t *)&(ps_llc_payload->llcpayload[(length - 4)]),
+ (uint8_t *)&(ps_llc_payload->llcpayload[(length - 4)]),
(uint8_t *)&(ps_llc_payload->llcpayload[(length - 3)]));
/* Send the i frame */
result = phLlcNfc_Interface_Write (psLlcCtxt,
- (uint8_t *)&(ps_create_packet->s_llcbuf),
- (uint32_t)ps_create_packet->llcbuf_len);
+ (uint8_t *)&(s_create_packet.s_llcbuf),
+ (uint32_t)s_create_packet.llcbuf_len);
ps_frame_info->write_status = result;
PH_LLCNFC_DEBUG("SEND TIMEOUT CALL Write status : 0x%02X\n", result);
@@ -1102,9 +1076,9 @@
PH_LLCNFC_DEBUG("SEND TIMEOUT CALL timer index : 0x%02X\n", timer_index);
- PH_LLCNFC_DEBUG("SEND TIMEOUT CALL GUARD TO VALUE : 0x%02X\n", ps_timer_info->guard_to_value[(timer_index - 1)]);
if (timer_index > 0)
{
+ PH_LLCNFC_DEBUG("SEND TIMEOUT CALL GUARD TO VALUE : 0x%02X\n", ps_timer_info->guard_to_value[(timer_index - 1)]);
/* Copy the maximum time-out value. */
time_out_value = (uint16_t)
((ps_timer_info->guard_to_value[(timer_index - 1)] >=
@@ -1206,18 +1180,12 @@
phLlcNfc_eSentFrameType_t eframe_type = invalid_frame;
uint8_t dont_send_s_frame = FALSE;
uint8_t no_of_del_frames = 0;
- phNfc_sCompletionInfo_t notifyinfo = {0};
+ phNfc_sCompletionInfo_t notifyinfo = {0,0,0};
#ifdef RECV_NR_CHECK_ENABLE
uint8_t recvd_nr = 0;
#endif /* #ifdef RECV_NR_CHECK_ENABLE */
-#ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB
- /* Nothing required in this define */
-#else
- uint8_t prev_local_nr = 0;
-#endif /* #ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */
-
ps_frame_info = &(psLlcCtxt->s_frameinfo);
ps_store_frame = &(ps_frame_info->s_send_store);
ps_recv_pkt = &(ps_frame_info->s_recvpacket);
@@ -1259,12 +1227,6 @@
phLlcNfc_StopTimers (PH_LLCNFC_GUARDTIMER, no_of_del_frames);
}
-#ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB
- /* Nothing required in this define */
-#else
- prev_local_nr = ps_frame_info->n_r;
-#endif /* #ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */
-
/* Received buffer, N(S) value = N(R) of host (our
structure) then send RR type of s frame else send
REJ type of s frame */
@@ -1290,7 +1252,6 @@
ps_recv_pkt->s_llcbuf.sllcpayload.llcpayload),
psLlcCtxt->recvbuf_length);
-
#if defined (LLC_SEND_RR_ACK)
if (((ns_index < ps_frame_info->n_r) &&
@@ -1309,6 +1270,11 @@
ps_frame_info->n_r = ((ps_frame_info->n_r + 1)
% PH_LLCNFC_MOD_NS_NR);
+#ifdef PIGGY_BACK
+ ps_frame_info->resp_recvd_count = (uint8_t)
+ (ps_frame_info->resp_recvd_count + 1);
+#endif /* #ifdef PIGGY_BACK */
+
}
if (NFCSTATUS_BUSY == PHNFCSTATUS (ps_frame_info->write_status))
@@ -1334,9 +1300,7 @@
{
dont_send_s_frame = TRUE;
#ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB
-
phLlcNfc_H_SendInfo (psLlcCtxt);
-
#endif /* #ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */
}
else
@@ -1349,15 +1313,10 @@
resend_s_frame : s_frame);
}
-#ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB
-
- /* Nothing required in this define */
-
-#else /* #ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */
-
+#ifdef PIGGY_BACK
phLlcNfc_H_SendInfo (psLlcCtxt);
+#endif /* #ifdef PIGGY_BACK */
-#endif /* #ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */
}
else
{
@@ -1374,8 +1333,8 @@
#ifdef LLC_RR_INSTEAD_OF_REJ
if (((ps_frame_info->n_r > 0) && (ns_index == (ps_frame_info->n_r - 1)))
- || (0 == ps_frame_info->n_r) &&
- (ns_index == (PH_LLCNFC_MOD_NS_NR - 1)))
+ || ((0 == ps_frame_info->n_r) &&
+ (ns_index == (PH_LLCNFC_MOD_NS_NR - 1))))
{
cmdtype = phLlcNfc_e_rr;
eframe_type = rej_rr_s_frame;
@@ -1425,23 +1384,61 @@
#endif /* #ifdef LLC_RELEASE_FLAG */
{
- result = phLlcNfc_Interface_Read(psLlcCtxt,
+ (void)phLlcNfc_Interface_Read(psLlcCtxt,
PH_LLCNFC_READWAIT_OFF,
&(ps_recv_pkt->s_llcbuf.llc_length_byte),
(uint8_t)PH_LLCNFC_BYTES_INIT_READ);
+#ifdef PIGGY_BACK
+ /* Check if any write call is performed or not */
+ if (NFCSTATUS_PENDING != result)
+ {
+ /* No write is performed, So, now check */
+ if (NFCSTATUS_BUSY == PHNFCSTATUS (ps_frame_info->write_status))
+ {
+ /* Any how write cannot be done and some frame is ready to be sent
+ so this frame will act as the ACK */
+ result = phLlcNfc_H_WriteWaitCall (psLlcCtxt);
+ }
+ }
+ if (NFCSTATUS_PENDING != result)
+ {
+ if (ps_frame_info->window_size == ps_frame_info->resp_recvd_count)
+ {
+ phLlcNfc_LlcPacket_t s_packet_info;
+ /* Create S frame */
+ (void)phLlcNfc_H_CreateSFramePayload (ps_frame_info, &(s_packet_info), cmdtype);
+
+ result = phLlcNfc_Interface_Write(psLlcCtxt,
+ (uint8_t *)&(s_packet_info.s_llcbuf),
+ (uint32_t)(s_packet_info.llcbuf_len));
+
+
+ if (0 == ps_frame_info->send_error_count)
+ {
+ ps_frame_info->write_wait_call = invalid_frame;
+ }
+ ps_frame_info->sent_frame_type = eframe_type;
+ }
+ else
+ {
+ result = phLlcNfc_StartTimers (PH_LLCNFC_ACKTIMER, 0);
+ }
+ }
+#else /* #ifdef PIGGY_BACK */
if ((TRUE != ps_frame_info->write_pending) &&
(PH_LLCNFC_READPEND_REMAIN_BYTE != ps_frame_info->read_pending) &&
(FALSE == dont_send_s_frame))
{
+ phLlcNfc_LlcPacket_t s_packet_info = {0};
/* Create S frame */
- (void)phLlcNfc_H_CreateSFramePayload (ps_frame_info, cmdtype);
+ (void)phLlcNfc_H_CreateSFramePayload (ps_frame_info, &(s_packet_info), cmdtype);
result = phLlcNfc_Interface_Write(psLlcCtxt,
- (uint8_t *)&(ps_frame_info->s_llcpacket.s_llcbuf),
- (uint32_t)(ps_frame_info->s_llcpacket.llcbuf_len));
+ (uint8_t *)&(s_packet_info.s_llcbuf),
+ (uint32_t)(s_packet_info.llcbuf_len));
if (0 == ps_frame_info->send_error_count)
@@ -1450,6 +1447,7 @@
}
ps_frame_info->sent_frame_type = eframe_type;
}
+#endif /* #ifdef PIGGY_BACK */
}
return ;
@@ -1465,7 +1463,7 @@
phLlcNfc_Frame_t *ps_frame_info = NULL;
phLlcNfc_LlcPacket_t *ps_uframe_pkt = NULL;
#ifdef LLC_URSET_NO_DELAY
- phNfc_sCompletionInfo_t notifyinfo = {0};
+ phNfc_sCompletionInfo_t notifyinfo = {0,0,0};
#else /* #ifdef LLC_URSET_NO_DELAY */
uint32_t delay_timer_id =
PH_OSALNFC_INVALID_TIMER_ID;
@@ -1580,12 +1578,12 @@
#if 0
prev_win_count = 0;
#endif /* #if 0 */
- phNfc_sTransactionInfo_t compinfo = {0};
+ phNfc_sTransactionInfo_t compinfo = {0, 0, 0, 0, 0};
phLlcNfc_Frame_t *ps_frame_info = NULL;
phLlcNfc_StoreIFrame_t *ps_store_frame = NULL;
phLlcNfc_LlcPacket_t *ps_recv_pkt = NULL;
uint8_t no_of_del_frames = 0;
- phNfc_sCompletionInfo_t notifyinfo = {0};
+ phNfc_sCompletionInfo_t notifyinfo = {0,0,0};
ps_frame_info = &(psLlcCtxt->s_frameinfo);
ps_recv_pkt = &(ps_frame_info->s_recvpacket);
@@ -1962,13 +1960,16 @@
)
{
NFCSTATUS result = NFCSTATUS_SUCCESS;
+ phLlcNfc_LlcPacket_t s_packet_info = {0};
+
result = phLlcNfc_H_CreateSFramePayload(
- &(psLlcCtxt->s_frameinfo),
+ &(psLlcCtxt->s_frameinfo),
+ &(s_packet_info),
phLlcNfc_e_rej);
/* Send the "S" frame to the lower layer */
result = phLlcNfc_Interface_Write(psLlcCtxt,
- (uint8_t *)&(psLlcCtxt->s_frameinfo.s_llcpacket.s_llcbuf),
- (uint32_t)(psLlcCtxt->s_frameinfo.s_llcpacket.llcbuf_len));
+ (uint8_t *)&(s_packet_info.s_llcbuf),
+ (uint32_t)(s_packet_info.llcbuf_len));
if (NFCSTATUS_PENDING == result)
{
@@ -2160,23 +2161,22 @@
)
{
NFCSTATUS result = NFCSTATUS_SUCCESS;
- phLlcNfc_LlcPacket_t *ps_packet_info = NULL;
+ phLlcNfc_LlcPacket_t s_packet_info;
phLlcNfc_Frame_t *ps_frame_info = NULL;
ps_frame_info = &(psLlcCtxt->s_frameinfo);
- ps_packet_info = &(psLlcCtxt->s_frameinfo.s_llcpacket);
- result = phLlcNfc_H_CreateUFramePayload(psLlcCtxt,
- ps_packet_info,
- &(ps_packet_info->llcbuf_len),
+ result = phLlcNfc_H_CreateUFramePayload(psLlcCtxt,
+ &(s_packet_info),
+ &(s_packet_info.llcbuf_len),
phLlcNfc_e_rset);
if (NFCSTATUS_SUCCESS == result)
{
/* Call DAL write */
- result = phLlcNfc_Interface_Write(psLlcCtxt,
- (uint8_t*)&(ps_packet_info->s_llcbuf),
- (uint32_t)ps_packet_info->llcbuf_len);
+ result = phLlcNfc_Interface_Write(psLlcCtxt,
+ (uint8_t*)&(s_packet_info.s_llcbuf),
+ (uint32_t)s_packet_info.llcbuf_len);
}
ps_frame_info->write_status = result;
diff --git a/src/phLlcNfc_Frame.h b/src/phLlcNfc_Frame.h
index e1662df..e76e017 100644
--- a/src/phLlcNfc_Frame.h
+++ b/src/phLlcNfc_Frame.h
@@ -264,6 +264,7 @@
*
* \param[in/out] psFrameInfo Information related to LLC frames are stored
* in this structure
+* \param[in/out] psLlcPacket Llc packet sent by the upper layer
* \param[in] pLlcBuf User given buffer or the buffer which needs LLC framing
* \param[in] llcBufLength Length of the parameter "pLlcBuf"
*
@@ -427,6 +428,28 @@
/**
* \ingroup grp_hal_nfc_llc_helper
*
+* \brief LLC component <b>Create S frame</b> function
+*
+* \copydoc page_reg This is a helper function which, creates the S frame
+*
+* \param[in/out] psFrameInfo Generic frame information
+* \param[in/out] psLlcPacket Llc packet sent by the upper layer
+* \param[in/out] cmdType Command type of S frame
+*
+* \retval NFCSTATUS_SUCCESS Operation successful.
+* \retval NFCSTATUS_INVALID_PARAMETER At least one parameter of the function is invalid.
+*
+*/
+NFCSTATUS
+phLlcNfc_H_CreateSFramePayload (
+ phLlcNfc_Frame_t *psFrameInfo,
+ phLlcNfc_LlcPacket_t *psLlcPacket,
+ phLlcNfc_LlcCmd_t cmdType
+);
+
+/**
+* \ingroup grp_hal_nfc_llc_helper
+*
* \brief LLC Send upper layer information function
*
* \copydoc page_reg Sends received information to the upper layer frame.
diff --git a/src/phLlcNfc_Interface.c b/src/phLlcNfc_Interface.c
index 92be48d..a1e9938 100644
--- a/src/phLlcNfc_Interface.c
+++ b/src/phLlcNfc_Interface.c
@@ -48,7 +48,6 @@
/***************************** Macros *******************************/
#define PH_LLCNFC_APPEND_LEN (4)
#define LLC_NS_FRAME_HEADER_MASK (0x38U)
-
/************************ End of macros *****************************/
/*********************** Local functions ****************************/
@@ -81,8 +80,8 @@
)
{
NFCSTATUS result = NFCSTATUS_SUCCESS;
- phNfcIF_sCallBack_t if_cb;
- phNfcIF_sReference_t sreference;
+ phNfcIF_sCallBack_t if_cb = {0,0,0,0};
+ phNfcIF_sReference_t sreference = {0,0,0};
if ((NULL == psLlcCtxt) || (NULL == psIFConfig))
{
@@ -223,8 +222,8 @@
(0 == llcBufferLength) ||
(NULL == psLlcCtxt->lower_if.send))
{
- PH_LLCNFC_DEBUG ("psLlcCtxt : 0x%08X\n", psLlcCtxt);
- PH_LLCNFC_DEBUG ("pLlcBuffer : 0x%08X\n", pLlcBuffer);
+ PH_LLCNFC_DEBUG ("psLlcCtxt : 0x%p\n", psLlcCtxt);
+ PH_LLCNFC_DEBUG ("pLlcBuffer : 0x%p\n", pLlcBuffer);
PH_LLCNFC_DEBUG ("llcBufferLength : 0x%08X\n", llcBufferLength);
result = PHNFCSTVAL(CID_NFC_LLC, NFCSTATUS_INVALID_PARAMETER);
}
@@ -247,13 +246,24 @@
PH_LLCNFC_STRING (";\n");
#endif /* LLC_DATA_BYTES */
+
+ psLlcCtxt->s_frameinfo.s_llcpacket.llcbuf_len = (uint8_t)llcBufferLength;
+ (void)memcpy ((void *)&(psLlcCtxt->s_frameinfo.s_llcpacket.s_llcbuf),
+ (void *)pLlcBuffer, llcBufferLength);
+
result = psLlcCtxt->lower_if.send(psLlcCtxt->lower_if.pcontext,
psLlcCtxt->phwinfo,
- pLlcBuffer,
+ (uint8_t *)&(psLlcCtxt->s_frameinfo.s_llcpacket.s_llcbuf),
(uint16_t)llcBufferLength);
if(NFCSTATUS_PENDING == result)
{
psLlcCtxt->s_frameinfo.write_pending = TRUE;
+#ifdef PIGGY_BACK
+ /* Stop the ACK timer, as the ACK or I frame is sent */
+ phLlcNfc_StopTimers (PH_LLCNFC_ACKTIMER, 0);
+ /* ACK is sent, so reset the response received count */
+ psLlcCtxt->s_frameinfo.resp_recvd_count = 0;
+#endif /* #ifdef PIGGY_BACK */
}
}
}
@@ -279,7 +289,7 @@
phLlcNfc_Frame_t *ps_frame_info = NULL;
phLlcNfc_LlcPacket_t *ps_recv_pkt = NULL;
phLlcNfc_StoreIFrame_t *ps_store_frame = NULL;
- phNfc_sCompletionInfo_t notifyinfo;
+ phNfc_sCompletionInfo_t notifyinfo = {0,0,0};
uint8_t count = 0;
PH_LLCNFC_PRINT("\n\nLLC : WRITE RESP CB CALLED\n\n");
@@ -497,6 +507,7 @@
}
else
{
+ /* ***** This notification needs to be disabled ***** */
if(NULL != ps_llc_ctxt->cb_for_if.send_complete)
{
pCompInfo->length = (pCompInfo->length -
@@ -650,7 +661,7 @@
phLlcNfc_LlcPacket_t *ps_recv_pkt = NULL;
phLlcNfc_Payload_t *ps_llc_payload = NULL;
pphNfcIF_Notification_CB_t notifyul = NULL;
- phNfc_sCompletionInfo_t notifyinfo;
+ phNfc_sCompletionInfo_t notifyinfo = {0,0,0};
PH_LLCNFC_PRINT("\n\nLLC : READ RESP CB CALLED\n\n");
@@ -932,7 +943,7 @@
{
phLlcNfc_LlcPacket_t *ps_recv_pkt = NULL;
phLlcNfc_Frame_t *ps_frame_info = NULL;
- phNfc_sTransactionInfo_t comp_info;
+ phNfc_sTransactionInfo_t comp_info = {0,0,0,0,0};
ps_frame_info = &(psLlcCtxt->s_frameinfo);
ps_recv_pkt = &(ps_frame_info->s_recvpacket);
diff --git a/src/phLlcNfc_Timer.c b/src/phLlcNfc_Timer.c
index 9a596b4..06ca7e4 100644
--- a/src/phLlcNfc_Timer.c
+++ b/src/phLlcNfc_Timer.c
@@ -44,8 +44,6 @@
/***************************** Macros *******************************/
/**< Timer for connection timer index */
#define PH_LLCNFC_CONNECTION_TO_INDEX (0x00)
-/**< 0x0A Timer for ack time out value */
-#define PH_LLCNFC_ACK_TO_VALUE (1000)
/**< Maximum guard timer can be present */
#define PH_LLCNFC_MAX_GUARD_TIMER (0x04)
/** Connection time out bit to set */
@@ -60,6 +58,8 @@
#define PH_LLCNFC_CON_TO_BIT_VAL (0x01)
/** Guard time out bit to set */
#define PH_LLCNFC_GUARD_TO_BIT_VAL (0x02)
+/** ACK time out bit to set */
+#define PH_LLCNFC_ACK_TO_BIT_VAL (0x04)
#define GUARD_TO_URSET
@@ -84,7 +84,7 @@
phLlcNfc_AckTimeoutCb (
uint32_t TimerId
);
-#endif
+#endif /* #ifdef PIGGY_BACK */
/* This callback is for connection time out */
static
@@ -290,17 +290,22 @@
/* Get the ack timer flag */
timerstarted = (uint8_t)GET_BITS8 (
ps_timer_info->timer_flag,
- PH_LLCNFC_GUARD_TO_BIT,
+ PH_LLCNFC_ACK_TO_BIT,
PH_LLCNFC_TO_NOOFBITS);
- if (0 == timerstarted)
+
+ if (FALSE == timerstarted)
{
/* Timer not started, so start the timer */
ps_timer_info->timer_flag = (uint8_t)
SET_BITS8 (ps_timer_info->timer_flag,
- PH_LLCNFC_GUARD_TO_BIT
- PH_LLCNFC_TO_NOOFBITS
- (PH_LLCNFC_GUARD_TO_BIT - 1));
+ PH_LLCNFC_ACK_TO_BIT,
+ PH_LLCNFC_TO_NOOFBITS,
+ (PH_LLCNFC_ACK_TO_BIT - 1));
}
+
+
+ timer_resolution = ps_timer_info->ack_to_value = (uint16_t)
+ PH_LLCNFC_ACK_TO_VALUE;
timerid = ps_timer_info->timer_id[PH_LLCNFC_ACKTIMER];
Callback = (ppCallBck_t)&phLlcNfc_AckTimeoutCb;
break;
@@ -380,7 +385,7 @@
{
/* The number of guard timer count is more than the
guard timer to delete */
- while (start_index < no_of_guard_to_del)
+ while (start_index < (timer_count - no_of_guard_to_del))
{
/* Copy the previous stored timer values to the present */
ps_timer_info->guard_to_value[start_index] = (uint16_t)
@@ -457,11 +462,14 @@
#ifdef PIGGY_BACK
case PH_LLCNFC_ACKTIMER:
{
+ timerflag = (timerflag & PH_LLCNFC_ACK_TO_BIT_VAL);
+
ps_timer_info->timer_flag = (uint8_t)
SET_BITS8 (ps_timer_info->timer_flag,
- PH_LLCNFC_GUARD_TO_BIT,
+ PH_LLCNFC_ACK_TO_BIT,
PH_LLCNFC_TO_NOOFBITS, 0);
timerid = ps_timer_info->timer_id[PH_LLCNFC_ACKTIMER];
+ ps_timer_info->ack_to_value = 0;
break;
}
#endif /* #ifdef PIGGY_BACK */
@@ -486,7 +494,7 @@
PHNFC_UNUSED_VARIABLE (result);
PHNFC_UNUSED_VARIABLE (TimerType);
- PHNFC_UNUSED_VARIABLE (no_of_gaurd_to_del);
+ PHNFC_UNUSED_VARIABLE (no_of_guard_to_del);
#endif /* #ifdef LLC_TIMER_ENABLE */
}
@@ -602,23 +610,25 @@
NFCSTATUS result = NFCSTATUS_SUCCESS;
phLlcNfc_Timerinfo_t *ps_timer_info = NULL;
phLlcNfc_Frame_t *ps_frame_info = NULL;
- phLlcNfc_LlcPacket_t *ps_packet_info = NULL;
+ phLlcNfc_LlcPacket_t s_packet_info;
uint8_t index = 0;
+ /* zero_to_index = Time out index has become 0 */
uint8_t zero_to_index = 0;
+
#if defined (GUARD_TO_ERROR)
- phNfc_sCompletionInfo_t notifyinfo = {0};
+ phNfc_sCompletionInfo_t notifyinfo = {0,0,0};
#endif /* #if defined (GUARD_TO_ERROR) */
- PHNFC_UNUSED_VARIABLE(pContext);
PH_LLCNFC_PRINT("\n\nLLC : GUARD TIMEOUT CB CALLED \n\n");
- if ((NULL != gpphLlcNfc_Ctxt) && (TimerId ==
- gpphLlcNfc_Ctxt->s_timerinfo.timer_id[PH_LLCNFC_GUARDTIMER]) &&
- (PH_LLCNFC_GUARD_TO_BIT_VAL ==
- (gpphLlcNfc_Ctxt->s_timerinfo.timer_flag &
+ if ((NULL != gpphLlcNfc_Ctxt) && (TimerId ==
+ gpphLlcNfc_Ctxt->s_timerinfo.timer_id[PH_LLCNFC_GUARDTIMER]) &&
+ (PH_LLCNFC_GUARD_TO_BIT_VAL ==
+ (gpphLlcNfc_Ctxt->s_timerinfo.timer_flag &
PH_LLCNFC_GUARD_TO_BIT_VAL)))
{
uint8_t timer_expired = FALSE;
+
ps_frame_info = &(gpphLlcNfc_Ctxt->s_frameinfo);
ps_timer_info = &(gpphLlcNfc_Ctxt->s_timerinfo);
@@ -632,8 +642,15 @@
send called */
while (index < ps_timer_info->guard_to_count)
{
+ /* This loop runs for all the timer present in the data structure.
+ This means if there are 2 I frame has been sent and
+ response is not received for the I frames sent then the
+ each time this timer expires, the time out value is decremented
+ by the PH_LLCNFC_RESOLUTION value */
if (0 != ps_timer_info->guard_to_value[index])
{
+ /* If timer value is not zero then enter,
+ this means that the value is not zero */
if (ps_timer_info->guard_to_value[index] > 0)
{
if (ps_timer_info->guard_to_value[index] >=
@@ -651,10 +668,20 @@
if (0 == ps_timer_info->guard_to_value[index])
{
+ /* Timer value has expired, so resend has to be done
+ Timer value is 0 */
+ ps_timer_info->frame_type[index] = (uint8_t)resend_i_frame;
+ if (FALSE == timer_expired)
+ {
+ /* As the statement is in the loop, so there are possibilities
+ of more than 1 timer value can be 0, so if previous timer
+ value has already been 0, then again dont change the
+ index */
zero_to_index = index;
timer_expired = TRUE;
}
}
+ }
index = (uint8_t)(index + 1);
}
@@ -686,7 +713,6 @@
timer_count = ps_timer_info->guard_to_count;
-
/* Check before changing the index to resend, if index
already exist then dont set the index */
while ((FALSE == while_exit) && (start_index < timer_count))
@@ -702,13 +728,29 @@
}
}
- if (TRUE == while_exit)
+ if (FALSE == while_exit)
{
+ /* This " ps_timer_info->index_to_send " member is
+ useful, when 2 time out values are 0, then
+ only first timed out value has to be resent and
+ other has to wait until the the first timed out
+ I frame is resent
+ This statement is executed only if, none of the timer
+ has expires previously, this is the first timer in the
+ list that has time out value has 0
+ */
ps_timer_info->index_to_send = zero_to_index;
}
+ else
+ {
+ /* This statement is executed only if, any one of the time
+ out value was 0 previously, so first resend has to be done
+ for the previous I frame, so the index is set to the previous
+ I frame
+ */
+ ps_timer_info->index_to_send = start_index;
+ }
- ps_timer_info->frame_type[zero_to_index] = (uint8_t)
- resend_i_frame;
/* Now resend the frame stored */
result = phLlcNfc_H_SendTimedOutIFrame (gpphLlcNfc_Ctxt,
&(ps_frame_info->s_send_store),
@@ -741,16 +783,15 @@
#if (!defined (GUARD_TO_ERROR) && defined (GUARD_TO_URSET))
PH_LLCNFC_PRINT("U-RSET IS SENT \n");
- ps_packet_info = &(gpphLlcNfc_Ctxt->s_frameinfo.s_llcpacket);
- result = phLlcNfc_H_CreateUFramePayload(gpphLlcNfc_Ctxt,
- ps_packet_info,
- &(ps_packet_info->llcbuf_len),
+ result = phLlcNfc_H_CreateUFramePayload(gpphLlcNfc_Ctxt,
+ &(s_packet_info),
+ &(s_packet_info.llcbuf_len),
phLlcNfc_e_rset);
- result = phLlcNfc_Interface_Write(gpphLlcNfc_Ctxt,
- (uint8_t*)&(ps_packet_info->s_llcbuf),
- (uint32_t)ps_packet_info->llcbuf_len);
+ result = phLlcNfc_Interface_Write(gpphLlcNfc_Ctxt,
+ (uint8_t*)&(s_packet_info.s_llcbuf),
+ (uint32_t)s_packet_info.llcbuf_len);
ps_frame_info->write_status = result;
if (NFCSTATUS_PENDING == result)
@@ -782,15 +823,71 @@
}
#ifdef PIGGY_BACK
+
static
void
phLlcNfc_AckTimeoutCb (
uint32_t TimerId
)
{
+ NFCSTATUS result = NFCSTATUS_SUCCESS;
+ phLlcNfc_Frame_t *ps_frame_info = NULL;
+ phLlcNfc_Timerinfo_t *ps_timer_info = NULL;
+ phLlcNfc_LlcPacket_t s_packet_info;
+ PH_LLCNFC_PRINT("\n\nLLC : ACK TIMEOUT CB CALLED\n\n");
+
+ if ((NULL != gpphLlcNfc_Ctxt) && (TimerId ==
+ gpphLlcNfc_Ctxt->s_timerinfo.timer_id[PH_LLCNFC_ACKTIMER])
+ && (PH_LLCNFC_ACK_TO_BIT_VAL ==
+ (gpphLlcNfc_Ctxt->s_timerinfo.timer_flag &
+ PH_LLCNFC_ACK_TO_BIT_VAL)))
+ {
+ ps_frame_info = &(gpphLlcNfc_Ctxt->s_frameinfo);
+ ps_timer_info = &(gpphLlcNfc_Ctxt->s_timerinfo);
+
+ phLlcNfc_StopTimers (PH_LLCNFC_ACKTIMER, 0);
+
+ if (NFCSTATUS_BUSY == PHNFCSTATUS (ps_frame_info->write_status))
+ {
+ /* Any how write cannot be done and some frame is ready to be sent
+ so this frame will act as the ACK */
+ result = phLlcNfc_H_WriteWaitCall (gpphLlcNfc_Ctxt);
+ }
+ else
+ {
+ /* Create S frame */
+ (void)phLlcNfc_H_CreateSFramePayload (ps_frame_info, &(s_packet_info), phLlcNfc_e_rr);
+
+ result = phLlcNfc_Interface_Write(gpphLlcNfc_Ctxt,
+ (uint8_t *)&(s_packet_info.s_llcbuf),
+ (uint32_t)(s_packet_info.llcbuf_len));
+
+ if (NFCSTATUS_PENDING == result)
+ {
+ if (0 == ps_frame_info->send_error_count)
+ {
+ ps_frame_info->write_wait_call = invalid_frame;
+ }
+ ps_frame_info->sent_frame_type = s_frame;
+ }
+ else
+ {
+ if (invalid_frame == ps_frame_info->write_wait_call)
+ {
+ ps_frame_info->write_wait_call = s_frame;
+ }
+ }
+ }
+ }
+
+ /* ACK is sent, so reset the response received count */
+ gpphLlcNfc_Ctxt->s_frameinfo.resp_recvd_count = 0;
+
+ PH_LLCNFC_PRINT("\n\nLLC : ACK TIMEOUT CB END\n\n");
}
-#endif
+
+#endif /* #ifdef PIGGY_BACK */
static
void
@@ -800,12 +897,12 @@
)
{
NFCSTATUS result = NFCSTATUS_SUCCESS;
- phNfc_sCompletionInfo_t notifyinfo = {0};
+ phNfc_sCompletionInfo_t notifyinfo = {0,0,0};
pphNfcIF_Notification_CB_t notifyul = NULL;
void *p_upperctxt = NULL;
phLlcNfc_Frame_t *ps_frame_info = NULL;
phLlcNfc_Timerinfo_t *ps_timer_info = NULL;
- PHNFC_UNUSED_VARIABLE(pContext);
+ phLlcNfc_LlcPacket_t s_packet_info;
PH_LLCNFC_PRINT("\n\nLLC : CONNECTION TIMEOUT CB CALLED\n\n");
if ((NULL != gpphLlcNfc_Ctxt) && (TimerId ==
@@ -834,16 +931,16 @@
{
/* Create a U frame */
result = phLlcNfc_H_CreateUFramePayload(gpphLlcNfc_Ctxt,
- &(ps_frame_info->s_llcpacket),
- &(ps_frame_info->s_llcpacket.llcbuf_len),
+ &(s_packet_info),
+ &(s_packet_info.llcbuf_len),
phLlcNfc_e_rset);
if (NFCSTATUS_SUCCESS == result)
{
/* Call DAL write */
result = phLlcNfc_Interface_Write (gpphLlcNfc_Ctxt,
- (uint8_t*)&(ps_frame_info->s_llcpacket.s_llcbuf),
- (uint32_t)(ps_frame_info->s_llcpacket.llcbuf_len));
+ (uint8_t*)&(s_packet_info.s_llcbuf),
+ (uint32_t)(s_packet_info.llcbuf_len));
}
if (NFCSTATUS_PENDING == result)
{
@@ -927,7 +1024,7 @@
void *pContext)
{
phLlcNfc_Frame_t *ps_frame_info = NULL;
- phNfc_sCompletionInfo_t notifyinfo = {0};
+ phNfc_sCompletionInfo_t notifyinfo = {0,0,0};
if (NULL != gpphLlcNfc_Ctxt)
{
diff --git a/src/phLlcNfc_Timer.h b/src/phLlcNfc_Timer.h
index d8f702a..f212a32 100644
--- a/src/phLlcNfc_Timer.h
+++ b/src/phLlcNfc_Timer.h
@@ -56,6 +56,12 @@
/**< 0x05 Timer for guard time out value */
#define PH_LLCNFC_GUARD_TO_VALUE LINK_GUARD_TIMEOUT
+#ifdef PIGGY_BACK
+
+#define PH_LLCNFC_ACK_TO_VALUE LINK_ACK_TIMEOUT
+
+#endif /* #ifdef PIGGY_BACK */
+
#ifdef LLC_RESET_DELAY
#define LLC_URSET_DELAY_TIME_OUT LLC_RESET_DELAY
#else
@@ -201,8 +207,10 @@
void
phLlcNfc_URSET_Delay_Notify (
- uint32_t delay_id,
- void *pContext);
+
+ uint32_t delay_id);
+
+
#endif /* #ifdef LLC_URSET_NO_DELAY */