Add a new config for NFCC reset request usage
The components in the same i2c bus with NFC could use this to request
NFCC reset.
Bug: 184921652
Test: build pass
Change-Id: Ia0582e694a74166330dc33c1ec9b2f33f939be84
diff --git a/st21nfc/adaptation/i2clayer.cc b/st21nfc/adaptation/i2clayer.cc
index f1ea993..6eb3fed 100644
--- a/st21nfc/adaptation/i2clayer.cc
+++ b/st21nfc/adaptation/i2clayer.cc
@@ -49,8 +49,9 @@
static int fidI2c = 0;
static int cmdPipe[2] = {0, 0};
+static int notifyResetRequest = 0;
-static struct pollfd event_table[2];
+static struct pollfd event_table[3];
static pthread_t threadHandle = (pthread_t)NULL;
pthread_mutex_t i2ctransport_mtx = PTHREAD_MUTEX_INITIALIZER;
@@ -82,6 +83,8 @@
HALHANDLE hHAL = (HALHANDLE)arg;
STLOG_HAL_D("echo thread started...\n");
bool readOk = false;
+ int eventNum = (notifyResetRequest < 0) ? 2 : 3;
+ bool reseting = false;
do {
event_table[0].fd = fidI2c;
@@ -92,9 +95,13 @@
event_table[1].events = POLLIN;
event_table[1].revents = 0;
+ event_table[2].fd = notifyResetRequest;
+ event_table[2].events = POLLPRI;
+ event_table[2].revents = 0;
+
STLOG_HAL_V("echo thread go to sleep...\n");
- int poll_status = poll(event_table, 2, -1);
+ int poll_status = poll(event_table, eventNum, -1);
if (-1 == poll_status) {
STLOG_HAL_E("error in poll call\n");
@@ -200,11 +207,28 @@
}
}
+ if (event_table[2].revents & POLLPRI && eventNum > 2) {
+ STLOG_HAL_W("thread received reset request command.. \n");
+ char reset[10];
+ int byte;
+ reset[9] = '\0';
+ lseek(notifyResetRequest, 0, SEEK_SET);
+ byte = read(notifyResetRequest, &reset, sizeof(reset));
+ if (byte < 10) {
+ reset[byte] = '\0';
+ }
+ if (byte > 0 && reset[0] =='1' && reseting == false) {
+ STLOG_HAL_E("trigger NFCC reset.. \n");
+ reseting = true;
+ i2cResetPulse(fidI2c);
+ }
+ }
} while (!closeThread);
close(fidI2c);
close(cmdPipe[0]);
close(cmdPipe[1]);
+ close(notifyResetRequest);
HalDestroy(hHAL);
STLOG_HAL_D("thread exit\n");
@@ -231,6 +255,7 @@
bool I2cOpenLayer(void* dev, HAL_CALLBACK callb, HALHANDLE* pHandle) {
uint32_t NoDbgFlag = HAL_FLAG_DEBUG;
char nfc_dev_node[64];
+ char nfc_reset_req_node[128];
/*Read device node path*/
if (!GetStrValue(NAME_ST_NFC_DEV_NODE, (char *)nfc_dev_node,
@@ -238,6 +263,16 @@
STLOG_HAL_D("Open /dev/st21nfc\n");
strcpy(nfc_dev_node, "/dev/st21nfc");
}
+ /*Read nfcc reset request sysfs*/
+ if (GetStrValue(NAME_ST_NFC_RESET_REQ_SYSFS, (char *)nfc_reset_req_node,
+ sizeof(nfc_reset_req_node))) {
+ STLOG_HAL_D("Open %s\n", nfc_reset_req_node);
+ notifyResetRequest = open(nfc_reset_req_node, O_RDONLY);
+ if (notifyResetRequest < 0) {
+ STLOG_HAL_E("unable to open %s (%s) \n", nfc_reset_req_node, strerror(errno));
+ }
+ }
+
(void)pthread_mutex_lock(&i2ctransport_mtx);
fidI2c = open(nfc_dev_node, O_RDWR);
diff --git a/st21nfc/include/hal_config.h b/st21nfc/include/hal_config.h
index b04b6ba..ad99983 100644
--- a/st21nfc/include/hal_config.h
+++ b/st21nfc/include/hal_config.h
@@ -43,5 +43,6 @@
#define NAME_STNFC_USB_CHARGING_MODE "STNFC_USB_CHARGING_MODE"
#define NAME_CORE_CONF_PROP "CORE_CONF_PROP"
#define NAME_ST_NFC_DEV_NODE "ST_NFC_DEV_NODE"
+#define NAME_ST_NFC_RESET_REQ_SYSFS "ST_NFC_RESET_REQ_SYSFS"
#endif