Tinkerboard2/gt911

From wiki
Jump to: navigation, search


本教程是以深圳风火轮科技有限公司设计的mipi0918触摸屏,该屏主要是为tinker board 2s mipi接口设计的触摸屏,同时支持firefly的mipi接口。另外预留了I2C管脚,可以灵活地选择主机外置的GPIO管脚做I2C管脚。

  • tinker board 2s连接:接3.3V,接GND
  • GPIO1_B2接TP_INT(TP_INT要求GPIO管脚具备边沿触发中断)
  • GPIO1_B1接TP_RST(对GPIO无要求)
  • GPIO4_C6接PWM,
  • 使用异面22pin的软排线将tinker board 2s的mipi接口和mipi0918的tinker board 2s interface连接起来。

Mipi0918.png

显示配置

显示部分参考这篇文章:mipi dsi lcd

触摸配置

触摸部分采用了gt911模块,分辨率为1024x600,通信协议是I2C。

GT911管脚说明

GT911是一款电容式触摸屏,它与主机的接口有6PIN,分别为VDD、GND、SCL、SDA、INT和RESET。其中GT911的设备地址有两个(0x5d和0x14)。

管脚说明:

  • VDD:接3.3V电源。
  • GDN:接电源GND。
  • SCL:最高速率可以支持400Kbps。如果主机采用200K以上的通信速率,就需要特别注意I2C外部上拉电阻阻值,以保证SCL和SDA边沿足够陡峭。而本文采用的是标准的I2C速率100K。
  • SDA:I2C的数据管脚。
  • INT:在GT911上电前配合RESET管脚作上电时序管脚,用于设置GT911的设备地址是0x5d还是0x14。GT911正常工作后,做中断管脚或者电平信号轮询管脚,不能接上下拉电阻。
  • RESET:在GT911上电前配合INT管脚作上电时序管脚,用于设置GT911的设备地址是0x5d还是0x14。GT911正常工作后,做复位管脚。

GT911上电时序

如果你的I2C设备地址0x5d已经被占用了,你可以将GT911的设备地址设置为0x14。

  • 设置设备地址为0x5d:
Gt911 5d.png
  • 设置设备地址为0x14:
Gt911 14.png

配置设备树

//这里使用的I2C接口是I2C8总线下。在kernel/arch/arm64/boot/dts/rockchip/tinker_board_2.dtsi里面的i2c8节点下添加如下内容:
goodix_ts@5d {
    compatible = "goodix,gt9xx";
    reg = <0x5d>;                                   //也可以填0x14
    touch-gpio = <&gpio1 RK_PB2 GPIO_ACTIVE_LOW>;   //中断IO
    reset-gpio = <&gpio1 RK_PB1 GPIO_ACTIVE_LOW>;   //复位IO
    max-x = <1024>;                                 //x方向解析度
    max-y = <600>;                                  //y方向解析度
    tp-size = <911>;                                //TP尺寸
    status = "okay"; 
};
//如果需要将I2c速率提高到400K,只需要在对应的i2c总线下添加如下内容,本文采用的是i2c标准速率,即100K,无需进行下面配置。
&i2c8 {
    clock-frequency = <400000>;//这个是将i2c速率配置到400K
    ...
};

源码分析

驱动文件在kernel/drivers/input/touchscreen/gt9xx/目录下。有gt9xx.c、gt9xx_cfg.h、gt9xx_firmware.h、gt9xx.h、gt9xx_update.c、goodix_tool.c。查看Makefile可知,tinker board 2s Android 源码默认将gt911编译进内核。

驱动文件说明:

  • gt9xx.c:驱动主功能文件,用来实现驱动的挂载、读取上报坐标、休眠唤醒处理等触摸屏驱动的基本功能。
  • gt9xx.h:驱动头文件,包含驱动中要用到的一些宏和常量的定义、外部变量和函数的声明等。
  • gt9xx_update.c:驱动用于支持固件升级的文件,对于触摸屏驱动来说,该文件不是必需的,但是强烈推荐在驱动中增加该功能,以便于您使用的触控 IC 在必要时升级为最新版本的固件。
  • gt9xx_firmware.h:默认存放头文件升级默认固件数组,数组默认为空。如需开启兼容 GT9XXF 模式(GTP_COMPATIBLE_MODE 置 1),您需要将 GT9XXF Firmware Headers中相应 GT9XXF 文件夹下的 gt9xx_firmware.h 替换驱动中的同名文件。
  • goodix_tool.c:驱动中用于支持 gtp_tools.apk 工具和 ADB 工具的文件,该工具可以在装成整机后再 Android 上层对触控 IC 进行测试、调试、检测等功能,强烈推荐在驱动中增加此功能,特别是使用 COB(触控 IC 直接 layout 在主板上)模式的 TP 时,此工具能极大的方便整机上的 TP 调试。

修改static int goodix_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)的

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;
将ts->abs_x_max和ts->abs_y_max注释去掉。

如果触摸屏的x,y方向不对,修改gt9xx.c里面static int goodix_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)的

else if (val == 911) {
    m89or101 = FALSE;
    bgt911 = TRUE;
    gtp_change_x2y = FALSE;  //x、y方向反
    gtp_x_reverse = FALSE;   //x镜像
    gtp_y_reverse = TRUE;    //y镜像
}

宏定义开关

自己指定分辨率、中断触发方式、支持的最多TOUCH 数等参数,请在 ON/OFF define 中打开 GTP_CUSTOM_CFG 宏,驱动中 gt9xx.h 在 ON/OFF define 部分定义了一些宏开关,以便在调试的过程中使用,0 表示关闭该功能,1 表示打开功能,各开关的释义如下:

#define GTP_DEBUG_ON             // 调试信息开关,打开则输出调试信息
#define GTP_DEBUG_ARRAY_ON       // 调试数组开关,用于调试时打印一片内存的内容
#define GTP_DEBUG_FUNC_ON        // 调试函数开关,用于跟踪函数调用流程
#define GTP_CUSTOM_CFG           // 客户定制配置开关,用于客户自行修改某些参数
#define GTP_HAVE_TOUCH_KEY       // 触摸按键开关,仅带有触摸按键的 TP 需要打开
#define GTP_AUTO_UPDATE          // 开机搜寻 bin 文件进行固件升级
#define GTP_HEADER_FW_UPDATE     // 使用 gt9xx_firmware.h 中的固件升级,)需开启 GTP_AUTO_UPDATE)
#define GTP_AUTO_UPDATE_CFG      // 搜寻.cfg 文件升级(需开启 GTP_AUTO_UPDATE)
#define GTP_ESD_PROTECT          // ESD 防护机制开关
#define GTP_ICS_SLOT_REPORT      // android4.0 以上配置成 slot 方式报点
#define GTP_GESTURE_WAKEUP       // 手势唤醒
#define GTP_COMPATIBLE_MODE      // 兼容 GT9XXF 模式
#define GTP_LITTLE_SYSTEM        // 带小系统的 GT9XXF,需同开启 POWER_CTRL_SLEEP
#define GTP_WITH_PEN             // 笔事件支持
#define GTP_PEN_HAVE_BUTTON      // 主动笔带有按键

寄存器列表

  • 实时命令:
    • 0x8040:
      • 0:读坐标状态
      • 1:差值原始值
      • 2:差值原始值
      • 3:基准更新(内部测试)
      • 4:基准校准(内部测试)
      • 5:关屏
      • 6:进入充电模式
      • 7:退出充电模式
      • 8:手势唤醒模式
      • 0x20:进入HotKnot从机接近检测模式
      • 0x21:进入HotKnot主机接近检测模式
      • 0x22:进入数据传输模式
      • 0x28:退出从机检测模式
      • 0x29:退出主机检测模式
      • 0x2A:退出数据传输模式
      • 0xAA:ESD保护机制使用,由驱动定时写入0xAA并定时读取检查
      • 其余值无效
  • 配置信息:寄存器从0x8047到0x8100。
    • 0x8047:配置文件的版本号,新的版本号大于或等于原版本号才会保存。版本号正常范围:‘A’到‘Z’,发送0x00则将版本号初始化为‘A’。
    • 0x8048:设置X坐标输出最大值,低位字节。
    • 0x8048:设置X坐标输出最大值,高位字节。
    • 0x804A:设置Y坐标输出最大值,低位字节。
    • 0x804B:设置Y坐标输出最大值,高位字节。
    • 0x804C:设置输出触点上限:1到5。
    • 0x804D:
      • Bit7:置1表示将Y轴坐标反转。
      • Bit6:置1表示将X轴坐标反转。
      • Bit5-Bit4:拉伸方式,00,01,02:弱拉伸0.4P。03:自定义拉伸。
      • Bit3:x,y坐标交换。
      • Bit2:sito(软件降噪)。
      • Bit1-Bit0:INT触发方式:
        • 00:上升沿触发。
        • 01:下降沿触发。
        • 02:低电平查询。
        • 03:高电平查询。
    • 0x804E:
      • Bit5:首次去抖加大使能开关,0:开启,1:关闭
      • Bit2:hotknot接近检测模块开关。
      • Bit1:hotknot总开关。
    • 0x805B-0x805C:屏的4个边缘空白区配置,用于在ITO超出实际可视区时对边缘进行裁剪。可设范围0~15(表示裁剪Nx32个原始坐标点),其中0表示无裁剪,最大裁剪范围为15x32=480个原始坐标点(一个Pitch有512个原始坐标点,若裁剪超过一个Pitch,直接在配置中先减少一个Pitch)。
    • 0x8071:
      • Bit7-Bit4:上下滑动唤醒有效距离配置,滑动最小有效距离为屏幕长度的N/16,配置为0时,默认为8。
      • Bit3-Bit0:左右滑动唤醒有效距离配置,滑动最小有效距离为屏幕长度的N/16,配置为0时,默认为5。
    • 0x80FF:配置信息校验(0x8047到0x80FE之间字节和的补码)
    • 0x8100:配置信息已更新标准(由主控写入标记)
  • 坐标信息:
    • 0x8140:Product ID (first Byte,ASCII码)
    • 0x8141:Product ID (second Byte,ASCII码)
    • 0x8142:Product ID (third Byte,ASCII码)
    • 0x8143:Product ID (forth Byte,ASCII码)
    • 0x8144:Firmware version(HEX.low byte)
    • 0x8145:Firmware version(HEX.high byte)
    • 0x8146:x coordinate resolution(low byte)
    • 0x8147:x coordinate resolution(high byte)
    • 0x8148:y coordinate resolution(low byte)
    • 0x8149:y coordinate resolution(high byte)
    • 0x814A:Vendor_id(当前模组选项信息)
    • 0x814E:
      • Bit7:Buffer status,1表示坐标(或按键)已经准备好,主控可以读取;0表示未就绪,数据无效。当主控读取完坐标后,必须通过I2C将此标志(或整个字节)写为0。
      • Bit6:1表示屏体有大面积按压。
      • Bit4:1表示有按键,0表示无按键(已经松键)。
      • Bit3~0:屏上的坐标点个数。