RK3568 android11 实现GT9xx双路I2C触摸

一,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.mzph.cn/news/175746.shtml

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

相关文章

Spring Cloud+Nacos 注册中心详解及开发示例

目录 一、Nacos 的关键特性包括: 二、逻辑架构及其组件介绍 三、Nacos安装 1、版本选择 2、预备环境准备 3、下载源码或者安装包 4、启动服务器 5、关闭服务器 四、如何引入 Nacos Discovery Starter 五、启动一个 Provider 应用 1 pom.xml的配置。一个完整的 pom.xm…

JMeter---BeanShell实现接口前置和后置操作

在JMeter中&#xff0c;可以使用BeanShell脚本来实现接口的前置和后置操作。 下面是使用BeanShell脚本实现接口前置和后置操作的步骤&#xff1a; 1、在测试计划中添加一个BeanShell前置处理器或后置处理器。 右键点击需要添加前置或后置操作的接口请求&#xff0c;选择&quo…

波奇学C++:C++11的新特性

列表初始化 #include<iostream> using namespace std; struct A {int _x;int _y; }; int main() {// 三种方式等价&#xff0c;并且可以省略int x 1;int y { 2 };int z{ 3 };return 0; } {}按声明顺序初始化类成员变量 A p{ 1,2 }; cout << p._x; //1 cout &…

C语言--每日选择题--Day27

第一题 1. 对于代码段&#xff0c;问下面不可以表示a[1]地址的是&#xff08;&#xff09; int a[10]; A&#xff1a;&a[0] 1 B&#xff1a;a sizeof(int) C&#xff1a;(int*)&a 1 D&#xff1a;(int*)((char*)&a sizeof(int)) 答案及解析 A A&#xff1a;取到…

自定义一个函数返回两个值的两种方法

自定义一个函数返回两个值的两种方法 1.用void 2.用址传递

Maven生命周期

Maven生命周期 通过IDEA工具的辅助&#xff0c;能很轻易看见Maven的九种生命周期命令&#xff0c;如下&#xff1a; 双击其中任何一个&#xff0c;都会执行相应的Maven构建动作&#xff0c;为啥IDEA能实现这个功能呢&#xff1f;道理很简单&#xff0c;因为IDEA封装了Maven提供…

Xred木马是什么

xred是非常常见的蠕虫病毒之一&#xff0c;属于AutoRun家族&#xff0c;样本变种极多&#xff0c;使用Dephi编写。 病毒可通过文件分享和U盘、移动硬盘等媒介传播。 最常见的域名就是&#xff1a; xred.mooo.com 一般会访问链接&#xff0c;下载文件&#xff0c;但是网址文件…

neo4j在Linux上安装及使用

1、简介 neo4j安装主要有两个步骤&#xff1a; 环境配置&#xff1a;Java安装工具下载&#xff1a;neo4j安装 2、java 安装 2.1 检查 安装前可以检查下&#xff0c;当前环境是否有Java 查看是否安装&#xff1a;java -version 说明当前环境没有&#xff0c;那么去下载 …

87基于matlab的双卡尔曼滤波算法

基于matlab的双卡尔曼滤波算法。第一步使用了卡尔曼滤波算法&#xff0c;用电池电压来修正SOC&#xff0c;然后将修正后的SOC作为第二个卡尔曼滤波算法的输入&#xff0c;对安时积分法得到的SOC进行修正&#xff0c;最终得到双卡尔曼滤波算法SOC估计值。结合EKF算法和安时积分法…

浅谈无线测温系统在海上石油平台高压配电盘的应用-安科瑞 蒋静

摘要&#xff1a;海上石油平台的封闭式中高压配电盘在平台电力系统起着十分重要的作用&#xff0c;通过统计其配电盘的 大部分故障为前期的热效应引起&#xff0c;由于配电盘内部空间封闭狭小&#xff0c;所以无法进行人工巡查测温&#xff0c;这给油田的供电系统埋下了一定的潜…

Web3.0时代:区块链DAPP将如何颠覆传统模式

小编介绍&#xff1a;10年专注商业模式设计及软件开发&#xff0c;擅长企业生态商业模式&#xff0c;商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地&#xff1b;扶持10余个电商平台做到营收过千万&#xff0c;数百个平台达到百万会员&#xff0c;欢迎咨询。 随着…

css实现鼠标移入背景图片变灰并浮现文字的效果

首先上效果图 说明一下我的html结构 如上图是一个div包裹的img标签, div的块大小width, height 自己定义, 我说明一下核心样式代码 下面写法是scss, 请自行替换 .web-query-image {position: relative; // 相对定位, 方便浮现文案进行绝对定位border-radius: 8px;box-sizing: …

论文阅读——DDeP(cvpr2023)

分割标签耗时且贵&#xff0c;所以常常使用预训练提高分割模型标签有效性&#xff0c;反正就是&#xff0c;需要一个预训练分割模型。典型的分割模型encoder部分通过分类任务预训练&#xff0c;decoder部分参数随机初始化。作者认为这个方法次优&#xff0c;尤其标签比较少的情…

Kettle连接到GBase 8s数据库

1&#xff0c;将GBase 8s数据库驱动放到kettle的lib目录下 如下图&#xff0c;在data-integration\lib下添加连接GBase 8s数据库的驱动gbasedbtjdbc.jar(视Server版本&#xff0c;增加匹配的驱动) 2&#xff0c;在 文件 -> 新建 -> 数据库连接 或者是在 转换 -> D…

探索容灾架构演进之路,从单点到异地多活

1. 挑战与变革 在公司发展初期&#xff0c;业务发展和用户增长是首要关注的焦点。然而&#xff0c;随着业务规模不断扩大&#xff0c;用户数量逐渐攀升&#xff0c;应用稳定性的重要性也变得愈发凸显。在这个演进过程中&#xff0c;传统架构下的应用部署模式开始显露出多方面的…

【Java】IDEA 基本操作

0.IDEA 0.1 IDEA中的层级结构 0.1.1 结构分类 project&#xff08;项目、工程&#xff09;module&#xff08;模块&#xff09;package&#xff08;包&#xff09;class&#xff08;类&#xff09; 0.1.2 结构介绍 project&#xff08;项目、工程&#xff09; ​ 淘宝、京…

JS:获取当前日期是本年度的第几周

问题 根据当前的日期&#xff08;比如年月日&#xff09;&#xff0c;来得到当前日期属于本年度的第几周 解决 代码&#xff1a; // 获取当前日期是本年的第几周 //参数&#xff1a; a为年 b为月 c为日 function getYearWeek(a, b, c) {var date1 new Date(a, parseInt(b)…

【Axure高保真原型】3D金字塔图_移入显示数据标签

今天和大家分享3D金字塔图_移入显示数据标签的原型模板&#xff0c;鼠标金字塔区域时&#xff0c;对应区域会变绿&#xff0c;可以查看该区域对应的项目和数据&#xff0c;这个原型模板是用Axure原生元件制作的&#xff0c;所以无需联网&#xff0c;而且可以自由修改样式、交互…

百度智能小程序系统源码+关键词排名优化 附带完整的搭建教程

百度智能小程序系统的开发背景是基于百度强大的技术实力和对用户需求的深入理解。在移动互联网时代&#xff0c;用户对便捷、高效、智能的服务需求越来越高。而小程序作为一种轻量级的应用程序&#xff0c;恰好能够满足用户的这些需求。然而&#xff0c;开发一个小程序需要掌握…

Kafka 如何实现顺序消息

版本说明 本文所有的讨论均在如下版本进行&#xff0c;其他版本可能会有所不同。 Kafka: 3.6.0Pulsar: 2.9.0RabbitMQ 3.7.8RocketMQ 5.0Go1.21github.com/segmentio/kafka-go v0.4.45 结论先行 Kafka 只能保证单一分区内的顺序消息&#xff0c;无法保证多分区间的顺序消息…