Browse Source

VEN & eSE SVDD power is not high during Secure Timer is Running

nxpandroid 7 years ago
parent
commit
4fb8563652
2 changed files with 44 additions and 4 deletions
  1. 34 3
      pn8xT/pn553-i2c/pn553.c
  2. 10 1
      pn8xT/pn553-i2c/pn553.h

+ 34 - 3
pn8xT/pn553-i2c/pn553.c

@@ -70,7 +70,7 @@
 #include <linux/timer.h>
 #include "pn553.h"
 
-#define NEXUS5x    1
+#define NEXUS5x    0
 #define HWINFO     0
 #if NEXUS5x
 #undef ISO_RST
@@ -119,6 +119,7 @@ static bool  sIsWakeLocked = false;
 static struct pn544_dev *pn544_dev;
 static struct semaphore ese_access_sema;
 static struct semaphore svdd_sync_onoff_sema;
+static struct completion dwp_onoff_sema;
 static struct timer_list secure_timer;
 static void release_ese_lock(p61_access_state_t  p61_current_state);
 int get_ese_lock(p61_access_state_t  p61_current_state, int timeout);
@@ -382,6 +383,31 @@ static int release_svdd_wait(void)
     pr_info("%s: Exit\n", __func__);
     return 0;
 }
+
+static void dwp_OnOff(long nfc_service_pid, p61_access_state_t origin)
+{
+    int timeout = 100; //100 ms timeout
+    unsigned long tempJ = msecs_to_jiffies(timeout);
+    if(nfc_service_pid)
+    {
+        if (0 == signal_handler(origin, nfc_service_pid))
+        {
+            init_completion(&dwp_onoff_sema);
+            if(wait_for_completion_timeout(&dwp_onoff_sema, tempJ) != 0)
+            {
+                pr_info("Dwp On/off wait protection: Timeout");
+            }
+            pr_info("Dwp On/Off wait protection : released");
+        }
+    }
+}
+static int release_dwpOnOff_wait(void)
+{
+    pr_info("%s: Enter \n", __func__);
+    complete(&dwp_onoff_sema);
+    return 0;
+}
+
 static int pn544_dev_open(struct inode *inode, struct file *filp)
 {
     struct pn544_dev *pn544_dev = container_of(filp->private_data,
@@ -419,6 +445,9 @@ long  pn544_dev_ioctl(struct file *filp, unsigned int cmd,
         case P544_SET_NFC_SERVICE_PID:
             return set_nfc_pid(arg);
         break;
+        case P544_REL_DWPONOFF_WAIT:
+            return release_dwpOnOff_wait();
+        break;
         default:
         break;
     }
@@ -540,7 +569,8 @@ long  pn544_dev_ioctl(struct file *filp, unsigned int cmd,
                 if (!(current_state & P61_STATE_JCP_DWNLD)){
                     if(pn544_dev->nfc_service_pid){
                         pr_info("nfc service pid %s   ---- %ld", __func__, pn544_dev->nfc_service_pid);
-                        signal_handler(P61_STATE_SPI, pn544_dev->nfc_service_pid);
+                        /*signal_handler(P61_STATE_SPI, pn544_dev->nfc_service_pid);*/
+                        dwp_OnOff(pn544_dev->nfc_service_pid, P61_STATE_SPI);
                     }
                     else{
                         pr_info(" invalid nfc service pid....signalling failed%s   ---- %ld", __func__, pn544_dev->nfc_service_pid);
@@ -720,7 +750,8 @@ long  pn544_dev_ioctl(struct file *filp, unsigned int cmd,
                 if (current_state & P61_STATE_WIRED){
                     if(pn544_dev->nfc_service_pid){
                         pr_info("nfc service pid %s   ---- %ld", __func__, pn544_dev->nfc_service_pid);
-                        signal_handler(P61_STATE_SPI_PRIO, pn544_dev->nfc_service_pid);
+                        /*signal_handler(P61_STATE_SPI_PRIO, pn544_dev->nfc_service_pid);*/
+                        dwp_OnOff(pn544_dev->nfc_service_pid, P61_STATE_SPI_PRIO);
                     }
                     else{
                         pr_info(" invalid nfc service pid....signalling failed%s   ---- %ld", __func__, pn544_dev->nfc_service_pid);

+ 10 - 1
pn8xT/pn553-i2c/pn553.h

@@ -92,8 +92,17 @@
  *
 */
 #define PN544_SET_DWNLD_STATUS    _IOW(PN544_MAGIC, 0x09, long)
+/*
+  NFC will call the ioctl to release the dwp on/off protection
+*/
+#define P544_REL_DWPONOFF_WAIT _IOW(PN544_MAGIC, 0x0A, long)
+
+/*
+  NFC will call the ioctl to start Secure Timer
+*/
+
+#define P544_SECURE_TIMER_SESSION _IOW(PN544_MAGIC, 0x0B, long)
 
-#define P544_SECURE_TIMER_SESSION _IOW(PN544_MAGIC, 0x0A, long)
 #define MAX_ESE_ACCESS_TIME_OUT_MS 200 /*100 milliseconds*/
 
 typedef enum p61_access_state{