LV17-01-输入类设备-05-触摸屏tslib开源库-02-工具与API
本文主要是输入类设备控制——触摸屏tslib开源库的工具使用和API函数简介的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
PC端开发环境 | Windows | Windows11 |
Ubuntu | Ubuntu20.04.2的64位版本 | |
VMware® Workstation 17 Pro | 17.6.0 build-24238078 | |
终端软件 | MobaXterm(Professional Edition v23.0 Build 5042 (license)) | |
Win32DiskImager | Win32DiskImager v1.0 | |
Linux开发板环境 | Linux开发板 | 正点原子 i.MX6ULL Linux 阿尔法开发板 |
uboot | NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03) | |
linux内核 | linux-4.15(NXP官方提供) |
点击查看本文参考资料
分类 | 网址 | 说明 |
官方网站 | https://www.arm.com/ | ARM官方网站,在这里我们可以找到Cotex-Mx以及ARMVx的一些文档 |
https://www.nxp.com.cn/ | NXP官方网站 | |
https://www.nxpic.org.cn/ | NXP 官方社区 | |
https://u-boot.readthedocs.io/en/latest/ | u-boot官网 | |
https://www.kernel.org/ | linux内核官网 | |
其他网站 | kernel - Linux source code (v4.15) - Bootlin | linux内核源码在线查看 |
点击查看相关文件下载
分类 | 网址 | 说明 |
NXP | https://github.com/nxp-imx | NXP imx开发资源GitHub组织,里边会有u-boot和linux内核的仓库 |
https://elixir.bootlin.com/linux/latest/source | 在线阅读linux kernel源码 | |
nxp-imx/linux-imx/releases/tag/rel_imx_4.1.15_2.1.0_ga | NXP linux内核仓库tags中的rel_imx_4.1.15_2.1.0_ga | |
nxp-imx/uboot-imx/releases/tag/rel_imx_4.1.15_2.1.0_ga | NXP u-boot仓库tags中的rel_imx_4.1.15_2.1.0_ga | |
I.MX6ULL | i.MX 6ULL Applications Processors for Industrial Products | I.MX6ULL 芯片手册(datasheet,可以在线查看) |
i.MX 6ULL Applications ProcessorReference Manual | I.MX6ULL 参考手册(下载后才能查看,需要登录NXP官网) |
一、工具的使用
我们在编译输出目录会看到许多工具:
它提供了单点触摸测试工具(ts_print、 ts_test)和多点触摸测试工具(ts_print_mt、 ts_test_mt),ts_print 和 ts_print_mt 可以在终端打印触摸点信息,而 ts_test 和ts_test_mt 则支持在 LCD 上画线。
1. ts_print
我们在移植的时候已经配置了环境变量,可以直接在终端执行:
1 | ts_print |
执行 ts_print 命令之后,在触摸屏上滑动、或按下、松开触摸屏将会在终端打印出相应的信息。
2. ts_print_mt
我们直接在终端执行即可:
1 | ts_print_mt |
二、API函数
使用 tslib 库函数需要在我们的应用程序中包含 tslib 的头文件 tslib.h 。使用 tslib 编程其实非常简单,基本步骤如下所示:
(1)打开触摸屏设备;
(2)配置触摸屏设备;
(3)读取触摸屏数据。
1. 打开与关闭触摸屏设备
1.1 ts_open
使用 tslib 提供的库函数 ts_open 打开触摸屏设备,其函数原型如下所示:
1 |
|
参数 dev_name 指定了触摸屏的设备节点;参数 nonblock 表示是否以非阻塞方式打开触摸屏设备,如果nonblock 等于 0 表示阻塞方式,如果为非 0 值则表示以非阻塞方式打开。
调用成功返回一个 struct tsdev *指针, 指向触摸屏设备句柄;如果打开设备失败,将返回 NULL。
1.2 ts_setup
除了使用 ts_open()打开设备外,还可以使用 ts_setup()函数,其函数原型如下所示:
1 |
|
参数 dev_name 指定触摸屏的设备节点,与 ts_open()函数中的 dev_name 参数意义相同; 但对于 ts_setup()来说,参数 dev_name 可以设置为 NULL,当 dev_name 设置为 NULL 时, ts_setup()函数内部会读取TSLIB_TSDEVICE 环境变量, 获取该环境变量的内容以得知触摸屏的设备节点。
参数 nonblock 表示是否以非阻塞方式打开触摸屏设备,如果nonblock 等于 0 表示阻塞方式,如果为非 0 值则表示以非阻塞方式打开。
ts_setup()相比 ts_open(),除了打开触摸屏设备外,还对触摸屏设备进行了配置。
1.3 ts_close
关闭触摸屏设备使用 ts_close()函数:
1 | int ts_close(struct tsdev *); |
2. 配置触摸屏设备
调用 ts_config()函数进行配置,其函数原型如下所示:
1 |
|
参数 ts 指向触摸屏句柄。
成功返回 0,失败返回-1。
所谓配置其实指的就是解析 ts.conf 文件中的配置信息,加载相应的插件。
3. 读取触摸屏数据
读取触摸屏数据使用 ts_read()或 ts_read_mt()函数,区别在于 ts_read 用于读取单点触摸数据,而ts_read_mt 则用于读取多点触摸数据.
3.1 ts_read
其函数原型如下所示:
1 |
|
参数 ts 指向一个触摸屏设备句柄。
samp 参数是一个 struct ts_sample *类型的指针,指向一个 struct ts_sample 对象, struct ts_sample 数据结构描述了触摸点的信息; 调用 ts_read()函数获取到的数据会存放在 samp 指针所指向的内存中。 struct ts_sample 结构体内容如下所示:
1 | struct ts_sample { |
参数 nr 表示对一个触摸点的采样数,设置为 1 即可。
3.2 ts_read_mt
其函数原型如下所示:
1 |
|
参数 ts 指向一个触摸屏设备句柄。
samp 参数是一个 struct ts_sample_mt **类型的指针, 多点触摸应用程序, 每一个触摸点的信息使用 struct ts_sample_mt 数据结构来描述; 一个触摸点的数据使用一个 struct ts_sample_mt 对象来装载,将它们组织成一个 struct ts_sample_mt 数组,调用 ts_read_mt()时, 将数组地址赋值给 samp 参数。struct ts_sample 结构体内容如下所示:
1 | struct ts_sample_mt { |
max_slots 参数,表示触摸屏支持的最大触摸点数, 应用程序可以通过调用 ioctl()函数来获取触摸屏支持的最大触摸点数以及触摸屏坐标的最大分辨率等信息 。
参数 nr 表示对一个触摸点的采样数,设置为 1 即可。