From 399353eb5dc7e9c1db94cc97c380dc7f66c51a4c Mon Sep 17 00:00:00 2001
From: lin <lin@kickpi.com>
Date: Thu, 24 Apr 2025 07:46:24 +0000
Subject: [PATCH] feat(touchscreen) add send cfgs to gt9xx support

---
 longan/kernel/linux-4.9/drivers/input/touchscreen/gt9xx/gt9xx.c                |   82 ++++++++++++++++++++++++++++++----------
 longan/kernel/linux-4.9/drivers/input/touchscreen/gt9xx/gt9xx_ts.h             |   10 ++--
 longan/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/lcd-mipi-10-800-1280-v1.dtsi |   22 +++++++++++
 3 files changed, 88 insertions(+), 26 deletions(-)

diff --git a/longan/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/lcd-mipi-10-800-1280-v1.dtsi b/longan/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/lcd-mipi-10-800-1280-v1.dtsi
index 108436e..7d7beaa 100644
--- a/longan/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/lcd-mipi-10-800-1280-v1.dtsi
+++ b/longan/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/lcd-mipi-10-800-1280-v1.dtsi
@@ -212,6 +212,7 @@
                 ctp_twi_id = <0x0>;
         	ctp_name = "gt9xx";
                 reg = <0x5D>;
+                gtp_send_cfgs = <1>;
                 ctp_screen_max_x = <1280>;
                 ctp_screen_max_y = <800>;
                 ctp_revert_x_flag = <0x1>;
@@ -222,5 +223,26 @@
                 ctp_power_ldo = <3300>;
                 ctp_power_ldo_vol = <3300>;
                 ctp_power = <3300>;
+                goodix,cfg-group0 = [
+			00 00 05 20 03 0A 3D 20 11 08
+			28 08 5A 3C 03 05 00 00 00 00
+			11 11 00 18 1A 1E 14 8F 2F AA
+			1E 20 26 0D 00 00 00 1A 03 10
+			00 00 00 00 00 00 00 00 00 00
+			00 27 5A 94 15 02 07 00 00 04
+			96 2A 00 88 32 00 7E 3B 00 76
+			46 00 70 53 00 70 00 00 00 00
+			00 00 00 00 00 00 00 00 00 00
+			00 00 00 00 00 00 00 00 00 00
+			00 00 00 00 08 00 00 00 00 00
+			00 00 00 01 04 05 06 07 08 09
+			0C 0D 0E 0F 10 11 14 15 16 17
+			18 19 00 00 00 00 FF FF FF FF
+			FF FF 00 02 04 06 07 08 0A 0C
+			0D 0F 10 11 12 13 14 19 1B 1C
+			1E 1F 20 21 22 23 24 25 26 27
+			28 29 FF FF FF FF FF FF FF FF
+			FF FF FF FF 08 01
+	                ];
         };
 };
\ No newline at end of file
diff --git a/longan/kernel/linux-4.9/drivers/input/touchscreen/gt9xx/gt9xx.c b/longan/kernel/linux-4.9/drivers/input/touchscreen/gt9xx/gt9xx.c
index 9111b01..88cec31 100755
--- a/longan/kernel/linux-4.9/drivers/input/touchscreen/gt9xx/gt9xx.c
+++ b/longan/kernel/linux-4.9/drivers/input/touchscreen/gt9xx/gt9xx.c
@@ -84,6 +84,7 @@
 static int revert_x_flag = 0;
 static int revert_y_flag = 0;
 static int exchange_x_y_flag = 0;
+static int gtp_send_cfgs = 0;
 static __u32 twi_id = 0;
 static char irq_pin_name[8];
 
@@ -171,6 +172,25 @@
 		dprintk(DEBUG_INIT,"info.exchange_x_y_flag:%d\n",info.exchange_x_y_flag);
 		dprintk(DEBUG_INIT,"info.irq_gpio_number:%d\n",info.irq_gpio.gpio);
 		dprintk(DEBUG_INIT,"info.wakeup_gpio_number:%d\n",info.wakeup_gpio.gpio);
+	}
+}
+
+int gtp_parse_dt_cfg(struct device *dev, u8 *cfg, int *cfg_len, u8 sid)
+{
+	struct device_node *np = dev->of_node;
+	struct property *prop;
+	char cfg_name[18];
+
+ //rdzkj add for compatible of different screen by sensor_id
+		snprintf(cfg_name, sizeof(cfg_name), "goodix,cfg-group%d", sid);
+		GTP_INFO("get %s",cfg_name);
+		prop = of_find_property(np, cfg_name, cfg_len);
+ //add end
+	 if (!prop || !prop->value || *cfg_len == 0 || *cfg_len > GTP_CONFIG_MAX_LENGTH) {
+		return -1;/* failed */
+	 } else {
+		memcpy(cfg, prop->value, *cfg_len);
+		return 0;
 	}
 }
 
@@ -345,18 +365,18 @@
 {
 	s32 ret = 0;
 
-#if GTP_DRIVER_SEND_CFG
+if( gtp_send_cfgs == 1 ) {
 	s32 retry = 0;
 
 	for (retry = 0; retry < 5; retry++)
 	{
-		//ret = gtp_i2c_write(client, config , GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH);
-		// if (ret > 0)
-		// {
-		// break;
-		// }
+		ret = gtp_i2c_write(client, config , GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH);
+		if (ret > 0)
+		{
+		break;
+		}
 	}
-#endif
+ }
 
 	return ret;
 }
@@ -768,8 +788,10 @@
 static s32 gtp_init_panel(struct goodix_ts_data *ts)
 {
 	s32 ret = -1;
+if ( gtp_send_cfgs == 1) // Device tree determines whether to send_cfgs
+{
+	GTP_DEBUG("gtp_send_cfgs==1 into send_cfgs");
 
-#if GTP_DRIVER_SEND_CFG
 	s32 i;
 	u8 check_sum = 0;
 	u8 rd_cfg_buf[16];
@@ -870,18 +892,35 @@
 	GTP_DEBUG("gt9xx:index = %d\n",index);
 }
 
-printk("config send_cfg_buf******** \n");
-//index = rd_cfg_buf[GTP_ADDR_LENGTH];
-ts->gtp_cfg_len = cfg_info_len[index];
-GTP_DEBUG("gandy---SENSOR ID:%d\n", rd_cfg_buf[GTP_ADDR_LENGTH]);
+// printk("config send_cfg_buf******** \n");
+// //index = rd_cfg_buf[GTP_ADDR_LENGTH];
+// ts->gtp_cfg_len = cfg_info_len[index];
+// GTP_DEBUG("gandy---SENSOR ID:%d\n", rd_cfg_buf[GTP_ADDR_LENGTH]);
+// memset(&config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH);
+// memcpy(&config[GTP_ADDR_LENGTH], send_cfg_buf[index], ts->gtp_cfg_len);
+
+GTP_DEBUG("Get config data from device tree.");
 memset(&config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH);
-memcpy(&config[GTP_ADDR_LENGTH], send_cfg_buf[index], ts->gtp_cfg_len);
+ret = gtp_parse_dt_cfg(&ts->client->dev, &config[GTP_ADDR_LENGTH], &ts->gtp_cfg_len, 0);
+if (ret < 0) {
+	GTP_ERROR("Failed to parse config data form device tree.");
+	return -1;
+}
 
 #if GTP_CUSTOM_CFG
-config[RESOLUTION_LOC]	   = (u8)GTP_MAX_WIDTH;
-config[RESOLUTION_LOC + 1] = (u8)(GTP_MAX_WIDTH>>8);
-config[RESOLUTION_LOC + 2] = (u8)GTP_MAX_HEIGHT;
-config[RESOLUTION_LOC + 3] = (u8)(GTP_MAX_HEIGHT>>8);
+if ( exchange_x_y_flag == 1 ) {
+	config[RESOLUTION_LOC]	   = (u8)screen_max_y;
+	config[RESOLUTION_LOC + 1] = (u8)(screen_max_y>>8);
+	config[RESOLUTION_LOC + 2] = (u8)screen_max_x;
+	config[RESOLUTION_LOC + 3] = (u8)(screen_max_x>>8);
+}
+else {
+	config[RESOLUTION_LOC]	   = (u8)screen_max_x;
+	config[RESOLUTION_LOC + 1] = (u8)(screen_max_x>>8);
+	config[RESOLUTION_LOC + 2] = (u8)screen_max_y;
+	config[RESOLUTION_LOC + 3] = (u8)(screen_max_y>>8);
+}
+
 
 if (GTP_INT_TRIGGER == 0)  //RISING
 {
@@ -900,7 +939,7 @@
 }
 config[ts->gtp_cfg_len] = (~check_sum) + 1;
 
-#else //else DRIVER NEED NOT SEND CONFIG
+}else{ //else DRIVER NEED NOT SEND CONFIG
 
 if(ts->gtp_cfg_len == 0)
 {
@@ -914,7 +953,7 @@
 	ts->abs_y_max = GTP_MAX_HEIGHT;
 	ts->int_trigger_type = GTP_INT_TRIGGER;
 }
-#endif //endif GTP_DRIVER_SEND_CFG
+}
 
 GTP_DEBUG_FUNC();
 
@@ -932,10 +971,10 @@
 ret = gtp_send_cfg(ts->client);
 if (ret < 0)
 {
-	printk("\ngandy-----send config error.ret=%d\n",ret);
+	GTP_DEBUG("\ngandy-----send config error.ret=%d\n",ret);
 	GTP_ERROR("Send config error.");
 }
-printk("X_MAX = %d,Y_MAX = %d,TRIGGER = 0x%02x",
+GTP_DEBUG("X_MAX = %d,Y_MAX = %d,TRIGGER = 0x%02x",
 		ts->abs_x_max,ts->abs_y_max,ts->int_trigger_type);
 
 msleep(10);
@@ -1588,6 +1627,7 @@
 	of_property_read_u32(np, "ctp_revert_x_flag", &revert_x_flag);
 	of_property_read_u32(np, "ctp_revert_y_flag", &revert_y_flag);
 	of_property_read_u32(np, "ctp_exchange_x_y_flag", &exchange_x_y_flag);
+	of_property_read_u32(np, "gtp_send_cfgs", &gtp_send_cfgs);
 #endif
 	sunxi_gpio_to_name(CTP_IRQ_NUMBER,irq_pin_name);
 	pr_err("gt %s, line:%d irq_pin_name = %s \n",__FUNCTION__, __LINE__, irq_pin_name);
diff --git a/longan/kernel/linux-4.9/drivers/input/touchscreen/gt9xx/gt9xx_ts.h b/longan/kernel/linux-4.9/drivers/input/touchscreen/gt9xx/gt9xx_ts.h
index 8aae26c..1d858d1 100755
--- a/longan/kernel/linux-4.9/drivers/input/touchscreen/gt9xx/gt9xx_ts.h
+++ b/longan/kernel/linux-4.9/drivers/input/touchscreen/gt9xx/gt9xx_ts.h
@@ -81,7 +81,7 @@
     u8  enter_update;
     u8  gtp_is_suspend;
     u8  gtp_rawdiff_mode;
-    u8  gtp_cfg_len;
+    u32  gtp_cfg_len;
 };
 
 extern u16 show_len;
@@ -89,7 +89,7 @@
 extern struct ctp_config_info config_info;
 
 //***************************PART1:ON/OFF define*******************************
-#define GTP_CUSTOM_CFG        0
+#define GTP_CUSTOM_CFG        1
 //#define GTP_DRIVER_SEND_CFG   1 
 #define GTP_DRIVER_SEND_CFG                    0
 
@@ -104,7 +104,7 @@
 #define GTP_HEADER_FW_UPDATE  1     
 #define GTP_SLIDING_WAKEUP    0     
 
-#define GTP_DEBUG_ON          0
+#define GTP_DEBUG_ON          1
 #define GTP_DEBUG_ARRAY_ON    0
 #define GTP_DEBUG_FUNC_ON     0
 
@@ -317,8 +317,8 @@
 
 //STEP_3(optional):Custom set some config by themself,if need.
 #if GTP_CUSTOM_CFG
-  #define GTP_MAX_HEIGHT   2048
-  #define GTP_MAX_WIDTH    1536
+  #define GTP_MAX_HEIGHT   1280
+  #define GTP_MAX_WIDTH    800
   #define GTP_INT_TRIGGER  0    //0:Rising 1:Falling
 #else
   #define GTP_MAX_HEIGHT   4096

--
Gitblit v1.6.2