tslib是触摸屏的开源库,可以用来访问触摸屏设备;
tslib框架:ts_setup(ts_open/ts_config)---ts_read/ts_read_mt---ts_close
交叉编译tslib
1. 配置工具链:
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/bin2. 确认配置文件:
./configyre --host=arm-buildroot-linux-gnueabihf --prefix=/
3. 编译:
make
make install DESTDIR=$PWD/tmp (根据报错信息修改)
安装使用tslib
1. 把头文件和库文件放入工具链目录(编译程序需要):
查看默认工具链目录:
echo 'main(){}' | arm-buildroot-linux-gnueabihf-gcc -E -v -
移动头文件:cp include/* 工具链头文件目录移动库文件:cp lib/*so* -d 工具链库文件目录
(-d 本身为链接文件拷贝后仍保持为链接文件)
2. 把库文件放在单板上(运行程序需要):
cp lib/*so* -d /lib
编写基于tslib的测试程序
int ts_setup(const char * dev_name, int nonblock)
int ts_read_mt(struct tsdev *ts, struct ts_sample_mt **samp, int max_slots, int nr)
1. 使用ts_setup打开设备节点:
ts = ts_setup(NULL, 0)
2. 使用ioctl读取节点信息,获得触摸屏的最大点数,根据点数分配指针的指针:
ioctl(ts_fd(ts), EVIOCGABS(ABS_MT_SLOT), &slot) < 0
max_slots = slot.maximum + 1 - slot.minimum
samp_mt = malloc(sizeof(struct ts_sample_mt *));
if (!samp_mt) {
ts_close(ts);
return -ENOMEM;
}
samp_mt[0] = calloc(max_slots, sizeof(struct ts_sample_mt));
if (!samp_mt[0]) {
free(samp_mt);
ts_close(ts);
return -ENOMEM;
}3. 使用ts_read_mt读取触摸屏的多点数据:
ret = ts_read_mt(ts, samp_mt, max_slots, 1);
4. 多点数据处理:
保存当前数据:memcpy(&pre_samp_mt[0][i], &samp_mt[0][i], sizeof(struct ts_sample_mt));
计算与前一数据的距离:
distance(&pre_samp_mt[0][point_pressed[0]], &pre_samp_mt[0][point_pressed[1]])
int distance(struct ts_sample_mt *point1, struct ts_sample_mt *point2)
{
int x = point1->x - point2->x;
int y = point1->y - point2->y;return x*x + y*y;
}5. 关闭节点:ts_close(ts);