RK3568 android11 实现双路I2C触摸 --GT9xx

一,GT911 触摸屏简介

  1. 它的接口类型为 I2C ,供电电压和通讯电压均为 3.3V 。这款电容触摸屏内置了上拉电阻,这意味着我们的开发板上与该触摸屏的接口处不需要设置上拉电阻。
  2. 关于线序,同样是 GT911 ,不同批次的器件都有不同的线序。具体的要自行与厂家确认。

二,DTS配置

调试双I2C触摸,两个tp是同一型号(gt911),dts 文件配置的主要是 CPU 与触摸屏之间 I2C 通信的信息,查看硬件原理图两路tp是挂载在不同的I2C下。

TP1(i2c1):
在里插入图片描述
TP2(i2c3):
在这里插入图片描述

&i2c1 {status = "okay";gt1x: gt1x@14 {status = "okay";compatible = "goodix,gt9xx";reg = <0x14>;pinctrl-names = "default";pinctrl-0 = <&touch_gpio>;reset-gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;//复位脚touch-gpio = <&gpio0 RK_PB5 IRQ_TYPE_LEVEL_LOW>;//中断脚max-x = <1920>;max-y = <1080>;tp-size = <0>;};
};&i2c3 {status = "okay";gt1x@14 {status = "okay";compatible = "goodix,gt9xx_extend";reg = <0x14>;pinctrl-names = "default";pinctrl-0 = <&extend_touch_gpio>;extend_reset-gpio = <&gpio3 RK_PA4 GPIO_ACTIVE_HIGH>;extend_touch-gpio = <&gpio3 RK_PA3 IRQ_TYPE_LEVEL_LOW>;max-x = <1920>;max-y = <1080>;tp-size = <0>;};
};&pinctrl {touch {touch_gpio: touch-gpio {rockchip,pins =<0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_up>,<0 RK_PB6 RK_FUNC_GPIO &pcfg_pull_none>;};extend_touch_gpio:extend-touch-gpio{rockchip,pins =<3 RK_PA4 RK_FUNC_GPIO &pcfg_pull_up>,<3 RK_PA3 RK_FUNC_GPIO &pcfg_pull_none>;};};
};

三,驱动文件配置

驱动相关的文件主要的就 3 个文件(这里以TP1的驱动为例):

1,gt9xx.c

static int goodix_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) //入口函数
{...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;INIT_WORK(&ts->work, goodix_ts_work_func);ts->client = client;spin_lock_init(&ts->irq_lock);          // 2.6.39 later// ts->irq_lock = SPIN_LOCK_UNLOCKED;   // 2.6.39 & before...}

在这个函数中,可以看到读取前面dts中配置的信息,dts中的配置名,必须要与这份代码里的一致;

2,gt9xx.h

头文件里有几个宏,是关乎调试打印的,在我们适配过程中打开这些打印可以帮助我们定位一些问题。

#define DEBUG_SWITCH 0
#define GTP_DEBUG_ON          0
#define GTP_DEBUG_FUNC_ON     0
//这几个打印默认是关闭的,可以置1打开

3,cfg 文件

cfg 文件是触摸屏的初始化指令,它在上电后由 CPU 将这些指令通过 I2C 写到触摸屏的芯片中。
cfg文件是在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_ */

4,驱动移植

a.将原厂提供的的驱动(gt9xx)拷贝到下面的文件夹:

./kernel/drivers/input/touchscreen

b. 然后修改 touchscreen 目录下的 Makefile以及Kconfig。这个Makefile中定义的就是要编译哪个平台的触摸屏驱动的。

kernel/drivers/input/touchscreen/Makefile中添加:
obj-$(CONFIG_TOUCHSCREEN_GT9XX)                += gt9xx/
obj-$(CONFIG_TOUCHSCREEN_GT9XX_EXTEND)         += gt9xx_extend/------------------------------------------------------------------------
kernel/drivers/input/touchscreen/Kconfig中添加:
source "drivers/input/touchscreen/gt9xx/Kconfig"
source "drivers/input/touchscreen/gt9xx_extend/Kconfig"

c. 内核中加载驱动:

kernel/arch/arm64/configs/rockchip_defconfig中添加:
CONFIG_TOUCHSCREEN_GT9XX=y
CONFIG_TOUCHSCREEN_GT9XX_EXTEND=y

注: 实现双I2C触摸,两份驱动可以使用一样的。即 将TP1的驱动复制一份出来给TP2使用,复制之后改匹配的字段,这时编译会出现冲突,然后把两份驱动中冲突的部分重命名,之后编译通过即可(判断驱动生效可以看文件夹下是否有对应的.o文件生成)。

5,主副屏触摸配置

a. gt9xx.h头文件中定义了一个名为 GTP_I2C_NAME 的宏,其值为 “Goodix-TS”,用来识别I2C设备名,可用此来区分主副屏。

#define GTP_I2C_NAME                "Goodix-TS"---------------------------------------------------------------------
复制给副屏使用的驱动可以修改NAME用来区分主屏,如下:
#define GTP_I2C_NAME                "Goodix-TS_extend"

b. 系统添加输入设备配置文件(.idc文件 Input Device Configuration)。

主屏 Goodix-TS.idc:
device.internal = 1----------------------------------------------------------------------
副屏 Goodix-TS_extend.idc:
device.internal = 0

c. mk文件中将如上两个idc文件拷贝到 系统system/usr/idc/目录。

PRODUCT_COPY_FILES += \$(LOCAL_PATH)/Goodix-TS.idc:system/usr/idc/Goodix-TS.idc \$(LOCAL_PATH)/Goodix-TS_extend.idc:system/usr/idc/Goodix-TS_extend.idc

编译系统固件升级,双I2C触摸即能正常操控主副屏。


四,调试

1>. 看上电时的内核打印日志,和触摸屏相关的打印都是以下列关键字开头的:

<<-GTP-INFO->>
<<-GTP-DEBUG->>
<<-GTP-ERROR->>

adb shell dmesg | grep GTP 可过滤触摸屏相关的打印。
2>. 查看工作状态的方式是看中断统计信息:

cat /proc/interrupts

驱动顺利加载的话,可以看到列出来的信息里有gt9xx,gt9xx_extend的统计信息。这些信息记录的就是这些中断发生的次数,通常我们与触摸屏交互,都能产生好多次中断。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/226005.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【代码】数据驱动的多离散场景电热综合能源系统分布鲁棒优化算法matlab/yalmip+cplex/gurobi

程序名称&#xff1a;数据驱动的多离散场景电热综合能源系统分布鲁棒优化算法 实现平台&#xff1a;matlab-yalmip-cplex/gurobi 代码简介&#xff1a;数据驱动的分布鲁棒优化算法。考虑四个离散场景&#xff0c;模型采用列与约束生成(CCG)算法进行迭代求解&#xff0c;场景分…

使用docker-compose优雅部署nacos

查看代码中引入nacos版本 在应用的pom.xml中搜索nacos关键字&#xff0c;找到相关的nacos依赖 点击以来左边的图标&#xff0c;找到依赖管理器中的pom.xml&#xff0c;并全局搜索nacos&#xff0c;即可找到对应的nacos客户端版本 使用docker-compose部署nacos version: 3s…

Kafka事务机制:原理和实践

Kafka事务机制&#xff1a;原理和实践 Apache Kafka 是一个分布式流处理平台&#xff0c;广泛用于构建实时数据管道和流应用程序。它不仅以高吞吐量、可扩展性和容错能力著称&#xff0c;还提供了事务支持&#xff0c;以确保数据的完整性和一致性。在这篇博客中&#xff0c;我…

ShaderBook

一、绘制 &#xff08;一&#xff09;颜色 颜色混合 vec3 colorA vec3(0.149,0.141,0.912); vec3 colorB vec3(1.000,0.833,0.224);//pct&#xff1a;混合因子float pct abs(sin(u_time)); //mix():将两个颜色进行混合&#xff0c;实现伴随时间变化的过渡效果color mix(…

解决electron-build打包后运行app报错:cannot find module xxx

现象&#xff1a; 关于这个问题查了很多资料&#xff0c;也问了chatgpt都没有找到答案。 最后只能靠自己了。 于是冷静下来回想一下细节。突然发现了一个特别点。 eletron-builder打包时&#xff0c;强制要求eletron-builder和eletron必须都放在devDependencies 否则&#…

面试篇spark(spark core,spark sql,spark 优化)

一&#xff1a;为什么学习spark&#xff1f; 相比较map-reduce框架&#xff0c;spark的框架执行效率更加高效。 mapreduce的执行框架示意图。 spark执行框架示意图 spark的执行中间结果是存储在内存当中的&#xff0c;而hdfs的执行中间结果是存储在hdfs中的。所以在运算的时…

vue3中toRaw 与 markRaw

toRaw 返回由 reactive 或 readonly 方法转换成响应式代理的普通对象。 这是一个还原方法&#xff0c;可用于临时读取&#xff0c;访问不会被代理/跟踪&#xff0c;写入时也不会触发界面更新。 markRaw 标记一个对象&#xff0c;使其永远不会转换为代理。返回对象本身 应…

QT如何打包生成独立可执行.exe文件

一、将QT程序使用Release编译 二、新建一个文件夹&#xff0c;将Release编译生成的exe文件复制到新建文件夹中 先找到Release编译生成的exe文件夹位置&#xff0c;与项目创建的文件夹有关&#xff1a; 临时文件夹 --》 release --》 xx .exe文件 比如我的这个就是在D:\QtPro\b…

Martin Fowler:数字化时代,远程与本地协同工作孰优孰劣?(2)| IDCF

作者&#xff1a;Martin Fowler 译者&#xff1a;冬哥 原文&#xff1a;https://martinfowler.com/articles/remote-or-co-located.html &#xff08;接上篇 &#xff09; 二、大多数人在同地办公时工作效率更高 与软件开发中的许多主题一样&#xff0c;我不能拿 100 个软…

饰品价格持续下跌,steam搬砖还有搞头吗?

已经11月了&#xff0c;你手里的饰品出完了吗&#xff1f;csgo市场价格持续下跌&#xff0c;许多人听风就是雨&#xff0c;盲目跟风抛货、囤货&#xff0c;抛货是认为市场崩了&#xff0c;赶紧退场降低损失&#xff0c;不然会输得很惨&#xff0c;囤货的则认为有跌必有升&#…

python计算概率分布

目录 1、泊松分布 2、卡方分布 3、正态分布 4、t分布 5、F分布 1、泊松分布 泊松分布是一种离散概率分布&#xff0c;描述了在固定时间或空间范围内&#xff0c;某个事件发生的次数的概率分布。该分布以法国数学家西蒙德尼泊松的名字命名&#xff0c;他在19世纪早期对这种…

Mac获得文件绝对路径小妙招

Mac和Windows不同&#xff0c;不能直接通过目录查看绝对路径&#xff0c;许多用Mac的同学经常感到苦恼&#x1f62e;‍&#x1f4a8; 经过搜索&#xff0c;博主发现Mac获得文件绝对路径的方式非常简单。这里给大家分享两个方法 方法一&#xff1a;利用终端 打开终端&#xf…