全志V3S嵌入式驱动开发(触摸屏驱动)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
所谓的触摸屏,其实就是在普通的lcd屏幕之上,再加一层屏而已。这个屏是透明的,这样客户就可以看到下面lcd屏幕的内容,另外一方面,通过触摸信号,还可以实现人和机器的自然交互,这是一种非常好的体验形式。像早期的按键手机,大家用着其实还行,只不过后来转成智能手机,只剩下一个屏幕之后,就一股脑全转成触摸屏手机了。
1、查看lcd电路图

之前我们说过这个lcd 40 pin的原理图。上次分析的时候,卖了一个关子。就是这个TPX1、TPY1、TPX2、TPY2,四根信号线。这四根线并没有直接连接到soc上面,而是先连接到ns2009,然后再通过i2c的形式连接到soc上面。

简单浏览下,发现TP信号连接到了2、3、4、5号pin上面,soc需要获取触摸信息的话,通过SCK & SDA就可以,当然这里还有一个PENIRQ,理论上是可以通过中断的形式获取触摸信息的。但是,实际看linux驱动代码的话,发现还是定时轮询的形式。
此外选择lcd屏幕的时候,一定要选择带有触摸屏的那种,千万要和商家沟通清楚。不然白白浪费了自己的时间。
2、设备树
上面分析电路得出结论,soc是通过i2c获取按键信息的,那么可以直接查找sun8i-v3s-licheepi-zero.dts,
&i2c0 {status = "okay";ns2009: ns2009@48 {compatible = "nsiway,ns2009";reg = <0x48>;};
};
引脚信息可以在sun8i-v3s.dtsi查找到,分别是PB6、PB7
i2c0_pins: i2c0 {pins = "PB6", "PB7";function = "i2c0";};
更详细的寄存器、中断、时钟信息也可以在这个文件的后半部分找到,
i2c0: i2c@01c2ac00 {compatible = "allwinner,sun6i-a31-i2c";reg = <0x01c2ac00 0x400>;interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;clocks = <&ccu CLK_BUS_I2C0>;resets = <&ccu RST_BUS_I2C0>;pinctrl-names = "default";pinctrl-0 = <&i2c0_pins>;status = "disabled";#address-cells = <1>;#size-cells = <0>;};
上面说的这些内容都是默认配置好的,只要是linux 4.14.y内核,就不需要自己再动手配置一遍了。
3、查看驱动代码
因为这里使用到了i2c协议,也使用到了ns2009芯片,所以只需要在drivers/input/touchscreen下面查找下,有没有类似于ns2009的驱动就好。观察发现,果然有一个ns2009.c文件,里面内容也和我们想的差不多,
static const struct i2c_device_id ns2009_ts_id[] = {{ "ns2009", 0 },{ }
};
MODULE_DEVICE_TABLE(i2c, ns2009_ts_id);static struct i2c_driver ns2009_ts_driver = {.probe = ns2009_ts_probe,.id_table = ns2009_ts_id,.driver = {.name = NS2009_TS_NAME,},
};
module_i2c_driver(ns2009_ts_driver);
这部分代码因为是包含在zImage里面的,因此也就不需要重新编译、重新烧入了。和其他驱动相比较,这算是很方便的一种情形。
4、下载、安装tslib库
tslib基本就是触摸屏调试的一个标配。它不仅仅可以帮助我们对触摸屏做出一些参数标定,还可以用它做接口,做一些测试或者定制应用开发。首先,我们需要下载一个tslib代码,
https://github.com/libts/tslib/releases
选择好版本之后,就可以拷贝到ubuntu虚拟机,准备用交叉编译工具开始编译,
mkdir __install
./configure -host=arm-linux-gnueabihf -prefix=$PWD/__install
make
make install
编译安装好之后,所有的文件都被安装到__install目录下面。接下来要做的,就是把这些文件拷贝到sd卡的ext4系统上面去,
cp bin/* /media/feixiaoxing/64959927-1d53-4bb1-8102-d7c16fc29ade/bin/
cp lib/*.so* /media/feixiaoxing/64959927-1d53-4bb1-8102-d7c16fc29ade/lib/ -rfdv
cp lib/ts/ /media/feixiaoxing/64959927-1d53-4bb1-8102-d7c16fc29ade/lib/ -rfdv
cp etc/ts.conf /media/feixiaoxing/64959927-1d53-4bb1-8102-d7c16fc29ade/etc/
自此,tslib就安装好了,可以准备测试了。
5、测试验证tslib
测试验证之前,需要先配置一下环境变量,有几个参数需要设置下,
export set TSLIB_TSDEVICE=/dev/input/event0
export set TSLIB_CONFFILE=/etc/ts.conf
export set TSLIB_PLUGINDIR=/lib/ts
export set TSLIB_CALIBFILE=/etc/pointercal
export set TSLIB_CONSOLEDEVICE=none
export set TSLIB_FBDEVICE=/dev/fb0
第一个参数表示event设备节点的位置。如果ns2009驱动正常安装,肯定会有这个节点的。第二个参数表示配置文件的位置。第三个参数表示插件的位置。第四个参数表示标定参数保存的位置。第五个参数可以不设置,直接写成none。第六个参数表示屏幕节点的位置。
当然测试的时候,别忘记点亮屏幕,屏幕不点亮啥也做不了,
echo 34 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio34/direction
echo 1 > /sys/class/gpio/gpio34/value
首先,先用ts_calibrate做一下触摸屏的标定,
# ts_calibrate
xres = 480, yres = 272
不出意外,屏幕上可以看到这样的情形,

有一个十字箭头的东西会依次出现在四个角落和中间位置,每点击依次,它就会跳到新的位置。五次都结束以后,标定就结束了,
# ts_calibrate
xres = 480, yres = 272
[ 113.404260] random: crng init done
Took 1 samples...
Top left : X = 534 Y = 1156
Took 3 samples...
Top right : X = 3496 Y = 1334
Took 2 samples...
Bot right : X = 3510 Y = 3270
Took 2 samples...
Bot left : X = 453 Y = 3075
Took 1 samples...
Center : X = 1963 Y = 2066
-15.522461 0.126093 0.002039
-46.474915 -0.005545 0.088761
Calibration constants: -1017280 8263 133 -3045780 -363 5817 65536
接下里就可以用ts_test开始测试了,

测试有两种方式,一种是拖着十字到处移动,还有一种就是画图。如上图所示,这就是画图的测试方法,只不过我们写了两个汉字。不管是那种方式,需要先到对应的按钮选中一下。因为电阻屏反应没那么灵敏,等按下去的时候,时间多停留一会,直到按钮颜色变化之后,再开始测试。如果能写出自己想要的内容,基本表明驱动移植成功。
串口方面,也可以看到这些打印信息,
# ts_test
1178.709275: 265 77 255
1178.748307: 265 77 0
1178.789301: 265 42 255
1178.829277: 508 283 255
1178.868270: 508 283 0
1179.549275: 268 15 255
1179.589293: 284 25 255
1179.629289: 297 38 255
相关文章:
全志V3S嵌入式驱动开发(触摸屏驱动)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 所谓的触摸屏,其实就是在普通的lcd屏幕之上,再加一层屏而已。这个屏是透明的,这样客户就可以看到下面lcd屏幕的…...
死信队列详解
什么是死信队列? 在消息队列中,执行异步任务时,通常是将消息生产者发布的消息存储在队列中,由消费者从队列中获取并处理这些消息。但是,在某些情况下,消息可能无法正常地被处理和消耗,例如&…...
我用ChatGPT写2023高考语文作文(五):北京卷I
2023年 北京卷 I 适用地区:北京 “续航”一词,原指连续航行,今天在使用中被赋予了新的含义,如为青春续航、科技为经济发展续航等。 请以“续航”为题目,写一篇议论文。 要求:论点明确,论据充实&…...
《微服务实战》 第二十八章 分布式锁框架-Redisson
前言 Redisson 在基于 NIO 的 Netty 框架上,充分的利⽤了 Redis 键值数据库提供的⼀系列优势,在Java 实⽤⼯具包中常⽤接⼝的基础上,为使⽤者提供了⼀系列具有分布式特性的常⽤⼯具类。使得原本作为协调单机多线程并发程序的⼯具包获得了协调…...
局部搜索,变邻域搜索算法
目录 局部搜索 02 变邻域搜索算法 局部搜索 1.1 局部搜索是什么玩意儿? 官方一点:局部搜索是解决优化问题的一种启发式算法。对于某些计算起来非常复杂的优化问题,比如各种NP-难问题,要找到最优解需要的时间随问题规模呈指数增长,因此诞生了各种启发式算法来退而求其次…...
软件工程实训——第一天
第一天 前后分离 前端:android 后端:springbootmbatis-plus 高心星 软件工程的思维来开发项目 问题定义 可行性研究 需求分析 概要设计 详细设计 编码 测试 维护 需求分析 1.用户的信息管理 2.新增支出 3.新增收入 4.支出统计 5.收入…...
嵌入式C语言中if/else如何优化详解
观点一(灵剑): 前期迭代懒得优化,来一个需求,加一个if,久而久之,就串成了一座金字塔。 当代码已经复杂到难以维护的程度之后,只能狠下心重构优化。那,有什么方案可以优雅…...
【LSTM】读取时间序列数据 | 时间序列数据的小批量划分方法
由于序列数据本质上是连续的,因此我们在处理数据时需要解决这个问题。当序列过长而不能被模型一次性全部处理时,我们希望能拆分这样的序列以便模型方便读取。 Q:怎样随机生成一个具有n个时间步的mini batch的特征和标签? A&…...
K8s in Action 阅读笔记——【12】Securing the Kubernetes API server
K8s in Action 阅读笔记——【12】Securing the Kubernetes API server 12.1 Understanding authentication 在上一章中,我们提到API服务器可以配置一个或多个认证插件(授权插件也是同样的情况)。当API服务器接收到一个请求时,它…...
爆肝整理,3个月从功能进阶自动化测试,一跃成测试卷王...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 首先先了解自动化…...
人生这场概率游戏,怎么玩
只会标准答案,是不可救药的愚蠢 那么为了便于理解,我用一些典型的案例来讲解,什么是概率游戏,以及这个游戏,应该怎么玩。 比如典型的相亲,婚恋。人生大事,用标准答案来说,你的意中人…...
Redis笔记
缓存过期时间很重要!redis是单线程的 对于内存过多的3中方案: 惰性删除: 在定时删除的基础上,对于已经过期了的数据,redis的随机选择算法一直没有选中这个数据,所以导致它就一直没被删除,但是…...
centos 安装supervisor并运行网站
前言 之前一直用宝塔的**进程守护管理器【Supervisor】**来启动一些项目,如ThinkPHP、Hyperf的项目,或laravel的一些命令。如果不用宝塔怎么办呢? 一、简介[supervisor] [Supervisor] 是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支…...
Hadoop面试题十道
问题 1:Hadoop是什么? 答案:Hadoop是一个开源的分布式计算框架,用于处理大规模数据集的存储和处理。它基于Google的MapReduce和Google文件系统(GFS)的思想,旨在解决大数据量的处理和分析问题。…...
使用Docker-Compose对Docker容器集群快速编排
目录 一、Docker-Compose1、Docker-Compose使用场景2、Docker-Compose简介3、Docker-Compose安装部署4、YAML 文件格式及编写注意事项5、Docker Compose配置常用字段6、Docker Compose 常用命令7、Docker Compose 文件结构8、docker Compose撰写nginx 镜像9、docker Compose撰写…...
React-Redux 对Todolist修改
在单独使用redux的时候 需要手动订阅store里面 感觉特别麻烦 不错的是react有一个组件可以帮我们解决这个问题, 那就是react-redux。 react-redux提供了Provider 和 connent给我们使用。 先说一下几个重点知道的知识 Provider 就是用来提供store里面的状态 自动getState()co…...
初识微信小程序
新建小程序 创建一个新的微信小程序项目: 打开微信开发者工具,点击“新建项目”。 在弹出的窗口中,填写小程序的 AppID、项目名称和项目目录等信息。 点击“确定”按钮,等待微信开发者工具自动下载并安装所需的依赖库和框架。 …...
我们该如何入门编程呢
提醒:以下内容仅做参考,可自行发散。在发布作品前,请把不需要的内容删掉。 随着信息技术的快速发展,编程已经成为一个越来越重要的技能。那么,我们该如何入门编程呢?选择编程语言:选择一种编程…...
App 软件开发《判断6》试卷及答案
App 软件开发《判断6》试卷及答案 文章目录 App 软件开发《判断6》试卷及答案判断题(对的打“√”,错的打“”;共0分)1.”ionic resources --icon"命令用于生成适应不同分辨率的App图标所应用的图片。(✔)2&#…...
MVC工作原理
MVC工作原理 有视图的情况 1.客户端(浏览器)发起请求,DispatcherServlet拦截请求。 2.DispatcherServlet根据请求信息调用HandlerMapping。HandlerMapping根据uri去匹配查询能处理的Handler(也就是我们所说的Controller&#x…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
