记录一次 gt9xx 屏幕触控驱动移植
前言
起因是想移植 lvgl 到正点原子 imx6ull alpha 的,参考了这篇帖子 https://blog.csdn.net/Leon_Chenl/article/details/139483262 想移植 lvgl9,使用正点原子的工具链编译 lvgl 的测试例程,编译不通过(?忘了)。然后看了博主的 imx6ull 的 linux 内核是 4.9,我想到韦老师(韦东山)板子的内核是 4.9 的,然后下了韦老师的工具链,韦老师使用的交叉编译器版本是 7.5.0,我使用 7.5.0 版本的交叉编译器版本编译了 lvgl,放到 4.1.15 内核的板子上,报错,找不到库,然后我就想可能是使用了不同的编译器导致的,根文件系统是使用 4.9.4 的 gcc 编译的,动态库也是使用 4.9.4 的,由于本人小白,不会编译根文件系统,我是直接拿正点原子移植好的根文件系统使用的,只能硬着头皮学编译根文件系统了,编译根文件系统也是一个大坑,我最终是使用 buildroot-2025.02.x 编译出 busybox-1.37.0 的根文件系统(使用 buildroot 编译根文件系统具体参考我的另外一篇博客)放到板子上,提示 FATAL: kernel too old,根文件系统太新了,我还在使用 4.1.15 的内核,没办法,要升级内核,升级内核也是一个大坑,最终我是根据这篇博客 https://blog.51cto.com/u_13640625/5220819(还要修改设备树!)更新的 5.4 内核,更新内核具体参考我的另外一篇博客。
所以说,现在是除了 uboot 是正点原子原封不动之外,其他都改了 linux 内核使用 5.4 版本,根文件系统使用 1.37.0 版本。一切都搞好了,运行 lvgl 的测试例程,发现触摸不了,发现自带的触摸驱动使用不了,移植了韦老师给出的内核里面的触控驱动,同时根据绑定文档修改了设备树,触摸正常了,接下来是移植步骤
移植 gt9xx 驱动文件
驱动文件在这个目录 /100ask_imx6ull-sdk/Linux-4.9.88/drivers/input/touchscreen/ 的 gt9xx ,把整个 gt9xx 文件夹复制到 /100ask_imx6ull-sdk/linux5.4.2.1/drivers/input/touchscreen/ 目录内
接下来修改 /touchscreen 目录下的 kconfig
source "drivers/input/touchscreen/gt9xx/Kconfig"
把段代码复制到 kconfig 内,随便找个空白的地方复制上去,保存退出
做这步的目的是让我们复制的 gt9xx 驱动可以在 menuconfig 内可见,可以被打开。
使能 gt9xx 驱动
在 menuconfig 内使用 / 查找 gt9 这个词,看看有没有 gt9xx 驱动有没有显示出来,一般是能顺利显示出来的,我们可以看到 Symbol: TOUCHSCREEN_GT9XX [= n] ,我们需要打开这个驱动,驱动所在的位置是-> Device Drivers -> Input device support -> Generic input layer-> Touchscreens
按 y 键使能这个驱动,选上这个驱动后,会顺带给你选上 Goodix GT9xx touch controller auto update support 和 Goodix GT9xx Tools for debuging,我们用不带,按 n 间取消它

顺便把内核自带的驱动取消掉

保存退出,编译 zimage
修改设备树
我是按照 https://blog.csdn.net/weixin_52849254/article/details/130113957 的设备树,完完全全 copy 下来的,gt9147的 pinctrl-0 都写好了,改 status = "okay"; ,并且把原来的 reset-gpios 和 interrupt-gpios 改成 goodix,rst-gpio和 goodix,irq-gpio,这样就没问题了
gt9147:gt9147@14 {
compatible = "goodix,gt9xx";
reg = <0x14>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_tsc
&pinctrl_tsc_reset >;
interrupt-parent = <&gpio1>;
interrupts = <9 0>;
goodix,rst-gpio = <&gpio5 9 GPIO_ACTIVE_LOW>;
goodix,irq-gpio = <&gpio1 9 GPIO_ACTIVE_LOW>;
status = "okay";
};
hexdump也没问题了,正常显示了
最后
这个触控驱动搞了我两天,上课时都在想怎么解决,之前是框框找博客看别人的经验,到后面学会了看内核信息,根据内核信息定位到驱动代码。刚开始的时候我甚至连compatible都忘了改,内核信息就看到 [ 3.722620] <<-GTP-INFO->> GTP driver installing...怎么没有触发probe函数?后面是看了看才发现compatible忘记改了,没办法触发probe,改了之后可以触发porb函数了,但是我并没有把原来的 reset-gpios 和 interrupt-gpios 改成 goodix,rst-gpio和 goodix,irq-gpio,导致获取不了GPIO,内核提示 [ 3.797674] goodix-ts 1-0014: Failed to get reset gpio,后面也是看了看驱动才知道要改把原来的 reset-gpios 和 interrupt-gpios 改成 goodix,rst-gpio和 goodix,irq-gpio。
of_get_named_gpio(np, "goodix,irq-gpio", 0);获取叫 "goodix,irq-gpio"的gpio,但是原来是 interrupt-gpios
static int gtp_parse_dt(struct device *dev)
{
struct device_node *np = dev->of_node;
gtp_int_gpio = of_get_named_gpio(np, "goodix,irq-gpio", 0);
if (!gpio_is_valid(gtp_int_gpio)) {
dev_err(dev, "Failed to get reset gpio\n");
return -1;
}
gtp_rst_gpio = of_get_named_gpio(np, "goodix,rst-gpio", 0);
if (!gpio_is_valid(gtp_rst_gpio)) {
dev_err(dev, "Failed to get reset gpio\n");
return -1;
}
return 0;
}
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)