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
的判断注释掉。
版权声明:本博客所有文章除特殊声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明出处 litreily的博客!