写在前边
本文是B站up主韦东山的4_7-9.编写基于tslib的测试程序_哔哩哔哩_bilibili视频的笔记,其中有些部分博主也没有理解,希望各位辩证的看。
目录
基本知识
tslib 是一个触摸屏的开源库,可以使用它来访问触摸屏设备,可以给输入设 备 添 加 各 种 “ filter ” ( 过 滤 器 , 就 是 各 种 处 理 ) , 地 址 是 :http://www.tslib.org/。
编译 tslib 后,可以得到 libts 库,还可以得到各种工具:较准工具、测试工具。
官网地址:C library for filtering touchscreen events
tslib 框架分析
tslib 的主要代码位置

tslib 1主要代码
plugins目录下的每个文件都是一个 module,每个模块都会被编译成动态库,每个 module 都提供 2 个函数:read、read_mt,前者用于读取单点触摸屏的数据,后者用于读取多点触摸屏的数据。
tests目录下是测试程序:参考 ts_test.c 和ts_test_mt.c,前者用于一般触摸屏(比如电阻屏、单点电容屏),后者用于多点触摸屏。

tslib 2tslib框架图
交叉编译、测试 tslib
首先先安装依赖库
sudo apt-get install autoconf automake libtool
然后需要根据自己板子的交叉编译工具链安装:
其中arm-linux-gnueabihf就是你的交叉编译工具链,你需要根据自己的工具链将这里进行替换。
./configure --host=arm-linux-gnueabihf --prefix=/
make
make install DESTDIR=$PWD/tmp
这里完成后会在当前文件夹下产生tslib的各种文件,接下来需要将某些文件加入到工具链的目录中,以便程序在编译时可以找到这些库函数。
这里需要做的是先知道这些工具链的目录在哪里:
echo 'main(){}'| arm-linux-gnueabihf-gcc -E -v -
同样的,arm-linux-gnueabihf是交叉编译工具链,将这里替换成自己的工具链。

tslib 3工具链目录
// 下边的这些命令我直接复制的百问的命令,所以这里边的工具链和我标出的不太一样,这里需按照自己的板子上的工具链进行替换。
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/
这些完成之后,需要将库文件放到板子上运行(这里我提前挂载了网络文件系统):
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
完成之后就可以在板子上运行tslib库了。
示例程序
下边是我做的一个画板程序,主要功能为可以在上边画线,点击上边颜色部分可以切换画线颜色。

tslib 4画板实物
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <getopt.h>
#include <linux/input.h>
#include <sys/ioctl.h>
#include <tslib.h>
#include <sys/mman.h>
#include <linux/fb.h>
// 可变参数结构体
static struct fb_var_screeninfo var; /* current var */
// 屏幕文件的句柄
static int fd_fb;
// 整个屏幕的像素个数
static int screen_size;
// 指向映射的区域指针
static unsigned char* fb_base;
// 一行有多少像素
static unsigned int line_width;
// 一个像素多少byte
static unsigned int pixel_width;
// 定义颜色
unsigned int color = 0;
// 描点函数(color格式:0x00RRGGBB)
void lcd_put_pixel(int x, int y, unsigned int color)
{
unsigned char* pen_8 = fb_base + y * line_width + x * pixel_width;
unsigned short* pen_16;
unsigned int* pen_32;
unsigned int red, green, blue;
pen_16 = (unsigned short*)pen_8;
pen_32 = (unsigned int*)pen_8;
switch (var.bits_per_pixel) { /* bpp 像素深度 */
case 8:
{
*pen_8 = color;
break;
&nbs

最低0.47元/天 解锁文章
2304

被折叠的 条评论
为什么被折叠?



