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

简介: 嵌入式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个触点,就打印出距离。

代码实现
相关文章
|
5月前
|
Ubuntu Linux Anolis
Linux系统禁用swap
本文介绍了在新版本Linux系统(如Ubuntu 20.04+、CentOS Stream、openEuler等)中禁用swap的两种方法。传统通过注释/etc/fstab中swap行的方式已失效,现需使用systemd管理swap.target服务或在/etc/fstab中添加noauto参数实现禁用。方法1通过屏蔽swap.target适用于新版系统,方法2通过修改fstab挂载选项更通用,兼容所有系统。
486 3
Linux系统禁用swap
|
5月前
|
Linux
Linux系统修改网卡名为eth0、eth1
在Linux系统中,可通过修改GRUB配置和创建Udev规则或使用systemd链接文件,将网卡名改为`eth0`、`eth1`等传统命名方式,适用于多种发行版并支持多网卡配置。
990 3
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
579 0
Linux系统初始化脚本
|
移动开发 Ubuntu 网络协议
嵌入式linux/鸿蒙开发板(IMX6ULL)开发 (二)Ubuntu操作入门与Linux常用命令(中)
嵌入式linux/鸿蒙开发板(IMX6ULL)开发 (二)Ubuntu操作入门与Linux常用命令
398 1
嵌入式linux/鸿蒙开发板(IMX6ULL)开发 (二)Ubuntu操作入门与Linux常用命令(中)
|
XML Web App开发 开发框架
鸿蒙开发入门 | 开发第一个鸿蒙应用+页面跳转
准备好鸿蒙开发环境后,接下来就需要创建鸿蒙项目,掌握项目的创建过程以及配置。项目创建好后,需要把项目运行在模拟器上,鸿蒙的模拟和安卓模拟器有些不同,鸿蒙提供远程模拟器和本地模拟器,通过登录华为账号登录在线模拟器,使用DevEco Studio可将项目部署到远程模拟器中。
1815 1
鸿蒙开发入门 | 开发第一个鸿蒙应用+页面跳转
|
存储 Ubuntu 前端开发
嵌入式linux/鸿蒙开发板(IMX6ULL)开发 (二)Ubuntu操作入门与Linux常用命令(下)
嵌入式linux/鸿蒙开发板(IMX6ULL)开发 (二)Ubuntu操作入门与Linux常用命令
722 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发 (二)Ubuntu操作入门与Linux常用命令(下)
|
存储 编解码 Ubuntu
嵌入式linux/鸿蒙开发板(IMX6ULL)开发 (二)Ubuntu操作入门与Linux常用命令(上)
嵌入式linux/鸿蒙开发板(IMX6ULL)开发 (二)Ubuntu操作入门与Linux常用命令
404 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发 (二)Ubuntu操作入门与Linux常用命令(上)
|
开发工具
HarmonyOS(鸿蒙)开发一文入门
HarmonyOS(鸿蒙)开发一文入门
263 0
HarmonyOS(鸿蒙)开发一文入门
|
4月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
590 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
4月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
511 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡

热门文章

最新文章