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