全志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…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
