一、RK3568 及触摸屏驱动简介
RK3568 是瑞芯微推出的一款高性能、低功耗的四核应用处理器芯片 ,采用 22nm 先进工艺打造。它集成了四核 64 位 Cortex-A55 CPU,主频最高可达 2.0GHz,能够提供高效稳定的数据处理能力。其 GPU 为 Mail-G52,支持 OpenGLES 1.1/2.0/3.2、OpenCL2.0 以及 Vulkan1.1,具备出色的图形处理能力,能够流畅运行各种图形界面和多媒体应用。RK3568 还集成了高效能 AI 加速器 RKNN NPU,拥有 1Tops 算力,支持 Caffe/TensorFlow 等主流架构模型的一键切换,为 AI 应用提供了强大的支持。在视频编解码方面,它支持 4K 60fps H.265/H.264/VP9 视频解码以及 1080P 60fps H.265/H.264 视频编码,满足了高清视频处理的需求。
凭借这些强大的性能,RK3568 在物联网网关、NVR 存储、工控平板、车载中控、视频会议一体机、广告机、云终端、NAS 服务器等众多领域得到了广泛应用。以物联网网关为例,RK3568 可以高效地处理和转发大量的物联网设备数据;在工控平板中,它能够稳定运行各种工业控制软件,确保工业生产的顺利进行。
触摸屏驱动作为连接触摸屏硬件和操作系统的桥梁,在设备交互中起着举足轻重的作用。当用户触摸屏幕时,触摸屏会将触摸信息转换为电信号,触摸屏驱动则负责将这些电信号转换为操作系统能够理解的输入事件,如点击、滑动、缩放等。如果触摸屏驱动适配不当,就会出现触摸不灵敏、触摸位置不准确、多点触摸功能异常等问题,严重影响用户体验。因此,为了充分发挥 RK3568 设备的性能,实现良好的人机交互,对触摸屏驱动进行适配是至关重要的工作。
二、前期准备
2.1 硬件环境搭建
在进行 RK3568 触摸屏驱动适配前,确保硬件连接正确是至关重要的。RK3568 开发板与触摸屏的连接方式通常取决于触摸屏的接口类型,常见的有 I2C、SPI 和 USB 等。以 I2C 接口的触摸屏为例,连接步骤如下:
- 断电操作:在连接硬件之前,务必先将 RK3568 开发板和触摸屏的电源关闭,防止在连接过程中发生短路等意外情况损坏设备。
- 连接 SDA 和 SCL 引脚:将触摸屏的 I2C 数据线(SDA)连接到 RK3568 开发板对应的 I2C SDA 引脚,将触摸屏的 I2C 时钟线(SCL)连接到开发板对应的 I2C SCL 引脚 。这两根线负责在开发板和触摸屏之间传输数据和时钟信号,确保数据的准确传输。
- 连接电源引脚:将触摸屏的电源正极(VCC)连接到开发板的 3.3V 或 5V 电源输出引脚(具体取决于触摸屏的工作电压要求),将触摸屏的电源负极(GND)连接到开发板的地引脚。稳定的电源供应是触摸屏正常工作的基础。
- 连接中断引脚(可选):如果触摸屏支持中断功能,将触摸屏的中断引脚(INT)连接到 RK3568 开发板的一个通用输入输出(GPIO)引脚,用于在触摸事件发生时向开发板发送中断信号,以便及时处理触摸事件。
在连接过程中,需要注意以下几点:
- 引脚对应:仔细对照 RK3568 开发板和触摸屏的硬件手册,确保每根线都连接到正确的引脚,避免因引脚连接错误导致设备无法正常工作甚至损坏。
- 排线连接:如果使用排线进行连接,要确保排线插紧,避免出现接触不良的情况。可以轻轻晃动排线,检查是否牢固。
- 静电防护:在操作过程中,尽量佩戴防静电手环,防止人体静电对敏感的电子元件造成损害。
- 电源稳定性:确保开发板的电源供应稳定,避免因电源波动影响触摸屏的正常工作。可以使用质量可靠的电源适配器,并检查电源输出是否符合要求。
2.2 软件资源获取
- 获取 RK3568 官方 SDK:
-
- 官网下载:访问瑞芯微官方网站,在产品支持页面找到 RK3568 相关的 SDK 下载链接。根据需求选择对应的操作系统版本(如 Android、Linux 等)的 SDK 进行下载。例如,如果要在 Linux 系统下进行开发,就下载 Linux 版本的 SDK。
-
- Git 仓库获取:瑞芯微也提供了 Git 仓库供开发者获取 SDK 代码。可以使用以下命令克隆 SDK 仓库(假设仓库地址为ssh://git@www.rockchip.com.cn:2222/repo - release/tools/repo):
git clone ssh://git@www.rockchip.com.cn:2222/repo - release/tools/repo
克隆完成后,按照官方文档的指导进行初始化和同步操作,以获取完整的 SDK 代码。
2. 获取触摸屏驱动源码:
- 厂商提供:联系触摸屏厂商,获取针对 RK3568 平台的触摸屏驱动源码。有些厂商可能会直接提供驱动文件,有些则可能需要在其官方网站的下载中心或技术支持渠道获取。
- 开源社区:在一些开源社区(如 GitHub、GitLab 等)上搜索相关的触摸屏驱动项目。部分开源项目可能已经针对 RK3568 进行了适配或提供了参考代码,可以根据实际情况进行下载和修改。
- 下载和准备工作要点:
-
- 版本匹配:确保获取的 SDK 和触摸屏驱动源码版本与使用的 RK3568 硬件版本以及目标操作系统版本相匹配。不匹配的版本可能会导致编译错误或驱动无法正常工作。
-
- 解压和整理:下载完成后,将 SDK 和驱动源码解压到合适的目录,并按照一定的目录结构进行整理,方便后续的开发和管理。例如,可以在用户主目录下创建一个专门的工作目录,如~/rk3568_project,将 SDK 解压到该目录下,然后在该目录下再创建一个drivers目录用于存放触摸屏驱动源码。
-
- 安装依赖包:根据 SDK 和驱动源码的编译要求,安装相应的依赖包。在 Linux 系统下,通常需要安装一些编译工具(如 GCC、Make 等)和库文件(如 libncurses5 - dev 等)。可以使用包管理器(如 apt、yum 等)进行安装,例如在 Ubuntu 系统下安装依赖包的命令如下:
sudo apt - get update
sudo apt - get install build - essential libncurses5 - dev
完成软件资源的获取和准备工作后,就可以进入下一步的驱动适配和开发工作了。
三、设备树配置
3.1 查看原理图确定连接节点
在进行设备树配置之前,仔细查看硬件原理图是至关重要的一步。原理图就像是硬件系统的 “地图”,它详细地展示了触摸屏与 RK3568 开发板之间的连接关系。通过查看原理图,我们可以明确触摸屏是挂载在 I2C 总线还是 SPI 总线上,以及具体的挂载节点信息。
以 I2C 接口的触摸屏为例,假设在原理图中看到触摸屏的 SDA 线连接到 RK3568 开发板的 I2C1_SDA 引脚,SCL 线连接到 I2C1_SCL 引脚,这就表明触摸屏挂载在 RK3568 的 I2C1 总线上。同时,原理图还会标注出触摸屏的设备地址,比如常见的 0x38。这些信息对于后续在设备树中准确配置触摸屏节点是不可或缺的。
除了 I2C 和 SPI 总线相关信息外,原理图还会提供触摸屏的中断引脚(IRQ)和复位引脚(RST)连接到 RK3568 开发板的哪个 GPIO 引脚。例如,中断引脚连接到 GPIO0_PB5,复位引脚连接到 GPIO0_PB6。这些 GPIO 引脚的信息在设备树中用于配置中断和复位功能,确保触摸屏能够正常响应触摸事件和进行复位操作。
3.2 设备树节点添加与配置
在确定了触摸屏的硬件连接信息后,接下来就是在设备树中添加相应的设备节点并进行配置。设备树是一种描述硬件设备信息的数据结构,它以树形结构的方式组织各种硬件设备的属性和连接关系。在 Linux 系统中,内核会解析设备树来识别和初始化硬件设备。
对于 I2C 接口的触摸屏,在设备树中添加节点的一般格式如下:
&i2c1 {
status = "okay";
touchscreen@38 {
status = "okay";
compatible = "focaltech,fts";
reg = <0x38>;
focaltech,irq-gpio = <&gpio0 RK_PB5 IRQ_TYPE_LEVEL_LOW>;
focaltech,reset-gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
focaltech,max-touch-number = <5>;
focaltech,display-coords = <0 0 1280 800>;
};
};
下面对上述节点中的各个属性进行详细解析:
- status:该属性用于表示设备的状态,"okay" 表示设备正常可用。如果将其设置为 "disabled",则表示该设备在系统启动时不会被初始化。
- compatible:这是一个非常重要的属性,用于驱动与设备的匹配。在上述例子中,"focaltech,fts" 表示该设备与 focaltech 触摸屏驱动兼容。当内核加载驱动时,会根据这个属性来查找并匹配相应的驱动程序。如果 compatible 属性设置错误,驱动将无法正确识别和加载设备。
- reg:表示设备在 I2C 总线上的地址,这里是 0x38。这个地址必须与原理图中触摸屏的实际 I2C 地址一致,否则内核无法正确与触摸屏进行通信。
- focaltech,irq-gpio:指定触摸屏的中断引脚。<&gpio0 RK_PB5 IRQ_TYPE_LEVEL_LOW> 表示中断引脚连接到 gpio0 的 PB5 引脚,并且采用低电平触发中断。在驱动程序中,会根据这个配置来申请和处理中断,当触摸屏有触摸事件发生时,通过该中断引脚向 RK3568 开发板发送中断信号,通知内核进行处理。
- focaltech,reset-gpio:指定触摸屏的复位引脚。<&gpio0 RK_PB6 GPIO_ACTIVE_HIGH> 表示复位引脚连接到 gpio0 的 PB6 引脚,并且是高电平有效。在系统启动或需要对触摸屏进行复位操作时,驱动会通过这个引脚控制触摸屏的复位。
- focaltech,max-touch-number:表示触摸屏支持的最大触摸点数,这里设置为 5,即该触摸屏最多可以同时识别 5 个触摸点。这个属性对于支持多点触摸的触摸屏非常重要,它决定了驱动程序能够处理的最大触摸点数量。
- focaltech,display-coords:用于设置触摸屏的显示分辨率。<0 0 1280 800> 表示触摸屏的最小 X 坐标为 0,最小 Y 坐标为 0,最大 X 坐标为 1280,最大 Y 坐标为 800。这个配置确保触摸屏的触摸坐标与屏幕显示坐标能够正确映射,使得用户的触摸操作能够准确地反映在屏幕上。
如果是 SPI 接口的触摸屏,设备树节点的配置会有所不同,例如:
&spi0 {
status = "okay";
touchscreen@0 {
status = "okay";
compatible = "goodix,gt911";
reg = <0>;
spi-max-frequency = <1000000>;
interrupt-parent = <&gpio1>;
interrupts = <2 IRQ_TYPE_LEVEL_HIGH>;
reset-gpios = <&gpio1 3 GPIO_ACTIVE_LOW>;
cs-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
};
};
在这个 SPI 触摸屏的设备树节点中:
- spi-max-frequency:设置 SPI 总线的最大通信频率,这里设置为 1MHz。合适的通信频率对于保证触摸屏与开发板之间的数据传输稳定性和速度非常重要,如果频率设置过高或过低,都可能导致数据传输错误或触摸屏响应迟缓。
- interrupt-parent:指定中断控制器,这里表示中断由 gpio1 控制。
- interrupts:指定中断引脚和触发方式,<2 IRQ_TYPE_LEVEL_HIGH> 表示中断引脚为 gpio1 的第 2 个引脚,采用高电平触发中断。
- reset-gpios:指定复位引脚,<&gpio1 3 GPIO_ACTIVE_LOW> 表示复位引脚为 gpio1 的第 3 个引脚,低电平有效。
- cs-gpios:指定片选信号引脚,<&gpio1 4 GPIO_ACTIVE_LOW> 表示片选信号引脚为 gpio1 的第 4 个引脚,低电平有效。在 SPI 通信中,片选信号用于选择具体的设备,确保数据能够准确地传输到目标设备。
四、驱动文件配置
4.1 主要驱动文件介绍
在 RK3568 触摸屏驱动适配过程中,涉及到多个关键的驱动文件,这些文件协同工作,共同实现触摸屏的各项功能。以常见的 FocalTech 触摸屏驱动为例,主要驱动文件包括focaltech_core.c和focaltech_core.h ,它们在驱动中发挥着核心作用。
focaltech_core.c是驱动的主要实现文件,包含了大量的函数和逻辑代码,负责完成触摸屏驱动与硬件设备之间的交互以及各种功能的实现。其中,fts_gpio_configure函数是一个非常重要的函数,它主要用于配置 FocalTech 触摸屏的 GPIO(通用输入输出)引脚。在这个函数中,会读取设备树中配置的 GPIO 引脚信息,例如中断引脚和复位引脚。通过gpio_request函数向内核申请使用这些 GPIO 引脚,确保其他驱动不会占用相同的引脚资源。然后,使用gpio_direction_input或gpio_direction_output函数设置引脚的输入输出方向,以满足触摸屏的工作需求。如果引脚配置过程中出现错误,会通过FTS_ERROR宏输出错误信息,并进行相应的错误处理,例如释放已经申请的 GPIO 引脚,以保证系统的稳定性。
focaltech_core.h是头文件,主要用于定义 TP 驱动程序的功能。它使用#define指令定义了许多私有常量和宏,这些常量和宏在驱动程序中起到了关键的作用。例如,#define FTS_MAX_POINTS_SUPPORT 10定义了触摸屏支持的最大触摸点数为 10,这个常量在驱动程序中用于限制和处理多点触摸事件,确保驱动能够正确识别和处理最多 10 个触摸点的输入。再如,#define FTS_MAX_KEYS 4定义了触摸屏支持的最大按键数量为 4,这对于一些带有触摸按键的触摸屏设备来说,能够帮助驱动程序准确地处理按键事件。此外,focaltech_core.h中还定义了一些结构体和枚举类型,用于组织和表示触摸屏驱动中的数据结构和状态,为focaltech_core.c中的函数提供了必要的数据类型支持。
除了这两个核心文件外,可能还会有其他辅助文件,如focaltech_i2c.c(如果是 I2C 接口的触摸屏),它负责实现与 I2C 总线相关的通信功能,包括 I2C 设备的探测、数据的读写等操作;focaltech_spi.c(如果是 SPI 接口的触摸屏),则主要实现 SPI 总线通信相关的功能,如 SPI 设备的初始化、数据传输等。这些文件相互配合,共同完成触摸屏驱动的各项功能。
4.2 驱动文件的修改与移植
- GPIO 引脚配置修改:
-
- 参考设备树配置:在设备树中,我们已经配置了触摸屏的中断引脚和复位引脚等 GPIO 信息。在驱动文件focaltech_core.c中,需要确保fts_gpio_configure函数能够正确读取这些配置信息。例如,如果设备树中配置中断引脚为focaltech,irq-gpio = <&gpio0 RK_PB5 IRQ_TYPE_LEVEL_LOW>,那么在fts_gpio_configure函数中,通过gpio_is_valid(data->pdata->irq_gpio)来检查引脚是否有效,然后使用gpio_request和gpio_direction_input函数对该引脚进行申请和设置为输入方向,以接收触摸屏的中断信号。
-
- 根据硬件实际连接调整:如果硬件连接发生变化,例如中断引脚从 GPIO0_PB5 改为 GPIO1_PC2,那么不仅要在设备树中修改相应的配置,还要在focaltech_core.c中找到与中断引脚配置相关的代码部分,将其修改为正确的引脚信息。同时,要确保修改后的引脚配置与硬件原理图一致,避免出现引脚冲突或错误配置导致触摸屏无法正常工作。
- 常量宏定义修改:
-
- 最大触摸点数调整:如果实际使用的触摸屏支持的最大触摸点数与focaltech_core.h中定义的FTS_MAX_POINTS_SUPPORT不一致,就需要修改这个宏定义。例如,实际触摸屏只支持 5 点触摸,而原定义为 10,那么将#define FTS_MAX_POINTS_SUPPORT 10修改为#define FTS_MAX_POINTS_SUPPORT 5。这样,驱动程序在处理触摸事件时,就会按照正确的最大触摸点数进行处理,避免出现多余的触摸点识别错误或资源浪费。
-
- 其他宏定义根据需求修改:根据实际的硬件特性和应用需求,可能还需要修改其他宏定义。比如,如果触摸屏的通信频率有特殊要求,而驱动中定义的通信频率相关宏不能满足需求,就需要进行相应的修改。在修改宏定义时,要充分了解其在驱动程序中的作用和影响,避免因修改不当导致驱动功能异常。
- 驱动包移植步骤:
-
- 拷贝驱动文件:将触摸屏厂商提供的驱动包解压后,将整个驱动文件目录拷贝到 RK3568 内核源码的./kernel/drivers/input/touchscreen目录下。例如,如果驱动包解压后得到focaltech_touch目录,里面包含了所有的驱动文件,就将该目录拷贝到上述指定目录。
-
- 修改 Makefile 和 Kconfig:在touchscreen目录下,修改Makefile文件,添加如下内容:obj-$(CONFIG_TOUCHSCREEN_FTS)+= focaltech_touch/,这告诉内核在编译时,如果配置了CONFIG_TOUCHSCREEN_FTS,就编译focaltech_touch目录下的驱动文件。同时,修改Kconfig文件,添加source "drivers/input/touchscreen/focaltech_touch/Kconfig",这样内核配置工具在运行时就会读取focaltech_touch目录下的Kconfig文件,以便对该驱动进行配置。
-
- 在rockchip_defconfig中添加配置:在kernel/arch/arm64/configs/rockchip_defconfig文件中添加CONFIG_TOUCHSCREEN_FTS=y和CONFIG_TOUCHSCREEN_FTS_DIRECTORY="focaltech_touch",表示将触摸屏驱动编译进内核,并指定驱动文件所在目录。这样,在编译内核时,就会将触摸屏驱动一起编译,生成包含触摸屏驱动的内核镜像文件。
通过以上对驱动文件的修改和移植步骤,可以使触摸屏驱动更好地适配 RK3568 平台,确保触摸屏在该平台上能够正常工作。在实际操作过程中,要仔细检查每一个修改点,确保修改的准确性和完整性,避免因疏忽导致驱动适配失败。
五、内核配置与编译
5.1 使能触摸屏驱动相关配置
在 RK3568 内核配置中,使能触摸屏驱动相关选项是确保驱动能够正常工作的关键步骤。首先,进入内核配置界面。在 RK3568 SDK 的根目录下,打开终端并执行以下命令:
cd kernel
make ARCH=arm64 menuconfig
这将打开一个基于文本的内核配置菜单,通过上下箭头键、回车键等操作进行配置选择。
在配置菜单中,找到与触摸屏驱动相关的配置路径。一般来说,触摸屏驱动的配置选项位于 “Device Drivers” -> “Input device support” -> “Touchscreens” 目录下 。在这个目录中,有许多不同类型的触摸屏驱动选项,根据实际使用的触摸屏型号和驱动,选择相应的选项并将其设置为 “”(表示编译进内核)或 “M”(表示编译为模块)。例如,如果使用的是 FocalTech 触摸屏,找到 “FocalTech Touchscreen driver” 选项并将其设置为 “”,这样在编译内核时,该触摸屏驱动就会被包含在内核中。
除了基本的驱动选项外,还可能需要配置一些与触摸屏相关的其他选项,如中断配置、电源管理配置等。在 “Device Drivers” -> “Interrupt Controller Support” 目录下,可以配置与触摸屏中断相关的选项,确保中断能够正确处理触摸事件。在 “Power management and ACPI options” 目录下,可以配置与触摸屏电源管理相关的选项,例如设置触摸屏在闲置一段时间后进入低功耗模式,以节省电量。这些额外的配置选项对于优化触摸屏的性能和稳定性非常重要,需要根据实际需求进行合理设置。
5.2 编译内核及生成镜像
完成内核配置后,就可以开始编译内核了。在终端中执行以下命令进行内核编译:
make ARCH=arm64 -j$(nproc)
其中,ARCH=arm64指定了编译的目标架构为 64 位 ARM 架构,这是 RK3568 所采用的架构;-j$(nproc)表示使用系统的所有 CPU 核心进行并行编译,这样可以大大加快编译速度。编译过程可能会持续一段时间,具体时间取决于计算机的性能和内核代码的大小。在编译过程中,终端会输出大量的编译信息,包括编译的文件、进度等。如果编译过程中出现错误,会显示错误信息,需要根据错误提示进行排查和解决。
常见的编译错误及解决方法如下:
- 缺少依赖包:如果编译过程中提示缺少某个依赖包,例如 “fatal error: xxx.h: No such file or directory”,表示系统缺少相应的开发包。可以使用包管理器进行安装,在 Ubuntu 系统下,使用sudo apt - get install xxx - dev命令进行安装,其中 “xxx - dev” 是缺少的依赖包的开发版本。
- 语法错误:如果错误提示是某个源文件中的语法错误,需要打开相应的源文件,根据错误提示修改代码。例如,可能是缺少分号、括号不匹配等简单的语法问题。
- 配置错误:如果是因为内核配置不当导致的编译错误,例如某个配置选项设置错误,可以重新进入内核配置界面(使用make ARCH=arm64 menuconfig命令),检查并修改相关配置。
编译完成后,会生成多个镜像文件,其中与触摸屏驱动相关的主要是boot.img镜像文件 。boot.img是启动镜像,它包含了内核映像(Image)和设备树(dtb)等重要文件,用于启动设备。内核映像包含了内核的代码和数据,是系统运行的核心部分;设备树则描述了硬件设备的信息,如触摸屏的设备节点、引脚配置等,内核在启动时会解析设备树来识别和初始化硬件设备。通过将boot.img烧录到 RK3568 开发板中,就可以使开发板加载包含触摸屏驱动的内核,从而实现触摸屏的正常工作。此外,还可能生成其他镜像文件,如resource.img(包含设备树文件 dtb、logo 图片等)、uboot.img(U - Boot 引导程序镜像)等,它们在系统启动和运行过程中也都起着不可或缺的作用。
六、调试与优化
6.1 调试工具与方法
在 RK3568 触摸屏驱动适配过程中,调试工具对于定位和解决问题起着至关重要的作用。下面介绍几种常用的调试工具及使用方法。
- 串口调试助手:串口调试助手是一种常用的调试工具,它通过串口连接 RK3568 开发板和计算机,实现两者之间的通信。在触摸屏驱动调试中,它主要用于获取设备的启动信息、内核日志以及与设备进行交互。
-
- 连接与设置:首先,使用 USB 转 TTL 模块将 RK3568 开发板的串口引脚(一般为 TXD、RXD、GND)连接到计算机的 USB 接口。然后,打开串口调试助手(如 PuTTY、minicom 等),设置串口号(根据实际连接的端口选择)、波特率(通常为 115200)、数据位(一般为 8 位)、停止位(1 位)和校验位(无校验)。
-
- 获取日志信息:在设备启动过程中,通过串口调试助手可以实时查看设备的启动日志,包括内核初始化信息、驱动加载信息等。这些信息对于判断触摸屏驱动是否正确加载以及是否存在硬件问题非常有帮助。例如,如果在日志中看到 “focaltech touchscreen driver: probe successful”,则表示触摸屏驱动已成功探测到设备;如果出现 “error: unable to allocate memory for touchscreen driver”,则提示驱动在内存分配时出现错误,需要进一步排查。
-
- 发送命令与交互:串口调试助手还可以向设备发送命令,进行一些简单的测试和调试操作。比如,可以通过串口发送命令来读取触摸屏的寄存器值,检查触摸屏的工作状态。以 I2C 接口的触摸屏为例,使用 “i2cget -f 1 0x38 0x80” 命令(假设触摸屏 I2C 地址为 0x38,要读取的寄存器地址为 0x80),通过串口调试助手发送该命令到设备,就可以从设备返回的信息中获取该寄存器的值,从而判断触摸屏的相关配置是否正确。
- 内核日志查看工具:内核日志是记录内核运行时各种事件和信息的重要文件,通过查看内核日志可以深入了解触摸屏驱动的运行情况。
-
- dmesg 命令:在 Linux 系统中,dmesg 命令是查看内核日志的常用工具。在 RK3568 设备上,直接在终端输入 “dmesg” 命令,就可以显示内核启动以来的所有日志信息。在触摸屏驱动调试中,可以通过搜索关键字(如 “touchscreen”“focaltech” 等)来快速定位与触摸屏相关的日志。例如,当触摸屏出现触摸无反应的问题时,查看 dmesg 日志,如果发现 “focaltech touchscreen: no interrupt received”,这表明触摸屏的中断信号可能没有正确传输,需要检查中断引脚连接和驱动中的中断配置。
-
- syslogd 和 rsyslogd:syslogd 和 rsyslogd 是 Linux 系统中用于管理系统日志的守护进程,它们可以将内核日志和其他系统日志记录到指定的文件中。在 RK3568 设备上,可以通过配置这些守护进程,将触摸屏驱动相关的日志记录到特定文件,方便后续查看和分析。例如,在 “/etc/rsyslog.conf” 文件中添加 “kern.* /var/log/kernel.log”,这样所有内核日志(包括触摸屏驱动相关日志)都会被记录到 “/var/log/kernel.log” 文件中。使用 “tail -f /var/log/kernel.log” 命令可以实时跟踪该文件的更新,及时获取最新的日志信息。
- I2C Tools 工具:对于 I2C 接口的触摸屏,I2C Tools 工具集是非常有用的调试工具,它包含多个命令用于检测和操作 I2C 设备。
-
- i2cdetect:该命令用于检测 I2C 总线上连接的设备。使用 “i2cdetect -y 1” 命令(假设触摸屏连接到 I2C1 总线),可以扫描 I2C1 总线上的所有设备地址。如果触摸屏正常连接且工作,在输出结果中会显示其设备地址(如 0x38)。如果没有显示预期的设备地址,则可能是硬件连接问题或触摸屏未正常工作。
-
- i2cdump:i2cdump 命令可以读取 I2C 设备上所有寄存器的值。例如,使用 “i2cdump -f -a 1 0x38” 命令(强制使用设备地址 0x38,读取整个地址范围),可以获取触摸屏的寄存器数据。通过分析这些数据,可以了解触摸屏的工作状态、配置信息等。如果发现某些关键寄存器的值与预期不符,就需要进一步检查驱动配置或触摸屏硬件是否存在故障。
-
- i2cset 和 i2cget:i2cset 命令用于向 I2C 设备的特定寄存器写入数据,i2cget 命令用于从 I2C 设备的指定寄存器中读取数据。在调试过程中,可以使用这些命令来修改触摸屏的配置寄存器,然后通过读取寄存器值来验证修改是否成功,从而排查驱动与触摸屏之间的通信和配置问题。
6.2 常见问题及解决方法
在调试 RK3568 触摸屏驱动时,可能会遇到各种问题,以下是一些常见问题及对应的解决思路和方法。
- 触摸无反应:
-
- 硬件连接问题:首先检查触摸屏与 RK3568 开发板之间的硬件连接是否牢固,是否存在松动、接触不良的情况。仔细查看排线是否插紧,各个引脚是否连接正确。可以重新插拔排线,确保连接可靠。同时,检查触摸屏的电源供应是否正常,使用万用表测量触摸屏的电源引脚电压,确保其符合触摸屏的工作电压要求。如果电源电压异常,检查电源电路和电源适配器是否存在故障。
-
- 驱动加载问题:查看内核日志(使用 dmesg 命令),检查触摸屏驱动是否正确加载。如果驱动加载失败,日志中会显示相关错误信息,如 “module not found”“probe failed” 等。根据错误提示进行排查,可能是驱动文件路径配置错误、设备树中触摸屏节点配置不正确或者驱动编译时出现问题。检查设备树中触摸屏节点的 compatible 属性是否与驱动中的 compatible 字符串匹配,以及中断引脚、复位引脚等配置是否正确。如果是驱动编译问题,重新检查编译环境和编译命令,确保驱动文件正确编译。
-
- 中断问题:触摸无反应可能是由于触摸屏的中断信号未正确传输到 RK3568 开发板。检查设备树中中断引脚的配置是否正确,在驱动中是否正确申请和处理中断。使用示波器或逻辑分析仪测量中断引脚的电平变化,当触摸屏幕时,中断引脚应该有相应的电平跳变。如果没有跳变,检查中断引脚的连接、触摸屏的中断设置以及驱动中的中断处理函数是否正确。
- 报点异常:
-
- 校准问题:报点异常可能是触摸屏的坐标校准出现问题。在 Linux 系统中,可以使用校准工具(如 ts_calibrate)对触摸屏进行校准。运行校准工具后,按照提示在屏幕上依次点击校准点,校准工具会根据点击的位置计算并更新触摸屏的校准参数。如果校准后仍然报点异常,检查校准工具是否正确识别触摸屏设备,以及校准参数是否正确保存和应用。
-
- 驱动配置问题:检查驱动文件中与触摸报点相关的配置参数,如触摸分辨率、触摸点数限制等是否正确。如果触摸分辨率配置与实际屏幕分辨率不一致,会导致报点位置不准确。在设备树中,确认触摸屏的 display - coords 属性设置是否与屏幕实际分辨率一致。在驱动代码中,检查最大触摸点数的配置是否与触摸屏的实际能力相符,如果配置过小,可能会导致多点触摸时报点异常。
-
- 干扰问题:周围环境的电磁干扰可能会影响触摸屏的正常工作,导致报点异常。检查触摸屏周围是否有强电磁干扰源,如大功率电器、无线信号发射设备等。可以尝试将触摸屏设备远离干扰源,或者对触摸屏进行屏蔽处理,以减少干扰的影响。另外,检查触摸屏的接地是否良好,不良的接地也可能导致电磁干扰问题。
- 触摸屏驱动编译错误:
-
- 依赖缺失:如果编译过程中提示缺少某个头文件或库文件,说明系统缺少相应的依赖。使用包管理器(如 apt、yum 等)安装缺少的依赖包。例如,在 Ubuntu 系统中,如果提示缺少 “linux - headers - xxx” 头文件,使用 “sudo apt - get install linux - headers - xxx” 命令进行安装。确保安装的依赖包版本与 RK3568 平台和内核版本兼容。
-
- 语法错误:编译错误可能是由于驱动代码中的语法错误导致的。仔细查看编译错误提示,定位到出错的代码行。常见的语法错误包括缺少分号、括号不匹配、变量未定义等。修正语法错误后,重新编译驱动。在修改代码时,要注意代码的规范性和可读性,避免引入新的错误。
-
- 内核版本不兼容:如果使用的内核版本与触摸屏驱动不兼容,也可能导致编译错误。检查驱动代码是否针对当前使用的 RK3568 内核版本进行了适配。有些驱动可能需要根据内核版本的变化进行相应的修改,如函数接口的变化、数据结构的调整等。可以参考驱动厂家提供的文档或社区资源,了解针对特定内核版本的驱动适配方法。
6.3 性能优化建议
为了提升 RK3568 触摸屏驱动的性能,以下是一些优化建议。
- 提高触摸响应速度:
-
- 优化中断处理:在触摸屏驱动中,中断是触发触摸事件处理的关键机制。优化中断处理函数,使其能够快速响应中断并处理触摸事件。减少中断处理函数中的不必要操作,将一些复杂的处理逻辑放到工作队列或线程中进行,以避免中断处理时间过长影响触摸响应速度。例如,可以将触摸数据的解析和上报等操作放到工作队列中,中断处理函数只负责接收中断信号并将触摸数据放入工作队列,这样可以尽快释放中断,提高系统对后续触摸事件的响应能力。
-
- 优化数据传输:对于 I2C 或 SPI 接口的触摸屏,优化数据传输过程可以显著提高触摸响应速度。合理设置 I2C 或 SPI 总线的时钟频率,在保证数据传输稳定性的前提下,适当提高时钟频率可以加快数据传输速度。同时,减少数据传输的冗余,优化数据格式和传输协议,确保每次传输的数据都是必要的。例如,在 I2C 通信中,可以采用批量数据传输的方式,减少通信次数,提高数据传输效率。
- 优化中断处理:
-
- 中断合并与延迟处理:如果触摸屏频繁产生中断,可能会导致系统频繁响应中断,影响系统性能。可以采用中断合并和延迟处理的方法,将多个连续的中断合并为一次处理,减少中断处理的次数。在驱动中设置一个中断延迟时间,当有新的中断到来时,如果距离上次中断处理的时间小于延迟时间,则将新的中断事件缓存起来,等待延迟时间结束后统一处理。这样可以避免因频繁中断导致的系统开销过大。
-
- 中断优先级设置:根据系统的需求,合理设置触摸屏中断的优先级。如果触摸屏的触摸事件对系统的实时性要求较高,可以将其中断优先级设置为较高优先级,确保系统能够及时响应触摸事件。在 Linux 系统中,可以通过修改设备树或在驱动代码中使用相关函数来设置中断优先级。但要注意,过高的中断优先级可能会影响其他设备的正常工作,因此需要根据实际情况进行权衡和调整。
- 内存管理优化:
-
- 合理分配内存:在触摸屏驱动中,需要为触摸数据、缓冲区等分配内存。合理规划内存的分配,避免内存碎片化和浪费。根据触摸屏的最大触摸点数、数据传输量等因素,预先计算好所需的内存大小,并一次性分配足够的内存。例如,在驱动中为触摸数据缓冲区分配内存时,可以使用 kmalloc 函数,并根据最大触摸点数和每个触摸点的数据大小来确定分配的内存块大小。
-
- 及时释放内存:当不再需要某些内存资源时,及时释放内存,避免内存泄漏。在驱动的卸载函数或相关资源释放函数中,确保正确释放所有已分配的内存。例如,在触摸屏驱动卸载时,使用 kfree 函数释放之前分配的触摸数据缓冲区内存,以保证系统内存的有效利用。
- 代码优化:
-
- 算法优化:对驱动中的触摸数据处理算法进行优化,提高算法的效率和准确性。例如,在触摸点识别和跟踪算法中,可以采用更高效的算法来减少计算量和处理时间。一些先进的触摸算法能够更好地处理多点触摸、触摸抖动等问题,提高触摸识别的准确性和稳定性。
-
- 减少不必要的计算和操作:仔细审查驱动代码,去除不必要的计算和操作。例如,在触摸数据处理过程中,如果某些计算结果在后续的处理中不会被使用,可以直接跳过这些计算。同时,避免在循环中进行复杂的函数调用和大量的内存访问操作,尽量将这些操作移到循环外部,以减少循环执行的时间开销。
七、总结与展望
在 RK3568 平台上进行触摸屏驱动适配是一项复杂且关键的工作,涵盖了从硬件连接、设备树配置、驱动文件修改到内核编译和调试优化的多个环节。通过正确搭建硬件环境,准确配置设备树节点,细致修改驱动文件并合理进行内核配置与编译,我们能够实现触摸屏在 RK3568 设备上的基本功能。在调试过程中,利用串口调试助手、内核日志查看工具和 I2C Tools 等工具,能够有效定位和解决诸如触摸无反应、报点异常、驱动编译错误等常见问题。同时,通过优化触摸响应速度、中断处理、内存管理和代码算法等方面,可以进一步提升触摸屏驱动的性能。
展望未来,随着物联网、人工智能、工业控制等领域的不断发展,RK3568 设备在更多应用场景中的需求将持续增长,对触摸屏驱动也提出了更高的要求。在物联网智能家居设备中,用户期望通过触摸屏实现更加便捷、精准的控制操作,这就需要触摸屏驱动具备更高的稳定性和响应速度,以适应复杂的家居环境和多样化的用户需求。在工业控制领域,RK3568 设备用于工业自动化生产线的监控和操作,触摸屏驱动需要支持更多的工业标准和协议,确保与其他工业设备的无缝集成,同时要具备强大的抗干扰能力,以保障在恶劣工业环境下的可靠运行。
未来的研究方向可以集中在进一步优化触摸屏驱动的性能和兼容性。在性能优化方面,探索更先进的算法和技术,如人工智能算法在触摸数据处理中的应用,以提高触摸识别的准确性和响应速度;研究如何更好地利用 RK3568 的硬件资源,如 NPU 和 GPU,实现触摸屏驱动的硬件加速,提升整体性能。在兼容性方面,关注不同类型触摸屏和操作系统的发展趋势,提前进行驱动适配研究,确保 RK3568 设备能够支持更多种类的触摸屏,同时更好地兼容新兴的操作系统版本,为用户提供更广泛的选择和更好的使用体验。通过不断的研究和优化,RK3568 触摸屏驱动将在更多领域发挥重要作用,推动相关行业的发展。