当前位置: 首页 > news >正文

【RV1126】调试GT911,1024x600 7寸 MIPI 电容触摸屏

文章目录

  • 一、驱动注册失败
  • 二、触摸屏可以触摸,但是x轴数据反了
  • 三、可以触摸了,但是Y轴数据跳变,几乎只有一半的屏幕是可以正常滑动的
  • 三、汇顶触摸屏配置文件解析
  • 四、使用新的配置文件
    • 4.1 新配置解决问题
    • 4.2 测试触摸的方法
      • 在kernel增加frame buffer(/dev/fb0)设备节点
      • 在buildroot中配置增加tslib
    • 4.3 测试
  • 五、工作一段时间触摸屏驱动崩溃
  • 六、在LVGL中的触摸修改:上下滑动方向相反

硬件:易百纳38x38mm RV1126板
SDK:2.2

一、驱动注册失败

上电信息中出现如下:

[    0.403505] i2c /dev entries driver
[    0.406719] goodix_ts_probe() start
[    0.406762] Goodix-TS 3-005d: no max-x defined
[    0.406797] Goodix-TS: probe of 3-005d failed with error -22

解决:在kernel/drivers/input/touchscreen/gt9xx/gt9xx.c驱动中搜索“no max-x defined”的关键句;发现设备树中没有配置tp-size属性,根据代码的理解是选择触摸屏芯片的型号(若代码中没有对应的芯片型号,可以自己添加):

if (of_property_read_u32(np, "tp-size", &val)) {dev_err(&client->dev, "no max-x defined\n");return -EINVAL;}if (val == 89) {m89or101 = TRUE;gtp_change_x2y = TRUE;gtp_x_reverse = FALSE;gtp_y_reverse = TRUE;} else if (val == 101) {m89or101 = FALSE;gtp_change_x2y = TRUE;gtp_x_reverse = TRUE;gtp_y_reverse = FALSE;} else if (val == 911) {m89or101 = FALSE;bgt911 = TRUE;gtp_change_x2y = TRUE;gtp_x_reverse = FALSE;gtp_y_reverse = TRUE;} else if (val == 970) {m89or101 = FALSE;bgt911 = FALSE;bgt970 = TRUE;gtp_change_x2y = FALSE;gtp_x_reverse = FALSE;gtp_y_reverse = TRUE;} else if (val == 910) {m89or101 = FALSE;bgt911 = FALSE;bgt970 = FALSE;bgt910 = TRUE;gtp_change_x2y = TRUE;gtp_x_reverse = FALSE;gtp_y_reverse = TRUE;}

在设备树文件/kernel/arch/arm/boot/dts/rv1109-38-v10-spi-nand.dts修改增加tp-size为如下:

&i2c3 {status = "okay";clock-frequency = <400000>;pinctrl-names = "default";pinctrl-0 = <&i2c3m1_xfer>; gt9xx: gt9xx@5d {compatible = "goodix,gt9xx";reg = <0x5d>;
//      	gtp_ics_slot_report;touch-gpio = <&gpio2 RK_PA6 IRQ_TYPE_EDGE_RISING>;reset-gpio = <&gpio2 RK_PD6 GPIO_ACTIVE_HIGH>;max-x = <1024>;max-y = <600>;tp-size = <911>;
//      	power-supply = <&vcc18_lcd_n>;};
};

解决了:

[    0.403886] i2c /dev entries driver
[    0.407113] goodix_ts_probe() start
[    0.407181] Goodix-TS 3-005d: 3-005d supply tp not found, using dummy regulator
[    0.407292] Goodix-TS 3-005d: Linked as a consumer to regulator.0
[    0.579130] input: goodix-ts as /devices/platform/ff520000.i2c/i2c-3/3-005d/input/input0

"tp-size” 这个参数表面看是 tp 的尺寸,实际在代码中通过这个参数来选择配置信息和触摸调整,在源码中根据 tp-size 设置 tp 方向是否需要镜像、切换,还有需要使用的配置参数。
如果 bgt927 设置为 TRUE,其他的 bgtxxx 都要设置 FALSE
开始调试时,下面三个参数都设置为 FALSE,然后根据 bgt927 选择配置参数,编译烧录后根据实际现象再调整下面三个参数
gtp_change-x2y:x、y交换方向
gtp_x_reverse:x 方向坐标镜像
gtp_y_reverse:y 方向左边镜像

if (val == 89) {m89or101 = TRUE;gtp_change_x2y = TRUE;gtp_x_reverse = FALSE;gtp_y_reverse = TRUE;} else if (val == 101) {m89or101 = FALSE;gtp_change_x2y = TRUE;gtp_x_reverse = TRUE;gtp_y_reverse = FALSE;} else if (val == 911) {m89or101 = FALSE;bgt911 = TRUE;gtp_change_x2y = TRUE;gtp_x_reverse = FALSE;gtp_y_reverse = TRUE;} else if (val == 970) {m89or101 = FALSE;bgt911 = FALSE;bgt970 = TRUE;gtp_change_x2y = FALSE;gtp_x_reverse = FALSE;gtp_y_reverse = TRUE;} else if (val == 910) {m89or101 = FALSE;bgt911 = FALSE;bgt970 = FALSE;bgt910 = TRUE;gtp_change_x2y = TRUE;gtp_x_reverse = FALSE;gtp_y_reverse = TRUE;}

val是读取设备树里的tp-size来获取的:用于调节触摸xy轴

二、触摸屏可以触摸,但是x轴数据反了

gt9xx.c驱动里面有调整X轴和Y轴数据方向代码,只需要修改下驱动即可;

m89or101 = FALSE;
bgt9271 = TRUE;
gtp_change_x2y = FALSE;    ===>X轴和Y轴数据交换
gtp_x_reverse = TRUE;      ===>X轴数据反转
gtp_y_reverse = TRUE;      ===>XY轴数据反转

如果上面配置修改没有起作用,看下代码哪里做了判断,修改如下即可触摸正常:

//if (!bgt911 && !bgt970) {if (gtp_x_reverse)x = ts->abs_x_max - x;if (gtp_y_reverse)y = ts->abs_y_max - y;
//	}	

三、可以触摸了,但是Y轴数据跳变,几乎只有一半的屏幕是可以正常滑动的

参考:RK3399触摸不准,修改drivers中gt9xx.h的cfg

文件目录kernel/drivers/input/touchscreen/gt9xx/gt9xx.h打开这个调试宏

#define DEBUG_SWITCH  1

Debug看日志

[    0.403131] <<-GTP-INFO->> GTP driver installing...
[    0.403670] i2c /dev entries driver
[    0.406933] goodix_ts_probe() start
[    0.406968] <<-GTP-INFO->> GTP Driver Version: V2.2<2014/01/14>
[    0.406983] <<-GTP-INFO->> GTP I2C Address: 0x5d
[    0.407028] Goodix-TS 3-005d: 3-005d supply tp not found, using dummy regulator
[    0.407138] Goodix-TS 3-005d: Linked as a consumer to regulator.0
[    0.432077] <<-GTP-INFO->> Guitar reset
[    0.556023] <<-GTP-INFO->> Chip Type: GOODIX_GT9
[    0.556497] <<-GTP-INFO->> IC Version: 911_1060
[    0.556524] <<-GTP-INFO->>   <gtp_init_panel>_1429
[    0.556524]
[    0.556551] <<-GTP-DEBUG->> [1459]Config Groups' Lengths: 186, 0, 0, 0, 0, 0
[    0.556888] <<-GTP-INFO->> CTP_CONFIG_GROUP1 used, config length: 186
[    0.557242] <<-GTP-DEBUG->> [1534]CFG_GROUP1 Config Version: 67, 0x43; IC Config Version: 65, 0x41
[    0.557269] <<-GTP-INFO->>   <gtp_init_panel>_1538
[    0.557269]
[    0.557297] <<-GTP-INFO->>   <gtp_init_panel>_1603    <4096, 4096>
[    0.557297]
[    0.557315] <<-GTP-INFO->>   <gtp_init_panel>_1605
[    0.557315]
[    0.557332] <<-GTP-INFO->>   <gtp_init_panel>_1644
[    0.557332]
[    0.557353] <<-GTP-INFO->> Driver send config.
[    0.563126] <<-GTP-INFO->> X_MAX: 4096, Y_MAX: 4096, TRIGGER: 0x01
[    0.578615] <<-GTP-INFO->> create proc entry gt9xx_config success
[    0.578938] input: goodix-ts as /devices/platform/ff520000.i2c/i2c-3/3-005d/input/input0
[    0.579234] <<-GTP-DEBUG->> [1870]INT trigger type:1
[    0.579560] <<-GTP-INFO->>   <gtp_request_irq>_1884     ts->irq=81   ret = 0
[    0.579560]
[    0.579596] <<-GTP-INFO->>   <gtp_request_irq>_1914     ts->irq=81   ret = 0
[    0.579596]
[    0.579618] <<-GTP-INFO->> GTP works in interrupt mode.

这句话:

[    0.563126] <<-GTP-INFO->> X_MAX: 4096, Y_MAX: 4096, TRIGGER: 0x01

那问题就很明显了,应该是cfg不对,X轴和Y轴的最大尺寸是错的!

根据文件kernel/drivers/input/touchscreen/gt9xx/gt9xx_cfg.h

#ifndef _GOODIX_GT9XX_CFG_H_
#define _GOODIX_GT9XX_CFG_H_/* CFG for GT911 */
u8 gtp_dat_gt11[] = {/* <1200, 1920>*/#include "WGJ89006B_GT911_Config_20140625_085816_0X43.cfg"
};u8 gtp_dat_8_9[] = {/* TODO:Puts your update firmware data here! *//* <1920, 1200> 8.9 *//* #include "WGJ89006B_GT9271_Config_20140625_085816_0X41.cfg" *//* #include "WGJ10162_GT9271_Config_20140820_182456.cfg" */#include "WGJ10162B_GT9271_1060_Config_20140821_1341110X42.cfg"
};u8 gtp_dat_8_9_1[] = {#include "GT9271_Config_20170526.cfg"
};u8 gtp_dat_9_7[] = {/* <1536, 2048> 9.7 */#include "GT9110P_Config_20160217_1526_2048_97.cfg"
};u8 gtp_dat_10_1[] = {/* TODO:Puts your update firmware data here! *//* <1200, 1920> 10.1 */#include "WGJ10187_GT9271_Config_20140623_104014_0X41.cfg"
};u8 gtp_dat_7[] = {/* TODO:Puts your update firmware data here! *//* <1024, 600> 7.0 */#include "WGJ10187_GT910_Config_20140623_104014_0X41.cfg"
};#endif /* _GOODIX_GT9XX_CFG_H_ */

对应的配置文件gtp_dat_gt11居然用的分辨率是<1200, 1920>,所以确定是:kernel/drivers/input/touchscreen/gt9xx/gt9xx_cfg.h文件里面的配置出错了!

需要找供应商要触摸屏的cfg文件,不然无解!

三、汇顶触摸屏配置文件解析

参考:汇顶GT9xxx触摸配置

使用汇顶Gt9xxx触摸屏,需要修改 drivers/input/touchscreen/gt9xxnewgt9xx.h 来更改分辨率

在这里插入图片描述测试校验和的工具:

#include <QCoreApplication>
#include <stdio.h>
#include <QDebug>uint8_t CTP_CFG_GROUP1[]= {\0x00,0x00,0x04,0x58,0x02,0x0A,0x0D,0x00,0x01,0x0A,0x1E,0x0F,0x58,0x41,0x03,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8C,0x2E,0x0E,0x2F,0x31,0xEB,0x04,0x00,0x00,0x00,0x22,0x02,0x1D,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x1E,0x50,0x94,0xC5,0x02,0x07,0x00,0x00,0x04,0xC8,0x21,0x00,0xAA,0x28,0x00,0x90,0x31,0x00,0x7C,0x3B,0x00,0x6C,0x48,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0E,0x10,0x12,0x14,0x16,0x18,0x1A,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0F,0x10,0x12,0x13,0x14,0x16,0x18,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x24,0x26,0x28,0x29,0x2A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x01};uint8_t CTP_CFG_GROUP2[]= {\0x42,0x00,0x05,0x20,0x03,0x0A,0x3D,0x00,0x01,0x08,\0x28,0x0F,0x50,0x32,0x03,0x05,0x00,0x00,0x00,0x00,\0x00,0x00,0x00,0x17,0x19,0x1D,0x14,0x8D,0x2D,0x88,\0x1E,0x20,0x31,0x0D,0x00,0x00,0x00,0x42,0x03,0x1D,\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\0x00,0x14,0x2D,0x94,0xD5,0x02,0x07,0x00,0x00,0x04,\0xAF,0x15,0x00,0x95,0x19,0x00,0x80,0x1E,0x00,0x70,\0x23,0x00,0x63,0x29,0x00,0x63,0x00,0x00,0x00,0x00,\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\0x00,0x00,0x00,0x01,0x04,0x05,0x06,0x07,0x08,0x09,\0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x14,0x15,0xFF,0xFF,\0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\0x00,0x00,0x00,0x02,0x04,0x06,0x07,0x08,0x0A,0x0C,\0x0F,0x10,0x11,0x12,0x13,0x19,0x1B,0x1C,0x1E,0x1F,\0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0xFF,0xFF,\0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,\0x00,0x00,0x00,0x00,0xEE,0x01};uint8_t SumCheck(uint8_t *data,int data_len)
{uint8_t sum_check = 0;for(int i = 0;(i<data_len)&&(i<1000);i++){sum_check += data[i];}sum_check = ~sum_check;sum_check += 1;return sum_check;
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);uint8_t sum_check = 0;uint8_t *list[2] = {CTP_CFG_GROUP1,CTP_CFG_GROUP2};for(int i = 0;i<2;i++){sum_check = SumCheck(list[i],184);printf("-------------num:%d----------\n",i+1);printf("lcd_x_pix = %d\n",(list[i][1])|list[i][2]<<8);printf("lcd_y_pix = %d\n",(list[i][3])|list[i][4]<<8);printf("sum_check = 0x%2x\n",sum_check);printf("sum       = 0x%2x\n",list[i][184]);if(sum_check == list[i][184])printf("check ok\n");elseprintf("check error!!!\n");}return a.exec();
}

四、使用新的配置文件

4.1 新配置解决问题

千方百计搞到一个可以使用的配置文件。

GT911.cfg

0x41,0x00,0x04,0x58,0x02,0x0A,0x3C,0x00,0x02,0x54,0x28,0x0F,0x50,0x2D,0x03,0x05,0x00,0x00,0x00,0x00,0x40,0x00,0x04,0x18,0x1A,0x1E,0x14,0x87,0x28,0x0A,0x3C,0x44,0x15,0x0E,0x00,0x00,0x00,0xA9,0x03,0x1C,0x00,0x01,0x00,0x00,0x00,0x00,0xFF,0x5D,0x66,0x98,0x32,0x28,0x50,0x94,0xC5,0x02,0x07,0x00,0x00,0x01,0xA1,0x2A,0x00,0x91,0x31,0x00,0x85,0x38,0x00,0x7A,0x41,0x00,0x72,0x4A,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0E,0x10,0x12,0x14,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x24,0x26,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x01

终于可以用了!

最后的配置(kernel/drivers/input/touchscreen/gt9xx/gt9xx_cfg.h):

#ifndef _GOODIX_GT9XX_CFG_H_
#define _GOODIX_GT9XX_CFG_H_/* CFG for GT911 */
u8 gtp_dat_gt11[] = {/* <1200, 1920>*/// #include "WGJ89006B_GT911_Config_20140625_085816_0X43.cfg"/* <1024, 600> 7.0 */#include "GT911.cfg"
};
.....

gt9xx.c

...if (val == 89) {m89or101 = TRUE;gtp_change_x2y = TRUE;gtp_x_reverse = FALSE;gtp_y_reverse = TRUE;} else if (val == 101) {m89or101 = FALSE;gtp_change_x2y = TRUE;gtp_x_reverse = TRUE;gtp_y_reverse = FALSE;} else if (val == 911) {m89or101 = FALSE;bgt911 = TRUE;gtp_change_x2y = FALSE;gtp_x_reverse = TRUE;gtp_y_reverse = TRUE;} else if (val == 970) {m89or101 = FALSE;bgt911 = FALSE;bgt970 = TRUE;gtp_change_x2y = FALSE;gtp_x_reverse = FALSE;gtp_y_reverse = FALSE;} else if (val == 910) {m89or101 = FALSE;bgt911 = FALSE;bgt970 = FALSE;bgt910 = TRUE;gtp_change_x2y = TRUE;gtp_x_reverse = FALSE;gtp_y_reverse = TRUE;}ts->tp_regulator = devm_regulator_get(&client->dev, "tp");if (IS_ERR(ts->tp_regulator)) {dev_err(&client->dev, "failed to get regulator, %ld\n",PTR_ERR(ts->tp_regulator));return PTR_ERR(ts->tp_regulator);}ret = regulator_enable(ts->tp_regulator);if (ret < 0)GTP_ERROR("failed to enable tp regulator\n");msleep(20);ts->irq_pin = of_get_named_gpio_flags(np, "touch-gpio", 0, (enum of_gpio_flags *)(&ts->irq_flags));ts->rst_pin = of_get_named_gpio_flags(np, "reset-gpio", 0, &rst_flags);ts->pwr_pin = of_get_named_gpio_flags(np, "power-gpio", 0, &pwr_flags);//ts->tp_select_pin = of_get_named_gpio_flags(np, "tp-select-gpio", 0, &tp_select_flags);
/*    if (of_property_read_u32(np, "max-x", &val)) {dev_err(&client->dev, "no max-x defined\n");return -EINVAL;}//ts->abs_x_max = val;if (of_property_read_u32(np, "max-y", &val)) {dev_err(&client->dev, "no max-y defined\n");return -EINVAL;}*///ts->abs_y_max = val;if (of_property_read_u32(np, "configfile-num", &val)) {ts->cfg_file_num = 0;} else {ts->cfg_file_num = val;}ts->pendown =PEN_RELEASE;ts->client = client;
...

设备树(rv1109-38-v10-spi-nand.dts)相关的部分:

&dsi {status = "okay";rockchip,lane-rate = <480>;panel@0 {compatible = "simple-panel-dsi";reg = <0>;//backlight = <&backlight>;//power-supply = <&vcc18_lcd_n>;prepare-delay-ms = <5>;reset-delay-ms = <1>;init-delay-ms = <80>;disable-delay-ms = <10>;unprepare-delay-ms = <5>;width-mm = <165>;height-mm = <100>;dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>;dsi,format = <MIPI_DSI_FMT_RGB888>;dsi,lanes = <4>;panel-init-sequence = [05 64 01 1105 78 01 29];display-timings {native-mode = <&timing0>;timing0: timing0 {clock-frequency = <33359000>;hactive = <1024>;vactive = <600>;hfront-porch = <50>;hsync-len = <7>;hback-porch = <50>;vfront-porch = <18>;vsync-len = <5>;vback-porch = <17>;hsync-active = <0>;vsync-active = <0>;de-active = <0>;pixelclk-active = <0>;};};ports {#address-cells = <1>;#size-cells = <0>;port@0 {reg = <0>;panel_in_dsi: endpoint {remote-endpoint = <&dsi_out_panel>;};};};};ports {#address-cells = <1>;#size-cells = <0>;port@1 {reg = <1>;dsi_out_panel: endpoint {remote-endpoint = <&panel_in_dsi>;};};};
};&i2c3 {status = "okay";clock-frequency = <400000>;pinctrl-names = "default";pinctrl-0 = <&i2c3m1_xfer>; gt9xx: gt9xx@5d {compatible = "goodix,gt9xx";reg = <0x5d>;gtp_ics_slot_report;touch-gpio = <&gpio2 RK_PA6 IRQ_TYPE_EDGE_RISING>;reset-gpio = <&gpio2 RK_PD6 GPIO_ACTIVE_HIGH>;//max-x = <600>;//max-y = <1024>;tp-size = <911>;
//	      	power-supply = <&vcc18_lcd_n>;status ="okay";};
};

4.2 测试触摸的方法

在kernel增加frame buffer(/dev/fb0)设备节点

RV1126文件系统下面没有/dev/fb0设备节点:
进入kernel

cd kernel
make ARCH=arm rv1126_defconfig
make ARCH=arm menuconfig

进入配置:

修改位置一,如下:
在这里插入图片描述修改

位置二,如下:

在这里插入图片描述

之后重新编译生成固件烧写到开发板。

make ARCH=arm savedefconfig // 将.config 保存为 deconfig
cp defconfig arch/arm/configs/rv1126_defconfig
cd ..
./build.sh kernel

在buildroot中配置增加tslib

在这里插入图片描述

在上电后在/etc/profile文件中增加字段:
vi /etc/profile

export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/lib/ts
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_CONSOLEDEVICE=none

4.3 测试

  • 校准:ts_calibrate
  • 打印原始值:ts_print_mt
    • 确定左上角是0,0,右下角是1024,600
    • 观察数据,手指从左上角连续滑动到右上角,是否数据是连续增加的?但凡有不连续,掉数据、跳数据的都是有问题的。

五、工作一段时间触摸屏驱动崩溃

在上面触摸屏数据没有问题后,驱动工作一段时间就崩溃,驱动崩溃的log信息如下:

[ 7205.681477] irq 80: nobody cared (try booting with the "irqpoll" option)
[ 7205.681531] CPU: 0 PID: 367 Comm: dbus-daemon Tainted: G           O      4.19.111 #2
[ 7205.681548] Hardware name: Generic DT based system
[ 7205.681592] [<b010f408>] (unwind_backtrace) from [<b010b96c>] (show_stack+0x10/0x14)
[ 7205.681623] [<b010b96c>] (show_stack) from [<b089b5a4>] (dump_stack+0x90/0xa4)
[ 7205.681654] [<b089b5a4>] (dump_stack) from [<b016f8a8>] (__report_bad_irq+0x28/0xcc)
[ 7205.681681] [<b016f8a8>] (__report_bad_irq) from [<b016fcb0>] (note_interrupt+0x28c/0x2dc)
[ 7205.681710] [<b016fcb0>] (note_interrupt) from [<b016cd8c>] (handle_irq_event_percpu+0x5c/0x7c)
[ 7205.681741] [<b016cd8c>] (handle_irq_event_percpu) from [<b016cde4>] (handle_irq_event+0x38/0x5c)
[ 7205.681771] [<b016cde4>] (handle_irq_event) from [<b0170b30>] (handle_edge_irq+0x134/0x1e4)
[ 7205.681798] [<b0170b30>] (handle_edge_irq) from [<b016bf68>] (generic_handle_irq+0x24/0x34)
[ 7205.681829] [<b016bf68>] (generic_handle_irq) from [<b03e5250>] (rockchip_irq_demux+0x10c/0x1bc)
[ 7205.681858] [<b03e5250>] (rockchip_irq_demux) from [<b016bf68>] (generic_handle_irq+0x24/0x34)
[ 7205.681887] [<b016bf68>] (generic_handle_irq) from [<b016c53c>] (__handle_domain_irq+0x5c/0xb4)
[ 7205.681919] [<b016c53c>] (__handle_domain_irq) from [<b03d6d8c>] (gic_handle_irq+0x3c/0x78)
[ 7205.681949] [<b03d6d8c>] (gic_handle_irq) from [<b0101a78>] (__irq_svc+0x58/0x8c)
[ 7205.681967] Exception stack(0xdcc23cd8 to 0xdcc23d20)
[ 7205.681985] 3cc0:                                                       9e9654d6 00000000
[ 7205.682009] 3ce0: 3e2b9000 b0c52d00 00000202 00000013 dcc22000 00000000 dcc23d28 dcc22000
[ 7205.682033] 3d00: dd364500 dcc23e2c 05355555 dcc23d28 0000000b b010215c 400f0153 ffffffff
[ 7205.682061] [<b0101a78>] (__irq_svc) from [<b010215c>] (__do_softirq+0xa4/0x274)
[ 7205.682092] [<b010215c>] (__do_softirq) from [<b012ac98>] (irq_exit+0xdc/0x10c)
[ 7205.682123] [<b012ac98>] (irq_exit) from [<b016c540>] (__handle_domain_irq+0x60/0xb4)
[ 7205.682153] [<b016c540>] (__handle_domain_irq) from [<b03d6d8c>] (gic_handle_irq+0x3c/0x78)
[ 7205.682181] [<b03d6d8c>] (gic_handle_irq) from [<b0101a78>] (__irq_svc+0x58/0x8c)
[ 7205.682198] Exception stack(0xdcc23da8 to 0xdcc23df0)
[ 7205.682219] 3da0:                   eef0c140 00000002 00000000 0000a863 eef0c140 dd30c8c0
[ 7205.682243] 3dc0: b0d0b980 00000000 b08b15c4 dd30c8c0 dd364500 dcc23e2c 00000000 dcc23df8
[ 7205.682262] 3de0: b01479b8 b08b6244 600f0053 ffffffff
[ 7205.682292] [<b0101a78>] (__irq_svc) from [<b08b6244>] (_raw_spin_unlock_irq+0x1c/0x4c)
[ 7205.682324] [<b08b6244>] (_raw_spin_unlock_irq) from [<b01479b8>] (finish_task_switch+0x70/0x204)
[ 7205.682352] [<b01479b8>] (finish_task_switch) from [<b08b15c4>] (__schedule+0x1fc/0x580)
[ 7205.682380] [<b08b15c4>] (__schedule) from [<b08b1998>] (schedule+0x50/0xb4)
[ 7205.682410] [<b08b1998>] (schedule) from [<b08b5758>] (schedule_hrtimeout_range_clock+0x150/0x15c)
[ 7205.682440] [<b08b5758>] (schedule_hrtimeout_range_clock) from [<b08b577c>] (schedule_hrtimeout_range+0x18/0x20)
[ 7205.682472] [<b08b577c>] (schedule_hrtimeout_range) from [<b025074c>] (do_epoll_wait+0x38c/0x510)
[ 7205.682502] [<b025074c>] (do_epoll_wait) from [<b0101000>] (ret_fast_syscall+0x0/0x4c)
[ 7205.682520] Exception stack(0xdcc23fa8 to 0xdcc23ff0)
[ 7205.682542] 3fa0:                   00000000 00000074 00000003 ae965608 00000040 ffffffff
[ 7205.682565] 3fc0: 00000000 00000074 0002e4ec 000000fc 00000001 ae965a48 00000002 00000053
[ 7205.682585] 3fe0: 000000fc ae9655e8 a6e4c9c5 a6dcd706
[ 7205.682599] handlers:
[ 7205.682624] [<96dc5706>] irq_default_primary_handler threaded [<ce5e0b64>] goodix_ts_irq_handler
[ 7205.682651] Disabling IRQ #80

解决方法:
在GT911.cfg配置文件中根据下面的内容
在这里插入图片描述将第7个字节中的触发方式改成上升沿触发,就好了。改完以后要将第184位的校验码减1。或者按照上面的校验工具计算一下。

六、在LVGL中的触摸修改:上下滑动方向相反

在开发板中运行例程lv_port_linux_frame_buffer,触摸左右滑动正常,但是上下滑动是反的。直接修改:
从触摸屏事件回调evdev_read进去:

    evdev_init();static lv_indev_drv_t indev_drv_1;lv_indev_drv_init(&indev_drv_1); /*Basic initialization*/indev_drv_1.type = LV_INDEV_TYPE_POINTER;/*This function will be called periodically (by the library) to get the mouse position and state*/indev_drv_1.read_cb = evdev_read; // 这里修改lv_indev_t *mouse_indev = lv_indev_drv_register(&indev_drv_1);

修改:

void evdev_read(lv_indev_drv_t * drv, lv_indev_data_t * data)
{struct input_event in;while(read(evdev_fd, &in, sizeof(struct input_event)) > 0) {if(in.type == EV_REL) {if(in.code == REL_X)#if EVDEV_SWAP_AXESevdev_root_y += in.value;#elseevdev_root_x += in.value;#endifelse if(in.code == REL_Y)#if EVDEV_SWAP_AXESevdev_root_x += in.value;#elseevdev_root_y += in.value;#endif} else if(in.type == EV_ABS) {if(in.code == ABS_X)#if EVDEV_SWAP_AXESevdev_root_y = in.value;#elseevdev_root_x = in.value;#endifelse if(in.code == ABS_Y)#if EVDEV_SWAP_AXESevdev_root_x = in.value;#elseevdev_root_y = in.value;#endifelse if(in.code == ABS_MT_POSITION_X)#if EVDEV_SWAP_AXESevdev_root_y = in.value;#elseevdev_root_x = in.value;#endifelse if(in.code == ABS_MT_POSITION_Y)#if EVDEV_SWAP_AXESevdev_root_x = 600-in.value; // 在这里修改#elseevdev_root_y = in.value;#endifelse if(in.code == ABS_MT_TRACKING_ID) {if(in.value == -1)evdev_button = LV_INDEV_STATE_REL;else if(in.value == 0)evdev_button = LV_INDEV_STATE_PR;}} ...
}

触摸屏事件是ABS_MT_POSITION_XABS_MT_POSITION_Y这里,由于上下滑动是相反的,所以直接在ABS_MT_POSITION_Y上下方向的最大值600减去得到的值就可以了。

else if(in.code == ABS_MT_POSITION_Y)
#if EVDEV_SWAP_AXESevdev_root_x = in.value; // 在这里修改
#elseevdev_root_y = in.value;
#endif

改成:

else if(in.code == ABS_MT_POSITION_Y)
#if EVDEV_SWAP_AXESevdev_root_x = 600-in.value; // 在这里修改
#elseevdev_root_y = in.value;
#endif

滑动就都正常了。

复盘了一下,这个问题画了一个礼拜才解决!花的时间35H+。不过收获真的太多了!第一次深入研究这个驱动这么久!

相关文章:

【RV1126】调试GT911,1024x600 7寸 MIPI 电容触摸屏

文章目录一、驱动注册失败二、触摸屏可以触摸&#xff0c;但是x轴数据反了三、可以触摸了&#xff0c;但是Y轴数据跳变&#xff0c;几乎只有一半的屏幕是可以正常滑动的三、汇顶触摸屏配置文件解析四、使用新的配置文件4.1 新配置解决问题4.2 测试触摸的方法在kernel增加frame …...

C的强符号/弱符号

首先上代码和结果&#xff1a; 代码&#xff1a; #include <stdio.h> int k; int k; int main() {printf("addr of k %p\n", &k);printf("value of k %d\n", k);return 0; }结果&#xff1a; addr of k 00408074 value of k 0问题&…...

AD/DA转换(XPT2046)

AD/DA介绍AD&#xff08;Analog to Digital&#xff09;&#xff1a;模拟-数字转换&#xff0c;将模拟信号转换为计算机可操作的数字信号DA&#xff08;Digital to Analog&#xff09;&#xff1a;数字-模拟转换&#xff0c;将计算机输出的数字信号转换为模拟信号AD/DA转换打开…...

乐观锁和悲观锁 面试题

Mysql的乐观锁和悲观锁 实现方式加锁时机常见的调用方式优势不足适用场景乐观锁开发自定义更新数据的时候sql语句中进行version的判断高并发容易出现不一致的问题高并发读&#xff0c;少写悲观锁Mysql内置查询数据的开始select * for update保证一致性低并发互联网高并发场景极…...

【Autoware规控】mpc_follower模型预测控制节点

文章目录1. 技术原理2. 代码实现1. 技术原理 MPC&#xff0c;即Model Predictive Control&#xff08;模型预测控制&#xff09;&#xff0c;是一种基于动态模型的控制算法。MPC算法通过建立系统的数学模型&#xff0c;根据当前状态和一定时间内的预测&#xff0c;优化未来的控…...

成果VR虚拟3D展厅让内容更丰富饱满

随着数字技术的不断发展和普及&#xff0c;数字化展厅成为了一种重要的展示形式。线上虚拟展厅作为数字化展示的一种新形式&#xff0c;采用虚拟现实技术&#xff0c;能够克服时空限制&#xff0c;打破传统展览业的展示模式&#xff0c;为用户提供更加丰富、立体、沉浸式的展览…...

【CE进阶】lua脚本使用

▒ 目录 ▒&#x1f6eb; 导读需求开发环境1️⃣ 脚本窗口Lua ScriptLua EngineAuto assemble2️⃣ 全局变量3️⃣ 进程当前打开的进程ID系统的进程列表系统的顶部窗口列表4️⃣ 线程5️⃣ 输入设备6️⃣ 屏幕7️⃣ 剪贴板&#x1f6ec; 文章小结&#x1f4d6; 参考资料&#x…...

【vue2】近期bug收集与整理02

⭐【前言】 在使用vue2构建页面时候&#xff0c;博主遇到的问题难点以及最终的解决方案。 &#x1f973;博主&#xff1a;初映CY的前说(前端领域) &#x1f918;本文核心&#xff1a;博主遇到的问题与解决思路 ⭐数据枚举文件的使用 同后端那边发送请求的时&#xff0c;请求返…...

2. 01背包问题

文章目录QuestionIdeasCodeQuestion 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi &#xff0c;价值是 wi 。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。 输入…...

【Docker】CAdvisor+InfluxDB+Granfana容器监控

文章目录原生命令 docker stats容器监控3剑客CIGCAdvisorInfluxDBGranfanacompose容器编排&#xff0c;一套带走新建目录新建3件套组合的 docker-compose.yml检查配置&#xff0c;有问题才有输出 docker-compose config -q启动docker-compose文件 docker-compose up -d测试浏览…...

k8s 部署nginx 实现集群统一配置,自动更新nginx.conf配置文件 总结

k8s 部署nginx 实现集群统一配置&#xff0c;自动更新nginx.conf配置文件 总结 大纲 1 nginx镜像选择2 创建configmap保存nginx配置文件3 使用inotify监控配置文件变化4 Dockerfile创建5 调整镜像原地址使用阿里云6 创建deploy部署文件部署nginx7 测试使用nginx配置文件同步&…...

动态内存管理(上)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是动态内存管理噢&#xff0c;下面&#xff0c;让我们进入动态内存管理的世界吧 为什么存在动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 为什么存在动态内存分配 我们已…...

GPT-4发布,这类人才告急,大厂月薪10W+疯抢

ChatGPT最近彻底火出圈&#xff0c;各行各业都在争相报道&#xff0c;甚至连很多官媒都下场“跟风”。ChatGPT的瓜还没吃完&#xff0c;平地一声雷&#xff0c;GPT-4又重磅发布&#xff01; 很多小伙伴瑟瑟发抖&#xff1a;“AI会不会跟自己抢饭碗啊&#xff1f;” 关于“如何…...

MySQL数据库实现主主同步

前言 MySQL主主同步实际上是在主从同步的基础上将从数据库也提升成主数据库&#xff0c;让它们可以互相读写数据库&#xff0c;从数据库变成主数据库&#xff1b;主从相互授权连接&#xff0c;读取对方binlog日志并更新到本地数据库的过程,只要对方数据改变&#xff0c;自己就…...

JavaScript传参的6种方式

JavaScript传参的方式1. 传递基本类型参数2. 传递对象类型参数3. 使用解构赋值传递参数4. 使用展开运算符传递参数5. 使用可选参数6. 使用剩余参数JavaScript是一门非常灵活的语言&#xff0c;其参数传递方式也同样灵活。在本篇文章中&#xff0c;会详细介绍JavaScript中的参数…...

蓝桥之统计子矩阵

样例说明 满足条件的子矩阵一共有 19 , 包含: 大小为 11 的有 10 个。 大小为 12 的有 3 个。 大小为13 的有 2 个。 大小为 14 的有 1 个。 大小为 21 的有 3 个。 前缀和二维数组 前缀和暴力搜索 import java.util.*; public class Main{private static int ans0;pub…...

Java的基础面试题

一.java基础1.JDK和JRE有什么区别&#xff1f;JDK是java开发工具包&#xff0c;JRE是java运行时环境&#xff08;包括Java基础类库&#xff0c;java虚拟机&#xff09;2.和equals的区别是什么&#xff1f;比较的是两者的地址值&#xff0c;equals比较的是两者的内容是否一样3.两…...

J1939故障码诊断说明

1&#xff1a;1939整体协议说明 这里主要说明1939不同的协议&#xff0c;对应不同的网络分层 注意了&#xff0c;这里只进行文档解析说明&#xff0c;具体查看去搜素协议的关键字进行理解 2&#xff1a;DMx和FMI 说明 想知道每个代号的具体含义&#xff0c;可以去 saeJ1939…...

XCPC第十三站,贪心问题

一.区间选点 我们采取这样的策略来选点&#xff1a;step&#xff08;1&#xff09;将区间按照右端点的大小从小到大排序&#xff1b;step&#xff08;2&#xff09;从前往后依次枚举每个区间&#xff0c;如果当前区间中已经包含点&#xff0c;直接pass&#xff0c;否则选当前区…...

一文让你吃透 Vue3中的组件间通讯 【一篇通】

文章目录前情回顾前言1. 父组件 > 子组件通讯传递2. 子组件 > 父组件通讯传递3. 爷孙组件&#xff0c;后代组件通讯数据总结前情回顾 在本专栏前一章节中&#xff0c;我为大家带来了 Vue3 新特性变化上手指南 的归纳梳理&#xff0c;主要介绍了 Vue3 的 Proxy 响应式原理…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...