基于瑞芯微RV1109 Linux触摸屏GT911驱动调试心得
目录
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-gpio、reset-gpio、power-gpio
(3)max-x、max-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 其它
可能会出现报点不正确、需要调整方向,需要根据实际情况进行具体分析和讨论。
- 分享
- 举报
-
2023-11-21 17:01:33
-
浏览量:7103次2020-08-27 10:20:57
-
浏览量:6044次2022-05-11 15:14:51
-
浏览量:3634次2021-04-01 13:50:37
-
浏览量:6935次2021-04-01 17:04:01
-
浏览量:6369次2022-05-31 11:14:16
-
浏览量:787次2023-11-23 13:38:54
-
浏览量:5900次2021-04-01 16:47:04
-
浏览量:3972次2021-04-02 09:47:41
-
浏览量:3469次2022-09-03 09:03:36
-
浏览量:3983次2021-06-18 16:05:42
-
浏览量:6061次2021-04-01 16:50:31
-
浏览量:6259次2022-05-17 16:26:53
-
浏览量:2311次2022-10-09 10:38:23
-
浏览量:2364次2019-12-05 16:46:00
-
浏览量:839次2023-11-22 14:07:08
-
浏览量:7896次2024-01-04 14:35:55
-
浏览量:3006次2022-05-17 09:00:35
-
浏览量:909次2023-12-07 01:07:22
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
刘+
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明