平台:STM32MP157
触摸屏芯片:gt911
驱动:goodix.c

现在很多平台都使用gt9xx系列的触摸屏,我在imx6dl平台和imx6ull平台都调试过这个芯片。
这次刚好调试157平台遇到了一些小麻烦。
建议:调试某些驱动的时候,可以把它编译成模块加载进去,这样不需要每次都替换内核uImage,重新上电才能生效,只需要把insmod,rmmod一下就可以了。节省了很多时间,另外还可以清晰看到打印信息,不需要在内核启动信息那找相关的信息。

驱动配置

设备树配置
由于原理图触摸屏的I2C是连接到核心板的I2C2总线上的,所以在&i2c2上添加触摸屏节点,
引脚也需要看原理图对应连接了核心板的哪个引脚。芯片的设备地址为0x5d。

&i2c2 {gt911: gt911@5d {compatible = "goodix,gt911";reg = <0x5d>;interrupt-parent = <&gpioi>;irq-gpios = <&gpioi 2 GPIO_ACTIVE_HIGH>;reset-gpios = <&gpioa 15 GPIO_ACTIVE_HIGH>;status = "okay";};
};

驱动调试
驱动文件路径:driver/input/touchscreen/goodix.c

//设备树与驱动进行适配,如果设备树compatible = "xxx";不填写以下名称,驱动则无法进行加载。
static const struct of_device_id goodix_of_match[] = {{ .compatible = "goodix,gt911" },{ .compatible = "goodix,gt9110" },{ .compatible = "goodix,gt912" },{ .compatible = "goodix,gt147" },{ .compatible = "goodix,gt9271" },{ .compatible = "goodix,gt928" },{ .compatible = "goodix,gt967" },{ }
};

第一步成功后,进入到goodix_ts_probe()函数接口

//以什么方式进行中断,这次是IRQ_TYPE_EDGE_FALLING下降沿
static const unsigned long goodix_irq_flags[] = {IRQ_TYPE_EDGE_RISING,IRQ_TYPE_EDGE_FALLING,IRQ_TYPE_LEVEL_LOW,IRQ_TYPE_LEVEL_HIGH,
};
static int goodix_ts_probe(struct i2c_client *client,const struct i2c_device_id *id)
{struct goodix_ts_data *ts;unsigned long irq_flags;int error;u16 version_info;dev_dbg(&client->dev, "I2C Address: 0x%02x\n", client->addr);if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {dev_err(&client->dev, "I2C check functionality failed.\n");return -ENXIO;}ts = devm_kzalloc(&client->dev, sizeof(*ts), GFP_KERNEL);if (!ts)return -ENOMEM;ts->client = client;i2c_set_clientdata(client, ts);error = goodix_get_gpio_config(ts);if (error)return error;if (ts->gpiod_int && ts->gpiod_rst) {/* reset the controller */error = goodix_reset(ts);if (error) {dev_err(&client->dev, "Controller reset failed.\n");return error;}}//goodix_reset(ts);error = goodix_i2c_test(client);if (error) {dev_err(&client->dev, "I2C communication failure: %d\n", error);//return error;}error = goodix_read_version(client, &version_info);if (error) {dev_err(&client->dev, "Read version failed.\n");//return error;}goodix_read_config(ts);error = goodix_request_input_dev(ts);if (error)return error;irq_flags = goodix_irq_flags[1] | IRQF_ONESHOT;printk("hyb:ts->int_trigger_type=%d\n",irq_flags);error = devm_request_threaded_irq(&ts->client->dev, client->irq,NULL, goodix_ts_irq_handler,irq_flags, client->name, ts);if (error) {dev_err(&client->dev, "request IRQ failed: %d\n", error);return error;}return 0;
}

其中该函数调用了goodix_get_gpio_config(struct goodix_ts_data *ts),主要功能是从设备中获取reset和irq引脚并申请。


static int goodix_get_gpio_config(struct goodix_ts_data *ts)
{int error;struct device *dev;if (!ts->client)return -EINVAL;dev = &ts->client->dev;/* Get the interrupt GPIO pin number */ts->gpiod_int = devm_gpiod_get_optional(dev, "irq", 1);if (IS_ERR(ts->gpiod_int)) {error = PTR_ERR(ts->gpiod_int);if (error != -EPROBE_DEFER)dev_dbg(dev, "Failed to get interput GPIO: %d\n",error);return error;}/* Get the reset line GPIO pin number */ts->gpiod_rst = devm_gpiod_get_optional(dev, "reset", 1);if (IS_ERR(ts->gpiod_rst)) {error = PTR_ERR(ts->gpiod_rst);if (error != -EPROBE_DEFER)dev_dbg(dev, "Failed to get reset GPIO: %d\n", error);return error;}return 0;
}

只有上面那个函数接口成功获取并申请成功才能调用goodix_reset()函数

static int goodix_reset(struct goodix_ts_data *ts)
{int error;/* begin select I2C slave addr */error = gpiod_direction_output(ts->gpiod_rst, 0);if (error)return error;msleep(20);             /* T2: > 10ms *//* HIGH: 0x28/0x29, LOW: 0xBA/0xBB */error = gpiod_direction_output(ts->gpiod_int, 1);if (error)return error;usleep_range(100, 2000);        /* T3: > 100us */error = gpiod_direction_output(ts->gpiod_rst, 1);if (error)return error;usleep_range(6000, 10000);      /* T4: > 5ms */return 0;
}

insmod goodix.ko 加载模块时候的打印信息

[   71.238828] Goodix-TS 1-005d: IC VERSION: e5 c2 ef b7 3e e5
[   71.264826] ts->abs_x_max=11172,33706,2,11
[   71.267842] ts->abs_x_max=238,235,2,11
[   71.271672] input: Goodix Capacitive TouchScreen as /devices/platform/soc/40013000.i2c/i2c-1/1-005d/input/input1
[   71.307362] hyb:ts->int_trigger_type=3

问题:goodix_i2c_test()和goodix_read_version()读取失败
我遇到一种现象:把驱动编译到内核中后,这两个函数就读取不成功,导致驱动无法进行下去。最快的解决办法,在把if中的判断语句中的return 屏蔽掉。

问题:复位脚和中断脚的初始化的电平非常重要
需要查看芯片的中断是什么有效

问题:什么中断有效?
我有两块触摸屏,结果在进入到static void goodix_read_config(struct goodix_ts_data *ts)函数接口里面,读取的ts->int_trigger_type的中断类型不一样,导致了有些只能点击,不能滑动。
这时候就需要我们强行去改变这个芯片的参数,ts->int_trigger_type = 1

static int goodix_ts_probe(struct i2c_client *client,const struct i2c_device_id *id)
{//.........省略goodix_read_config(ts);error = goodix_request_input_dev(ts);if (error)return error;ts->int_trigger_type = 1;irq_flags = goodix_irq_flags[ts->int_trigger_type] | IRQF_ONESHOT;printk("hyb:ts->int_trigger_type=%d,%d\n",irq_flags,IRQF_ONESHOT);error = devm_request_threaded_irq(&ts->client->dev, client->irq,NULL, goodix_ts_irq_handler,irq_flags, client->name, ts);if (error) {dev_err(&client->dev, "request IRQ failed: %d\n", error);return error;}
}

触摸屏gt9xx系列芯片驱动调试相关推荐

  1. 正点原子Linux阿尔法开发板4.3 寸多点电容触摸屏测试问题和gt9xx系列linux驱动移植

    正点原子Linux阿尔法开发板4.3 寸多点电容触摸屏测试问题和gt9xx系列linux驱动移植 正点原子官方CSDN 4.3 寸多点电容触摸屏测试问题 正点原子gt9xx系列linux驱动移植 1. ...

  2. 村田 IMU SCC2000系列芯片驱动

    村田 IMU SCC2000系列芯片驱动 ​ 文章目录 村田 IMU SCC2000系列芯片驱动 一.总体特点 二.启动时序和逻辑 三.SPI通信和数据读取 四.数据处理 一.总体特点 1.本次具体的 ...

  3. 正点原子gt9xx系列linux驱动移植

    写这个博客的前景: 正点原子的RGB电容触摸屏触摸芯片系列: 4.3 寸屏  480x272分辨率 使用的触摸芯片是gt9xx系列 4.3寸屏 800x480分辨率 使用的触摸芯片是gt9xx系列 7 ...

  4. AD7797芯片驱动调试

    今天在测试拉力传感器,调校后,发现拉力值还是零.查看AD采样值,结果如图: 先不去分析为啥是零,只看AD采样数据就不对,怎么会偏差这么大,而且有极大值和极小值. 驱动是同事写的,目前已经不负责这个项目 ...

  5. RK3399驱动开发 | 03 - WK2124串口芯片驱动调试

    最近在调试过程中发现WK2124这个串口扩展芯片比较有意思,写篇文章来记录一下调试心得. 一.WK2124 1. 概述 WK2124是SPI接口的4通道UART器件,实现了SPI扩展4个串口的功能. ...

  6. RK3288的GTxx触摸屏驱动调试

    电容屏是在LCD屏上覆盖一个透明的矩阵键盘,在调试goodix gt9xx系列触控屏的驱动时,会遇到各种问题! 1.linux启动时,触控屏驱动偶尔不能加载固件信息. 2.在使用过程中偶尔不能触发或触 ...

  7. RK3399 GT1X触摸屏驱动调试笔记

    硬件环境 1.Firefly AIO-3399(AI)开发版: 2.恒智的5寸电容触摸屏800X480,I2C驱动支持GT5688. 操作系统 Android 7.2 for rockship Ste ...

  8. 全志A64触摸屏驱动调试

    一.前言 linux的触摸屏驱动一般要经历一下几个步骤(以4412为例):1.移植驱动到linux源码"driver/input/touchscreen/"目录下,在Kconfig ...

  9. RK3399驱动开发 | 07 - GT911触摸屏驱动调试及问题分析解决(基于RK SDK Linux 4.4.194内核)

    更新内容 更新时间 完成初稿 2022-09-21 文章目录 一.GT911 1. 触摸芯片 2. 原理图 二.驱动调试 1. 测试gt911是否正常通信 2. 添加驱动 3. 添加设备树描述 4. ...

最新文章

  1. ansible代码发布系统
  2. easyui treegrid获取父节点的id_超简单的分布式ID生成方案!美团开源框架介绍
  3. devserver配置_vue.config.js的配置
  4. 网络4/7层模型各层作用和协议对比
  5. 【算法学习】网络流模板……
  6. Linux Shell脚本入门教程系列之(十五) Shell函数简介
  7. django关于Mysql增删改查操作以及浏览器数据返回
  8. python2.7.5 怎么装redis_python中Redis的简要介绍以及Redis的安装,配置
  9. 孪生神经网络_驾驶习惯也能识人?基于时空孪生神经网络的轨迹识别
  10. linux桌面cpu,ubuntu14.04设置桌面显示网速、cpu信息等
  11. 斐讯K3官改,安装onmp教程,回馈社区。
  12. 大华监控相机RTSP视频流
  13. sql往数据库里面添加数据
  14. 联网监管与手册报关的区别
  15. pod 文件管理服务器,k8s中pod的状态管理
  16. nios自学笔记四:将sof和elf合并为JIC文件
  17. Aviary 滤镜 教程 照片编辑器
  18. 让照片开口讲话,让视频人物对口型
  19. Revit:一般建筑的主要结构汇总和构建参数化族方法
  20. 十六进制数后跟L/U/UL解析

热门文章

  1. 每日学术速递4.12
  2. 普通程序员如何入门深度学习?
  3. Python 量化投资实战教程(4) —KDJ 策略
  4. Acwing每日一题 4366. 上课睡觉
  5. jet mysql连接字符串_数据库连接字符串大全
  6. 数据库系统原理与实践题库及答案(完整版)
  7. 基于DreamService的屏保
  8. python提前查成绩_Python爬虫案例——正方教务学生成绩获取(自动识别验证码)...
  9. java获取实体类对象_java 获取实体类对象属性值的方法
  10. 开发人员应了解的健康生活节奏!