RK3288 android 6.0 移植 gt9xx 驱动

问题描述

  • 平台:RK3288
  • 系统:Android 6.0
  • 需求:触摸屏驱动移植

驱动移植

先从厂商获取驱动程序 gt9xx_v2.8.0.2.

gt9xx_v2.8.0.2
├── dtsi
│   ├── gt9xx_dts.txt
│   ├── pinctrl_mtk.txt
│   └── pinctrl_qcom.txt
├── goodix_tool.c
├── gt9xx.c
├── gt9xx.h
├── gt9xx_update.c
├── Kconfig
└── Makefile

新建目录 drivers/input/touchscreen/gt9xx_v2.8.0.2/ ,将以上 .c, .h, 及 Makefile文件放入该目录。

修改 Kconfig

将提供的Kconfig内容添加到以下文件

  • drivers/input/touchscreen/Kconfig
#
# Goodix GT9xx Touchscreen driver
#
config TOUCHSCREEN_GT9XX_V28
        bool "Goodix touchpanel GT9xx series"
        depends on I2C
        help
          Say Y here if you have a Goodix GT9xx touchscreen
          controller.

          If unsure, say N.

config TOUCHSCREEN_GT9XX_UPDATE
        tristate "Goodix GT9xx touch controller auto update support"
        depends on TOUCHSCREEN_GT9XX_V28
        default y
        help
          Enable this for support firmware update.

          Say Y here if you want update touch controller firmware.

          If unsure, say N.

config TOUCHSCREEN_GT9XX_TOOL
        tristate "Goodix GT9xx Tools for debuging"
        depends on TOUCHSCREEN_GT9XX_V28
        default y
        help
          This implement interface support for Goodix GT9xx
          touchscreen debug.

          Say Y here if you want to have a Android app debug interface
          to your system.

          If unsure, say N.

由于原文件中的TOUCHSCREEN_GT9XX已经存在了,所以将其更名为TOUCHSCREEN_GT9XX_V28

修改 Makefile

  • drivers/input/touchscreen/gt9xx_v2.8.0.2/Makefile

Makefile 中默认的 CONFIG_TOUCHSCREEN_GT9XX 改为 CONFIG_TOUCHSCREEN_GT9XX_V28

obj-$(CONFIG_TOUCHSCREEN_GT9XX_V28)             += gt9xx.o
obj-$(CONFIG_TOUCHSCREEN_GT9XX_UPDATE)  += gt9xx_update.o
obj-$(CONFIG_TOUCHSCREEN_GT9XX_TOOL)    += goodix_tool.o

修改 rockchip_defconfig

修改内核配置,替换原有的 GT9XX_V24 的驱动

  • arch/arm/configs/rockchip_defconfig
-CONFIG_TOUCHSCREEN_GT9XX_V24=y
+# CONFIG_TOUCHSCREEN_GT9XX_V24 is not set
+CONFIG_TOUCHSCREEN_GT9XX_V28=y
+CONFIG_TOUCHSCREEN_GT9XX_UPDATE=y                                              
+CONFIG_TOUCHSCREEN_GT9XX_TOOL=y

修改设备树

由于新的驱动依赖新的设备树,所以需要添加以下内容,该内容可以从厂商给的 dtsi 目录获取,但是要修改某些参数。

下面的goodix_ts@5d 是旧的驱动所用,将其状态改为 disabled, 并添加新的 goodix_ts_v28@5d.

&i2c4 {
        status = "okay";

        goodix_ts@5d {
                status = "disabled";
                compatible = "goodix,gt1x", "goodix,gt9xx";             // gt5688, gt911
                reg = <0x5d>;
                goodix,rst-gpio = <&gpio7 GPIO_A5 GPIO_ACTIVE_LOW>;
                goodix,irq-gpio = <&gpio7 GPIO_A6 IRQ_TYPE_EDGE_FALLING>;
        };
        goodix_ts_v28@5d {
                //status = "disabled";
                compatible = "goodix,gt9xx";
                reg = <0x5d>; 
                reset-gpios = <&gpio7 GPIO_A5 GPIO_ACTIVE_LOW>;
                irq-gpios = <&gpio7 GPIO_A6 IRQ_TYPE_EDGE_FALLING>;
                irq-flags = <2>;

                //touchscreen-max-id = <11>;
                //touchscreen-size-x = <600>;
                //touchscreen-size-y = <1024>;

                goodix,slide-wakeup = <0>;
                goodix,type-a-report = <0>;
                goodix,driver-send-cfg = <1>;
                goodix,resume-in-workqueue = <0>;
                goodix,int-sync = <1>;
                goodix,swap-x2y = <0>;
                goodix,esd-protect = <1>;
                goodix,auto-update-cfg = <0>;
                goodix,power-off-sleep = <0>;
                goodix,pen-suppress-finger = <0>;
                //goodix,cfg-group0 = [53 D0 02 00];
        };
};

其中有些参数必须要修改,比如 reset-gpios, irq-gpios, 需要改为与触摸屏复位及中断引脚匹配的 gpio. 其它参数根据情况进行修改。

  • reset-gpios: 复位引脚,参考旧的配置,或者根据原理图设置
  • irq-gpios: 中断引脚,参考旧的配置,或者根据原理图设置
  • touchscreen-size-x: 屏幕 x 方向分辨率, 此处如果注释掉会使用 gt9xx.h 中的默认值
  • touchscreen-size-y: 屏幕 y 方向分辨率, 此处如果注释掉会使用 gt9xx.h 中的默认值
  • driver-send-cfg: 启用后会发送配置参数,默认从 dts 获取,对应 goodix,cfg-group0
  • swap-x2y: 交换屏幕x, y的方向,如果发现触摸屏的方向反了,需要修改这个值
  • goodix,cfg-group0: 屏幕配置参数,由厂商提供,如果不确定就把 goodix,driver-send-cfg 置为0.

goodix,cfg-group0 这个数组如果数据不对很可能导致触摸屏异常, 所以写入前先备份,在不打开 driver-send-cfg 的情况下启动板子,然后通过 /proc/gt9xx_config 获取当前配置。

其它参数默认不需要修改。

如果一切正常的话,编译烧录后触摸屏就可以正常使用了。

异常处理

  • 如果触摸时x, y方向反了,需要改一下 goodix,swap-x2y
  • 如果触摸屏可以响应操作,方向正常,但是位置不对,大概率是配置参数有误,需要写入正确的配置
  • 出现大量异常log rockchip_i2c ff160000.i2c: Warning: addr[0x005d] msg[0].scl_rate( = 0Khz ) is too low!, 需要添加 scl_rate
--- a/drivers/input/touchscreen/gt9xx_v2.8.0.2/gt9xx.c
+++ b/drivers/input/touchscreen/gt9xx_v2.8.0.2/gt9xx.c
@@ -68,9 +68,11 @@ int gtp_i2c_read(struct i2c_client *client, u8 *buf, int len)
                        .flags = !I2C_M_RD,
                        .buf = &addr_buf[0],
                        .len = GTP_ADDR_LENGTH,
+                       .scl_rate = 300 * 1000,
                }, {
                        .addr = client->addr,
                        .flags = I2C_M_RD,
+                       .scl_rate = 300 * 1000,
                }
        };

@@ -140,6 +142,7 @@ int gtp_i2c_write(struct i2c_client *client, u8 *buf, int len)
        struct i2c_msg msg = {
                        .addr = client->addr,
                        .flags = !I2C_M_RD,
+                       .scl_rate = 300 * 1000,
        };

        if (likely(len < sizeof(put_buf))) {
  • 该版本驱动默认从 dts 读取屏幕配置,当然也可以从头文件 gt9xx.h 获取,不过对应的要将 gt9xx.c 函数 gtp_find_valid_cfg_data 中关于 CONFIG_OF 的判断注释掉。