海思35xx实现GT911触摸屏功能

article/2025/8/23 2:04:36

海思35xx通过gpio模拟i2c实现GT911触摸功能

1.遇到的问题

  1. 地址选配后一直不对,首先检测硬件问题,然后通过调试驱动部分,打印调试从设备给的ack(没有逻辑分析仪);发现寄存器地址一直为FF或00,检查发现GT911地址均为16bit,而读写i2c接口是8位的;
  2. 成功后点击触摸板点击位置与实际不一致;可以进行坐标转换;

2.网上下载

GT91xx编程指南文件
电容触摸芯片GT911 Datasheet 文件

3.Datasheet 重点部分

(1) gpio模拟时,可能需要注意这个延时时间;

(2) 选择地址为0x28/0x29或0xBA/0xBB时序

4.部分代码

(1) 部分寄存器定义

#define GT_CMD_WR  0x28  //写地址
//#define GT_CMD_RD 0x29 //读命令 我的驱动内部逻辑已处理,仅需要写地址就可以了//GT91xx 部分寄存器定义
#define GT_CTRL_REG 	0X8040   	//GT911控制寄存器
#define GT_CFGS_REG 	0X8047   	//GT911配置起始地址寄存器
#define GT_CHECK_REG 	0X80FF   	//GT911校验和寄存器
#define GT_FRESH_REG 	0X8100      //配置已更新标志
#define GT_PID_REG 		0X8140   	//GT911产品ID寄存器
#define GT_FIRMVERSION_REG   0x8144     //固件版本#define GT_GSTID_REG 	0X814E   	//GT911当前检测到的触摸情况
#define GT_TP1_REG 		0X8150  	//第一个触摸点数据地址
#define GT_TP2_REG 		0X8158		//第二个触摸点数据地址
#define GT_TP3_REG 		0X8160		//第三个触摸点数据地址
#define GT_TP4_REG 		0X8168		//第四个触摸点数据地址
#define GT_TP5_REG 		0X8170		//第五个触摸点数据地址const u32 GT911_TPX_TBL[5]={GT_TP1_REG,GT_TP2_REG,GT_TP3_REG,GT_TP4_REG,GT_TP5_REG};

(2) 配置GT911从设备地址0x28/0x29或0xBB/0xBA

void TouchScreen::GT911_INT(u8 cmd)
{if(cmd){CGpio::Instance()->SetGpio(13,5,1,1);}else{CGpio::Instance()->SetGpio(13,5,1,0);}
}void TouchScreen::GT911_RST(u8 cmd)
{if(cmd){CGpio::Instance()->SetGpio(6,3,1,1);}else{CGpio::Instance()->SetGpio(6,3,1,0);}
}//我选的是0x28/0x29
void TouchScreen::goodix_init()
{  GT911_RST(0);GT911_INT(0);msleep(50);GT911_INT(1);usleep(200);GT911_RST(1);msleep(10);GT911_INT(0);msleep(80);Hi_Gpio_SetDir(13,5,0);//GPIO13_5设为输入msleep(60);return;
}

(3) i2c写接口及驱动接口参考

	// gpio_i2c2_read 、 gpio_i2c2_write驱动部分参考如下:EXPORT_SYMBOL(gpio_i2c2_read);unsigned int gpio_i2c2_read(unsigned char devaddress, unsigned short address, int num_bytes){unsigned char rxdata;unsigned int  ret = 0x00;int i;i2c_start_bit(); //gpio模拟i2c 略i2c_send_byte((unsigned char)(devaddress));i2c_receive_ack();i2c_send_byte((unsigned char)((address >> 8) & 0xff));i2c_receive_ack();i2c_send_byte((unsigned char)(address & 0xff));i2c_receive_ack(); i2c_start_bit();i2c_send_byte((unsigned char)(devaddress) | 1); //只需要写地址的原因在这里,完全可以其他处理;i2c_receive_ack();for (i=0; i<num_bytes-1; i++) {rxdata = i2c_receive_byte();//i2c_send_ack();ret |= rxdata;ret <<= 8;}rxdata = i2c_receive_byte();//  i2c_send_ack();i2c_stop_bit();ret |= rxdata;//	printk("dev=%x, reg =%x, rxd=%x\n", devaddress, address, ret);return ret;}EXPORT_SYMBOL(gpio_i2c2_write);void gpio_i2c2_write(unsigned char devaddress, unsigned short address, unsigned int data, int num_bytes){int i;i2c_start_bit();i2c_send_byte((unsigned char)(devaddress));i2c_receive_ack();i2c_send_byte((unsigned char)((address >> 8) & 0xff));i2c_receive_ack();i2c_send_byte((unsigned char)(address & 0xff));i2c_receive_ack();for (i=0; i<num_bytes; i++) {i2c_send_byte((unsigned char)((data >> (i*8)) & 0xff)); i2c_receive_ack();}//	i2c_send_byte((unsigned char)((data >> (i*8)) & 0xff)); i2c_stop_bit();}// ioctl 操作对应的驱动接口如下:long gpioi2c_ioctl(struct file *file, unsigned int cmd, unsigned long arg){...case GPIO_I2C_READ_SHORT: val = *(unsigned int *)arg;device_addr = (val&0xff000000)>>24;reg_addr = (val&0xffff00)>>8;reg_val = gpio_i2c2_read(device_addr, reg_addr, 2);*(unsigned int *)arg = reg_val;		break;	case GPIO_I2C_WRITE_SHORT:val = *(unsigned int *)arg;device_addr = (val&0xff000000)>>24;reg_addr = (val&0xffff00)>>8;reg_val = val&0xffff;gpio_i2c2_write(device_addr, reg_addr, reg_val, 2);break;		}//读写16位寄存器的接口;int xxx::writeI2c16(int devaddr, int reg, int data){int fd = -1;int ret =0;int value;fd = open("/dev/gpioi2c", 0);if(fd<0){printf("Open gpioi2c error!\n");return -1;}value = ((devaddr&0xff)<<24) | ((reg&0xffff)<<8) | (data&0xffff);ret = ioctl(fd, GPIO_I2C_WRITE_SHORT, &value);close(fd);return ret;}

(4) 触摸屏初始化

void TouchScreen::I2C_init()
{//system("himm 0x120F08E0  0x230"); //SDA 上拉,高速//system("himm 0x120F08E4  0x230"); //SCLSetGpio(12,7,1,1);SetGpio(12,6,1,1);
}//下面的goodix_send_cfg如下:我没用到,不知道正确与否
int TouchScreen::goodix_send_cfg()
{u8 sum[2] = {0};static unsigned char imps2_param [] ={0x69,0x00,0x04,0x58,0x02,0x05,0x0D,0x00,0x01,0x0A,0x1E,0x0F,0x64,0x46,0x03,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8C,0x2E,0x0E,0x3C,0x3E,0x61,0x07,0x00,0x00,0x00,0x02,0x02,0x1D,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x28,0x62,0x94,0xC5,0x02,0x07,0x00,0x00,0x04,0xA1,0x2B,0x00,0x8C,0x34,0x00,0x7D,0x3E,0x00,0x6F,0x4B,0x00,0x66,0x59,0x00,0x66,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,0x1C,0x1A,0x18,0x16,0x14,0x12,0x10,0x0E,0x0C,0x0A,0x08,0x06,0x04,0x02,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,0x38,0x01};//厂家初始化序列for(int i = 0; i < sizeof(imps2_param); i++){writeI2c16(GT_CMD_WR,GT_CFGS_REG+i,imps2_param[i]);//写入配置 0x8047~0x8100 共186个sum[0] += imps2_param[i];readI2c16(GT_CMD_WR,GT_CFGS_REG+i);}sum[0] = (~sum[0])+1;//校验和为补码,看手册sum[1]=1;writeI2c16(GT_CMD_WR,GT_CHECK_REG,sum[0]);//写入校验和writeI2c16(GT_CMD_WR,GT_FRESH_REG,sum[1]);//配置更新标记msleep(10);return 0;
}void TouchScreen::TouchScreenInit()
{SetGpio(6,3,1,0); //rst init 具体看硬件io口SetGpio(13,5,1,0); //INT init//system("himm 0x120F09B4  0x330");I2C_init(); //好像没用处goodix_init(); // IIC地址选择writeI2c16(GT_CMD_WR,GT_CTRL_REG,0x02);//软复位GT911writeI2c16(GT_CMD_WR,GT_GSTID_REG,0);u32 id = readI2c16(GT_CMD_WR,GT_CFGS_REG);if((id & 0xff) < 0x69) //0x69为配置中的首位{//更新GT911寄存器配置goodix_send_cfg();//厂家提供,没有不要乱配,可能导致不能用;}writeI2c16(GT_CMD_WR,GT_CTRL_REG,0x00);//结束软复位writeI2c16(GT_CMD_WR,GT_GSTID_REG,0);//多写几次无所谓
}

(4) 主循环

void TouchScreen::PthreadProc()
{   unsigned int t = 0 ;int touchStatus = 0;u8 buf[5];time_t tim, last_monitor_tim = 0;memset(&keyInfo,0,sizeof(keyInfo));while(1) //轮询方式{if(0 == (t++)%50){        if(touchStatus & 0x80) //&& (((touchStatus & 0xF) > 0) && ((touchStatus & 0xF) < 6)))//数据准备好可读{if(touchStatus & 0x0F)//触摸点数大于1{for(int i = 0; i < 1; i++){ for(int j = 0; j < 5; j++){buf[j] = readI2c16(GT_CMD_WR,GT911_TPX_TBL[i]+j);}}if((touchStatus & 0xff) == 0x81) //单击{msleep(140);//延时去抖//do something}else if((touchStatus & 0xff) == 0x82) //双击{msleep(100);//延时去抖//do something}//逻辑与物理坐标转换touchPos.s32XPos = (buf[0] + (buf[1] << 8)) * m_TmpWidth / m_phyWidth;touchPos.s32YPos = (buf[2] + (buf[3] << 8)) * m_TmpHeight / m_phyHeight;//处理坐标 ...        }writeI2c16(GT_CMD_WR,GT_GSTID_REG,0x00);//将此标志清零}else{msleep(150);        }}}
}

5.说明

(1) 本文为记录所用,代码仅供参考,错误地方欢迎指正;
(2) 主循环可以用轮询或中断方式
(3) 代码中gpio具体看硬件手册

6. 参考

https://blog.csdn.net/qlexcel/article/details/99696108
https://www.cnblogs.com/DarkBright/p/10730346.html


http://chatgpt.dhexx.cn/article/uwZNkRbo.shtml

相关文章

[RK3568 Android12] GT911触摸屏调试

屏幕规格书 需要主要硬件通信电压为:1.8V或者3.3V I2C通信的地址:0x5D 和0x40 系统上电时序:不同的地址,稍微有些差异 对应代码中如下:

全志F1C100s主线linux入坑记录 (4)GT911触摸移植

GT911触摸移植 百度网站 文章目录 GT911触摸移植一、添加gt911库文件二、添加设备树文件修改文件路径 &#xff1a;arch/arm/boot/dts/suniv-f1c100s.dtsi修改文件路径 &#xff1a;arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dts编译烧录 三、添加ts-lib触摸测试软件参考…

A40i使用笔记:调用系统自带驱动GT911触摸屏

一、前言 在一般情况下使用电容触摸屏时&#xff0c;都是使用USB直接驱动&#xff0c;但是在前文中我就提及过遇到的问题&#xff0c;就是USB触摸屏和我是用平台不是特别兼容的问题&#xff0c;问题现象在复述一遍&#xff0c;大概就是使用linux核心板USB接口连接ILTTEK的触摸芯…

GT911电容触摸屏使用

注&#xff1a;转载于https://blog.csdn.net/qlexcel/article/details/99696108 一、介绍与硬件连接 GT911、GT928、GT9147都属于GT9系列非单层多点触控芯片&#xff0c;他们支持的触控点数不同&#xff08;GT928支持10个点、GT911支持5个点&#xff09;、驱动和感应通道也可能…

openharmony hdf框架gt911触摸驱动移植

openharmony提供了hdf的驱动框架&#xff0c;今天以gt911触摸驱动的例子记录一下。首先hdf要加载进Linux的driver中&#xff0c;在Linux源码/driver/hdf目录有如下文件。 framwork和khdf两个软链接文件一定要链接成功。 在hdf的设备树中加入gt911的文件信息 /home/xu/openhar…

Linux运行911,韦东山-Linux下编写GT911触摸驱动 - 百问网嵌入式问答社区

源码在最下面 问题一:资源获取Gt911数据手册 在韦老师给的资料里,路径为\06_Datasheet\Extend_modules\7寸LCD模块\电容触控芯片GT911 Datasheet_121120(海威思.pdf 问题二:需要准备哪些知识 1.能够修改设备树 2.能够编写字符设备驱动 3.能够在linux下编写中断程序 4.能够在…

Linux下编写GT911触摸驱动

问题一&#xff1a;资源获取Gt911数据手册 在韦老师给的资料里&#xff0c;路径为\06_Datasheet\Extend_modules\7寸LCD模块\电容触控芯片GT911 Datasheet_121120&#xff08;海威思.pdf 问题二&#xff1a;需要准备哪些知识 1.能够修改设备树 2.能够编写字符设备驱动 3.能…

移植openharmony之调试gt911触摸

最近在调试触摸驱动&#xff0c;分析了一点openharmony的hdf框架下的触摸&#xff0c;将过程记录下&#xff0c;首先肯定是加载input设备管理驱动&#xff1a;input设备管理驱动由HDF驱动加载&#xff0c;完成设备manager的创建并对其初始化。如下图所示&#xff0c;我这里就是…

使用STM32+硬件IIC+DMA驱动GT系列触摸屏(GT911)

使用STM32硬件IICDMA驱动GT系列触摸屏&#xff08;GT911&#xff09; 初始化代码 /** brief GT911 初始化程序* param None* retval None*/ void GT911_init() {Dev_Now.GT911_RST0;GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.Pin GT911_RST_PIN | GT911_INT_PIN;…

v3S驱动gt911触摸

文章目录 一、修改设备树二、编写驱动三、运行测试四、编译进内核1. 拷贝文件2. 修改对应的 Makefile3. 编译运行4.测试1.注释掉坐标信息 五、移植tslib1. buildroot配置tslib2. 配置tslib3. 测试 一、修改设备树 在sun8i-v3s-licheepi-zero-dock.dts中添加pio节点&#xff08…

gt911多点触摸实验

文章目录 一、设备树二、驱动程序三、测试四、编译进内核1. 拷贝文件2. 修改对应的 Makefile3. 编译运行4.测试 一、设备树 记得注释掉共用的引脚&#xff08;有好几处&#xff09; 在pinctrl_tsc节点下添加&#xff1a; pinctrl_tsc: tscgrp {fsl,pins <MX6UL_PAD_GPIO1_…

野火STM32F103驱动GT911触摸芯片

GT911触摸芯片 芯片介绍 GT911 是专为 7”~8”设计的新一代 5 点电容触控方案&#xff0c;拥有 26 个驱动通道和 14 个感 应通道&#xff0c;以满足更高的 touch 精度要求。 GT911 可同时识别 5 个触摸点位的实时准确位置&#xff0c;移动轨迹及触摸面积。并可根据主控需要&…

电容触摸屏控制芯片GT911

1.接口说明 GT9 非单层多点系列&#xff08;以下简称 GT9 系列&#xff09; 与主机接口共有 6 PIN&#xff0c;分别为&#xff1a; VDD、 GND、 SCL、SDA、 INT、 RESET。 主控的 INT 口线需具有上升沿或下降沿中断触发功能&#xff0c;并且当其在输入态时&#xff0c; 主控端必…

电容触摸屏GT911、GT928、GT9147的使用

一、介绍与硬件连接 GT911、GT928、GT9147都属于GT9系列非单层多点触控芯片&#xff0c;他们支持的触控点数不同&#xff08;GT928支持10个点、GT911支持5个点&#xff09;、驱动和感应通道也可能不同。可是他们的寄存器和IIC通讯时序是相同的&#xff0c;也就是说驱动程序是兼…

29-2-电容触摸屏控制芯片GT911

1.接口说明 GT9 非单层多点系列&#xff08;以下简称 GT9 系列&#xff09; 与主机接口共有 6 PIN&#xff0c;分别为&#xff1a; VDD、 GND、 SCL、SDA、 INT、 RESET。 主控的 INT 口线需具有上升沿或下降沿中断触发功能&#xff0c;并且当其在输入态时&#xff0c; 主控端…

hal编程 gt911 触摸芯片驱动 ( 枚举 结构体 熟用)( 安富莱 f429 4.3寸电容屏 )

使用板子类型以及屏幕类型 本文使用的是安富莱的板子stm32f429, 屏幕是TR433C1的4.3寸TFT显示屏, 480*272 RGB接口, 电容触摸 . I2C I2C简介、原理、时序请看这篇文章 使用cubemx工具的stm32用AT24C02实现简单密码(一点点面向对象的思想编程) gt911 gt911简介 gt911是深圳市…

python 倒计时手机app打卡_python 实现倒计时功能(gui界面)

运行效果&#xff1a; 完整源码&#xff1a; ##import library from tkinter import * import time from playsound import playsound ## display window root tk() root.geometry(400x300) root.resizable(0,0) root.config(bg blanched almond) root.title(techvidvan - cou…

桌面美化 Python tkinter倒计时工具

桌面美化 Python tkinter倒计时工具 效果一、壁纸设计二、倒计时小工具实现1.引入库2.倒计时函数3.绘制UI载入数据以及创建窗口创建Label控件控件布局绘制分割线绘制子窗口&#xff0c;用于修改倒计时目标其它设置 完整代码打包并开机自启动打包成EXE开机自启动 效果 使用tkin…

Python 内置模块tkinter —— 秒表计时器

# 秒表计时器""" 思考&#xff1a;1、怎么创建一个最简单的窗口&#xff1f;2、怎么保持窗口一直运行&#xff1f;3、不用方法mainloop&#xff08;&#xff09;怎么实现窗口一直运行&#xff1f;4、请问窗口的宽度*高度默认值为多少个像素点&#xff1f;5、利用…

Python-桌面计时器程序设计

该程序是我个人去年学习之初练习设计&#xff0c;程序功能并没有很完善和简便。设计想法是为了能够有一个可观性高的时间报时器&#xff0c;程序设计耗时2天&#xff0c;程序分成三个部分&#xff1a;主窗体、设置窗口、运行程序。 效果展示图 功能 正/反计时功能 到时提醒/关…