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

基于瑞芯微RV1109 Linux触摸屏GT911驱动调试心得 刘+ 2023-11-20 17:27:49 1732

目录

1. 确定I2C地址

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

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

2. GT911驱动移植

2.1 配置Linux内核支持gt9xx

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

2.3、配置设备树

3. 重新编译内核

4. 确认是否适配成功

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

4.2 查看内核信息

4.3 查看配置的中断资源

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

4.5 其它


1. 确定I2C地址

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

易百纳社区

很明显这里可以看到系统已经配置了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/

易百纳社区

ls /sys/devices/platform

易百纳社区

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

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

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

易百纳社区

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

i2cdetect -y 5

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

易百纳社区

上图中:

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

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

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

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

2. GT911驱动移植

2.1 配置Linux内核支持gt9xx

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

kernel/drivers/input/touchscreen/gt9xx

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

易百纳社区

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

驱动代码:

kernel/drivers/input/touchscreen/gt9xx

易百纳社区

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

易百纳社区

这样,我们就确定了设备树中的第一个参数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-gpio、reset-gpio、power-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-x、max-y

  • max-x

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

  • max-y

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

2.3、配置设备树

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

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

易百纳社区

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

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

&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

易百纳社区

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

易百纳社区

4. 确认是否适配成功

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

易百纳社区

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

4.2 查看内核信息

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

易百纳社区

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

4.3 查看配置的中断资源

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

cat /proc/interrupts

易百纳社区

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

易百纳社区

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

4.5 其它

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

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
刘+
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
刘+
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区