Linux下编写GT911触摸驱动

Linux下编写GT911触摸驱动问题一:资源获取Gt911数据手册在韦老师给的资料里,路径为\06_Datasheet\Extend_modules\7寸LCD模块\电容触控芯片GT911Datasheet_121120(海威思.pdf问题二:需要准备哪些知识1.能够修改设备树2.能够编写字符设备驱动3.能够在linux下编写中断程序4.能够在linux下编写IIC收发程序5.了解input子系统6.移植tslib(用于校准,测试触摸屏)gt911硬件连接(韦老师的板子):可以看到gt911只

大家好,又见面了,我是你们的朋友全栈君。

问题一:资源获取Gt911数据手册

在韦老师给的资料里,路径为\06_Datasheet\Extend_modules\7寸LCD模块\电容触控芯片GT911 Datasheet_121120(海威思.pdf

问题二:需要准备哪些知识

1.能够修改设备树

2.能够编写字符设备驱动

3.能够在linux下编写中断程序

4.能够在linux下编写IIC收发程序

5.了解input子系统

6.移植tslib(用于校准,测试触摸屏)

gt911硬件连接(韦老师的板子):

Linux下编写GT911触摸驱动

可以看到gt911只需要4个IO来控制

SDA:IIC数据线———–UART5_RXD

SCL:IIC时钟线———–UART5_TXD

RST:复位引脚———–SNVS_TAMPER2

INT:中断引脚————GPIO1_IO05

问题三:如何修改设备树

UART5_RXD和UART5_TXD引脚属于IIC2,在原厂的设备树中已经帮我们做好了IIC2的初始化,因此我们需要在i2c2节点下添加gt911设备

&i2c2 {

    clock_frequency = <100000>;

    pinctrl-names = “default”;

    pinctrl-0 = <&pinctrl_i2c2>;

    status = “okay”;

 

    codec: wm8960@1a {

        compatible = “wlf,wm8960”;

        reg = <0x1a>;

        clocks = <&clks IMX6UL_CLK_SAI2>;

        clock-names = “mclk”;

        wlf,shared-lrclk;

    };

    gt9xx@5d {

        compatible = “goodix,gt9xx”;

        reg = <0x5d>;

        pinctrl-names = “default”;

        pinctrl-0 = <&pinctrl_tsc_gt9xx>;

        interrupt-parent = <&gpio1>;

        interrupts = <5 IRQ_TYPE_EDGE_FALLING>;

        reset-gpios = <&gpio5 2 GPIO_ACTIVE_LOW>;

        irq-gpios = <&gpio1 5 GPIO_ACTIVE_LOW>;

        irq-flags = <2>;                /*1:rising 2: falling*/

        /*7*/

        goodix,cfg-group0 = [

            00 20 03 E0 01 05 0D 00 01 08

            28 0F 50 32 03 05 00 00 00 00

            00 00 00 00 00 00 00 8A 2A 0C

            45 47 0C 08 00 00 00 02 02 2D

            00 00 00 00 00 03 64 32 00 00

            00 28 64 94 C5 02 07 00 00 04

            9C 2C 00 8F 34 00 84 3F 00 7C

            4C 00 77 5B 00 77 00 00 00 00

            00 00 00 00 00 00 00 00 00 00

            00 00 00 00 00 00 00 00 00 00

            00 00 00 00 00 00 00 00 00 00

            00 00 18 16 14 12 10 0E 0C 0A

            08 06 04 02 FF FF 00 00 00 00

            00 00 00 00 00 00 00 00 00 00

            00 00 16 18 1C 1D 1E 1F 20 21

            22 24 13 12 10 0F 0A 08 06 04

            02 00 FF FF FF FF FF FF 00 00

            00 00 00 00 00 00 00 00 00 00

            00 00 00 00 24 01

        ];

        status = “okay”;

    };

 

reg:IIC从设备地址

pinctrl-0:使用的引脚(中断引脚和复位引脚)

goodix,cfg-group0:gt911需要配置的寄存器的默认值

然后我们还需要在设备树中添中断引脚的复位引脚

在iomux节点下添加以下内容

pinctrl_tsc_gt9xx: gt9xx_tscgrp {

            fsl,pins = <

                MX6ULL_PAD_SNVS_TAMPER2__GPIO5_IO02        0x10B0

                MX6UL_PAD_GPIO1_IO05__GPIO1_IO05           0x10B0

            >;

        };

其中中断引脚和复位引脚都配置为上拉模式

问题四:gt911初始化流程

gt911地址配置

gt911地址可以配置为0x28和0xBA

Linux下编写GT911触摸驱动

这里我们选择0xBA地址,因此上电时序为

INT=0

RST=0

延时10ms

RST=1

延时10ms

依据手册,还有一步是要将INT脚转为悬浮输入态

由于linux的IIC地址在低7位,因此gt911的实际地址是0xBA>1=0x5d,这就是为什么我们在设备树中将GT911的地址配置为0x5d

gt911需要配置的寄存器

gt911需要配置186个寄存器,分别为0x8047-0x8100

在配置流程为

软件复位

配置寄存器0x8047-0x8100

结束软件复位

其中软件复位由0x8040寄存器控制:

写入 2 即可复位 GT911,在硬复位之后,一般要往该寄存器写 2 实行软复位。然后写入 0,即可正常读取坐标数据(并且会结束软复位)。

Linux下编写GT911触摸驱动

0x8047-0x8100寄存器中以下寄存器比较重要

这里共186个寄存器,用于配置GT9147的各个参数,这些配置一般由厂家提供给我们(一个数组),所以我们只需要将厂家给我们的配置,写入到寄存器中即可。

Linux下编写GT911触摸驱动

Linux下编写GT911触摸驱动

3.初始化中断

寄存器配置过后我们需要将INT引脚初始化为中断模式,下降沿触发。

4.读取坐标

坐标寄存器地址为0x8140-0x8177

0x8140~0x8143 是产品ID寄存器,用于保存产品ID,对于GT9147,这4个寄存器读出来是:9、1、4、7四个字符(ASCII码格式)。一次可以通过这四个寄存器的值来判断驱动IC的型号,从而判断是OTT2001A还是GT9147,以便执行不同的初始化。

其中0x814E (状态寄存器) 比较重要,

我们仅关心最高位和最低四位,最高位用于表示buffer状态,如果有数据(坐标/按键),buffer就会是1,最低四位用于表示有效触点的个数,范围是:0~5,0表示没有触摸,5表示有5点触摸。

当中断发生时我们需要读取这个寄存器的值,bit7告诉我们是否可以读取,当我们读取完成之后还要将bit7清零,否则中断一直触发。

Linux下编写GT911触摸驱动

 

 

 

Linux下编写GT911触摸驱动

0x814F-0x8177(共30个寄存器)为坐标点,读取相应的寄存器即可获取坐标。

这里共分成5组(5个点),每组6个寄存器存储数据,以触点1的坐标数据寄存器组为例,一般只用到触点的x,y坐标,所以只需要读取0x8150~0x8153的数据,组合即可得到触点坐标。其他4组分别是:0x8158 0x8160 0x8168 和0x8171等开头的16个寄存器组成,分别针对触点2~4的坐标。同样GT9147也支持寄存器地址自增,只需要发送寄存器的首地址,然后连续读取即可,GT9147会地址自增,从而提高读取速度。

结语:其实网上由gt911的官方库,可以很方便的移植,但是由于这个驱动相对简单,所以自己写收获会更多。

参考于:http://bbs.100ask.net/article/35

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149245.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月16日 下午7:00
下一篇 2022年6月16日 下午7:00


相关推荐

  • java.lang.ClassNotFoundException: okio.ForwardingTimeout 已解决

    java.lang.ClassNotFoundException: okio.ForwardingTimeout 已解决这个问题发现是由于版本问题引起的,下面是我用的两个jar源码对比:先看看okio-1.13.0.jar的,会发现在forwardingSource下面有ForwardingTimeout这个类下面是okio-2.0.0.jar包,会发现那个ForwardingTimeout没了,不知道官方改成什么了我用okhttp-3.8.0.jar引用okio-2.0.0.jar的时候就会…

    2022年5月29日
    109
  • Java别说取余(%)运算简单,你真的会吗?

    Java别说取余(%)运算简单,你真的会吗?一,直击现场下面我来抛出几道题:说明m是商,n是余数;(1)正数%正数3%2=m…….n2%3=m…….n(2)正数%负数或者负数%正数-3%2=m…….n3%-2=m…….n-2%3=m…….n2%-3=m…….n(3)负数%负数-3%-2=m…….n-2%-3=m…….n二,验证时刻下面的结果没有商m只有余数n;有没有全部答对呢?没有的话来看总结吧

    2022年5月7日
    43
  • C语言中正弦函数定义域,三角函数定义域和值域

    C语言中正弦函数定义域,三角函数定义域和值域三角函数定义域和值域 2019 11 2709 51 41 文 董月 sin x cos x 的定义域为 R 值域为 1 1 tan x 的定义域为 x 不等于 2 k 值域为 R cot x 的定义域为 x 不等于 k 值域为 R y a sin x b cos x c 的值域为 c a b c a b 定义三角函数 也叫做 圆函数 是角的函数 它们在研究三角形和建模周期现象和

    2026年3月20日
    2
  • ntp服务器 时间(查看服务器时间)

    publicstaticStringgetNTPServerDateTime(StringNTPTimeServerUrl){StringdateTimeMessage;try{NTPUDPClienttimeClient=newNTPUDPClient();InetAddresstimeServerAddress=

    2022年4月12日
    252
  • date和calendar_Calendar类

    date和calendar_Calendar类时间和日期处理 在程序中,某个固定的时间代表的都是一个时间点,也就是一个时间的瞬间,例如2009年3月8日15点50分0秒,在实际的应用中,经常需要对于两个时间进行比较或计算时间之间的差值,这些功能在Java语言中都可以很方便的实现。 在Java语言中,时间的表达单位是毫秒。也就是说,Java语言中的时间处理可以精确到毫秒。 在Java语言中,表达时间的方式有两种: a、绝

    2026年2月21日
    4
  • wing是什么_分段计价的数学题

    wing是什么_分段计价的数学题给定一个由 n 行数字组成的数字梯形如下图所示。梯形的第一行有 m 个数字。从梯形的顶部的 m 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形的顶至底的路径。规则 1:从梯形的顶至底的 m 条路径互不相交。规则 2:从梯形的顶至底的 m 条路径仅在数字结点处相交。规则 3:从梯形的顶至底的 m 条路径允许在数字结点相交或边相交。对于给定的数字梯形,分别按照规则 1,规则 2,和规则 3 计算出从梯形的顶至底的 m 条路径,使这 m 条路径经过的数字总和最大。输入格式第 1

    2022年8月11日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号