Merge "Add a new config for NFCC reset request usage"
diff --git a/st21nfc/adaptation/i2clayer.cc b/st21nfc/adaptation/i2clayer.cc
index 6eb3fed..c7b1300 100644
--- a/st21nfc/adaptation/i2clayer.cc
+++ b/st21nfc/adaptation/i2clayer.cc
@@ -44,6 +44,9 @@
 #define ST21NFC_SET_POLARITY_FALLING _IOR(ST21NFC_MAGIC, 0x04, unsigned int)
 #define ST21NFC_SET_POLARITY_HIGH _IOR(ST21NFC_MAGIC, 0x05, unsigned int)
 #define ST21NFC_SET_POLARITY_LOW _IOR(ST21NFC_MAGIC, 0x06, unsigned int)
+#define ST21NFC_CLK_ENABLE _IOR(ST21NFC_MAGIC, 0x11, unsigned int)
+#define ST21NFC_CLK_DISABLE _IOR(ST21NFC_MAGIC, 0x12, unsigned int)
+#define ST21NFC_CLK_STATE _IOR(ST21NFC_MAGIC, 0x13, unsigned int)
 
 #define LINUX_DBGBUFFER_SIZE 300
 
@@ -55,6 +58,8 @@
 static pthread_t threadHandle = (pthread_t)NULL;
 pthread_mutex_t i2ctransport_mtx = PTHREAD_MUTEX_INITIALIZER;
 
+unsigned long hal_ctrl_clk = 0;
+
 /**************************************************************************************************
  *
  *                                      Private API Declaration
@@ -282,6 +287,15 @@
     return false;
   }
 
+  GetNumValue(NAME_STNFC_CONTROL_CLK, &hal_ctrl_clk, sizeof(hal_ctrl_clk));
+
+  if (hal_ctrl_clk) {
+    if (ioctl(fidI2c, ST21NFC_CLK_DISABLE, NULL) < 0) {
+      char msg[LINUX_DBGBUFFER_SIZE];
+      strerror_r(errno, msg, LINUX_DBGBUFFER_SIZE);
+      STLOG_HAL_E("ST21NFC_CLK_DISABLE failed errno %d(%s)", errno, msg);
+    }
+  }
   i2cSetPolarity(fidI2c, false, false);
   i2cResetPulse(fidI2c);
 
@@ -404,13 +418,51 @@
   int retries = 0;
   int result = 0;
   int halfsecs = 0;
+  int clk_state = -1;
+  char msg[LINUX_DBGBUFFER_SIZE];
+
+  if (hal_ctrl_clk && length >= 4 && pvBuffer[0] == 0x20 &&
+      pvBuffer[1] == 0x09) {
+    if (0 > (clk_state = ioctl(fid, ST21NFC_CLK_STATE, NULL))) {
+      strerror_r(errno, msg, LINUX_DBGBUFFER_SIZE);
+      STLOG_HAL_E("ST21NFC_CLK_STATE failed errno %d(%s)", errno, msg);
+      clk_state = -1;
+    }
+    STLOG_HAL_D("ST21NFC_CLK_STATE = %d", clk_state);
+    if (clk_state == 1 && (pvBuffer[3] == 0x01 || pvBuffer[3] == 0x03)) {
+      // screen off cases
+      if (ioctl(fid, ST21NFC_CLK_DISABLE, NULL) < 0) {
+        strerror_r(errno, msg, LINUX_DBGBUFFER_SIZE);
+        STLOG_HAL_E("ST21NFC_CLK_DISABLE failed errno %d(%s)", errno, msg);
+      } else if (0 > (clk_state = ioctl(fid, ST21NFC_CLK_STATE, NULL))) {
+        strerror_r(errno, msg, LINUX_DBGBUFFER_SIZE);
+        STLOG_HAL_E("ST21NFC_CLK_STATE failed errno %d(%s)", errno, msg);
+        clk_state = -1;
+      }
+      if (clk_state != 0) {
+        STLOG_HAL_E("CLK_DISABLE STATE ERROR clk_state = %d", clk_state);
+      }
+    } else if (clk_state == 0 && (pvBuffer[3] == 0x02 || pvBuffer[3] == 0x00)) {
+      // screen on cases
+      if (ioctl(fid, ST21NFC_CLK_ENABLE, NULL) < 0) {
+        strerror_r(errno, msg, LINUX_DBGBUFFER_SIZE);
+        STLOG_HAL_E("ST21NFC_CLK_ENABLE failed errno %d(%s)", errno, msg);
+      } else if (0 > (clk_state = ioctl(fid, ST21NFC_CLK_STATE, NULL))) {
+        strerror_r(errno, msg, LINUX_DBGBUFFER_SIZE);
+        STLOG_HAL_E("ST21NFC_CLK_STATE failed errno %d(%s)", errno, msg);
+        clk_state = -1;
+      }
+      if (clk_state != 1) {
+        STLOG_HAL_E("CLK_ENABLE STATE ERROR clk_state = %d", clk_state);
+      }
+    }
+  }
 
 redo:
   while (retries < 3) {
     result = write(fid, pvBuffer, length);
 
     if (result < 0) {
-      char msg[LINUX_DBGBUFFER_SIZE];
 
       strerror_r(errno, msg, LINUX_DBGBUFFER_SIZE);
       STLOG_HAL_W("! i2cWrite!!, errno is '%s'", msg);
diff --git a/st21nfc/include/android_logmsg.h b/st21nfc/include/android_logmsg.h
index 7be148f..e6fbbc5 100644
--- a/st21nfc/include/android_logmsg.h
+++ b/st21nfc/include/android_logmsg.h
@@ -49,6 +49,7 @@
 #define NAME_STNFC_FW_BIN_NAME "STNFC_FW_BIN_NAME"
 #define NAME_STNFC_FW_DEBUG_ENABLED "STNFC_FW_DEBUG_ENABLED"
 #define NAME_CORE_CONF_PROP "CORE_CONF_PROP"
+#define NAME_STNFC_CONTROL_CLK "STNFC_CONTROL_CLK"
 
 /* #######################
  * Set the logging level