RK3566触摸驱动产品实战 配置设备树 I2C驱动框架(附源码)

引言:相信大家在学完相关驱动框架很少真正的运用在实际的产品案例中,对设备树以及驱动框架还是非常的陌生,其次就是在编写相关驱动还有完成项目任务时的一些思路的引导,这些都是需要补足的,接下来,我们将之前理论知识与此文章内容结合,真正的将理论运用在实际案例中,形成自己的知识框架体系,运用在工作中。

须知:整个触摸包含了GPIO驱动、中断驱动、i2c驱动、input驱动等,是一个复杂的驱动集合,这些驱动我们以前在驱动文章中也有跟大家探讨过,这一节我们就基于触摸进行分析,有用到相关驱动就浅学一下,主要目的还是把触摸跑起来先会用会调,目前我们常用的Goodix、FocalTech等触摸驱动内核中已经现成的了,所以我们理解框架并掌握调试技巧以后基本上可以把屏幕驱动起来。

目录

硬件

驱动

驱动的位置

驱动配置进内核

配置设备树

中断引脚


硬件

其实吧触摸屏种类有很多我碰到过的有i2c、spi、usb等,其中i2c使用的频率最高大部分的触摸都是i2c的所以我们这里只讲i2c的触摸屏幕。相信你学完这一种方法其他的也能一通百通。

由于笔者用的是泰山派RK3566也就大致的讲一下我的硬件接口,你手里的可能跟我的板载硬件接口不一,具体问题具体分析即可,屏幕端跟据大家选的触摸常见不同对应的座子规格以及线序相应都会不同,跟据我们的经验以及很多厂家的调研,触摸大家都是6根线但就这里6根线大家都不按照标准来,完全按照心情我猜应该有720种不同的线序,所以碰到线序不同的时候我们需要画个转接板,如果你量大也可以让厂家定制开模费几千的样子。

我们主要是根据当前自身的硬件设计一个转接板,如下触摸链接线序:

因此通过设计转接板

如上就是转接板,非常的简单不过多讲解了,主要就是将线序一一对应上,值得注意的是硬件接口位置需要仔细检查一下,不要插排线的时因为硬件的设计导致问题的出现。。

驱动

驱动的位置

安卓和linux的触摸驱动位于都位于 SDK/kernel/drivers/input/touchscreen 目录下这个目录下包含了非常多的常用触摸驱动我们当前的目标就是能够把这些驱动用起来理解框架后面在以此为模板自己在去写一个驱动。

通过屏幕实物上IC的丝印或者屏厂家给的资料我们可以得知,我们案例中这款触摸使用的触摸IC是经典汇顶GT9271,厂家有给触摸参考驱动GT9xx_Driver_for_Android_V2.4_2014112801.rar,因为他很经典我们驱动已经支持了,所以我们直接在触摸驱动目录下找到汇顶相关的触摸驱动来做修改,前期大家如果不熟悉建议就买汇顶的触摸因为驱动比较通用,后面熟悉了以后可以使用其他的触摸并根据触摸厂家提供的参考代码修改移植。

汇顶相关的驱动位于 SDK/kernel/drivers/input/touchscreen/gt9xx 下这个驱动包含兼容了gt9开头的大多数系列,比如gt911、gt910、gt9271等等。

我们主要关注gt9xx.c触摸功能相关的实现、gt9xx.h头文件、Makefile配置文件,其他的.cfggt9xx_cfg.h是用于多芯片兼容,gt9xx_update.cgt9xx_firmware.h固件更新与goodix_tool.c调试的。

以上的流程主要是为了找到驱动的位置,因此我们不管在做任何驱动的时候需要明确驱动的位置。

驱动配置进内核

相关驱动我们都需要观察配置内核的问题了,首先Makefile配置文件就是用来组织编译的,所以我们从SDK/kernel/drivers/input/touchscreen/gt9xx目录下的Makefile开始逐步向上分析。

# SPDX-License-Identifier: GPL-2.0# 使用 GPL-2.0 许可证声明# 将 goodix_gt9xx.o 目标文件添加到编译选项 obj-y 中
obj-y += goodix_gt9xx.o# 将 gt9xx.o 目标文件添加到 goodix_gt9xx-y 目标列表中,用于编译链接
goodix_gt9xx-y += gt9xx.o# 将 gt9xx_update.o 目标文件也添加到 goodix_gt9xx-y 目标列表中,用于编译链接
goodix_gt9xx-y += gt9xx_update.o

SDK/kernel/drivers/input/touchscreen/ 的Makefile

#省略
obj-$(CONFIG_TOUCHSCREEN_GT9XX)     += gt9xx/
#省略

此时我们看到一个宏,CONFIG_TOUCHSCREEN_GT9XX,因此Makefile中就是通过这个变量值来判定是否编译gt9xx的这个变量的值有三个ymn分别对应配置到内核、模块、不打开,我们可以通过暴力手段直接改,但这不是明智之举,适合用于调试阶段。

obj-y     += gt9xx/
obj-m     += gt9xx/
obj-n     += gt9xx/

此时我们如果看到了CONFIG_TOUCHSCREEN_GT9XX这个变量,一定要意识到menuconfig配置的环节,这些内容都是在Kconfig,实在不清楚在哪你也可以通过grep -r “” . 来找,这里只是提供一个思路 ,在同Makefile同目录下还有一个Kconfig有了这个我们就可以使用menuconfig工具来配置。

config TOUCHSCREEN_GT9XXtristate "Goodix gt9xx support for rockchip platform"depends on I2C && ARCH_ROCKCHIPhelpSay Y here if you have a touchscreen interface using the gt9xxon Rockchip platform, and your board-specific initializationcode includes that in its table of IIC devices.If unsure, say N.

如上就是Kconfig内容了,我们追溯到CONFIG_TOUCHSCREEN_GT9XX,就是通过上述的命令来配置到kernel的menuconfig。

因此我们知道相关宏了之后,就去kernel目录下 make ARCH=arm64 menuconfig 即可。

我们直接在内核里面,find即可,也就是也就是英文符号的这个 / ,键盘问号的下面的这个。通过 1 进行索引进入即可。

然后需要选中配置就行了!

因为我们刚刚保存的是.config每次编译的时候脚本都会去组合生产.config所以你的配置就会被覆盖掉,这也是很多小伙伴经常提问的为什么配置没生效,正确的方式是生成defconfig然后并覆盖到之前的arch/arm64/configs/下代替我们使用的defconfig。

make ARCH=arm64 savedefconfig

我们SDK使用的是rockchip_linux_defconfig,所以把生成的defconfig复制过去代替rockchip_linux_defconfig我用的是repo带git版本所有我就直接复制过去了,如果你没有git管理就先备份一个然后在代替过去,避免搞坏了回不去了。(再次感谢吴工)

mv defconfig arch/arm64/configs/rockchip_linux_defconfig
  • mv:代表“move”(移动)命令。
  • defconfig:当前目录下的一个文件,通常是内核或软件构建的默认配置文件。
  • arch/arm64/configs/rockchip_linux_defconfig:目标路径,表示将文件移动到 arch/arm64/configs/ 目录下,并重命名为 rockchip_linux_defconfig

以上的流程主要是因为本身处于linux系统中,对于相关驱动的配置都需要进行menuconfig,这一步也是非常的关键。

配置设备树

泰山触摸相关的设备树 SDK\kernel\arch\arm64\boot\dts\rockchip\tspi-rk3566-dsi-v10.dtsi中添加,根据 GT9xx_Driver_for_Android_V2.4_2014112801dtsi\goodix-gt9xx.dtsi 参考修改而来。

&i2c1 {status = "okay";ts@5d {compatible = "goodix,gt9xx";reg = <0x5d>;tp-size = <89>;max-x = <1280>;max-y = <800>;touch-gpio = <&gpio1 RK_PA0 IRQ_TYPE_LEVEL_LOW>;reset-gpio = <&gpio1 RK_PA1 GPIO_ACTIVE_LOW>;};
};

硬件部分通过原理图可以知道触摸接口用的是i2c1所以我们就直接在i2c1中写触摸。我们原理图中已经对数据线和时钟先进行了上拉。

触摸节点的配置

&i2c1 {status = "okay";ts@5d { //触摸子节点compatible = "goodix,gt9xx"; //这个非常重要,就是靠这个来匹配的驱动};
};

gt9xx.c触摸部分代码

static struct of_device_id goodix_ts_dt_ids[] = {{ .compatible = "goodix,gt9xx" },{ }
};static struct i2c_driver goodix_ts_driver = {.probe      = goodix_ts_probe,.remove     = goodix_ts_remove,.id_table   = goodix_ts_id,.driver = {.name     = GTP_I2C_NAME,.of_match_table = of_match_ptr(goodix_ts_dt_ids),},
};

因为涉及到iic,因此涉及地址,如下所示:

&i2c1 {status = "okay";ts@5d { //触摸子节点compatible = "goodix,gt9xx";reg = <0x5d>; //触摸屏地址};
};

因为一个i2c下可以挂载多个从设备,既然可以挂那么多设备我们要怎么和单个设备通讯呢,地址的作用就来了,我想和谁通讯我就叫谁的地址。我们怎么知道用的屏幕的地址是多少呢?

我们可以找原厂提供代码案例,也可以自己根据数据手册来决定。

我们都知道IIC协议的数据帧格式,在一个字节中,前七位都是地址后一位是方向,因此我们需要找到地址,所以呢,向右移动位,也就是得到了0x5d。

数据手册中有对地址进行描述这里写的是0xBA/0xBB,有些同学可能会迷糊上面说的是0x5d这里怎么变了,我们上面说的是7位地址,这里是8位包含第零位读写位,所以我不把0xBB/0xBA右移1位就可以得到0x5D。

&i2c1 {status = "okay";ts@5d {compatible = "goodix,gt9xx";reg = <0x5d>;tp-size = <89>; //触摸大小max-x = <1280>; //屏幕最大值max-y = <800>;  //屏幕最小值};
};

上述内容就是屏幕的大小参数了,这个非常重要,根据你买的屏幕来填写即可。

    //2649行/**************删减***************/if (of_property_read_u32(np, "tp-size", &val)) {dev_err(&client->dev, "no max-x defined\n");return -EINVAL;}//2715行if (of_property_read_u32(np, "max-x", &val)) {dev_err(&client->dev, "no max-x defined\n");return -EINVAL;}//2720行/**************删减***************///ts->abs_x_max = val;if (of_property_read_u32(np, "max-y", &val)) {dev_err(&client->dev, "no max-y defined\n");return -EINVAL;}/**************删减***************/

中断引脚

去读取数据方式很多种比如我们可以通过轮询去读,但是这样的效率非常低,触摸屏已经给我们提供了一个中断引脚,下面是触摸屏数据手册中对中断引脚的描述,当屏幕被按下INT脚就会输出中断信号,我们泰山派配置了中断就可以实现中断来了以后再去读取触摸数据,提高了效率。

&i2c1 {status = "okay";ts@5d {compatible = "goodix,gt9xx";reg = <0x5d>;tp-size = <89>;max-x = <1280>;max-y = <800>;//中断引脚touch-gpio = <&gpio1 RK_PA0 IRQ_TYPE_LEVEL_LOW>;};
};

gt9xx.c中会去获取touch-gpio引脚。

//2711行
ts->irq_pin = of_get_named_gpio_flags(np, "touch-gpio", 0, (enum of_gpio_flags *)(&ts->irq_flags));

其次就是另一个复位引脚了,如下所示:

&i2c1 {status = "okay";ts@5d {compatible = "goodix,gt9xx";reg = <0x5d>;tp-size = <89>;max-x = <1280>;max-y = <800>;touch-gpio = <&gpio1 RK_PA0 IRQ_TYPE_LEVEL_LOW>;//复位引脚reset-gpio = <&gpio1 RK_PA1 GPIO_ACTIVE_LOW>;};
};

在gt9xx.c中会去获取引脚。

//2712行
ts->rst_pin = of_get_named_gpio_flags(np, "reset-gpio", 0, &rst_flags);

因此就配置完了设备树,当然你会问我上面相关参数怎么来的,你可以在驱动代码里面中通过查询来索引设备树获取节点的相关函数,例如of起始的函数内容,或者就是去copy致敬SDK中的相关驱动代码,都是可以的,更多的还是经验的总结了,其次就是最后针对屏幕的触摸点的位置的判别了。

上述的函数是上报触摸的点位,这里也需要根据屏幕的参数进行配置,也就是屏幕的分辨率,此时呢,到此为止,相关驱动程序已经跑通,可以实现你想要的效果了!

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

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

相关文章

Qt WORD/PDF(二)使用 QtPdfium库实现 PDF操作、打印等

关于QT Widget 其它文章请点击这里: QT Widget GitHub 源码: QWidgetLearningPro &#xff08;暂未更新&#xff09; 姊妹篇: Qt WORD/PDF&#xff08;一&#xff09;使用 QtPdfium库实现 PDF 预览 一、简介 QtPdfium 是基于Pdfium库的一个Qt绑定。Pdfium是一个…

信息收集(dns信息收集dnsenum和路由收集traceroute)

导入 被动收集方式不容易被目标域发现 DNS信息收集 网络拓扑结构以及网络设置 服务机 路由器 kali机 查看并设置默认网关 工具 或者在系统目录下可找到dns的工具 dnsenum dnsenum -h 帮助指令 收集百度域的指令 使用字典文件破解对查找目标域进行收集 dnsmap 对自己的虚拟机…

Java设计模式 —— 【结构型模式】适配器模式(类的适配器、对象适配器、接口适配器)详解

文章目录 基本介绍一、类的适配器二、对象适配器三、接口适配器总结 基本介绍 生活中有很多例子&#xff1a; 不同国家的插座接口不同&#xff0c;需要转换器&#xff1b;家用电源220V&#xff0c;手机只接受5V充电&#xff0c;需要转换器&#xff1b;读卡器&#xff0c;拓展…

启明智显ZX7981PC:5G时代的新选择,全屋网络无缝覆盖

在这个飞速发展的5G时代&#xff0c;每一个细微的科技进步都在推动着我们的生活向更加智能、便捷的方向发展。近日&#xff0c;启明智显再次引领科技潮流&#xff0c;正式发布其最新的5G CPE产品——ZX7981PC。作为继7981PG与7981PM之后的又一次迭代升级&#xff0c;ZX7981PC凭…

11篇--图像边缘检测

图像梯度 要学习图像边缘检测&#xff0c;要先了解图像梯度的概念&#xff0c;我们正是通过梯度值来区分边缘像素点的 处于边缘附近的像素点与周围像素点的差距很大&#xff08;不然不会有边缘呈现&#xff09;&#xff0c;所以给边缘附近的的梯度之变化很快&#xff0c;通过…

6.2 MapReduce工作原理

MapReduce工作原理涉及将大数据集分割成小块并行处理。Map任务读取数据块并输出中间键值对&#xff0c;而Reduce任务则处理这些排序后的数据以生成最终结果。MapTask工作包括读取数据、应用Map函数、收集输出、内存溢出时写入磁盘以及可选的Combiner局部聚合。ReduceTask工作则…

ARM Cortex-A7 MPCore 架构

1、Cortex-A7 MPCore 简介 Cortex-A7 MPcore 处理器支持 1~4 核&#xff0c;通常是和 Cortex-A15 组成 big.LITTLE 架构的&#xff0c; Cortex-A15 作为大核负责高性能运算&#xff0c;比如玩游戏啥的&#xff0c; Cortex-A7 负责普通应用&#xff0c;因为 CortexA7 省电。 Co…

天天 AI-241215:今日热点-OpenAI发布ChatGPT Projects,万能工具箱上线!

2AGI.NET | 探索 AI 无限潜力&#xff0c;2AGI 为您带来最前沿资讯。 2024年&#xff0c;人工智能&#xff08;AI&#xff09;领域的发展日新月异&#xff0c;不断刷新我们对技术边界的认知。从预训练模型的终结宣言到AI应用开发平台的受欢迎程度&#xff0c;再到AI在数据管理和…

CEF127 编译指南 MacOS 篇 - 安装 Git 和 Python(三)

1. 引言 在前面的文章中&#xff0c;我们已经完成了 Xcode 及基础开发工具的安装和配置。接下来&#xff0c;我们需要安装两个同样重要的工具&#xff1a;Git 和 Python。这两个工具在 CEF 的编译过程中扮演着关键角色。Git 负责管理和获取源代码&#xff0c;而 Python 则用于…

手机静态ip地址怎么获取?方法全解析‌

在数字化时代&#xff0c;智能手机已成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;手机都扮演着至关重要的角色。而在某些特定情境下&#xff0c;我们可能需要为手机设置一个静态IP地址。本文将详细介绍如何为手机获取静态IP地址。 一、通过手机设…

FlightAD 解读

一 文章相关信息 出处&#xff1a;ICPADS CCF C 会议&#xff08;代码未开源&#xff09;&#xff0c;COUTA 研究团队的另一研究 二 Methodology 1. 整体架构&#xff1a; 2. Multi-Scale Sampling&#xff08;多尺度&#xff09; 实际上&#xff0c;就是对每个单通道作 “多…

【考前预习】4.计算机网络—网络层

往期推荐 【考前预习】3.计算机网络—数据链路层-CSDN博客 【考前预习】2.计算机网络—物理层-CSDN博客 【考前预习】1.计算机网络概述-CSDN博客 目录 1.网络层概述 2.网络层提供的两种服务 3.分类编址的IPV4 4.无分类编址的IPV4—CIDR 5.IPV4地址应用规划 5.1使用定长子…

github配置pages并配置自定义域名

有cloudflare的话实现的效果更好&#xff0c;可以使用自己的域名&#xff0c;实现白嫖一个网站服务器 1、配置git&#xff08;可选步骤&#xff09; git init git config --global user.name "sijia" git config --global user.email "devopsgame.vip"g…

vue3 结合 echarts 为tooltip绑定点击事件实现树形结构下动态添加子节点的效果

先看效果 具体实现代码如下&#xff1a; <template> <div ref"ecs" id"ecs" style"width: 800px;height:800px; background-color:white;"></div> </template><script setup> import {onMounted, ref} from &quo…

【JavaWeb后端学习笔记】Redis常用命令以及Java客户端操作Redis

redis 1、redis安装与启动服务2、redis数据类型3、redis常用命令3.1 字符串String3.2 哈希Hash3.3 列表List3.4 集合Set&#xff08;无序&#xff09;3.5 有序集合zset3.6 通用命令 4、使用Java操作Redis4.1 环境准备4.2 Java操作字符串String4.3 Java操作哈希Hash4.4 Java操作…

js:我要在template中v-for循环遍历这个centrerTopdata,我希望自循环前面三个就可以了怎么写

问&#xff1a; 我按在要在template中v-for循环遍历这个centrerTopdata&#xff0c;我希望自循环前面三个就可以了怎么写&#xff1f; 回答&#xff1a; 问&#xff1a; <div v-for"(item, index) in centrerTopdata.slice(0, 3)" :key"index"> d…

前端成长之路:CSS(1)

在前端三件套中&#xff0c;CSS的主要是用于美化网页、进行页面布局的。 HTML的局限性 HTML是一个非常单纯的语言&#xff0c;它只关心内容的语义&#xff1a; 比如看见h1标签&#xff0c;就表明这是一个大标题、看见p标签&#xff0c;就表明这是一个段落、看见img标签&#…

微服务SpringCloud链路追踪之Micrometer+Zipkin

视频教程&#xff1a; https://www.bilibili.com/video/BV12LBFYjEvR 效果演示 当我们发送一个请求给 Gateway 的时候&#xff0c;由 Micrometer trace 进行链路追踪和数据收集&#xff0c;由 Zipkin 进行数据展示。可以清楚的看到微服务的调用过程&#xff0c;以及每个微服务…

0001.基于springmvc简易酒店管理系统后台

一.系统架构 springmvcjsplayuimysql 二.功能特性 简单易学习&#xff0c;虽然版本比较老但是部署方便&#xff0c;tomcat环境即可启用&#xff1b;代码简洁&#xff0c;前后端代码提供可统一学习&#xff1b;祝愿您能成尽快为一位合格的程序员&#xff0c;愿世界没有BUG; …

Elasticsearch Kibana (windows版本) 安装和启动

目录 1.安装 2.启动 elasticsearch 3.启动 kibana 1.安装 elasticsearch下载&#xff0c;官网链接&#xff1a; Download Elasticsearch | Elastichttps://www.elastic.co/downloads/elasticsearch kibana下载&#xff0c;官网链接&#xff1a; Download Kibana Free | G…