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.mzph.cn/news/176021.shtml

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

相关文章

U-Net及其变体在医学图像分割中的应用研究综述

U-Net及其变体在医学图像分割中的应用研究综述 论文来自&#xff1a;中国生物医学工程学报 2022 摘 要&#xff1a; 医学图像分割可以为临床诊疗和病理学研究提供可靠的依据&#xff0c;并能辅助医生对病人的病情做出准确的判断。 基于深度学习的分割网络的出现解决了传统自动分…

数据结构与算法(三)贪心算法(Java)

目录 一、简介1.1 定义1.2 基本步骤1.3 优缺点 二、经典示例2.1 选择排序2.2 背包问题 三、经典反例&#xff1a;找零钱3.1 题目3.2 解答3.3 记忆化搜索实现3.4 动态规划实现 一、简介 1.1 定义 贪心算法&#xff08;Greedy Algorithm&#xff09;&#xff0c;又名贪婪法&…

串口波形延时问题再次故障测试分析

先放电路图吧 这个延时问题测试了很多天&#xff0c;怎么感觉总是有没有想到的问题可以测试&#xff0c;总是有原件可以替换改善问题&#xff0c;再次测试了三极管的C脚波形&#xff1a; 从上到下的3个波形分别是MCU出来的波形&#xff0c;经过三极管反向的波形&#xff0c;…

2.ORB-SLAM3中如何从二进制文件中加载多地图、关键帧、地图点等数据结构

目录 1 为什么保存&加载(视觉)地图 1.1 加载多地图的主函数 1.2 加载各个地图 Atlas::PostLoad 1.3 加载关键帧及地图点Map::PostLoad 1.4 恢复地图点信息 MapPoint::PostLoad 1.5 恢复关键帧信息KeyFrame::PostLoad 1 为什么保存&加载(视觉)地图 因为我们要去做导…

抽象类的使用—模板设计模式 Java

模板设计模式 一、引入二、改进 一、引入 需求 ① 有多个类&#xff0c;完成不同的任务 job ② 要求统计得到各自完成任务的时间 ③ 请编程实现 >最容易想到的方法&#xff0c;写类&#xff0c;统计时间 AA BB中的 job 方法中是有重复的。 >改进1&#xff1a;每个类中&…

SpringBoot整合EasyExcel实现复杂Excel表格的导入导出功能

文章目录 &#x1f389;SpringBoot整合EasyExcel实现复杂Excel表格的导入&导出功能 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏&#xff1a;架构设计&#x1f4dc;其他专栏&#xff1a;Java学习路线 Jav…

集成IDE开发环境,Java开发工具IntelliJ IDEA 2023中文

IntelliJ IDEA 2023是一款功能强大的软件&#xff0c;其为程序员提供了一款先进的集成开发环境。它以智能、高效和人性化为主要特点&#xff0c;致力于提高开发人员的生产力&#xff0c;帮助程序员更快、更好地编写代码。IntelliJ IDEA 2023支持多种语言和框架&#xff0c;包括…

继承JsonSerializer+注解实现自定义数据脱敏方案

1、数据脱敏 数据脱敏是一种保护隐私数据的技术&#xff0c;通过将敏感信息转化为非敏感信息来实现对数据的保护&#xff0c;以保护敏感隐私数据的可靠性和安全性。 数据脱敏可以分为可恢复和不可恢复两类: 可恢复类可以通过一定的方式恢复成原来的敏感数据。不可恢复类则无…

【Shell】Shell基础学习

一、shell脚本 (1)第一个shell脚本 #!/bin/bash #this is a comment echo "hello world"一个shell脚本永远以“#!”开头,这是一个脚本开始的标记,它是告诉系统执行这个文件需要用某个解释器,后面的/bin/bash就是指明解释器的具体位置。 “#”开头是注释 …

P8A003-系统加固-系统管理员账户安全

【预备知识】 Administrator 原意为管理人或行政官员或遗产管理人&#xff0c;在计算机名词中&#xff0c;它的意思是系统超级管理员或超级用户。但是在Windows系统中此用户名只在安全模式中使用。 【实验步骤】 网络拓扑&#xff1a;server2008-basic windows server 2008 …

LeetCode [简单]118. 杨辉三角

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 public class Solution {public IList<IList<int>> Generate(int numRows) {List<IList<int>> res new …

交流负载测试使用场景

交流负载测试是一种在特定环境下&#xff0c;对电力设备、汽车电子部件&#xff0c;工业自动化设备、网络设备、家电产品&#xff0c;航空航天设备以及医疗器械等产品进行测试的方法&#xff0c;该测试的目的是评估这些设备在实际运行条件下的性能和可靠性。 1电力设备测试 交…

Zabbix 6.0 详细基础介绍

目录 一、如何选择自己的运维监控平台 1.1 常用的开源运维监控工具 1.1.1 Cacti 1.1.2 Nagios 1.1.3 Ganglia 1.1.4 Centreon 1.1.5 Grafana 1.1.6 Prometheus 1.1.7 Zabbix 1.2 监控工具选型经验 1.2.1 中小企业传统监控选择 Zabbix 1.2.2 云原生监控选择 Prometh…

虚幻学习笔记2—点击场景3D物体的两种处理方式

一、前言 本文使用的虚幻引擎为5.3.2&#xff0c;两种方式分别为&#xff1a;点击根物体和精准点击目标物体。 二、实现 2.1、玩家控制器中勾选鼠标点击事件&#xff1a;这一步很重要&#xff0c;如图2.1.1所示&#xff1a;在自定义玩家控制器中勾 图2.1.1 选该项&#xff0c…

GPT实战系列-GPT训练的Pretraining,SFT,Reward Modeling,RLHF

GPT实战系列-GPT训练的Pretraining&#xff0c;SFT&#xff0c;Reward Modeling&#xff0c;RLHF 文章目录 GPT实战系列-GPT训练的Pretraining&#xff0c;SFT&#xff0c;Reward Modeling&#xff0c;RLHFPretraining 预训练阶段Supervised FineTuning &#xff08;SFT&#x…

Vue 3 面试经验分享

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

docker容器运维操作命令

docker exec &#xff1a;在运行的容器中执行命令 docker exec [OPTIONS] CONTAINER COMMAND [ARG...] OPTIONS说明&#xff1a; -d :分离模式: 在后台运行 -i :即使没有附加也保持STDIN 打开 -t :分配一个伪终端docker ps : 列出容器 docker ps [OPTIONS] OPTIONS说明&#…

【EI会议投稿】第四届物联网与智慧城市国际学术会议(IoTSC 2024)

第四届物联网与智慧城市国际学术会议 2024 4th International Conference on Internet of Things and Smart City 继IoTSC前三届的成功举办&#xff0c;第四届物联网与智慧城市国际学术会议&#xff08;IoTSC 2024&#xff09;将于2024年3月22-24日在河南洛阳举办。 智慧城市的…

Oracle ORA12514 监听程序当前无法识别连接描述符中请求的服务

最简单的有可能是你的服务还没有开启&#xff0c;需要启动服务&#xff01;&#xff01;&#xff01;&#xff01; 在连接数据库的时候&#xff0c;有时会遇到一个“ORA12514&#xff1a;监听程序当前无法识别连接描述符中请求的服务”的错误&#xff0c;这个错误其实就是数据…

二十章多线程

概念 有很多工作是可以同时完成的&#xff0c;这种思想放在Java中被称为并发&#xff0c;并发完成每一件事被称为线程。 程序员可以在程序中执行多个线程&#xff0c;每一个线程完成一个功能//与其他线程并发执行&#xff0c;这种机制被称为多线程&#xff0c;并不算所有编程…