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", >p_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