转自: http://bbs.100ask.net/article/35#:~:text=%E7%94%B1%E4%BA%8Elinux%E7%9A%84IIC%E5%9C%B0%E5%9D%80%E5%9C%A8%E4%BD%8E7%E4%BD%8D%EF%BC%8C%E5%9B%A0%E6%AD%A4gt911%E7%9A%84%E5%AE%9E%E9%99%85%E5%9C%B0%E5%9D%80%E6%98%AF0xBA%3E1%3D0x5d%2C%E8%BF%99%E5%B0%B1%E6%98%AF%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E4%BB%AC%E5%9C%A8%E8%AE%BE%E5%A4%87%E6%A0%91%E4%B8%AD%E5%B0%86GT911%E7%9A%84%E5%9C%B0%E5%9D%80%E9%85%8D%E7%BD%AE%E4%B8%BA0x5d,gt911%E9%9C%80%E8%A6%81%E9%85%8D%E7%BD%AE%E7%9A%84%E5%AF%84%E5%AD%98%E5%99%A8%20gt911%E9%9C%80%E8%A6%81%E9%85%8D%E7%BD%AE186%E4%B8%AA%E5%AF%84%E5%AD%98%E5%99%A8%EF%BC%8C%E5%88%86%E5%88%AB%E4%B8%BA0x8047-0x8100

源码在最下面

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

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

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

  1. 能够修改设备树
  2. 能够编写字符设备驱动
  3. 能够在linux下编写中断程序
  4. 能够在linux下编写IIC收发程序
  5. 了解input子系统
  6. 移植tslib(用于校准,测试触摸屏)

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

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

pin description pin
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初始化流程

1. gt911地址配置

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

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

  1. INT=0, RST=0
  2. 延时10ms
  3. RST=1
  4. 延时10ms

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

2. gt911需要配置的寄存器

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

在配置流程为

  1. 软件复位
  2. 配置寄存器0x8047-0x8100
  3. 结束软件复位

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

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

3. 初始化中断

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

4. 读取坐标

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

其中0x814E比较重要,

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

bit3-0:告诉我们触控点数。

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

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

源码: 附件gt9xx_driver.zip

标签: aosp

添加新评论