前言

起因是想移植 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 supportGoodix GT9xx Tools for debuging,我们用不带,按 n 间取消它

在这里插入图片描述

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

在这里插入图片描述

保存退出,编译 zimage

修改设备树

我是按照 https://blog.csdn.net/weixin_52849254/article/details/130113957 的设备树,完完全全 copy 下来的,gt9147的 pinctrl-0 都写好了,改 status = "okay"; ,并且把原来的 reset-gpiosinterrupt-gpios 改成 goodix,rst-gpiogoodix,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-gpiosinterrupt-gpios 改成 goodix,rst-gpiogoodix,irq-gpio,导致获取不了GPIO,内核提示 [ 3.797674] goodix-ts 1-0014: Failed to get reset gpio,后面也是看了看驱动才知道要改把原来的 reset-gpiosinterrupt-gpios 改成 goodix,rst-gpiogoodix,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;
}
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐