【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_X
和ABS_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 电容触摸屏
文章目录一、驱动注册失败二、触摸屏可以触摸,但是x轴数据反了三、可以触摸了,但是Y轴数据跳变,几乎只有一半的屏幕是可以正常滑动的三、汇顶触摸屏配置文件解析四、使用新的配置文件4.1 新配置解决问题4.2 测试触摸的方法在kernel增加frame …...
C的强符号/弱符号
首先上代码和结果: 代码: #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; }结果: addr of k 00408074 value of k 0问题&…...
AD/DA转换(XPT2046)
AD/DA介绍AD(Analog to Digital):模拟-数字转换,将模拟信号转换为计算机可操作的数字信号DA(Digital to Analog):数字-模拟转换,将计算机输出的数字信号转换为模拟信号AD/DA转换打开…...
乐观锁和悲观锁 面试题
Mysql的乐观锁和悲观锁 实现方式加锁时机常见的调用方式优势不足适用场景乐观锁开发自定义更新数据的时候sql语句中进行version的判断高并发容易出现不一致的问题高并发读,少写悲观锁Mysql内置查询数据的开始select * for update保证一致性低并发互联网高并发场景极…...
【Autoware规控】mpc_follower模型预测控制节点
文章目录1. 技术原理2. 代码实现1. 技术原理 MPC,即Model Predictive Control(模型预测控制),是一种基于动态模型的控制算法。MPC算法通过建立系统的数学模型,根据当前状态和一定时间内的预测,优化未来的控…...
成果VR虚拟3D展厅让内容更丰富饱满
随着数字技术的不断发展和普及,数字化展厅成为了一种重要的展示形式。线上虚拟展厅作为数字化展示的一种新形式,采用虚拟现实技术,能够克服时空限制,打破传统展览业的展示模式,为用户提供更加丰富、立体、沉浸式的展览…...
【CE进阶】lua脚本使用
▒ 目录 ▒🛫 导读需求开发环境1️⃣ 脚本窗口Lua ScriptLua EngineAuto assemble2️⃣ 全局变量3️⃣ 进程当前打开的进程ID系统的进程列表系统的顶部窗口列表4️⃣ 线程5️⃣ 输入设备6️⃣ 屏幕7️⃣ 剪贴板🛬 文章小结📖 参考资料&#x…...
【vue2】近期bug收集与整理02
⭐【前言】 在使用vue2构建页面时候,博主遇到的问题难点以及最终的解决方案。 🥳博主:初映CY的前说(前端领域) 🤘本文核心:博主遇到的问题与解决思路 ⭐数据枚举文件的使用 同后端那边发送请求的时,请求返…...
2. 01背包问题
文章目录QuestionIdeasCodeQuestion 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi ,价值是 wi 。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入…...
【Docker】CAdvisor+InfluxDB+Granfana容器监控
文章目录原生命令 docker stats容器监控3剑客CIGCAdvisorInfluxDBGranfanacompose容器编排,一套带走新建目录新建3件套组合的 docker-compose.yml检查配置,有问题才有输出 docker-compose config -q启动docker-compose文件 docker-compose up -d测试浏览…...
k8s 部署nginx 实现集群统一配置,自动更新nginx.conf配置文件 总结
k8s 部署nginx 实现集群统一配置,自动更新nginx.conf配置文件 总结 大纲 1 nginx镜像选择2 创建configmap保存nginx配置文件3 使用inotify监控配置文件变化4 Dockerfile创建5 调整镜像原地址使用阿里云6 创建deploy部署文件部署nginx7 测试使用nginx配置文件同步&…...
动态内存管理(上)——“C”
各位CSDN的uu们你们好呀,今天,小雅兰的内容是动态内存管理噢,下面,让我们进入动态内存管理的世界吧 为什么存在动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 为什么存在动态内存分配 我们已…...
GPT-4发布,这类人才告急,大厂月薪10W+疯抢
ChatGPT最近彻底火出圈,各行各业都在争相报道,甚至连很多官媒都下场“跟风”。ChatGPT的瓜还没吃完,平地一声雷,GPT-4又重磅发布! 很多小伙伴瑟瑟发抖:“AI会不会跟自己抢饭碗啊?” 关于“如何…...
MySQL数据库实现主主同步
前言 MySQL主主同步实际上是在主从同步的基础上将从数据库也提升成主数据库,让它们可以互相读写数据库,从数据库变成主数据库;主从相互授权连接,读取对方binlog日志并更新到本地数据库的过程,只要对方数据改变,自己就…...
JavaScript传参的6种方式
JavaScript传参的方式1. 传递基本类型参数2. 传递对象类型参数3. 使用解构赋值传递参数4. 使用展开运算符传递参数5. 使用可选参数6. 使用剩余参数JavaScript是一门非常灵活的语言,其参数传递方式也同样灵活。在本篇文章中,会详细介绍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有什么区别?JDK是java开发工具包,JRE是java运行时环境(包括Java基础类库,java虚拟机)2.和equals的区别是什么?比较的是两者的地址值,equals比较的是两者的内容是否一样3.两…...
J1939故障码诊断说明
1:1939整体协议说明 这里主要说明1939不同的协议,对应不同的网络分层 注意了,这里只进行文档解析说明,具体查看去搜素协议的关键字进行理解 2:DMx和FMI 说明 想知道每个代号的具体含义,可以去 saeJ1939…...
XCPC第十三站,贪心问题
一.区间选点 我们采取这样的策略来选点:step(1)将区间按照右端点的大小从小到大排序;step(2)从前往后依次枚举每个区间,如果当前区间中已经包含点,直接pass,否则选当前区…...
一文让你吃透 Vue3中的组件间通讯 【一篇通】
文章目录前情回顾前言1. 父组件 > 子组件通讯传递2. 子组件 > 父组件通讯传递3. 爷孙组件,后代组件通讯数据总结前情回顾 在本专栏前一章节中,我为大家带来了 Vue3 新特性变化上手指南 的归纳梳理,主要介绍了 Vue3 的 Proxy 响应式原理…...
EVE遭遇大规模DDOS攻击,玩家和官方都傻眼了
如果你恰好是一名《星战前夜》(EVE)的国际服玩家(虽然这个几率很小),又恰好因为疫情一直待在家里,那你就真是倒霉透顶了。因为从1月底开始,EVE的服务器就一直受到大规模的DDOS攻击,而…...
【数据结构】二叉树及相关习题详解
新年新气象! 祝大家兔年 财源滚滚! 万事胜意! 文章目录前言1. 树的一些基础概念1.1 树的一些基本概念1.2 树的一些重要概念2. 二叉树的一些基本概念2.1 二叉树的结构2.2 两种特殊的二叉树3. 二叉树的性质4. 二叉树的存储5. 二叉树的基本操作5.1 构造一棵二叉树5.2 二叉树的遍历…...
锂电池充电的同时也能放电吗?
大家应该都有这样经历,我们的手机在充电的同时也能边使用,有的同学就会说了,这是因为手机电池在充电的同时也在放电。如果这样想我们可能就把锂电池类比了一个蓄水池,以为它在进水的同时也能出水,其实这个比喻是错误的…...
通信工程考研英语复试专有名词翻译
中文英文频分多址Frequency Division Multiple Access码分多址Code Division Multiple Access时分多址Time Division Multiple Access移动通信mobile communication人工智能artificial intelligence水声通信Middle-Range Uwa Communication正交频分复用Orthogonal frequency di…...
注意力机制(四):多头注意力
专栏:神经网络复现目录 注意力机制 注意力机制(Attention Mechanism)是一种人工智能技术,它可以让神经网络在处理序列数据时,专注于关键信息的部分,同时忽略不重要的部分。在自然语言处理、计算机视觉、语…...
【2023Unity游戏开发教程】零基础带你从小白到超神19——射线检测
文章目录 射线检测从某点发射一条射线从摄像机发射一条射线射线检测 游戏中的红外线,默认肉眼是看不到的,从某个初始点开始,沿着特定的方向发射一条不可见且无限长的射线,通过此射线检测是否有任何模型添加了Collider碰撞器组件。一旦检测到碰撞,停止射线继续发射。 碰撞检…...
内存泄漏和内存溢出的区别
参考答案 内存溢出(out of memory):指程序在申请内存时,没有足够的内存空间供其使用,出现 out of memory。内存泄露(memory leak):指程序在申请内存后,无法释放已申请的内存空间,内存泄露堆积会导致内存被…...
文本三剑客之sed编辑器
文本三剑客:都是按行读取后处理。 grep 过滤行内容。awk 过滤字段。sed 过滤行内容;修改行内容。sed编辑器 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可以根据命令来处理数据流中…...
深度学习:GPT1、GPT2、GPT-3
深度学习:GPT1、GPT2、GPT3的原理与模型代码解读GPT-1IntroductionFramework自监督学习微调ExperimentGPT-2IntroductionApproachConclusionGPT-3GPT-1 Introduction GPT-1(Generative Pre-training Transformer-1)是由OpenAI于2018年发布的…...
使用Docker 一键部署SpringBoot和SpringCloud项目
使用Docker 一键部署SpringBoot和SpringCloud项目 1. 准备工作2. 创建Dockerfile3. 创建Docker Compose文件4. 构建和运行Docker镜像5. 验证部署6. 总结Docker是一个非常流行的容器化技术,可以方便地将应用程序和服务打包成容器并运行在不同的环境中。在本篇博客中,我将向您展…...
网站建设策划书风险控制/最好的网站优化公司
1.创建虚拟环境conda create -n pytorch python3.7注:-n是name的意思,后面指定虚拟环境的版本为3.72.进入环境conda activate pytorch注:conda可以省略3.安装pytorch打开官网:https://pytorch.org/选择相应的版本,如果你的电脑没有英伟达显卡,cuda选择none注意4.配置conda源找到…...
广州建设网站是什么/爱站网长尾关键词挖掘
有的人能力不如你,人生阅历不如你,技巧不如你,亲和力不如你,形象不如你,但成绩比你好、收入比你高!是什么限制了你的能力和成就?1、否定性思想比如:不可能、没办法、怎么会ÿ…...
要找做冲压件的厂去哪个网站找/广告词
正式进入主题,perl之所以受欢迎,主要有赖于两大利器: 强大的正则表达式支持 & 强大的复杂数据结构。 复杂数据结构有赖于引用这个重要的实现方式,接下来的几篇笔记将重点讨论列表(也叫数组)引用、哈希引用和函数(也叫子程序)引…...
做交流网站/优化大师官网下载
jsp有四种范围,可以说是四种对象,这四种对象对应不同的作用范围,所以我们说jsp中的四种范围,这四种范围作用域由大到小分别是page>request>session>application 利用这四个对象最常用的就是传值,在一个地方设…...
香港服务器网站/互联网推广工作好做吗
1、登录支付宝1、打开支付宝官网,以“我是支付宝商家”用户登录https://www.alipay.com/2、进入“产品中心”,选择并申请支付类型2、签约“电脑网站支付”产品选择支付产品类型填写签约信息后,提交申请申请成功后,我们在签约产品列…...
重庆万州网站建设多少钱/黄页网推广服务
2.配置VTY(Virtual Teletype Terminal)虚拟终端接口的认证方式[H3C]user-interface vty 0 4[H3C-line-vty0-4]authentication-mode scheme//进行本地或远端用户名和口令认证。即AAA认证//关于认证,一共有三种认证方式//password 本地口令认证;//scheme 本地或远端用…...