嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十五)输入系统应用编程(下)

本文涉及的产品
文档翻译,文档翻译 1千页
语种识别,语种识别 100万字符
文本翻译,文本翻译 100万字符
简介: 嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十五)输入系统应用编程

3. 电容屏的实验数据

假设你的开发板上电容屏对应的设备节点是/dev/input/event0,执行以下命令:

hexdump /dev/input/event0


然后用一个手指点击触摸屏,得到类似如下的数据:

1670902121273.jpg

在上面的数据中,为了兼容老程序,它也上报了ABS_X、ABS_Y数据,电阻触摸屏就是使用这类型的数据。所以基于电阻屏的程序,也可以用在电容屏上。

1670902130743.jpg

使用两个手指点击触摸屏时,得到类似如下的数据:

1670902140097.jpg

为了兼容老程序,它也上报了ABS_X、ABS_Y数据,但是只上报第1个触点的数据。


这里讲解了一般的电阻屏和电容屏会上报那些数据,这些数据一般来说比较复杂。而解决这些复杂的数据,一般来说要用到库。下面就会讲到用库解决这些问题。


1.5 tslib


前面我们讲解了不用库,而是使用open icotl等函数直接调用驱动函数去读取数据。下面咱们使用库去读取数据。


tslib是一个触摸屏的开源库,可以使用它来访问触摸屏设备,可以给输入设备添加各种“filter”(过滤器,就是各种处理),地址是:请点击

编译tslib后,可以得到libts库,还可以得到各种工具:较准工具、测试工具。


使用GIT下载所有源码后,本节源码位于如下目录:

01_all_series_quickstart\
04_嵌入式Linux应用开发基础知识\source\11_input\
02_tslib\


1.5.1 tslib框架分析


tslib的主要代码如下:

1670902177708.jpg

核心在于“plugins”目录里的“插件”,或称为“module”。这个目录下的每个文件都是一个module,每个module都提供2个函数:read、read_mt,前者用于读取单点触摸屏的数据,后者用于读取多点触摸屏的数据。

要分析tslib的框架,先看看示例程序怎么使用,我们参考ts_test.c和ts_test_mt.c,前者用于一般触摸屏(比如电阻屏、单点电容屏),后者用于多点触摸屏。

一个图就可以弄清楚tslib的框架:

1670902815487.jpg

调用ts_open后,可以打开某个设备节点,构造出一个tsdev结构体。

然后调用ts_config读取配置文件的处理,假设/etc/ts.conf内容如下:

module_raw input
 module pthres pmin=1
 module dejitter delta=100
 module linear


每行表示一个“module”或“moduel_raw”。

对于所有的“module”,都会插入tsdev.list链表头,也就是tsdev.list执行配置文件中最后一个“module”,配置文件中第一个“module”位于链表的尾部。

对于所有的“module_raw”,都会插入tsdev.list_raw链表头,一般只有一个“module_raw”。

注意:tsdev.list中最后一个“module”会指向ts_dev.list_raw的头部。

无论是调用ts_read还是ts_read_mt,都是通过tsdev.list中的模块来处理数据的。这写模块是递归调用的,比如linear模块的read函数如下:

1670902837246.jpg

linear模块的read_raw函数如下:

1670902851612.jpg

因为是递归调用,所有最先使用input模块读取设备节点得到原始数据,再依次经过pthres模块、dejitter模块、linear模块处理后,才返回最终数据。


1.5.2 交叉编译、测试tslib


使用GIT下载所有源码后,本节源码位于如下目录:

01_all_series_quickstart\
04_嵌入式Linux应用开发基础知识\source\11_input\
02_tslib\tslib-1.21.tar.xz


本节会涉及这些内容:交叉编译tslib,运行自带的测试程序,后面会自己写一个简单的测试程序。


1.交叉编译tslib

参考:

《第2篇 环境搭建、Linux基本操作、工具使用》

《7.3 配置交叉编译工具链》

《第4篇 嵌入式Linux应用开发基础知识》

《6.4 交叉编译程序:以freetype为例》

先配置工具链:

// 对于STM32MP157,命令如下
export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin
// 对于IMX6ULL,命令如下
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin


交叉编译tslib:

// 对于STM32MP157,命令如下
./configure --host=arm-buildroot-linux-gnueabihf  --prefix=/
make
make install DESTDIR=$PWD/tmp
// 对于IMX6ULL,命令如下
./configure --host=arm-linux-gnueabihf  --prefix=/
make
make install DESTDIR=$PWD/tmp


确定工具链中头文件、库文件目录:

// 对于STM32MP157,命令如下
echo 'main(){}'| arm-buildroot-linux-gnueabihf-gcc -E -v -
// 对于IMX6ULL,命令如下
echo 'main(){}'| arm-linux-gnueabihf-gcc -E -v -


把头文件、库文件放到工具链目录下:

// 对于STM32MP157,命令如下
cd tslib-1.21/tmp/
cp include/* /home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/include
cp -d lib/*so*  /home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/lib/
// 对于IMX6ULL,命令如下
cd tslib-1.21/tmp/
cp include/* /home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/include
cp -d lib/*so*  /home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/lib/


2. 测试tslib

把库文件放到单板上:运行程序要用。先在开发板上使用NFS挂载Ubuntu的目录,再把前面编译出来的tslib-1.21/tmp/部分文件复制到板子上,示例命令如下:

cp  /mnt/tslib-1.21/tmp/lib/*so*  -d     /lib
cp  /mnt/tslib-1.21/tmp/bin/*            /bin
cp  /mnt/tslib-1.21/tmp/etc/ts.conf  -d  /etc


对于IMX6ULL,首先需要关闭默认的qt gui程序,才可以执行ts_test_mt测试命令,关闭qt命令如下所示:

mv  /etc/init.d/S07hmi  /root
reboot


在单板上执行测试程序:

ts_test_mt


1.5.3 自己写一个测试程序


使用GIT下载所有源码后,本节源码位于如下目录:

01_all_series_quickstart\
04_嵌入式Linux应用开发基础知识\source\11_input\
02_tslib\mt_cal_distance.c


1. 接口函数深入分析

前面演示过,用两个手指点击屏幕时,可以得到类似下面的数据:

1670902945091.jpg

驱动程序使用slot、tracking_id来标识一个触点;当tracking_id等于-1时,标识这个触点被松开了。

触摸屏可能支持多个触点,比如5个:tslib为了简化处理,即使只有2个触点,ts_read_mt函数也会返回5个触点数据,可以根据标志位判断数据是否有效。

ts_read_mt函数原型如下:

1670902960899.jpg

假设nr设置为1,max_slots设置为5,那么读到的数据保存在:samp[0][0]、samp[0][1]、samp[0][2]、samp[0][3]、samp[0][4]中。
假设nr设置为2,max_slots设置为5,那么督导的数据保存在:samp[0][0]、samp[0][1]、samp[0][2]、samp[0][3]、samp[0][4]和samp[1][0]、samp[1][1]、samp[1][2]、samp[1][3]、samp[1][4]中。


ts_sample_mt结构体如下:

1670902980856.jpg


2. 编写代码

实现一个程序,不断打印2个触点的距离。

思路:假设是5点触摸屏,调用一次ts_read_mt可以得到5个新数据;使用新旧数据进行判断,如果有2个触点,就打印出距离。

代码实现
相关文章
|
2月前
「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台
本篇将带你实现一个虚拟音乐控制台。用户可以通过界面控制音乐的播放、暂停、切换歌曲,并查看当前播放的歌曲信息。页面还支持调整音量和动态显示播放进度,是音乐播放器界面开发的基础功能示例。
200 80
|
29天前
「Mac畅玩鸿蒙与硬件51」UI互动应用篇28 - 模拟记账应用
本篇教程将介绍如何创建一个模拟记账应用,通过账单输入、动态列表展示和实时统计功能,学习接口定义和组件间的数据交互。
158 68
|
2月前
|
流计算 UED
「Mac畅玩鸿蒙与硬件48」UI互动应用篇25 - 简易购物车功能实现
本篇教程将带你实现一个简易购物车功能。通过使用接口定义商品结构,我们将创建一个动态购物车,支持商品的添加、移除以及实时总价计算。
129 69
|
2月前
|
数据管理 API 调度
鸿蒙HarmonyOS应用开发 | 探索 HarmonyOS Next-从开发到实战掌握 HarmonyOS Next 的分布式能力
HarmonyOS Next 是华为新一代操作系统,专注于分布式技术的深度应用与生态融合。本文通过技术特点、应用场景及实战案例,全面解析其核心技术架构与开发流程。重点介绍分布式软总线2.0、数据管理、任务调度等升级特性,并提供基于 ArkTS 的原生开发支持。通过开发跨设备协同音乐播放应用,展示分布式能力的实际应用,涵盖项目配置、主界面设计、分布式服务实现及部署调试步骤。此外,深入分析分布式数据同步原理、任务调度优化及常见问题解决方案,帮助开发者掌握 HarmonyOS Next 的核心技术和实战技巧。
219 76
鸿蒙HarmonyOS应用开发 | 探索 HarmonyOS Next-从开发到实战掌握 HarmonyOS Next 的分布式能力
|
2月前
「Mac畅玩鸿蒙与硬件46」UI互动应用篇23 - 自定义天气预报组件
本篇将带你实现一个自定义天气预报组件。用户可以通过选择不同城市来获取相应的天气信息,页面会显示当前城市的天气图标、温度及天气描述。这一功能适合用于动态展示天气信息的小型应用。
155 38
|
2月前
|
前端开发
「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏
本篇教程将带你实现一个数字填色小游戏,通过简单的交互逻辑,学习如何使用鸿蒙开发组件创建趣味性强的应用。
68 20
|
28天前
|
UED
「Mac畅玩鸿蒙与硬件52」UI互动应用篇29 - 模拟火车票查询系统
本篇教程将实现一个模拟火车票查询系统,通过输入条件筛选车次信息,并展示动态筛选结果,学习事件处理、状态管理和界面展示的综合开发技巧。
59 13
|
27天前
「Mac畅玩鸿蒙与硬件53」UI互动应用篇30 - 打卡提醒小应用
本篇教程将实现一个打卡提醒小应用,通过用户输入时间进行提醒设置,并展示实时提醒状态,实现提醒设置和取消等功能。
60 10
|
2月前
|
前端开发 UED
「Mac畅玩鸿蒙与硬件50」UI互动应用篇27 - 水果掉落小游戏
本篇教程将带你实现一个水果掉落小游戏,掌握基本的动态交互逻辑和鸿蒙组件的使用,进一步了解事件处理与状态管理。
51 14
|
2月前
|
开发框架 人工智能 安全
鸿蒙HarmonyOS应用开发 | 「鸿蒙技术分享」HarmonyOS NEXT元服务卡片实战体验
HarmonyOS NEXT的发布对华为及整个行业都产生了深远的影响。它不仅展示了华为的技术实力,还敏锐地把握了市场需求。同时,吸引了更多的开发者和合作伙伴加入鸿蒙生态体系,共同推动鸿蒙生态的繁荣发展。
253 20
鸿蒙HarmonyOS应用开发 | 「鸿蒙技术分享」HarmonyOS NEXT元服务卡片实战体验