touch/nt36xxx: support p2p test for finger and stylus

Bug: 291835037
Test: manual verify with touch selftest
Change-Id: I6767d7f771379938bfdf348c14456336022e819d
Signed-off-by: Super Liu <supercjliu@google.com>
diff --git a/nt36xxx/nt36xxx_mp_ctrlram.c b/nt36xxx/nt36xxx_mp_ctrlram.c
index d27b237..3e05909 100644
--- a/nt36xxx/nt36xxx_mp_ctrlram.c
+++ b/nt36xxx/nt36xxx_mp_ctrlram.c
@@ -38,18 +38,23 @@
 static uint8_t *RecordResult_FW_CC;
 static uint8_t *RecordResult_FW_DiffMax;
 static uint8_t *RecordResult_FW_DiffMin;
+static uint8_t *RecordResult_FW_DiffP2P;
 static uint8_t *RecordResult_PenTipX_Raw;
 static uint8_t *RecordResult_PenTipY_Raw;
 static uint8_t *RecordResult_PenRingX_Raw;
 static uint8_t *RecordResult_PenRingY_Raw;
 static uint8_t *RecordResult_PenTipX_DiffMax;
 static uint8_t *RecordResult_PenTipX_DiffMin;
+static uint8_t *RecordResult_PenTipX_DiffP2P;
 static uint8_t *RecordResult_PenTipY_DiffMax;
 static uint8_t *RecordResult_PenTipY_DiffMin;
+static uint8_t *RecordResult_PenTipY_DiffP2P;
 static uint8_t *RecordResult_PenRingX_DiffMax;
 static uint8_t *RecordResult_PenRingX_DiffMin;
+static uint8_t *RecordResult_PenRingX_DiffP2P;
 static uint8_t *RecordResult_PenRingY_DiffMax;
 static uint8_t *RecordResult_PenRingY_DiffMin;
+static uint8_t *RecordResult_PenRingY_DiffP2P;
 static uint8_t *RecordResult_Pen_Rx_Max;
 
 static int32_t TestResult_Short;
@@ -59,6 +64,7 @@
 static int32_t TestResult_Noise;
 static int32_t TestResult_FW_DiffMax;
 static int32_t TestResult_FW_DiffMin;
+static int32_t TestResult_FW_DiffP2P;
 static int32_t TestResult_Pen_FW_Raw;
 static int32_t TestResult_PenTipX_Raw;
 static int32_t TestResult_PenTipY_Raw;
@@ -67,12 +73,16 @@
 static int32_t TestResult_Pen_Noise;
 static int32_t TestResult_PenTipX_DiffMax;
 static int32_t TestResult_PenTipX_DiffMin;
+static int32_t TestResult_PenTipX_DiffP2P;
 static int32_t TestResult_PenTipY_DiffMax;
 static int32_t TestResult_PenTipY_DiffMin;
+static int32_t TestResult_PenTipY_DiffP2P;
 static int32_t TestResult_PenRingX_DiffMax;
 static int32_t TestResult_PenRingX_DiffMin;
+static int32_t TestResult_PenRingX_DiffP2P;
 static int32_t TestResult_PenRingY_DiffMax;
 static int32_t TestResult_PenRingY_DiffMin;
+static int32_t TestResult_PenRingY_DiffP2P;
 static int32_t TestResult_Pen_Rx_Max;
 
 static int32_t *RawData_Short;
@@ -80,6 +90,7 @@
 static int32_t *RawData_Diff;
 static int32_t *RawData_Diff_Min;
 static int32_t *RawData_Diff_Max;
+static int32_t *RawData_Diff_P2P;
 static int32_t *RawData_FW_Rawdata;
 static int32_t *RawData_FW_CC;
 static int32_t *RawData_PenTipX_Raw;
@@ -88,12 +99,16 @@
 static int32_t *RawData_PenRingY_Raw;
 static int32_t *RawData_PenTipX_DiffMin;
 static int32_t *RawData_PenTipX_DiffMax;
+static int32_t *RawData_PenTipX_DiffP2P;
 static int32_t *RawData_PenTipY_DiffMin;
 static int32_t *RawData_PenTipY_DiffMax;
+static int32_t *RawData_PenTipY_DiffP2P;
 static int32_t *RawData_PenRingX_DiffMin;
 static int32_t *RawData_PenRingX_DiffMax;
+static int32_t *RawData_PenRingX_DiffP2P;
 static int32_t *RawData_PenRingY_DiffMin;
 static int32_t *RawData_PenRingY_DiffMax;
+static int32_t *RawData_PenRingY_DiffP2P;
 static int32_t *RawData_Pen_Rx_Max;
 
 static struct proc_dir_entry *NVT_proc_selftest_entry;
@@ -162,6 +177,13 @@
 		return -ENOMEM;
 	}
 
+	RecordResult_FW_DiffP2P = (uint8_t *)kzalloc(RecordResult_BufSize,
+				  GFP_KERNEL);
+	if (!RecordResult_FW_DiffP2P) {
+		NVT_ERR("kzalloc for RecordResult_FW_DiffP2P failed!\n");
+		return -ENOMEM;
+	}
+
 	if (ts->pen_support) {
 		RecordResult_PenTipX_Raw = (uint8_t *)kzalloc(Pen_RecordResult_BufSize,
 					   GFP_KERNEL);
@@ -205,6 +227,13 @@
 			return -ENOMEM;
 		}
 
+		RecordResult_PenTipX_DiffP2P = (uint8_t *)kzalloc(Pen_RecordResult_BufSize,
+					       GFP_KERNEL);
+		if (!RecordResult_PenTipX_DiffP2P) {
+			NVT_ERR("kzalloc for RecordResult_PenTipX_DiffP2P failed!\n");
+			return -ENOMEM;
+		}
+
 		RecordResult_PenTipY_DiffMax = (uint8_t *)kzalloc(Pen_RecordResult_BufSize,
 					       GFP_KERNEL);
 		if (!RecordResult_PenTipY_DiffMax) {
@@ -219,6 +248,13 @@
 			return -ENOMEM;
 		}
 
+		RecordResult_PenTipY_DiffP2P = (uint8_t *)kzalloc(Pen_RecordResult_BufSize,
+					       GFP_KERNEL);
+		if (!RecordResult_PenTipY_DiffP2P) {
+			NVT_ERR("kzalloc for RecordResult_PenTipY_DiffP2P failed!\n");
+			return -ENOMEM;
+		}
+
 		RecordResult_PenRingX_DiffMax = (uint8_t *)kzalloc(
 							Pen_RecordResult_BufSize, GFP_KERNEL);
 		if (!RecordResult_PenRingX_DiffMax) {
@@ -233,6 +269,13 @@
 			return -ENOMEM;
 		}
 
+		RecordResult_PenRingX_DiffP2P = (uint8_t *)kzalloc(
+							Pen_RecordResult_BufSize, GFP_KERNEL);
+		if (!RecordResult_PenRingX_DiffP2P) {
+			NVT_ERR("kzalloc for RecordResult_PenRingX_DiffP2P failed!\n");
+			return -ENOMEM;
+		}
+
 		RecordResult_PenRingY_DiffMax = (uint8_t *)kzalloc(
 							Pen_RecordResult_BufSize, GFP_KERNEL);
 		if (!RecordResult_PenRingY_DiffMax) {
@@ -247,6 +290,13 @@
 			return -ENOMEM;
 		}
 
+		RecordResult_PenRingY_DiffP2P = (uint8_t *)kzalloc(
+							Pen_RecordResult_BufSize, GFP_KERNEL);
+		if (!RecordResult_PenRingY_DiffP2P) {
+			NVT_ERR("kzalloc for RecordResult_PenRingY_DiffP2P failed!\n");
+			return -ENOMEM;
+		}
+
 		RecordResult_Pen_Rx_Max = (uint8_t *)kzalloc(PEN_RX_MAX_BUFSIZE, GFP_KERNEL);
 		if (!RecordResult_Pen_Rx_Max) {
 			NVT_ERR("kzalloc for RecordResult_Pen_Rx_Max failed!\n");
@@ -284,6 +334,12 @@
 		return -ENOMEM;
 	}
 
+	RawData_Diff_P2P = (int32_t *)kzalloc(RawData_BufSize, GFP_KERNEL);
+	if (!RawData_Diff_P2P) {
+		NVT_ERR("kzalloc for RawData_Diff_P2P failed!\n");
+		return -ENOMEM;
+	}
+
 	RawData_FW_Rawdata = (int32_t *)kzalloc(RawData_BufSize, GFP_KERNEL);
 	if (!RawData_FW_Rawdata) {
 		NVT_ERR("kzalloc for RawData_FW_Rawdata failed!\n");
@@ -335,6 +391,13 @@
 			return -ENOMEM;
 		}
 
+		RawData_PenTipX_DiffP2P = (int32_t *)kzalloc(Pen_RawData_BufSize,
+					  GFP_KERNEL);
+		if (!RawData_PenTipX_DiffP2P) {
+			NVT_ERR("kzalloc for RawData_PenTipX_DiffP2P failed!\n");
+			return -ENOMEM;
+		}
+
 		RawData_PenTipY_DiffMax = (int32_t *)kzalloc(Pen_RawData_BufSize,
 					  GFP_KERNEL);
 		if (!RawData_PenTipY_DiffMax) {
@@ -349,6 +412,13 @@
 			return -ENOMEM;
 		}
 
+		RawData_PenTipY_DiffP2P = (int32_t *)kzalloc(Pen_RawData_BufSize,
+					  GFP_KERNEL);
+		if (!RawData_PenTipY_DiffP2P) {
+			NVT_ERR("kzalloc for RawData_PenTipY_DiffP2P failed!\n");
+			return -ENOMEM;
+		}
+
 		RawData_PenRingX_DiffMax = (int32_t *)kzalloc(Pen_RawData_BufSize,
 					   GFP_KERNEL);
 		if (!RawData_PenRingX_DiffMax) {
@@ -363,6 +433,13 @@
 			return -ENOMEM;
 		}
 
+		RawData_PenRingX_DiffP2P = (int32_t *)kzalloc(Pen_RawData_BufSize,
+					   GFP_KERNEL);
+		if (!RawData_PenRingX_DiffP2P) {
+			NVT_ERR("kzalloc for RawData_PenRingX_DiffP2P failed!\n");
+			return -ENOMEM;
+		}
+
 		RawData_PenRingY_DiffMax = (int32_t *)kzalloc(Pen_RawData_BufSize,
 					   GFP_KERNEL);
 		if (!RawData_PenRingY_DiffMax) {
@@ -377,6 +454,13 @@
 			return -ENOMEM;
 		}
 
+		RawData_PenRingY_DiffP2P = (int32_t *)kzalloc(Pen_RawData_BufSize,
+					   GFP_KERNEL);
+		if (!RawData_PenRingY_DiffP2P) {
+			NVT_ERR("kzalloc for RawData_PenRingY_DiffP2P failed!\n");
+			return -ENOMEM;
+		}
+
 		RawData_Pen_Rx_Max = (int32_t *)kzalloc(PEN_RX_MAX_BUFSIZE, GFP_KERNEL);
 		if (!RawData_Pen_Rx_Max) {
 			NVT_ERR("kzalloc for RawData_Pen_Rx_Max failed!\n");
@@ -426,6 +510,11 @@
 		RecordResult_FW_DiffMin = NULL;
 	}
 
+	if (RecordResult_FW_DiffP2P) {
+		kfree(RecordResult_FW_DiffP2P);
+		RecordResult_FW_DiffP2P = NULL;
+	}
+
 	if (ts->pen_support) {
 		if (RecordResult_PenTipX_Raw) {
 			kfree(RecordResult_PenTipX_Raw);
@@ -457,6 +546,11 @@
 			RecordResult_PenTipX_DiffMin = NULL;
 		}
 
+		if (RecordResult_PenTipX_DiffP2P) {
+			kfree(RecordResult_PenTipX_DiffP2P);
+			RecordResult_PenTipX_DiffP2P = NULL;
+		}
+
 		if (RecordResult_PenTipY_DiffMax) {
 			kfree(RecordResult_PenTipY_DiffMax);
 			RecordResult_PenTipY_DiffMax = NULL;
@@ -467,6 +561,11 @@
 			RecordResult_PenTipY_DiffMin = NULL;
 		}
 
+		if (RecordResult_PenTipY_DiffP2P) {
+			kfree(RecordResult_PenTipY_DiffP2P);
+			RecordResult_PenTipY_DiffP2P = NULL;
+		}
+
 		if (RecordResult_PenRingX_DiffMax) {
 			kfree(RecordResult_PenRingX_DiffMax);
 			RecordResult_PenRingX_DiffMax = NULL;
@@ -477,6 +576,11 @@
 			RecordResult_PenRingX_DiffMin = NULL;
 		}
 
+		if (RecordResult_PenRingX_DiffP2P) {
+			kfree(RecordResult_PenRingX_DiffP2P);
+			RecordResult_PenRingX_DiffP2P = NULL;
+		}
+
 		if (RecordResult_PenRingY_DiffMax) {
 			kfree(RecordResult_PenRingY_DiffMax);
 			RecordResult_PenRingY_DiffMax = NULL;
@@ -487,6 +591,11 @@
 			RecordResult_PenRingY_DiffMin = NULL;
 		}
 
+		if (RecordResult_PenRingY_DiffP2P) {
+			kfree(RecordResult_PenRingY_DiffP2P);
+			RecordResult_PenRingY_DiffP2P = NULL;
+		}
+
 		if (RecordResult_Pen_Rx_Max) {
 			kfree(RecordResult_Pen_Rx_Max);
 			RecordResult_Pen_Rx_Max = NULL;
@@ -518,6 +627,11 @@
 		RawData_Diff_Max = NULL;
 	}
 
+	if (RawData_Diff_P2P) {
+		kfree(RawData_Diff_P2P);
+		RawData_Diff_P2P = NULL;
+	}
+
 	if (RawData_FW_Rawdata) {
 		kfree(RawData_FW_Rawdata);
 		RawData_FW_Rawdata = NULL;
@@ -559,6 +673,11 @@
 			RawData_PenTipX_DiffMin = NULL;
 		}
 
+		if (RawData_PenTipX_DiffP2P) {
+			kfree(RawData_PenTipX_DiffP2P);
+			RawData_PenTipX_DiffP2P = NULL;
+		}
+
 		if (RawData_PenTipY_DiffMax) {
 			kfree(RawData_PenTipY_DiffMax);
 			RawData_PenTipY_DiffMax = NULL;
@@ -569,6 +688,11 @@
 			RawData_PenTipY_DiffMin = NULL;
 		}
 
+		if (RawData_PenTipY_DiffP2P) {
+			kfree(RawData_PenTipY_DiffP2P);
+			RawData_PenTipY_DiffP2P = NULL;
+		}
+
 		if (RawData_PenRingX_DiffMax) {
 			kfree(RawData_PenRingX_DiffMax);
 			RawData_PenRingX_DiffMax = NULL;
@@ -579,6 +703,11 @@
 			RawData_PenRingX_DiffMin = NULL;
 		}
 
+		if (RawData_PenRingX_DiffP2P) {
+			kfree(RawData_PenRingX_DiffP2P);
+			RawData_PenRingX_DiffP2P = NULL;
+		}
+
 		if (RawData_PenRingY_DiffMax) {
 			kfree(RawData_PenRingY_DiffMax);
 			RawData_PenRingY_DiffMax = NULL;
@@ -589,6 +718,11 @@
 			RawData_PenRingY_DiffMin = NULL;
 		}
 
+		if (RawData_PenRingY_DiffP2P) {
+			kfree(RawData_PenRingY_DiffP2P);
+			RawData_PenRingY_DiffP2P = NULL;
+		}
+
 		if (RawData_Pen_Rx_Max) {
 			kfree(RawData_Pen_Rx_Max);
 			RawData_Pen_Rx_Max = NULL;
@@ -1012,6 +1146,7 @@
 #if TOUCH_KEY_NUM > 0
 	int32_t k = 0;
 #endif /* #if TOUCH_KEY_NUM > 0 */
+	int32_t i = 0;
 
 	NVT_LOGD("++\n");
 
@@ -1044,6 +1179,7 @@
 			iArrayIndex = y * x_num + x;
 			RawData_Diff_Max[iArrayIndex] = (int8_t)((xdata[iArrayIndex] >> 8) & 0xFF);
 			RawData_Diff_Min[iArrayIndex] = (int8_t)(xdata[iArrayIndex] & 0xFF);
+			RawData_Diff_P2P[iArrayIndex] = RawData_Diff_Max[iArrayIndex] - RawData_Diff_Min[iArrayIndex];
 		}
 	}
 #if TOUCH_KEY_NUM > 0
@@ -1051,6 +1187,7 @@
 		iArrayIndex = Y_Channel * X_Channel + k;
 		RawData_Diff_Max[iArrayIndex] = (int8_t)((xdata[iArrayIndex] >> 8) & 0xFF);
 		RawData_Diff_Min[iArrayIndex] = (int8_t)(xdata[iArrayIndex] & 0xFF);
+		RawData_Diff_P2P[iArrayIndex] = RawData_Diff_Max[iArrayIndex] - RawData_Diff_Min[iArrayIndex];
 	}
 #endif /* #if TOUCH_KEY_NUM > 0 */
 
@@ -1074,6 +1211,14 @@
 				RawData_PenRingY_DiffMin, ts->x_gang_num * ts->y_num);
 		nvt_read_get_num_mdata(ts->mmap->PEN_RX_ADDR, RawData_Pen_Rx_Max,
 				PEN_RX_MAX_BUFSIZE);
+		for (i = 0; i < ts->x_num * ts->y_gang_num; i++) {
+			RawData_PenTipX_DiffP2P[i] = RawData_PenTipX_DiffMax[i] - RawData_PenTipX_DiffMin[i];
+			RawData_PenRingX_DiffP2P[i] = RawData_PenRingX_DiffMax[i] - RawData_PenRingX_DiffMin[i];
+		}
+		for (i = 0; i < ts->x_gang_num * ts->y_num; i++) {
+			RawData_PenTipY_DiffP2P[i] = RawData_PenTipY_DiffMax[i] - RawData_PenTipY_DiffMin[i];
+			RawData_PenRingY_DiffP2P[i] = RawData_PenRingY_DiffMax[i] - RawData_PenRingY_DiffMin[i];
+		}
 	} /* if (ts->pen_support) */
 
 	//---Leave Test Mode---
@@ -1777,6 +1922,7 @@
 	TestResult_Noise = 0;
 	TestResult_FW_DiffMax = 0;
 	TestResult_FW_DiffMin = 0;
+	TestResult_FW_DiffP2P = 0;
 	if (ts->pen_support) {
 		TestResult_Pen_FW_Raw = 0;
 		TestResult_PenTipX_Raw = 0;
@@ -1786,12 +1932,16 @@
 		TestResult_Pen_Noise = 0;
 		TestResult_PenTipX_DiffMax = 0;
 		TestResult_PenTipX_DiffMin = 0;
+		TestResult_PenTipX_DiffP2P = 0;
 		TestResult_PenTipY_DiffMax = 0;
 		TestResult_PenTipY_DiffMin = 0;
+		TestResult_PenTipY_DiffP2P = 0;
 		TestResult_PenRingX_DiffMax = 0;
 		TestResult_PenRingX_DiffMin = 0;
+		TestResult_PenRingX_DiffP2P = 0;
 		TestResult_PenRingY_DiffMax = 0;
 		TestResult_PenRingY_DiffMin = 0;
+		TestResult_PenRingY_DiffP2P = 0;
 	} /* if (ts->pen_support) */
 
 	NVT_LOGD("++\n");
@@ -1934,16 +2084,21 @@
 		TestResult_Noise = 1;	// 1: ERROR
 		TestResult_FW_DiffMax = 1;
 		TestResult_FW_DiffMin = 1;
+		TestResult_FW_DiffP2P = 1;
 		if (ts->pen_support) {
 			TestResult_Pen_Noise = 1;
 			TestResult_PenTipX_DiffMax = 1;
 			TestResult_PenTipX_DiffMin = 1;
+			TestResult_PenTipX_DiffP2P = 1;
 			TestResult_PenTipY_DiffMax = 1;
 			TestResult_PenTipY_DiffMin = 1;
+			TestResult_PenTipY_DiffP2P = 1;
 			TestResult_PenRingX_DiffMax = 1;
 			TestResult_PenRingX_DiffMin = 1;
+			TestResult_PenRingX_DiffP2P = 1;
 			TestResult_PenRingY_DiffMax = 1;
 			TestResult_PenRingY_DiffMin = 1;
+			TestResult_PenRingY_DiffP2P = 1;
 			TestResult_Pen_Rx_Max = 1;
 		} /* if (ts->pen_support) */
 	} else {
@@ -1955,7 +2110,15 @@
 					RecordResult_FW_DiffMin, X_Channel, Y_Channel,
 					PS_Config_Lmt_FW_Diff_P, PS_Config_Lmt_FW_Diff_N);
 
-		if ((TestResult_FW_DiffMax == -1) || (TestResult_FW_DiffMin == -1))
+		TestResult_FW_DiffP2P = RawDataTest_SinglePoint_Sub(RawData_Diff_P2P,
+					RecordResult_FW_DiffP2P, X_Channel, Y_Channel,
+					PS_Config_Lmt_FW_Diff_P2P_P, PS_Config_Lmt_FW_Diff_P2P_N);
+
+		if (TestResult_FW_DiffP2P == -1)
+				NVT_ERR("[Touch P2P] Test Fail\n");
+
+		if ((TestResult_FW_DiffMax == -1) || (TestResult_FW_DiffMin == -1)
+				|| (TestResult_FW_DiffP2P == -1))
 			TestResult_Noise = -1;
 		else
 			TestResult_Noise = 0;
@@ -1975,6 +2138,13 @@
 							     PS_Config_Lmt_PenTipX_FW_Diff_P,
 							     PS_Config_Lmt_PenTipX_FW_Diff_N);
 
+			TestResult_PenTipX_DiffP2P = RawDataTest_SinglePoint_Sub(
+							     RawData_PenTipX_DiffP2P,
+							     RecordResult_PenTipX_DiffP2P,
+							     ts->x_num, ts->y_gang_num,
+							     PS_Config_Lmt_PenTipX_FW_Diff_P2P_P,
+							     PS_Config_Lmt_PenTipX_FW_Diff_P2P_N);
+
 			TestResult_PenTipY_DiffMax = RawDataTest_SinglePoint_Sub(
 							     RawData_PenTipY_DiffMax,
 							     RecordResult_PenTipY_DiffMax,
@@ -1989,6 +2159,13 @@
 							     PS_Config_Lmt_PenTipY_FW_Diff_P,
 							     PS_Config_Lmt_PenTipY_FW_Diff_N);
 
+			TestResult_PenTipY_DiffP2P = RawDataTest_SinglePoint_Sub(
+							     RawData_PenTipY_DiffP2P,
+							     RecordResult_PenTipY_DiffP2P,
+							     ts->x_gang_num, ts->y_num,
+							     PS_Config_Lmt_PenTipY_FW_Diff_P2P_P,
+							     PS_Config_Lmt_PenTipY_FW_Diff_P2P_N);
+
 			TestResult_PenRingX_DiffMax = RawDataTest_SinglePoint_Sub(
 							      RawData_PenRingX_DiffMax,
 							      RecordResult_PenRingX_DiffMax,
@@ -2003,6 +2180,13 @@
 							      PS_Config_Lmt_PenRingX_FW_Diff_P,
 							      PS_Config_Lmt_PenRingX_FW_Diff_N);
 
+			TestResult_PenRingX_DiffP2P = RawDataTest_SinglePoint_Sub(
+							     RawData_PenRingX_DiffP2P,
+							     RecordResult_PenRingX_DiffP2P,
+							     ts->x_num, ts->y_gang_num,
+							     PS_Config_Lmt_PenRingX_FW_Diff_P2P_P,
+							     PS_Config_Lmt_PenRingX_FW_Diff_P2P_N);
+
 			TestResult_PenRingY_DiffMax = RawDataTest_SinglePoint_Sub(
 							      RawData_PenRingY_DiffMax,
 							      RecordResult_PenRingY_DiffMax,
@@ -2017,19 +2201,39 @@
 							      PS_Config_Lmt_PenRingY_FW_Diff_P,
 							      PS_Config_Lmt_PenRingY_FW_Diff_N);
 
+			TestResult_PenRingY_DiffP2P = RawDataTest_SinglePoint_Sub(
+							     RawData_PenRingY_DiffP2P,
+							     RecordResult_PenRingY_DiffP2P,
+							     ts->x_gang_num, ts->y_num,
+							     PS_Config_Lmt_PenRingY_FW_Diff_P2P_P,
+							     PS_Config_Lmt_PenRingY_FW_Diff_P2P_N);
+
 			TestResult_Pen_Rx_Max = RawDataTest_SinglePoint_Sub(
 					RawData_Pen_Rx_Max, RecordResult_Pen_Rx_Max,
 					PEN_RX_MAX_X_LEN, PEN_RX_MAX_Y_LEN,
 					PS_Config_Lmt_Pen_Rx_Max_P, PS_Config_Lmt_Pen_Rx_Max_N);
 
+			if (TestResult_PenTipX_DiffP2P == -1)
+				NVT_ERR("[Pen P2P] TipX Test Fail\n");
+			if (TestResult_PenTipY_DiffP2P == -1)
+				NVT_ERR("[Pen P2P] TipY Test Fail\n");
+			if (TestResult_PenRingX_DiffP2P == -1)
+				NVT_ERR("[Pen P2P] RingX Test Fail\n");
+			if (TestResult_PenRingY_DiffP2P == -1)
+				NVT_ERR("[Pen P2P] RingY Test Fail\n");
+
 			if ((TestResult_PenTipX_DiffMax == -1) ||
 			    (TestResult_PenTipX_DiffMin == -1) ||
+			    (TestResult_PenTipX_DiffP2P == -1) ||
 			    (TestResult_PenTipY_DiffMax == -1) ||
 			    (TestResult_PenTipY_DiffMin == -1) ||
+			    (TestResult_PenTipY_DiffP2P == -1) ||
 			    (TestResult_PenRingX_DiffMax == -1) ||
 			    (TestResult_PenRingX_DiffMin == -1) ||
+			    (TestResult_PenRingX_DiffP2P == -1) ||
 			    (TestResult_PenRingY_DiffMax == -1) ||
-			    (TestResult_PenRingY_DiffMin == -1))
+			    (TestResult_PenRingY_DiffMin == -1) ||
+			    (TestResult_PenRingY_DiffP2P == -1))
 				TestResult_Pen_Noise = -1;
 			else
 				TestResult_Pen_Noise = 0;
@@ -2252,6 +2456,7 @@
 {
 	struct device_node *np = root;
 	struct device_node *child = NULL;
+	int32_t i = 0;
 
 	NVT_LOG("Parse mp criteria for node %s\n", node_compatible);
 
@@ -2347,6 +2552,11 @@
 			       X_Channel * Y_Channel + Key_Channel))
 		return -EPERM;
 
+	for (i = 0; i < X_Channel * Y_Channel + Key_Channel; i++) {
+		PS_Config_Lmt_FW_Diff_P2P_N[i] = P2P_N_DEFAULT;
+		PS_Config_Lmt_FW_Diff_P2P_P[i] = PS_Config_Lmt_FW_Diff_P[i] - PS_Config_Lmt_FW_Diff_N[i];
+	}
+
 	if (ts->pen_support) {
 		if (nvt_mp_parse_pen_array(np, "PS_Config_Lmt_PenTipX_FW_Raw_P",
 					   PS_Config_Lmt_PenTipX_FW_Raw_P,
@@ -2428,6 +2638,27 @@
 					   ts->x_gang_num, ts->y_num))
 			return -EPERM;
 
+		for (i = 0; i < ts->x_num * ts->y_gang_num; i++) {
+			PS_Config_Lmt_PenTipX_FW_Diff_P2P_N[i] = P2P_N_DEFAULT;
+			PS_Config_Lmt_PenTipX_FW_Diff_P2P_P[i] =
+					PS_Config_Lmt_PenTipX_FW_Diff_P[i] -
+					PS_Config_Lmt_PenTipX_FW_Diff_N[i];
+			PS_Config_Lmt_PenRingX_FW_Diff_P2P_N[i] = P2P_N_DEFAULT;
+			PS_Config_Lmt_PenRingX_FW_Diff_P2P_P[i] =
+					PS_Config_Lmt_PenRingX_FW_Diff_P[i] -
+					PS_Config_Lmt_PenRingX_FW_Diff_N[i];
+		}
+		for (i = 0; i < ts->x_gang_num * ts->y_num; i++) {
+			PS_Config_Lmt_PenTipY_FW_Diff_P2P_N[i] = P2P_N_DEFAULT;
+			PS_Config_Lmt_PenTipY_FW_Diff_P2P_P[i] =
+					PS_Config_Lmt_PenTipY_FW_Diff_P[i] -
+					PS_Config_Lmt_PenTipY_FW_Diff_N[i];
+			PS_Config_Lmt_PenRingY_FW_Diff_P2P_N[i] = P2P_N_DEFAULT;
+			PS_Config_Lmt_PenRingY_FW_Diff_P2P_P[i] =
+					PS_Config_Lmt_PenRingY_FW_Diff_P[i] -
+					PS_Config_Lmt_PenRingY_FW_Diff_N[i];
+		}
+
 		if (nvt_mp_parse_pen_array(np, "PS_Config_Lmt_Pen_Rx_Max_P",
 				PS_Config_Lmt_Pen_Rx_Max_P, PEN_RX_MAX_X_LEN, PEN_RX_MAX_Y_LEN))
 			return -EPERM;
diff --git a/nt36xxx/nt36xxx_mp_ctrlram.h b/nt36xxx/nt36xxx_mp_ctrlram.h
index 551690f..fa1ac56 100644
--- a/nt36xxx/nt36xxx_mp_ctrlram.h
+++ b/nt36xxx/nt36xxx_mp_ctrlram.h
@@ -37,6 +37,7 @@
 #define PEN_RX_MAX_X_LEN (1)
 #define PEN_RX_MAX_Y_LEN (1)
 #define PEN_RX_MAX_BUFSIZE (1)
+#define P2P_N_DEFAULT (1)
 
 static int32_t PS_Config_Lmt_Short_Rawdata_P[X_Y_DIMENSION_MAX] = {
 	14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008,
@@ -598,6 +599,118 @@
 #endif /* #if TOUCH_KEY_NUM > 0 */
 };
 
+static int32_t PS_Config_Lmt_FW_Diff_P2P_P[X_Y_DIMENSION_MAX] = {
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+	150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+#if TOUCH_KEY_NUM > 0
+	150, 150, 150,
+#endif /* #if TOUCH_KEY_NUM > 0 */
+};
+
+static int32_t PS_Config_Lmt_FW_Diff_P2P_N[X_Y_DIMENSION_MAX] = {
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+#if TOUCH_KEY_NUM > 0
+	1, 1, 1,
+#endif /* #if TOUCH_KEY_NUM > 0 */
+};
+
 static int32_t PS_Config_Lmt_PenTipX_FW_Raw_P[PEN_X_Y_DIMENSION_MAX] = {
 	570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570,
 	570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570,
@@ -864,6 +977,24 @@
 	-870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870,
 };
 
+static int32_t PS_Config_Lmt_PenTipX_FW_Diff_P2P_P[PEN_X_Y_DIMENSION_MAX] = {
+	1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740,
+};
+
+static int32_t PS_Config_Lmt_PenTipX_FW_Diff_P2P_N[PEN_X_Y_DIMENSION_MAX] = {
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+};
+
 static int32_t PS_Config_Lmt_PenTipY_FW_Diff_P[PEN_X_Y_DIMENSION_MAX] = {
 	870, 870, 870, 870,
 	870, 870, 870, 870,
@@ -970,6 +1101,112 @@
 	-870, -870, -870, -870,
 };
 
+static int32_t PS_Config_Lmt_PenTipY_FW_Diff_P2P_P[PEN_X_Y_DIMENSION_MAX] = {
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+};
+
+static int32_t PS_Config_Lmt_PenTipY_FW_Diff_P2P_N[PEN_X_Y_DIMENSION_MAX] = {
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+};
+
 static int32_t PS_Config_Lmt_PenRingX_FW_Diff_P[PEN_X_Y_DIMENSION_MAX] = {
 	870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870,
 	870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870,
@@ -988,6 +1225,24 @@
 	-870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870, -870,
 };
 
+static int32_t PS_Config_Lmt_PenRingX_FW_Diff_P2P_P[PEN_X_Y_DIMENSION_MAX] = {
+	1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740,
+};
+
+static int32_t PS_Config_Lmt_PenRingX_FW_Diff_P2P_N[PEN_X_Y_DIMENSION_MAX] = {
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+};
+
 static int32_t PS_Config_Lmt_PenRingY_FW_Diff_P[PEN_X_Y_DIMENSION_MAX] = {
 	870, 870, 870, 870,
 	870, 870, 870, 870,
@@ -1094,6 +1349,111 @@
 	-870, -870, -870, -870,
 };
 
+static int32_t PS_Config_Lmt_PenRingY_FW_Diff_P2P_P[PEN_X_Y_DIMENSION_MAX] = {
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+	1740, 1740, 1740, 1740,
+};
+
+static int32_t PS_Config_Lmt_PenRingY_FW_Diff_P2P_N[PEN_X_Y_DIMENSION_MAX] = {
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+	1, 1, 1, 1,
+};
 static int32_t PS_Config_Lmt_Pen_Rx_Max_P[1] = {300};
 static int32_t PS_Config_Lmt_Pen_Rx_Max_N[1] = {100};
 static int32_t PS_Config_Diff_Test_Frame = 50;