正点原子Linux C应用编程:移植tslib并使其适配7寸LCD1024*600的GT911触摸驱动

news/2024/11/16 3:33:10/文章来源:https://www.cnblogs.com/yuewusayuri/p/18391503

正点原子Linux C应用编程:移植tslib并使其适配7寸LCD1024*600的GT911触摸驱动

作者在学习【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.4时,发现移植tslib后,触摸事件触发不正常。

使用的硬件版本:正点原子 I.MX6U ALPHA V2.4版本底板LCD:正点原子7寸1024*600,型号ATK-MD0700R-1024600

问题描述与解决过程

教程中老师使用的屏幕是ft5x06驱动,查看本屏幕使用的是goodix汇顶公司的gt911,由于linux内核为笔者自行移植,故无gt的驱动,需要自行添加

1. 先将开发板光盘目录下定位到以下目录

例程源码-出厂源码-linux内核源码-drivers/input/touchscreen/gt9xx.c、gt9xx.h

​ 复制这两个文件,放到自己的linux内核的同目录中

2. 编辑Kconfig文件。把驱动加到内核菜单中

vim drivers/input/touchscreen/Kconfig
打开Kconfig,如果没有vim就使用vi、nano:350
定位到350行

将如下的内容添加

config TOUCHSCREEN_GT9XXtristate "GT9XX I2C touchscreen"depends on I2ChelpSay Y here if you have the GT9XX touchscreen connected to yoursystem.If unsure, say N.To compile this driver as a module, choose M here: themodule will be called gt9xx.

切记,一定要对齐,参考上下文的格式Kconfig 对格式的检查很严格,否则在编译的时候会报错。

这让我想起了之前编辑linux内核某些c文件时,使用双斜杠//注释会导致编译器报错,同时在for循环中定义变量也是从 C99 标准开始引入的.

在 C 语言中,// 用于单行注释,这是从 C99 标准开始引入的。C99 之前的版本,如 C90(也称为 ANSI C 或 ISO C90),只支持多行注释,即使用 /* 开始和 */ 结束的注释。

所以在修改代码的时候一定要关注内核使用的编译器编译时遵循的具体语言标准!
Kconfig 是 Linux 内核配置系统的一部分,它用于在构建内核时选择要编译的配置选项。Kconfig 文件包含了内核中各种特性、驱动程序和子系统的配置选项,允许开发者根据需要选择启用或禁用特定的功能。

只有配置了Kconfig中GT芯片的部分,在内核目录下执行make menuconfig才能在模块的编译选项中选择把对应的模驱动编译进内核

下面是对上面Kconfig代码的具体解释

  1. config TOUCHSCREEN_GT9XX:这是配置项的名称,TOUCHSCREEN_GT9XX 是该配置项的标识符。
  2. tristate "GT9XX I2C touchscreen":这定义了配置项的类型为三态(tristate),意味着该选项可以被设置为 Y(是,内置于内核)、M(模块,作为可加载模块)、N(否,不编译)。
  3. depends on I2C:这表示该配置项依赖于 I2C 配置项。如果 I2C 没有被选中,这个触摸屏驱动的配置项也不会出现。
  4. help:这是帮助文本,为开发者提供了关于该配置项的额外信息。
    • 如果你的系统中连接了 GT9XX 触摸屏,请在这里选择 Y。
    • 如果你不确定,在这里选择 N。
    • 如果你想将这个驱动编译为一个模块,请在这里选择 M。编译后的模块将被称为 gt9xx

添加后大概是这样的:

3. 编辑Makefile文件

vim drivers/input/touchscreen/Makefile

添加如下代码

obj-$(CONFIG_TOUCHSCREEN_GT9XX)         += gt9xx.o

含义和作用如下:

  • obj-$(CONFIG_TOUCHSCREEN_GT9XX):条件语句,检查内核配置中是否定义了 CONFIG_TOUCHSCREEN_GT9XX 宏。这个宏在内核配置菜单中设置,用于决定是否包含 GT9XX 触摸屏驱动。
  • +=:这个操作符用于向变量 obj 添加新的对象文件。如果条件语句为真(即 CONFIG_TOUCHSCREEN_GT9XX 被设置为 ym),则执行 += 操作。
  • gt9xx.o:编译对象文件名。如果 CONFIG_TOUCHSCREEN_GT9XX 启用,gt9xx.o 将被添加到 obj 变量中,它将被编译并包含在最终的内核或模块中。

在内核构建过程中,make menuconfigmake xconfigmake nconfig 命令会生成一个 .config 文件,其中包含了所有配置选项的设置。CONFIG_TOUCHSCREEN_GT9XX 就是其中的一个选项,它在配置菜单的“Device Drivers” -> “Input device support” -> “Touchscreen devices”下。

如果你选择了该选项(设置为 y 表示直接编译进内核,或 m 表示编译为模块),那么 Makefile 中的这行代码就会生效,gt9xx.o 将被编译并包含在内核或模块中。如果没有选择,那么 CONFIG_TOUCHSCREEN_GT9XX 将不被定义,这行代码也不会有任何效果。

menuconfig只是充当了一个有着交互界面的宏开关配置器,Makefile才真正决定具体编译内容,是构建系统的核心

4. 修改menuconfig

执行make menuconfig,进入以下层级,选中GT9XX I2C touchscreen这个宏,为*星号,编译进内核

  1. 编译进内核 (Y/*):该驱动或功能被编译为内核的一部分,在启动时自动加载。意味着该功能或驱动程序将始终可用,会增加内核的大小和启动时间。适用于那些始终需要并且对启动时间不敏感的驱动程序。
  2. 编译为模块 (M):该驱动或功能被编译为一个单独的模块(.ko 文件),在需要时通过 modprobe 命令动态加载到内核中。这种方式允许系统管理员根据需要添加或移除功能,而不必重新编译整个内核。有助于保持内核的整洁和最小化,只有实际需要的模块才会被加载。

我们的触摸屏为了保证每次上电自动初始化,所以将他编译进内核。

5. 修改设备树

vim arch/arm/boot/dts/imx6ull-alientek-emmc.dts

在arch/arm/boot/dts/imx6ull-alientek-emmc.dts设备树i2c2节点下添加gt9xx的节点。

设备树是与硬件连接的通道,它指定了数据传输通过i2c2总线,gt911芯片i2c地址为0x5D,触摸事件的中断引脚和对应的中断号、复位引脚

        goodix_ts@5d {compatible = "goodix,gt9xx";reg = <0x5d>;status = "okay";interrupt-parent = <&gpio1>;interrupts = <9 0>;pinctrl-0 = <&ts_int_pin&ts_reset_pin>;goodix,rst-gpio = <&gpio5 9  GPIO_ACTIVE_LOW>;goodix,irq-gpio = <&gpio1 9  GPIO_ACTIVE_LOW>;};

要检查gpio1 9有没有在其他地方被使用!

/&gpio1 9

该引脚被注册为中断,在芯片检测到有触摸活动会在这个引脚上发出低电平信号,通知CPU以最快的速度读取触摸的手指坐标
如果被其他设备占用,会产生问题。

在iomuxc节点下最后位置添加以下内容,复用为中断!!!:

                ts_int_pin: ts_int_pin_mux {fsl,pins = <MX6UL_PAD_GPIO1_IO09__GPIO1_IO09        0x79>;};

在iomuxc_snvs节点下最后位置添加以下内容,这是复位管脚的复用:

                ts_reset_pin: ts_reset_pin_mux {fsl,pins = <MX6ULL_PAD_SNVS_TAMPER9__GPIO5_IO09     0x79>;};

再检查一次,是否有管脚复用,若没有,执行make编译,拷贝zImage和dtb文件到tftpboot文件夹,上电启动

6. 验证

使用cat /proc/interrupts验证中断号是否被成功注册

可以看到成功注册了中断

再根据【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.4 第十八章 tslib库使用的步骤移植tslib,使用ts_print测试单点触摸,使用ts_test_mt可视化测试触摸屏是否正常!!!

[root@mygo]:~$:ts_print                                                                                                 
7779.538104:    320    400      1                                                                                       
7779.551222:    320    400      1                                                                                       
7779.562483:    320    400      1                                                                                       
7779.574125:    318    399      1                                                                                       
7779.585729:    315    394      1                                                                                       
7779.597377:    310    385      1                                                                           
7779.725341:    335    227      1                                                                                       
7779.736797:    348    215      1    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/790610.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记一次Hyperf定时任务内存异常问题

背景 最近时不时收到 K8S 告警提示项目 POD 出现 OOM 问题,只要触发了项目重新部署或者把 POD 删掉,内存就恢复了,过了一段时间才缓慢增长(基本上要隔几天,这也是这个问题比较难定位和复现的原因) 分析 起初以为是某一个SQL没有限制 limit 或者是程序有死循环把内存跑满了…

河道AI智能视频分析识别系统

河道AI智能视频分析识别系统智能检测方式,智能检测分析河道两边意外违反规定问题,确保人民人身安全问题,河道AI智能视频分析识别系统在初期处理伤害安全性的问题,保证水环境生态安全和人民生命安全安全性,使人和水的影响做到和睦情况,使不足的水源为社会经济的协调发展作…

河道水库雨水情视频监控智能分析系统

河道水库雨水情视频监控智能分析系统可以提升水利枢纽的安全性,这个问题一直是防汛管理方法机构重视的一个主要问题。为加强水利枢纽安全性监管,管理方法单位急需河道水库雨水情视频监控智能分析系统,实时监测降水信息内容,为防汛防灾减灾给予精确、立即的数据信息。系统基…

【运维系列】如何为NETCONF开放安全策略

NETCONF(Network Configuration Protocol,网络配置协议)是一种基于XML的网络管理协议,它提供了一种对网络设备进行配置和管理的可编程方法。NETCONF协议的传输层可以是BEEP、SSH、TLS或SOAP。 由于RFC协议规定必须支持SSH,所以目前SSH是NETCONF使用最广泛的传输层协议,当…

【运维系列】如何为SNMP开放安全策略

SNMP是最广泛使用的网络管理协议。 网管软件作为SNMP Manager,向被管设备中的SNMP Agent发出管理操作的请求。 被管设备在检测到异常时,也会主动向SNMP Manager发送Trap信息。 也就是说,网管软件和被管设备都会主动发起连接,如图 6-1 所示。【图】SNMP典型组网和业务访问关…

MySQL中的group by的意义

这是一道leetcode上数据库的题目,一开始确实是没有想明白哦。

算法-动态规划-多重背包

LeetCode算法刷题 动态规划之多重背包0. 动态规划五部曲:确定dp数组(dp table)以及下标的含义 确定递推公式 dp数组如何初始化 确定遍历顺序 举例推导dp数组

win10更新在哪里,教你怎么打开电脑win10更新

在Windows 10系统中,打开和查看系统更新的位置相对固定,主要通过“设置”应用来完成。以下是详细的步骤说明: 一、打开Windows 10更新 1.通过“开始”菜单打开“设置”: 点击屏幕左下角的“开始”按钮(Windows徽标)。 在弹出的菜单中,选择并点击“设置”图标(一个齿轮形…

[图文直播]基于ZFile和MinIO搭建私有网盘

前言 ZFile 以下是ZFile的官网,上面也涉及到了搭建方法 https://docs.zfile.vip/install/os-windows 此次仅记录本人按照官方的部署方法进行实操验证。 下载 ibm-semeru-open-jdk_x64_windows_8u372b07_openj9-0.38.0.msi zfile-release.jar 具体下载地址见上面的官网 安装部署…

在关卡蓝图中获得actor的信息

在蓝图中想获得actor的属性,可使用get actor of class 如下例子是根据导轨的位置调节场景中定向光的方向。利用以上方法结合曲线编辑器可以计算出当前帧在总帧中的占比,另一个方法是直接用get current time获得运行时间,但是暂时没有找到好的方法直接获得渲染的总时长。

Leangoo领歌Scrum管理工具,轻松实现Scrum敏捷转型

​ 在当今快速变化的商业环境中,企业面临着前所未有的挑战。如何在激烈的竞争中保持领先?如何快速响应市场需求?答案就在于敏捷转型。而在这一过程中,有一个高效的敏捷工具至关重要——Leangoo领歌(Leangoo领歌 - 免费一站式敏捷研发协同平台,Scrum工具,SAFe敏捷工具,敏捷…