基于瑞芯微RV1109 Linux触摸屏GT911驱动调试心得

简介: 基于瑞芯微RV1109 Linux触摸屏GT911驱动调试心得

1、确定I2C地址

1.1、使用i2cdetect工具查看系统i2c节点的情况

640.png

很明显这里可以看到系统已经配置了i2c-0、i2c-1、i2c-3、i2c-4、i2c-5,我们可以看下原厂在设备树里面的支持情况:

gedit kernel/arch/arm/boot/dts/rv1126.dtsi &

打开后我们可以看到设备树的支持情况如下:

i2c0: i2c@ff3f0000 {
  compatible = "rockchip,rv1126-i2c", "rockchip,rk3399-i2c";
  reg = <0xff3f0000 0x1000>;
  interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
  #address-cells = <1>;
  #size-cells = <0>;
  clocks = <&pmucru CLK_I2C0>, <&pmucru PCLK_I2C0>;
  clock-names = "i2c", "pclk";
  pinctrl-names = "default";
  pinctrl-0 = <&i2c0_xfer>;
  status = "disabled";
};
i2c1: i2c@ff510000 {
  compatible = "rockchip,rv1126-i2c", "rockchip,rk3399-i2c";
  reg = <0xff510000 0x1000>;
  interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;
  #address-cells = <1>;
  #size-cells = <0>;
  clocks = <&cru CLK_I2C1>, <&cru PCLK_I2C1>;
  clock-names = "i2c", "pclk";
  pinctrl-names = "default";
  pinctrl-0 = <&i2c1_xfer>;
  status = "disabled";
};
i2c3: i2c@ff520000 {
  compatible = "rockchip,rv1126-i2c", "rockchip,rk3399-i2c";
  reg = <0xff520000 0x1000>;
  interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
  #address-cells = <1>;
  #size-cells = <0>;
  clocks = <&cru CLK_I2C3>, <&cru PCLK_I2C3>;
  clock-names = "i2c", "pclk";
  pinctrl-names = "default";
  pinctrl-0 = <&i2c3m0_xfer>;
  status = "disabled";
};
i2c4: i2c@ff530000 {
  compatible = "rockchip,rv1126-i2c", "rockchip,rk3399-i2c";
  reg = <0xff530000 0x1000>;
  interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
  #address-cells = <1>;
  #size-cells = <0>;
  clocks = <&cru CLK_I2C4>, <&cru PCLK_I2C4>;
  clock-names = "i2c", "pclk";
  pinctrl-names = "default";
  pinctrl-0 = <&i2c4m0_xfer>;
  status = "disabled";
};
i2c5: i2c@ff540000 {
  compatible = "rockchip,rv1126-i2c", "rockchip,rk3399-i2c";
  reg = <0xff540000 0x1000>;
  interrupts = <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>;
  #address-cells = <1>;
  #size-cells = <0>;
  clocks = <&cru CLK_I2C5>, <&cru PCLK_I2C5>;
  clock-names = "i2c", "pclk";
  pinctrl-names = "default";
  pinctrl-0 = <&i2c5m0_xfer>;
  status = "disabled";
};

在ARM端的文件系统里查看一下:

ls /proc/device-tree/

640.png

ls /sys/devices/platform

640.png

当开机的时候系统已经将相应的I2C节点注册成功了,说明I2C部分是没有问题的。

1.2、使用i2cdetect工具确定设备地址

由于我的触摸屏是连接在I2C5上,硬件原理图如下所示:

640.png

但是我还没有实现它的驱动,所以可以通过i2cdetect工具来确定设备的I2C地址是多少,ARM端执行以下命令:

i2cdetect -y 5

这个命令中,-y表示Disable interactive mode,简单地说就是别让我确认了,赶紧执行;5表示I2C总线5(从0开始),执行后可以看到:

640.png

上图中:


--”表示没有这个地址对应的 I2C设备;


UU”表示这个地址的 I2C 设备已经有驱动在使用占用它了,那这个I2C 设备肯定是存在的;


其他数值表示该地址对应的 I2C 设备是存在的,并且还没有驱动程序跟它匹配。


如上图所示,这个5d就表示当前触摸屏的I2C地址,为什么是5d呢?你把触摸屏拔掉,再用这个命令查看是不是消失了就可以验证这个问题了。

2、GT911驱动移植

2.1、配置Linux内核支持gt9xx

GT911在Linux内核中已经支持了,位于以下路径,如果没有的话就需要跟触摸屏厂商要驱动代码,如果要不到那么就拿着Datasheet自己干吧!反正也不难的!

kernel/drivers/input/touchscreen/gt9xx

另外,也提供了menuconfig,我们只需要在配置驱动的时候搜索GT9XX,然后配置上就可以了。

640.png

2.2、查看GT911驱动代码中需要配置的设备树参数

驱动代码:

kernel/drivers/input/touchscreen/gt9xx


640.png

接下来打开gt9xx.c,划到最下面,我们可以看到:

640.png

这样,我们就确定了设备树中的第一个参数compatible

.compatible = "goodix,gt9xx"

看到这个结构体:

static struct i2c_driver goodix_ts_driver = {
    .probe      = goodix_ts_probe,
    .remove     = goodix_ts_remove,
    .id_table   = goodix_ts_id,
    .driver = {
        .name     = GTP_I2C_NAME,
  .of_match_table = of_match_ptr(goodix_ts_dt_ids),
    },
};

我们直接定位到goodix_ts_probe函数,基本上所有的设备树参数都是在probe函数里实现的,这个函数实现的功能如下:


  • 读取设备树中配置的信息
  • 将配置信息设置到TP


经过查看代码,我们主要需要配置的参数有如下:

(1)tp-size


(2)touch-gpioreset-gpiopower-gpio


(3)max-xmax-y

2.2.1、配置tp-size
  • tp-size
if (of_property_read_u32(np, "tp-size", &val)) {
     dev_err(&client->dev, "no max-x defined\n");
     return -EINVAL;
    }
if (val == 89) {
 m89or101 = TRUE;
 gtp_change_x2y = TRUE;
 gtp_x_reverse = FALSE;
 gtp_y_reverse = TRUE;
} else if (val == 101) {
 m89or101 = FALSE;
 gtp_change_x2y = TRUE;
 gtp_x_reverse = TRUE;
 gtp_y_reverse = FALSE;
} else if (val == 911) {
 m89or101 = FALSE;
 bgt911 = TRUE;
 gtp_change_x2y = TRUE;
 gtp_x_reverse = FALSE;
 gtp_y_reverse = TRUE;
} else if (val == 970) {
 m89or101 = FALSE;
 bgt911 = FALSE;
 bgt970 = TRUE;
 gtp_change_x2y = FALSE;
 gtp_x_reverse = FALSE;
 gtp_y_reverse = TRUE;
} else if (val == 910) {
 m89or101 = FALSE;
 bgt911 = FALSE;
 bgt970 = FALSE;
 bgt910 = TRUE;
 gtp_change_x2y = TRUE;
 gtp_x_reverse = FALSE;
 gtp_y_reverse = TRUE;
}

这个值用来配置触摸屏的尺寸。

2.2.2、配置touch-gpioreset-gpiopower-gpio
  • touch-gpio
  • reset-gpio
  • power-gpio
ts->irq_pin = of_get_named_gpio_flags(np, "touch-gpio", 0, (enum of_gpio_flags *)(&ts->irq_flags));
ts->rst_pin = of_get_named_gpio_flags(np, "reset-gpio", 0, &rst_flags);
ts->pwr_pin = of_get_named_gpio_flags(np, "power-gpio", 0, &pwr_flags);

touch-gpio是配置中断管脚、reset-gpio是配置复位引脚、power-gpio是配置给触摸屏上电。由于硬件工程师设计的时候采用的是硬件上电,所以power-gpio这个管脚可以不用配置,另外的两个一定要配置!!!!一定要配置!!!!(重要的事情说两遍!)

2.2.3、配置max-xmax-y
  • max-x


触摸X方向的分辨率,由于我的触摸屏是1024*600,项目上需要竖屏触摸,所以X方向的分辨率配置为600。


  • max-y


触摸Y方向的分辨率,由于我的触摸屏是1024*600,项目上需要竖屏触摸,所以X方向的分辨率配置为1024。

2.3、配置设备树

根据2中,阅读驱动得知的设备树参数信息,我们就能够非常简单的把设备树给写出来了,实在不知道怎么写,直接去设备树文件里搜,搜到一个类似的,直接复制过来,照着改即可,以下是我在自己平台上配置的设备树节点:


  • 中断IO原理图连接方式:

640.png

  • 复位IO原理图连接方式:

640.png

跟据以上规则,配置设备树如下:

&i2c5 {
 status = "okay";
 goodix_ts@5d {
   compatible = "goodix,gt9xx";
   reg = <0x5d>;
   touch-gpio = <&gpio2 RK_PB2 IRQ_TYPE_LEVEL_HIGH>;   //中断IO
         reset-gpio = <&gpio2 RK_PD4 GPIO_ACTIVE_HIGH>;      //复位IO
   max-x = <600>;   //x方向解析度
   max-y = <1024>;  //y方向解析度
   tp-size = <911>; //TP尺寸
   status = "okay"; 
  };
};

这里的中断引脚对应的事件设置为高电平触发。

3、重新编译内核

./build.sh kernel && ./build.sh firmware


640.png

然后将生成的boot.img下载到开发板上即可:

640.png

4、确认是否适配成功

4.1、确定驱动是否已经占用了对应的I2C地址。

640.png

由1部分我们已经知道“UU”表示这个地址的 I2C 设备已经有驱动在使用占用它了,那这个I2C 设备肯定是存在的;也就是说这个设备已经挂载成功了。

4.2、查看内核信息

使用管道过滤内核信息,找到关键字段:

640.png

我们能够看到触摸屏设备已经成功挂载上了,并且也已经生成了对应的事件节点。

4.3、查看配置的中断资源

如果配置成功,那么通过以下命令可以查看到:

cat /proc/interrupts


640.png

4.4、使用hexdump工具测试对应的事件节点

640.png

如上,当我触摸TP的时候,就能够看到打印信息了,TP驱动成功!

4.5、其它

可能会出现报点不正确、需要调整方向,需要根据实际情况进行具体分析和讨论。

往期精彩

一个强大的音视频编解码库-rkmedia的应用


瑞芯微RV1109配置7寸电容触摸屏的方向修改笔记


如何添加APP到Buildroot里(以瑞芯微rv1126为例)


Linux MIPI DSI LCD设备驱动开发调试细节学习笔记(一)


Linux MIPI DSI驱动调试笔记-设备树DCS格式序列之配置LCD初始化代码(二)


Linux MIPI DSI驱动调试笔记-LCD时序参数配置(三)


瑞芯微RV1109配置GPIO设备树修改笔记(熟悉新平台从点灯大法开始)


新产品立项了,作为嵌入式软件工程师该如何来开展设计工作?(个人经验分享)

目录
相关文章
|
8天前
|
缓存 NoSQL Linux
Linux调试
本文介绍了Linux调试、性能分析和追踪的培训资料,涵盖调试、性能分析和追踪的基础知识及常用工具。
149 6
Linux调试
|
3月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
62 10
|
3月前
|
Java Linux API
Linux设备驱动开发详解2
Linux设备驱动开发详解
43 6
|
3月前
|
消息中间件 算法 Unix
Linux设备驱动开发详解1
Linux设备驱动开发详解
49 5
|
3月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
|
3月前
|
Ubuntu Linux
内核实验(四):Qemu调试Linux内核,实现NFS挂载
本文介绍了在Qemu虚拟机中配置NFS挂载的过程,包括服务端的NFS服务器安装、配置和启动,客户端的DHCP脚本添加和开机脚本修改,以及在Qemu中挂载NFS、测试连通性和解决挂载失败的方法。
188 0
内核实验(四):Qemu调试Linux内核,实现NFS挂载
|
3月前
|
Ubuntu NoSQL Linux
Linux内核和驱动
Linux内核和驱动
29 2
|
3月前
|
数据采集 Linux
Linux源码阅读笔记20-PCI设备驱动详解
Linux源码阅读笔记20-PCI设备驱动详解
|
2月前
|
Linux API
Linux里的高精度时间计时器(HPET)驱动 【ChatGPT】
Linux里的高精度时间计时器(HPET)驱动 【ChatGPT】
|
4月前
|
运维 Java Linux
(九)JVM成神路之性能调优、GC调试、各内存区、Linux参数大全及实用小技巧
本章节主要用于补齐之前GC篇章以及JVM运行时数据区的一些JVM参数,更多的作用也可以看作是JVM的参数列表大全。对于开发者而言,能够控制JVM的部分也就只有启动参数了,同时,对于JVM的性能调优而言,JVM的参数也是基础。
103 8

热门文章

最新文章